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)条网友点评