手动增加仓库调拨明细过滤查询

This commit is contained in:
c
2026-03-06 14:58:54 +08:00
parent 4c4716c151
commit d838d17902
14 changed files with 158 additions and 143 deletions

View File

@@ -64,6 +64,7 @@ public class SystemAuthFactory {
switch (p.getPermissionType()) {
case TOP_PAGE_BUTTON -> saveInButtonAuthList(menuConfig.getMeta().getButtonAuth(), buttonProp);
case TABLE_OPERATOR_BUTTON -> saveInButtonAuthList(menuConfig.getMeta().getToolButtonAuth(), buttonProp);
case TABLE_STATUS_BUTTON -> saveInButtonAuthList(menuConfig.getMeta().getStatusButtonAuth(), buttonProp);
case DIALOG_BUTTON -> saveInButtonAuthList(menuConfig.getMeta().getDialogButtonAuth(), buttonProp);
}
}

View File

@@ -137,6 +137,11 @@ public class RouterConfigRawMeta {
*/
private List<ButtonProp> toolButtonAuth = new ArrayList<>();
/**
*
*/
private List<ButtonProp> statusButtonAuth = new ArrayList<>();
/**
* Dialog Button 权限
*/

View File

@@ -0,0 +1,13 @@
package com.niuan.erp.module.common.entity;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class DocumentMaterialWithInfo extends DocumentMaterial {
private String productSpecs;
}

View File

@@ -1,7 +1,10 @@
package com.niuan.erp.module.common.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.niuan.erp.module.common.entity.Document;
import com.niuan.erp.module.common.enums.DocumentType;
/**
* <p>
@@ -13,4 +16,9 @@ import com.niuan.erp.module.common.entity.Document;
*/
public interface DocumentMapper extends BaseMapper<Document> {
IPage<Document> selectPageByPartNumber(Page<?> page,
String searchCode,
String partNumber,
DocumentType documentType);
}

View File

@@ -2,6 +2,11 @@ package com.niuan.erp.module.common.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.niuan.erp.module.common.entity.DocumentMaterial;
import com.niuan.erp.module.common.entity.DocumentMaterialWithInfo;
import com.niuan.erp.module.common.enums.DocumentType;
import java.util.List;
import java.util.Map;
/**
* <p>
@@ -13,4 +18,6 @@ import com.niuan.erp.module.common.entity.DocumentMaterial;
*/
public interface DocumentMaterialMapper extends BaseMapper<DocumentMaterial> {
List<DocumentMaterialWithInfo> selectByPartNumber(List<Long> documentIds, String partNumber);
}

View File

@@ -1,6 +1,5 @@
package com.niuan.erp.module.warehouse.controller;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.niuan.erp.common.annotation.ApiLog;
import com.niuan.erp.common.annotation.ModuleLog;
@@ -9,20 +8,18 @@ import com.niuan.erp.common.base.BasePageReqParams;
import com.niuan.erp.common.base.BaseResult;
import com.niuan.erp.common.base.CommonValidateGroup.*;
import com.niuan.erp.common.base.OperationType;
import com.niuan.erp.module.common.entity.Document;
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.StockTransferOrderItemDto;
import com.niuan.erp.module.warehouse.controller.dto.StockTransferOrderSearchParams;
import com.niuan.erp.module.warehouse.service.StockTransferOrderService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.constraints.NotNull;
import lombok.RequiredArgsConstructor;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.util.StringUtils;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.util.List;
@@ -39,24 +36,8 @@ public class StockTransferOrderController {
@GetMapping("/getStockTransferOrderPage")
@PreAuthorize("hasAuthority('stock_transfer_order:index')")
public BaseResult<IPage<StockTransferOrderDto>> getStockTransferOrderPage(@Validated BasePageReqParams pageParams,
@Validated(Get.class) StockTransferOrderDto searchParams) {
var wrapper = new LambdaQueryWrapper<Document>();
if (searchParams != null) {
if (StringUtils.hasText(searchParams.searchCode())) {
wrapper.like(Document::getFormCode, searchParams.searchCode());
}
}
return BaseResult.successWithData(stockTransferOrderService.getStockTransferOrderPage(pageParams, wrapper));
}
@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();
StockTransferOrderSearchParams searchParams) {
return BaseResult.successWithData(stockTransferOrderService.getStockTransferOrderPage(pageParams, searchParams));
}
@ApiLog(type = OperationType.UPDATE, remark = "更新一条StockTransferOrder记录")
@@ -98,27 +79,22 @@ public class StockTransferOrderController {
@ApiLog(type = OperationType.UPDATE, remark = "反审核StockTransferOrder")
@Operation(summary = "反审核StockTransferOrder", operationId = "unapproveStockTransferOrder")
@PostMapping("/unapproveStockTransferOrder")
@PreAuthorize("hasAuthority('stock_transfer_order:unapprove')")
public BaseResult<?> unapproveStockTransferOrder(
@PostMapping("/rejectStockTransferOrder")
@PreAuthorize("hasAuthority('stock_transfer_order:reject')")
public BaseResult<?> rejectStockTransferOrder(
@Parameter(description = "调拨单ID") @RequestParam Long id) {
stockTransferOrderService.unapprove(id);
stockTransferOrderService.reject(id);
return BaseResult.success();
}
@Operation(summary = "获取StockTransferOrder明细", operationId = "getStockTransferOrderDetail")
@GetMapping("/getStockTransferOrderDetail")
@PreAuthorize("hasAuthority('stocktransferorder:index')")
public BaseResult<List<StockTransferOrderItemDto>> getStockTransferOrderDetail(
@Parameter(description = "调拨单ID") @RequestParam Long id) {
return BaseResult.successWithData(stockTransferOrderService.getDetail(id));
}
@Operation(summary = "导入StockTransferOrder明细", operationId = "importStockTransferOrderItems")
@PostMapping("/importStockTransferOrderItems")
@PreAuthorize("hasAuthority('stock_transfer_order:add')")
public BaseResult<List<StockTransferOrderItemDto>> importStockTransferOrderItems(
@Parameter(description = "Excel文件") @RequestParam("file") MultipartFile file) {
return BaseResult.successWithData(stockTransferOrderService.importItems(file));
@GetMapping("/getStockTransferOrderItem")
@PreAuthorize("hasAuthority('stock_transfer_order:index')")
public BaseResult<List<StockTransferOrderItemDto>> getStockTransferOrderItem(
@Parameter(description = "调拨单ID")
@RequestParam
@NotNull(message = "warehouse.stock_transfer_order.validate.order_id.not_null")
Long orderId) {
return BaseResult.successWithData(stockTransferOrderService.getItem(orderId));
}
}

View File

@@ -1,30 +1,20 @@
package com.niuan.erp.module.warehouse.controller.dto;
import java.time.LocalDateTime;
import com.fasterxml.jackson.annotation.JsonInclude;
import java.time.LocalDateTime;
import java.util.List;
@JsonInclude(JsonInclude.Include.NON_NULL)
public record StockTransferOrderDto(
Long id,
Integer status,
LocalDateTime createDate,
Long createUserId,
String createUserName,
LocalDateTime updateDate,
Long updateUserId,
String updateUserName,
Integer storeNo,
String storeName,
Integer formType,
String formCode,
String formName,
Integer formStatus,
String formMark,
Integer reserve1,
String reserve2,
Integer vendorNo,
String vendorName,
Double totalValue,
Integer outStoreNo,
String outStoreName,
Integer groupId,
Integer customerId,
String searchCode) {}
Long id,
LocalDateTime createDate,
Integer storeNo,
String storeName,
Integer outStoreNo,
String outStoreName,
String formCode,
String formName,
String formMark,
Integer formStatus,
List<StockTransferOrderItemDto> orderItems) {}

View File

@@ -0,0 +1,6 @@
package com.niuan.erp.module.warehouse.controller.dto;
public record StockTransferOrderSearchParams(
String searchCode,
String partNumber
) {}

View File

@@ -2,6 +2,7 @@ package com.niuan.erp.module.warehouse.converter;
import com.niuan.erp.module.common.entity.Document;
import com.niuan.erp.module.common.entity.DocumentMaterial;
import com.niuan.erp.module.common.entity.DocumentMaterialWithInfo;
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.StockTransferOrderItemAddDto;
@@ -17,12 +18,10 @@ public interface StockTransferOrderConverter {
Document toEntity(StockTransferOrderDto dto);
Document toEntity(StockTransferOrderAddDto dto);
StockTransferOrderDto toDto(Document entity);
List<StockTransferOrderDto> toDtoList(List<Document> entities);
DocumentMaterial toEntity(StockTransferOrderItemAddDto dto);
List<DocumentMaterial> toEntityList(List<StockTransferOrderItemAddDto> dtoList);
@Mapping(target = "productSpec", ignore = true)
StockTransferOrderItemDto toItemDto(DocumentMaterial entity);
StockTransferOrderItemDto toItemDto(DocumentMaterialWithInfo entity);
List<StockTransferOrderItemDto> toItemDtoList(List<DocumentMaterial> entities);
}

View File

@@ -1,19 +1,20 @@
package com.niuan.erp.module.warehouse.service;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.niuan.erp.common.base.BasePageReqParams;
import com.niuan.erp.module.common.entity.Document;
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.StockTransferOrderItemDto;
import org.springframework.web.multipart.MultipartFile;
import com.niuan.erp.module.warehouse.controller.dto.StockTransferOrderSearchParams;
import java.util.List;
public interface StockTransferOrderService {
IPage<StockTransferOrderDto> getStockTransferOrderPage(BasePageReqParams pageParams, LambdaQueryWrapper<Document> wrapper);
IPage<StockTransferOrderDto> getStockTransferOrderPage(BasePageReqParams pageParams,
StockTransferOrderSearchParams searchParams);
List<StockTransferOrderItemDto> getItem(long id);
void addStockTransferOrder(StockTransferOrderAddDto dto);
@@ -25,9 +26,6 @@ public interface StockTransferOrderService {
void approve(long id);
void unapprove(long id);
void reject(long id);
List<StockTransferOrderItemDto> getDetail(long id);
List<StockTransferOrderItemDto> importItems(MultipartFile file);
}

View File

@@ -14,10 +14,7 @@ import com.niuan.erp.module.common.enums.DocumentType;
import com.niuan.erp.module.common.enums.FormStatus;
import com.niuan.erp.module.common.mapper.DocumentMapper;
import com.niuan.erp.module.common.mapper.DocumentMaterialMapper;
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.StockTransferOrderItemAddDto;
import com.niuan.erp.module.warehouse.controller.dto.StockTransferOrderItemDto;
import com.niuan.erp.module.warehouse.controller.dto.*;
import com.niuan.erp.module.warehouse.converter.StockTransferOrderConverter;
import com.niuan.erp.module.warehouse.entity.Stock;
import com.niuan.erp.module.warehouse.entity.WarehouseItem;
@@ -52,8 +49,41 @@ public class StockTransferOrderServiceImpl extends ServiceImpl<DocumentMapper, D
private final StockMapper stockMapper;
@Override
public IPage<StockTransferOrderDto> getStockTransferOrderPage(BasePageReqParams pageParams, LambdaQueryWrapper<Document> wrapper) {
wrapper.eq(Document::getFormType, DocumentType.STOCK_TRANSFER_ORDER);
public IPage<StockTransferOrderDto> getStockTransferOrderPage(BasePageReqParams pageParams,
StockTransferOrderSearchParams searchParams) {
var wrapper = new LambdaQueryWrapper<Document>()
.eq(Document::getFormType, DocumentType.STOCK_TRANSFER_ORDER)
.orderByDesc(Document::getCreateDate);
if (searchParams != null) {
if (StringUtils.hasText(searchParams.searchCode())) {
wrapper.like(Document::getFormCode, searchParams.searchCode())
.or().like(Document::getFormName, searchParams.searchCode())
.or().like(Document::getFormMark, searchParams.searchCode());
}
if (StringUtils.hasText(searchParams.partNumber())) {
var orderPage = this.baseMapper.selectPageByPartNumber(
new Page<>(pageParams.page(), pageParams.pageSize()),
searchParams.searchCode(),
searchParams.partNumber(),
DocumentType.STOCK_TRANSFER_ORDER);
var items = documentMaterialMapper.selectByPartNumber(
orderPage.getRecords().stream().map(Document::getId).toList(), searchParams.partNumber());
return orderPage.convert(order -> new StockTransferOrderDto(
order.getId(),
order.getCreateDate(),
order.getStoreNo(),
order.getStoreName(),
order.getOutStoreNo(),
order.getOutStoreName(),
order.getFormCode(),
order.getFormName(),
order.getFormMark(),
order.getFormStatus().getValue(),
items.stream()
.filter(item -> item.getDocumentNo().equals(order.getId().intValue()))
.map(stockTransferOrderConverter::toItemDto).toList()));
}
}
IPage<Document> result = this.baseMapper.selectPage(new Page<>(pageParams.page(), pageParams.pageSize()), wrapper);
return result.convert(stockTransferOrderConverter::toDto);
}
@@ -246,7 +276,7 @@ public class StockTransferOrderServiceImpl extends ServiceImpl<DocumentMapper, D
}
@Override
public void unapprove(long id) {
public void reject(long id) {
Document entity = this.baseMapper.selectById(id);
if (entity == null) {
throw new BusinessException("warehouse.stock_transfer_order.exception.not_found");
@@ -330,53 +360,9 @@ public class StockTransferOrderServiceImpl extends ServiceImpl<DocumentMapper, D
}
@Override
public List<StockTransferOrderItemDto> getDetail(long id) {
LambdaQueryWrapper<DocumentMaterial> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(DocumentMaterial::getDocumentNo, id);
List<DocumentMaterial> materials = documentMaterialMapper.selectList(wrapper);
return stockTransferOrderConverter.toItemDtoList(materials);
}
@Override
public List<StockTransferOrderItemDto> importItems(MultipartFile file) {
if (file == null || file.isEmpty()) {
throw new BusinessException("warehouse.stock_transfer_order.exception.file_empty");
}
try (Workbook workbook = WorkbookFactory.create(file.getInputStream())) {
Sheet sheet = workbook.getSheetAt(0);
List<StockTransferOrderItemDto> items = new ArrayList<>();
for (int i = 1; i <= sheet.getLastRowNum(); i++) {
Row row = sheet.getRow(i);
if (row == null) continue;
String partNumber = getCellValueAsString(row.getCell(0));
String productSpec = getCellValueAsString(row.getCell(1));
String countStr = getCellValueAsString(row.getCell(2));
if (!StringUtils.hasText(partNumber)) continue;
int productCount = 0;
if (StringUtils.hasText(countStr)) {
try {
productCount = Integer.parseInt(countStr);
} catch (NumberFormatException e) {
productCount = 0;
}
}
StockTransferOrderItemDto item = new StockTransferOrderItemDto(
null, null, null, null, null, null, null, null,
null, partNumber, null, productCount, null, null, null, null, null, null, productSpec
);
items.add(item);
}
return items;
} catch (IOException e) {
throw new BusinessException("warehouse.stock_transfer_order.exception.import_failed");
}
public List<StockTransferOrderItemDto> getItem(long id) {
var items = documentMaterialMapper.selectByPartNumber(List.of(id), null);
return items.stream().map(stockTransferOrderConverter::toItemDto).toList();
}
private void validateTransferOrder(StockTransferOrderAddDto dto) {
@@ -408,16 +394,4 @@ public class StockTransferOrderServiceImpl extends ServiceImpl<DocumentMapper, D
}
}
}
private String getCellValueAsString(Cell cell) {
if (cell == null) {
return "";
}
return switch (cell.getCellType()) {
case STRING -> cell.getStringCellValue().trim();
case NUMERIC -> String.valueOf((long) cell.getNumericCellValue());
case BOOLEAN -> String.valueOf(cell.getBooleanCellValue());
default -> "";
};
}
}