From 289555fd44430f4aa665d2e37d52de5c8a0b18f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A0=82=E7=B3=96?= <2178503051@qq.com> Date: Thu, 25 Jun 2026 15:44:26 +0800 Subject: [PATCH] =?UTF-8?q?feat(aps):=20=E6=96=B0=E5=A2=9EAPS=E6=8E=92?= =?UTF-8?q?=E4=BA=A7=E7=AE=A1=E7=90=86=E6=A8=A1=E5=9D=97=E5=AE=8C=E6=95=B4?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 本次提交完成APS(高级计划与排程)模块的全量开发: 1. 新增CRM订单相关API接口,包含列表、详情、明细查询 2. 新增产需单相关CRUD API与页面,支持排产单管理与订单绑定 3. 新增按日期查询排产单、订单下钻详情页面 4. 为排产单实体类添加日期格式化注解,修复参数绑定问题 5. 统一封装APS模块主题样式,提供通用混入与变量 6. 实现产需单与销售订单的绑定解绑、明细自动生成功能 --- .../klp/flow/domain/bo/SchProdScheduleBo.java | 3 + klp-ui/src/api/aps/order.js | 27 + klp-ui/src/api/aps/requirement.js | 120 ++ klp-ui/src/api/aps/schedule.js | 35 + klp-ui/src/views/wms/post/aps/order.vue | 445 +++++++ klp-ui/src/views/wms/post/aps/requirement.vue | 1022 +++++++++++++++++ klp-ui/src/views/wms/post/aps/schedule.vue | 316 +++++ .../views/wms/post/aps/scss/aps-theme.scss | 143 +++ 8 files changed, 2111 insertions(+) create mode 100644 klp-ui/src/api/aps/order.js create mode 100644 klp-ui/src/api/aps/requirement.js create mode 100644 klp-ui/src/api/aps/schedule.js create mode 100644 klp-ui/src/views/wms/post/aps/order.vue create mode 100644 klp-ui/src/views/wms/post/aps/requirement.vue create mode 100644 klp-ui/src/views/wms/post/aps/schedule.vue create mode 100644 klp-ui/src/views/wms/post/aps/scss/aps-theme.scss diff --git a/klp-flow/src/main/java/com/klp/flow/domain/bo/SchProdScheduleBo.java b/klp-flow/src/main/java/com/klp/flow/domain/bo/SchProdScheduleBo.java index d9bd551d5..1c6cefd97 100644 --- a/klp-flow/src/main/java/com/klp/flow/domain/bo/SchProdScheduleBo.java +++ b/klp-flow/src/main/java/com/klp/flow/domain/bo/SchProdScheduleBo.java @@ -8,6 +8,7 @@ import javax.validation.constraints.*; import java.math.BigDecimal; import java.util.Date; import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; /** * 排产单主业务对象 sch_prod_schedule @@ -33,6 +34,8 @@ public class SchProdScheduleBo extends BaseEntity { /** * 生产日期(和合同号组成业务关联键) */ + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd") private Date prodDate; /** diff --git a/klp-ui/src/api/aps/order.js b/klp-ui/src/api/aps/order.js new file mode 100644 index 000000000..f3aaea115 --- /dev/null +++ b/klp-ui/src/api/aps/order.js @@ -0,0 +1,27 @@ +import request from '@/utils/request' + +// 查询 CRM 订单列表(只读) +export function listCrmOrder(query) { + return request({ + url: '/crm/order/list', + method: 'get', + params: query + }) +} + +// 查询 CRM 订单详情 +export function getCrmOrder(orderId) { + return request({ + url: '/crm/order/' + orderId, + method: 'get' + }) +} + +// 查询 CRM 订单明细列表 +export function listCrmOrderItem(query) { + return request({ + url: '/crm/orderItem/list', + method: 'get', + params: query + }) +} diff --git a/klp-ui/src/api/aps/requirement.js b/klp-ui/src/api/aps/requirement.js new file mode 100644 index 000000000..183aeb8e1 --- /dev/null +++ b/klp-ui/src/api/aps/requirement.js @@ -0,0 +1,120 @@ +import request from '@/utils/request' + +// ====== 产需单(SchProdSchedule)CRUD ====== + +// 查询产需单列表 +export function listRequirement(query) { + return request({ + url: '/flow/prodSchedule/list', + method: 'get', + params: query + }) +} + +// 查询产需单详情 +export function getRequirement(scheduleId) { + return request({ + url: '/flow/prodSchedule/' + scheduleId, + method: 'get' + }) +} + +// 新增产需单 +export function addRequirement(data) { + return request({ + url: '/flow/prodSchedule', + method: 'post', + data + }) +} + +// 修改产需单 +export function updateRequirement(data) { + return request({ + url: '/flow/prodSchedule', + method: 'put', + data + }) +} + +// 删除产需单 +export function delRequirement(scheduleIds) { + return request({ + url: '/flow/prodSchedule/' + scheduleIds, + method: 'delete' + }) +} + +// ====== 产需单明细(SchProdScheduleDetail) ====== + +// 查询产需单明细列表 +export function listRequirementDetail(query) { + return request({ + url: '/flow/prodScheduleDetail/list', + method: 'get', + params: query + }) +} + +// 新增产需单明细 +export function addRequirementDetail(data) { + return request({ + url: '/flow/prodScheduleDetail', + method: 'post', + data + }) +} + +// 修改产需单明细 +export function updateRequirementDetail(data) { + return request({ + url: '/flow/prodScheduleDetail', + method: 'put', + data + }) +} + +// 删除产需单明细 +export function delRequirementDetail(detailIds) { + return request({ + url: '/flow/prodScheduleDetail/' + detailIds, + method: 'delete' + }) +} + +// ====== 销售订单-产需单关联(SchSaleScheduleRel) ====== + +// 查询关联列表 +export function listRel(query) { + return request({ + url: '/flow/saleScheduleRel/list', + method: 'get', + params: query + }) +} + +// 新增关联(绑定订单) +export function addRel(data) { + return request({ + url: '/flow/saleScheduleRel', + method: 'post', + data + }) +} + +// 修改关联 +export function updateRel(data) { + return request({ + url: '/flow/saleScheduleRel', + method: 'put', + data + }) +} + +// 删除关联(解绑订单) +export function delRel(relIds) { + return request({ + url: '/flow/saleScheduleRel/' + relIds, + method: 'delete' + }) +} diff --git a/klp-ui/src/api/aps/schedule.js b/klp-ui/src/api/aps/schedule.js new file mode 100644 index 000000000..bbc342279 --- /dev/null +++ b/klp-ui/src/api/aps/schedule.js @@ -0,0 +1,35 @@ +import request from '@/utils/request' + +// 按日期查询产需单列表 +export function listScheduleByDate(prodDate) { + return request({ + url: '/flow/prodSchedule/list', + method: 'get', + params: { prodDate } + }) +} + +// 查询产需单明细(用于排产单聚合) +export function listScheduleDetail(scheduleId) { + return request({ + url: '/flow/prodScheduleDetail/list', + method: 'get', + params: { scheduleId } + }) +} + +// 查询 CRM 订单信息(用于下钻) +export function getCrmOrderInfo(orderId) { + return request({ + url: '/crm/order/' + orderId, + method: 'get' + }) +} + +// 查询 CRM 订单明细(用于下钻展示) +export function getCrmOrderItem(orderDetailId) { + return request({ + url: '/crm/orderItem/' + orderDetailId, + method: 'get' + }) +} diff --git a/klp-ui/src/views/wms/post/aps/order.vue b/klp-ui/src/views/wms/post/aps/order.vue new file mode 100644 index 000000000..5d3c7608d --- /dev/null +++ b/klp-ui/src/views/wms/post/aps/order.vue @@ -0,0 +1,445 @@ + + + + + diff --git a/klp-ui/src/views/wms/post/aps/requirement.vue b/klp-ui/src/views/wms/post/aps/requirement.vue new file mode 100644 index 000000000..cb8b587e6 --- /dev/null +++ b/klp-ui/src/views/wms/post/aps/requirement.vue @@ -0,0 +1,1022 @@ + + + + + diff --git a/klp-ui/src/views/wms/post/aps/schedule.vue b/klp-ui/src/views/wms/post/aps/schedule.vue new file mode 100644 index 000000000..8c493e237 --- /dev/null +++ b/klp-ui/src/views/wms/post/aps/schedule.vue @@ -0,0 +1,316 @@ + + + + + diff --git a/klp-ui/src/views/wms/post/aps/scss/aps-theme.scss b/klp-ui/src/views/wms/post/aps/scss/aps-theme.scss new file mode 100644 index 000000000..71ced9b91 --- /dev/null +++ b/klp-ui/src/views/wms/post/aps/scss/aps-theme.scss @@ -0,0 +1,143 @@ +// ============================================ +// APS 排产管理模块 — 银灰色 + 红色主题 +// 每个页面通过 @import 引入并提供 scoped 命名空间 +// ============================================ + +// ——— 颜色变量 ——— +$aps-silver-1: #f5f5f5; // 最浅银灰(背景) +$aps-silver-2: #e8e8e8; // 浅银灰(卡片/列表行) +$aps-silver-3: #d9d9d9; // 中银灰(边框) +$aps-silver-4: #8c8c8c; // 深银灰(次要文字/图标) +$aps-silver-5: #595959; // 最深银灰(主标题/强调文字) + +$aps-red-1: #fff1f0; // 极浅红(背景高亮) +$aps-red-2: #ff4d4f; // 标准红(主按钮/标签) +$aps-red-3: #cf1322; // 深红(hover/边框强调) +$aps-red-4: #f5222d; // 辅助红 + +// ——— 混入:列表项 ——— +@mixin aps-list-item { + display: flex; + justify-content: space-between; + align-items: center; + padding: 10px 12px; + margin-bottom: 6px; + border: 1px solid $aps-silver-3; + background-color: #fff; + cursor: pointer; + transition: all 0.2s ease; + border-radius: 4px; + + &:hover { + border-color: $aps-red-2; + background-color: $aps-red-1; + } + + &.active { + border-left: 3px solid $aps-red-2; + border-color: $aps-red-2; + background-color: $aps-red-1; + box-shadow: 0 0 0 1px rgba($aps-red-2, 0.08) inset; + } +} + +// ——— 混入:银色卡片 ——— +@mixin aps-card { + background: #fff; + border: 1px solid $aps-silver-3; + border-radius: 6px; + padding: 16px; +} + +// ——— 混入:银色按钮变体 ——— +@mixin aps-btn-silver { + color: $aps-silver-5; + background: $aps-silver-1; + border-color: $aps-silver-3; + + &:hover { + color: $aps-red-2; + border-color: $aps-red-2; + background: $aps-red-1; + } +} + +// ——— 混入:红色按钮变体 ——— +@mixin aps-btn-red { + color: #fff; + background: $aps-red-2; + border-color: $aps-red-2; + + &:hover { + background: $aps-red-3; + border-color: $aps-red-3; + } +} + +// ——— 混入:状态标签 ——— +@mixin aps-status-tag($bg, $color) { + display: inline-block; + padding: 2px 8px; + border-radius: 3px; + font-size: 12px; + background: $bg; + color: $color; +} + +// ——— 详情卡片通用变量(参照 HTML 设计稿) ——— +$aps-bg: #f4f5f7; +$aps-white: #ffffff; +$aps-border: #c8cdd2; +$aps-text: #2c3e50; +$aps-text-muted: #7f8c8d; +$aps-silver-mid: #d5d8dc; +$aps-shadow-sm: 0 1px 4px rgba(0,0,0,0.08); +$aps-radius: 4px; + +// ——— 混入:详情卡片 ——— +@mixin aps-detail-card { + background: $aps-white; + border: 1px solid $aps-border; + border-radius: $aps-radius; + box-shadow: $aps-shadow-sm; + overflow: hidden; +} + +// ——— 混入:卡片头部渐变 ——— +@mixin aps-card-header { + background: linear-gradient(to right, $aps-red-2, $aps-red-3); + color: white; + padding: 8px 14px; + font-size: 13px; + font-weight: 600; + display: flex; + align-items: center; + justify-content: space-between; +} + +// ——— 混入:表单网格(2列) ——— +@mixin aps-form-grid-2 { + display: grid; + grid-template-columns: repeat(2, 1fr); + gap: 10px 16px; +} + +// ——— 混入:表单字段 ——— +@mixin aps-form-field { + display: flex; + flex-direction: column; + gap: 3px; + + label { + font-size: 11px; + color: $aps-text-muted; + font-weight: 500; + } + + .field-value { + font-size: 13px; + color: $aps-text; + padding: 4px 0; + border-bottom: 1px solid $aps-silver-mid; + } +}