From 0e6357253a90c7e026ad5e047a10214615ce982e Mon Sep 17 00:00:00 2001 From: Joshi <3040996759@qq.com> Date: Thu, 5 Mar 2026 13:55:38 +0800 Subject: [PATCH] =?UTF-8?q?feat(wms):=20=E6=B7=BB=E5=8A=A0=E9=92=A2?= =?UTF-8?q?=E5=8D=B7=E5=BA=93=E5=8C=BA=E6=93=8D=E4=BD=9C=E6=97=A5=E5=BF=97?= =?UTF-8?q?=E8=AE=B0=E5=BD=95=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在WmsMaterialCoilServiceImpl中注入WmsCoilWarehouseOperationLogMapper - 在钢卷发货出库操作后添加操作日志记录功能 - 新增recordWarehouseOperationLog方法用于记录库区操作日志 - 创建CoilWarehouseOperationLog注解用于标记需要记录操作日志的方法 - 实现CoilWarehouseOperationLogAspect切面自动记录操作日志 - 支持通过注解配置操作类型、出入库方向和备注信息 - 提供参数名映射功能自动获取钢卷ID和库区ID参数值 --- .../impl/WmsMaterialCoilServiceImpl.java | 19 +++++ .../annotation/CoilWarehouseOperationLog.java | 40 ++++++++++ .../CoilWarehouseOperationLogAspect.java | 79 +++++++++++++++++++ 3 files changed, 138 insertions(+) create mode 100644 klp-wms/src/main/java/com/klp/wms/annotation/CoilWarehouseOperationLog.java create mode 100644 klp-wms/src/main/java/com/klp/wms/aspect/CoilWarehouseOperationLogAspect.java diff --git a/klp-wms/src/main/java/com/klp/service/impl/WmsMaterialCoilServiceImpl.java b/klp-wms/src/main/java/com/klp/service/impl/WmsMaterialCoilServiceImpl.java index 3f8fd61f..80bd58dc 100644 --- a/klp-wms/src/main/java/com/klp/service/impl/WmsMaterialCoilServiceImpl.java +++ b/klp-wms/src/main/java/com/klp/service/impl/WmsMaterialCoilServiceImpl.java @@ -71,6 +71,7 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService { private final WmsProductMapper productMapper; private final WmsRawMaterialMapper rawMaterialMapper; private final WmsDeliveryWaybillDetailMapper deliveryWaybillDetailMapper; + private final WmsCoilWarehouseOperationLogMapper wmsCoilWarehouseOperationLogMapper; /** * 查询钢卷物料表 @@ -2392,10 +2393,28 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService { releaseBo.setIsEnabled(1); // 释放:设置为启用 actualWarehouseService.updateByBo(releaseBo); } + // 3. 记录操作日志 + recordWarehouseOperationLog(coilId, oldActualWarehouseId, 4, 2, "钢卷发货出库"); return rows; } + /** + * 记录钢卷库区操作日志 + */ + private void recordWarehouseOperationLog(Long coilId, Long warehouseId, Integer operationType, Integer inOutType, String remark) { + try { + WmsCoilWarehouseOperationLog operationLog = new WmsCoilWarehouseOperationLog(); + operationLog.setCoilId(coilId); + operationLog.setActualWarehouseId(warehouseId); + operationLog.setOperationType(operationType); + operationLog.setInOutType(inOutType); + operationLog.setRemark(remark); + wmsCoilWarehouseOperationLogMapper.insert(operationLog); + } catch (Exception e) { + log.warn("记录钢卷库区操作日志失败:{}", e.getMessage()); + } + } /** * 钢卷发货撤回 * @param coilId diff --git a/klp-wms/src/main/java/com/klp/wms/annotation/CoilWarehouseOperationLog.java b/klp-wms/src/main/java/com/klp/wms/annotation/CoilWarehouseOperationLog.java new file mode 100644 index 00000000..29f6c98c --- /dev/null +++ b/klp-wms/src/main/java/com/klp/wms/annotation/CoilWarehouseOperationLog.java @@ -0,0 +1,40 @@ +package com.klp.wms.annotation; + +import java.lang.annotation.*; + +@Target({ElementType.METHOD}) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface CoilWarehouseOperationLog { + + /** + * 操作类型:1=收货,2=加工,3=调拨,4=发货 + */ + int operationType(); + + /** + * 出入库方向:1=入库,2=出库 + */ + int inOutType(); + + /** + * 备注说明 + */ + String remark() default ""; + + /** + * 钢卷ID参数名(方法参数中的字段名) + */ + String coilIdParam() default "coilId"; + + /** + * 库区ID参数名(方法参数中的字段名) + */ + String warehouseIdParam() default "warehouseId"; + + /** + * 操作前的库区ID参数名(可选,用于记录变更前的库区) + */ + String oldWarehouseIdParam() default ""; + +} diff --git a/klp-wms/src/main/java/com/klp/wms/aspect/CoilWarehouseOperationLogAspect.java b/klp-wms/src/main/java/com/klp/wms/aspect/CoilWarehouseOperationLogAspect.java new file mode 100644 index 00000000..70ff9c67 --- /dev/null +++ b/klp-wms/src/main/java/com/klp/wms/aspect/CoilWarehouseOperationLogAspect.java @@ -0,0 +1,79 @@ +package com.klp.wms.aspect; + +import com.klp.wms.annotation.CoilWarehouseOperationLog; +import com.klp.domain.WmsCoilWarehouseOperationLog; +import com.klp.mapper.WmsCoilWarehouseOperationLogMapper; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.reflect.MethodSignature; +import org.springframework.stereotype.Component; + +import java.lang.reflect.Method; + +@Slf4j +@Aspect +@Component +@RequiredArgsConstructor +public class CoilWarehouseOperationLogAspect { + + private final WmsCoilWarehouseOperationLogMapper wmsCoilWarehouseOperationLogMapper; + + @Around("@annotation(com.klp.wms.annotation.CoilWarehouseOperationLog)") + public Object around(ProceedingJoinPoint joinPoint) throws Throwable { + MethodSignature signature = (MethodSignature) joinPoint.getSignature(); + Method method = signature.getMethod(); + CoilWarehouseOperationLog annotation = method.getAnnotation(CoilWarehouseOperationLog.class); + + Long coilId = getParamValue(joinPoint, annotation.coilIdParam(), Long.class); + Long warehouseId = getParamValue(joinPoint, annotation.warehouseIdParam(), Long.class); + Long oldWarehouseId = null; + if (!annotation.oldWarehouseIdParam().isEmpty()) { + oldWarehouseId = getParamValue(joinPoint, annotation.oldWarehouseIdParam(), Long.class); + } + + Object result = joinPoint.proceed(); + + try { + if (coilId != null) { + WmsCoilWarehouseOperationLog operationLog = new WmsCoilWarehouseOperationLog(); + operationLog.setCoilId(coilId); + operationLog.setActualWarehouseId(oldWarehouseId != null ? oldWarehouseId : warehouseId); + operationLog.setOperationType(annotation.operationType()); + operationLog.setInOutType(annotation.inOutType()); + operationLog.setRemark(annotation.remark()); + wmsCoilWarehouseOperationLogMapper.insert(operationLog); + log.info("记录钢卷库区操作日志:coilId={}, operationType={}, inOutType={}", + coilId, annotation.operationType(), annotation.inOutType()); + } + } catch (Exception e) { + log.warn("记录钢卷库区操作日志失败:{}", e.getMessage()); + } + + return result; + } + + private T getParamValue(ProceedingJoinPoint joinPoint, String paramName, Class type) { + if (paramName == null || paramName.isEmpty()) { + return null; + } + Object[] args = joinPoint.getArgs(); + MethodSignature signature = (MethodSignature) joinPoint.getSignature(); + String[] parameterNames = signature.getParameterNames(); + + if (parameterNames == null) { + return null; + } + + for (int i = 0; i < parameterNames.length; i++) { + if (paramName.equals(parameterNames[i]) && args[i] != null) { + if (type.isInstance(args[i])) { + return type.cast(args[i]); + } + } + } + return null; + } +}