Skip to main content

tdm_server_rust/repository/
evaluation_repo.rs

1//! 评价数据访问层 (Evaluation Repository)
2//!
3//! 封装 `evaluation` 表的增删改查。
4
5use crate::entity::evaluation::Evaluation;
6use chrono::{DateTime, Utc};
7use sqlx::{MySql, Pool, Row};
8
9/// 评价仓储
10pub struct EvaluationRepository {
11    /// 连接池
12    pool: Pool<MySql>,
13}
14
15impl EvaluationRepository {
16    /// 构造仓储
17    pub fn new(pool: Pool<MySql>) -> Self {
18        Self { pool }
19    }
20
21    /// 新增评价
22    #[tracing::instrument(skip_all, level = "debug")]
23    pub async fn insert(&self, eval: &Evaluation) -> crate::error::ApiResult<i64> {
24        let r = sqlx::query(
25            "INSERT INTO evaluation(member_id, target, evaluator_id, evaluator, role_type, content, evaluation_time, created_at) \
26             VALUES (?, ?, ?, ?, ?, ?, NOW(), NOW())",
27        )
28        .bind(eval.member_id)
29        .bind(&eval.target)
30        .bind(eval.evaluator_id)
31        .bind(&eval.evaluator)
32        .bind(eval.role_type)
33        .bind(&eval.content)
34        .execute(&self.pool)
35        .await?;
36        Ok(r.last_insert_id() as i64)
37    }
38
39    /// 按 ID 查询评价
40    #[tracing::instrument(skip_all, level = "debug")]
41    pub async fn get_by_id(&self, id: i64) -> crate::error::ApiResult<Option<Evaluation>> {
42        let row = sqlx::query(
43            "SELECT id, member_id, target, evaluator_id, evaluator, role_type, content, evaluation_time, created_at, updated_at \
44             FROM evaluation WHERE id = ?",
45        )
46        .bind(id)
47        .fetch_optional(&self.pool)
48        .await?;
49        Ok(row.map(|r| row_to_evaluation(&r)))
50    }
51
52    /// 条件筛选评价列表
53    #[tracing::instrument(skip_all, level = "debug")]
54    pub async fn select_by_filter(
55        &self,
56        member_id: Option<i32>,
57        evaluator_id: Option<i32>,
58        start_time: Option<DateTime<Utc>>,
59        end_time: Option<DateTime<Utc>>,
60    ) -> crate::error::ApiResult<Vec<Evaluation>> {
61        let mut sql = String::from(
62            "SELECT id, member_id, target, evaluator_id, evaluator, role_type, content, evaluation_time, created_at, updated_at \
63             FROM evaluation WHERE 1=1",
64        );
65        if member_id.is_some() {
66            sql.push_str(" AND member_id = ?");
67        }
68        if evaluator_id.is_some() {
69            sql.push_str(" AND evaluator_id = ?");
70        }
71        if start_time.is_some() {
72            sql.push_str(" AND evaluation_time >= ?");
73        }
74        if end_time.is_some() {
75            sql.push_str(" AND evaluation_time <= ?");
76        }
77        sql.push_str(" ORDER BY evaluation_time DESC");
78        let mut q = sqlx::query(&sql);
79        if let Some(v) = member_id {
80            q = q.bind(v);
81        }
82        if let Some(v) = evaluator_id {
83            q = q.bind(v);
84        }
85        if let Some(v) = start_time {
86            q = q.bind(v);
87        }
88        if let Some(v) = end_time {
89            q = q.bind(v);
90        }
91        let rows = q.fetch_all(&self.pool).await?;
92        Ok(rows.into_iter().map(|r| row_to_evaluation(&r)).collect())
93    }
94
95    /// 更新评价
96    #[tracing::instrument(skip_all, level = "debug")]
97    pub async fn update(&self, eval: &Evaluation) -> crate::error::ApiResult<()> {
98        sqlx::query(
99            "UPDATE evaluation SET member_id = ?, target = ?, role_type = ?, content = ?, updated_at = NOW() WHERE id = ?",
100        )
101        .bind(eval.member_id)
102        .bind(&eval.target)
103        .bind(eval.role_type)
104        .bind(&eval.content)
105        .bind(eval.id)
106        .execute(&self.pool)
107        .await?;
108        Ok(())
109    }
110
111    /// 按 ID 删除评价
112    #[tracing::instrument(skip_all, level = "debug")]
113    pub async fn delete_by_id(&self, id: i64) -> crate::error::ApiResult<()> {
114        sqlx::query("DELETE FROM evaluation WHERE id = ?")
115            .bind(id)
116            .execute(&self.pool)
117            .await?;
118        Ok(())
119    }
120}
121
122/// 行映射为评价
123fn row_to_evaluation(row: &sqlx::mysql::MySqlRow) -> Evaluation {
124    Evaluation {
125        id: row.try_get("id").ok(),
126        member_id: row.try_get("member_id").ok(),
127        target: row.try_get("target").ok(),
128        evaluator_id: row.try_get("evaluator_id").ok(),
129        evaluator: row.try_get("evaluator").ok(),
130        role_type: row.try_get("role_type").ok(),
131        content: row.try_get("content").ok(),
132        evaluation_time: row.try_get("evaluation_time").ok(),
133        created_at: row.try_get("created_at").ok(),
134        updated_at: row.try_get("updated_at").ok(),
135    }
136}