yanhui b7aca2343b feat(配件库存监控/MKH-BOM): 新增「采购在途」数量列与在途明细弹窗,补货预警改按结余库存判定
配件库存监控:
- 列表「实时库存」后新增「采购在途数量」列,口径 SUM(MAX(0, jst_purchaseItem.qty - inQty))
- 顶部「实时库存合计」后新增可点击「采购在途」卡片,弹窗展示在途明细
  (商品编码/商品名称/采购数量/已入库/在途数量/计划到货日期/采购单号),支持关键词、排序、分页
- 新增后端接口 GET /api/modular-stock-monitor/purchase-in-transit
- 筛选器品类改直查 jst_sku 主表,避免新增 OUTER APPLY 拖慢筛选
- 采购在途列仅取数展示,不参与 ORDER BY / 聚合(规避 MSSQL 对 OUTER APPLY 列的灾难性执行计划)

MKH-BOM 补货预警:
- 日销驱动与已排产分支改用「结余库存 = 现有库存 - 待发货件数」判定可用天数与预警等级
- 建议补货量按 ceil(3 天日销 + 待发货件数 - 现有库存) 计算
- 新增 scope=work-order 范围筛选;列表新增「结余库存」列
- 打印模板剥离公司名前缀,打印字号调大

测试:mkhBomService 单测新增结余库存缓冲/紧张用例与回归用例
2026-09-18 17:44:01 +08:00

387 lines
6.8 KiB
CSS
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

.mkh-page {
padding: 16px 20px 24px;
}
.mkh-header {
margin-bottom: 14px;
}
.mkh-header__heading .ant-typography {
margin-bottom: 4px;
}
.mkh-note {
display: block;
max-width: 1180px;
margin-top: 6px;
font-size: 12px;
line-height: 1.7;
}
.mkh-filter-card {
margin-bottom: 12px;
}
.mkh-panel {
margin-top: 4px;
}
.mkh-sku {
font-family: 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, monospace;
font-size: 12px;
color: var(--sycm-text-primary);
}
.mkh-muted {
color: var(--sycm-text-tertiary);
}
.mkh-detail-loading {
padding: 12px 8px;
color: var(--sycm-text-secondary);
}
.mkh-detail {
padding: 4px 8px 8px;
}
.mkh-detail-tip {
padding: 4px 0 8px;
font-size: 12px;
}
.mkh-detail-code {
display: block;
margin-top: 2px;
font-family: 'SFMono-Regular', Consolas, Menlo, monospace;
font-size: 11px;
color: var(--sycm-text-tertiary);
}
.mkh-tag {
display: inline-block;
padding: 0 6px;
border-radius: 3px;
font-size: 12px;
line-height: 18px;
white-space: nowrap;
}
.mkh-tag--ok {
color: #0f6e56;
background: rgba(29, 158, 117, 0.14);
}
.mkh-tag--muted {
color: var(--sycm-text-tertiary);
background: rgba(136, 135, 128, 0.14);
}
.mkh-tag--src {
color: #0958d9;
background: rgba(22, 119, 255, 0.12);
}
/* ============ 补货预警 ============ */
.mkh-alert {
margin-bottom: 12px;
}
/* 缺货 */
.mkh-tag--danger {
color: #a8071a;
background: rgba(255, 77, 79, 0.14);
}
/* 预警 */
.mkh-tag--warn {
color: #ad4e00;
background: rgba(250, 173, 20, 0.2);
}
/* 可用天数低于阈值 */
.mkh-days--warn {
color: #cf1322;
font-weight: 600;
}
/* 建议补货量 */
.mkh-replenish {
color: #0958d9;
font-weight: 600;
}
/* 已排产:半成品包装仓已有未完成加工单,按业务口径不再预警 */
.mkh-tag--scheduled {
color: #0958d9;
background: rgba(22, 119, 255, 0.14);
}
/* 在途加工量(未完成加工单待入库数量) */
.mkh-inbound {
color: #0958d9;
font-weight: 600;
}
/* 待发货订单(聚水潭未发货订单件数,见文件头 ⑩) */
.mkh-order {
color: #ad4e00;
font-weight: 600;
}
/* 配件不足(可组装数 = 0,补不出来,见文件头 ⑪):与「缺货」红标签并排,用紫灰区分 */
.mkh-tag--shortage {
color: #722ed1;
background: rgba(114, 46, 209, 0.14);
border-color: rgba(114, 46, 209, 0.35);
}
/* ============ A4 打印预览 ============ */
.mkh-print-mask {
position: fixed;
inset: 0;
z-index: 2000;
overflow: auto;
background: rgba(0, 0, 0, 0.55);
padding: 24px 0 40px;
}
.mkh-print-toolbar {
position: sticky;
top: 0;
z-index: 2;
display: flex;
justify-content: center;
padding: 12px;
margin-bottom: 16px;
}
.mkh-print-sheet {
width: 210mm;
min-height: 297mm;
margin: 0 auto;
padding: 14mm 12mm;
background: #fff;
color: #000;
box-shadow: 0 6px 24px rgba(0, 0, 0, 0.35);
box-sizing: border-box;
font-family: -apple-system, 'PingFang SC', 'Microsoft YaHei', Arial, sans-serif;
font-size: 12px;
line-height: 1.5;
}
.mkh-print-head {
text-align: center;
border-bottom: 2px solid #000;
padding-bottom: 10px;
margin-bottom: 12px;
}
.mkh-print-title {
font-size: 22px;
font-weight: 700;
letter-spacing: 2px;
}
.mkh-print-sub {
margin-top: 4px;
font-size: 12px;
color: #444;
}
.mkh-print-meta {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 4px 24px;
margin-bottom: 12px;
font-size: 13px;
}
.mkh-print-meta > div {
display: flex;
}
.mkh-print-meta span {
color: #555;
min-width: 78px;
}
.mkh-print-table {
width: 100%;
border-collapse: collapse;
font-size: 12px;
}
.mkh-print-table th,
.mkh-print-table td {
border: 1px solid #000;
padding: 6px 8px;
text-align: left;
word-break: break-all;
}
.mkh-print-table thead th {
background: #f2f2f2;
font-weight: 700;
}
.mkh-print-table .mkh-center {
text-align: center;
}
.mkh-print-table .mkh-muted {
color: #999;
}
.mkh-print-table .mkh-print-sku {
font-family: 'SFMono-Regular', Consolas, Menlo, monospace;
/* 2026-09-18 业务要求调大:原来是 11px,车间核对编码时太小 */
font-size: 14px;
font-weight: 700;
letter-spacing: 0.3px;
vertical-align: middle;
}
.mkh-print-code {
display: block;
margin-top: 2px;
font-family: 'SFMono-Regular', Consolas, Menlo, monospace;
/* 2026-09-18 业务要求调大:原来是 10px / #666,扫码与人工核对都偏小偏淡 */
font-size: 12px;
font-weight: 600;
color: #222;
}
.mkh-print-foot {
margin-top: 16px;
padding-top: 8px;
border-top: 1px dashed #999;
font-size: 11px;
color: #666;
}
/* 打印时只输出 A4 纸张,隐藏其余界面 */
@media print {
body * {
visibility: hidden !important;
}
.mkh-print-sheet,
.mkh-print-sheet * {
visibility: visible !important;
}
.mkh-print-toolbar {
display: none !important;
}
.mkh-print-mask {
position: absolute !important;
inset: 0 !important;
background: #fff !important;
overflow: visible !important;
padding: 0 !important;
}
.mkh-print-sheet {
width: 210mm;
min-height: auto;
margin: 0 !important;
padding: 0 !important;
box-shadow: none !important;
}
@page {
size: A4;
margin: 12mm;
}
}
/* ── 补货预警推送设置弹窗 ──────────────────────────── */
.mkh-alert-form {
display: flex;
flex-direction: column;
gap: 12px;
margin-top: 16px;
}
.mkh-alert-row {
display: flex;
align-items: center;
gap: 10px;
}
.mkh-alert-label {
flex: none;
width: 68px;
color: var(--sycm-text-secondary);
}
.mkh-alert-meta {
margin-top: 14px;
padding: 10px 12px;
border: 1px solid var(--sycm-border-color);
border-radius: 8px;
background: var(--sycm-bg-subtle);
font-size: 12px;
line-height: 2;
color: var(--sycm-text-secondary);
}
.mkh-alert-result {
margin-top: 14px;
}
.mkh-alert-result-body {
font-size: 12px;
line-height: 1.8;
}
.mkh-alert-preview {
margin-top: 8px;
padding: 10px 12px;
border: 1px solid var(--sycm-border-color);
border-radius: 8px;
background: var(--sycm-bg-container);
}
.mkh-alert-preview-title {
margin-bottom: 6px;
font-weight: 600;
color: var(--sycm-text-strong);
}
.mkh-alert-preview pre {
margin: 0 0 6px;
font-family: inherit;
font-size: 12px;
line-height: 1.8;
white-space: pre-wrap;
word-break: break-word;
color: var(--sycm-text-primary);
}
.mkh-alert-hint {
margin-top: 10px;
font-size: 12px;
line-height: 1.7;
color: var(--sycm-text-tertiary);
}
/* 推送通道(统一通知中心)折叠区 */
.mkh-alert-center {
margin-top: 6px;
}
.mkh-alert-center .ant-collapse-header {
padding: 8px 0 !important;
}
.mkh-alert-center .ant-collapse-content-box {
padding: 0 0 4px !important;
}
.mkh-alert-form--inner {
margin-top: 4px;
}