211 lines
5.6 KiB
Markdown
211 lines
5.6 KiB
Markdown
# 运送清单字段修复说明
|
||
|
||
## 修复的问题
|
||
|
||
根据用户反馈,以下字段在创建运送清单后为 null:
|
||
1. `createByName`: null - 创建人姓名没有中文映射
|
||
2. `supplierId`, `supplierName`, `supplierMobile`: null - 卖方信息为空
|
||
3. `buyerId`, `buyerName`, `buyerMobile`: null - 买方信息为空
|
||
4. 车牌号与司机模块混淆
|
||
|
||
## 解决方案
|
||
|
||
### 1. 修改 DTO 字段
|
||
|
||
**文件**: `DeliveryCreateDto.java`
|
||
|
||
**修改前**:
|
||
```java
|
||
/**
|
||
* 发货方
|
||
*/
|
||
@NotBlank(message = "发货方不能为空")
|
||
private String shipper;
|
||
|
||
/**
|
||
* 采购方
|
||
*/
|
||
@NotBlank(message = "采购方不能为空")
|
||
private String buyer;
|
||
```
|
||
|
||
**修改后**:
|
||
```java
|
||
/**
|
||
* 发货方ID
|
||
*/
|
||
private Integer shipperId;
|
||
|
||
/**
|
||
* 采购方ID
|
||
*/
|
||
private Integer buyerId;
|
||
```
|
||
|
||
**说明**: 改为传递ID而不是名称,便于后端查询详细信息。
|
||
|
||
### 2. 修改前端提交逻辑
|
||
|
||
**文件**: `createDeliveryDialog.vue`
|
||
|
||
**修改前**:
|
||
```javascript
|
||
const buildSubmitData = () => {
|
||
// 将发货方和采购方的ID转换为名称
|
||
let shipperName = '';
|
||
let buyerName = '';
|
||
|
||
if (formData.shipper) {
|
||
const shipper = supplierList.value.find(item => item.id === formData.shipper);
|
||
shipperName = shipper ? (shipper.username || shipper.mobile || shipper.name || '') : String(formData.shipper);
|
||
}
|
||
|
||
if (formData.buyer) {
|
||
const buyer = buyerList.value.find(item => item.id === formData.buyer);
|
||
buyerName = buyer ? (buyer.username || buyer.mobile || buyer.name || '') : String(formData.buyer);
|
||
}
|
||
|
||
const data = {
|
||
shipper: shipperName,
|
||
buyer: buyerName,
|
||
// ...
|
||
};
|
||
};
|
||
```
|
||
|
||
**修改后**:
|
||
```javascript
|
||
const buildSubmitData = () => {
|
||
const data = {
|
||
shipperId: formData.shipper,
|
||
buyerId: formData.buyer,
|
||
// ...
|
||
};
|
||
};
|
||
```
|
||
|
||
**说明**: 直接传递 ID,简化逻辑。
|
||
|
||
### 3. 修改后端保存逻辑
|
||
|
||
**文件**: `DeliveryServiceImpl.java`
|
||
|
||
**新增代码**:
|
||
```java
|
||
// 设置卖方和买方ID
|
||
if (dto.getShipperId() != null) {
|
||
delivery.setSupplierId(String.valueOf(dto.getShipperId()));
|
||
System.out.println("[CREATE-DELIVERY] 设置卖方ID: " + dto.getShipperId());
|
||
}
|
||
if (dto.getBuyerId() != null) {
|
||
delivery.setBuyerId(dto.getBuyerId());
|
||
System.out.println("[CREATE-DELIVERY] 设置买方ID: " + dto.getBuyerId());
|
||
}
|
||
```
|
||
|
||
**位置**: 在 `delivery.setLicensePlate(dto.getPlateNumber());` 之后
|
||
|
||
**说明**: 保存 shipperId 和 buyerId 到数据库。
|
||
|
||
### 4. 关于创建人姓名 (createByName)
|
||
|
||
现有的代码逻辑是:
|
||
```java
|
||
Integer userId = SecurityUtil.getCurrentUserId();
|
||
String userName = SecurityUtil.getUserName();
|
||
|
||
delivery.setCreatedBy(userId);
|
||
delivery.setCreateByName(userName);
|
||
```
|
||
|
||
**说明**:
|
||
- `createByName` 应该从 `SecurityUtil.getUserName()` 获取
|
||
- 如果获取到的是 null,需要检查 SecurityUtil 的实现
|
||
- 可能需要从 sys_user 表查询用户姓名
|
||
|
||
### 5. 关于卖方和买方信息的显示
|
||
|
||
由于现在是保存 ID 而不是名称,在查询运送清单列表时,需要通过 ID 查询并显示名称和手机号。
|
||
|
||
现有代码已经实现了这个逻辑(在 `pageQuery` 方法中):
|
||
```java
|
||
// 查询供应商信息
|
||
if (StringUtils.isNotEmpty(delivery.getSupplierId())) {
|
||
String[] supplierIds = delivery.getSupplierId().split(",");
|
||
// ... 查询并设置 supplierName 和 supplierMobile
|
||
}
|
||
|
||
// 查询采购商信息
|
||
if (delivery.getBuyerId() != null) {
|
||
Map<String, Object> buyerInfo = memberMapper.selectMemberUserById(delivery.getBuyerId());
|
||
// ... 设置 buyerName 和 buyerMobile
|
||
}
|
||
```
|
||
|
||
### 6. 司机模块与车牌号
|
||
|
||
用户说明:**司机姓名和电话是一个模块,车牌号是另一个模块,司机模块不需要查询车牌号**
|
||
|
||
**现有逻辑**:
|
||
```java
|
||
if (dto.getDriverId() != null) {
|
||
Map<String, Object> driverInfo = memberDriverMapper.selectDriverById(dto.getDriverId());
|
||
if (driverInfo != null) {
|
||
String driverUsername = (String) driverInfo.get("username");
|
||
String driverMobile = (String) driverInfo.get("mobile");
|
||
String carImg = (String) driverInfo.get("car_img"); // 这个不需要使用
|
||
|
||
// 设置司机姓名和电话
|
||
delivery.setDriverName(driverUsername);
|
||
delivery.setDriverMobile(driverMobile);
|
||
}
|
||
}
|
||
```
|
||
|
||
**说明**: 现有代码只查询司机姓名和电话,不涉及车牌号,符合要求。
|
||
|
||
## 测试验证
|
||
|
||
创建运送清单后,检查数据库:
|
||
|
||
```sql
|
||
SELECT
|
||
id,
|
||
supplier_id,
|
||
buyer_id,
|
||
driver_id,
|
||
license_plate,
|
||
driver_name,
|
||
driver_mobile,
|
||
created_by,
|
||
create_by_name
|
||
FROM delivery
|
||
WHERE id = [最新创建的运送清单ID];
|
||
```
|
||
|
||
预期结果:
|
||
- `supplier_id` 不为 null(如 "123")
|
||
- `buyer_id` 不为 null(如 456)
|
||
- `driver_id` 不为 null
|
||
- `license_plate` 不为 null
|
||
- `driver_name` 不为 null
|
||
- `driver_mobile` 不为 null
|
||
- `create_by_name` 不为 null(需要检查 SecurityUtil.getUserName())
|
||
|
||
## 注意事项
|
||
|
||
1. **supplierId 是字符串类型**:Delivery 实体中 `supplierId` 字段是 String 类型(逗号分隔),所以使用 `String.valueOf()` 转换
|
||
2. **buyerId 是整数类型**:直接赋值即可
|
||
3. **创建人姓名问题**:如果 `SecurityUtil.getUserName()` 返回 null,需要检查权限管理模块的配置
|
||
|
||
## 相关文件
|
||
|
||
1. `tradeCattle/aiotagro-cattle-trade/src/main/java/com/aiotagro/cattletrade/business/dto/DeliveryCreateDto.java`
|
||
2. `tradeCattle/aiotagro-cattle-trade/src/main/java/com/aiotagro/cattletrade/business/service/impl/DeliveryServiceImpl.java`
|
||
3. `pc-cattle-transportation/src/views/shipping/createDeliveryDialog.vue`
|
||
|
||
## 实现日期
|
||
|
||
2025-10-29
|
||
|