# 工单物料明细功能实现说明 ## 功能概述 工单物料明细模块提供了对工单物料的完整增删改查功能,支持多表关联查询,展示物料的详细信息。 ## 已实现的功能 ### 后端接口 #### 1. 数据模型 (DO) - **文件**: `WorkOrderMaterialDO.java` - **表名**: `WorkOrdDetail` - **特点**: - 不使用多租户功能(添加了 `@InterceptorIgnore` 注解) - 不使用逻辑删除(使用 `IsActive` 字段标记状态) - 所有字段使用 `@TableField` 注解指定实际数据库字段名(大写开头) - 包含关联查询的虚拟字段(descr, opDescr, batch等) #### 2. Mapper接口 - **文件**: `WorkOrderMaterialMapper.java`, `WorkOrderMaterialMapper.xml` - **功能**: - `selectPageWithJoin`: 分页查询(多表关联) - `selectListWithJoin`: 列表查询(多表关联) - **关联表**: - `WorkOrdMaster`: 工单主表(获取Batch, QtyOrded) - `ItemMaster`: 物料主表(获取Descr物料名称) - `RoutingOpDetail`: 工序明细表(获取工序描述) - `NbrDetail`: 数量明细表(获取QtyRec收货数量) #### 3. Service服务 - **文件**: `WorkOrderMaterialService.java`, `WorkOrderMaterialServiceImpl.java` - **方法**: - `createWorkOrderMaterial`: 创建物料明细 - `updateWorkOrderMaterial`: 更新物料明细 - `deleteWorkOrderMaterial`: 删除物料明细(逻辑删除,设置IsActive=0) - `getWorkOrderMaterial`: 获取单条记录 - `getWorkOrderMaterialPage`: 分页查询 #### 4. Controller控制器 - **文件**: `WorkOrderMaterialController.java` - **接口**: - `POST /makeplan/work-order-material/create`: 创建 - `PUT /makeplan/work-order-material/update`: 更新 - `DELETE /makeplan/work-order-material/delete`: 删除 - `GET /makeplan/work-order-material/get`: 获取详情 - `GET /makeplan/work-order-material/page`: 分页查询 #### 5. VO类 - **文件**: - `WorkOrderMaterialPageReqVO.java`: 分页查询请求 - `WorkOrderMaterialRespVO.java`: 响应VO - `WorkOrderMaterialSaveReqVO.java`: 保存请求VO #### 6. Convert转换类 - **文件**: `WorkOrderMaterialConvert.java` - **功能**: DO与VO之间的对象转换 ### 前端实现 #### 1. API接口 - **文件**: `src/api/makeplan/workorderMaterial.ts` - **方法**: - `getWorkOrderMaterialPage`: 分页查询 - `getWorkOrderMaterial`: 获取详情 - `createWorkOrderMaterial`: 创建 - `updateWorkOrderMaterial`: 更新 - `deleteWorkOrderMaterial`: 删除 #### 2. 列表页面 - **文件**: `src/views/jiaohuo/WorkOrderMaterial.vue` - **功能**: - 搜索表单(工单编号、物料编号、库位) - 数据列表展示 - 分页功能 - 添加、编辑、删除、查看操作 - 根据IsActive状态显示不同背景色 #### 3. 表单组件 - **文件**: `src/views/jiaohuo/components/WorkOrderMaterialForm.vue` - **功能**: - 支持添加、编辑、查看三种模式 - 表单验证 - 字段大小写兼容处理 ## SQL语法转换说明 原始SQL Server语法已转换为MySQL语法: | SQL Server | MySQL | |-----------|-------| | `ISNULL(field, default)` | `IFNULL(field, default)` | | `cast(field as nvarchar(10)) + ' ' + field2` | `CONCAT(CAST(field AS CHAR), ' ', field2)` | | `wd.[Domain]` | `wd.Domain` | | `upper(Type)='SM'` | `UPPER(nd.Type)='SM'` | | `CAST(field as int)` | `CAST(field AS SIGNED)` | ## 查询逻辑说明 ### 多表关联查询 ```sql FROM WorkOrdDetail wd INNER JOIN WorkOrdMaster wm ON wd.Domain = wm.Domain AND wd.WorkOrd = wm.WorkOrd INNER JOIN ItemMaster im ON wd.Domain = im.Domain AND wd.ItemNum = im.ItemNum LEFT JOIN RoutingOpDetail rd ON wd.Domain = rd.Domain AND wd.ItemNum = rd.RoutingCode AND wd.Op = rd.Op LEFT JOIN NbrDetail nd ON wd.WorkOrd = nd.WorkOrd AND nd.ItemNum = wd.ItemNum AND nd.IsActive = wd.IsActive AND wd.Domain = nd.Domain AND UPPER(nd.Type) = 'SM' ``` ### 过滤条件 - 工单状态: `UPPER(wm.Status) IN ('', 'P', 'R', 'W', 'S')` - 工单类型: `UPPER(IFNULL(wm.Typed, '')) IN ('', 'RW', 'TEST', 'TCN')` ### 计算字段 - `OpDescr`: 工序号 + 工序描述 - `background`: 根据IsActive状态返回背景色 - `QtyRec`: 收货数量(默认0) ## 测试步骤 ### 1. 启动后端服务 ```bash cd yudao-server mvn spring-boot:run -Dspring-boot.run.profiles=local ``` ### 2. 启动前端服务 ```bash cd yudao-ui/yudao-ui-admin-vue3 pnpm dev ``` ### 3. 访问页面 - 登录系统 - 导航到工单物料明细页面 - 测试查询、添加、编辑、删除功能 ### 4. API测试 访问 Swagger 文档: `http://localhost:48080/doc.html` - 找到 "工单物料明细" 接口组 - 测试各个接口 ## 注意事项 1. **数据库字段命名**: 表中字段使用大写开头(如 `WorkOrd`, `ItemNum`),不是下划线命名 2. **多租户**: 该表不使用多租户功能,已添加 `@InterceptorIgnore` 注解 3. **逻辑删除**: 不使用框架的逻辑删除,使用 `IsActive` 字段(1-有效,0-已删除) 4. **字段映射**: DO类中所有字段都添加了 `@TableField` 注解指定实际字段名 5. **虚拟字段**: 关联查询的字段(descr, opDescr等)标记为 `exist = false` ## 错误码 - `1_003_002_001`: 工单物料明细不存在 ## 相关文件清单 ### 后端文件 - `yudao-module-makeplan/src/main/java/cn/iocoder/yudao/module/makeplan/dal/dataobject/workorder/WorkOrderMaterialDO.java` - `yudao-module-makeplan/src/main/java/cn/iocoder/yudao/module/makeplan/dal/mysql/workorder/WorkOrderMaterialMapper.java` - `yudao-module-makeplan/src/main/resources/mapper/workorder/WorkOrderMaterialMapper.xml` - `yudao-module-makeplan/src/main/java/cn/iocoder/yudao/module/makeplan/service/WorkOrderMaterialService.java` - `yudao-module-makeplan/src/main/java/cn/iocoder/yudao/module/makeplan/service/WorkOrderMaterialServiceImpl.java` - `yudao-module-makeplan/src/main/java/cn/iocoder/yudao/module/makeplan/controller/admin/workorder/WorkOrderMaterialController.java` - `yudao-module-makeplan/src/main/java/cn/iocoder/yudao/module/makeplan/controller/admin/workorder/vo/WorkOrderMaterialPageReqVO.java` - `yudao-module-makeplan/src/main/java/cn/iocoder/yudao/module/makeplan/controller/admin/workorder/vo/WorkOrderMaterialRespVO.java` - `yudao-module-makeplan/src/main/java/cn/iocoder/yudao/module/makeplan/controller/admin/workorder/vo/WorkOrderMaterialSaveReqVO.java` - `yudao-module-makeplan/src/main/java/cn/iocoder/yudao/module/makeplan/convert/WorkOrderMaterialConvert.java` - `yudao-module-makeplan/src/main/java/cn/iocoder/yudao/module/makeplan/enums/ErrorCodeConstants.java` ### 前端文件 - `yudao-ui/yudao-ui-admin-vue3/src/api/makeplan/workorderMaterial.ts` - `yudao-ui/yudao-ui-admin-vue3/src/views/jiaohuo/WorkOrderMaterial.vue` - `yudao-ui/yudao-ui-admin-vue3/src/views/jiaohuo/components/WorkOrderMaterialForm.vue`