计划联动看板功能已完整实现,包括前后端所有代码和文档。
LinkagePlanDO.java - 数据对象,所有日期字段使用String类型LinkagePlanMapper.java - MyBatis Mapper,包含存储过程调用和分页查询LinkagePlanMapper.xml - MyBatis XML映射文件LinkagePlanService.java - 服务接口LinkagePlanServiceImpl.java - 服务实现,支持初始加载时执行存储过程LinkagePlanController.java - REST控制器,提供/list和/page两个接口LinkagePlanPageReqVO.java - 分页请求VOLinkagePlanRespVO.java - 响应VO,所有日期字段使用String类型LinkagePlanConvert.java - MapStruct转换器src/api/jiaohuo/linkagePlan.ts - API接口定义src/views/jiaohuo/LinkagePlan.vue - 计划联动看板页面
sql/mysql/pr_Mes_LinkagePlan_fixed.sql - MySQL存储过程sql/mysql/pr_Mes_LinkagePlan_USAGE.md - 存储过程使用说明LINKAGE_PLAN_IMPLEMENTATION.md - 实现说明文档LINKAGE_PLAN_COMPLETION.md - 本完成总结文档pr_Mes_LinkagePlan('') 刷新数据LinkagePlan表没有tenant_id字段,使用@InterceptorIgnore(tenantLine = "true")注解禁用自动租户过滤。
@Mapper
public interface LinkagePlanMapper extends BaseMapperX<LinkagePlanDO> {
@InterceptorIgnore(tenantLine = "true")
void executeLinkagePlanProcedure();
@InterceptorIgnore(tenantLine = "true")
default PageResult<LinkagePlanDO> selectPage(LinkagePlanPageReqVO reqVO) {
// ...
}
}
数据库字段名包含大写字母,使用@TableField注解精确映射。
@TableField("ItemType")
private String itemType;
@TableField("Descr")
private String descr;
@TableField("Descr1")
private String descr1;
Service层使用@Transactional确保存储过程执行和查询的原子性。
@Override
@Transactional(rollbackFor = Exception.class)
public PageResult<LinkagePlanRespVO> getLinkagePlanPage(LinkagePlanPageReqVO pageReqVO) {
if (Boolean.TRUE.equals(pageReqVO.getInitialLoad())) {
linkagePlanMapper.executeLinkagePlanProcedure();
}
return LinkagePlanConvert.INSTANCE.convertPage(
linkagePlanMapper.selectPage(pageReqVO)
);
}
根据type字段判断如何格式化日期字段。
const formatDate = (date: string | undefined, type: string) => {
if (!date) return ''
// 偏差类型显示天数
if (type === '偏差') {
const days = parseInt(date)
if (isNaN(days)) return date
return days > 0 ? `+${days}天` : days < 0 ? `${days}天` : '0天'
}
// 其他类型显示日期
return date.substring(0, 10)
}
| 问题 | 错误信息 | 解决方案 |
|---|---|---|
| 表名错误 | Table 'linkage_plan_resp_v_o' doesn't exist |
创建DO类,Mapper使用DO而非VO |
| 租户字段不存在 | Unknown column 'tenant_id' |
添加@InterceptorIgnore注解 |
| 字段名大小写 | Unknown column 'item_type' |
使用@TableField注解映射 |
| 日期类型转换 | Cannot convert string '0' to LocalDateTime |
所有日期字段改为String类型 |
需要在系统管理中配置:
S1产销协同 => 产销协同看板 => 计划联动看板/jiaohuo/linkage-planjiaohuo/LinkagePlanorder:linkage-plan:queryorder:linkage-plan:query确保已执行存储过程创建脚本:
mysql -u root -p < sql/mysql/pr_Mes_LinkagePlan_fixed.sql
GET /admin-api/order/linkage-plan/list
请求参数:
{
"billNo": "订单编号(可选,模糊匹配)",
"customNo": "客户编码(可选,模糊匹配)",
"orderType": "订单类型(可选,计划/销售)",
"itemNumber": "物料代码(可选)",
"pageNo": 1,
"pageSize": 20,
"initialLoad": true
}
响应数据:
{
"code": 0,
"data": {
"list": [...],
"total": 100
},
"msg": "success"
}
S1产销协同 => 产销协同看板 => 计划联动看板@Resource
private LinkagePlanService linkagePlanService;
public void example() {
LinkagePlanPageReqVO reqVO = new LinkagePlanPageReqVO();
reqVO.setBillNo("SO2024001");
reqVO.setPageNo(1);
reqVO.setPageSize(20);
reqVO.setInitialLoad(true); // 执行存储过程
PageResult<LinkagePlanRespVO> result = linkagePlanService.getLinkagePlanPage(reqVO);
}
yudao-order-server/src/main/java/cn/iocoder/yudao/module/order/
├── controller/admin/linkage/
│ ├── LinkagePlanController.java
│ └── vo/
│ ├── LinkagePlanPageReqVO.java
│ └── LinkagePlanRespVO.java
├── service/
│ ├── LinkagePlanService.java
│ └── impl/
│ └── LinkagePlanServiceImpl.java
├── dal/
│ ├── dataobject/
│ │ └── LinkagePlanDO.java
│ └── mysql/
│ └── LinkagePlanMapper.java
└── convert/
└── LinkagePlanConvert.java
yudao-order-server/src/main/resources/mapper/order/
└── LinkagePlanMapper.xml
yudao-ui/yudao-ui-admin-vue3/src/
├── api/jiaohuo/
│ └── linkagePlan.ts
└── views/jiaohuo/
└── LinkagePlan.vue
sql/mysql/
├── pr_Mes_LinkagePlan_fixed.sql
└── pr_Mes_LinkagePlan_USAGE.md
yudao-order-server/
├── LINKAGE_PLAN_IMPLEMENTATION.md
└── LINKAGE_PLAN_COMPLETION.md
计划联动看板功能已完整实现,包括:
所有代码已通过类型检查和语法验证,可以直接部署使用。只需完成系统菜单和权限配置,即可投入生产环境。