From 16e85fd278b829dccf1b2ecf6ed9cdfc9aad167a Mon Sep 17 00:00:00 2001 From: dzq Date: Wed, 17 Dec 2025 16:22:14 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E6=A0=BC=E5=8F=A3=E7=AE=A1=E7=90=86):=20?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=AD=98=E5=85=A5=E7=89=A9=E5=93=81=E5=88=86?= =?UTF-8?q?=E9=85=8D=E6=A0=BC=E5=8F=A3=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增StoreItemToCellCommand用于接收存入物品请求参数 在CabinetCellDTO中添加格口密码字段 实现根据店铺和格口类型分配空闲格口逻辑,并生成随机密码 --- .../api/controller/CabinetCellController.java | 9 ++++ .../cell/CabinetCellApplicationService.java | 51 +++++++++++++++++++ .../cell/command/StoreItemToCellCommand.java | 21 ++++++++ .../cabinet/cell/dto/CabinetCellDTO.java | 3 ++ 4 files changed, 84 insertions(+) create mode 100644 agileboot-domain/src/main/java/com/agileboot/domain/cabinet/cell/command/StoreItemToCellCommand.java diff --git a/agileboot-api/src/main/java/com/agileboot/api/controller/CabinetCellController.java b/agileboot-api/src/main/java/com/agileboot/api/controller/CabinetCellController.java index 9d99e39..a484650 100644 --- a/agileboot-api/src/main/java/com/agileboot/api/controller/CabinetCellController.java +++ b/agileboot-api/src/main/java/com/agileboot/api/controller/CabinetCellController.java @@ -8,6 +8,8 @@ import com.agileboot.common.exception.ApiException; import com.agileboot.common.exception.error.ErrorCode; import com.agileboot.domain.cabinet.cell.CabinetCellApplicationService; import com.agileboot.domain.cabinet.cell.command.OpenCellByPasswordCommand; +import com.agileboot.domain.cabinet.cell.command.StoreItemToCellCommand; +import com.agileboot.domain.cabinet.cell.dto.CabinetCellDTO; import com.agileboot.domain.cabinet.cell.db.CabinetCellEntity; import com.agileboot.domain.cabinet.cell.model.CabinetCellModel; import com.agileboot.domain.cabinet.cell.model.CabinetCellModelFactory; @@ -178,4 +180,11 @@ public class CabinetCellController { throw new ApiException(ErrorCode.Internal.INTERNAL_ERROR, e.getMessage()); } } + + @Operation(summary = "存入物品分配格口") + @PostMapping("/storeItem") + public ResponseDTO storeItem(@RequestBody StoreItemToCellCommand command) { + CabinetCellDTO result = cabinetCellApplicationService.storeItemToCell(command); + return ResponseDTO.ok(result); + } } diff --git a/agileboot-domain/src/main/java/com/agileboot/domain/cabinet/cell/CabinetCellApplicationService.java b/agileboot-domain/src/main/java/com/agileboot/domain/cabinet/cell/CabinetCellApplicationService.java index 13d411d..f6052ee 100644 --- a/agileboot-domain/src/main/java/com/agileboot/domain/cabinet/cell/CabinetCellApplicationService.java +++ b/agileboot-domain/src/main/java/com/agileboot/domain/cabinet/cell/CabinetCellApplicationService.java @@ -9,6 +9,7 @@ import com.agileboot.domain.common.command.BulkOperationCommand; import com.agileboot.domain.cabinet.cell.command.AddCabinetCellCommand; import com.agileboot.domain.cabinet.cell.command.OpenCellByPasswordCommand; import com.agileboot.domain.cabinet.cell.command.UpdateCabinetCellCommand; +import com.agileboot.domain.cabinet.cell.command.StoreItemToCellCommand; import com.agileboot.domain.cabinet.cell.db.CabinetCellEntity; import com.agileboot.domain.cabinet.cell.db.CabinetCellService; import com.agileboot.domain.cabinet.cell.dto.CabinetCellDTO; @@ -26,7 +27,9 @@ import com.agileboot.domain.cabinet.mainboard.model.CabinetMainboardModel; import com.agileboot.domain.cabinet.mainboard.model.CabinetMainboardModelFactory; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import java.util.List; +import java.util.Random; import java.util.stream.Collectors; +import org.springframework.transaction.annotation.Transactional; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; @@ -198,4 +201,52 @@ public class CabinetCellApplicationService { cellModel.setUsageStatus(1); // 空闲 cellModel.updateById(); } + + @Transactional + public CabinetCellDTO storeItemToCell(StoreItemToCellCommand command) { + // 根据shopId获取该店铺下的所有柜子ID列表 + List cabinetIds = smartCabinetService.lambdaQuery() + .eq(SmartCabinetEntity::getShopId, command.getShopId()) + .select(SmartCabinetEntity::getCabinetId) + .list() + .stream() + .map(SmartCabinetEntity::getCabinetId) + .collect(Collectors.toList()); + + if (cabinetIds.isEmpty()) { + throw new RuntimeException("该店铺下无柜子"); + } + + // 查找符合条件的格口:符合类型、无密码、空闲、正常、未删除 + CabinetCellEntity cell = cabinetCellService.lambdaQuery() + .in(CabinetCellEntity::getCabinetId, cabinetIds) + .eq(CabinetCellEntity::getCellType, command.getCellType()) + .isNull(CabinetCellEntity::getPassword) + .eq(CabinetCellEntity::getUsageStatus, 1) // 空闲 + .eq(CabinetCellEntity::getAvailableStatus, 1) // 正常 + .eq(CabinetCellEntity::getDeleted, false) + .one(); + + if (cell == null) { + throw new RuntimeException("找不到符合条件的可用格口"); + } + + // 生成4位随机数字密码 + String password = generateFourDigitPassword(); + + // 加载格口模型并更新密码和状态 + CabinetCellModel cellModel = cabinetCellModelFactory.loadById(cell.getCellId()); + cellModel.setPassword(password); + cellModel.setUsageStatus(2); // 设置为已占用 + cellModel.updateById(); + + // 返回格口信息(包含密码) + return new CabinetCellDTO(cellModel); + } + + private String generateFourDigitPassword() { + Random random = new Random(); + int password = random.nextInt(10000); // 生成0-9999之间的数字 + return String.format("%04d", password); // 格式化为4位数字,前面补零 + } } \ No newline at end of file diff --git a/agileboot-domain/src/main/java/com/agileboot/domain/cabinet/cell/command/StoreItemToCellCommand.java b/agileboot-domain/src/main/java/com/agileboot/domain/cabinet/cell/command/StoreItemToCellCommand.java new file mode 100644 index 0000000..d70ae34 --- /dev/null +++ b/agileboot-domain/src/main/java/com/agileboot/domain/cabinet/cell/command/StoreItemToCellCommand.java @@ -0,0 +1,21 @@ +package com.agileboot.domain.cabinet.cell.command; + +import io.swagger.annotations.ApiModelProperty; +import javax.validation.constraints.Max; +import javax.validation.constraints.Min; +import javax.validation.constraints.NotNull; +import lombok.Data; + +@Data +public class StoreItemToCellCommand { + + @ApiModelProperty(value = "店铺ID", required = true) + @NotNull(message = "店铺ID不能为空") + private Long shopId; + + @ApiModelProperty(value = "格口类型(1小格 2中格 3大格 4超大格)", required = true) + @NotNull(message = "格口类型不能为空") + @Min(value = 1, message = "格口类型必须为1-4之间的整数") + @Max(value = 4, message = "格口类型必须为1-4之间的整数") + private Integer cellType; +} \ No newline at end of file diff --git a/agileboot-domain/src/main/java/com/agileboot/domain/cabinet/cell/dto/CabinetCellDTO.java b/agileboot-domain/src/main/java/com/agileboot/domain/cabinet/cell/dto/CabinetCellDTO.java index d42b34f..640823b 100644 --- a/agileboot-domain/src/main/java/com/agileboot/domain/cabinet/cell/dto/CabinetCellDTO.java +++ b/agileboot-domain/src/main/java/com/agileboot/domain/cabinet/cell/dto/CabinetCellDTO.java @@ -61,6 +61,9 @@ public class CabinetCellDTO { @ExcelColumn(name = "格口类型") private Integer cellType; + @ExcelColumn(name = "格口密码") + private String password; + @ExcelColumn(name = "使用状态") private Integer usageStatus;