# 工单下达列表数据不显示问题修复总结
## 问题描述
工单下达列表页面不显示数据,但数据库中实际存在4条状态为'P'的工单记录。
## 问题原因
### 1. SQL Server语法与MySQL不兼容
原始的Mapper XML使用了SQL Server的语法,但项目使用的是MySQL数据库。
### 2. 具体问题点
#### 问题1:状态字段大小写不匹配
- **原SQL**: `WHERE a.Status = 'p'`
- **数据库实际值**: `Status = 'P'` (大写)
- **修复**: `WHERE UPPER(a.Status) = 'P'`
#### 问题2:ISNULL函数不兼容
- **原SQL**: `ISNULL(nm.Nbr, '')`
- **问题**: ISNULL是SQL Server函数,MySQL使用IFNULL
- **修复**: `IFNULL(nm.Nbr, '')`
#### 问题3:字符串拼接语法不兼容
- **原SQL**: `b.ItemNum + b.Descr + b.Descr1`
- **问题**: SQL Server使用+拼接,MySQL使用CONCAT
- **修复**: `CONCAT(IFNULL(b.ItemNum, ''), IFNULL(b.Descr, ''), IFNULL(b.Descr1, ''))`
#### 问题4:日期格式转换函数不兼容
- **原SQL**: `CONVERT(VARCHAR(10), a.OrdDate, 120)`
- **问题**: CONVERT是SQL Server函数
- **修复**: `DATE_FORMAT(a.OrdDate, '%Y-%m-%d')`
## 修复内容
### 修改文件
`yudao-order-server/src/main/resources/mapper/order/WorkOrdMasterMapper.xml`
### 修改前后对比
#### 修改1:状态查询条件
```xml
WHERE a.Status = 'p'
WHERE UPPER(a.Status) = 'P'
```
#### 修改2:NULL值处理和字符串拼接
```xml
ISNULL(nm.Nbr, '') as PrevNbr,
ISNULL(nm1.Nbr, '') as Nbr,
b.ItemNum + b.Descr + b.Descr1 as wl,
IFNULL(nm.Nbr, '') as PrevNbr,
IFNULL(nm1.Nbr, '') as Nbr,
CONCAT(IFNULL(b.ItemNum, ''), IFNULL(b.Descr, ''), IFNULL(b.Descr1, '')) as wl,
```
#### 修改3:日期格式转换
```xml
AND CONVERT(VARCHAR(10), a.OrdDate, 120) = #{reqVO.ordDate}
AND DATE_FORMAT(a.OrdDate, '%Y-%m-%d') = #{reqVO.ordDate}
```
## 验证结果
### 测试SQL
```sql
SELECT
a.RecID as id,
a.Domain,
a.Drawing,
a.DueDate,
a.Typed,
a.WorkOrd,
a.Batch,
a.Priority,
a.OrdDate,
a.ItemNum,
a.Project,
a.QtyOrded,
a.QtyCompleted,
a.Remark,
LOWER(a.Status) as Status,
a.WoTyped,
b.Descr,
b.Descr1,
a.lbrvar,
m.MaterialSituation,
IFNULL(nm.Nbr, '') as PrevNbr,
IFNULL(nm1.Nbr, '') as Nbr,
CONCAT(IFNULL(b.ItemNum, ''), IFNULL(b.Descr, ''), IFNULL(b.Descr1, '')) as wl,
CASE WHEN a.CreateGLforLaborVar = 1 THEN '是' ELSE '否' END as CreateGLforLaborVar
FROM WorkOrdMaster a
LEFT JOIN ItemMaster b ON a.ItemNum = b.ItemNum AND b.Domain = '8010'
LEFT JOIN mes_morder m ON a.WorkOrd = m.morder_no AND a.Domain = m.factory_id
LEFT JOIN NbrMaster nm ON a.Domain = nm.Domain AND a.WorkOrd = nm.WorkOrd AND nm.Type = 'SM' AND nm.TransType = 'PrevProcess'
LEFT JOIN NbrMaster nm1 ON a.Domain = nm1.Domain AND a.WorkOrd = nm1.WorkOrd AND nm1.Type = 'SM' AND nm1.TransType = ''
WHERE UPPER(a.Status) = 'P'
ORDER BY a.Priority DESC, a.OrdDate ASC
```
### 查询结果
成功返回4条工单记录:
1. M500000016 - 3192B0196 - 套安装板 (Priority: 4)
2. M500000015 - 3192B0194 - .5固定套 (Priority: 3)
3. M500000014 - 3192B0195 - 安装板 (Priority: 2)
4. M500000013 - 3123C0075 - 剪头垫 (Priority: 1)
## SQL Server vs MySQL 语法对照表
| 功能 | SQL Server | MySQL |
|------|-----------|-------|
| NULL值处理 | ISNULL(expr, value) | IFNULL(expr, value) |
| 字符串拼接 | str1 + str2 + str3 | CONCAT(str1, str2, str3) |
| 日期格式化 | CONVERT(VARCHAR(10), date, 120) | DATE_FORMAT(date, '%Y-%m-%d') |
| 大小写转换 | UPPER(str), LOWER(str) | UPPER(str), LOWER(str) (相同) |
## 注意事项
1. **数据库兼容性**
- 项目使用MySQL数据库,所有SQL语句必须使用MySQL语法
- 避免使用SQL Server特有的函数和语法
2. **字段大小写**
- 数据库中Status字段存储的是大写'P'
- 查询时使用UPPER()函数确保大小写不敏感
3. **NULL值处理**
- 在字符串拼接前必须使用IFNULL处理NULL值
- 否则CONCAT遇到NULL会返回NULL
4. **日期格式**
- MySQL使用DATE_FORMAT函数
- 格式字符串使用%Y-%m-%d表示年-月-日
## 后续建议
1. **代码审查**
- 检查其他Mapper XML文件是否存在类似的SQL Server语法
- 统一使用MySQL兼容的SQL语法
2. **测试覆盖**
- 添加单元测试验证Mapper查询功能
- 测试各种筛选条件的组合
3. **文档更新**
- 在开发文档中明确说明使用MySQL数据库
- 提供SQL语法规范和最佳实践
4. **数据库配置**
- 确认application.yaml中的数据库配置正确
- 验证连接池和事务配置
## 修复时间
2025-01-14
## 修复人员
Kiro AI Assistant
## 状态
✅ 已修复并验证