diff --git a/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/controller/WmsInstockOrderController.java b/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/controller/WmsInstockOrderController.java index 88465f61..b4b9f8b7 100644 --- a/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/controller/WmsInstockOrderController.java +++ b/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/controller/WmsInstockOrderController.java @@ -1,27 +1,25 @@ package org.dromara.wms.controller; -import java.util.List; - -import lombok.RequiredArgsConstructor; -import jakarta.servlet.http.HttpServletResponse; -import jakarta.validation.constraints.*; import cn.dev33.satoken.annotation.SaCheckPermission; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.web.core.BaseController; import org.dromara.wms.domain.bo.WmsInstockOrderBo; import org.dromara.wms.domain.vo.WmsInstockOrderVo; import org.dromara.wms.service.IWmsInstockOrderService; -import org.springframework.web.bind.annotation.*; import org.springframework.validation.annotation.Validated; -import org.dromara.common.idempotent.annotation.RepeatSubmit; -import org.dromara.common.log.annotation.Log; -import org.dromara.common.web.core.BaseController; -import org.dromara.common.mybatis.core.page.PageQuery; -import org.dromara.common.core.domain.R; -import org.dromara.common.core.validate.AddGroup; -import org.dromara.common.core.validate.EditGroup; -import org.dromara.common.log.enums.BusinessType; -import org.dromara.common.excel.utils.ExcelUtil; +import org.springframework.web.bind.annotation.*; -import org.dromara.common.mybatis.core.page.TableDataInfo; +import java.util.List; /** * 入库单 diff --git a/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/controller/WmsInstockRecordController.java b/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/controller/WmsInstockRecordController.java index 5ad5b3a4..e2dfaf08 100644 --- a/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/controller/WmsInstockRecordController.java +++ b/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/controller/WmsInstockRecordController.java @@ -1,26 +1,27 @@ package org.dromara.wms.controller; -import java.util.List; - -import lombok.RequiredArgsConstructor; -import jakarta.servlet.http.HttpServletResponse; -import jakarta.validation.constraints.*; import cn.dev33.satoken.annotation.SaCheckPermission; -import org.springframework.web.bind.annotation.*; -import org.springframework.validation.annotation.Validated; -import org.dromara.common.idempotent.annotation.RepeatSubmit; -import org.dromara.common.log.annotation.Log; -import org.dromara.common.web.core.BaseController; -import org.dromara.common.mybatis.core.page.PageQuery; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import lombok.RequiredArgsConstructor; import org.dromara.common.core.domain.R; import org.dromara.common.core.validate.AddGroup; import org.dromara.common.core.validate.EditGroup; -import org.dromara.common.log.enums.BusinessType; import org.dromara.common.excel.utils.ExcelUtil; -import org.dromara.wms.domain.vo.WmsInstockRecordVo; -import org.dromara.wms.domain.bo.WmsInstockRecordBo; -import org.dromara.wms.service.IWmsInstockRecordService; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.web.core.BaseController; +import org.dromara.wms.domain.bo.WmsInstockRecordBo; +import org.dromara.wms.domain.vo.WmsInstockRecordVo; +import org.dromara.wms.service.IWmsInstockRecordService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; /** * 入库记录 diff --git a/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/controller/api/apiController.java b/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/controller/api/apiController.java new file mode 100644 index 00000000..7fca0f4e --- /dev/null +++ b/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/controller/api/apiController.java @@ -0,0 +1,35 @@ +package org.dromara.wms.controller.api; + +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.wms.domain.bo.WmsInstockOrderBo; +import org.dromara.wms.service.IWmsInstockOrderService; +import org.dromara.wms.service.IWmsInstockRecordService; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RequiredArgsConstructor +@RestController +@RequestMapping("/wsmApi") +public class apiController { + + private final IWmsInstockRecordService wmsInstockRecordService;//入库记录服务 + + private final IWmsInstockOrderService wmsInstockOrderService;//入库单服务 + + + //质检入库 + @PostMapping("/qcInstore") + public R qcInstore(String instockCode){ + return R.ok(wmsInstockRecordService.completeQualityCheck(instockCode)); + } + + //外协单入库 + @PostMapping("/outSourceInstore") + public R outSourceInstore(WmsInstockOrderBo bo){ + bo.setInstockType("5");//外协单入库 + return R.ok(wmsInstockOrderService.createOutsourceInstockOrder(bo)); + } + +} diff --git a/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/domain/WmsAllocateOrder.java b/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/domain/WmsAllocateOrder.java index b8cedc93..92c81018 100644 --- a/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/domain/WmsAllocateOrder.java +++ b/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/domain/WmsAllocateOrder.java @@ -1,13 +1,10 @@ package org.dromara.wms.domain; -import org.dromara.common.tenant.core.TenantEntity; import com.baomidou.mybatisplus.annotation.*; import lombok.Data; -import lombok.EqualsAndHashCode; -import java.util.Date; -import com.fasterxml.jackson.annotation.JsonFormat; import java.io.Serial; +import java.util.Date; /** * 调拨工单对象 wms_allocate_order @@ -98,6 +95,13 @@ public class WmsAllocateOrder{ * 入库方式 */ private String inMethod; + + + /** + * 调拨原因 + */ + private String allocateReason; + /** * 租户id */ diff --git a/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/domain/WmsOutstockRecord.java b/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/domain/WmsOutstockRecord.java index c1efa0dd..432c5b51 100644 --- a/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/domain/WmsOutstockRecord.java +++ b/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/domain/WmsOutstockRecord.java @@ -1,13 +1,16 @@ package org.dromara.wms.domain; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; -import com.ibm.icu.math.BigDecimal; -import org.dromara.common.tenant.core.TenantEntity; -import com.baomidou.mybatisplus.annotation.*; import lombok.Data; import lombok.EqualsAndHashCode; +import org.dromara.common.tenant.core.TenantEntity; import java.io.Serial; +import java.math.BigDecimal; /** * 出库记录对象 wms_outstock_record @@ -58,7 +61,7 @@ public class WmsOutstockRecord extends TenantEntity { * 出库数量 */ @TableField(typeHandler = JacksonTypeHandler.class) - private java.math.BigDecimal outstockQty; + private BigDecimal outstockQty; /** * 物料大类 @@ -75,7 +78,7 @@ public class WmsOutstockRecord extends TenantEntity { * erp同步数量 */ @TableField(typeHandler = JacksonTypeHandler.class) - private java.math.BigDecimal erpSynchronousQty; + private BigDecimal erpSynchronousQty; /** @@ -91,7 +94,7 @@ public class WmsOutstockRecord extends TenantEntity { private String materialSpec; @TableField(exist = false) - private java.math.BigDecimal returnQty; + private BigDecimal returnQty; private String returnFlag; @TableField(exist = false) private Long warehouseId; diff --git a/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/domain/bo/WmsAllocateOrderBo.java b/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/domain/bo/WmsAllocateOrderBo.java index 6812e3e0..efe3b414 100644 --- a/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/domain/bo/WmsAllocateOrderBo.java +++ b/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/domain/bo/WmsAllocateOrderBo.java @@ -1,16 +1,13 @@ package org.dromara.wms.domain.bo; -import org.dromara.common.mybatis.core.domain.BaseEntity; -import org.dromara.common.core.validate.AddGroup; -import org.dromara.common.core.validate.EditGroup; import io.github.linpeilie.annotations.AutoMapper; import lombok.Data; import lombok.EqualsAndHashCode; -import jakarta.validation.constraints.*; -import java.util.Date; -import com.fasterxml.jackson.annotation.JsonFormat; +import org.dromara.common.mybatis.core.domain.BaseEntity; import org.dromara.wms.domain.WmsAllocateOrder; +import java.util.Date; + /** * 调拨工单业务对象 wms_allocate_order * @@ -111,6 +108,13 @@ public class WmsAllocateOrderBo extends BaseEntity { */ // @NotBlank(message = "入库方式不能为空", groups = { AddGroup.class, EditGroup.class }) private String inMethod; + + /** + * 调拨原因 + */ + private String allocateReason; + + private String tenantId; private String planWarehouseCode; private String targetWarehouseCode; diff --git a/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/domain/bo/WmsInstockDetailBo.java b/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/domain/bo/WmsInstockDetailBo.java index 1a088e98..d47e9103 100644 --- a/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/domain/bo/WmsInstockDetailBo.java +++ b/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/domain/bo/WmsInstockDetailBo.java @@ -180,5 +180,10 @@ public class WmsInstockDetailBo{ // 打印份数(仅当不分包时有效) private Integer printCopies; + /** + * 批次码 + */ + private String batchCode;//若是外协入库可能会有条码 + } diff --git a/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/domain/bo/WmsInstockOrderBo.java b/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/domain/bo/WmsInstockOrderBo.java index 0f2e4e2b..8d9c3de2 100644 --- a/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/domain/bo/WmsInstockOrderBo.java +++ b/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/domain/bo/WmsInstockOrderBo.java @@ -44,9 +44,9 @@ public class WmsInstockOrderBo extends BaseEntity { private String materialCategoryId; /** - * 工单类型(1采购订单,2生产订单,3手工,4系统生成) + * 工单类型(1采购订单,2生产订单,3手工,4系统生成,5外协入库,6即入即出) */ - @NotBlank(message = "工单类型(1采购订单,2生产订单,3手工,4系统生成)不能为空", groups = { AddGroup.class, EditGroup.class }) + @NotBlank(message = "工单类型(1采购订单,2生产订单,3手工,4系统生成,5外协入库,6即入即出)不能为空", groups = { AddGroup.class, EditGroup.class }) private String instockType; /** diff --git a/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/domain/bo/WmsOutstockRecordBo.java b/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/domain/bo/WmsOutstockRecordBo.java index aa77f212..8c424083 100644 --- a/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/domain/bo/WmsOutstockRecordBo.java +++ b/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/domain/bo/WmsOutstockRecordBo.java @@ -53,7 +53,7 @@ public class WmsOutstockRecordBo extends BaseEntity { /** * 出库数量 */ - private java.math.BigDecimal outstockQty; + private BigDecimal outstockQty; /** * 物料大类 diff --git a/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/domain/vo/BaseMaterialInfoVo.java b/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/domain/vo/BaseMaterialInfoVo.java index 300d691e..ef709cd9 100644 --- a/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/domain/vo/BaseMaterialInfoVo.java +++ b/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/domain/vo/BaseMaterialInfoVo.java @@ -294,6 +294,7 @@ public class BaseMaterialInfoVo implements Serializable { /** * 最大停放时间(秒) + * 相当于保质期 */ @ExcelProperty(value = "最大停放时间", converter = ExcelDictConvert.class) @ExcelDictFormat(readConverterExp = "秒=") @@ -382,14 +383,16 @@ public class BaseMaterialInfoVo implements Serializable { */ private String unitName;//JOIN - /** + /** * 是否高价值物料(0否,1是) */ + @ExcelDictFormat(dictType = "is_high_value") private String isHighValue; /** * 质检要求(0必检,1免检) */ + @ExcelDictFormat(dictType = "inspection_request") private String inspectionRequest; } diff --git a/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/domain/vo/WmsAllocateOrderVo.java b/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/domain/vo/WmsAllocateOrderVo.java index 1a2a4b76..292a0a37 100644 --- a/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/domain/vo/WmsAllocateOrderVo.java +++ b/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/domain/vo/WmsAllocateOrderVo.java @@ -1,14 +1,9 @@ package org.dromara.wms.domain.vo; -import java.util.Date; - -import com.baomidou.mybatisplus.annotation.FieldFill; -import com.baomidou.mybatisplus.annotation.TableField; -import com.fasterxml.jackson.annotation.JsonFormat; import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; import com.alibaba.excel.annotation.ExcelProperty; -import org.dromara.common.excel.annotation.ExcelDictFormat; -import org.dromara.common.excel.convert.ExcelDictConvert; +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; import io.github.linpeilie.annotations.AutoMapper; import lombok.Data; import org.dromara.wms.domain.WmsAllocateOrder; @@ -122,6 +117,14 @@ public class WmsAllocateOrderVo implements Serializable { */ @ExcelProperty(value = "入库方式") private String inMethod; + + + /** + * 调拨原因 + */ + @ExcelProperty(value = "调拨原因") + private String allocateReason; + /** * 租户id */ diff --git a/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/domain/vo/WmsOutstockDetailVo.java b/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/domain/vo/WmsOutstockDetailVo.java index bac59341..967393df 100644 --- a/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/domain/vo/WmsOutstockDetailVo.java +++ b/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/domain/vo/WmsOutstockDetailVo.java @@ -10,6 +10,7 @@ import org.dromara.wms.domain.WmsOutstockDetail; import java.io.Serial; import java.io.Serializable; +import java.math.BigDecimal; import java.util.Date; @@ -101,7 +102,7 @@ public class WmsOutstockDetailVo implements Serializable { /** * 完成数量 */ - private java.math.BigDecimal completeQty; + private BigDecimal completeQty; /** * AGV状态(0待拾取 / 1运输中 / 2完成) diff --git a/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/service/IWmsInstockOrderService.java b/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/service/IWmsInstockOrderService.java index d1512618..afdffd59 100644 --- a/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/service/IWmsInstockOrderService.java +++ b/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/service/IWmsInstockOrderService.java @@ -67,4 +67,12 @@ public interface IWmsInstockOrderService { Boolean deleteWithValidByIds(Collection ids, Boolean isValid); Integer approveInstockOrder(WmsInstockOrderBo bo); + + /** + * 外协入库 + * + * @param bo 入库单 + * @return 是否新增成功 + */ + Boolean createOutsourceInstockOrder(WmsInstockOrderBo bo); } diff --git a/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/service/impl/WmsInstockOrderServiceImpl.java b/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/service/impl/WmsInstockOrderServiceImpl.java index 1a31c3d9..2c8a4c0f 100644 --- a/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/service/impl/WmsInstockOrderServiceImpl.java +++ b/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/service/impl/WmsInstockOrderServiceImpl.java @@ -1,12 +1,11 @@ package org.dromara.wms.service.impl; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; -import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.github.yulichang.toolkit.JoinWrappers; import com.github.yulichang.wrapper.MPJLambdaWrapper; import lombok.RequiredArgsConstructor; +import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.utils.MapstructUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.mybatis.core.page.PageQuery; @@ -14,22 +13,17 @@ import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.wms.domain.BaseMaterialCategory; import org.dromara.wms.domain.WmsBaseWarehouse; -import org.dromara.wms.domain.WmsConfiguration; import org.dromara.wms.domain.WmsInstockOrder; -import org.dromara.wms.domain.bo.WmsInstockOrderBo; +import org.dromara.wms.domain.bo.*; +import org.dromara.wms.domain.vo.WmsBaseLocationVo; import org.dromara.wms.domain.vo.WmsInstockOrderVo; import org.dromara.wms.mapper.WmsInstockOrderMapper; -import org.dromara.wms.service.IWmsInstockDetailService; -import org.dromara.wms.service.IWmsInstockOrderService; -import org.springframework.beans.factory.annotation.Autowired; +import org.dromara.wms.service.*; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.text.SimpleDateFormat; -import java.util.Collection; -import java.util.Date; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.concurrent.atomic.AtomicInteger; /** @@ -44,14 +38,22 @@ public class WmsInstockOrderServiceImpl implements IWmsInstockOrderService { private static final AtomicInteger sequence = new AtomicInteger(999); private static final String auditPass = "1"; private final WmsInstockOrderMapper baseMapper; - @Autowired - private IWmsInstockDetailService wmsInstockDetailService; + private final IWmsInstockDetailService wmsInstockDetailService; + + private final IWmsOutstockRecordService wmsOutstockRecordService; + private final IWmsInstockPrintService wmsInstockPrintService; + private final IWmsBaseLocationService baseLocationService; + private final IWmsInventoryService inventoryService; + + private final IWmsInstockRecordService wmsInstockRecordService; + public static Integer nextSequence() { return sequence.incrementAndGet(); } + /** * 查询入库单 * @@ -169,6 +171,7 @@ public class WmsInstockOrderServiceImpl implements IWmsInstockOrderService { * @return 是否新增成功 */ @Override + @Transactional(rollbackFor = Exception.class) public WmsInstockOrderVo insertByBo(WmsInstockOrderBo bo) { String username = LoginHelper.getUsername(); Date date = new Date(); @@ -183,36 +186,72 @@ public class WmsInstockOrderServiceImpl implements IWmsInstockOrderService { }else { orderLast = generateOrder(value); } + // "即入即出" 逻辑:在子表保存完成后处理 + if ("6".equals(bo.getInstockType())) { + bo.setAuditStatus("1");//即入即出直接通过 + bo.setAuditBy(username); + bo.setAuditTime(date); + bo.setAuditComments("即入即出自动通过"); + } String inStockOrder = order + orderDate + orderLast; WmsInstockOrder add = MapstructUtils.convert(bo, WmsInstockOrder.class); - List allConfigurationList = baseMapper.selectAllConfiguration(bo.getWarehouseId()); - if (CollectionUtils.isNotEmpty(allConfigurationList)){ - //查询入库单不用审批的配置 - List unAuditConfigurationList = baseMapper.selectUnAuditByConfiguration(bo.getWarehouseId()); - if (CollectionUtils.isNotEmpty(unAuditConfigurationList)){ - add.setAuditStatus(auditPass); - }else { - //查询入库单是否有对应审批配置 - List configurationList = baseMapper.selectAuditByConfiguration(bo.getWarehouseId()); - if (CollectionUtils.isNotEmpty(configurationList)){ - add.setAuditBy(configurationList.get(0).getAuditBy()); - } - } - }else { - add.setAuditStatus(auditPass); - } - validEntityBeforeSave(add); + add.setInstockCode(inStockOrder); add.setCreateBy(username); + + // 保存入库单主表 boolean flag = baseMapper.insert(add) > 0; - if (flag) { - bo.setInstockId(add.getInstockId()); + if (!flag) { + throw new ServiceException("入库单主表保存失败"); } - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(WmsInstockOrder::getInstockCode,inStockOrder); - WmsInstockOrderVo instockOrderVo = baseMapper.selectVoOne(wrapper); - return instockOrderVo; + MPJLambdaWrapper addOne = buildQueryWrapper(bo); + WmsInstockOrderVo orderVo = baseMapper.selectVoOne(addOne); + // 设置生成的主键ID + bo.setInstockId(orderVo.getInstockId()); + bo.setInstockCode(inStockOrder); + + // 处理入库单子表 + if (bo.getDetailListBo() != null && !bo.getDetailListBo().isEmpty()) { + // 为每个明细设置入库单信息 + for (WmsInstockDetailBo detail : bo.getDetailListBo()) { + detail.setInstockId(orderVo.getInstockId()); + detail.setInstockCode(inStockOrder); + } + + // 批量保存入库单子表 + boolean detailFlag = wmsInstockDetailService.insertByBo(bo.getDetailListBo()); + if (!detailFlag) { + throw new ServiceException("入库单子表保存失败"); + } + } + + // "即入即出" 逻辑:在子表保存完成后处理 + if ("6".equals(bo.getInstockType())) { + if (!inAndOut(bo)) { + throw new ServiceException("即入即出入库单生成失败"); + } + } + + // List allConfigurationList = baseMapper.selectAllConfiguration(bo.getWarehouseId()); + // if (CollectionUtils.isNotEmpty(allConfigurationList)){ + // //查询入库单不用审批的配置 + // List unAuditConfigurationList = baseMapper.selectUnAuditByConfiguration(bo.getWarehouseId()); + // if (CollectionUtils.isNotEmpty(unAuditConfigurationList)){ + // add.setAuditStatus(auditPass); + // }else { + // //查询入库单是否有对应审批配置 + // List configurationList = baseMapper.selectAuditByConfiguration(bo.getWarehouseId()); + // if (CollectionUtils.isNotEmpty(configurationList)){ + // add.setAuditBy(configurationList.get(0).getAuditBy()); + // } + // } + // }else { + // add.setAuditStatus(auditPass); + // } + + + return orderVo; } public String generateOrder(Integer value){ if (value.toString().length()<3){ @@ -224,6 +263,165 @@ public class WmsInstockOrderServiceImpl implements IWmsInstockOrderService { return value.toString(); } + /** + * 即入即出的入库单类型 + * 处理即入即出业务逻辑: + * 1. 为每个入库明细生成批次码 + * 2. 生成入库记录 + * 3. 生成对应的出库记录 + * 4. 使用默认库位 + * 5. 库存实时进出,最终库存量为0 + * + * @param bo 入库单(已包含保存后的明细数据) + * @return 是否处理成功 + */ + @Transactional(rollbackFor = Exception.class) + private boolean inAndOut(WmsInstockOrderBo bo) { + try { + // 获取默认库位,直接为第一个 + List locationList = baseLocationService.queryVoList(new WmsBaseLocationBo()); + if (locationList == null || locationList.isEmpty()) { + throw new ServiceException("即入即出:默认库位不存在"); + } + WmsBaseLocationVo defaultLocation = locationList.get(0); + String defaultLocationCode = defaultLocation.getLocationCode(); + + // 获取当前登录用户 + String username = LoginHelper.getUsername(); + Date currentTime = new Date(); + + // 处理每个入库明细 - 注意:此时明细已经保存到数据库 + if (bo.getDetailListBo() != null && !bo.getDetailListBo().isEmpty()) { + for (WmsInstockDetailBo detail : bo.getDetailListBo()) { + // 1. 生成唯一批次码(入库单号 + 物料编码 + 序列号) + String batchCode = generateBatchCodeForInOut(bo.getInstockCode(), detail.getMaterialCode()); + + // 2. 创建入库记录 + WmsInstockRecordBo instockRecord = new WmsInstockRecordBo(); + instockRecord.setInstockCode(bo.getInstockCode()); + instockRecord.setBatchCode(batchCode); + instockRecord.setMaterialId(detail.getMaterialId()); + instockRecord.setWarehouseId(bo.getWarehouseId()); + instockRecord.setLocationCode(defaultLocationCode); + instockRecord.setMaterialCode(detail.getMaterialCode()); + instockRecord.setMaterialName(detail.getMaterialName()); + instockRecord.setInstockQty(detail.getInstockQty().doubleValue()); + instockRecord.setMaterialCategoryId(detail.getMaterialCategoryId()); + instockRecord.setErpSynchronousStatus("0"); // 默认未同步 + instockRecord.setErpSynchronousQty(0.0); + + // 保存入库记录 + boolean inRecordResult = wmsInstockRecordService.insertByBo(instockRecord); + if (!inRecordResult) { + throw new ServiceException("即入即出:入库记录保存失败 - " + detail.getMaterialCode()); + } + + // 3. 创建出库记录(即入即出:入库后立即出库) + WmsOutstockRecordBo outstockRecord = new WmsOutstockRecordBo(); + outstockRecord.setOutstockCode(generateOutstockCodeForInOut(bo.getInstockCode())); // 基于入库单号生成关联出库单号 + outstockRecord.setOutstockId(null); // 即入即出模式没有正式出库单ID + outstockRecord.setBatchCode(batchCode); // 使用同一批次码 + outstockRecord.setMaterialId(detail.getMaterialId()); + outstockRecord.setLocationCode(defaultLocationCode); + outstockRecord.setOutstockQty(detail.getInstockQty()); + outstockRecord.setMaterialCategoryId(detail.getMaterialCategoryId()); +// outstockRecord.setErpSynchronousStatus("0"); // 默认未同步 +// outstockRecord.setErpSynchronousQty(BigDecimal.ZERO);// 默认未同步 + + // 保存出库记录 + boolean outRecordResult = wmsOutstockRecordService.insertByBo(outstockRecord); + if (!outRecordResult) { + throw new ServiceException("即入即出:出库记录保存失败 - " + detail.getMaterialCode()); + } + + // 4. 库存处理:即入即出模式下,理论上不产生库存积压 + // 但可以选择性地记录库存流水用于追溯 + // TODO: 根据业务需求决定是否需要记录库存变动流水 + } + } else { + throw new ServiceException("即入即出:入库明细为空,无法处理"); + } + + return true; + } catch (Exception e) { + throw new ServiceException("即入即出处理失败:" + e.getMessage()); + } + } + + /** + * 生成批次码 + * 格式:BC + 年月日 + 6位序列号 + * + * @return 批次码 + */ + private String generateBatchCode() { + Date date = new Date(); + SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd"); + String dateStr = format.format(date); + Integer sequence = nextSequence(); + String sequenceStr = String.format("%06d", sequence); + return "BC" + dateStr + sequenceStr; + } + + /** + * 生成出库单号 + * 格式:OUT + 年月日 + 3位序列号 + * + * @return 出库单号 + */ + private String generateOutstockCode() { + Date date = new Date(); + SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd"); + String dateStr = format.format(date); + Integer sequence = nextSequence(); + String sequenceStr = String.format("%03d", sequence); + return "OUT" + dateStr + sequenceStr; + } + + /** + * 为即入即出生成批次码 + * 格式:BC + 入库单号后8位 + 物料编码后6位 + 3位序列号 + * + * @param instockCode 入库单号 + * @param materialCode 物料编码 + * @return 批次码 + */ + private String generateBatchCodeForInOut(String instockCode, String materialCode) { + String prefix = "BC"; + + // 获取入库单号后8位(去除前缀IN) + String instockSuffix = instockCode.length() >= 8 ? + instockCode.substring(instockCode.length() - 8) : instockCode; + + // 获取物料编码后6位,不足时前补0 + String materialSuffix = materialCode.length() >= 6 ? + materialCode.substring(materialCode.length() - 6) : + String.format("%06d", Integer.parseInt(materialCode.replaceAll("[^0-9]", "0"))); + + // 生成3位序列号 + Integer sequence = nextSequence(); + String sequenceStr = String.format("%03d", sequence % 1000); + + return prefix + instockSuffix + materialSuffix + sequenceStr; + } + + /** + * 为即入即出生成关联出库单号 + * 格式:OUT + 入库单号后10位 + * + * @param instockCode 入库单号 + * @return 出库单号 + */ + private String generateOutstockCodeForInOut(String instockCode) { + String prefix = "OUT"; + + // 获取入库单号后10位(去除前缀IN),确保唯一性 + String instockSuffix = instockCode.length() >= 10 ? + instockCode.substring(instockCode.length() - 10) : instockCode; + + return prefix + instockSuffix; + } + /** * 修改入库单 * @@ -282,4 +480,86 @@ public class WmsInstockOrderServiceImpl implements IWmsInstockOrderService { int count = wmsInstockDetailService.deleteByInstockId(ids); return delete>0; } +/** + * 创建外协入库单 + * 1. 生成入库单号 + * 2. 转换并保存入库单主表信息 + * 3. 保存明细信息 + * 4. 若明细中有批次号,则生成打印记录 + */ + + /** + * 创建外协入库单 + * 1. 生成入库单号 + * 2. 转换并保存入库单主表信息 + * 3. 保存明细信息 + * 4. 若明细中有批次号,则生成打印记录 + * + * @param bo 入库单业务对象,包含入库单主表和明细信息 + * @return 是否创建成功 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean createOutsourceInstockOrder(WmsInstockOrderBo bo) { + // 1. 获取当前登录用户名 + String username = LoginHelper.getUsername(); + + // 2. 生成入库单号:格式为 IN + 年月日 + 3位序列号 + Date date = new Date(); + SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd"); + String orderDate = format.format(date); + String order = "IN"; + String orderLast = ""; + Integer value = nextSequence(); + if (value.toString().length() == 4) { + sequence.set(1); + orderLast = generateOrder(sequence.get()); + } else { + orderLast = generateOrder(value); + } + String inStockOrder = order + orderDate + orderLast; + + // 3. 转换并设置入库单主表信息 + WmsInstockOrder add = MapstructUtils.convert(bo, WmsInstockOrder.class); + add.setInstockCode(inStockOrder); + add.setCreateBy(username); + // add.setAuditStatus("1"); // 外协入库默认审核通过 + + // 4. 保存入库单主表 + boolean flag = baseMapper.insert(add) > 0; + + if (flag) { + // 5. 处理入库单子表 + bo.getDetailListBo().forEach(detail -> { + // 设置明细关联的入库单ID和单号 + detail.setInstockId(add.getInstockId()); + detail.setInstockCode(inStockOrder); + + // 6. 保存入库单子表(单个保存) + wmsInstockDetailService.insertByBo(Collections.singletonList(detail)); + + // 7. 如果明细中有批次号,则生成打印记录 + if (StringUtils.isNotBlank(detail.getBatchCode())) { + WmsInstockPrintBo printBo = new WmsInstockPrintBo(); + // 设置打印记录信息 + printBo.setInstockCode(inStockOrder); + printBo.setBatchCode(detail.getBatchCode()); + printBo.setMaterialQty(detail.getInstockQty().longValue()); + printBo.setApportionQty(detail.getApportionQty()); + printBo.setMaterialId(detail.getMaterialId()); + printBo.setMaterialCode(detail.getMaterialCode()); + printBo.setMaterialName(detail.getMaterialName()); + printBo.setMaterialSpe(detail.getMaterialSpe()); + printBo.setUnitName(detail.getUnitName()); + printBo.setCodeYesNo(detail.getCodeYesNo()); + printBo.setMaterialCategoryId(detail.getMaterialCategoryId()); + + // 8. 保存打印记录 + wmsInstockPrintService.insertByBo(printBo); + } + }); + } + + return flag; + } } diff --git a/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/service/impl/WmsInstockRecordServiceImpl.java b/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/service/impl/WmsInstockRecordServiceImpl.java index 5ac7514a..3ef702c0 100644 --- a/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/service/impl/WmsInstockRecordServiceImpl.java +++ b/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/service/impl/WmsInstockRecordServiceImpl.java @@ -11,6 +11,7 @@ import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.wms.domain.BaseMaterialCategory; +import org.dromara.wms.domain.WmsInstockOrder; import org.dromara.wms.domain.WmsInstockRecord; import org.dromara.wms.domain.bo.WmsInstockOrderBo; import org.dromara.wms.domain.bo.WmsInstockPrintBo; @@ -23,6 +24,7 @@ import org.dromara.wms.domain.vo.WmsInventoryVo; import org.dromara.wms.mapper.WmsInstockOrderMapper; import org.dromara.wms.mapper.WmsInstockRecordMapper; import org.dromara.wms.service.*; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -44,11 +46,13 @@ public class WmsInstockRecordServiceImpl implements IWmsInstockRecordService { private final WmsInstockRecordMapper baseMapper; private final IWmsInventoryService inventoryService; - private final IWmsInstockOrderService instockOrderService; +// private final IWmsInstockOrderService instockOrderService; private final WmsInstockOrderMapper instockOrderMapper; + private final IWmsInstockDetailService instockDetailService; private final IWmsInstockPrintService instockPrintService; + /** * 查询入库记录 * @@ -174,10 +178,17 @@ public class WmsInstockRecordServiceImpl implements IWmsInstockRecordService { @Override @Transactional(rollbackFor = Exception.class) public Boolean completeQualityCheck(String instockCode) { - // 查询入库单信息 + + + // 查询入库单信息, 只根据入库单号查询 WmsInstockOrderBo orderBo = new WmsInstockOrderBo(); orderBo.setInstockCode(instockCode); - List orders = instockOrderService.queryList(orderBo); + MPJLambdaWrapper lqwInstockOrder = JoinWrappers.lambda(WmsInstockOrder.class) + .selectAll(WmsInstockOrder.class) + .eq(StringUtils.isNotBlank(orderBo.getInstockCode()), WmsInstockOrder::getInstockCode, orderBo.getInstockCode()) + .orderByDesc(WmsInstockOrder::getCreateTime); + List orders = instockOrderMapper.selectVoList(lqwInstockOrder); + if (orders.isEmpty()) { throw new ServiceException("入库单不存在 " + instockCode); } @@ -220,8 +231,8 @@ public class WmsInstockRecordServiceImpl implements IWmsInstockRecordService { instockPrintService.updateByBo(newPrintBo); - // 更新库存信息 - WmsInventoryVo inventoryVo = inventoryService.queryByBatchAndLocation(recordBo.getBatchCode(), recordBo.getLocationCode()); + // 更新库存信息,todo:只根据批次号 + WmsInventoryVo inventoryVo = inventoryService.queryByBatchAndLocation(recordBo.getBatchCode()); double qty = recordBo.getInstockQty(); if (inventoryVo == null) { // 如果库存记录不存在,则新增一条库存记录 diff --git a/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/service/impl/WmsInventoryServiceImpl.java b/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/service/impl/WmsInventoryServiceImpl.java index 67d78c3d..3cdd77d0 100644 --- a/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/service/impl/WmsInventoryServiceImpl.java +++ b/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/service/impl/WmsInventoryServiceImpl.java @@ -225,17 +225,16 @@ public class WmsInventoryServiceImpl implements IWmsInventoryService { /** - * 根据批次码和库位编码查询库存 + * 根据批次码查询库存 * @param batchCode 批次码 * @param locationCode 库位编码 * @return 库存VO */ @Override - public WmsInventoryVo queryByBatchAndLocation(String batchCode, String locationCode) { + public WmsInventoryVo queryByBatchAndLocation(String batchCode) { LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); lqw - .eq(WmsInventory::getBatchCode, batchCode) - .eq(WmsInventory::getLocationCode, locationCode); + .eq(WmsInventory::getBatchCode, batchCode); return baseMapper.selectVoOne(lqw); } diff --git a/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/service/impl/WmsOutstockOrderServiceImpl.java b/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/service/impl/WmsOutstockOrderServiceImpl.java index 7056c407..84e550bb 100644 --- a/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/service/impl/WmsOutstockOrderServiceImpl.java +++ b/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/service/impl/WmsOutstockOrderServiceImpl.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.github.yulichang.toolkit.JoinWrappers; import com.github.yulichang.wrapper.MPJLambdaWrapper; import lombok.RequiredArgsConstructor; +import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.utils.MapstructUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.mybatis.core.page.PageQuery; @@ -14,10 +15,13 @@ import org.dromara.wms.domain.BaseMaterialCategory; import org.dromara.wms.domain.WmsBaseWarehouse; import org.dromara.wms.domain.WmsOutstockOrder; import org.dromara.wms.domain.bo.WmsOutstockOrderBo; +import org.dromara.wms.domain.bo.WmsOutstockRecordBo; import org.dromara.wms.domain.vo.WmsOutstockOrderVo; import org.dromara.wms.mapper.WmsOutstockOrderMapper; +import org.dromara.wms.mapper.WmsOutstockRecordMapper; import org.dromara.wms.service.IWmsOutstockDetailService; import org.dromara.wms.service.IWmsOutstockOrderService; +import org.dromara.wms.service.IWmsOutstockRecordService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -47,6 +51,9 @@ public class WmsOutstockOrderServiceImpl implements IWmsOutstockOrderService { @Autowired private IWmsOutstockDetailService wmsOutstockDetailService; + private final IWmsOutstockRecordService wmsOutstockRecordService;//出库记录Service + private final WmsOutstockRecordMapper wmsOutstockRecordMapper;//出库记录Mapper + /** * 查询出库单 * @@ -132,45 +139,114 @@ public class WmsOutstockOrderServiceImpl implements IWmsOutstockOrderService { * @return 是否新增成功 */ @Override + @Transactional(rollbackFor = Exception.class) public WmsOutstockOrderVo insertByBo(WmsOutstockOrderBo bo) { + // 获取当前登录用户名 String username = LoginHelper.getUsername(); + // 获取当前时间并格式化为指定格式 Date date = new Date(); SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHssmm"); String orderDate = format.format(date); + + // 出库单号前缀 String order = "OU"; - String orderLast=""; + String orderLast = ""; + + // 获取下一个序列号 Integer value = nextSequence(); - if (value.toString().length()==4){ + + // 如果序列号长度等于4,则重置序列号从1开始 + if (value.toString().length() == 4) { sequence.set(1); orderLast = generateOrder(sequence.get()); - }else { + } else { orderLast = generateOrder(value); } + + // 生成完整的出库单号 String outStockOrder = order + orderDate + orderLast; + + // 转换业务对象为实体对象 WmsOutstockOrder add = MapstructUtils.convert(bo, WmsOutstockOrder.class); + + // 验证实体数据是否合规 validEntityBeforeSave(add); + + // 设置出库单号、创建人 add.setOutstockCode(outStockOrder); add.setCreateBy(username); + + if("4".equals(add.getOutstockType())){ // 出库类型4为 AGV 出库 + Boolean agvFlag = agvAction(add); + if (agvFlag) { + // 1) 保存出库单信息 + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setOutstockId(add.getOutstockId()); + } + + // 2) 写入出库记录(最小必要字段,后续可按业务补充) + WmsOutstockRecordBo record = new WmsOutstockRecordBo(); + record.setOutstockCode(outStockOrder); // 关联出库单号 + record.setMaterialCategoryId(add.getMaterialCategoryId()); // 若为空则由后续流程补充 + // TODO:根据业务需要补齐其他字段,例如仓库、物料、数量、位置等 + boolean rec = wmsOutstockRecordService.insertByBo(record); + if (!rec) { + throw new ServiceException("AGV出库:生成出库记录失败"); + } + // 3) 查询并返回出库单视图 + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(WmsOutstockOrder::getOutstockCode, outStockOrder); + return baseMapper.selectVoOne(wrapper); + } else { + // AGV 调用失败,直接返回 null 或抛出异常按需处理 + return null; + } + } + // 保存出库单信息 boolean flag = baseMapper.insert(add) > 0; + // 如果保存成功,设置出库单ID if (flag) { bo.setOutstockId(add.getOutstockId()); } + // 根据出库单号查询最新出库单信息 LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(WmsOutstockOrder::getOutstockCode,outStockOrder); + wrapper.eq(WmsOutstockOrder::getOutstockCode, outStockOrder); List vos = baseMapper.selectVoList(wrapper); + // 返回出库单视图对象 return vos.get(0); } - public String generateOrder(Integer value){ - if (value.toString().length()<3){ + + + /** + * 生成订单号后缀 + * @param value 序列号 + * @return 格式化后的订单号后缀 + */ + public String generateOrder(Integer value) { + // 如果序列号小于3位,前面补0 + if (value.toString().length() < 3) { String fixedLengthString = String.format("%03d", value); return fixedLengthString; - }else if (value.toString().length()==3){ + } else if (value.toString().length() == 3) { + // 如果正好是3位,直接返回 return value.toString(); } + // 其他情况直接返回字符串形式 return value.toString(); } + /** + * agv接口 + * @param wmsOutstockOrder + * @return + */ + private Boolean agvAction(WmsOutstockOrder wmsOutstockOrder){ + //TODO:调用agv接口 + return true; + } + /** * 修改出库单 *