3d98506d
“wangming”
feat: 增强合同管理功能
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
|
# 储扣表 F_ItemCategory 字段为空问题梳理
## 问题描述
储扣表(lq_kd_deductinfo)中的 `F_ItemCategory` 字段有时候是空的。
## 数据库统计
- 总有效记录数:1865
- 有分类字段的记录数:1863
- 分类字段为空的记录数:2
## 问题分析
### 1. 创建开单时的逻辑(第910行)
```csharp
ItemCategory = await _db.Queryable<LqXmzlEntity>()
.Where(x => x.Id == item.ItemId)
.Select(x => x.Qt2)
.FirstAsync(),
```
- 使用 `item.ItemId` 查询品项分类
- 如果 `item.ItemId` 为空或无效,查询会返回 null
### 2. 更新开单时的逻辑(第1257行)
```csharp
ItemCategory = await _db.Queryable<LqXmzlEntity>()
.Where(x => x.Id == item.DeductId) // ❌ 错误:应该使用 item.ItemId
.Select(x => x.Qt2)
.FirstAsync()
```
- **问题**:使用了 `item.DeductId` 而不是 `item.ItemId`
- `DeductId` 是品项明细表(lq_kd_pxmx)的ID,不是项目资料表(lq_xmzl)的ID
- 这会导致查询不到结果,返回 null
### 3. 字段说明
- **DeductId**:扣减品项关联ID,对应 `lq_kd_pxmx.F_Id`(品项明细表的主键)
- **ItemId**:品项id,对应 `lq_xmzl.F_Id`(项目资料表的主键)
- **ItemCategory**:品项分类,应该从 `lq_xmzl.qt2` 获取
### 4. 导致空值的原因
1. **更新开单时使用了错误的字段**:使用 `item.DeductId` 而不是 `item.ItemId`
2. **查询不到结果**:如果 `item.ItemId` 为空或无效,`FirstAsync()` 会返回 null
3. **品项不存在或无效**:如果品项在 `lq_xmzl` 表中不存在或无效,查询也会返回 null
## 解决方案
### ✅ 方案1:修复更新开单时的逻辑(已修复)
将第1257行的 `item.DeductId` 改为 `item.ItemId`,与创建开单时的逻辑保持一致。
**修复代码**:
```csharp
// 修复前(错误)
ItemCategory = await _db.Queryable<LqXmzlEntity>()
.Where(x => x.Id == item.DeductId) // ❌ 错误
.Select(x => x.Qt2)
.FirstAsync()
// 修复后(正确)
ItemCategory = await _db.Queryable<LqXmzlEntity>()
.Where(x => x.Id == item.ItemId) // ✅ 正确
.Select(x => x.Qt2)
.FirstAsync()
```
### ✅ 方案2:修复历史数据(已提供SQL脚本)
对于已经存在的空值记录,执行 `sql/修复储扣表ItemCategory字段为空的数据.sql` 脚本修复。
### 方案3:增加容错处理(可选)
在查询时增加容错处理,如果查询不到结果,尝试从其他途径获取分类。
## 验证
从数据库查询结果看:
- F_ItemId = '76',对应的 lq_xmzl 表中 qt2 = '科美'(存在且有效)
- F_ItemId = '100024',对应的 lq_xmzl 表中 qt2 = '科美'(存在且有效)
说明这些记录的 `ItemId` 是有效的,问题应该是在更新开单时使用了错误的字段。
|