diff --git a/app.py b/app.py
index e16e313..a7f1246 100644
--- a/app.py
+++ b/app.py
@@ -3,8 +3,7 @@ import config
import utils.response as response
import service.faker_data as faker
from base import db
-from model import Person, SexEnum, City, Hotel
-from sqlalchemy import select, join
+from model import SexEnum
app = Flask(__name__)
config.init_config(app)
@@ -12,9 +11,8 @@ db.init_app(app)
@app.route('/')
-def hello_world(): # put application's code here
- print(SexEnum(1).sex)
- return 'Hello World!'
+def hello_world():
+ return f'
nConTrack_Faker'
@app.route("/faker/railway/")
@@ -32,12 +30,30 @@ def faker_contacts(num_hotel, num_railway):
return response.succ(faker.faker_contacts(int(num_hotel), int(num_railway)))
-@app.route("/test")
-def test():
- print(
- select(Hotel.identification).
- join(Hotel, )
- )
+@app.route("/query/patient")
+def query_patient():
+ return response.succ(faker.query_patients())
+
+
+@app.route("/query/contacts/hotel/")
+def query_contacts_hotel(identification):
+ return response.succ(faker.query_contacts_hotel(identification))
+
+
+@app.route("/query/contacts/railway/")
+def query_contacts_railway(identification):
+ return response.succ(faker.query_contacts_railway(identification))
+
+
+@app.route("/query/contacts/classify/")
+def query_contacts_classify(identification):
+ return response.succ(faker.query_contacts_classify(identification))
+
+
+@app.route("/query/contacts/")
+def query_contacts(identification):
+ return response.succ(faker.query_contacts(identification))
+
if __name__ == '__main__':
app.run()
diff --git a/config.py b/config.py
index f16ede4..85352ec 100644
--- a/config.py
+++ b/config.py
@@ -1,5 +1,3 @@
-from urllib.parse import quote_plus as urlquote
-
DIALECT = 'mysql'
DRIVER = 'pymysql'
USERNAME = 'root'
diff --git a/model/city.py b/model/city.py
index ffd01ed..4d54736 100644
--- a/model/city.py
+++ b/model/city.py
@@ -18,3 +18,6 @@ class City(db.Model):
latitude = Column(String(255))
longitude = Column(String(255))
ad_code = Column(String(255))
+
+ def __to_dict__(self) -> dict:
+ return {c.name: str(getattr(self, c.name)) for c in self.__table__.columns}
diff --git a/model/hotel.py b/model/hotel.py
index a9f5a30..068cd5c 100644
--- a/model/hotel.py
+++ b/model/hotel.py
@@ -12,3 +12,6 @@ class Hotel(db.Model):
identification = Column(String(18), server_default=text("''"), comment='入住者身份证号')
in_data = Column(Date, nullable=False, comment='入住日期')
out_data = Column(Date, nullable=False, comment='离开日期')
+
+ def __to_dict__(self) -> dict:
+ return {c.name: str(getattr(self, c.name)) for c in self.__table__.columns}
diff --git a/model/railway.py b/model/railway.py
index 8344037..99e1daa 100644
--- a/model/railway.py
+++ b/model/railway.py
@@ -11,3 +11,6 @@ class Railway(db.Model):
phone = Column(String(20), nullable=False, server_default=text("''"), comment='手机号码')
train = Column(String(10), nullable=False, server_default=text("''"), comment='车次')
launch = Column(Date, nullable=False, comment='发车时间')
+
+ def __to_dict__(self) -> dict:
+ return {c.name: str(getattr(self, c.name)) for c in self.__table__.columns}
diff --git a/service/faker_data.py b/service/faker_data.py
index 5c6b6fb..4959e22 100644
--- a/service/faker_data.py
+++ b/service/faker_data.py
@@ -134,21 +134,17 @@ def faker_contacts(num_hotel: int, num_railway: int):
persons = faker_identifications(num_railway + num_hotel + 1)
patient = persons[0]
contacts_hotel = persons[1:1 + num_hotel]
- contacts_railway = persons[-1-num_railway: -1]
- print(persons)
- print(patient)
- print(contacts_railway)
- print(contacts_hotel)
+ contacts_railway = persons[0 - num_railway:]
hotel_patient = faker_hotel(patient)
railway_patient = faker_railway(patient)
def assemble_hotel(contact: Person) -> Hotel:
- hotel_contact = copy.copy(hotel_patient)
+ hotel_contact = copy.deepcopy(hotel_patient)
hotel_contact.identification = contact.identification
return hotel_contact
def assemble_railway(contact: Person) -> Railway:
- railway_contact = copy.copy(railway_patient)
+ railway_contact = copy.deepcopy(railway_patient)
railway_contact.identification = contact.identification
railway_contact.name = contact.name
return railway_contact
@@ -171,3 +167,45 @@ def faker_contacts(num_hotel: int, num_railway: int):
}
}
+
+def query_patients() -> list[dict]:
+ patients = db.session.query(Person) \
+ .join(Hotel, Person.identification == Hotel.identification) \
+ .join(Railway, Person.identification == Railway.identification) \
+ .all()
+ return [patient.__to_dict__() for patient in patients]
+
+
+def query_contacts_hotel(identification: str) -> list[dict]:
+ patient_subquery = Hotel.query.filter(Hotel.identification == identification).subquery()
+ contacts = db.session.query(Hotel, Person) \
+ .join(Hotel, Hotel.identification == Person.identification) \
+ .filter(Person.identification != identification) \
+ .filter(Hotel.out_data > patient_subquery.c.in_data)
+ return [merge_object2dict(hotel, person) for hotel, person in contacts]
+
+
+def query_contacts_railway(identification: str) -> list[dict]:
+ patient_subquery = Railway.query.filter(Railway.identification == identification).subquery()
+ contacts = db.session.query(Railway, Person) \
+ .join(Railway, Railway.identification == Person.identification) \
+ .filter(Person.identification != identification) \
+ .filter(Railway.launch == patient_subquery.c.launch)
+ return [merge_object2dict(railway, person) for railway, person in contacts]
+
+
+def query_contacts_classify(identification: str) -> dict[str, list[dict]]:
+ contacts = {'hotel': query_contacts_hotel(identification), 'railway': query_contacts_railway(identification)}
+ return contacts
+
+
+def query_contacts(identification: str) -> list[dict]:
+ contacts = [*query_contacts_hotel(identification), *query_contacts_railway(identification)]
+ return contacts
+
+
+def merge_object2dict(*objs: db.Model) -> dict:
+ res = {}
+ for obj in objs:
+ res.update(obj.__to_dict__())
+ return res