-
-
-
-
-
-
-
-
-
- 搜索
- 重置
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
- 新增
-
-
- 修改
-
-
- 删除
-
-
- 导出
-
-
-
+
+ 搜索
+ 重置
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 修改
- 删除
-
-
-
+
+
+ 新增
+
+
+ 修改
+
+
+ 删除
+
+
+ 导出
+
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 修改
+ 删除
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/klp-ui/src/views/wms/schedulePlan/detail.vue b/klp-ui/src/views/wms/schedulePlan/detail.vue
new file mode 100644
index 00000000..4059f668
--- /dev/null
+++ b/klp-ui/src/views/wms/schedulePlan/detail.vue
@@ -0,0 +1,268 @@
+
+
+
+
+ 排产计划详情
+ 返回
+
+
+ {{ planInfo.planId }}
+ {{ planInfo.orderId }}
+ {{ planInfo.status }}
+ {{ planInfo.remark }}
+
+
+
+
+ 排产计划明细
+ 新增明细
+
+
+
+
+
+
+
+
+
+
+
+ 编辑
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/klp-ui/src/views/wms/schedulePlan/index.vue b/klp-ui/src/views/wms/schedulePlan/index.vue
new file mode 100644
index 00000000..91fd033d
--- /dev/null
+++ b/klp-ui/src/views/wms/schedulePlan/index.vue
@@ -0,0 +1,357 @@
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+
+
+
+
+ 新增
+
+
+ 修改
+
+
+ 删除
+
+
+ 导出
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ statusText(scope.row.status) }}
+
+
+
+
+
+
+ 修改
+ 删除
+ 详情
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/klp-ui/vue.config.js b/klp-ui/vue.config.js
index 7ba9a9d9..a4091ae8 100644
--- a/klp-ui/vue.config.js
+++ b/klp-ui/vue.config.js
@@ -27,6 +27,9 @@ module.exports = {
lintOnSave: process.env.NODE_ENV === 'development',
// 如果你不需要生产环境的 source map,可以将其设置为 false 以加速生产环境构建。
productionSourceMap: false,
+ transpileDependencies: [
+ 'frappe-gantt'
+ ],
// webpack-dev-server 相关配置
devServer: {
host: '0.0.0.0',
diff --git a/klp-wms/src/main/java/com/klp/controller/WmsProductionLineController.java b/klp-wms/src/main/java/com/klp/controller/WmsProductionLineController.java
index 8e9f0efa..eee96d3c 100644
--- a/klp-wms/src/main/java/com/klp/controller/WmsProductionLineController.java
+++ b/klp-wms/src/main/java/com/klp/controller/WmsProductionLineController.java
@@ -1,8 +1,11 @@
package com.klp.controller;
-import java.util.List;
-import java.util.Arrays;
+import java.lang.reflect.Method;
+import java.math.BigDecimal;
+import java.util.*;
+import com.klp.domain.bo.WmsSchedulePlanDetailBo;
+import com.klp.domain.vo.*;
import lombok.RequiredArgsConstructor;
import javax.servlet.http.HttpServletResponse;
import javax.validation.constraints.*;
@@ -18,10 +21,14 @@ 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.WmsProductionLineVo;
import com.klp.domain.bo.WmsProductionLineBo;
import com.klp.service.IWmsProductionLineService;
import com.klp.common.core.page.TableDataInfo;
+import com.klp.service.IWmsSchedulePlanDetailService;
+import com.klp.service.IWmsOrderService;
+import com.klp.service.IWmsOrderDetailService;
+import com.klp.service.IWmsProductService;
+import com.klp.service.IWmsSchedulePlanService;
/**
* 产线
@@ -36,6 +43,11 @@ import com.klp.common.core.page.TableDataInfo;
public class WmsProductionLineController extends BaseController {
private final IWmsProductionLineService iWmsProductionLineService;
+ private final IWmsSchedulePlanDetailService iWmsSchedulePlanDetailService;
+ private final IWmsOrderService iWmsOrderService;
+ private final IWmsOrderDetailService iWmsOrderDetailService;
+ private final IWmsProductService iWmsProductService;
+ private final IWmsSchedulePlanService iWmsSchedulePlanService;
/**
* 查询产线列表
@@ -97,4 +109,77 @@ public class WmsProductionLineController extends BaseController {
@PathVariable Long[] lineIds) {
return toAjax(iWmsProductionLineService.deleteWithValidByIds(Arrays.asList(lineIds), true));
}
+
+ /**
+ * 产线甘特图接口
+ * @param lineId 产线ID
+ * @return 甘特图数据
+ */
+ @GetMapping("/gantt")
+ public R> gantt(@RequestParam Long lineId) {
+ // 查询排产计划明细(按产线过滤,返回所有订单的任务)
+ WmsSchedulePlanDetailBo detailBo = new WmsSchedulePlanDetailBo();
+ detailBo.setLineId(lineId);
+ List
allDetails = iWmsSchedulePlanDetailService.queryList(detailBo);
+ // 查询产品、订单信息,补充remark
+ Set orderIdSet = new HashSet<>();
+ for (WmsSchedulePlanDetailVo detail : allDetails) {
+ // 查询产品名和订单编号
+ String productName = null;
+ if (detail.getProductId() != null) {
+ WmsProductVo product = iWmsProductService.queryById(detail.getProductId());
+ if (product != null) {
+ productName = product.getProductName();
+ }
+ }
+ String orderCode = null;
+ Long orderId = null;
+ if (detail.getPlanId() != null) {
+ WmsSchedulePlanVo planVo = iWmsSchedulePlanService.queryById(detail.getPlanId());
+ if (planVo != null && planVo.getOrderId() != null) {
+ orderId = planVo.getOrderId();
+ WmsOrderVo orderVo = iWmsOrderService.queryById(orderId);
+ if (orderVo != null) {
+ orderCode = orderVo.getOrderCode();
+ }
+ }
+ }
+ // 设置remark为“订单编号-产品名”
+ String remark = (orderCode != null ? orderCode : "") + (productName != null ? ("-" + productName) : "");
+ detail.setRemark(remark);
+ // 查询产线日产能
+ BigDecimal capacity = null;
+ if (detail.getLineId() != null) {
+ WmsProductionLineVo lineVo = iWmsProductionLineService.queryById(detail.getLineId());
+ if (lineVo != null) {
+ capacity = lineVo.getCapacity();
+ }
+ }
+ // 计算天数和总产能
+ BigDecimal totalCapacity = null;
+ int days = 0;
+ if (detail.getStartDate() != null && detail.getEndDate() != null) {
+ long diff = detail.getEndDate().getTime() - detail.getStartDate().getTime();
+ days = (int) (diff / (1000 * 3600 * 24)) + 1;
+ if (capacity != null) {
+ totalCapacity = capacity.multiply(new BigDecimal(days));
+ }
+ }
+ // 计划生产数量
+ BigDecimal planQuantity = detail.getQuantity();
+
+ // 直接set字段,无需反射
+ detail.setCapacity(capacity);
+ detail.setTotalCapacity(totalCapacity);
+ detail.setDays(days);
+ detail.setPlanQuantity(planQuantity);
+ }
+ // 查询所有相关订单信息
+ List orderList = new ArrayList<>();
+ // 返回结构
+ return R.ok(new HashMap() {{
+ put("tasks", allDetails);
+ put("orders", orderList);
+ }});
+ }
}
diff --git a/klp-wms/src/main/java/com/klp/domain/bo/WmsSchedulePlanBo.java b/klp-wms/src/main/java/com/klp/domain/bo/WmsSchedulePlanBo.java
index 37ff222c..d5387dc5 100644
--- a/klp-wms/src/main/java/com/klp/domain/bo/WmsSchedulePlanBo.java
+++ b/klp-wms/src/main/java/com/klp/domain/bo/WmsSchedulePlanBo.java
@@ -32,6 +32,11 @@ public class WmsSchedulePlanBo extends BaseEntity {
*/
private Long orderId;
+ /**
+ * 版本
+ */
+ private String version;
+
/**
* 状态(0=新建,1=已排产,2=生产中,3=已完成)
*/
diff --git a/klp-wms/src/main/java/com/klp/domain/bo/WmsSchedulePlanDetailBo.java b/klp-wms/src/main/java/com/klp/domain/bo/WmsSchedulePlanDetailBo.java
index a9c9b42d..54977cf9 100644
--- a/klp-wms/src/main/java/com/klp/domain/bo/WmsSchedulePlanDetailBo.java
+++ b/klp-wms/src/main/java/com/klp/domain/bo/WmsSchedulePlanDetailBo.java
@@ -48,11 +48,13 @@ public class WmsSchedulePlanDetailBo extends BaseEntity {
/**
* 计划开始日期
*/
+ @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSX", timezone = "GMT+8")
private Date startDate;
/**
* 计划结束日期
*/
+ @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSX", timezone = "GMT+8")
private Date endDate;
/**
diff --git a/klp-wms/src/main/java/com/klp/domain/vo/WmsSchedulePlanDetailVo.java b/klp-wms/src/main/java/com/klp/domain/vo/WmsSchedulePlanDetailVo.java
index b49c4665..6b1961fc 100644
--- a/klp-wms/src/main/java/com/klp/domain/vo/WmsSchedulePlanDetailVo.java
+++ b/klp-wms/src/main/java/com/klp/domain/vo/WmsSchedulePlanDetailVo.java
@@ -70,5 +70,24 @@ public class WmsSchedulePlanDetailVo {
@ExcelProperty(value = "备注")
private String remark;
+ /**
+ * 产线日产能
+ */
+ private BigDecimal capacity;
+
+ /**
+ * 总产能
+ */
+ private BigDecimal totalCapacity;
+
+ /**
+ * 目标生产数量
+ */
+ private BigDecimal planQuantity;
+
+ /**
+ * 天数
+ */
+ private Integer days;
}
diff --git a/klp-wms/src/main/java/com/klp/service/impl/WmsPurchasePlanDetailServiceImpl.java b/klp-wms/src/main/java/com/klp/service/impl/WmsPurchasePlanDetailServiceImpl.java
index ff957520..3a139320 100644
--- a/klp-wms/src/main/java/com/klp/service/impl/WmsPurchasePlanDetailServiceImpl.java
+++ b/klp-wms/src/main/java/com/klp/service/impl/WmsPurchasePlanDetailServiceImpl.java
@@ -74,6 +74,7 @@ public class WmsPurchasePlanDetailServiceImpl implements IWmsPurchasePlanDetailS
*/
@Override
public Boolean insertByBo(WmsPurchasePlanDetailBo bo) {
+
WmsPurchasePlanDetail add = BeanUtil.toBean(bo, WmsPurchasePlanDetail.class);
validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0;
diff --git a/klp-wms/src/main/java/com/klp/service/impl/WmsSchedulePlanDetailServiceImpl.java b/klp-wms/src/main/java/com/klp/service/impl/WmsSchedulePlanDetailServiceImpl.java
index 867d473c..19e276ad 100644
--- a/klp-wms/src/main/java/com/klp/service/impl/WmsSchedulePlanDetailServiceImpl.java
+++ b/klp-wms/src/main/java/com/klp/service/impl/WmsSchedulePlanDetailServiceImpl.java
@@ -74,6 +74,16 @@ public class WmsSchedulePlanDetailServiceImpl implements IWmsSchedulePlanDetailS
*/
@Override
public Boolean insertByBo(WmsSchedulePlanDetailBo bo) {
+ // 校验产线时间段是否已排产
+ List existList = baseMapper.selectList(
+ Wrappers.lambdaQuery(WmsSchedulePlanDetail.class)
+ .eq(WmsSchedulePlanDetail::getLineId, bo.getLineId())
+ .le(WmsSchedulePlanDetail::getStartDate, bo.getEndDate())
+ .ge(WmsSchedulePlanDetail::getEndDate, bo.getStartDate())
+ );
+ if (existList != null && !existList.isEmpty()) {
+ throw new RuntimeException("该产线该时间段已排产,请选择其他时间或产线!");
+ }
WmsSchedulePlanDetail add = BeanUtil.toBean(bo, WmsSchedulePlanDetail.class);
validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0;
From 69e1178fee1a9a8b0bc66d8d6322fa995bb4695d Mon Sep 17 00:00:00 2001
From: JR <3573153686@qq.com>
Date: Sat, 19 Jul 2025 09:49:44 +0800
Subject: [PATCH 2/3] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=8E=A5=E5=8F=A3?=
=?UTF-8?q?=EF=BC=8C=E6=8F=92=E5=85=A5=E9=87=87=E8=B4=AD=E8=AE=A1=E5=88=92?=
=?UTF-8?q?=EF=BC=88=E5=90=AB=E6=98=8E=E7=BB=86=EF=BC=89?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../controller/WmsPurchasePlanController.java | 7 ++++
.../klp/service/IWmsPurchasePlanService.java | 6 ++++
.../impl/WmsPurchasePlanServiceImpl.java | 33 ++++++++++++++++---
3 files changed, 41 insertions(+), 5 deletions(-)
diff --git a/klp-wms/src/main/java/com/klp/controller/WmsPurchasePlanController.java b/klp-wms/src/main/java/com/klp/controller/WmsPurchasePlanController.java
index 565e5df2..15b9ebe5 100644
--- a/klp-wms/src/main/java/com/klp/controller/WmsPurchasePlanController.java
+++ b/klp-wms/src/main/java/com/klp/controller/WmsPurchasePlanController.java
@@ -36,6 +36,13 @@ public class WmsPurchasePlanController extends BaseController {
private final IWmsPurchasePlanService iWmsPurchasePlanService;
+ /**
+ * 新增采购计划(含明细)
+ */
+ @PostMapping("/addWithDetails")
+ public R addPurchasePlan(@RequestBody WmsPurchasePlanVo planVo) {
+ return toAjax(iWmsPurchasePlanService.insertWithDetails(planVo));
+ }
/**
* 根据订单ID生成推荐采购计划(只返回,不落库)
*/
diff --git a/klp-wms/src/main/java/com/klp/service/IWmsPurchasePlanService.java b/klp-wms/src/main/java/com/klp/service/IWmsPurchasePlanService.java
index 886f0f8b..36a46652 100644
--- a/klp-wms/src/main/java/com/klp/service/IWmsPurchasePlanService.java
+++ b/klp-wms/src/main/java/com/klp/service/IWmsPurchasePlanService.java
@@ -17,6 +17,11 @@ import java.util.List;
*/
public interface IWmsPurchasePlanService {
+ /**
+ * 新增采购计划(含明细)
+ */
+ Boolean insertWithDetails(WmsPurchasePlanVo planVo);
+
/**
* 根据订单ID生成推荐采购计划(只返回,不落库)
*/
@@ -51,4 +56,5 @@ public interface IWmsPurchasePlanService {
* 校验并批量删除采购计划主信息
*/
Boolean deleteWithValidByIds(Collection ids, Boolean isValid);
+
}
diff --git a/klp-wms/src/main/java/com/klp/service/impl/WmsPurchasePlanServiceImpl.java b/klp-wms/src/main/java/com/klp/service/impl/WmsPurchasePlanServiceImpl.java
index ac973913..832f2d12 100644
--- a/klp-wms/src/main/java/com/klp/service/impl/WmsPurchasePlanServiceImpl.java
+++ b/klp-wms/src/main/java/com/klp/service/impl/WmsPurchasePlanServiceImpl.java
@@ -7,21 +7,22 @@ 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.WmsOrderDetail;
import com.klp.domain.WmsProductBom;
+import com.klp.domain.WmsPurchasePlanDetail;
import com.klp.domain.vo.WmsOrderDetailVo;
import com.klp.domain.vo.WmsPurchasePlanDetailVo;
-import com.klp.service.IWmsOrderDetailService;
-import com.klp.service.IWmsProductBomService;
-import com.klp.service.IWmsStockService;
+import com.klp.mapper.WmsPurchasePlanDetailMapper;
+import com.klp.service.*;
import lombok.RequiredArgsConstructor;
+import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import com.klp.domain.bo.WmsPurchasePlanBo;
import com.klp.domain.vo.WmsPurchasePlanVo;
import com.klp.domain.WmsPurchasePlan;
import com.klp.mapper.WmsPurchasePlanMapper;
-import com.klp.service.IWmsPurchasePlanService;
+import org.springframework.transaction.annotation.Transactional;
+import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.*;
@@ -43,6 +44,28 @@ public class WmsPurchasePlanServiceImpl implements IWmsPurchasePlanService {
private final IWmsStockService wmsStockService;
+ @Resource
+ private WmsPurchasePlanDetailMapper wmsPurchasePlanDetailMapper;
+
+ @Transactional
+ @Override
+ public Boolean insertWithDetails(WmsPurchasePlanVo planVo) {
+ // 1. 保存主表
+ WmsPurchasePlan plan = new WmsPurchasePlan();
+ BeanUtils.copyProperties(planVo, plan);
+ int flag = 0;
+ flag += baseMapper.insert(plan);
+
+ // 2. 保存明细表
+ for (WmsPurchasePlanDetailVo detailVo : planVo.getDetailList()) {
+ WmsPurchasePlanDetail detail = new WmsPurchasePlanDetail();
+ BeanUtils.copyProperties(detailVo, detail);
+ detail.setPlanId(plan.getPlanId()); // 关联主表ID
+ flag += wmsPurchasePlanDetailMapper.insert(detail);
+ }
+ return flag > 0;
+ }
+
@Override
public WmsPurchasePlanVo recommendPurchasePlanByOrder(Long orderId) {
// 1. 查询订单明细
From df2d9a3025318041603d9354ded84e1f9448a712 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E7=A0=82=E7=B3=96?=
Date: Sat, 19 Jul 2025 10:26:00 +0800
Subject: [PATCH 3/3] =?UTF-8?q?=E5=88=A0=E9=99=A4frappe-gantt?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
klp-ui/package.json | 1 -
klp-ui/src/api/wms/purchasePlan.js | 17 ++
klp-ui/src/views/wms/order/index.vue | 2 +-
.../views/wms/productionLine/GanttChart.vue | 135 ------------
klp-ui/src/views/wms/purchasePlan/index.vue | 204 +++++++++++++++++
.../views/wms/purchasePlan/panels/clac.vue | 205 ++++++++++++++----
.../views/wms/purchasePlan/panels/detail.vue | 20 ++
7 files changed, 409 insertions(+), 175 deletions(-)
delete mode 100644 klp-ui/src/views/wms/productionLine/GanttChart.vue
diff --git a/klp-ui/package.json b/klp-ui/package.json
index c5a1f7a6..7b40bc22 100644
--- a/klp-ui/package.json
+++ b/klp-ui/package.json
@@ -44,7 +44,6 @@
"echarts": "5.4.0",
"element-ui": "2.15.12",
"file-saver": "2.0.5",
- "frappe-gantt": "^1.0.3",
"fuse.js": "6.4.3",
"highlight.js": "10.5.0",
"js-beautify": "1.13.0",
diff --git a/klp-ui/src/api/wms/purchasePlan.js b/klp-ui/src/api/wms/purchasePlan.js
index 8b6322de..fde8b48d 100644
--- a/klp-ui/src/api/wms/purchasePlan.js
+++ b/klp-ui/src/api/wms/purchasePlan.js
@@ -42,3 +42,20 @@ export function delPurchasePlan(planId) {
method: 'delete'
})
}
+
+// 获取推荐的采购计划
+export function recommendPurchasePlan(orderId) {
+ return request({
+ url: '/wms/purchasePlan/recommend/' + orderId,
+ method: 'get'
+ })
+}
+
+// 创建采购计划(含明细)
+export function createPurchasePlan(data) {
+ return request({
+ url: '/wms/purchasePlan/addWithDetails',
+ method: 'post',
+ data
+ })
+}
diff --git a/klp-ui/src/views/wms/order/index.vue b/klp-ui/src/views/wms/order/index.vue
index 538046ee..64bb0c02 100644
--- a/klp-ui/src/views/wms/order/index.vue
+++ b/klp-ui/src/views/wms/order/index.vue
@@ -171,7 +171,7 @@ import ClacPanel from '../purchasePlan/panels/clac.vue';
export default {
name: "Order",
components: { OrderDetailPanel, ClacPanel },
- dict: ['order_status'],
+ dicts: ['order_status'],
data() {
return {
// 按钮loading
diff --git a/klp-ui/src/views/wms/productionLine/GanttChart.vue b/klp-ui/src/views/wms/productionLine/GanttChart.vue
deleted file mode 100644
index 88be2de0..00000000
--- a/klp-ui/src/views/wms/productionLine/GanttChart.vue
+++ /dev/null
@@ -1,135 +0,0 @@
-
-
-
-
-
- 生产任务列表
-
-
-
-
- {{ formatDate(scope.row.startDate) }}
-
-
- {{ formatDate(scope.row.endDate) }}
-
-
-
-
-
-
- 相关订单信息
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/klp-ui/src/views/wms/purchasePlan/index.vue b/klp-ui/src/views/wms/purchasePlan/index.vue
index 3c794830..233c8ae7 100644
--- a/klp-ui/src/views/wms/purchasePlan/index.vue
+++ b/klp-ui/src/views/wms/purchasePlan/index.vue
@@ -70,6 +70,15 @@
@click="handleExport"
>导出
+
+ 推荐采购计划
+
@@ -83,6 +92,12 @@
+ 详情
取 消
+
+
+