完成仓库调拨单功能。

This commit is contained in:
c
2026-03-06 18:16:59 +08:00
parent d838d17902
commit 8d2afd8d47
9 changed files with 98 additions and 17 deletions

View File

@@ -1,6 +1,8 @@
package com.niuan.erp.common.base; package com.niuan.erp.common.base;
import jakarta.validation.constraints.NotNull;
public record BaseApproveAndRejectDto( public record BaseApproveAndRejectDto(
@NotNull(message = "validation.common.id.notNull")
Long id Long id
) {} ) {}

View File

@@ -3,19 +3,19 @@ package com.niuan.erp.module.warehouse.controller;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.niuan.erp.common.annotation.ApiLog; import com.niuan.erp.common.annotation.ApiLog;
import com.niuan.erp.common.annotation.ModuleLog; import com.niuan.erp.common.annotation.ModuleLog;
import com.niuan.erp.common.base.BaseApproveAndRejectDto;
import com.niuan.erp.common.base.BaseDeleteBody; import com.niuan.erp.common.base.BaseDeleteBody;
import com.niuan.erp.common.base.BasePageReqParams; import com.niuan.erp.common.base.BasePageReqParams;
import com.niuan.erp.common.base.BaseResult; import com.niuan.erp.common.base.BaseResult;
import com.niuan.erp.common.base.CommonValidateGroup.*; import com.niuan.erp.common.base.CommonValidateGroup.*;
import com.niuan.erp.common.base.OperationType; import com.niuan.erp.common.base.OperationType;
import com.niuan.erp.module.warehouse.controller.dto.StockTransferOrderAddDto;
import com.niuan.erp.module.warehouse.controller.dto.StockTransferOrderDto; import com.niuan.erp.module.warehouse.controller.dto.StockTransferOrderDto;
import com.niuan.erp.module.warehouse.controller.dto.StockTransferOrderItemDto; import com.niuan.erp.module.warehouse.controller.dto.StockTransferOrderItemDto;
import com.niuan.erp.module.warehouse.controller.dto.StockTransferOrderSearchParams; import com.niuan.erp.module.warehouse.controller.dto.StockTransferOrderSearchParams;
import com.niuan.erp.module.warehouse.service.StockTransferOrderService; import com.niuan.erp.module.warehouse.service.StockTransferOrderService;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.constraints.NotNull;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
@@ -40,11 +40,20 @@ public class StockTransferOrderController {
return BaseResult.successWithData(stockTransferOrderService.getStockTransferOrderPage(pageParams, searchParams)); return BaseResult.successWithData(stockTransferOrderService.getStockTransferOrderPage(pageParams, searchParams));
} }
@ApiLog(type = OperationType.ADD, remark = "新增一条StockTransferOrder记录")
@Operation(summary = "新增StockTransferOrder", operationId = "addStockTransferOrder")
@PostMapping("/addStockTransferOrder")
@PreAuthorize("hasAuthority('stock_transfer_order:add')")
public BaseResult<?> addStockTransferOrder(@Validated(Add.class) @RequestBody StockTransferOrderAddDto dto) {
stockTransferOrderService.addStockTransferOrder(dto);
return BaseResult.success();
}
@ApiLog(type = OperationType.UPDATE, remark = "更新一条StockTransferOrder记录") @ApiLog(type = OperationType.UPDATE, remark = "更新一条StockTransferOrder记录")
@Operation(summary = "更新StockTransferOrder", operationId = "updateStockTransferOrder") @Operation(summary = "更新StockTransferOrder", operationId = "updateStockTransferOrder")
@PostMapping("/updateStockTransferOrder") @PostMapping("/updateStockTransferOrder")
@PreAuthorize("hasAuthority('stock_transfer_order:update')") @PreAuthorize("hasAuthority('stock_transfer_order:update')")
public BaseResult<?> updateStockTransferOrder(@Validated(Update.class) @RequestBody StockTransferOrderDto dto) { public BaseResult<?> updateStockTransferOrder(@Validated(Update.class) @RequestBody StockTransferOrderAddDto dto) {
stockTransferOrderService.updateStockTransferOrder(dto); stockTransferOrderService.updateStockTransferOrder(dto);
return BaseResult.success(); return BaseResult.success();
} }
@@ -71,19 +80,17 @@ public class StockTransferOrderController {
@Operation(summary = "审核StockTransferOrder", operationId = "approveStockTransferOrder") @Operation(summary = "审核StockTransferOrder", operationId = "approveStockTransferOrder")
@PostMapping("/approveStockTransferOrder") @PostMapping("/approveStockTransferOrder")
@PreAuthorize("hasAuthority('stock_transfer_order:approve')") @PreAuthorize("hasAuthority('stock_transfer_order:approve')")
public BaseResult<?> approveStockTransferOrder( public BaseResult<?> approveStockTransferOrder(@Validated @RequestBody BaseApproveAndRejectDto dto) {
@Parameter(description = "调拨单ID") @RequestParam Long id) { stockTransferOrderService.approve(dto.id());
stockTransferOrderService.approve(id);
return BaseResult.success(); return BaseResult.success();
} }
@ApiLog(type = OperationType.UPDATE, remark = "反审核StockTransferOrder") @ApiLog(type = OperationType.UPDATE, remark = "反审核StockTransferOrder")
@Operation(summary = "反审核StockTransferOrder", operationId = "unapproveStockTransferOrder") @Operation(summary = "反审核StockTransferOrder", operationId = "rejectStockTransferOrder")
@PostMapping("/rejectStockTransferOrder") @PostMapping("/rejectStockTransferOrder")
@PreAuthorize("hasAuthority('stock_transfer_order:reject')") @PreAuthorize("hasAuthority('stock_transfer_order:reject')")
public BaseResult<?> rejectStockTransferOrder( public BaseResult<?> rejectStockTransferOrder(@Validated @RequestBody BaseApproveAndRejectDto dto) {
@Parameter(description = "调拨单ID") @RequestParam Long id) { stockTransferOrderService.reject(dto.id());
stockTransferOrderService.reject(id);
return BaseResult.success(); return BaseResult.success();
} }
@@ -91,10 +98,7 @@ public class StockTransferOrderController {
@GetMapping("/getStockTransferOrderItem") @GetMapping("/getStockTransferOrderItem")
@PreAuthorize("hasAuthority('stock_transfer_order:index')") @PreAuthorize("hasAuthority('stock_transfer_order:index')")
public BaseResult<List<StockTransferOrderItemDto>> getStockTransferOrderItem( public BaseResult<List<StockTransferOrderItemDto>> getStockTransferOrderItem(
@Parameter(description = "调拨单ID") @RequestParam("orderId") Long orderId) {
@RequestParam
@NotNull(message = "warehouse.stock_transfer_order.validate.order_id.not_null")
Long orderId) {
return BaseResult.successWithData(stockTransferOrderService.getItem(orderId)); return BaseResult.successWithData(stockTransferOrderService.getItem(orderId));
} }
} }

View File

@@ -6,6 +6,7 @@ import java.util.List;
/** /**
* 添加调拨单的 Dto * 添加调拨单的 Dto
* @param id 调拨单ID编辑时需要
* @param formCode * @param formCode
* @param formName * @param formName
* @param formMark * @param formMark
@@ -16,6 +17,7 @@ import java.util.List;
* @param transferOrderItems * @param transferOrderItems
*/ */
public record StockTransferOrderAddDto( public record StockTransferOrderAddDto(
Long id,
@NotNull(message = "warehouse.stock_transfer_order.validate.form_code.not_null") @NotNull(message = "warehouse.stock_transfer_order.validate.form_code.not_null")
String formCode, String formCode,
@NotNull(message = "warehouse.stock_transfer_order.validate.form_name.not_null") @NotNull(message = "warehouse.stock_transfer_order.validate.form_name.not_null")

View File

@@ -5,6 +5,19 @@ import com.fasterxml.jackson.annotation.JsonInclude;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.List; import java.util.List;
/**
* 前端展示 Dto
* @param id
* @param storeNo
* @param storeName
* @param outStoreNo
* @param outStoreName
* @param formCode
* @param formName
* @param formMark
* @param formStatus
* @param orderItems
*/
@JsonInclude(JsonInclude.Include.NON_NULL) @JsonInclude(JsonInclude.Include.NON_NULL)
public record StockTransferOrderDto( public record StockTransferOrderDto(
Long id, Long id,

View File

@@ -18,7 +18,7 @@ public interface StockTransferOrderService {
void addStockTransferOrder(StockTransferOrderAddDto dto); void addStockTransferOrder(StockTransferOrderAddDto dto);
void updateStockTransferOrder(StockTransferOrderDto dto); void updateStockTransferOrder(StockTransferOrderAddDto dto);
void deleteStockTransferOrder(long id); void deleteStockTransferOrder(long id);

View File

@@ -18,6 +18,8 @@ import com.niuan.erp.module.warehouse.controller.dto.*;
import com.niuan.erp.module.warehouse.converter.StockTransferOrderConverter; import com.niuan.erp.module.warehouse.converter.StockTransferOrderConverter;
import com.niuan.erp.module.warehouse.entity.Stock; import com.niuan.erp.module.warehouse.entity.Stock;
import com.niuan.erp.module.warehouse.entity.WarehouseItem; import com.niuan.erp.module.warehouse.entity.WarehouseItem;
import com.niuan.erp.module.warehouse.entity.Warehouse;
import com.niuan.erp.module.warehouse.mapper.WarehouseMapper;
import com.niuan.erp.module.warehouse.mapper.StockMapper; import com.niuan.erp.module.warehouse.mapper.StockMapper;
import com.niuan.erp.module.warehouse.mapper.WarehouseItemMapper; import com.niuan.erp.module.warehouse.mapper.WarehouseItemMapper;
import com.niuan.erp.module.warehouse.service.StockTransferOrderService; import com.niuan.erp.module.warehouse.service.StockTransferOrderService;
@@ -48,6 +50,8 @@ public class StockTransferOrderServiceImpl extends ServiceImpl<DocumentMapper, D
private final StockMapper stockMapper; private final StockMapper stockMapper;
private final WarehouseMapper warehouseMapper;
@Override @Override
public IPage<StockTransferOrderDto> getStockTransferOrderPage(BasePageReqParams pageParams, public IPage<StockTransferOrderDto> getStockTransferOrderPage(BasePageReqParams pageParams,
StockTransferOrderSearchParams searchParams) { StockTransferOrderSearchParams searchParams) {
@@ -93,6 +97,17 @@ public class StockTransferOrderServiceImpl extends ServiceImpl<DocumentMapper, D
validateTransferOrder(dto); validateTransferOrder(dto);
Document entity = stockTransferOrderConverter.toEntity(dto); Document entity = stockTransferOrderConverter.toEntity(dto);
var store = warehouseMapper.selectById(dto.storeNo());
if (store != null) {
entity.setStoreName(store.getStoreName());
}
var outStore = warehouseMapper.selectById(dto.outStoreNo());
if (outStore != null) {
entity.setOutStoreName(outStore.getStoreName());
}
entity.setCreateUserId(SecurityUtils.getUserId()); entity.setCreateUserId(SecurityUtils.getUserId());
entity.setCreateUserName(SecurityUtils.getUserName()); entity.setCreateUserName(SecurityUtils.getUserName());
entity.setCreateDate(LocalDateTime.now()); entity.setCreateDate(LocalDateTime.now());
@@ -125,7 +140,11 @@ public class StockTransferOrderServiceImpl extends ServiceImpl<DocumentMapper, D
} }
@Override @Override
public void updateStockTransferOrder(StockTransferOrderDto dto) { public void updateStockTransferOrder(StockTransferOrderAddDto dto) {
if (dto.id() == null) {
throw new BusinessException("warehouse.stock_transfer_order.exception.id_required");
}
Document existingEntity = this.baseMapper.selectById(dto.id()); Document existingEntity = this.baseMapper.selectById(dto.id());
if (existingEntity == null) { if (existingEntity == null) {
throw new BusinessException("warehouse.stock_transfer_order.exception.not_found"); throw new BusinessException("warehouse.stock_transfer_order.exception.not_found");
@@ -135,10 +154,49 @@ public class StockTransferOrderServiceImpl extends ServiceImpl<DocumentMapper, D
} }
Document entity = stockTransferOrderConverter.toEntity(dto); Document entity = stockTransferOrderConverter.toEntity(dto);
entity.setId(dto.id());
var store = warehouseMapper.selectById(dto.storeNo());
if (store != null) {
entity.setStoreName(store.getStoreName());
}
var outStore = warehouseMapper.selectById(dto.outStoreNo());
if (outStore != null) {
entity.setOutStoreName(outStore.getStoreName());
}
entity.setUpdateUserId(SecurityUtils.getUserId()); entity.setUpdateUserId(SecurityUtils.getUserId());
entity.setUpdateUserName(SecurityUtils.getUserName()); entity.setUpdateUserName(SecurityUtils.getUserName());
entity.setUpdateDate(LocalDateTime.now()); entity.setUpdateDate(LocalDateTime.now());
this.baseMapper.updateById(entity); this.baseMapper.updateById(entity);
if (dto.transferOrderItems() != null && !dto.transferOrderItems().isEmpty()) {
LambdaQueryWrapper<DocumentMaterial> materialWrapper = new LambdaQueryWrapper<>();
materialWrapper.eq(DocumentMaterial::getDocumentNo, dto.id());
documentMaterialMapper.delete(materialWrapper);
List<DocumentMaterial> materials = stockTransferOrderConverter.toEntityList(dto.transferOrderItems());
Map<String, Map<String, Object>> warehouseItems =
warehouseItemMapper.getWarehouseItemStockListByPartNumbers(materials.stream()
.map(DocumentMaterial::getPartNumber)
.toList());
materials.forEach(m -> {
m.setDocumentNo(entity.getId().intValue());
m.setCreateUserId(SecurityUtils.getUserId());
m.setCreateUserName(SecurityUtils.getUserName());
m.setCreateDate(LocalDateTime.now());
m.setStatus(0);
Map<String, Object> stockInfo = warehouseItems.get(m.getPartNumber());
if (stockInfo != null) {
m.setDemandCount(((Long) stockInfo.get("productCount")).intValue());
}
});
documentMaterialMapper.insert(materials);
}
} }
@Override @Override

View File

@@ -7,6 +7,7 @@ auth.userDetailsError=用户信息错误
validation.common.status.notNull=状态值不能为空 validation.common.status.notNull=状态值不能为空
validation.common.status.valueError=状态值只能为 0 或 1 validation.common.status.valueError=状态值只能为 0 或 1
validation.common.status.idNull=ID 不能为空 validation.common.status.idNull=ID 不能为空
validation.common.id.notNull=ID 不能为空
validation.common.pageParams.page.notNull=页数不能为空 validation.common.pageParams.page.notNull=页数不能为空
validation.common.pageParams.pageSize.notNull=页数不能为空 validation.common.pageParams.pageSize.notNull=页数不能为空
validation.common.pageParams.page.min=页数不能小于0 validation.common.pageParams.page.min=页数不能小于0

View File

@@ -39,6 +39,7 @@ warehouse.stock_transfer_order.validate.product_count.not_null=调拨数量不
warehouse.stock_transfer_order.validate.product_count.min=调拨数量必须大于 0 warehouse.stock_transfer_order.validate.product_count.min=调拨数量必须大于 0
warehouse.stock_transfer_order.validate.part_id.not_null=物料 ID 不能为空 warehouse.stock_transfer_order.validate.part_id.not_null=物料 ID 不能为空
warehouse.stock_transfer_order.exception.not_found=调拨单不存在 warehouse.stock_transfer_order.exception.not_found=调拨单不存在
warehouse.stock_transfer_order.exception.id_required=调拨单ID不能为空
warehouse.stock_transfer_order.exception.cannot_update_approved=已审核的调拨单不能修改 warehouse.stock_transfer_order.exception.cannot_update_approved=已审核的调拨单不能修改
warehouse.stock_transfer_order.exception.cannot_delete_approved=已审核的调拨单不能删除 warehouse.stock_transfer_order.exception.cannot_delete_approved=已审核的调拨单不能删除
warehouse.stock_transfer_order.exception.cannot_delete_approved_batch=选中的数据中存在已审核的调拨单,不能删除 warehouse.stock_transfer_order.exception.cannot_delete_approved_batch=选中的数据中存在已审核的调拨单,不能删除