diff --git a/nl-module-wms/nl-module-wms-api/src/main/java/cn/code/nl/module/wms/enums/ErrorCodeConstants.java b/nl-module-wms/nl-module-wms-api/src/main/java/cn/code/nl/module/wms/enums/ErrorCodeConstants.java index 632a1e2c..90dba44b 100644 --- a/nl-module-wms/nl-module-wms-api/src/main/java/cn/code/nl/module/wms/enums/ErrorCodeConstants.java +++ b/nl-module-wms/nl-module-wms-api/src/main/java/cn/code/nl/module/wms/enums/ErrorCodeConstants.java @@ -16,6 +16,9 @@ public interface ErrorCodeConstants { ErrorCode IOSTOR_INV_INVENTORY_INVALID = new ErrorCode(6_000_5, "出库库存已变化,请刷新后重新选择完整箱库存"); + ErrorCode IOSTOR_INV_NO_MATCHING_INVENTORY = new ErrorCode(6_000_6, "没有符合当前出库明细的可用库存"); + ErrorCode IOSTOR_INV_MANUAL_STATUS_INVALID = new ErrorCode(6_000_7, "只有生成或分配中的明细允许手工分配"); + ErrorCode IOSTORINV_DTL_NOT_EXISTS = new ErrorCode(5, "出入库单明细不存在"); ErrorCode IOSTORINV_DIS_NOT_EXISTS = new ErrorCode(6, "出入库单分配不存在"); diff --git a/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/controller/admin/iostorinv/IostorInvController.java b/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/controller/admin/iostorinv/IostorInvController.java index 670f15dc..e7c4a8e5 100644 --- a/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/controller/admin/iostorinv/IostorInvController.java +++ b/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/controller/admin/iostorinv/IostorInvController.java @@ -98,6 +98,7 @@ public class IostorInvController { @GetMapping("/get") @Operation(summary = "获得出入库单主表") @Parameter(name = "id", description = "编号", required = true, example = "1024") + @TransMethodResult @PreAuthorize("@ss.hasPermission('wms:iostor-inv:query')") public CommonResult getIostorInv(@RequestParam("id") Long id) { IostorInvDO iostorInv = iostorInvService.getIostorInv(id); @@ -115,6 +116,68 @@ public class IostorInvController { return success(iostorInvService.getIostorInvDetails(iostorinvId)); } + @GetMapping("/allocations") + @Operation(summary = "获得出库单分配明细") + @PreAuthorize("@ss.hasPermission('wms:iostor-inv:query')") + public CommonResult> getOutboundAllocations( + @RequestParam("iostorinvId") Long iostorinvId, + @RequestParam(value = "iostorinvdtlId", required = false) Long iostorinvdtlId, + @RequestParam(value = "sectId", required = false) String sectId) { + return success(iostorInvService.getOutboundAllocations(iostorinvId, iostorinvdtlId, sectId)); + } + + @PostMapping("/allocate-all") + @Operation(summary = "出库单全部分配") + @PreAuthorize("@ss.hasPermission('wms:iostor-inv:update')") + public CommonResult allocateAll(@Valid @RequestBody OutboundAllocationReqVO reqVO) { + iostorInvService.allocateAll(reqVO); + return success(true); + } + + @PostMapping("/cancel-all-allocations") + @Operation(summary = "出库单全部取消分配") + @PreAuthorize("@ss.hasPermission('wms:iostor-inv:update')") + public CommonResult cancelAllAllocations(@Valid @RequestBody OutboundAllocationReqVO reqVO) { + iostorInvService.cancelAllAllocations(reqVO); + return success(true); + } + + @PostMapping("/auto-allocate") + @Operation(summary = "出库单明细自动分配") + @PreAuthorize("@ss.hasPermission('wms:iostor-inv:update')") + public CommonResult autoAllocate( + @Valid @RequestBody OutboundDetailAllocationReqVO reqVO) { + iostorInvService.autoAllocate(reqVO); + return success(true); + } + + @PostMapping("/auto-cancel-allocation") + @Operation(summary = "出库单明细自动取消分配") + @PreAuthorize("@ss.hasPermission('wms:iostor-inv:update')") + public CommonResult autoCancelAllocation( + @Valid @RequestBody OutboundDetailAllocationReqVO reqVO) { + iostorInvService.autoCancelAllocation(reqVO); + return success(true); + } + + @GetMapping("/manual-allocation-inventory") + @Operation(summary = "获得出库明细手工分配可用库存") + @PreAuthorize("@ss.hasPermission('wms:iostor-inv:query')") + public CommonResult> getManualAllocationInventory( + @RequestParam("iostorinvId") Long iostorinvId, + @RequestParam("iostorinvdtlId") Long iostorinvdtlId, + @RequestParam(value = "sectId", required = false) String sectId) { + return success(iostorInvService.getManualAllocationInventory(iostorinvId, iostorinvdtlId, sectId)); + } + + @PostMapping("/manual-allocate") + @Operation(summary = "保存出库明细手工分配") + @PreAuthorize("@ss.hasPermission('wms:iostor-inv:update')") + public CommonResult manualAllocate(@Valid @RequestBody ManualAllocationSaveReqVO reqVO) { + iostorInvService.manualAllocate(reqVO); + return success(true); + } + @GetMapping("/page") @Operation(summary = "获得出入库单主表分页") @TransMethodResult diff --git a/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/controller/admin/iostorinv/vo/AllocationInventoryRespVO.java b/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/controller/admin/iostorinv/vo/AllocationInventoryRespVO.java new file mode 100644 index 00000000..69dfd5fe --- /dev/null +++ b/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/controller/admin/iostorinv/vo/AllocationInventoryRespVO.java @@ -0,0 +1,24 @@ +package cn.code.nl.module.wms.controller.admin.iostorinv.vo; + +import lombok.Data; + +import java.math.BigDecimal; + +@Data +public class AllocationInventoryRespVO { + private Long groupId; + private String vehicleCode; + private String materialId; + private String materialCode; + private String materialName; + private String pcsn; + private BigDecimal availableQty; + private String qtyUnitId; + private String qtyUnitName; + private String sectId; + private String sectCode; + private String sectName; + private String structId; + private String structCode; + private String structName; +} diff --git a/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/controller/admin/iostorinv/vo/IostorInvDetailRespVO.java b/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/controller/admin/iostorinv/vo/IostorInvDetailRespVO.java index c5e40f65..c0a5e938 100644 --- a/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/controller/admin/iostorinv/vo/IostorInvDetailRespVO.java +++ b/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/controller/admin/iostorinv/vo/IostorInvDetailRespVO.java @@ -3,12 +3,19 @@ package cn.code.nl.module.wms.controller.admin.iostorinv.vo; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; +import java.math.BigDecimal; @Schema(description = "管理后台 - 出入库单编辑明细 Response VO") @Data @EqualsAndHashCode(callSuper = true) public class IostorInvDetailRespVO extends IostorInvCreateReqVO.Detail { + private Long iostorinvdtlId; + private Integer seqNo; + private String billStatus; + private BigDecimal assignQty; + private BigDecimal unassignQty; + @Schema(description = "物料名称") private String materialName; } diff --git a/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/controller/admin/iostorinv/vo/IostorInvRespVO.java b/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/controller/admin/iostorinv/vo/IostorInvRespVO.java index 768356af..1924ead2 100644 --- a/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/controller/admin/iostorinv/vo/IostorInvRespVO.java +++ b/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/controller/admin/iostorinv/vo/IostorInvRespVO.java @@ -25,6 +25,9 @@ public class IostorInvRespVO implements VO { @Schema(description = "出入库单主表标识", requiredMode = Schema.RequiredMode.REQUIRED) private Long iostorinvId; + @Schema(description = "出入类型") + private String ioType; + @Schema(description = "单据编号", requiredMode = Schema.RequiredMode.REQUIRED) @ExcelProperty("单据编号") private String billCode; diff --git a/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/controller/admin/iostorinv/vo/ManualAllocationSaveReqVO.java b/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/controller/admin/iostorinv/vo/ManualAllocationSaveReqVO.java new file mode 100644 index 00000000..9e996ac5 --- /dev/null +++ b/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/controller/admin/iostorinv/vo/ManualAllocationSaveReqVO.java @@ -0,0 +1,18 @@ +package cn.code.nl.module.wms.controller.admin.iostorinv.vo; + +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +import java.util.List; + +@Data +public class ManualAllocationSaveReqVO { + @NotNull + private Long iostorinvId; + @NotNull + private Long iostorinvdtlId; + private String sectId; + @NotEmpty(message = "请至少选择一条库存") + private List groupIds; +} diff --git a/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/controller/admin/iostorinv/vo/OutboundAllocationReqVO.java b/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/controller/admin/iostorinv/vo/OutboundAllocationReqVO.java new file mode 100644 index 00000000..1946de72 --- /dev/null +++ b/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/controller/admin/iostorinv/vo/OutboundAllocationReqVO.java @@ -0,0 +1,15 @@ +package cn.code.nl.module.wms.controller.admin.iostorinv.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +@Schema(description = "管理后台 - 出库分配 Request VO") +@Data +public class OutboundAllocationReqVO { + + @NotNull(message = "出库单标识不能为空") + private Long iostorinvId; + + private String sectId; +} diff --git a/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/controller/admin/iostorinv/vo/OutboundAllocationRespVO.java b/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/controller/admin/iostorinv/vo/OutboundAllocationRespVO.java new file mode 100644 index 00000000..0be0d181 --- /dev/null +++ b/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/controller/admin/iostorinv/vo/OutboundAllocationRespVO.java @@ -0,0 +1,22 @@ +package cn.code.nl.module.wms.controller.admin.iostorinv.vo; + +import lombok.Data; + +import java.math.BigDecimal; + +@Data +public class OutboundAllocationRespVO { + private String iostorinvdisId; + private Long iostorinvdtlId; + private String workStatus; + private String materialCode; + private String materialName; + private String pcsn; + private String storagevehicleCode; + private BigDecimal planQty; + private String qtyUnitName; + private String sectId; + private String sectName; + private String structCode; + private String structName; +} diff --git a/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/controller/admin/iostorinv/vo/OutboundDetailAllocationReqVO.java b/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/controller/admin/iostorinv/vo/OutboundDetailAllocationReqVO.java new file mode 100644 index 00000000..63cdf663 --- /dev/null +++ b/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/controller/admin/iostorinv/vo/OutboundDetailAllocationReqVO.java @@ -0,0 +1,18 @@ +package cn.code.nl.module.wms.controller.admin.iostorinv.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +@Schema(description = "管理后台 - 出库明细自动分配 Request VO") +@Data +public class OutboundDetailAllocationReqVO { + + @NotNull(message = "出库单标识不能为空") + private Long iostorinvId; + + @NotNull(message = "出库单明细标识不能为空") + private Long iostorinvdtlId; + + private String sectId; +} diff --git a/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/dal/dataobject/iostorinvdis/IostorinvDisDO.java b/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/dal/dataobject/iostorinvdis/IostorinvDisDO.java index d6ba1660..b2491a31 100644 --- a/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/dal/dataobject/iostorinvdis/IostorinvDisDO.java +++ b/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/dal/dataobject/iostorinvdis/IostorinvDisDO.java @@ -1,120 +1,119 @@ -package cn.code.nl.module.wms.dal.dataobject.iostorinvdis; - -import lombok.*; -import java.util.*; -import java.math.BigDecimal; -import java.math.BigDecimal; -import com.baomidou.mybatisplus.annotation.*; -import cn.code.nl.framework.mybatis.core.dataobject.BaseDO; - -/** - * 出入库单分配 DO - * - * @author 诺力管理员 - */ -@TableName("wms_iostorinvdis") -@KeySequence("wms_iostorinvdis_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class IostorinvDisDO extends BaseDO { - - /** - * 出入单分配标识 - */ - @TableId(type = IdType.INPUT) - private String iostorinvdisId; - /** - * 出入单标识 - */ - private String iostorinvId; - /** - * 出入单明细标识 - */ - private String iostorinvdtlId; - /** - * 明细序号 - */ - private String seqNo; - /** - * 库区标识 - */ - private String sectId; - /** - * 库区编码 - */ - private String sectCode; - /** - * 库区名称 - */ - private String sectName; - /** - * 仓位标识 - */ - private String structId; - /** - * 仓位编码 - */ - private String structCode; - /** - * 仓位名称 - */ - private String structName; - /** - * 物料标识 - */ - private String materialId; - /** - * 物料编码 - */ - private String materialCode; - /** - * 批次 - */ - private String pcsn; - /** - * 执行状态 - */ - private String workStatus; - /** - * 任务标识 - */ - private String taskId; - /** - * 存储载具编码 - */ - private String storagevehicleCode; - /** - * 是否已下发 - */ - private String isIssued; - /** - * 数量计量单位标识 - */ - private String qtyUnitId; - /** - * 数量计量单位名称 - */ - private String qtyUnitName; - /** - * 计划数量 - */ - private BigDecimal planQty; - /** - * 实际数量 - */ - private BigDecimal realQty; - /** - * 出入点位标识 - */ - private String pointCode; - /** - * 出库类型:0自动搬运1手动搬运 - */ - private Boolean handType; - - -} \ No newline at end of file +package cn.code.nl.module.wms.dal.dataobject.iostorinvdis; + +import lombok.*; +import java.util.*; +import java.math.BigDecimal; +import java.math.BigDecimal; +import com.baomidou.mybatisplus.annotation.*; +import cn.code.nl.framework.mybatis.core.dataobject.BaseDO; + +/** + * 出入库单分配 DO + * + * @author 诺力管理员 + */ +@TableName("wms_iostorinvdis") +@KeySequence("wms_iostorinvdis_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class IostorinvDisDO { + + /** + * 出入单分配标识 + */ + @TableId(type = IdType.INPUT) + private String iostorinvdisId; + /** + * 出入单标识 + */ + private String iostorinvId; + /** + * 出入单明细标识 + */ + private String iostorinvdtlId; + /** + * 明细序号 + */ + private String seqNo; + /** + * 库区标识 + */ + private String sectId; + /** + * 库区编码 + */ + private String sectCode; + /** + * 库区名称 + */ + private String sectName; + /** + * 仓位标识 + */ + private String structId; + /** + * 仓位编码 + */ + private String structCode; + /** + * 仓位名称 + */ + private String structName; + /** + * 物料标识 + */ + private String materialId; + /** + * 物料编码 + */ + private String materialCode; + /** + * 批次 + */ + private String pcsn; + /** + * 执行状态 + */ + private String workStatus; + /** + * 任务标识 + */ + private String taskId; + /** + * 存储载具编码 + */ + private String storagevehicleCode; + /** + * 是否已下发 + */ + private String isIssued; + /** + * 数量计量单位标识 + */ + private String qtyUnitId; + /** + * 数量计量单位名称 + */ + private String qtyUnitName; + /** + * 计划数量 + */ + private BigDecimal planQty; + /** + * 实际数量 + */ + private BigDecimal realQty; + /** + * 出入点位标识 + */ + private String pointCode; + /** + * 出库类型:0自动搬运1手动搬运 + */ + private Boolean handType; + + +} diff --git a/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/dal/mysql/iostorinvdis/IostorinvDisMapper.java b/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/dal/mysql/iostorinvdis/IostorinvDisMapper.java index c33e6c85..68e57e84 100644 --- a/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/dal/mysql/iostorinvdis/IostorinvDisMapper.java +++ b/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/dal/mysql/iostorinvdis/IostorinvDisMapper.java @@ -8,6 +8,8 @@ import cn.code.nl.framework.mybatis.core.mapper.BaseMapperX; import cn.code.nl.module.wms.dal.dataobject.iostorinvdis.IostorinvDisDO; import org.apache.ibatis.annotations.Mapper; import cn.code.nl.module.wms.controller.admin.iostorinvdis.vo.*; +import cn.code.nl.module.wms.controller.admin.iostorinv.vo.OutboundAllocationRespVO; +import org.apache.ibatis.annotations.Param; /** * 出入库单分配 Mapper @@ -17,6 +19,11 @@ import cn.code.nl.module.wms.controller.admin.iostorinvdis.vo.*; @Mapper public interface IostorinvDisMapper extends BaseMapperX { + List selectAllocationList( + @Param("iostorinvId") Long iostorinvId, + @Param("iostorinvdtlId") Long iostorinvdtlId, + @Param("sectId") String sectId); + default PageResult selectPage(IostorinvDisPageReqVO reqVO) { return selectPage(reqVO, new LambdaQueryWrapperX() .eqIfPresent(IostorinvDisDO::getIostorinvId, reqVO.getIostorinvId()) @@ -44,4 +51,4 @@ public interface IostorinvDisMapper extends BaseMapperX { .orderByDesc(IostorinvDisDO::getIostorinvdisId)); } -} \ No newline at end of file +} diff --git a/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/dal/mysql/iostorinvdtl/IostorinvDtlMapper.java b/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/dal/mysql/iostorinvdtl/IostorinvDtlMapper.java index 337e93cf..63af0536 100644 --- a/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/dal/mysql/iostorinvdtl/IostorinvDtlMapper.java +++ b/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/dal/mysql/iostorinvdtl/IostorinvDtlMapper.java @@ -13,6 +13,7 @@ import org.apache.ibatis.annotations.Param; import cn.code.nl.module.wms.controller.admin.iostorinv.vo.AvailableInventoryPageReqVO; import cn.code.nl.module.wms.controller.admin.iostorinv.vo.AvailableInventoryRespVO; import cn.code.nl.module.wms.controller.admin.iostorinv.vo.IostorInvDetailRespVO; +import cn.code.nl.module.wms.controller.admin.iostorinv.vo.AllocationInventoryRespVO; import cn.code.nl.module.wms.controller.admin.iostorinvdtl.vo.*; /** @@ -51,6 +52,20 @@ public interface IostorinvDtlMapper extends BaseMapperX { /** 查询指定出入库单的编辑明细,并带出物料名称。 */ List selectEditDetails(@Param("iostorinvId") Long iostorinvId); + List selectAllocationInventoryForUpdate( + @Param("storId") String storId, + @Param("sectId") String sectId, + @Param("materialId") String materialId, + @Param("pcsn") String pcsn, + @Param("sourceBillCode") String sourceBillCode); + + List selectManualAllocationInventory( + @Param("storId") String storId, @Param("sectId") String sectId, + @Param("materialId") String materialId, @Param("pcsn") String pcsn, + @Param("sourceBillCode") String sourceBillCode, + @Param("groupIds") Collection groupIds, + @Param("forUpdate") boolean forUpdate); + default PageResult selectPage(IostorinvDtlPageReqVO reqVO) { return selectPage(reqVO, new LambdaQueryWrapperX() .eqIfPresent(IostorinvDtlDO::getIostorinvId, reqVO.getIostorinvId()) diff --git a/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/dal/mysql/structAttr/StrucAttrMapper.java b/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/dal/mysql/structAttr/StrucAttrMapper.java index f6078029..c9309808 100644 --- a/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/dal/mysql/structAttr/StrucAttrMapper.java +++ b/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/dal/mysql/structAttr/StrucAttrMapper.java @@ -7,6 +7,8 @@ import cn.code.nl.framework.mybatis.core.query.LambdaQueryWrapperX; import cn.code.nl.framework.mybatis.core.mapper.BaseMapperX; import cn.code.nl.module.wms.dal.dataobject.structAttr.StrucAttrDO; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Update; import cn.code.nl.module.wms.controller.admin.structAttr.vo.*; /** @@ -17,6 +19,36 @@ import cn.code.nl.module.wms.controller.admin.structAttr.vo.*; @Mapper public interface StrucAttrMapper extends BaseMapperX { + @Update(""" + UPDATE wms_structattr + SET lock_type = '3', + inv_type = #{invType}, + inv_id = #{invId}, + inv_code = #{invCode} + WHERE struct_id = #{structId} + AND deleted = '0' + AND (lock_type IS NULL OR lock_type IN ('0', '1') + OR (lock_type = '3' AND inv_id = #{invId})) + """) + int lockForOutbound(@Param("structId") String structId, + @Param("invType") String invType, + @Param("invId") String invId, + @Param("invCode") String invCode); + + @Update(""" + UPDATE wms_structattr + SET lock_type = '1', + inv_type = NULL, + inv_id = NULL, + inv_code = NULL + WHERE storagevehicle_code = #{vehicleCode} + AND deleted = '0' + AND lock_type = '3' + AND inv_id = #{invId} + """) + int unlockOutbound(@Param("vehicleCode") String vehicleCode, + @Param("invId") String invId); + default PageResult selectPage(StrucAttrPageReqVO reqVO) { return selectPage(reqVO, new LambdaQueryWrapperX() .eqIfPresent(StrucAttrDO::getStructCode, reqVO.getStructCode()) @@ -59,4 +91,4 @@ public interface StrucAttrMapper extends BaseMapperX { .orderByDesc(StrucAttrDO::getStructId)); } -} \ No newline at end of file +} diff --git a/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/service/iostorinv/IostorInvService.java b/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/service/iostorinv/IostorInvService.java index a4ad27d3..9ee0b052 100644 --- a/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/service/iostorinv/IostorInvService.java +++ b/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/service/iostorinv/IostorInvService.java @@ -86,6 +86,20 @@ public interface IostorInvService { */ List getIostorInvDetails(Long id); + List getOutboundAllocations( + Long iostorinvId, Long iostorinvdtlId, String sectId); + + void allocateAll(@Valid OutboundAllocationReqVO reqVO); + + void cancelAllAllocations(@Valid OutboundAllocationReqVO reqVO); + + void autoAllocate(@Valid OutboundDetailAllocationReqVO reqVO); + + void autoCancelAllocation(@Valid OutboundDetailAllocationReqVO reqVO); + List getManualAllocationInventory( + Long iostorinvId, Long iostorinvdtlId, String sectId); + void manualAllocate(@Valid ManualAllocationSaveReqVO reqVO); + /** * 获得出入库单主表分页 * diff --git a/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/service/iostorinv/IostorInvServiceImpl.java b/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/service/iostorinv/IostorInvServiceImpl.java index 330dd229..0e9df667 100644 --- a/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/service/iostorinv/IostorInvServiceImpl.java +++ b/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/service/iostorinv/IostorInvServiceImpl.java @@ -25,6 +25,11 @@ import cn.code.nl.framework.common.util.object.BeanUtils; import cn.code.nl.module.wms.dal.mysql.iostorinv.IostorInvMapper; import cn.code.nl.module.wms.dal.mysql.iostorinvdtl.IostorinvDtlMapper; import cn.code.nl.module.wms.dal.mysql.bsrealstorattr.BsrealStorAttrMapper; +import cn.code.nl.module.wms.dal.mysql.groupplate.GroupPlateMapper; +import cn.code.nl.module.wms.dal.mysql.iostorinvdis.IostorinvDisMapper; +import cn.code.nl.module.wms.dal.mysql.structAttr.StrucAttrMapper; +import cn.code.nl.module.wms.dal.dataobject.groupplate.GroupPlateDO; +import cn.code.nl.module.wms.dal.dataobject.iostorinvdis.IostorinvDisDO; import cn.code.nl.framework.mybatis.core.query.LambdaQueryWrapperX; import static cn.code.nl.framework.common.exception.util.ServiceExceptionUtil.exception; @@ -56,6 +61,15 @@ public class IostorInvServiceImpl implements IostorInvService { @Resource private CodeGenApi codeGenApi; + @Resource + private IostorinvDisMapper iostorinvDisMapper; + + @Resource + private GroupPlateMapper groupPlateMapper; + + @Resource + private StrucAttrMapper strucAttrMapper; + /** * 创建出库单及其明细。 */ @@ -255,7 +269,15 @@ public class IostorInvServiceImpl implements IostorInvService { @Override public IostorInvDO getIostorInv(Long id) { - return iostorInvMapper.selectById(id); + IostorInvDO iostorInv = iostorInvMapper.selectById(id); + if (iostorInv == null || StrUtil.isBlank(iostorInv.getStorId())) { + return iostorInv; + } + BsrealStorAttrDO warehouse = bsrealStorAttrMapper.selectById(iostorInv.getStorId()); + if (warehouse != null) { + iostorInv.setStorName(warehouse.getStorName()); + } + return iostorInv; } @Override @@ -263,6 +285,299 @@ public class IostorInvServiceImpl implements IostorInvService { return iostorinvDtlMapper.selectEditDetails(id); } + @Override + public List getOutboundAllocations( + Long iostorinvId, Long iostorinvdtlId, String sectId) { + return iostorinvDisMapper.selectAllocationList(iostorinvId, iostorinvdtlId, sectId); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void allocateAll(OutboundAllocationReqVO reqVO) { + IostorInvDO header = iostorInvMapper.selectById(reqVO.getIostorinvId()); + if (header == null) { + throw exception(IOSTOR_INV_NOT_EXISTS); + } + List details = iostorinvDtlMapper.selectList( + new LambdaQueryWrapperX() + .eq(IostorinvDtlDO::getIostorinvId, reqVO.getIostorinvId()) + .orderByAsc(IostorinvDtlDO::getSeqNo)); + for (IostorinvDtlDO detail : details) { + allocateDetail(header, detail, reqVO.getSectId()); + } + refreshHeaderAllocationStatus(reqVO.getIostorinvId()); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void autoAllocate(OutboundDetailAllocationReqVO reqVO) { + IostorInvDO header = iostorInvMapper.selectById(reqVO.getIostorinvId()); + if (header == null) { + throw exception(IOSTOR_INV_NOT_EXISTS); + } + IostorinvDtlDO detail = getOwnedDetail(reqVO.getIostorinvId(), reqVO.getIostorinvdtlId()); + if (allocateDetail(header, detail, reqVO.getSectId()).signum() == 0) { + throw exception(IOSTOR_INV_NO_MATCHING_INVENTORY); + } + refreshHeaderAllocationStatus(reqVO.getIostorinvId()); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void cancelAllAllocations(OutboundAllocationReqVO reqVO) { + List generated = iostorinvDisMapper.selectList( + new LambdaQueryWrapperX() + .eq(IostorinvDisDO::getIostorinvId, reqVO.getIostorinvId()) + .eqIfPresent(IostorinvDisDO::getSectId, reqVO.getSectId()) + .eq(IostorinvDisDO::getWorkStatus, "10")); + cancelGeneratedAllocations(reqVO.getIostorinvId(), generated); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void autoCancelAllocation(OutboundDetailAllocationReqVO reqVO) { + getOwnedDetail(reqVO.getIostorinvId(), reqVO.getIostorinvdtlId()); + List generated = iostorinvDisMapper.selectList( + new LambdaQueryWrapperX() + .eq(IostorinvDisDO::getIostorinvId, reqVO.getIostorinvId()) + .eq(IostorinvDisDO::getIostorinvdtlId, reqVO.getIostorinvdtlId()) + .eqIfPresent(IostorinvDisDO::getSectId, reqVO.getSectId()) + .eq(IostorinvDisDO::getWorkStatus, "10")); + cancelGeneratedAllocations(reqVO.getIostorinvId(), generated); + } + + @Override + public List getManualAllocationInventory( + Long iostorinvId, Long iostorinvdtlId, String sectId) { + IostorInvDO header = iostorInvMapper.selectById(iostorinvId); + if (header == null) { + throw exception(IOSTOR_INV_NOT_EXISTS); + } + IostorinvDtlDO detail = getOwnedDetail(iostorinvId, iostorinvdtlId); + validateManualAllocationStatus(detail); + return iostorinvDtlMapper.selectManualAllocationInventory( + header.getStorId(), sectId, detail.getMaterialId(), detail.getPcsn(), + detail.getSourceBillCode(), null, false); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void manualAllocate(ManualAllocationSaveReqVO reqVO) { + IostorInvDO header = iostorInvMapper.selectById(reqVO.getIostorinvId()); + if (header == null) { + throw exception(IOSTOR_INV_NOT_EXISTS); + } + IostorinvDtlDO detail = getOwnedDetail(reqVO.getIostorinvId(), reqVO.getIostorinvdtlId()); + validateManualAllocationStatus(detail); + List allCandidates = + iostorinvDtlMapper.selectManualAllocationInventory( + header.getStorId(), reqVO.getSectId(), detail.getMaterialId(), + detail.getPcsn(), detail.getSourceBillCode(), null, true); + Set requestedIds = new HashSet<>(reqVO.getGroupIds()); + Set selectedVehicles = allCandidates.stream() + .filter(row -> requestedIds.contains(row.getGroupId())) + .map(AllocationInventoryRespVO::getVehicleCode) + .collect(java.util.stream.Collectors.toSet()); + if (selectedVehicles.isEmpty()) { + throw exception(IOSTOR_INV_INVENTORY_INVALID); + } + List selectedRows = allCandidates.stream() + .filter(row -> selectedVehicles.contains(row.getVehicleCode())) + .toList(); + BigDecimal assigned = Objects.requireNonNullElse(detail.getAssignQty(), BigDecimal.ZERO); + for (AllocationInventoryRespVO candidate : selectedRows) { + createManualAllocation(header, detail, candidate); + assigned = assigned.add(candidate.getAvailableQty()); + } + updateDetailAllocation(detail, assigned); + refreshHeaderAllocationStatus(reqVO.getIostorinvId()); + } + + private void validateManualAllocationStatus(IostorinvDtlDO detail) { + if (!Set.of("10", "20").contains(detail.getBillStatus())) { + throw exception(IOSTOR_INV_MANUAL_STATUS_INVALID); + } + } + + private void createManualAllocation(IostorInvDO header, IostorinvDtlDO detail, + AllocationInventoryRespVO candidate) { + IostorinvDisDO allocation = new IostorinvDisDO(); + allocation.setIostorinvdisId(IdUtil.getSnowflakeNextIdStr()); + allocation.setIostorinvId(String.valueOf(header.getIostorinvId())); + allocation.setIostorinvdtlId(String.valueOf(detail.getIostorinvdtlId())); + allocation.setSeqNo(String.valueOf(detail.getSeqNo())); + allocation.setSectId(candidate.getSectId()); + allocation.setSectCode(candidate.getSectCode()); + allocation.setSectName(candidate.getSectName()); + allocation.setStructId(candidate.getStructId()); + allocation.setStructCode(candidate.getStructCode()); + allocation.setStructName(candidate.getStructName()); + allocation.setMaterialId(candidate.getMaterialId()); + allocation.setMaterialCode(candidate.getMaterialCode()); + allocation.setPcsn(Objects.requireNonNullElse(candidate.getPcsn(), "")); + allocation.setWorkStatus("10"); + allocation.setStoragevehicleCode(candidate.getVehicleCode()); + allocation.setIsIssued("0"); + allocation.setQtyUnitId(Objects.requireNonNullElse(candidate.getQtyUnitId(), "")); + allocation.setQtyUnitName(Objects.requireNonNullElse(candidate.getQtyUnitName(), "")); + allocation.setPlanQty(candidate.getAvailableQty()); + allocation.setRealQty(BigDecimal.ZERO); + allocation.setHandType(true); + iostorinvDisMapper.insert(allocation); + + int locked = strucAttrMapper.lockForOutbound( + candidate.getStructId(), header.getBillType(), + String.valueOf(header.getIostorinvId()), header.getBillCode()); + if (locked == 0) { + throw exception(IOSTOR_INV_INVENTORY_INVALID); + } + GroupPlateDO currentGroup = groupPlateMapper.selectById(candidate.getGroupId()); + GroupPlateDO groupUpdate = new GroupPlateDO(); + groupUpdate.setGroupId(candidate.getGroupId()); + groupUpdate.setFrozenQty(Objects.requireNonNullElse(currentGroup.getFrozenQty(), BigDecimal.ZERO) + .add(candidate.getAvailableQty())); + groupPlateMapper.updateById(groupUpdate); + } + + private BigDecimal allocateDetail(IostorInvDO header, IostorinvDtlDO detail, String sectId) { + BigDecimal assigned = Objects.requireNonNullElse(detail.getAssignQty(), BigDecimal.ZERO); + BigDecimal remaining = detail.getPlanQty().subtract(assigned).max(BigDecimal.ZERO); + BigDecimal allocatedNow = BigDecimal.ZERO; + if (remaining.signum() == 0) { + updateDetailAllocation(detail, assigned); + return allocatedNow; + } + List candidates = + iostorinvDtlMapper.selectAllocationInventoryForUpdate( + header.getStorId(), sectId, detail.getMaterialId(), detail.getPcsn(), + detail.getSourceBillCode()); + for (AllocationInventoryRespVO candidate : candidates) { + if (remaining.signum() == 0) { + break; + } + BigDecimal allocationQty = remaining.min(candidate.getAvailableQty()); + IostorinvDisDO allocation = new IostorinvDisDO(); + allocation.setIostorinvdisId(IdUtil.getSnowflakeNextIdStr()); + allocation.setIostorinvId(String.valueOf(header.getIostorinvId())); + allocation.setIostorinvdtlId(String.valueOf(detail.getIostorinvdtlId())); + allocation.setSeqNo(String.valueOf(detail.getSeqNo())); + allocation.setSectId(candidate.getSectId()); + allocation.setSectCode(candidate.getSectCode()); + allocation.setSectName(candidate.getSectName()); + allocation.setStructId(candidate.getStructId()); + allocation.setStructCode(candidate.getStructCode()); + allocation.setStructName(candidate.getStructName()); + allocation.setMaterialId(detail.getMaterialId()); + allocation.setMaterialCode(detail.getMaterialCode()); + allocation.setPcsn(Objects.requireNonNullElse(detail.getPcsn(), "")); + allocation.setWorkStatus("10"); + allocation.setStoragevehicleCode(candidate.getVehicleCode()); + allocation.setIsIssued("0"); + allocation.setQtyUnitId(Objects.requireNonNullElse( + candidate.getQtyUnitId(), Objects.requireNonNullElse(detail.getQtyUnitId(), ""))); + allocation.setQtyUnitName(Objects.requireNonNullElse(candidate.getQtyUnitName(), "")); + allocation.setPlanQty(allocationQty); + allocation.setRealQty(BigDecimal.ZERO); + allocation.setHandType(false); + iostorinvDisMapper.insert(allocation); + + int locked = strucAttrMapper.lockForOutbound( + candidate.getStructId(), header.getBillType(), + String.valueOf(header.getIostorinvId()), header.getBillCode()); + if (locked == 0) { + throw exception(IOSTOR_INV_INVENTORY_INVALID); + } + + GroupPlateDO currentGroup = groupPlateMapper.selectById(candidate.getGroupId()); + GroupPlateDO groupUpdate = new GroupPlateDO(); + groupUpdate.setGroupId(candidate.getGroupId()); + groupUpdate.setFrozenQty(Objects.requireNonNullElse(currentGroup.getFrozenQty(), BigDecimal.ZERO) + .add(allocationQty)); + groupPlateMapper.updateById(groupUpdate); + + assigned = assigned.add(allocationQty); + allocatedNow = allocatedNow.add(allocationQty); + remaining = remaining.subtract(allocationQty); + } + updateDetailAllocation(detail, assigned); + return allocatedNow; + } + + private void cancelGeneratedAllocations(Long iostorinvId, List generated) { + Set detailIds = new HashSet<>(); + for (IostorinvDisDO allocation : generated) { + detailIds.add(Long.valueOf(allocation.getIostorinvdtlId())); + List groups = groupPlateMapper.selectList( + new LambdaQueryWrapperX() + .eq(GroupPlateDO::getVehicleCode, allocation.getStoragevehicleCode()) + .eq(GroupPlateDO::getMaterialId, allocation.getMaterialId())); + groups.stream().filter(group -> Objects.equals( + StrUtil.nullToEmpty(group.getPcsn()), + StrUtil.nullToEmpty(allocation.getPcsn()))) + .findFirst().ifPresent(group -> { + GroupPlateDO update = new GroupPlateDO(); + update.setGroupId(group.getGroupId()); + update.setFrozenQty(Objects.requireNonNullElse(group.getFrozenQty(), BigDecimal.ZERO) + .subtract(allocation.getPlanQty()).max(BigDecimal.ZERO)); + groupPlateMapper.updateById(update); + }); + iostorinvDisMapper.deleteById(allocation.getIostorinvdisId()); + boolean vehicleStillAllocated = iostorinvDisMapper.selectCount( + new LambdaQueryWrapperX() + .eq(IostorinvDisDO::getStoragevehicleCode, + allocation.getStoragevehicleCode())) > 0; + if (!vehicleStillAllocated) { + strucAttrMapper.unlockOutbound( + allocation.getStoragevehicleCode(), String.valueOf(iostorinvId)); + } + } + for (Long detailId : detailIds) { + IostorinvDtlDO detail = iostorinvDtlMapper.selectById(detailId); + BigDecimal assigned = iostorinvDisMapper.selectList( + new LambdaQueryWrapperX() + .eq(IostorinvDisDO::getIostorinvdtlId, detailId)) + .stream().map(IostorinvDisDO::getPlanQty) + .reduce(BigDecimal.ZERO, BigDecimal::add); + updateDetailAllocation(detail, assigned); + } + refreshHeaderAllocationStatus(iostorinvId); + } + + private IostorinvDtlDO getOwnedDetail(Long iostorinvId, Long iostorinvdtlId) { + IostorinvDtlDO detail = iostorinvDtlMapper.selectOne( + new LambdaQueryWrapperX() + .eq(IostorinvDtlDO::getIostorinvdtlId, iostorinvdtlId) + .eq(IostorinvDtlDO::getIostorinvId, iostorinvId)); + if (detail == null) { + throw exception(IOSTORINV_DTL_NOT_EXISTS); + } + return detail; + } + + private void updateDetailAllocation(IostorinvDtlDO detail, BigDecimal assigned) { + BigDecimal unassigned = detail.getPlanQty().subtract(assigned).max(BigDecimal.ZERO); + IostorinvDtlDO update = new IostorinvDtlDO(); + update.setIostorinvdtlId(detail.getIostorinvdtlId()); + update.setAssignQty(assigned); + update.setUnassignQty(unassigned); + update.setBillStatus(unassigned.signum() == 0 ? "30" : assigned.signum() > 0 ? "20" : "10"); + iostorinvDtlMapper.updateById(update); + } + + private void refreshHeaderAllocationStatus(Long iostorinvId) { + List details = iostorinvDtlMapper.selectList( + new LambdaQueryWrapperX().eq(IostorinvDtlDO::getIostorinvId, iostorinvId)); + boolean allAllocated = !details.isEmpty() && details.stream() + .allMatch(detail -> Objects.requireNonNullElse(detail.getUnassignQty(), detail.getPlanQty()) + .signum() == 0); + boolean anyAllocated = details.stream() + .anyMatch(detail -> Objects.requireNonNullElse(detail.getAssignQty(), BigDecimal.ZERO).signum() > 0); + IostorInvDO update = new IostorInvDO(); + update.setIostorinvId(iostorinvId); + update.setBillStatus(allAllocated ? "30" : anyAllocated ? "20" : "10"); + iostorInvMapper.updateById(update); + } + @Override public PageResult getIostorInvPage(IostorInvPageReqVO pageReqVO) { PageResult pageResult = iostorInvMapper.selectPage(pageReqVO); diff --git a/nl-module-wms/nl-module-wms-server/src/main/resources/mapper/iostorinvdis/IostorinvDisMapper.xml b/nl-module-wms/nl-module-wms-server/src/main/resources/mapper/iostorinvdis/IostorinvDisMapper.xml index 9d8c0e56..561a6269 100644 --- a/nl-module-wms/nl-module-wms-server/src/main/resources/mapper/iostorinvdis/IostorinvDisMapper.xml +++ b/nl-module-wms/nl-module-wms-server/src/main/resources/mapper/iostorinvdis/IostorinvDisMapper.xml @@ -2,11 +2,33 @@ - + - \ No newline at end of file + diff --git a/nl-module-wms/nl-module-wms-server/src/main/resources/mapper/iostorinvdtl/IostorinvDtlMapper.xml b/nl-module-wms/nl-module-wms-server/src/main/resources/mapper/iostorinvdtl/IostorinvDtlMapper.xml index 134ab6c2..15e47e0d 100644 --- a/nl-module-wms/nl-module-wms-server/src/main/resources/mapper/iostorinvdtl/IostorinvDtlMapper.xml +++ b/nl-module-wms/nl-module-wms-server/src/main/resources/mapper/iostorinvdtl/IostorinvDtlMapper.xml @@ -32,7 +32,7 @@ ) sa ON sa.storagevehicle_code = gp.vehicle_code LEFT JOIN base_materialbase mb ON mb.material_id = gp.material_id AND mb.deleted = 0 WHERE sa.stor_id = #{reqVO.storId} - AND gp.status = '可用' + AND gp.status = '02' AND gp.qty - COALESCE(gp.frozen_qty, 0) > 0 AND gp.deleted = 0 @@ -59,7 +59,7 @@ ) sa ON sa.storagevehicle_code = gp.vehicle_code LEFT JOIN base_materialbase mb ON mb.material_id = gp.material_id AND mb.deleted = 0 WHERE sa.stor_id = #{storId} - AND gp.status = '可用' + AND gp.status = '02' AND gp.qty - COALESCE(gp.frozen_qty, 0) > 0 AND gp.deleted = 0 AND gp.vehicle_code IN @@ -81,7 +81,7 @@ ) sa ON sa.storagevehicle_code = gp.vehicle_code LEFT JOIN base_materialbase mb ON mb.material_id = gp.material_id AND mb.deleted = 0 WHERE sa.stor_id = #{storId} - AND gp.status = '可用' + AND gp.status = '02' AND gp.qty - COALESCE(gp.frozen_qty, 0) > 0 AND gp.deleted = 0 AND gp.vehicle_code IN @@ -94,7 +94,12 @@ + + + + diff --git a/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/api/wms/iostorinv/index.ts b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/api/wms/iostorinv/index.ts index 037b35a0..90d1c2b5 100644 --- a/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/api/wms/iostorinv/index.ts +++ b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/api/wms/iostorinv/index.ts @@ -57,6 +57,11 @@ export namespace WmsIostorInvApi { /** 出库明细页面展示模型(提交时应转换为 OutboundDetail) */ export interface OutboundDisplayDetail extends OutboundDetail { + iostorinvdtlId?: string; + seqNo?: number; + billStatus?: string; + assignQty?: number; + unassignQty?: number; materialName?: string; rowKey?: string; sapBatchNo?: string; @@ -109,6 +114,39 @@ export namespace WmsIostorInvApi { storId: string; // 仓库标识 vehicleCodes: string[]; // 箱号列表 } + + export interface OutboundAllocation { + iostorinvdisId: string; + iostorinvdtlId: string; + workStatus: string; + materialCode: string; + materialName?: string; + pcsn?: string; + storagevehicleCode?: string; + planQty: number; + qtyUnitName?: string; + sectId?: string; + sectName?: string; + structCode?: string; + structName?: string; + } + + export interface ManualAllocationInventory { + groupId: string; + vehicleCode: string; + materialId: string; + materialCode: string; + materialName?: string; + pcsn?: string; + availableQty: number; + qtyUnitId?: string; + qtyUnitName?: string; + sectId?: string; + sectName?: string; + structId?: string; + structCode?: string; + structName?: string; + } } /** 查询出入库单主表分页 */ @@ -133,6 +171,75 @@ export function getIostorInvDetails(iostorinvId: string) { ); } +export function getOutboundAllocations( + iostorinvId: string, + iostorinvdtlId?: string, + sectId?: string, +) { + return requestClient.get( + '/wms/iostor-inv/allocations', + { params: { iostorinvId, iostorinvdtlId, sectId } }, + ); +} + +export function allocateAll(iostorinvId: string, sectId?: string) { + return requestClient.post('/wms/iostor-inv/allocate-all', { + iostorinvId, + sectId, + }); +} + +export function cancelAllAllocations(iostorinvId: string, sectId?: string) { + return requestClient.post('/wms/iostor-inv/cancel-all-allocations', { + iostorinvId, + sectId, + }); +} + +export function autoAllocate( + iostorinvId: string, + iostorinvdtlId: string, + sectId?: string, +) { + return requestClient.post('/wms/iostor-inv/auto-allocate', { + iostorinvId, + iostorinvdtlId, + sectId, + }); +} + +export function autoCancelAllocation( + iostorinvId: string, + iostorinvdtlId: string, + sectId?: string, +) { + return requestClient.post('/wms/iostor-inv/auto-cancel-allocation', { + iostorinvId, + iostorinvdtlId, + sectId, + }); +} + +export function getManualAllocationInventory( + iostorinvId: string, + iostorinvdtlId: string, + sectId?: string, +) { + return requestClient.get( + '/wms/iostor-inv/manual-allocation-inventory', + { params: { iostorinvId, iostorinvdtlId, sectId } }, + ); +} + +export function manualAllocate(data: { + groupIds: string[]; + iostorinvdtlId: string; + iostorinvId: string; + sectId?: string; +}) { + return requestClient.post('/wms/iostor-inv/manual-allocate', data); +} + /** 新增出入库单主表 */ export function createIostorInv(data: WmsIostorInvApi.IostorInv) { return requestClient.post('/wms/iostor-inv/create', data); @@ -149,12 +256,12 @@ export function updateOutbound(data: WmsIostorInvApi.OutboundUpdateReq) { } /** 删除出入库单主表 */ -export function deleteIostorInv(id: number) { +export function deleteIostorInv(id: string) { return requestClient.delete(`/wms/iostor-inv/delete?id=${id}`); } /** 批量删除出入库单主表 */ -export function deleteIostorInvList(ids: number[]) { +export function deleteIostorInvList(ids: string[]) { return requestClient.delete( `/wms/iostor-inv/delete-list?ids=${ids.join(',')}`, ); diff --git a/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/wms/iostorinv/data.ts b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/wms/iostorinv/data.ts index 4f38a754..aeab5976 100644 --- a/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/wms/iostorinv/data.ts +++ b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/wms/iostorinv/data.ts @@ -335,6 +335,7 @@ export function useGridColumns(): VxeTableGridOptions field: 'billCode', title: '单据编号', minWidth: 120, + slots: { default: 'billCode' }, }, { field: 'billType', @@ -356,21 +357,6 @@ export function useGridColumns(): VxeTableGridOptions title: '仓库', minWidth: 120, }, - { - field: 'sourceId', - title: '来源方标识', - minWidth: 120, - }, - { - field: 'sourceName', - title: '来源方名称', - minWidth: 120, - }, - { - field: 'sourceType', - title: '来源方类型', - minWidth: 120, - }, { field: 'totalWeight', title: '总重量', @@ -391,8 +377,18 @@ export function useGridColumns(): VxeTableGridOptions }, }, { - field: 'remark', - title: '备注', + field: 'sourceId', + title: '来源方标识', + minWidth: 120, + }, + { + field: 'sourceName', + title: '来源方名称', + minWidth: 120, + }, + { + field: 'sourceType', + title: '来源方类型', minWidth: 120, }, { @@ -437,16 +433,6 @@ export function useGridColumns(): VxeTableGridOptions minWidth: 120, formatter: 'formatDateTime', }, - { - field: 'sysdeptid', - title: '部门ID', - minWidth: 120, - }, - { - field: 'syscompanyid', - title: '公司ID', - minWidth: 120, - }, { field: 'isUpload', title: '是否已上传', @@ -462,6 +448,11 @@ export function useGridColumns(): VxeTableGridOptions title: '回传时间', minWidth: 120, }, + { + field: 'remark', + title: '备注', + minWidth: 120, + }, { title: '操作', width: 200, diff --git a/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/wms/iostorinv/index.vue b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/wms/iostorinv/index.vue index 95e5d243..da7b5084 100644 --- a/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/wms/iostorinv/index.vue +++ b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/wms/iostorinv/index.vue @@ -7,7 +7,7 @@ import { ref } from 'vue'; import { confirm, Page, useVbenModal } from '@vben/common-ui'; import { downloadFileFromBlobPart, isEmpty } from '@vben/utils'; -import { message } from 'antdv-next'; +import { Button, message } from 'antdv-next'; import { ACTION_ICON, TableAction, useVbenVxeGrid } from '#/adapter/vxe-table'; import { @@ -19,12 +19,22 @@ import { import { $t } from '#/locales'; import { useGridColumns, useGridFormSchema } from './data'; +import Allocation from './modules/allocation.vue'; +import Detail from './modules/detail.vue'; import Form from './modules/form.vue'; const [FormModal, formModalApi] = useVbenModal({ connectedComponent: Form, destroyOnClose: true, }); +const [AllocationModal, allocationModalApi] = useVbenModal({ + connectedComponent: Allocation, + destroyOnClose: true, +}); +const [DetailModal, detailModalApi] = useVbenModal({ + connectedComponent: Detail, + destroyOnClose: true, +}); /** 刷新表格 */ function handleRefresh() { @@ -41,6 +51,14 @@ function handleEdit(row: WmsIostorInvApi.IostorInv) { formModalApi.setData(row).open(); } +function handleOutbound(row: WmsIostorInvApi.IostorInv) { + allocationModalApi.setData(row).open(); +} + +function handleView(row: WmsIostorInvApi.IostorInv) { + detailModalApi.setData(row).open(); +} + /** 删除出入库单主表 */ async function handleDelete(row: WmsIostorInvApi.IostorInv) { const hideLoading = message.loading({ @@ -73,7 +91,7 @@ async function handleDeleteBatch() { } } -const checkedIds = ref([]); +const checkedIds = ref([]); function handleRowCheckboxChange({ records, }: { @@ -125,9 +143,16 @@ const [Grid, gridApi] = useVbenVxeGrid({