+
商品销售明细
- 与下方列表同一筛选条件汇总
@@ -201,55 +153,55 @@
-
+
{{ displayText(scope.row['商品编号']) }}
-
+
{{ displayText(scope.row['商品名称']) }}
-
+
{{ formatNumber(scope.row['销售'], 4) }}
-
+
{{ displayText(scope.row['单位']) }}
-
+
{{ formatNumber(scope.row['单价'], 4) }}
-
+
{{ formatNumber(scope.row['折前销售金额'], 2) }}
-
+
{{ formatNumber(scope.row['销售金额'], 2) }}
-
+
{{ formatNumber(scope.row['成本单价'], 4) }}
-
+
{{ formatNumber(scope.row['成本金额'], 2) }}
-
+
{{ formatNumber(scope.row['费用分摊金额'], 2) }}
-
+
{{ formatNumber(scope.row['毛利'], 2) }}
-
+
{{ formatNumber(scope.row['毛利率(%)'], 2) }}
-
+
{{ formatNumber(scope.row['0单价数量'], 4) }}
-
+
{{ formatNumber(scope.row['销售权重(%)'], 2) }}
-
+
{{ formatNumber(scope.row['金额权重(%)'], 2) }}
-
+
{{ formatNumber(scope.row['利润权重(%)'], 2) }}
-
+
{{ formatNumber(scope.row['平均利润'], 4) }}
@@ -293,26 +245,6 @@ export default {
productLoading: false
}
},
- computed: {
- summaryStats() {
- const rows = Array.isArray(this.list) ? this.list : []
- let totalQty = 0
- let salesAmount = 0
- let profit = 0
- for (let i = 0; i < rows.length; i++) {
- const r = rows[i] || {}
- totalQty += this.parseNum(r['销售'])
- salesAmount += this.parseNum(r['销售金额'])
- profit += this.parseNum(r['毛利'])
- }
- return {
- rowCount: rows.length,
- totalQtyDisplay: this.formatSummaryNumber(totalQty, 4),
- salesAmountDisplay: this.formatSummaryNumber(salesAmount, 2),
- profitDisplay: this.formatSummaryNumber(profit, 2)
- }
- }
- },
created() {
this.loadFilterOptions()
this.fetchData()
@@ -332,12 +264,17 @@ export default {
maximumFractionDigits: digits
})
},
- formatSummaryNumber(n, digits) {
- if (!Number.isFinite(n)) return '无'
- return n.toLocaleString('zh-CN', {
- minimumFractionDigits: 0,
- maximumFractionDigits: digits
- })
+ /** 表头排序:按数值字段(含千分位字符串) */
+ sortNumeric(prop) {
+ return (a, b) => this.parseNum(a[prop]) - this.parseNum(b[prop])
+ },
+ /** 表头排序:文本字段 */
+ sortText(prop) {
+ return (a, b) => {
+ const sa = String(a[prop] != null ? a[prop] : '').trim()
+ const sb = String(b[prop] != null ? b[prop] : '').trim()
+ return sa.localeCompare(sb, 'zh-CN')
+ }
},
displayText(val) {
if (val == null || String(val).trim() === '') return '无'
@@ -469,105 +406,27 @@ export default {
diff --git a/Antis.Erp.Plat/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/WtXsckdInfoOutput.cs b/Antis.Erp.Plat/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/WtXsckdInfoOutput.cs
index bdfbb8b..49d19b5 100644
--- a/Antis.Erp.Plat/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/WtXsckdInfoOutput.cs
+++ b/Antis.Erp.Plat/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/WtXsckdInfoOutput.cs
@@ -114,9 +114,14 @@ namespace NCC.Extend.Entitys.Dto.WtXsckd
public string hysjh { get; set; }
///
- /// 供应商
+ /// 往来单位/供应商展示名(采购类单据可能为 wt_wldw 名称)
///
public string gys { get; set; }
+
+ ///
+ /// 与 wt_xsckd.gys 一致的主键(往来单位 wt_wldw 等,供表单下拉 value)
+ ///
+ public string gysId { get; set; }
///
/// 单据状态
diff --git a/Antis.Erp.Plat/netcore/src/Modularity/Extend/NCC.Extend/WtXsckdService.cs b/Antis.Erp.Plat/netcore/src/Modularity/Extend/NCC.Extend/WtXsckdService.cs
index 148c685..7acb546 100644
--- a/Antis.Erp.Plat/netcore/src/Modularity/Extend/NCC.Extend/WtXsckdService.cs
+++ b/Antis.Erp.Plat/netcore/src/Modularity/Extend/NCC.Extend/WtXsckdService.cs
@@ -1138,6 +1138,26 @@ namespace NCC.Extend.WtXsckd
output.hysjh = entity.Hysjh ?? "";
}
+ // 采购入库/采购退货等:gys 常为 wt_wldw 主键;详情表单用 gysId,展示用名称
+ output.gysId = entity.Gys;
+ if (!string.IsNullOrWhiteSpace(entity.Gys))
+ {
+ var wldwGysMc = await _db.Queryable()
+ .Where(w => w.Id == entity.Gys)
+ .Select(w => w.Dwmc)
+ .FirstAsync();
+ if (!string.IsNullOrWhiteSpace(wldwGysMc))
+ output.gys = wldwGysMc.Trim();
+ else
+ {
+ var legacyGysMc = await _db.Queryable()
+ .Where(g => g.Id == entity.Gys)
+ .Select(g => g.Gysmc)
+ .FirstAsync();
+ output.gys = string.IsNullOrWhiteSpace(legacyGysMc) ? entity.Gys : legacyGysMc.Trim();
+ }
+ }
+
// ✅ 经手人/制单人/审核人/过账人:与列表一致,将用户 ID 转为姓名(详情页展示)
await EnrichInfoOutputUserDisplayNamesAsync(output, entity);
@@ -1263,6 +1283,7 @@ namespace NCC.Extend.WtXsckd
.WhereIF(!string.IsNullOrEmpty(input.gzr), (xsckd, hy) => xsckd.Gzr.Equals(input.gzr))
.WhereIF(!string.IsNullOrEmpty(input.bz), (xsckd, hy) => xsckd.Bz.Contains(input.bz))
.WhereIF(!string.IsNullOrEmpty(input.kh), (xsckd, hy) => xsckd.Kh.Contains(input.kh))
+ .WhereIF(!string.IsNullOrEmpty(input.gys), (xsckd, hy) => xsckd.Gys == input.gys.Trim())
.WhereIF(!string.IsNullOrEmpty(input.hysjh), (xsckd, hy) =>
(xsckd.Hysjh != null && xsckd.Hysjh.Contains(input.hysjh)) ||
(hy.Sjh != null && hy.Sjh.Contains(input.hysjh)))
@@ -1332,6 +1353,7 @@ namespace NCC.Extend.WtXsckd
EnrichListOutputYcddhFromRemarkIfNeeded(row);
await EnrichWtXsckdListWarehouseDisplayAsync(pageRows);
await EnrichListOutputKhDisplayAsync(pageRows);
+ await EnrichListOutputGysWldwDisplayAsync(pageRows);
await EnrichListPersonDisplayFromMemberHyAsync(pageRows);
if (pageRows.Any(x => x.djlx == "销售出库单" || x.djlx == "预售出库单"))
await EnrichOutboundLinkedReturnBillsAsync(pageRows);
@@ -1467,6 +1489,48 @@ namespace NCC.Extend.WtXsckd
}
///
+ /// 列表:采购入库/采购退货等主表 gys 存 wt_wldw 主键时,将 gys 列展示为往来单位名称(原 SQL 子查 wt_gys 可能为空)。
+ ///
+ private async Task EnrichListOutputGysWldwDisplayAsync(List items)
+ {
+ if (items == null || items.Count == 0) return;
+ var targets = items.Where(x => x.djlx == "采购入库单" || x.djlx == "采购退货单").ToList();
+ if (targets.Count == 0) return;
+ var billIds = targets.Select(x => x.id).Where(id => !string.IsNullOrEmpty(id)).Select(id => id.Trim()).Distinct().ToList();
+ if (billIds.Count == 0) return;
+ var heads = await _db.Queryable()
+ .Where(x => billIds.Contains(x.Id))
+ .Select(x => new { x.Id, x.Gys })
+ .ToListAsync();
+ var gysByBill = heads
+ .Where(h => !string.IsNullOrEmpty(h.Id))
+ .ToDictionary(h => h.Id.Trim(), h => h.Gys ?? "", StringComparer.Ordinal);
+ var rawGysIds = gysByBill.Values
+ .Where(s => !string.IsNullOrWhiteSpace(s))
+ .Select(s => s.Trim())
+ .Distinct()
+ .ToList();
+ if (rawGysIds.Count == 0) return;
+ var wldwRows = await _db.Queryable()
+ .Where(w => rawGysIds.Contains(w.Id))
+ .Select(w => new { w.Id, w.Dwmc })
+ .ToListAsync();
+ var wldwDwmcById = wldwRows
+ .Where(x => !string.IsNullOrEmpty(x.Id))
+ .ToDictionary(x => x.Id.Trim(), x => x.Dwmc ?? "", StringComparer.Ordinal);
+
+ foreach (var row in targets)
+ {
+ var bid = row.id?.Trim();
+ if (string.IsNullOrEmpty(bid) || !gysByBill.TryGetValue(bid, out var rawGys) || string.IsNullOrWhiteSpace(rawGys))
+ continue;
+ var key = rawGys.Trim();
+ if (wldwDwmcById.TryGetValue(key, out var dwmc) && !string.IsNullOrWhiteSpace(dwmc))
+ row.gys = dwmc.Trim();
+ }
+ }
+
+ ///
/// 销售/预售退货单:经手人应为操作人(系统用户),非会员。
///
private static bool IsSalesOrPresaleReturnDjlx(string? djlx) =>
@@ -2268,6 +2332,7 @@ namespace NCC.Extend.WtXsckd
.WhereIF(!string.IsNullOrEmpty(input.gzr), (xsckd, hy) => xsckd.Gzr.Equals(input.gzr))
.WhereIF(!string.IsNullOrEmpty(input.bz), (xsckd, hy) => xsckd.Bz.Contains(input.bz))
.WhereIF(!string.IsNullOrEmpty(input.kh), (xsckd, hy) => xsckd.Kh.Contains(input.kh))
+ .WhereIF(!string.IsNullOrEmpty(input.gys), (xsckd, hy) => xsckd.Gys == input.gys.Trim())
.WhereIF(!string.IsNullOrEmpty(input.hysjh), (xsckd, hy) =>
(xsckd.Hysjh != null && xsckd.Hysjh.Contains(input.hysjh)) ||
(hy.Sjh != null && hy.Sjh.Contains(input.hysjh)))
@@ -2316,6 +2381,7 @@ namespace NCC.Extend.WtXsckd
EnrichListOutputYcddhFromRemarkIfNeeded(row);
await EnrichWtXsckdListWarehouseDisplayAsync(data);
await EnrichListOutputKhDisplayAsync(data);
+ await EnrichListOutputGysWldwDisplayAsync(data);
await EnrichListPersonDisplayFromMemberHyAsync(data);
await EnrichOutboundLinkedReturnBillsAsync(data);
if (data.Any(x => x.djlx == "预售出库单"))