day01 2025/6/6
预计时间10:00 - 12:00完成第一个功能
第一步设计建表语句
方案一:使用的是豆包,问ai的模板是这样的
你是一个软件工程师,帮我生成MySQL的表结构,需求如下:
1,入住表(check_in),包含的字段有:主键(ID),老人id(elder_id)、身份证号、入住开始时间、入住结束时间、护理等级、入住床位、状态(0:已入住、1:已退住)
2,表中其他必要字段:排序编号、创建时间(create_time)、修改时间(update_time)、创建人(create_by)、修改人(update_by)、备注(remark)这些字段
3,表的主键都是自增的
4,请为每个字段都添加上comment
5,帮我给生成的表中插入一些示例数据以下是生成结果:
CREATE TABLE `nursing_task` (
`id` BIGINT(19) NOT NULL AUTO_INCREMENT COMMENT 'id',
`bed_number` VARCHAR(50) NULL DEFAULT NULL COMMENT '床位编号' COLLATE 'utf8mb4_0900_ai_ci',
`cancel_reason` VARCHAR(255) NULL DEFAULT NULL COMMENT '取消原因' COLLATE 'utf8mb4_0900_ai_ci',
`create_by` VARCHAR(50) NULL DEFAULT NULL COMMENT '创建人id' COLLATE 'utf8mb4_0900_ai_ci',
`create_time` DATETIME NOT NULL DEFAULT 'CURRENT_TIMESTAMP' COMMENT '创建时间',
`elder_id` VARCHAR(50) NULL DEFAULT NULL COMMENT '老人id' COLLATE 'utf8mb4_0900_ai_ci',
`elder_name` VARCHAR(50) NULL DEFAULT NULL COMMENT '老人姓名' COLLATE 'utf8mb4_0900_ai_ci',
`estimated_server_time` DATETIME NULL DEFAULT NULL COMMENT '预计服务时间',
`mark` VARCHAR(255) NULL DEFAULT NULL COMMENT '执行记录' COLLATE 'utf8mb4_0900_ai_ci',
`nursing_id` VARCHAR(255) NULL DEFAULT NULL COMMENT '护理员id,可存多个,如103,104' COLLATE 'utf8mb4_0900_ai_ci',
`project_id` VARCHAR(50) NULL DEFAULT NULL COMMENT '项目id' COLLATE 'utf8mb4_0900_ai_ci',
`project_name` VARCHAR(255) NULL DEFAULT NULL COMMENT '护理项目名称' COLLATE 'utf8mb4_0900_ai_ci',
`real_server_time` DATETIME NULL DEFAULT NULL COMMENT '实际服务时间',
`remark` VARCHAR(255) NULL DEFAULT NULL COMMENT '备注' COLLATE 'utf8mb4_0900_ai_ci',
`status` INT(10) NOT NULL DEFAULT '1' COMMENT '状态 1待执行 2已执行 3已关闭',
`task_image` VARCHAR(255) NULL DEFAULT NULL COMMENT '执行图片' COLLATE 'utf8mb4_0900_ai_ci',
`update_by` VARCHAR(50) NULL DEFAULT NULL COMMENT '更新人id' COLLATE 'utf8mb4_0900_ai_ci',
`update_time` DATETIME NOT NULL DEFAULT 'CURRENT_TIMESTAMP' ON UPDATE (CURRENT_TIMESTAMP) COMMENT '更新时间',
PRIMARY KEY (`id`) USING BTREE
)
COMMENT='护理任务表'
COLLATE='utf8mb4_0900_ai_ci'
ENGINE=InnoDB
ROW_FORMAT=DYNAMIC
;
(bug1:已经有了,不过建表语句中少一个字段)
`project_name` VARCHAR(255) NULL DEFAULT NULL COMMENT '项目名称' COLLATE 'utf8mb4_0900_ai_ci',
解决办法:
删掉表,补充上这条字段就可以了
先需求分析
需求分析:
定时任务需要定期检查每个老人的护理计划,把未来要执行的护理项目转化为具体的护理任务
大概思路:
把某个老人 护理计划中的护理项目数据 每天都给生成到任务安排中
定时任务已经存在了,重新写一下分页查询,多表联查
接口四要素中:
请求方式是get,传参
考虑用到dto封装请求参数给后端
根据前端需要的返回结果,封装vo展示给前端页面
1、需要重新写一下分页查询
业务逻辑如下
/**
* 根据页面查询护理任务列表
*
* @param dto 查询条件对象,包含分页信息和查询参数
* @return 返回分页后的任务列表信息
*/
@Override
public TableDataInfo selectTaskListByPage(NursingTaskQueryDto dto) {
// 启动分页
PageHelper.startPage(dto.getPageNum(), dto.getPageSize());
// 查询任务列表
List<NursingTaskVo> rowsTemp = nursingTaskMapper.selectTaskListByPage(dto);
// 初始化最终返回的任务列表
List<NursingTaskVo> rows = new ArrayList<>();
// 初始化分页信息对象
PageInfo<NursingTaskVo> pageInfo = new PageInfo<>(rowsTemp);
// 初始化表格数据信息对象
TableDataInfo<NursingTaskVo> tableDataInfo = new TableDataInfo<>();
// 遍历查询到的任务列表
for (NursingTaskVo row : rowsTemp) {
// 获取护理ID
String nursingId = row.getNursingId();
// 如果护理ID不为空
if (nursingId != null && !"".equals(nursingId)) {
String[] split;
// 如果护理ID包含逗号,则分割护理ID
if (nursingId.contains(",")) {
split = nursingId.split(",");
} else {
split = new String[]{nursingId};
}
// 初始化护理人员名称列表
List<String> nameList = new ArrayList<>();
// 根据护理ID查询护理人员信息
for (String id : split) {
SysUser user = sysUserMapper.selectUserById(Long.valueOf(id));
nameList.add(user.getNickName());
}
// 设置护理人员名称列表
row.setNursingName(nameList);
}
// 将处理后的任务信息添加到最终返回的任务列表中
rows.add(row);
}
// 设置表格数据信息
tableDataInfo.setRows(rows);
tableDataInfo.setTotal(pageInfo.getTotal());
// 返回表格数据信息
return tableDataInfo;
}问ai写的联查sql语句
SELECT
nt.id,
nt.nursing_id,
nt.project_id,
np.name AS project_name, -- 获取护理项目表的名称
nt.elder_id,
nt.elder_name,
nt.project_name,
nt.bed_number,
nt.task_type,
nt.estimated_server_time,
nt.real_server_time,
nt.mark,
nt.cancel_reason,
nt.status,
nt.rel_no,
nt.task_image,
nt.create_time,
nt.update_time,
nt.create_by,
nt.update_by,
nt.remark
FROM
nursing_task nt
-- 左连接nursing_project表,根据project_id关联
LEFT JOIN
nursing_project np ON nt.project_id = np.id;mapper.xml中的动态sql(ai生成的问题很大,还得自己修改)
<select id="selectTaskListByPage" resultType="com.zzyl.nursing.vo.NursingTaskVo">
select nt.create_time createTime,
nt.id AS id,
nt.nursing_id AS nursingId,
nt.project_id AS projectId,
nt.elder_id AS elderId,
nt.bed_number AS bedNumber,
nt.estimated_server_time AS estimatedServerTime,
nt.status AS status,
np.name AS projectName,
e.name AS elderName
from nursing_task nt
left join nursing_project np on nt.project_id = np.id
left join elder e on nt.elder_id = e.id
<where>
<if test="elderName != null and elderName != ''">and e.name = #{elderName}</if>
<if test="nurseId != null">and nt.nursing_id like concat('%',#{nurseId},'%')</if>
<if test="projectId != null">and nt.project_id = #{projectId}</if>
<if test="startTime != null">and nt.estimated_server_time >= #{startTime}</if>
<if test="endTime != null">and nt.estimated_server_time <= #{endTime}</if>
<if test="status != null">and nt.status = #{status}</if>
</where>
ORDER BY nt.create_time DESC
</select>bug2: nursing_task表中的project_id,与nursing_project表中的id对应不上
前端不显示项目名称,后端映射字段也查看了没有问题
解决:
查看数据库对应的中间表 nursing_project_plan 发现存的时候就是85没有对应项目的id,删掉重新存入即可
接下来第二个功能:取消任务
接口四要素
请求参数用CancelDto封装 {reson和taskId}
controller返回success {操作成功},service层逻辑不多直接给请求参数赋值再调用mapper层的update方法判断下状态功能就可以实现
[前端只显示状态为3的,所以不需要想得复杂]
接口比较简单所以没出啥bug,请求参数赋上值就行
接下来第三个功能:执行任务
接口四要素
请求参数用dto
跟第二个功能一样,主要是赋值然后更新一下状态,请求参数都赋值对就行了,请求成功返回success
接下来第四个功能:修改执行任务时间
请求参数用dto封装
跟前两个功能类似,主要是前端传来的参数用dto封装,然后set赋值 传到数据库,请求成功返回success
bug3:唯一 出现的小bug就是,ai生成的dto中时间是string而且注解也不对,报错如下:
/**
* 新的执行时间(格式:yyyy-MM-dd HH:mm:ss)
* 示例:"2024-10-01 09:00:00"
*/
@ApiModelProperty(
value = "新执行时间(格式:yyyy-MM-dd HH:mm:ss)",
example = "2024-10-01 09:00:00",
required = true
)
@Pattern(
regexp = "d{4}-d{2}-d{2} d{2}:d{2}:d{2}",
message = "执行时间格式错误,必须为 yyyy-MM-dd HH:mm:ss"
)
private String estimatedServerTime; Caused by: java.time.format.DateTimeParseException: Text '2025-06-20 19:16:49' could not be parsed at index 10
报错的根本原因是日期时间字符串中使用了空格而非 T 分隔日期与时间,导致默认解析失败。解决方式是自定义格式或配置 Jackson,确保解析器能正确识别输入格式。
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
修改 时间属性的类型对应上 Localdatatime 、加注解@JsonFormat自定义格式 ,正确识别格式就能用了
接下来第五个功能:查看任务详情的功能
接口四要素
响应
{
"code": 200,
"msg": "操作成功",
"data": {
"createTime": "2024-09-27 23:08:17",
"updateBy": "1",
"updateTime": "2024-09-27 23:25:18",
"id": 191,
"nursingId": "103",
"projectId": 6,
"projectName": "洗头",
"elderId": 3,
"elderName": "张飞",
"bedNumber": "303-1",
"estimatedServerTime": "2024-09-27 08:00:00",
"realServerTime": "2024-09-27 23:25:13",
"mark": "222",
"cancelReason": "老人不舒服",
"status": 2,
"taskImage": "https://itheim.oss-cn-beijing.aliyuncs.com/1d7763da-f02e-4b81-b414-2d23e7503a6e.jpg",
"nursingName": [
"小白"
],
"nursingLevelName": "5号护理等级",
"age": 72,
"updater": "若依"
}
}只有一个id,用不到dto封装
响应给前端的数据需要vo封装,detailDto ai生成
想法一:可以用vo封装数据,然后在service层处理逻辑把值从数据库一个一个获取出来,照着之前学的获取健康评估详细信息功能来写,sql的多表联查需要自己写
1.用VO封装好
2.写好对应的接口
3.多表联查
实际上都弄完之后,页面一些字段写诗不出来
SELECT
-- 基本信息
nt.id AS taskId,
nt.elder_id AS elderId,
nt.elder_name AS elderName,
nt.bed_number AS bedNumber,
nt.create_time AS createTime,
nt.update_time AS updateTime,
su_create.nick_name AS creatorName, -- 创建人姓名
su_update.nick_name AS updaterName, -- 更新人姓名
-- 护理项目信息
nt.project_id AS projectId,
nt.project_name AS projectName,
nt.task_type AS taskType,
nt.estimated_server_time AS estimatedServerTime,
-- 执行记录信息
nt.real_server_time AS realServerTime,
nt.mark AS executionRecord,
nt.cancel_reason AS cancelReason,
nt.status AS status,
nt.task_image AS taskImage,
nt.remark AS remark,
-- 护理人员信息(将ID列表转换为姓名列表)
GROUP_CONCAT(su.nick_name) AS nursingNames
FROM
nursing_task nt
-- 关联创建人信息
LEFT JOIN sys_user su_create ON nt.create_by = su_create.user_id
-- 关联更新人信息
LEFT JOIN sys_user su_update ON nt.update_by = su_update.user_id
-- 关联护理人员信息(处理多对多关系)
LEFT JOIN (
SELECT
user_id,
nick_name
FROM
sys_user
) su ON FIND_IN_SET(su.user_id, nt.nursing_id) > 0
WHERE
nt.id = #{taskId} -- 根据任务ID查询
GROUP BY
nt.id; -- 确保只返回一条记录实战项目总结:
1、设计表建表
-会用AI生成初步的表 AI建表模板
-熟悉SQL语句 MySQL语法
2、理思路,接口文档需要分析明白
-需求分析
-接口四要素
3、实现功能
--1.理好思路,根据需求和四要素分析是否使用VO封装传给前端数据、DTO封装传给后端的数据
--2.接口service层的数据处理和mapper层的sql语句编写(主要是这)
--3.git
还有几块不熟悉,git应用、四要素、sql编写、数据的逻辑处理思路
推荐阅读:








文章有(0)条网友点评