From 564b021a7cc18dd758ceda4834569ee21e33dc3c Mon Sep 17 00:00:00 2001 From: Mohammad Amin Date: Fri, 3 Apr 2026 20:02:43 +0330 Subject: [PATCH] bug fixed --- patientapp/delivery/http/analytic/router.go | 4 +- patientapp/repository/mysql/analytic_repo.go | 315 +-- patientapp/repository/mysql/dbconfig.yml | 10 - patientapp/repository/mysql/helper.go | 56 - patientapp/repository/mysql/rawdata.json | 2202 ------------------ patientapp/service/analytic/param.go | 19 +- patientapp/service/analytic/service.go | 20 +- patientapp/service/analytic/validator.go | 8 - 8 files changed, 27 insertions(+), 2607 deletions(-) delete mode 100644 patientapp/repository/mysql/dbconfig.yml delete mode 100644 patientapp/repository/mysql/helper.go delete mode 100644 patientapp/repository/mysql/rawdata.json delete mode 100644 patientapp/service/analytic/validator.go diff --git a/patientapp/delivery/http/analytic/router.go b/patientapp/delivery/http/analytic/router.go index eddd18c4..1ef8c004 100644 --- a/patientapp/delivery/http/analytic/router.go +++ b/patientapp/delivery/http/analytic/router.go @@ -9,8 +9,8 @@ import ( func NewPatientAnalyticRouter(s *echo.Group) { repo := mysql.NewPatientRepo() - validator := analytic2.NewValidator() - analyticService := analytic2.NewPatientAnalyticService(repo, *validator) + + analyticService := analytic2.NewPatientAnalyticService(repo) h := NewHandler(analyticService) diff --git a/patientapp/repository/mysql/analytic_repo.go b/patientapp/repository/mysql/analytic_repo.go index bb5aa9c3..743d8e51 100644 --- a/patientapp/repository/mysql/analytic_repo.go +++ b/patientapp/repository/mysql/analytic_repo.go @@ -2,7 +2,6 @@ package mysql import ( "context" - "log" "git.gocasts.ir/ebhomengo/niki/patientapp/service/analytic" "git.gocasts.ir/ebhomengo/niki/patientapp/service/entity" @@ -14,11 +13,8 @@ type DataBase struct { } func NewPatientRepo( /*conn *mysql.DB*/ ) *DataBase { - patients, err := LoadPatientsFromJSON("C:\\Users\\cafel\\Documents\\gocast\\eb\\patientapp\\repository\\mysql\\rawdata.json") - if err != nil { - log.Fatal(err) - return nil - } + patients := make([]entity.Patient, 0) + return &DataBase{ //conn: conn, patients: patients, @@ -38,316 +34,13 @@ func (db *DataBase) CountPatients(ctx context.Context, f analytic.PatientFilter) func (db *DataBase) SummaryByCity(ctx context.Context, provinceID uint, f analytic.PatientMapFilter) (map[uint][]entity.MapSummaryItem, error) { - //var out []entity.MapSummaryItem - result := make(map[uint][]entity.MapSummaryItem, 0) + var out map[uint][]entity.MapSummaryItem - for _, patient := range db.patients { - if patient.Address.ProvinceID == provinceID { - out := entity.MapSummaryItem{ - LocationID: int64(patient.Address.ID), - Name: patient.Address.Name, - CentroidLat: patient.Address.Lat, - CentroidLng: patient.Address.Lon, - } - result[patient.Address.ProvinceID] = append(result[patient.Address.ProvinceID], out) - - } - - } - return result, nil + return out, nil } func (db *DataBase) SummaryByProvince(ctx context.Context, f analytic.PatientMapFilter) (map[uint][]entity.MapSummaryItem, error) { result := make(map[uint][]entity.MapSummaryItem, 0) - for _, patient := range db.patients { - out := entity.MapSummaryItem{ - LocationID: int64(patient.Address.ID), - Name: patient.Address.Name, - CentroidLat: patient.Address.Lat, - CentroidLng: patient.Address.Lon, - } - result[patient.Address.ProvinceID] = append(result[patient.Address.ProvinceID], out) - } return result, nil } - -//func (db *DataBase) GetPatients(ctx context.Context, f analytic.PatientFilter) ([]entity.Patient, error) { -// const op = "mysqlpatient.GetPatients" -// limit, offset := clampLimitOffset(f.Limit, f.Offset) -// -// q := ` -//SELECT -// p.id, -// p.first_name, -// p.last_name, -// p.date_of_birth, -// p.sex, -// p.phone, -// -// p.country_id, -// p.province_id, -// p.city_id, -// p.postal_code, -// p.address_line1, -// p.address_line2, -// -// p.case_status, -// p.referral_source, -// p.assigned_staff_id, -// p.start_date, -// p.end_date -//FROM patients p -//WHERE p.deleted_at IS NULL -//` -// -// stmt, err := db.conn.PrepareStatement(ctx, mysql.StatementKeyCityGetProvinceIDByID, q) -// if err != nil { -// return nil, richerror.New(op).WithErr(err). -// WithMessage(errmsg.ErrorMsgCantPrepareStatement).WithKind(richerror.KindUnexpected) -// } -// args := make([]any, 0) -// -// // filters -// if f.Sex != nil { -// q += " AND p.sex = ?" -// args = append(args, string(*f.Sex)) -// } -// if f.DOBFrom != nil { -// q += " AND p.date_of_birth >= ?" -// args = append(args, f.DOBFrom.Format("2006-01-02")) -// } -// if f.DOBTo != nil { -// q += " AND p.date_of_birth <= ?" -// args = append(args, f.DOBTo.Format("2006-01-02")) -// } -// if f.Country != nil { -// q += " AND p.country_id = ?" -// args = append(args, *f.Country) -// } -// if f.Province != nil { -// q += " AND p.province_id = ?" -// args = append(args, *f.Province) -// } -// if f.City != nil { -// q += " AND p.city_id = ?" -// args = append(args, *f.City) -// } -// -// if f.Search != nil && strings.TrimSpace(*f.Search) != "" { -// term := "%" + strings.TrimSpace(*f.Search) + "%" -// q += " AND (p.first_name LIKE ? OR p.last_name LIKE ? OR p.phone LIKE ?)" -// args = append(args, term, term, term) -// } -// -// q += " ORDER BY p.id DESC LIMIT ? OFFSET ?" -// args = append(args, limit, offset) -// -// rows, err := stmt.QueryContext(ctx, args...) -// if err != nil { -// return nil, err -// } -// defer rows.Close() -// -// out := make([]entity.Patient, 0, limit) -// -// for rows.Next() { -// var p entity.Patient -// var dob sql.NullTime -// var provinceID, cityID uint -// -// if err := rows.Scan( -// &p.ID, -// &p.FirstName, -// &p.LastName, -// &dob, -// &p.Sex, -// &p.Phone, -// -// &provinceID, -// &cityID, -// &p.Address.PostalCode, -// -// &p.CaseStatus, -// &p.ReferralSource, -// &p.AssignedStaffId, -// &p.StartDate, -// &p.EndDate, -// ); err != nil { -// return nil, err -// } -// -// if dob.Valid { -// t := dob.Time -// p.DateOfBirth = &t -// } -// -// p.Address.ProvinceID = provinceID -// p.Address.CityID = cityID -// -// out = append(out, p) -// } -// -// return out, rows.Err() -//} -// -//func (db *DataBase) CountPatients(ctx context.Context, f analytic.PatientFilter) (int, error) { -// const op = "mysqlpatient.CountPatients" -// q := `SELECT COUNT(*) FROM patients p WHERE p.deleted_at IS NULL` -// args := make([]any, 0) -// -// stmt, err := db.conn.PrepareStatement(ctx, mysql.StatementKeyCityGetProvinceIDByID, q) -// if err != nil { -// return 0, richerror.New(op).WithErr(err). -// WithMessage(errmsg.ErrorMsgCantPrepareStatement).WithKind(richerror.KindUnexpected) -// } -// -// if f.Sex != nil { -// q += " AND p.sex = ?" -// args = append(args, string(*f.Sex)) -// } -// if f.DOBFrom != nil { -// q += " AND p.date_of_birth >= ?" -// args = append(args, f.DOBFrom.Format("2006-01-02")) -// } -// if f.DOBTo != nil { -// q += " AND p.date_of_birth <= ?" -// args = append(args, f.DOBTo.Format("2006-01-02")) -// } -// if f.Country != nil { -// q += " AND p.country_id = ?" -// args = append(args, *f.Country) -// } -// if f.Province != nil { -// q += " AND p.province_id = ?" -// args = append(args, *f.Province) -// } -// if f.City != nil { -// q += " AND p.city_id = ?" -// args = append(args, *f.City) -// } -// -// var total int -// -// err = stmt.QueryRowContext(ctx, args...).Scan(&total) -// return total, err -//} -// -//func (db *DataBase) SummaryByCity(ctx context.Context, provinceID int, f analytic.PatientMapFilter) ([]entity.MapSummaryItem, error) { -// const op = "mysqlpatient.SummaryByCity" -// q := ` -//SELECT -// c.id AS location_id, -// c.name, -// c.centroid_lat, -// c.centroid_lng, -// COUNT(p.id) AS count -//FROM locations c -//JOIN patients p ON p.city_id = c.id -//WHERE c.level = 'city' -// AND c.parent_id = ? -// AND p.deleted_at IS NULL -//` -// -// stmt, err := db.conn.PrepareStatement(ctx, mysql.StatementKeyCityGetProvinceIDByID, q) -// if err != nil { -// return nil, richerror.New(op).WithErr(err). -// WithMessage(errmsg.ErrorMsgCantPrepareStatement).WithKind(richerror.KindUnexpected) -// } -// args := []any{provinceID} -// -// if f.Sex != nil { -// q += " AND p.sex = ?" -// args = append(args, string(*f.Sex)) -// } -// if f.MinDOB != nil { -// q += " AND p.date_of_birth >= ?" -// args = append(args, f.MinDOB.Format("2006-01-02")) -// } -// if f.MaxDOB != nil { -// q += " AND p.date_of_birth <= ?" -// args = append(args, f.MaxDOB.Format("2006-01-02")) -// } -// if f.Search != nil && strings.TrimSpace(*f.Search) != "" { -// term := "%" + strings.TrimSpace(*f.Search) + "%" -// q += " AND (p.first_name LIKE ? OR p.last_name LIKE ? OR p.phone LIKE ?)" -// args = append(args, term, term, term) -// } -// -// q += ` GROUP BY c.id, c.name, c.centroid_lat, c.centroid_lng -// ORDER BY count DESC` -// -// rows, err := stmt.QueryContext(ctx, args...) -// if err != nil { -// return nil, err -// } -// defer rows.Close() -// -// var out []entity.MapSummaryItem -// for rows.Next() { -// var it entity.MapSummaryItem -// if err := rows.Scan(&it.LocationID, &it.Name, &it.CentroidLat, &it.CentroidLng, &it.Count); err != nil { -// return nil, err -// } -// out = append(out, it) -// } -// return out, rows.Err() -//} -// -//func (db *DataBase) SummaryByProvince(ctx context.Context, countryID int, f analytic.PatientMapFilter) ([]entity.MapSummaryItem, error) { -// const op = "mysqlpatient.SummaryByProvince" -// -// q := ` -//SELECT -// prov.id AS location_id, -// prov.name, -// prov.centroid_lat, -// prov.centroid_lng, -// COUNT(p.id) AS count -//FROM patients p -//JOIN locations city ON city.id = p.city_id AND city.level = 'city' -//JOIN locations prov ON prov.id = city.parent_id AND prov.level = 'province' -//WHERE prov.parent_id = ? -// AND p.deleted_at IS NULL -//` -// -// stmt, err := db.conn.PrepareStatement(ctx, mysql.StatementKeyCityGetProvinceIDByID, q) -// if err != nil { -// return nil, richerror.New(op).WithErr(err). -// WithMessage(errmsg.ErrorMsgCantPrepareStatement).WithKind(richerror.KindUnexpected) -// } -// -// args := []any{countryID} -// -// if f.Sex != nil { -// q += " AND p.sex = ?" -// args = append(args, string(*f.Sex)) -// } -// if f.MinDOB != nil { -// q += " AND p.date_of_birth >= ?" -// args = append(args, f.MinDOB.Format("2006-01-02")) -// } -// if f.MaxDOB != nil { -// q += " AND p.date_of_birth <= ?" -// args = append(args, f.MaxDOB.Format("2006-01-02")) -// } -// -// q += ` GROUP BY prov.id, prov.name, prov.centroid_lat, prov.centroid_lng -// ORDER BY count DESC` -// -// rows, err := stmt.QueryContext(ctx, args...) -// if err != nil { -// return nil, err -// } -// defer rows.Close() -// -// var out []entity.MapSummaryItem -// for rows.Next() { -// var it entity.MapSummaryItem -// if err := rows.Scan(&it.LocationID, &it.Name, &it.CentroidLat, &it.CentroidLng, &it.Count); err != nil { -// return nil, err -// } -// out = append(out, it) -// } -// return out, rows.Err() -//} diff --git a/patientapp/repository/mysql/dbconfig.yml b/patientapp/repository/mysql/dbconfig.yml deleted file mode 100644 index 8c7e965d..00000000 --- a/patientapp/repository/mysql/dbconfig.yml +++ /dev/null @@ -1,10 +0,0 @@ -postgres_db: - driver: postgres - host: patient-db - port: 5432 - user: patient_admin - password: password1234 - db_name: patient_db - ssl_mode: disable - -path_of_migration: ./patientapp/repository/mysql/migrations \ No newline at end of file diff --git a/patientapp/repository/mysql/helper.go b/patientapp/repository/mysql/helper.go deleted file mode 100644 index 181ec5df..00000000 --- a/patientapp/repository/mysql/helper.go +++ /dev/null @@ -1,56 +0,0 @@ -package mysql - -import ( - "encoding/json" - "fmt" - "os" - "strings" - - "git.gocasts.ir/ebhomengo/niki/patientapp/service/entity" -) - -type whereClause struct { - sql strings.Builder - args []any -} - -func (w *whereClause) add(cond string, args ...any) { - if w.sql.Len() == 0 { - w.sql.WriteString(" WHERE ") - } else { - w.sql.WriteString(" AND ") - } - w.sql.WriteString(cond) - w.args = append(w.args, args...) -} - -func (w *whereClause) String() string { return w.sql.String() } - -func clampLimitOffset(limit, offset int) (int, int) { - if limit <= 0 { - limit = 50 - } - if limit > 100 { - limit = 100 - } - if offset < 0 { - offset = 0 - } - return limit, offset -} - -func LoadPatientsFromJSON(filePath string) ([]entity.Patient, error) { - // Read the file - data, err := os.ReadFile(filePath) - if err != nil { - return nil, fmt.Errorf("failed to read file: %w", err) - } - - // Unmarshal into slice of Patient - var patients []entity.Patient - if err := json.Unmarshal(data, &patients); err != nil { - return nil, fmt.Errorf("failed to unmarshal JSON: %w", err) - } - - return patients, nil -} diff --git a/patientapp/repository/mysql/rawdata.json b/patientapp/repository/mysql/rawdata.json deleted file mode 100644 index 73134bec..00000000 --- a/patientapp/repository/mysql/rawdata.json +++ /dev/null @@ -1,2202 +0,0 @@ -[ - { - "ID": 1, - "FirstName": "علی", - "LastName": "احمدی", - "DateOfBirth": "1370/05/12", - "Sex": "male", - "Phone": "09121234567", - "Address": { - "ID": 1, - "PostalCode": "1234567890", - "Name": "home", - "Lat": 35.6892, - "Lon": 51.3890, - "CityID": 14, - "ProvinceID": 8 - }, - "CaseStatus": "open", - "ReferralSource": "hospital", - "AssignedStaffId": 3, - "StartDate": "1402/01/15", - "EndDate": "" - }, - { - "ID": 2, - "FirstName": "فاطمه", - "LastName": "محمدی", - "DateOfBirth": "1365/08/20", - "Sex": "female", - "Phone": "09351234567", - "Address": { - "ID": 2, - "PostalCode": "9876543210", - "Name": "home", - "Lat": 36.2972, - "Lon": 59.6067, - "CityID": 27, - "ProvinceID": 15 - }, - "CaseStatus": "open", - "ReferralSource": "hospital", - "AssignedStaffId": 5, - "StartDate": "1402/02/10", - "EndDate": "" - }, - { - "ID": 3, - "FirstName": "محمد", - "LastName": "حسینی", - "DateOfBirth": "1358/11/03", - "Sex": "male", - "Phone": "09181234567", - "Address": { - "ID": 3, - "PostalCode": "4561237890", - "Name": "home", - "Lat": 32.6546, - "Lon": 51.6680, - "CityID": 43, - "ProvinceID": 4 - }, - "CaseStatus": "open", - "ReferralSource": "hospital", - "AssignedStaffId": 2, - "StartDate": "1402/03/05", - "EndDate": "" - }, - { - "ID": 4, - "FirstName": "زهرا", - "LastName": "رضایی", - "DateOfBirth": "1375/02/28", - "Sex": "female", - "Phone": "09301234567", - "Address": { - "ID": 4, - "PostalCode": "7894561230", - "Name": "home", - "Lat": 37.2808, - "Lon": 49.5832, - "CityID": 67, - "ProvinceID": 22 - }, - "CaseStatus": "open", - "ReferralSource": "hospital", - "AssignedStaffId": 7, - "StartDate": "1402/04/18", - "EndDate": "" - }, - { - "ID": 5, - "FirstName": "حسن", - "LastName": "کریمی", - "DateOfBirth": "1360/07/15", - "Sex": "male", - "Phone": "09141234567", - "Address": { - "ID": 5, - "PostalCode": "3216549870", - "Name": "home", - "Lat": 34.3277, - "Lon": 47.0785, - "CityID": 88, - "ProvinceID": 19 - }, - "CaseStatus": "closed", - "ReferralSource": "hospital", - "AssignedStaffId": 4, - "StartDate": "1401/06/20", - "EndDate": "1402/01/10" - }, - { - "ID": 6, - "FirstName": "مریم", - "LastName": "صادقی", - "DateOfBirth": "1372/09/14", - "Sex": "female", - "Phone": "09361234567", - "Address": { - "ID": 6, - "PostalCode": "6541239870", - "Name": "home", - "Lat": 38.0799, - "Lon": 46.2919, - "CityID": 5, - "ProvinceID": 2 - }, - "CaseStatus": "open", - "ReferralSource": "hospital", - "AssignedStaffId": 6, - "StartDate": "1402/05/22", - "EndDate": "" - }, - { - "ID": 7, - "FirstName": "رضا", - "LastName": "علیزاده", - "DateOfBirth": "1355/04/10", - "Sex": "male", - "Phone": "09111234567", - "Address": { - "ID": 7, - "PostalCode": "9871234560", - "Name": "home", - "Lat": 35.1833, - "Lon": 47.0000, - "CityID": 32, - "ProvinceID": 11 - }, - "CaseStatus": "open", - "ReferralSource": "hospital", - "AssignedStaffId": 1, - "StartDate": "1402/06/01", - "EndDate": "" - }, - { - "ID": 8, - "FirstName": "سارا", - "LastName": "موسوی", - "DateOfBirth": "1380/12/25", - "Sex": "female", - "Phone": "09211234567", - "Address": { - "ID": 8, - "PostalCode": "1597534680", - "Name": "home", - "Lat": 33.9900, - "Lon": 50.8736, - "CityID": 51, - "ProvinceID": 17 - }, - "CaseStatus": "open", - "ReferralSource": "hospital", - "AssignedStaffId": 9, - "StartDate": "1402/07/11", - "EndDate": "" - }, - { - "ID": 9, - "FirstName": "امیر", - "LastName": "جعفری", - "DateOfBirth": "1368/06/19", - "Sex": "male", - "Phone": "09151234567", - "Address": { - "ID": 9, - "PostalCode": "7531594680", - "Name": "home", - "Lat": 30.2839, - "Lon": 57.0834, - "CityID": 73, - "ProvinceID": 28 - }, - "CaseStatus": "open", - "ReferralSource": "hospital", - "AssignedStaffId": 3, - "StartDate": "1402/08/03", - "EndDate": "" - }, - { - "ID": 10, - "FirstName": "نرگس", - "LastName": "تهرانی", - "DateOfBirth": "1363/03/07", - "Sex": "female", - "Phone": "09391234567", - "Address": { - "ID": 10, - "PostalCode": "3571594680", - "Name": "home", - "Lat": 36.5683, - "Lon": 53.0601, - "CityID": 19, - "ProvinceID": 6 - }, - "CaseStatus": "closed", - "ReferralSource": "hospital", - "AssignedStaffId": 8, - "StartDate": "1401/09/15", - "EndDate": "1402/03/20" - }, - { - "ID": 11, - "FirstName": "سجاد", - "LastName": "نجفی", - "DateOfBirth": "1371/01/01", - "Sex": "male", - "Phone": "09131234567", - "Address": { - "ID": 11, - "PostalCode": "4682057391", - "Name": "home", - "Lat": 31.3203, - "Lon": 48.6692, - "CityID": 62, - "ProvinceID": 24 - }, - "CaseStatus": "open", - "ReferralSource": "hospital", - "AssignedStaffId": 2, - "StartDate": "1402/09/14", - "EndDate": "" - }, - { - "ID": 12, - "FirstName": "الهام", - "LastName": "اکبری", - "DateOfBirth": "1376/10/22", - "Sex": "female", - "Phone": "09331234567", - "Address": { - "ID": 12, - "PostalCode": "8207461935", - "Name": "home", - "Lat": 32.9034, - "Lon": 59.2139, - "CityID": 37, - "ProvinceID": 13 - }, - "CaseStatus": "open", - "ReferralSource": "hospital", - "AssignedStaffId": 5, - "StartDate": "1402/10/05", - "EndDate": "" - }, - { - "ID": 13, - "FirstName": "محسن", - "LastName": "شریفی", - "DateOfBirth": "1357/05/30", - "Sex": "male", - "Phone": "09161234567", - "Address": { - "ID": 13, - "PostalCode": "6194820735", - "Name": "home", - "Lat": 29.6060, - "Lon": 52.5311, - "CityID": 91, - "ProvinceID": 30 - }, - "CaseStatus": "open", - "ReferralSource": "hospital", - "AssignedStaffId": 7, - "StartDate": "1402/11/18", - "EndDate": "" - }, - { - "ID": 14, - "FirstName": "پریسا", - "LastName": "قاسمی", - "DateOfBirth": "1382/07/08", - "Sex": "female", - "Phone": "09341234567", - "Address": { - "ID": 14, - "PostalCode": "0573948261", - "Name": "home", - "Lat": 37.5527, - "Lon": 45.0760, - "CityID": 8, - "ProvinceID": 3 - }, - "CaseStatus": "open", - "ReferralSource": "hospital", - "AssignedStaffId": 4, - "StartDate": "1402/12/01", - "EndDate": "" - }, - { - "ID": 15, - "FirstName": "کاوه", - "LastName": "حیدری", - "DateOfBirth": "1362/08/17", - "Sex": "male", - "Phone": "09171234567", - "Address": { - "ID": 15, - "PostalCode": "3948261057", - "Name": "home", - "Lat": 34.7960, - "Lon": 48.5146, - "CityID": 55, - "ProvinceID": 20 - }, - "CaseStatus": "closed", - "ReferralSource": "hospital", - "AssignedStaffId": 6, - "StartDate": "1401/11/05", - "EndDate": "1402/05/15" - }, - { - "ID": 16, - "FirstName": "شیرین", - "LastName": "یوسفی", - "DateOfBirth": "1373/04/11", - "Sex": "female", - "Phone": "09221234567", - "Address": { - "ID": 16, - "PostalCode": "2948163057", - "Name": "home", - "Lat": 35.6836, - "Lon": 51.4211, - "CityID": 23, - "ProvinceID": 9 - }, - "CaseStatus": "open", - "ReferralSource": "hospital", - "AssignedStaffId": 1, - "StartDate": "1403/01/08", - "EndDate": "" - }, - { - "ID": 17, - "FirstName": "داریوش", - "LastName": "مرادی", - "DateOfBirth": "1356/11/24", - "Sex": "male", - "Phone": "09191234567", - "Address": { - "ID": 17, - "PostalCode": "7461392058", - "Name": "home", - "Lat": 36.8962, - "Lon": 54.4334, - "CityID": 78, - "ProvinceID": 25 - }, - "CaseStatus": "open", - "ReferralSource": "hospital", - "AssignedStaffId": 9, - "StartDate": "1403/01/22", - "EndDate": "" - }, - { - "ID": 18, - "FirstName": "آزاده", - "LastName": "ابراهیمی", - "DateOfBirth": "1378/09/03", - "Sex": "female", - "Phone": "09381234567", - "Address": { - "ID": 18, - "PostalCode": "5839204716", - "Name": "home", - "Lat": 30.2672, - "Lon": 50.0079, - "CityID": 46, - "ProvinceID": 16 - }, - "CaseStatus": "open", - "ReferralSource": "hospital", - "AssignedStaffId": 3, - "StartDate": "1403/02/10", - "EndDate": "" - }, - { - "ID": 19, - "FirstName": "بهزاد", - "LastName": "نوری", - "DateOfBirth": "1367/02/14", - "Sex": "male", - "Phone": "09101234567", - "Address": { - "ID": 19, - "PostalCode": "1234098765", - "Name": "home", - "Lat": 31.8974, - "Lon": 54.3678, - "CityID": 69, - "ProvinceID": 27 - }, - "CaseStatus": "open", - "ReferralSource": "hospital", - "AssignedStaffId": 8, - "StartDate": "1403/02/28", - "EndDate": "" - }, - { - "ID": 20, - "FirstName": "ناهید", - "LastName": "صالحی", - "DateOfBirth": "1361/06/29", - "Sex": "female", - "Phone": "09371234567", - "Address": { - "ID": 20, - "PostalCode": "0987612345", - "Name": "home", - "Lat": 38.4192, - "Lon": 44.9671, - "CityID": 12, - "ProvinceID": 1 - }, - "CaseStatus": "closed", - "ReferralSource": "hospital", - "AssignedStaffId": 2, - "StartDate": "1401/07/01", - "EndDate": "1402/07/01" - }, - { - "ID": 21, - "FirstName": "سیامک", - "LastName": "غفاری", - "DateOfBirth": "1364/10/05", - "Sex": "male", - "Phone": "09121357900", - "Address": { - "ID": 21, - "PostalCode": "5678901234", - "Name": "home", - "Lat": 33.5731, - "Lon": 48.3956, - "CityID": 34, - "ProvinceID": 12 - }, - "CaseStatus": "open", - "ReferralSource": "hospital", - "AssignedStaffId": 5, - "StartDate": "1403/03/05", - "EndDate": "" - }, - { - "ID": 22, - "FirstName": "لیلا", - "LastName": "منصوری", - "DateOfBirth": "1377/03/18", - "Sex": "female", - "Phone": "09351357900", - "Address": { - "ID": 22, - "PostalCode": "4321098765", - "Name": "home", - "Lat": 35.3392, - "Lon": 46.9964, - "CityID": 57, - "ProvinceID": 21 - }, - "CaseStatus": "open", - "ReferralSource": "hospital", - "AssignedStaffId": 7, - "StartDate": "1403/03/20", - "EndDate": "" - }, - { - "ID": 23, - "FirstName": "وحید", - "LastName": "طاهری", - "DateOfBirth": "1359/12/10", - "Sex": "male", - "Phone": "09181357900", - "Address": { - "ID": 23, - "PostalCode": "8765432109", - "Name": "home", - "Lat": 29.9553, - "Lon": 55.4368, - "CityID": 83, - "ProvinceID": 29 - }, - "CaseStatus": "open", - "ReferralSource": "hospital", - "AssignedStaffId": 4, - "StartDate": "1403/04/01", - "EndDate": "" - }, - { - "ID": 24, - "FirstName": "گلناز", - "LastName": "پارسا", - "DateOfBirth": "1384/05/07", - "Sex": "female", - "Phone": "09301357900", - "Address": { - "ID": 24, - "PostalCode": "2109876543", - "Name": "home", - "Lat": 36.6689, - "Lon": 48.5136, - "CityID": 26, - "ProvinceID": 10 - }, - "CaseStatus": "open", - "ReferralSource": "hospital", - "AssignedStaffId": 6, - "StartDate": "1403/04/15", - "EndDate": "" - }, - { - "ID": 25, - "FirstName": "نیما", - "LastName": "باقری", - "DateOfBirth": "1369/08/22", - "Sex": "male", - "Phone": "09141357900", - "Address": { - "ID": 25, - "PostalCode": "6543210987", - "Name": "home", - "Lat": 31.2667, - "Lon": 56.9667, - "CityID": 100, - "ProvinceID": 32 - }, - "CaseStatus": "open", - "ReferralSource": "hospital", - "AssignedStaffId": 1, - "StartDate": "1403/05/02", - "EndDate": "" - }, - { - "ID": 26, - "FirstName": "مینا", - "LastName": "سلیمانی", - "DateOfBirth": "1374/01/15", - "Sex": "female", - "Phone": "09361357900", - "Address": { - "ID": 26, - "PostalCode": "0987654321", - "Name": "home", - "Lat": 32.4667, - "Lon": 53.6667, - "CityID": 47, - "ProvinceID": 18 - }, - "CaseStatus": "closed", - "ReferralSource": "hospital", - "AssignedStaffId": 9, - "StartDate": "1401/05/10", - "EndDate": "1402/09/25" - }, - { - "ID": 27, - "FirstName": "فرهاد", - "LastName": "اسدی", - "DateOfBirth": "1356/07/20", - "Sex": "male", - "Phone": "09111357900", - "Address": { - "ID": 27, - "PostalCode": "3456789012", - "Name": "home", - "Lat": 37.9380, - "Lon": 58.3660, - "CityID": 71, - "ProvinceID": 26 - }, - "CaseStatus": "open", - "ReferralSource": "hospital", - "AssignedStaffId": 3, - "StartDate": "1403/05/18", - "EndDate": "" - }, - { - "ID": 28, - "FirstName": "سپیده", - "LastName": "کمالی", - "DateOfBirth": "1381/11/11", - "Sex": "female", - "Phone": "09211357900", - "Address": { - "ID": 28, - "PostalCode": "7890123456", - "Name": "home", - "Lat": 35.7447, - "Lon": 50.0890, - "CityID": 16, - "ProvinceID": 7 - }, - "CaseStatus": "open", - "ReferralSource": "hospital", - "AssignedStaffId": 8, - "StartDate": "1403/06/01", - "EndDate": "" - }, - { - "ID": 29, - "FirstName": "شاهین", - "LastName": "زارعی", - "DateOfBirth": "1366/04/27", - "Sex": "male", - "Phone": "09151357900", - "Address": { - "ID": 29, - "PostalCode": "2345678901", - "Name": "home", - "Lat": 33.0953, - "Lon": 51.5051, - "CityID": 59, - "ProvinceID": 23 - }, - "CaseStatus": "open", - "ReferralSource": "hospital", - "AssignedStaffId": 2, - "StartDate": "1403/06/15", - "EndDate": "" - }, - { - "ID": 30, - "FirstName": "رویا", - "LastName": "حسنی", - "DateOfBirth": "1379/09/03", - "Sex": "female", - "Phone": "09391357900", - "Address": { - "ID": 30, - "PostalCode": "6789012345", - "Name": "home", - "Lat": 30.8161, - "Lon": 57.0985, - "CityID": 85, - "ProvinceID": 31 - }, - "CaseStatus": "open", - "ReferralSource": "hospital", - "AssignedStaffId": 5, - "StartDate": "1403/07/01", - "EndDate": "" - }, - { - "ID": 31, - "FirstName": "مهدی", - "LastName": "عباسی", - "DateOfBirth": "1361/02/16", - "Sex": "male", - "Phone": "09131357900", - "Address": { - "ID": 31, - "PostalCode": "1230984567", - "Name": "home", - "Lat": 36.2605, - "Lon": 50.0041, - "CityID": 31, - "ProvinceID": 14 - }, - "CaseStatus": "open", - "ReferralSource": "hospital", - "AssignedStaffId": 7, - "StartDate": "1403/07/20", - "EndDate": "" - }, - { - "ID": 32, - "FirstName": "بهاره", - "LastName": "رستمی", - "DateOfBirth": "1375/06/08", - "Sex": "female", - "Phone": "09331357900", - "Address": { - "ID": 32, - "PostalCode": "9870123456", - "Name": "home", - "Lat": 34.9081, - "Lon": 50.8756, - "CityID": 53, - "ProvinceID": 17 - }, - "CaseStatus": "open", - "ReferralSource": "hospital", - "AssignedStaffId": 4, - "StartDate": "1403/08/05", - "EndDate": "" - }, - { - "ID": 33, - "FirstName": "علیرضا", - "LastName": "شاهی", - "DateOfBirth": "1353/10/25", - "Sex": "male", - "Phone": "09161357900", - "Address": { - "ID": 33, - "PostalCode": "4560123789", - "Name": "home", - "Lat": 31.8955, - "Lon": 54.3701, - "CityID": 77, - "ProvinceID": 27 - }, - "CaseStatus": "open", - "ReferralSource": "hospital", - "AssignedStaffId": 6, - "StartDate": "1403/08/18", - "EndDate": "" - }, - { - "ID": 34, - "FirstName": "نسرین", - "LastName": "جلیلی", - "DateOfBirth": "1383/03/12", - "Sex": "female", - "Phone": "09341357900", - "Address": { - "ID": 34, - "PostalCode": "7893216540", - "Name": "home", - "Lat": 37.4713, - "Lon": 49.7166, - "CityID": 22, - "ProvinceID": 9 - }, - "CaseStatus": "closed", - "ReferralSource": "hospital", - "AssignedStaffId": 1, - "StartDate": "1401/03/07", - "EndDate": "1402/11/20" - }, - { - "ID": 35, - "FirstName": "آرش", - "LastName": "فرهادی", - "DateOfBirth": "1368/07/21", - "Sex": "male", - "Phone": "09171357900", - "Address": { - "ID": 35, - "PostalCode": "3210987654", - "Name": "home", - "Lat": 28.9234, - "Lon": 50.8203, - "CityID": 94, - "ProvinceID": 32 - }, - "CaseStatus": "open", - "ReferralSource": "hospital", - "AssignedStaffId": 9, - "StartDate": "1403/09/01", - "EndDate": "" - }, - { - "ID": 36, - "FirstName": "مژده", - "LastName": "کوهی", - "DateOfBirth": "1377/12/14", - "Sex": "female", - "Phone": "09221357900", - "Address": { - "ID": 36, - "PostalCode": "6547893210", - "Name": "home", - "Lat": 35.3219, - "Lon": 46.9979, - "CityID": 41, - "ProvinceID": 15 - }, - "CaseStatus": "open", - "ReferralSource": "hospital", - "AssignedStaffId": 3, - "StartDate": "1403/09/15", - "EndDate": "" - }, - { - "ID": 37, - "FirstName": "حمید", - "LastName": "شکری", - "DateOfBirth": "1360/05/03", - "Sex": "male", - "Phone": "09191357900", - "Address": { - "ID": 37, - "PostalCode": "9213456780", - "Name": "home", - "Lat": 34.0840, - "Lon": 49.6967, - "CityID": 64, - "ProvinceID": 22 - }, - "CaseStatus": "open", - "ReferralSource": "hospital", - "AssignedStaffId": 8, - "StartDate": "1403/10/02", - "EndDate": "" - }, - { - "ID": 38, - "FirstName": "ندا", - "LastName": "پورمحمد", - "DateOfBirth": "1385/08/28", - "Sex": "female", - "Phone": "09381357900", - "Address": { - "ID": 38, - "PostalCode": "0132456789", - "Name": "home", - "Lat": 31.5497, - "Lon": 48.7547, - "CityID": 88, - "ProvinceID": 24 - }, - "CaseStatus": "open", - "ReferralSource": "hospital", - "AssignedStaffId": 2, - "StartDate": "1403/10/18", - "EndDate": "" - }, - { - "ID": 39, - "FirstName": "صادق", - "LastName": "محسنی", - "DateOfBirth": "1354/01/30", - "Sex": "male", - "Phone": "09101357900", - "Address": { - "ID": 39, - "PostalCode": "5678123490", - "Name": "home", - "Lat": 30.4271, - "Lon": 48.2121, - "CityID": 97, - "ProvinceID": 30 - }, - "CaseStatus": "open", - "ReferralSource": "hospital", - "AssignedStaffId": 5, - "StartDate": "1403/11/05", - "EndDate": "" - }, - { - "ID": 40, - "FirstName": "فروغ", - "LastName": "ملکی", - "DateOfBirth": "1370/04/17", - "Sex": "female", - "Phone": "09371357900", - "Address": { - "ID": 40, - "PostalCode": "3214567890", - "Name": "home", - "Lat": 37.0539, - "Lon": 54.8340, - "CityID": 7, - "ProvinceID": 3 - }, - "CaseStatus": "open", - "ReferralSource": "hospital", - "AssignedStaffId": 7, - "StartDate": "1403/11/20", - "EndDate": "" - }, - { - "ID": 41, - "FirstName": "پدرام", - "LastName": "ولی", - "DateOfBirth": "1365/11/09", - "Sex": "male", - "Phone": "09129876543", - "Address": { - "ID": 41, - "PostalCode": "8901234567", - "Name": "home", - "Lat": 36.5544, - "Lon": 52.6611, - "CityID": 28, - "ProvinceID": 6 - }, - "CaseStatus": "open", - "ReferralSource": "hospital", - "AssignedStaffId": 4, - "StartDate": "1403/12/01", - "EndDate": "" - }, - { - "ID": 42, - "FirstName": "زینب", - "LastName": "احمدپور", - "DateOfBirth": "1380/02/20", - "Sex": "female", - "Phone": "09359876543", - "Address": { - "ID": 42, - "PostalCode": "1234509876", - "Name": "home", - "Lat": 35.6777, - "Lon": 51.3888, - "CityID": 14, - "ProvinceID": 8 - }, - "CaseStatus": "closed", - "ReferralSource": "hospital", - "AssignedStaffId": 6, - "StartDate": "1401/08/12", - "EndDate": "1402/06/30" - }, - { - "ID": 43, - "FirstName": "کامران", - "LastName": "درویشی", - "DateOfBirth": "1358/09/14", - "Sex": "male", - "Phone": "09189876543", - "Address": { - "ID": 43, - "PostalCode": "6789012340", - "Name": "home", - "Lat": 32.6719, - "Lon": 51.6618, - "CityID": 43, - "ProvinceID": 4 - }, - "CaseStatus": "open", - "ReferralSource": "hospital", - "AssignedStaffId": 1, - "StartDate": "1404/01/10", - "EndDate": "" - }, - { - "ID": 44, - "FirstName": "آرزو", - "LastName": "حاتمی", - "DateOfBirth": "1376/07/05", - "Sex": "female", - "Phone": "09309876543", - "Address": { - "ID": 44, - "PostalCode": "2345016789", - "Name": "home", - "Lat": 34.3277, - "Lon": 47.0785, - "CityID": 75, - "ProvinceID": 19 - }, - "CaseStatus": "open", - "ReferralSource": "hospital", - "AssignedStaffId": 9, - "StartDate": "1404/01/25", - "EndDate": "" - }, - { - "ID": 45, - "FirstName": "بابک", - "LastName": "معینی", - "DateOfBirth": "1363/04/19", - "Sex": "male", - "Phone": "09149876543", - "Address": { - "ID": 45, - "PostalCode": "9078563412", - "Name": "home", - "Lat": 38.0792, - "Lon": 46.2895, - "CityID": 5, - "ProvinceID": 2 - }, - "CaseStatus": "open", - "ReferralSource": "hospital", - "AssignedStaffId": 3, - "StartDate": "1404/02/08", - "EndDate": "" - }, - { - "ID": 46, - "FirstName": "مهناز", - "LastName": "قربانی", - "DateOfBirth": "1372/12/01", - "Sex": "female", - "Phone": "09369876543", - "Address": { - "ID": 46, - "PostalCode": "4563218790", - "Name": "home", - "Lat": 37.2710, - "Lon": 49.5887, - "CityID": 67, - "ProvinceID": 22 - }, - "CaseStatus": "open", - "ReferralSource": "hospital", - "AssignedStaffId": 8, - "StartDate": "1404/02/22", - "EndDate": "" - }, - { - "ID": 47, - "FirstName": "ایمان", - "LastName": "رحمانی", - "DateOfBirth": "1367/06/24", - "Sex": "male", - "Phone": "09119876543", - "Address": { - "ID": 47, - "PostalCode": "1087923456", - "Name": "home", - "Lat": 36.2972, - "Lon": 59.6067, - "CityID": 35, - "ProvinceID": 13 - }, - "CaseStatus": "open", - "ReferralSource": "hospital", - "AssignedStaffId": 2, - "StartDate": "1404/03/05", - "EndDate": "" - }, - { - "ID": 48, - "FirstName": "شادی", - "LastName": "امیری", - "DateOfBirth": "1381/03/17", - "Sex": "female", - "Phone": "09219876543", - "Address": { - "ID": 48, - "PostalCode": "6541237890", - "Name": "home", - "Lat": 33.9900, - "Lon": 50.8736, - "CityID": 53, - "ProvinceID": 17 - }, - "CaseStatus": "open", - "ReferralSource": "hospital", - "AssignedStaffId": 5, - "StartDate": "1404/03/20", - "EndDate": "" - }, - { - "ID": 49, - "FirstName": "بهروز", - "LastName": "سبزواری", - "DateOfBirth": "1355/10/08", - "Sex": "male", - "Phone": "09159876543", - "Address": { - "ID": 49, - "PostalCode": "7893045612", - "Name": "home", - "Lat": 29.6060, - "Lon": 52.5311, - "CityID": 91, - "ProvinceID": 30 - }, - "CaseStatus": "open", - "ReferralSource": "hospital", - "AssignedStaffId": 7, - "StartDate": "1404/04/01", - "EndDate": "" - }, - { - "ID": 50, - "FirstName": "ترانه", - "LastName": "محمودی", - "DateOfBirth": "1384/08/11", - "Sex": "female", - "Phone": "09399876543", - "Address": { - "ID": 50, - "PostalCode": "2340897615", - "Name": "home", - "Lat": 31.3203, - "Lon": 48.6692, - "CityID": 62, - "ProvinceID": 24 - }, - "CaseStatus": "closed", - "ReferralSource": "hospital", - "AssignedStaffId": 4, - "StartDate": "1401/10/05", - "EndDate": "1402/08/15" - }, - { - "ID": 51, - "FirstName": "فریدون", - "LastName": "نعمتی", - "DateOfBirth": "1357/01/27", - "Sex": "male", - "Phone": "09139876543", - "Address": { - "ID": 51, - "PostalCode": "5671289034", - "Name": "home", - "Lat": 30.2839, - "Lon": 57.0834, - "CityID": 73, - "ProvinceID": 28 - }, - "CaseStatus": "open", - "ReferralSource": "hospital", - "AssignedStaffId": 6, - "StartDate": "1404/04/18", - "EndDate": "" - }, - { - "ID": 52, - "FirstName": "مهسا", - "LastName": "خلیلی", - "DateOfBirth": "1378/05/23", - "Sex": "female", - "Phone": "09339876543", - "Address": { - "ID": 52, - "PostalCode": "9034567812", - "Name": "home", - "Lat": 37.5527, - "Lon": 45.0760, - "CityID": 8, - "ProvinceID": 3 - }, - "CaseStatus": "open", - "ReferralSource": "hospital", - "AssignedStaffId": 1, - "StartDate": "1404/05/02", - "EndDate": "" - }, - { - "ID": 53, - "FirstName": "جلال", - "LastName": "حبیبی", - "DateOfBirth": "1362/11/15", - "Sex": "male", - "Phone": "09169876543", - "Address": { - "ID": 53, - "PostalCode": "1289034567", - "Name": "home", - "Lat": 34.7960, - "Lon": 48.5146, - "CityID": 55, - "ProvinceID": 20 - }, - "CaseStatus": "open", - "ReferralSource": "hospital", - "AssignedStaffId": 9, - "StartDate": "1404/05/18", - "EndDate": "" - }, - { - "ID": 54, - "FirstName": "صبا", - "LastName": "خوش‌نژاد", - "DateOfBirth": "1387/02/07", - "Sex": "female", - "Phone": "09349876543", - "Address": { - "ID": 54, - "PostalCode": "3450678912", - "Name": "home", - "Lat": 35.6836, - "Lon": 51.4211, - "CityID": 14, - "ProvinceID": 8 - }, - "CaseStatus": "open", - "ReferralSource": "hospital", - "AssignedStaffId": 3, - "StartDate": "1404/06/01", - "EndDate": "" - }, - { - "ID": 55, - "FirstName": "هادی", - "LastName": "خدابخش", - "DateOfBirth": "1366/09/29", - "Sex": "male", - "Phone": "09179876543", - "Address": { - "ID": 55, - "PostalCode": "7812034560", - "Name": "home", - "Lat": 36.8962, - "Lon": 54.4334, - "CityID": 78, - "ProvinceID": 25 - }, - "CaseStatus": "open", - "ReferralSource": "hospital", - "AssignedStaffId": 8, - "StartDate": "1404/06/15", - "EndDate": "" - }, - { - "ID": 56, - "FirstName": "افسانه", - "LastName": "دهقانی", - "DateOfBirth": "1373/07/12", - "Sex": "female", - "Phone": "09229876543", - "Address": { - "ID": 56, - "PostalCode": "6780123459", - "Name": "home", - "Lat": 30.2672, - "Lon": 50.0079, - "CityID": 46, - "ProvinceID": 16 - }, - "CaseStatus": "open", - "ReferralSource": "hospital", - "AssignedStaffId": 2, - "StartDate": "1404/07/01", - "EndDate": "" - }, - { - "ID": 57, - "FirstName": "سروش", - "LastName": "پاک‌نهاد", - "DateOfBirth": "1360/03/04", - "Sex": "male", - "Phone": "09199876543", - "Address": { - "ID": 57, - "PostalCode": "4509123678", - "Name": "home", - "Lat": 31.8974, - "Lon": 54.3678, - "CityID": 69, - "ProvinceID": 27 - }, - "CaseStatus": "open", - "ReferralSource": "hospital", - "AssignedStaffId": 5, - "StartDate": "1404/07/18", - "EndDate": "" - }, - { - "ID": 58, - "FirstName": "فرناز", - "LastName": "بهرامی", - "DateOfBirth": "1382/10/20", - "Sex": "female", - "Phone": "09389876543", - "Address": { - "ID": 58, - "PostalCode": "2356789014", - "Name": "home", - "Lat": 38.4192, - "Lon": 44.9671, - "CityID": 12, - "ProvinceID": 1 - }, - "CaseStatus": "open", - "ReferralSource": "hospital", - "AssignedStaffId": 7, - "StartDate": "1404/08/05", - "EndDate": "" - }, - { - "ID": 59, - "FirstName": "ابراهیم", - "LastName": "ستاری", - "DateOfBirth": "1354/07/16", - "Sex": "male", - "Phone": "09109876543", - "Address": { - "ID": 59, - "PostalCode": "7890234561", - "Name": "home", - "Lat": 33.5731, - "Lon": 48.3956, - "CityID": 34, - "ProvinceID": 12 - }, - "CaseStatus": "closed", - "ReferralSource": "hospital", - "AssignedStaffId": 4, - "StartDate": "1401/04/01", - "EndDate": "1402/10/10" - }, - { - "ID": 60, - "FirstName": "گیتا", - "LastName": "نادری", - "DateOfBirth": "1376/04/28", - "Sex": "female", - "Phone": "09379876543", - "Address": { - "ID": 60, - "PostalCode": "1345678092", - "Name": "home", - "Lat": 35.3392, - "Lon": 46.9964, - "CityID": 57, - "ProvinceID": 21 - }, - "CaseStatus": "open", - "ReferralSource": "hospital", - "AssignedStaffId": 6, - "StartDate": "1404/08/20", - "EndDate": "" - }, - { - "ID": 61, - "FirstName": "مصطفی", - "LastName": "میرزایی", - "DateOfBirth": "1363/01/11", - "Sex": "male", - "Phone": "09125551234", - "Address": { - "ID": 61, - "PostalCode": "9034512678", - "Name": "home", - "Lat": 29.9553, - "Lon": 55.4368, - "CityID": 83, - "ProvinceID": 29 - }, - "CaseStatus": "open", - "ReferralSource": "hospital", - "AssignedStaffId": 1, - "StartDate": "1404/09/01", - "EndDate": "" - }, - { - "ID": 62, - "FirstName": "هنگامه", - "LastName": "کاظمی", - "DateOfBirth": "1379/11/08", - "Sex": "female", - "Phone": "09355551234", - "Address": { - "ID": 62, - "PostalCode": "6701234589", - "Name": "home", - "Lat": 36.6689, - "Lon": 48.5136, - "CityID": 26, - "ProvinceID": 10 - }, - "CaseStatus": "open", - "ReferralSource": "hospital", - "AssignedStaffId": 9, - "StartDate": "1404/09/15", - "EndDate": "" - }, - { - "ID": 63, - "FirstName": "فواد", - "LastName": "شریعتی", - "DateOfBirth": "1359/06/22", - "Sex": "male", - "Phone": "09185551234", - "Address": { - "ID": 63, - "PostalCode": "3456012789", - "Name": "home", - "Lat": 31.2667, - "Lon": 56.9667, - "CityID": 100, - "ProvinceID": 32 - }, - "CaseStatus": "open", - "ReferralSource": "hospital", - "AssignedStaffId": 3, - "StartDate": "1404/10/02", - "EndDate": "" - }, - { - "ID": 64, - "FirstName": "سوسن", - "LastName": "دوستی", - "DateOfBirth": "1374/09/14", - "Sex": "female", - "Phone": "09305551234", - "Address": { - "ID": 64, - "PostalCode": "8912034567", - "Name": "home", - "Lat": 32.4667, - "Lon": 53.6667, - "CityID": 47, - "ProvinceID": 18 - }, - "CaseStatus": "open", - "ReferralSource": "hospital", - "AssignedStaffId": 8, - "StartDate": "1404/10/18", - "EndDate": "" - }, - { - "ID": 65, - "FirstName": "تورج", - "LastName": "ایمانی", - "DateOfBirth": "1356/04/30", - "Sex": "male", - "Phone": "09145551234", - "Address": { - "ID": 65, - "PostalCode": "2134567890", - "Name": "home", - "Lat": 37.9380, - "Lon": 58.3660, - "CityID": 71, - "ProvinceID": 26 - }, - "CaseStatus": "open", - "ReferralSource": "hospital", - "AssignedStaffId": 2, - "StartDate": "1404/11/05", - "EndDate": "" - }, - { - "ID": 66, - "FirstName": "شبنم", - "LastName": "احمدزاده", - "DateOfBirth": "1385/01/17", - "Sex": "female", - "Phone": "09365551234", - "Address": { - "ID": 66, - "PostalCode": "5678094321", - "Name": "home", - "Lat": 35.7447, - "Lon": 50.0890, - "CityID": 16, - "ProvinceID": 7 - }, - "CaseStatus": "closed", - "ReferralSource": "hospital", - "AssignedStaffId": 5, - "StartDate": "1401/02/15", - "EndDate": "1402/04/05" - }, - { - "ID": 67, - "FirstName": "عباس", - "LastName": "طباطبایی", - "DateOfBirth": "1358/08/09", - "Sex": "male", - "Phone": "09115551234", - "Address": { - "ID": 67, - "PostalCode": "0912347856", - "Name": "home", - "Lat": 33.0953, - "Lon": 51.5051, - "CityID": 59, - "ProvinceID": 23 - }, - "CaseStatus": "open", - "ReferralSource": "hospital", - "AssignedStaffId": 7, - "StartDate": "1404/11/20", - "EndDate": "" - }, - { - "ID": 68, - "FirstName": "مهتاب", - "LastName": "اکبرزاده", - "DateOfBirth": "1383/06/26", - "Sex": "female", - "Phone": "09215551234", - "Address": { - "ID": 68, - "PostalCode": "7456238901", - "Name": "home", - "Lat": 30.8161, - "Lon": 57.0985, - "CityID": 85, - "ProvinceID": 31 - }, - "CaseStatus": "open", - "ReferralSource": "hospital", - "AssignedStaffId": 4, - "StartDate": "1404/12/01", - "EndDate": "" - }, - { - "ID": 69, - "FirstName": "قاسم", - "LastName": "ذاکری", - "DateOfBirth": "1362/02/15", - "Sex": "male", - "Phone": "09155551234", - "Address": { - "ID": 69, - "PostalCode": "3890127456", - "Name": "home", - "Lat": 36.2605, - "Lon": 50.0041, - "CityID": 31, - "ProvinceID": 14 - }, - "CaseStatus": "open", - "ReferralSource": "hospital", - "AssignedStaffId": 6, - "StartDate": "1404/12/15", - "EndDate": "" - }, - { - "ID": 70, - "FirstName": "نیلوفر", - "LastName": "وطن‌دوست", - "DateOfBirth": "1375/10/03", - "Sex": "female", - "Phone": "09395551234", - "Address": { - "ID": 70, - "PostalCode": "1267890345", - "Name": "home", - "Lat": 34.9081, - "Lon": 50.8756, - "CityID": 53, - "ProvinceID": 17 - }, - "CaseStatus": "open", - "ReferralSource": "hospital", - "AssignedStaffId": 1, - "StartDate": "1405/01/05", - "EndDate": "" - }, - { - "ID": 71, - "FirstName": "سهراب", - "LastName": "قلی‌زاده", - "DateOfBirth": "1361/11/21", - "Sex": "male", - "Phone": "09135551234", - "Address": { - "ID": 71, - "PostalCode": "4512367890", - "Name": "home", - "Lat": 31.8955, - "Lon": 54.3701, - "CityID": 77, - "ProvinceID": 27 - }, - "CaseStatus": "open", - "ReferralSource": "hospital", - "AssignedStaffId": 9, - "StartDate": "1405/01/10", - "EndDate": "" - }, - { - "ID": 72, - "FirstName": "آناهیتا", - "LastName": "رضوانی", - "DateOfBirth": "1386/07/14", - "Sex": "female", - "Phone": "09335551234", - "Address": { - "ID": 72, - "PostalCode": "8034512679", - "Name": "home", - "Lat": 37.4713, - "Lon": 49.7166, - "CityID": 22, - "ProvinceID": 9 - }, - "CaseStatus": "open", - "ReferralSource": "hospital", - "AssignedStaffId": 3, - "StartDate": "1405/01/12", - "EndDate": "" - }, - { - "ID": 73, - "FirstName": "منوچهر", - "LastName": "صمدی", - "DateOfBirth": "1353/05/18", - "Sex": "male", - "Phone": "09165551234", - "Address": { - "ID": 73, - "PostalCode": "6789345012", - "Name": "home", - "Lat": 28.9234, - "Lon": 50.8203, - "CityID": 94, - "ProvinceID": 32 - }, - "CaseStatus": "open", - "ReferralSource": "hospital", - "AssignedStaffId": 8, - "StartDate": "1405/01/13", - "EndDate": "" - }, - { - "ID": 74, - "FirstName": "فرحناز", - "LastName": "ضیایی", - "DateOfBirth": "1377/01/25", - "Sex": "female", - "Phone": "09345551234", - "Address": { - "ID": 74, - "PostalCode": "2301456789", - "Name": "home", - "Lat": 35.3219, - "Lon": 46.9979, - "CityID": 41, - "ProvinceID": 15 - }, - "CaseStatus": "open", - "ReferralSource": "hospital", - "AssignedStaffId": 2, - "StartDate": "1405/01/13", - "EndDate": "" - }, - { - "ID": 75, - "FirstName": "کیوان", - "LastName": "پیری", - "DateOfBirth": "1364/09/07", - "Sex": "male", - "Phone": "09175551234", - "Address": { - "ID": 75, - "PostalCode": "5678901432", - "Name": "home", - "Lat": 34.0840, - "Lon": 49.6967, - "CityID": 64, - "ProvinceID": 22 - }, - "CaseStatus": "closed", - "ReferralSource": "hospital", - "AssignedStaffId": 5, - "StartDate": "1401/12/01", - "EndDate": "1402/12/15" - }, - { - "ID": 76, - "FirstName": "سمیه", - "LastName": "مختاری", - "DateOfBirth": "1371/04/11", - "Sex": "female", - "Phone": "09225551234", - "Address": { - "ID": 76, - "PostalCode": "9012345678", - "Name": "home", - "Lat": 31.5497, - "Lon": 48.7547, - "CityID": 88, - "ProvinceID": 24 - }, - "CaseStatus": "open", - "ReferralSource": "hospital", - "AssignedStaffId": 7, - "StartDate": "1405/01/13", - "EndDate": "" - }, - { - "ID": 77, - "FirstName": "رامین", - "LastName": "بیگدلی", - "DateOfBirth": "1360/12/28", - "Sex": "male", - "Phone": "09195551234", - "Address": { - "ID": 77, - "PostalCode": "3456789102", - "Name": "home", - "Lat": 30.4271, - "Lon": 48.2121, - "CityID": 97, - "ProvinceID": 30 - }, - "CaseStatus": "open", - "ReferralSource": "hospital", - "AssignedStaffId": 4, - "StartDate": "1405/01/13", - "EndDate": "" - }, - { - "ID": 78, - "FirstName": "ثریا", - "LastName": "عارف", - "DateOfBirth": "1380/08/17", - "Sex": "female", - "Phone": "09385551234", - "Address": { - "ID": 78, - "PostalCode": "7891234056", - "Name": "home", - "Lat": 37.0539, - "Lon": 54.8340, - "CityID": 7, - "ProvinceID": 3 - }, - "CaseStatus": "open", - "ReferralSource": "hospital", - "AssignedStaffId": 6, - "StartDate": "1405/01/13", - "EndDate": "" - }, - { - "ID": 79, - "FirstName": "ژاله", - "LastName": "حکیمی", - "DateOfBirth": "1368/03/22", - "Sex": "female", - "Phone": "09105551234", - "Address": { - "ID": 79, - "PostalCode": "2345601789", - "Name": "home", - "Lat": 36.5544, - "Lon": 52.6611, - "CityID": 28, - "ProvinceID": 6 - }, - "CaseStatus": "open", - "ReferralSource": "hospital", - "AssignedStaffId": 1, - "StartDate": "1405/01/13", - "EndDate": "" - }, - { - "ID": 80, - "FirstName": "ارسلان", - "LastName": "فلاح", - "DateOfBirth": "1355/06/14", - "Sex": "male", - "Phone": "09375551234", - "Address": { - "ID": 80, - "PostalCode": "6012345789", - "Name": "home", - "Lat": 35.6777, - "Lon": 51.3888, - "CityID": 14, - "ProvinceID": 8 - }, - "CaseStatus": "open", - "ReferralSource": "hospital", - "AssignedStaffId": 9, - "StartDate": "1405/01/13", - "EndDate": "" - }, - { - "ID": 81, - "FirstName": "پونه", - "LastName": "طلایی", - "DateOfBirth": "1382/12/05", - "Sex": "female", - "Phone": "09127778901", - "Address": { - "ID": 81, - "PostalCode": "4567890213", - "Name": "home", - "Lat": 32.6719, - "Lon": 51.6618, - "CityID": 43, - "ProvinceID": 4 - }, - "CaseStatus": "open", - "ReferralSource": "hospital", - "AssignedStaffId": 3, - "StartDate": "1405/01/13", - "EndDate": "" - }, - { - "ID": 82, - "FirstName": "کریم", - "LastName": "معظمی", - "DateOfBirth": "1357/09/01", - "Sex": "male", - "Phone": "09357778901", - "Address": { - "ID": 82, - "PostalCode": "1908234567", - "Name": "home", - "Lat": 34.3277, - "Lon": 47.0785, - "CityID": 88, - "ProvinceID": 19 - }, - "CaseStatus": "open", - "ReferralSource": "hospital", - "AssignedStaffId": 8, - "StartDate": "1405/01/13", - "EndDate": "" - }, - { - "ID": 83, - "FirstName": "فریبا", - "LastName": "خاکپور", - "DateOfBirth": "1374/06/20", - "Sex": "female", - "Phone": "09187778901", - "Address": { - "ID": 83, - "PostalCode": "8745123609", - "Name": "home", - "Lat": 38.0799, - "Lon": 46.2919, - "CityID": 5, - "ProvinceID": 2 - }, - "CaseStatus": "closed", - "ReferralSource": "hospital", - "AssignedStaffId": 2, - "StartDate": "1401/01/10", - "EndDate": "1403/01/10" - }, - { - "ID": 84, - "FirstName": "غلامرضا", - "LastName": "توکلی", - "DateOfBirth": "1352/03/15", - "Sex": "male", - "Phone": "09307778901", - "Address": { - "ID": 84, - "PostalCode": "0123456897", - "Name": "home", - "Lat": 37.2808, - "Lon": 49.5832, - "CityID": 67, - "ProvinceID": 22 - }, - "CaseStatus": "open", - "ReferralSource": "hospital", - "AssignedStaffId": 5, - "StartDate": "1405/01/13", - "EndDate": "" - }, - { - "ID": 85, - "FirstName": "آرمین", - "LastName": "حق‌شناس", - "DateOfBirth": "1369/12/10", - "Sex": "male", - "Phone": "09147778901", - "Address": { - "ID": 85, - "PostalCode": "5601234789", - "Name": "home", - "Lat": 35.1833, - "Lon": 47.0000, - "CityID": 32, - "ProvinceID": 11 - }, - "CaseStatus": "open", - "ReferralSource": "hospital", - "AssignedStaffId": 7, - "StartDate": "1405/01/13", - "EndDate": "" - }, - { - "ID": 86, - "FirstName": "تهمینه", - "LastName": "فروزنده", - "DateOfBirth": "1378/10/27", - "Sex": "female", - "Phone": "09367778901", - "Address": { - "ID": 86, - "PostalCode": "3789012456", - "Name": "home", - "Lat": 33.9900, - "Lon": 50.8736, - "CityID": 51, - "ProvinceID": 17 - }, - "CaseStatus": "open", - "ReferralSource": "hospital", - "AssignedStaffId": 4, - "StartDate": "1405/01/13", - "EndDate": "" - }, - { - "ID": 87, - "FirstName": "نادر", - "LastName": "مشهدی", - "DateOfBirth": "1361/08/18", - "Sex": "male", - "Phone": "09117778901", - "Address": { - "ID": 87, - "PostalCode": "9123450678", - "Name": "home", - "Lat": 30.2839, - "Lon": 57.0834, - "CityID": 73, - "ProvinceID": 28 - }, - "CaseStatus": "open", - "ReferralSource": "hospital", - "AssignedStaffId": 6, - "StartDate": "1405/01/13", - "EndDate": "" - }, - { - "ID": 88, - "FirstName": "ماندانا", - "LastName": "صبوری", - "DateOfBirth": "1376/05/05", - "Sex": "female", - "Phone": "09217778901", - "Address": { - "ID": 88, - "PostalCode": "6034512789", - "Name": "home", - "Lat": 36.5683, - "Lon": 53.0601, - "CityID": 19, - "ProvinceID": 6 - }, - "CaseStatus": "open", - "ReferralSource": "hospital", - "AssignedStaffId": 1, - "StartDate": "1405/01/13", - "EndDate": "" - }, - { - "ID": 89, - "FirstName": "بیژن", - "LastName": "مهدوی", - "DateOfBirth": "1363/11/23", - "Sex": "male", - "Phone": "09157778901", - "Address": { - "ID": 89, - "PostalCode": "1234896057", - "Name": "home", - "Lat": 31.3203, - "Lon": 48.6692, - "CityID": 62, - "ProvinceID": 24 - }, - "CaseStatus": "open", - "ReferralSource": "hospital", - "AssignedStaffId": 9, - "StartDate": "1405/01/13", - "EndDate": "" - }, - { - "ID": 90, - "FirstName": "حمیده", - "LastName": "میری", - "DateOfBirth": "1381/07/10", - "Sex": "female", - "Phone": "09397778901", - "Address": { - "ID": 90, - "PostalCode": "7893456012", - "Name": "home", - "Lat": 29.6060, - "Lon": 52.5311, - "CityID": 91, - "ProvinceID": 30 - }, - "CaseStatus": "closed", - "ReferralSource": "hospital", - "AssignedStaffId": 3, - "StartDate": "1401/06/01", - "EndDate": "1403/06/01" - }, - { - "ID": 91, - "FirstName": "اردشیر", - "LastName": "نوروزی", - "DateOfBirth": "1358/04/06", - "Sex": "male", - "Phone": "09137778901", - "Address": { - "ID": 91, - "PostalCode": "0456789123", - "Name": "home", - "Lat": 37.5527, - "Lon": 45.0760, - "CityID": 8, - "ProvinceID": 3 - }, - "CaseStatus": "open", - "ReferralSource": "hospital", - "AssignedStaffId": 8, - "StartDate": "1405/01/13", - "EndDate": "" - }, - { - "ID": 92, - "FirstName": "حمیرا", - "LastName": "تقوی", - "DateOfBirth": "1373/02/18", - "Sex": "female", - "Phone": "09337778901", - "Address": { - "ID": 92, - "PostalCode": "5012345679", - "Name": "home", - "Lat": 34.7960, - "Lon": 48.5146, - "CityID": 55, - "ProvinceID": 20 - }, - "CaseStatus": "open", - "ReferralSource": "hospital", - "AssignedStaffId": 2, - "StartDate": "1405/01/13", - "EndDate": "" - }, - { - "ID": 93, - "FirstName": "فریدون", - "LastName": "آهنگر", - "DateOfBirth": "1355/08/30", - "Sex": "male", - "Phone": "09167778901", - "Address": { - "ID": 93, - "PostalCode": "2890134567", - "Name": "home", - "Lat": 35.6836, - "Lon": 51.4211, - "CityID": 23, - "ProvinceID": 9 - }, - "CaseStatus": "open", - "ReferralSource": "hospital", - "AssignedStaffId": 5, - "StartDate": "1405/01/13", - "EndDate": "" - }, - { - "ID": 94, - "FirstName": "رزا", - "LastName": "یاری", - "DateOfBirth": "1384/11/15", - "Sex": "female", - "Phone": "09347778901", - "Address": { - "ID": 94, - "PostalCode": "7456890123", - "Name": "home", - "Lat": 36.8962, - "Lon": 54.4334, - "CityID": 78, - "ProvinceID": 25 - }, - "CaseStatus": "open", - "ReferralSource": "hospital", - "AssignedStaffId": 7, - "StartDate": "1405/01/13", - "EndDate": "" - }, - { - "ID": 95, - "FirstName": "میثم", - "LastName": "کرمی", - "DateOfBirth": "1367/01/07", - "Sex": "male", - "Phone": "09177778901", - "Address": { - "ID": 95, - "PostalCode": "3123456789", - "Name": "home", - "Lat": 30.2672, - "Lon": 50.0079, - "CityID": 46, - "ProvinceID": 16 - }, - "CaseStatus": "open", - "ReferralSource": "hospital", - "AssignedStaffId": 4, - "StartDate": "1405/01/13", - "EndDate": "" - }, - { - "ID": 96, - "FirstName": "سلما", - "LastName": "ایزدی", - "DateOfBirth": "1379/04/24", - "Sex": "female", - "Phone": "09227778901", - "Address": { - "ID": 96, - "PostalCode": "8901234765", - "Name": "home", - "Lat": 31.8974, - "Lon": 54.3678, - "CityID": 69, - "ProvinceID": 27 - }, - "CaseStatus": "open", - "ReferralSource": "hospital", - "AssignedStaffId": 6, - "StartDate": "1405/01/13", - "EndDate": "" - }, - { - "ID": 97, - "FirstName": "شهریار", - "LastName": "بختیاری", - "DateOfBirth": "1357/07/11", - "Sex": "male", - "Phone": "09197778901", - "Address": { - "ID": 97, - "PostalCode": "4567012398", - "Name": "home", - "Lat": 38.4192, - "Lon": 44.9671, - "CityID": 12, - "ProvinceID": 1 - }, - "CaseStatus": "open", - "ReferralSource": "hospital", - "AssignedStaffId": 1, - "StartDate": "1405/01/13", - "EndDate": "" - }, - { - "ID": 98, - "FirstName": "اعظم", - "LastName": "شمس", - "DateOfBirth": "1372/10/28", - "Sex": "female", - "Phone": "09387778901", - "Address": { - "ID": 98, - "PostalCode": "1234567809", - "Name": "home", - "Lat": 33.5731, - "Lon": 48.3956, - "CityID": 34, - "ProvinceID": 12 - }, - "CaseStatus": "open", - "ReferralSource": "hospital", - "AssignedStaffId": 9, - "StartDate": "1405/01/13", - "EndDate": "" - }, - { - "ID": 99, - "FirstName": "احمد", - "LastName": "فیروزی", - "DateOfBirth": "1362/06/19", - "Sex": "male", - "Phone": "09107778901", - "Address": { - "ID": 99, - "PostalCode": "6789123450", - "Name": "home", - "Lat": 35.3392, - "Lon": 46.9964, - "CityID": 57, - "ProvinceID": 21 - }, - "CaseStatus": "open", - "ReferralSource": "hospital", - "AssignedStaffId": 3, - "StartDate": "1405/01/13", - "EndDate": "" - }, - { - "ID": 100, - "FirstName": "ملیکا", - "LastName": "صفوی", - "DateOfBirth": "1386/03/08", - "Sex": "female", - "Phone": "09377778901", - "Address": { - "ID": 100, - "PostalCode": "2345678190", - "Name": "home", - "Lat": 29.9553, - "Lon": 55.4368, - "CityID": 83, - "ProvinceID": 29 - }, - "CaseStatus": "open", - "ReferralSource": "hospital", - "AssignedStaffId": 8, - "StartDate": "1405/01/13", - "EndDate": "" - } -] diff --git a/patientapp/service/analytic/param.go b/patientapp/service/analytic/param.go index bd7d4400..da14af37 100644 --- a/patientapp/service/analytic/param.go +++ b/patientapp/service/analytic/param.go @@ -15,8 +15,7 @@ type ListPatientAnalyticRequest struct { Search *string `query:"search,omitempty"` - Limit int `query:"limit,omitempty"` - Offset int `query:"offset,omitempty"` + Pagination *Pagination `query:"pagination,omitempty"` } type PatientAnalyticItem struct { @@ -29,10 +28,9 @@ type PatientAnalyticItem struct { Address entity.Address `json:"address"` } type PatientAnalyticResponse struct { - Items []PatientAnalyticItem `json:"items"` - Limit int `json:"limit"` - Offset int `json:"offset"` - Total int `json:"total"` + Items []PatientAnalyticItem `json:"items"` + Pagination *Pagination `json:"pagination"` + Total int `json:"total"` } func ToPatientResponse(patient entity.Patient) PatientAnalyticItem { @@ -50,8 +48,7 @@ func ToPatientResponse(patient entity.Patient) PatientAnalyticItem { } } -// =========================== Map ================================== - +// GetPatientMapSummaryRequest =========================== Map ================================== type GetPatientMapSummaryRequest struct { Level entity.MapLevel `query:"level"` ParentID *int `query:"parentID"` @@ -66,3 +63,9 @@ type GetPatientMapSummaryResponse struct { Level entity.MapLevel `json:"level"` Items map[uint][]entity.MapSummaryItem `json:"items"` } + +// Pagination ================================ Pagination ============================= +type Pagination struct { + Limit int `query:"limit,omitempty"` + Offset int `query:"offset,omitempty"` +} diff --git a/patientapp/service/analytic/service.go b/patientapp/service/analytic/service.go index 683f9a74..518d8756 100644 --- a/patientapp/service/analytic/service.go +++ b/patientapp/service/analytic/service.go @@ -19,25 +19,23 @@ type Repository interface { GetPatients(ctx context.Context, f PatientFilter) ([]entity.Patient, error) CountPatients(ctx context.Context, f PatientFilter) (int, error) - SummaryByCity(ctx context.Context, provinceID int, f PatientMapFilter) (map[uint][]entity.MapSummaryItem, error) + SummaryByCity(ctx context.Context, provinceID uint, f PatientMapFilter) (map[uint][]entity.MapSummaryItem, error) SummaryByProvince(ctx context.Context, f PatientMapFilter) (map[uint][]entity.MapSummaryItem, error) } type Service struct { repository Repository - validator Validator } -func NewPatientAnalyticService(repo Repository, validator Validator) Service { +func NewPatientAnalyticService(repo Repository) Service { return Service{ repository: repo, - validator: validator, } } func (s Service) List(ctx context.Context, req ListPatientAnalyticRequest) (PatientAnalyticResponse, error) { - limit, offset := normalizeLimitOffset(req.Limit, req.Offset) + limit, offset := normalizeLimitOffset(req.Pagination.Limit, req.Pagination.Offset) // convert age range dobFrom, dobTo := ageRangeToDOB(req.MinAge, req.MaxAge, time.Now()) @@ -70,10 +68,12 @@ func (s Service) List(ctx context.Context, req ListPatientAnalyticRequest) (Pati } return PatientAnalyticResponse{ - Items: out, - Limit: limit, - Offset: offset, - Total: total, + Items: out, + Pagination: &Pagination{ + Limit: limit, + Offset: offset, + }, + Total: total, }, nil } @@ -95,7 +95,7 @@ func (s Service) GetMapSummary(ctx context.Context, req GetPatientMapSummaryRequ return GetPatientMapSummaryResponse{}, ErrInvalidProvinceID } - items, err := s.repository.SummaryByCity(ctx, *req.ParentID, filter) + items, err := s.repository.SummaryByCity(ctx, uint(*req.ParentID), filter) if err != nil { return GetPatientMapSummaryResponse{}, fmt.Errorf("SummaryByCity: %w", err) } diff --git a/patientapp/service/analytic/validator.go b/patientapp/service/analytic/validator.go deleted file mode 100644 index 7e65ad93..00000000 --- a/patientapp/service/analytic/validator.go +++ /dev/null @@ -1,8 +0,0 @@ -package analytic - -type Validator struct { -} - -func NewValidator() *Validator { - return &Validator{} -}