3. 开发环境搭建:工单管理系统的地基工程

说实话,做MES工单管理开发,最怕什么?最怕项目还没开始写业务代码,光搭环境就折腾一整天。我见过太多新手在Spring Boot版本冲突、MyBatis Plus配置、数据库连接池这些地方卡住。今天咱们就把这些基础工作一次性搞定,后面写业务代码才能行云流水。

本章核心目标:搭建一个可直接运行的Spring Boot项目,集成MyBatis Plus、MySQL、Swagger,为工单CRUD操作打下坚实基础。

3.1 Spring Boot项目初始化——选对版本很重要

我个人习惯用 Spring Initializr(start.spring.io)来生成项目骨架。为什么不用IDE自带的?因为网页版能直观看到依赖版本,避免踩坑。

这里有个经验:Spring Boot 2.7.x 系列是目前MES项目最稳妥的选择。3.0以上版本虽然新,但很多老牌MES中间件(比如某些报表引擎)还没完全适配。我在一个项目中就吃过这个亏——升级到3.1后,发现公司自研的工单打印组件不兼容,回退花了半天。

选好以下依赖:

  • Spring Web —— 提供RESTful API能力
  • Spring Boot DevTools —— 热部署,开发必备
  • Lombok —— 减少getter/setter模板代码
  • MySQL Driver —— 数据库连接
  • Spring Configuration Processor —— 配置文件智能提示

生成后解压,用IDEA打开。嗯,这里要注意:pom.xml里的parent版本号,一定要确认是2.7.x。我曾经遇到过同事直接用了3.0.0,结果MyBatis Plus的自动配置失效,排查了一下午才发现是版本不匹配。

3.2 MyBatis Plus配置——少写80%的SQL

做MES工单管理,数据操作量非常大。工单创建、状态流转、工序报工……如果每个都手写SQL,那得累死。MyBatis Plus就是来解决这个问题的。

在pom.xml里加入:

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.5.3.1</version>
</dependency>

为什么选3.5.3.1?因为这是目前最稳定的版本,支持Lambda查询,而且分页插件配置简单。我之前用过3.4.x,分页插件需要手动注入Bean,3.5.x直接自动配置了,省事不少。

配置application.yml:

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/mes_workorder?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
    username: root
    password: your_password
    driver-class-name: com.mysql.cj.jdbc.Driver

mybatis-plus:
  global-config:
    db-config:
      id-type: auto
      logic-delete-field: deleted
      logic-delete-value: 1
      logic-not-delete-value: 0
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    map-underscore-to-camel-case: true

小技巧:开发阶段一定要开启 log-impl: StdOutImpl,这样控制台会打印每一条SQL。调试工单查询时,你能直观看到MyBatis Plus生成的SQL对不对。上线前记得关掉,否则日志会爆炸。

再配置分页插件(这是MES工单列表查询的刚需):

@Configuration
public class MyBatisPlusConfig {
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }
}

说白了,有了这个配置,你写工单分页查询时,只需要调用 page() 方法,MyBatis Plus自动帮你算总数、分页、排序。我在做工单列表接口时,10分钟就搞定了分页逻辑。

3.3 MySQL数据库连接——字符集和时区是隐形炸弹

数据库连接看似简单,但有两个坑我必须要说:

  1. 字符集问题:工单描述里可能有中文、特殊符号(比如产品型号带®标记)。如果数据库字符集不是utf8mb4,存进去就会变成乱码。我曾经排查过一个工单描述显示为"????"的问题,最后发现是建库时用了默认的latin1。
  2. 时区问题:MES系统通常跨车间、跨工厂,工单的创建时间、计划时间必须统一时区。建议在连接URL里强制指定 serverTimezone=Asia/Shanghai,避免服务器时区不一致导致时间错乱。

建库SQL示例:

CREATE DATABASE mes_workorder 
  DEFAULT CHARACTER SET utf8mb4 
  DEFAULT COLLATE utf8mb4_unicode_ci;

连接池推荐用 HikariCP(Spring Boot 2.x默认就是它)。性能好,配置简单。我一般只调两个参数:

spring:
  datasource:
    hikari:
      maximum-pool-size: 20
      minimum-idle: 5

为什么是20?因为MES工单模块的并发量通常不会太高(车间工人同时操作的数量有限),20个连接足够应对日常操作。设太大反而浪费数据库资源。

3.4 Swagger接口文档集成——让前端和后端少吵架

做MES工单接口开发,最烦的就是前端跑来问:「这个工单创建接口的参数是什么格式?」「状态字段传数字还是字符串?」有了Swagger,这些问题迎刃而解。

集成Swagger 3(OpenAPI 3.0规范):

<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-boot-starter</artifactId>
    <version>3.0.0</version>
</dependency>

配置Swagger:

@Configuration
@EnableOpenApi
public class SwaggerConfig {
    @Bean
    public Docket createRestApi() {
        return new Docket(DocumentationType.OAS_30)
                .apiInfo(apiInfo())
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.mes.workorder.controller"))
                .paths(PathSelectors.any())
                .build();
    }

    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("MES工单管理模块 API文档")
                .description("涵盖工单创建、查询、状态流转、报工等接口")
                .version("1.0.0")
                .build();
    }
}

避坑指南:我曾经在Spring Boot 2.6.x版本集成Swagger 3时,遇到启动报错 Failed to start bean 'documentationPluginsBootstrapper'。原因是Spring Boot 2.6.x默认开启了路径匹配策略,和Swagger冲突。解决方案是在application.yml里加一行:

spring:
  mvc:
    pathmatch:
      matching-strategy: ant_path_matcher

这个坑我踩过,所以提前告诉你。

启动项目后,访问 http://localhost:8080/swagger-ui/index.html,就能看到工单接口的在线文档。你想想看,前端同事直接在这里测试接口,不用你每次手动写调用示例,是不是省了很多沟通成本?

3.5 本章知识体系总览

下面这张图,是我梳理的工单管理模块开发环境的核心架构。你看一眼,就能明白各个组件之间的关系:

MES工单管理模块 - 开发环境架构 Spring Boot 2.7.x 核心框架 MyBatis Plus 3.5.3 ORM框架 · 自动CRUD 分页插件 · Lambda查询 MySQL 8.0 数据库 utf8mb4字符集 HikariCP连接池 Swagger 3.0 文档 OpenAPI 3.0规范 在线接口调试 工单数据表:wo_order(工单主表)、wo_order_detail(工单明细表) 状态字段:status(0-待生产 1-生产中 2-已完成 3-已暂停) RESTful API 接口层(工单CRUD · 状态流转 · 分页查询)

这张图展示了我们搭建的完整技术栈:Spring Boot 作为底座,MyBatis Plus 负责数据操作,MySQL 存储工单数据,Swagger 暴露接口文档。四者配合,工单管理模块的开发环境就稳了。

3.6 验证环境是否搭建成功

环境搭完,怎么确认没问题?我一般做三步验证:

  1. 启动项目:控制台看到 Started Application in X.XXX seconds,没有红色报错。
  2. 访问Swagger:浏览器打开 http://localhost:8080/swagger-ui/index.html,能看到API文档页面。
  3. 写一个测试接口:创建一个简单的Controller,返回 "工单服务已启动",确认接口能正常调用。

我的习惯:在项目根目录放一个 init.sql 文件,里面写好建表语句和测试数据。这样新同事加入时,直接执行这个文件就能把数据库环境拉起来,不用一个个问表结构。工单模块的表结构我后面会详细讲,但初始化脚本建议现在就准备好。

好了,环境搭建就到这里。记住:基础不牢,地动山摇。花半小时把环境配好,后面写工单业务代码时,你会感谢现在的自己。


公众号:蓝海资料掘金营,微信deep3321