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编写、数据的逻辑处理思路