youruo 0e77a70c33 feat: 每日进销存支持导入聚水潭官方进销存校正数据
业务库只能还原 4/12 个流水列且口径与聚水潭不一致(采购按单据日期、销售按订单发货日期,
jst_salesOutboundInfo.qty 全为 0),调拨/盘点/加工/其它出入库无单据表,故以官方导出为准:

- 新增本地表 daily_inventory_official(biz_date + warehouse 存期初/12 流水列/期末)
- 新增解析与导入服务:xlsx 解析、仓库 ID 映射、「期初+流水=期末」恒等式校验
- GET /api/daily-inventory 支持 ?date= 指定业务日,官方值优先、缺失回退推算并返回来源标记
- 新增 POST /api/daily-inventory/official-import(xlsx 上传/JSON)与 GET /official 查询
- 导入后回写本地库存快照(官方期初→上一日期末、官方期末→当日期末),使推算也对齐
- 前端:业务日切换、官方/推算来源标记、导入弹窗、口径说明同步更新
- 仓库清单补入「简尚-横林三仓主仓」(聚水潭导出中存在)
- 命令行导入:npm run inventory:import-official -- <日期> <xlsx>
2026-09-27 14:16:06 +08:00

185 lines
3.2 KiB
CSS

.daily-inventory-page {
padding: 16px 20px 24px;
display: flex;
flex-direction: column;
gap: 12px;
}
.daily-inventory-header {
display: flex;
flex-wrap: wrap;
align-items: center;
justify-content: space-between;
gap: 12px;
}
.daily-inventory-header__title {
display: flex;
align-items: center;
gap: 4px;
}
.daily-inventory-header__help {
font-size: 13px;
}
.daily-inventory-header__meta {
display: flex;
flex-wrap: wrap;
gap: 16px;
font-size: 13px;
color: rgba(0, 0, 0, 0.55);
}
.daily-inventory-th-tip {
border-bottom: 1px dashed rgba(0, 0, 0, 0.35);
cursor: help;
white-space: nowrap;
}
.daily-inventory-table .ant-table-thead > tr > th {
white-space: nowrap;
font-size: 12px;
padding: 6px 8px;
}
.daily-inventory-table .ant-table-tbody > tr > td {
padding: 5px 8px;
font-size: 13px;
}
/* 运行时取数的列:加淡蓝底纹,与基准值区分 */
.daily-inventory-table .daily-inventory-col--runtime {
background: rgba(22, 119, 255, 0.04);
}
/* 暂无单据来源的列:淡灰底纹,提示该列待 DBA 补表 */
.daily-inventory-table .daily-inventory-col--unavailable {
background: rgba(0, 0, 0, 0.03);
}
.daily-inventory-cell--na {
color: rgba(0, 0, 0, 0.25);
}
.daily-inventory-warehouse {
white-space: nowrap;
}
.daily-inventory-cell--out {
color: #cf1322;
}
.daily-inventory-cell--in {
color: rgba(0, 0, 0, 0.85);
}
.daily-inventory-cell--zero {
color: rgba(0, 0, 0, 0.3);
}
/* 业务库推算值:标灰 + 斜体,提示与聚水潭官方口径存在差异 */
.daily-inventory-cell--derived {
color: rgba(0, 0, 0, 0.42);
font-style: italic;
}
/* 仓库名后的来源标签 */
.daily-inventory-tag {
margin-left: 6px;
transform: scale(0.85);
transform-origin: left center;
}
/* 导入聚水潭进销存弹窗 */
.daily-inventory-import {
display: flex;
flex-direction: column;
gap: 12px;
}
.daily-inventory-import-row {
display: flex;
align-items: center;
gap: 10px;
}
.daily-inventory-import-label {
width: 72px;
color: rgba(0, 0, 0, 0.75);
}
.daily-inventory-row--total > td {
font-weight: 600;
background: rgba(0, 0, 0, 0.03);
}
/* 定时截图通知设置弹窗 */
.daily-inventory-notify-form {
display: flex;
flex-direction: column;
gap: 10px;
}
.daily-inventory-notify-row {
display: flex;
align-items: center;
gap: 8px;
flex-wrap: wrap;
}
.daily-inventory-notify-label {
width: 120px;
flex: none;
color: rgba(0, 0, 0, 0.75);
}
.daily-inventory-notify-recipients {
display: flex;
flex-wrap: wrap;
gap: 6px;
margin-left: 128px;
min-height: 24px;
}
.daily-inventory-notify-meta {
margin-top: 14px;
padding-top: 12px;
border-top: 1px solid rgba(0, 0, 0, 0.08);
display: flex;
flex-direction: column;
gap: 4px;
font-size: 13px;
}
.daily-inventory-notify-runs {
margin-top: 12px;
display: flex;
flex-direction: column;
gap: 4px;
font-size: 12px;
}
.daily-inventory-notify-run {
display: flex;
align-items: center;
gap: 10px;
color: rgba(0, 0, 0, 0.6);
}
.daily-inventory-footer {
font-size: 12px;
}
.daily-inventory-help p {
margin: 0 0 6px;
line-height: 1.7;
font-size: 13px;
white-space: pre-wrap;
}
.daily-inventory-help p.is-indent {
padding-left: 16px;
color: rgba(0, 0, 0, 0.65);
}