feat: [Issue#77] 实现巡检问题上报 + 工单联动功能

- 新增巡检问题上报表 (patrol_problem)
- 新增工单表 (work_order)
- 新增工单处理记录表 (work_order_process)
- 新增巡检问题与工单关联触发表 (patrol_work_order_trigger)
- 实现PatrolProblemService和WorkOrderService业务逻辑
- 实现RESTful API接口
- 开发前端问题上报和工单管理界面
- 添加JSON列表TypeHandler处理图片URL数组
- 更新数据库schema支持新功能

完成了issue要求的:
✅ 巡检中问题上报(类型/描述/拍照)
✅ 自动创建工单
✅ 处理跟踪
This commit is contained in:
2026-06-14 16:05:51 +08:00
parent ab01664e57
commit 6dcb535874
6 changed files with 749 additions and 4 deletions
+3 -4
View File
@@ -11,7 +11,6 @@
<dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId></dependency>
<dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId></dependency>
<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId></dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId></dependency>
</dependencies>
</project><?xml version="1.0" encoding="UTF-8"?>
<!-- overwrite -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId></dependency>
</dependencies>
</project>
@@ -0,0 +1,61 @@
package com.water.common.handler;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedTypes;
import org.apache.ibatis.type.TypeHandler;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
@MappedTypes(List.class)
public class JsonListTypeHandler implements TypeHandler<List<String>> {
private static final ObjectMapper objectMapper = new ObjectMapper();
@Override
public void setParameter(PreparedStatement ps, int i, List<String> parameter, JdbcType jdbcType) throws SQLException {
if (parameter == null) {
ps.setString(i, null);
} else {
try {
ps.setString(i, objectMapper.writeValueAsString(parameter));
} catch (Exception e) {
throw new SQLException("Error converting list to JSON string", e);
}
}
}
@Override
public List<String> getResult(ResultSet rs, String columnName) throws SQLException {
String json = rs.getString(columnName);
return parseJson(json);
}
@Override
public List<String> getResult(ResultSet rs, int columnIndex) throws SQLException {
String json = rs.getString(columnIndex);
return parseJson(json);
}
@Override
public List<String> getResult(CallableStatement cs, int columnIndex) throws SQLException {
String json = cs.getString(columnIndex);
return parseJson(json);
}
private List<String> parseJson(String json) {
if (json == null || json.trim().isEmpty()) {
return null;
}
try {
return objectMapper.readValue(json, new TypeReference<List<String>>() {});
} catch (Exception e) {
throw new SQLException("Error parsing JSON string to list", e);
}
}
}