diff --git a/klp-ui/src/views/wms/delivery/components/coilsTranfer.vue b/klp-ui/src/views/wms/delivery/components/coilsTranfer.vue
new file mode 100644
index 00000000..f362e635
--- /dev/null
+++ b/klp-ui/src/views/wms/delivery/components/coilsTranfer.vue
@@ -0,0 +1,64 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+
+
+
+
+
+
+
+
+
+
+
+ 选择
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 选择
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/klp-ui/src/views/wms/delivery/plan/index.vue b/klp-ui/src/views/wms/delivery/plan/index.vue
index 7a250c6e..c8e9200d 100644
--- a/klp-ui/src/views/wms/delivery/plan/index.vue
+++ b/klp-ui/src/views/wms/delivery/plan/index.vue
@@ -2,18 +2,10 @@
-
+
-
@@ -25,96 +17,95 @@
- 新增
+ 新增
- 修改
+ 修改
- 删除
+ 删除
- 导出
+ 导出
-
-
-
-
-
-
-
@@ -189,7 +185,7 @@ export default {
const prefix = await this.generateWarehousePrefix(this.selectedNode);
this.initForm = {
- rowCount: '', columnCount: '', layerCount: '',
+ rowCount: '', columnCount: '',
prefix: prefix,
parentId: this.selectedNode.actualWarehouseId
};
diff --git a/klp-wms/src/main/java/com/klp/controller/WmsDeliveryPlanController.java b/klp-wms/src/main/java/com/klp/controller/WmsDeliveryPlanController.java
index c98caf82..04d71303 100644
--- a/klp-wms/src/main/java/com/klp/controller/WmsDeliveryPlanController.java
+++ b/klp-wms/src/main/java/com/klp/controller/WmsDeliveryPlanController.java
@@ -5,9 +5,7 @@ import java.util.List;
import java.util.Arrays;
import com.fasterxml.jackson.annotation.JsonFormat;
-import com.klp.domain.vo.WmsDeliveryPlanStatisticsVo;
-import com.klp.domain.vo.WmsDeliveryReportResultVo;
-import com.klp.domain.vo.WmsDeliveryReportVo;
+import com.klp.domain.vo.*;
import lombok.RequiredArgsConstructor;
import javax.servlet.http.HttpServletResponse;
import javax.validation.constraints.*;
@@ -24,7 +22,6 @@ import com.klp.common.core.validate.AddGroup;
import com.klp.common.core.validate.EditGroup;
import com.klp.common.enums.BusinessType;
import com.klp.common.utils.poi.ExcelUtil;
-import com.klp.domain.vo.WmsDeliveryPlanVo;
import com.klp.domain.bo.WmsDeliveryPlanBo;
import com.klp.service.IWmsDeliveryPlanService;
import com.klp.common.core.page.TableDataInfo;
@@ -129,4 +126,6 @@ public class WmsDeliveryPlanController extends BaseController {
WmsDeliveryReportResultVo report = iWmsDeliveryPlanService.getDeliveryReport(startTime, endTime);
return R.ok(report);
}
+
+
}
diff --git a/klp-wms/src/main/java/com/klp/controller/WmsMaterialCoilController.java b/klp-wms/src/main/java/com/klp/controller/WmsMaterialCoilController.java
index fde0053f..201b440d 100644
--- a/klp-wms/src/main/java/com/klp/controller/WmsMaterialCoilController.java
+++ b/klp-wms/src/main/java/com/klp/controller/WmsMaterialCoilController.java
@@ -3,6 +3,7 @@ package com.klp.controller;
import java.util.List;
import java.util.Map;
import java.util.Arrays;
+import java.util.stream.Collectors;
import com.klp.domain.vo.WmsMaterialCoilExportVo;
import lombok.RequiredArgsConstructor;
@@ -184,5 +185,41 @@ public class WmsMaterialCoilController extends BaseController {
List distribution = iWmsMaterialCoilService.getDistributionByActualItemType(itemType, itemId);
return R.ok(distribution);
}
+
+
+
+ /**
+ * 查询未被任何发货计划引用的钢卷列表
+ * 用于发货计划选择钢卷时,避免选择已经被其他发货计划引用的钢卷
+ */
+ @GetMapping("/availableForDelivery")
+ public TableDataInfo getAvailableCoilsForDelivery(WmsMaterialCoilBo bo, PageQuery pageQuery) {
+ return iWmsMaterialCoilService.queryAvailableForDelivery(bo, pageQuery);
+ }
+
+
+ /**
+ * 批量更新钢卷发货状态
+ *
+ * @param coilIds 钢卷ID,多个ID用逗号分隔
+ * @param status 目标状态 (0=在库, 1=在途, 2=已出库)
+ * @return 操作结果
+ */
+ @Log(title = "钢卷物料表", businessType = BusinessType.UPDATE)
+ @PutMapping("/batchUpdateDeliveryStatus")
+ public R batchUpdateDeliveryStatus(
+ @RequestParam String coilIds,
+ @RequestParam Integer status) {
+
+ // 解析钢卷ID列表
+ List coilIdList = Arrays.stream(coilIds.split(","))
+ .map(String::trim)
+ .filter(s -> !s.isEmpty())
+ .map(Long::valueOf)
+ .collect(Collectors.toList());
+
+ Boolean result = iWmsMaterialCoilService.batchUpdateDeliveryStatus(coilIdList, status);
+ return result ? R.ok() : R.fail("批量更新失败");
+ }
}
diff --git a/klp-wms/src/main/java/com/klp/domain/WmsDeliveryPlan.java b/klp-wms/src/main/java/com/klp/domain/WmsDeliveryPlan.java
index 008c619e..8b43fe78 100644
--- a/klp-wms/src/main/java/com/klp/domain/WmsDeliveryPlan.java
+++ b/klp-wms/src/main/java/com/klp/domain/WmsDeliveryPlan.java
@@ -7,6 +7,7 @@ import lombok.EqualsAndHashCode;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
+import org.springframework.format.annotation.DateTimeFormat;
/**
* 发货计划对象 wms_delivery_plan
@@ -48,4 +49,16 @@ public class WmsDeliveryPlan extends BaseEntity {
@TableLogic
private Integer delFlag;
+ // 钢卷集合
+ private String coil;
+
+ //-- 1. 新增审核状态字段(核心)
+ private Integer auditStatus;
+ //-- 2. 新增审核人字段
+ private String auditBy;
+ //-- 3. 新增审核时间字段
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+ @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+ private Date auditTime;
+
}
diff --git a/klp-wms/src/main/java/com/klp/domain/bo/WmsActualWarehouseBatchGenerateBo.java b/klp-wms/src/main/java/com/klp/domain/bo/WmsActualWarehouseBatchGenerateBo.java
index 853839b0..5d18efe2 100644
--- a/klp-wms/src/main/java/com/klp/domain/bo/WmsActualWarehouseBatchGenerateBo.java
+++ b/klp-wms/src/main/java/com/klp/domain/bo/WmsActualWarehouseBatchGenerateBo.java
@@ -13,25 +13,20 @@ import javax.validation.constraints.NotNull;
public class WmsActualWarehouseBatchGenerateBo {
/** 列数 */
- @NotNull
@Min(1)
private Integer columnCount;
/** 行数 */
- @NotNull
@Min(1)
private Integer rowCount;
/** 层数 */
- @NotNull
@Min(1)
private Integer layerCount;
/** 前缀 */
- @NotBlank
private String prefix;
/** 父节点ID */
- @NotNull
private Long parentId;
}
diff --git a/klp-wms/src/main/java/com/klp/domain/bo/WmsDeliveryPlanBo.java b/klp-wms/src/main/java/com/klp/domain/bo/WmsDeliveryPlanBo.java
index 23641677..01331195 100644
--- a/klp-wms/src/main/java/com/klp/domain/bo/WmsDeliveryPlanBo.java
+++ b/klp-wms/src/main/java/com/klp/domain/bo/WmsDeliveryPlanBo.java
@@ -7,6 +7,7 @@ import javax.validation.constraints.*;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
+import org.springframework.format.annotation.DateTimeFormat;
/**
* 发货计划业务对象 wms_delivery_plan
@@ -43,5 +44,15 @@ public class WmsDeliveryPlanBo extends BaseEntity {
*/
private String remark;
+ // 钢卷集合
+ private String coil;
+ //-- 1. 新增审核状态字段(核心)
+ private Integer auditStatus;
+ //-- 2. 新增审核人字段
+ private String auditBy;
+ //-- 3. 新增审核时间字段
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+ @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+ private Date auditTime;
}
diff --git a/klp-wms/src/main/java/com/klp/domain/bo/WmsMaterialCoilBo.java b/klp-wms/src/main/java/com/klp/domain/bo/WmsMaterialCoilBo.java
index 25488627..7ed360e4 100644
--- a/klp-wms/src/main/java/com/klp/domain/bo/WmsMaterialCoilBo.java
+++ b/klp-wms/src/main/java/com/klp/domain/bo/WmsMaterialCoilBo.java
@@ -160,5 +160,10 @@ public class WmsMaterialCoilBo extends BaseEntity {
*/
private Integer minAbnormalCount;
+ /**
+ * 钢卷ID列表(逗号分隔,用于根据ID列表查询钢卷)
+ */
+ private String coilIds;
+
}
diff --git a/klp-wms/src/main/java/com/klp/domain/vo/WmsDeliveryPlanVo.java b/klp-wms/src/main/java/com/klp/domain/vo/WmsDeliveryPlanVo.java
index 7faf26c2..1befe163 100644
--- a/klp-wms/src/main/java/com/klp/domain/vo/WmsDeliveryPlanVo.java
+++ b/klp-wms/src/main/java/com/klp/domain/vo/WmsDeliveryPlanVo.java
@@ -10,6 +10,7 @@ import com.klp.common.annotation.ExcelDictFormat;
import com.klp.common.convert.ExcelDictConvert;
import com.klp.common.core.domain.BaseEntity;
import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
/**
@@ -71,4 +72,16 @@ public class WmsDeliveryPlanVo extends BaseEntity {
*/
private String updateByName;
+ // 钢卷集合
+ private String coil;
+
+ //-- 1. 新增审核状态字段(核心)
+ private Integer auditStatus;
+ //-- 2. 新增审核人字段
+ private String auditBy;
+ //-- 3. 新增审核时间字段
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+ @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+ private Date auditTime;
+
}
diff --git a/klp-wms/src/main/java/com/klp/service/IWmsDeliveryPlanService.java b/klp-wms/src/main/java/com/klp/service/IWmsDeliveryPlanService.java
index 951aa642..8fe1752b 100644
--- a/klp-wms/src/main/java/com/klp/service/IWmsDeliveryPlanService.java
+++ b/klp-wms/src/main/java/com/klp/service/IWmsDeliveryPlanService.java
@@ -7,6 +7,7 @@ import com.klp.domain.bo.WmsDeliveryPlanBo;
import com.klp.common.core.page.TableDataInfo;
import com.klp.common.core.domain.PageQuery;
import com.klp.domain.vo.WmsDeliveryReportResultVo;
+import com.klp.domain.vo.WmsMaterialCoilVo;
import java.util.Collection;
import java.util.Date;
diff --git a/klp-wms/src/main/java/com/klp/service/IWmsMaterialCoilService.java b/klp-wms/src/main/java/com/klp/service/IWmsMaterialCoilService.java
index 43c8b9b9..46426266 100644
--- a/klp-wms/src/main/java/com/klp/service/IWmsMaterialCoilService.java
+++ b/klp-wms/src/main/java/com/klp/service/IWmsMaterialCoilService.java
@@ -99,5 +99,9 @@ public interface IWmsMaterialCoilService {
List queryExportList(WmsMaterialCoilBo bo);
int exportCoil(@NotEmpty(message = "主键不能为空") Long coilId);
+
+ TableDataInfo queryAvailableForDelivery(WmsMaterialCoilBo bo, PageQuery pageQuery);
+
+ Boolean batchUpdateDeliveryStatus(List coilIdList, Integer status);
}
diff --git a/klp-wms/src/main/java/com/klp/service/impl/WmsActualWarehouseServiceImpl.java b/klp-wms/src/main/java/com/klp/service/impl/WmsActualWarehouseServiceImpl.java
index b72927b8..ce8fb493 100644
--- a/klp-wms/src/main/java/com/klp/service/impl/WmsActualWarehouseServiceImpl.java
+++ b/klp-wms/src/main/java/com/klp/service/impl/WmsActualWarehouseServiceImpl.java
@@ -56,20 +56,26 @@ public class WmsActualWarehouseServiceImpl implements IWmsActualWarehouseService
Integer layers = bo.getLayerCount();
String prefix = bo.getPrefix();
Long parentId = bo.getParentId();
- if (rows == null || cols == null || layers == null || rows < 1 || cols < 1 || layers < 1) {
- throw new ServiceException("行/列/层必须为正整数");
+ if (layers == null) {
+ layers = 2;
+ }
+ if (rows == null || cols == null || rows < 1 || cols < 1) {
+ throw new ServiceException("行/列必须为正整数");
+ }
+ if (layers < 1) {
+ throw new ServiceException("层必须为正整数");
}
if (StringUtils.isBlank(prefix)) {
throw new ServiceException("前缀不能为空");
}
- // 预生成候选编码
List codes = new ArrayList<>(rows * cols * layers);
- for (int c = 1; c <= cols; c++) {
- for (int r = 1; r <= rows; r++) {
- String rStr = r < 10 ? ("0" + r) : String.valueOf(r);
- for (int l = 1; l <= layers; l++) {
- String code = prefix + c + rStr + '-' + l;
+ for (int l = 1; l <= layers; l++) {
+ int rowsForLayer = (l == 2) ? Math.max(rows - 1, 1) : rows;
+ for (int c = 1; c <= cols; c++) {
+ for (int r = 1; r <= rowsForLayer; r++) {
+ String rStr = r < 10 ? ("0" + r) : String.valueOf(r);
+ String code = prefix + c + '-' + rStr + '-' + l;
codes.add(code);
}
}
diff --git a/klp-wms/src/main/java/com/klp/service/impl/WmsDeliveryPlanServiceImpl.java b/klp-wms/src/main/java/com/klp/service/impl/WmsDeliveryPlanServiceImpl.java
index e8381f69..1680e119 100644
--- a/klp-wms/src/main/java/com/klp/service/impl/WmsDeliveryPlanServiceImpl.java
+++ b/klp-wms/src/main/java/com/klp/service/impl/WmsDeliveryPlanServiceImpl.java
@@ -8,7 +8,9 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.klp.common.utils.StringUtils;
+import com.klp.domain.WmsMaterialCoil;
import com.klp.domain.vo.*;
+import com.klp.mapper.WmsMaterialCoilMapper;
import com.klp.system.service.ISysUserService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
@@ -34,6 +36,8 @@ public class WmsDeliveryPlanServiceImpl implements IWmsDeliveryPlanService {
private final ISysUserService userService;
+ private final WmsMaterialCoilMapper coilMapper;
+
/**
* 查询发货计划
*/
@@ -87,6 +91,7 @@ public class WmsDeliveryPlanServiceImpl implements IWmsDeliveryPlanService {
lqw.like(StringUtils.isNotBlank(bo.getPlanName()), WmsDeliveryPlan::getPlanName, bo.getPlanName());
lqw.eq(bo.getPlanDate() != null, WmsDeliveryPlan::getPlanDate, bo.getPlanDate());
lqw.eq(bo.getPlanType() != null, WmsDeliveryPlan::getPlanType, bo.getPlanType());
+ lqw.eq(bo.getAuditStatus() != null, WmsDeliveryPlan::getAuditStatus, bo.getAuditStatus());
return lqw;
}
@@ -163,4 +168,5 @@ public class WmsDeliveryPlanServiceImpl implements IWmsDeliveryPlanService {
return result;
}
+
}
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 17cf1392..4dda2338 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
@@ -12,8 +12,10 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.klp.common.helper.LoginHelper;
import com.klp.common.utils.StringUtils;
import com.klp.common.utils.spring.SpringUtils;
+import com.klp.domain.WmsDeliveryPlan;
import com.klp.domain.bo.*;
import com.klp.domain.vo.*;
+import com.klp.mapper.WmsDeliveryPlanMapper;
import com.klp.system.service.ISysUserService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
@@ -56,6 +58,7 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService {
private final IWmsBomItemService bomItemService;
private final IWmsProductService productService;
private final ISysUserService userService;
+ private final WmsDeliveryPlanMapper deliveryPlanMapper;
/**
* 查询钢卷物料表
@@ -347,6 +350,23 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService {
// 兼容原来的itemId单值查询
qw.eq("mc.item_id", bo.getItemId());
}
+ // 添加coilIds查询条件,支持逗号分隔的多个coilId查询
+ if (StringUtils.isNotBlank(bo.getCoilIds())) {
+ String[] coilIdArray = bo.getCoilIds().split(",");
+ List coilIdList = new ArrayList<>();
+ for (String coilIdStr : coilIdArray) {
+ if (StringUtils.isNotBlank(coilIdStr)) {
+ try {
+ coilIdList.add(Long.parseLong(coilIdStr.trim()));
+ } catch (NumberFormatException e) {
+ // 忽略无效的ID格式
+ }
+ }
+ }
+ if (!coilIdList.isEmpty()) {
+ qw.in("mc.coil_id", coilIdList);
+ }
+ }
//逻辑删除
qw.eq("mc.del_flag", 0);
//把team字段作为筛选条件
@@ -1752,4 +1772,114 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService {
return lqw;
}
+
+ /**
+ * 查询可用于发货计划的钢卷(未被任何发货计划引用的钢卷)
+ *
+ * @param bo 查询条件
+ * @param pageQuery 分页参数
+ * @return 钢卷分页列表
+ */
+ @Override
+ public TableDataInfo queryAvailableForDelivery(WmsMaterialCoilBo bo, PageQuery pageQuery) {
+ // 构建查询条件
+ LambdaQueryWrapper lqw = buildAvailableCoilQueryWrapper(bo);
+ Page result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+ return TableDataInfo.build(result);
+ }
+
+ /**
+ * 构建可用于发货计划的钢卷查询条件
+ * 排除已被任何发货计划引用的钢卷
+ *
+ * @param bo 查询条件
+ * @return 查询构造器
+ */
+ private LambdaQueryWrapper buildAvailableCoilQueryWrapper(WmsMaterialCoilBo bo) {
+ LambdaQueryWrapper lqw = Wrappers.lambdaQuery();
+
+ // 基础查询条件
+ lqw.eq(WmsMaterialCoil::getDelFlag, 0); // 未删除
+ lqw.eq(WmsMaterialCoil::getStatus, 0); // 在库状态
+ lqw.eq(WmsMaterialCoil::getDataType, 1); // 当前数据
+
+ // 应用传入的查询条件
+ if (StringUtils.isNotBlank(bo.getEnterCoilNo())) {
+ lqw.like(WmsMaterialCoil::getEnterCoilNo, bo.getEnterCoilNo());
+ }
+ if (StringUtils.isNotBlank(bo.getCurrentCoilNo())) {
+ lqw.like(WmsMaterialCoil::getCurrentCoilNo, bo.getCurrentCoilNo());
+ }
+ if (StringUtils.isNotBlank(bo.getSupplierCoilNo())) {
+ lqw.like(WmsMaterialCoil::getSupplierCoilNo, bo.getSupplierCoilNo());
+ }
+ if (bo.getWarehouseId() != null) {
+ lqw.eq(WmsMaterialCoil::getWarehouseId, bo.getWarehouseId());
+ }
+ if (bo.getItemId() != null) {
+ lqw.eq(WmsMaterialCoil::getItemId, bo.getItemId());
+ }
+ if (StringUtils.isNotBlank(bo.getItemType())) {
+ lqw.eq(WmsMaterialCoil::getItemType, bo.getItemType());
+ }
+
+ // 排除已被发货计划引用的钢卷
+ LambdaQueryWrapper planQuery =Wrappers.lambdaQuery();
+ planQuery.eq(WmsDeliveryPlan::getDelFlag, 0) // 过滤已删除的计划
+ .isNotNull(WmsDeliveryPlan::getCoil) // 只查有钢卷ID的计划
+ .ne(WmsDeliveryPlan::getCoil, ""); // 排除空字符串
+ List plans = deliveryPlanMapper.selectList(planQuery);
+ if (!plans.isEmpty()) {
+ Set usedCoilIds = new HashSet<>();
+ for (WmsDeliveryPlan plan : plans) {
+ if (StringUtils.isNotBlank(plan.getCoil())) {
+ String[] coilIds = plan.getCoil().split(",");
+ for (String coilIdStr : coilIds) {
+ try {
+ usedCoilIds.add(Long.parseLong(coilIdStr.trim()));
+ } catch (NumberFormatException ignored) {
+ // 忽略无效的ID
+ }
+ }
+ }
+ }
+
+ if (!usedCoilIds.isEmpty()) {
+ lqw.notIn(WmsMaterialCoil::getCoilId, usedCoilIds);
+ }
+ }
+
+ return lqw;
+ }
+
+
+ /**
+ * 批量更新钢卷发货状态
+ *
+ * @param coilIds 钢卷ID列表
+ * @param status 目标状态 (0=在库, 1=在途, 2=已出库)
+ * @return 是否更新成功
+ */
+ @Override
+ public Boolean batchUpdateDeliveryStatus(List coilIds, Integer status) {
+ if (coilIds == null || coilIds.isEmpty()) {
+ return false;
+ }
+
+ if (status == null || status < 0 || status > 2) {
+ throw new RuntimeException("无效的状态值,状态必须在0-2之间");
+ }
+
+ // 构造更新条件
+ LambdaUpdateWrapper updateWrapper = Wrappers.lambdaUpdate();
+ updateWrapper.in(WmsMaterialCoil::getCoilId, coilIds);
+ updateWrapper.set(WmsMaterialCoil::getStatus, status);
+
+ // 如果是设置为已出库状态,同时更新出库时间
+ if (status == 1) {
+ updateWrapper.set(WmsMaterialCoil::getExportTime, new Date());
+ }
+
+ return baseMapper.update(null, updateWrapper) > 0;
+ }
}
diff --git a/klp-wms/src/main/resources/mapper/klp/WmsDeliveryPlanMapper.xml b/klp-wms/src/main/resources/mapper/klp/WmsDeliveryPlanMapper.xml
index 4e9b23e8..32cb8357 100644
--- a/klp-wms/src/main/resources/mapper/klp/WmsDeliveryPlanMapper.xml
+++ b/klp-wms/src/main/resources/mapper/klp/WmsDeliveryPlanMapper.xml
@@ -9,6 +9,10 @@
+
+
+
+