[feature] a little python
This commit is contained in:
parent
bacea33214
commit
dfbab8f6d7
|
@ -361,3 +361,4 @@ MigrationBackup/
|
||||||
|
|
||||||
# Fody - auto-generated XML schema
|
# Fody - auto-generated XML schema
|
||||||
FodyWeavers.xsd
|
FodyWeavers.xsd
|
||||||
|
/SiteManagementSystem(SoftwareEngineering)/Service/PythonServiceFile/.idea
|
||||||
|
|
|
@ -9,7 +9,7 @@ namespace SiteManagementSystem_SoftwareEngineering_.Entity
|
||||||
public Guid Id { get; set; } = Guid.NewGuid();
|
public Guid Id { get; set; } = Guid.NewGuid();
|
||||||
public string Name { get; set; } = null!;
|
public string Name { get; set; } = null!;
|
||||||
public string Position { get; set; } = null!;
|
public string Position { get; set; } = null!;
|
||||||
public string OpenTime { get; set; } = null!;
|
public string Opentime { get; set; } = null!;
|
||||||
public FieldType Type { get; set; } = FieldType.Unspecified;
|
public FieldType Type { get; set; } = FieldType.Unspecified;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
namespace SiteManagementSystem_SoftwareEngineering_.Entity
|
namespace SiteManagementSystem_SoftwareEngineering_.Entity
|
||||||
{
|
{
|
||||||
public class UserField
|
public class FieldRecord
|
||||||
{
|
{
|
||||||
[Key]
|
[Key]
|
||||||
public Guid Uid { get; set; }
|
public Guid Uid { get; set; }
|
|
@ -19,7 +19,8 @@ builder.Services.AddSwaggerGen();
|
||||||
builder.Services.AddDbContext<SQLService>(options =>
|
builder.Services.AddDbContext<SQLService>(options =>
|
||||||
options.UseMySql(
|
options.UseMySql(
|
||||||
builder.Configuration.GetConnectionString("SQL"),
|
builder.Configuration.GetConnectionString("SQL"),
|
||||||
MariaDbServerVersion.AutoDetect(builder.Configuration.GetConnectionString("SQL"))
|
MySqlServerVersion.AutoDetect(builder.Configuration.GetConnectionString("SQL"))
|
||||||
|
//MariaDbServerVersion.AutoDetect(builder.Configuration.GetConnectionString("SQL"))
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
builder
|
builder
|
||||||
|
|
|
@ -44,7 +44,7 @@ namespace SiteManagementSystem_SoftwareEngineering_.Service
|
||||||
{
|
{
|
||||||
Name = "t1",
|
Name = "t1",
|
||||||
Position = "t2",
|
Position = "t2",
|
||||||
OpenTime = "t3"
|
Opentime = "t3"
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
Console.WriteLine(
|
Console.WriteLine(
|
||||||
|
@ -64,12 +64,12 @@ namespace SiteManagementSystem_SoftwareEngineering_.Service
|
||||||
public class EntityFrameworkPythonCompatibilityAndInterpretationLayer
|
public class EntityFrameworkPythonCompatibilityAndInterpretationLayer
|
||||||
{
|
{
|
||||||
public readonly SQLHelperService<Field> FieldDb;
|
public readonly SQLHelperService<Field> FieldDb;
|
||||||
public readonly SQLHelperService<UserField> RecordDb;
|
public readonly SQLHelperService<FieldRecord> RecordDb;
|
||||||
|
|
||||||
public EntityFrameworkPythonCompatibilityAndInterpretationLayer(SQLService storageService)
|
public EntityFrameworkPythonCompatibilityAndInterpretationLayer(SQLService storageService)
|
||||||
{
|
{
|
||||||
FieldDb = new SQLHelperService<Field>(storageService, nameof(storageService.Fields));
|
FieldDb = new SQLHelperService<Field>(storageService, nameof(storageService.Fields));
|
||||||
RecordDb = new SQLHelperService<UserField>(
|
RecordDb = new SQLHelperService<FieldRecord>(
|
||||||
storageService,
|
storageService,
|
||||||
nameof(storageService.UserFieldRecords)
|
nameof(storageService.UserFieldRecords)
|
||||||
);
|
);
|
||||||
|
|
|
@ -1,17 +1,154 @@
|
||||||
from layer import Layer
|
import time
|
||||||
|
|
||||||
|
from layer import Layer
|
||||||
from field import Field
|
from field import Field
|
||||||
from user import User
|
from user import User
|
||||||
from user_field import UserFieldRecord
|
from user_field import FieldRecord
|
||||||
|
from datetime import datetime
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class Service:
|
class Service:
|
||||||
layer = Layer(LAYER)
|
layer = Layer(LAYER) #初始化数据库数据并启动增删查功能
|
||||||
x = 16
|
|
||||||
|
|
||||||
|
|
||||||
|
#普通用户操作:
|
||||||
|
#请求一条场地使用信息(普通用户自动传入自己的用户id,管理员用户手动选择传入用户id) #redis
|
||||||
|
#参数:cs_fieldRecord(用户id,场地id,开始时间,结束时间) 返回:bool 是否预约成功
|
||||||
|
def AddAppointment(self,cs_fieldRecord) -> bool:
|
||||||
|
fieldRecord=FieldRecord(cs_fieldRecord)
|
||||||
|
records=self.layer.find_record("fid",fieldRecord.fid)
|
||||||
|
#如果用户已经有预约了,就不能再提交预约
|
||||||
|
if len(self.layer.find_record("uid",fieldRecord.uid))!=0:
|
||||||
|
raise ValueError("Already has an appointment")
|
||||||
|
else:
|
||||||
|
#检查场地此时是否有空
|
||||||
|
for x in records:
|
||||||
|
if not((x.end_time>=fieldRecord.start_time) or (x.start_time<=fieldRecord.end_time)):
|
||||||
|
raise ValueError("Field busy")
|
||||||
|
#添加记录
|
||||||
|
self.layer.add_record(fieldRecord)
|
||||||
|
return True
|
||||||
|
|
||||||
|
|
||||||
|
#提前结束场地的使用 正在使用时提前结束 #finished
|
||||||
|
#参数:cs_user //cs_fieldRecord(用户id,场地id,开始时间,) 返回:bool 是否结束成功
|
||||||
|
def EndAppointment(self,cs_user) -> bool:
|
||||||
|
user=User(cs_user)
|
||||||
|
records=self.layer.find_record("uid",user.uid)
|
||||||
|
if len(records)==0:
|
||||||
|
raise ValueError("No appointment")
|
||||||
|
elif len(records) !=1:
|
||||||
|
raise ValueError("Appointment nums error")
|
||||||
|
else:
|
||||||
|
fid = records[0].fid
|
||||||
|
uid = user.id
|
||||||
|
start_time = records[0].start_time
|
||||||
|
#获取当前时间并转为%Y-%m-%d %H:%M:%S形式的字符串
|
||||||
|
curtime=datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
||||||
|
#正在使用时可以提前结束,修改结束时间
|
||||||
|
if curtime>=start_time and curtime<records[0].end_time:
|
||||||
|
fieldRecord=FieldRecord(fid,uid,start_time,curtime)
|
||||||
|
self.layer.remove_record(records[0])
|
||||||
|
self.layer.add_record(fieldRecord)
|
||||||
|
return True
|
||||||
|
else:
|
||||||
|
raise ValueError("No ongoing appointment")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#取消预约
|
||||||
|
# 参数:cs_user //cs_fieldRecord(用户id,场地id,开始时间,结束时间) 返回:bool 是否取消成功
|
||||||
|
def CancelAppointment(self,cs_user) -> bool:
|
||||||
|
user=User(cs_user)
|
||||||
|
records=self.layer.find_record("uid",user.id)
|
||||||
|
if len(records)==0:
|
||||||
|
raise ValueError("No appointment or appointment is finished")
|
||||||
|
elif len(records)!=1:
|
||||||
|
raise ValueError("Appointment nums error")
|
||||||
|
else:
|
||||||
|
curtime=datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
||||||
|
if curtime<records[0].start_time:
|
||||||
|
fieldRecord=FieldRecord(records[0])
|
||||||
|
return True
|
||||||
|
else:
|
||||||
|
raise ValueError("Appointment has started")
|
||||||
|
|
||||||
|
|
||||||
|
#延长场地的使用时间 #redis
|
||||||
|
# 参数:cs_fieldRecord(用户id,场地id(null),开始时间(null),结束时间) 返回:bool 是否延长成功
|
||||||
|
def ExtendAppointment(self,cs_fieldRecord) -> bool:
|
||||||
|
field_Record=FieldRecord(cs_fieldRecord)
|
||||||
|
records=self.layer.find_record("uid", field_Record.uid)
|
||||||
|
if len(records)==0:
|
||||||
|
raise ValueError("No appointment or appointment is finished")
|
||||||
|
elif len(records)!=1:
|
||||||
|
raise ValueError("Appointment nums error")
|
||||||
|
else:
|
||||||
|
curtime=datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
||||||
|
start_time=records[0].start_time
|
||||||
|
end_time=records[0].end_time
|
||||||
|
if curtime>=start_time and curtime<end_time:
|
||||||
|
addrecord=FieldRecord(field_Record.uid, records[0].fid, start_time, field_Record.end_time)
|
||||||
|
self.layer.add_record(addrecord)
|
||||||
|
return True
|
||||||
|
else:
|
||||||
|
raise ValueError("Appointment is finished or not started")
|
||||||
|
|
||||||
|
|
||||||
|
#查询场地占用
|
||||||
|
# 参数:cs_fieldRecord(用户id(null),场地id,开始时间(null),结束时间(null)) 返回:list_time [(start_time,end_time),(...),(...),...]
|
||||||
|
def parse_time(time_str):
|
||||||
|
return datetime.strptime(time_str, "%Y-%m-%d %H:%M:%S").time()
|
||||||
|
|
||||||
|
def QueryFieldUsage(self,cs_fieldRecord) -> []:
|
||||||
|
fid=FieldRecord(cs_fieldRecord).fid
|
||||||
|
records=self.layer.find_record("fid",fid)
|
||||||
|
list_time=[]
|
||||||
|
for x in records:
|
||||||
|
tup=(x.start_time,x.end_time)
|
||||||
|
list_time.append(tup)
|
||||||
|
# 使用 sorted() 函数进行排序,key 参数指定用于排序的键函数
|
||||||
|
sorted_time_list = sorted(list_time, key=lambda x: self.parse_time(x[0]))
|
||||||
|
#从后往前遍历
|
||||||
|
for x in range(len(sorted_time_list)-1,0,-1):
|
||||||
|
strtm2 = sorted_time_list[x][0]
|
||||||
|
strtm1 = sorted_time_list[x - 1][1]
|
||||||
|
timestamp1 = time.mktime(time.strptime(strtm1, "%Y-%m-%d %H:%M:%S"))
|
||||||
|
timestamp2 = time.mktime(time.strptime(strtm2, "%Y-%m-%d %H:%M:%S"))
|
||||||
|
if (timestamp2 - timestamp1) / 60 <= 10:
|
||||||
|
tup = (sorted_time_list[x - 1][0], sorted_time_list[x][1])
|
||||||
|
sorted_time_list.pop(x)
|
||||||
|
sorted_time_list[x - 1] = tup
|
||||||
|
return sorted_time_list
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#查询用户的预约记录
|
||||||
|
# 参数:cs_user(id) 返回:array_cs_fieldRecord
|
||||||
|
def QueryAppointmentRecord(self,cs_user) -> []:
|
||||||
|
user=User(cs_user)
|
||||||
|
|
||||||
|
|
||||||
|
#管理员操作:(包含普通用户操作以及一下特殊操作)
|
||||||
|
|
||||||
|
#添加一个场地
|
||||||
|
#参数:cs_field(id,name,position,open_time,type) 返回:bool 是否添加成功
|
||||||
def AddField(self, cs_field) -> str:
|
def AddField(self, cs_field) -> str:
|
||||||
field = Field(cs_field)
|
field = Field(cs_field)
|
||||||
self.layer.add_field(field)
|
self.layer.add_field(field)
|
||||||
return ""
|
return ""
|
||||||
|
|
||||||
|
#删除一个场地
|
||||||
|
# 参数:cs_field(id,name,position(null),open_time(null),type(null)) 返回:bool 是否删除成功
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -26,8 +26,8 @@ class Field:
|
||||||
self.position = field.Position
|
self.position = field.Position
|
||||||
self.open_time = field.OpenTime
|
self.open_time = field.OpenTime
|
||||||
self.type = field.Type
|
self.type = field.Type
|
||||||
elif len(args) == 4:
|
elif len(args) == 5:
|
||||||
self.id, self.name, self.position, self.type = args
|
self.id, self.name, self.position, self.open_time, self.type = args
|
||||||
else:
|
else:
|
||||||
raise ValueError("Invalid arguments for Field initialization")
|
raise ValueError("Invalid arguments for Field initialization")
|
||||||
|
|
||||||
|
|
|
@ -7,7 +7,7 @@ clr.AddReference('System')
|
||||||
from System import Guid, Convert
|
from System import Guid, Convert
|
||||||
|
|
||||||
|
|
||||||
class UserFieldRecord:
|
class FieldRecord:
|
||||||
fid = ""
|
fid = ""
|
||||||
uid = ""
|
uid = ""
|
||||||
start_time: time.struct_time
|
start_time: time.struct_time
|
|
@ -1,7 +1,7 @@
|
||||||
import clr
|
import clr
|
||||||
from user import User
|
from user import User
|
||||||
from field import Field
|
from field import Field
|
||||||
from user_field import UserFieldRecord
|
from user_field import FieldRecord
|
||||||
|
|
||||||
clr.AddReference('System')
|
clr.AddReference('System')
|
||||||
from System import Guid, DateTime
|
from System import Guid, DateTime
|
||||||
|
@ -24,14 +24,14 @@ class Layer:
|
||||||
self._field_db.TryDelete(field.id, field.parse_to_csharp_object(self._field_db.GetDefaultEntity()).Id)
|
self._field_db.TryDelete(field.id, field.parse_to_csharp_object(self._field_db.GetDefaultEntity()).Id)
|
||||||
return self
|
return self
|
||||||
|
|
||||||
def add_record(self, record: UserFieldRecord) -> 'Layer':
|
def add_record(self, record: FieldRecord) -> 'Layer':
|
||||||
self._record_db.Add(record.parse_to_csharp_object(self._record_db.GetDefaultEntity()))
|
self._record_db.Add(record.parse_to_csharp_object(self._record_db.GetDefaultEntity()))
|
||||||
return self
|
return self
|
||||||
|
|
||||||
def find_record(self, key: str, value: str) -> [UserFieldRecord]:
|
def find_record(self, key: str, value: str) -> [FieldRecord]:
|
||||||
return [UserFieldRecord(t) for t in self._record_db.FindAll(key, Guid.Parse(value))]
|
return [FieldRecord(t) for t in self._record_db.FindAll(key, Guid.Parse(value))]
|
||||||
|
|
||||||
# One User only allowed to book one field at a time
|
# One User only allowed to book one field at a time
|
||||||
def remove_record(self, record: UserFieldRecord) -> 'Layer':
|
def remove_record(self, record: FieldRecord) -> 'Layer':
|
||||||
self._record_db.TryDelete("Uid", record.parse_to_csharp_object(self._record_db.GetDefaultEntity()).Uid)
|
self._record_db.TryDelete("Uid", record.parse_to_csharp_object(self._record_db.GetDefaultEntity()).Uid)
|
||||||
return self
|
return self
|
||||||
|
|
|
@ -13,6 +13,6 @@ namespace SiteManagementSystem_SoftwareEngineering_.Service
|
||||||
}
|
}
|
||||||
public DbSet<User> Users { get; set; }
|
public DbSet<User> Users { get; set; }
|
||||||
public DbSet<Field> Fields { get; set; }
|
public DbSet<Field> Fields { get; set; }
|
||||||
public DbSet<UserField> UserFieldRecords{get;set;}
|
public DbSet<FieldRecord> UserFieldRecords{get;set;}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,8 +18,4 @@
|
||||||
<PackageReference Include="System.Linq.Dynamic.Core" Version="1.4.7" />
|
<PackageReference Include="System.Linq.Dynamic.Core" Version="1.4.7" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<Folder Include="Service\PythonServiceFile\" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"ConnectionStrings": {
|
"ConnectionStrings": {
|
||||||
"SQL": "Server=host.docker.internal;Port=3306;Database=SiteManagementSystem;Uid=SiteManagementSystem;Pwd=SiteManagementSystem;"
|
"SQL": "Server=127.0.0.1;Port=3306;Database=SiteManagementSystem;Uid=SiteManagementSystem;Pwd=SiteManagementSystem;"
|
||||||
},
|
},
|
||||||
"Jwt": {
|
"Jwt": {
|
||||||
"SecurityKey": "TheSecretKeyForIwutMail,RandomInfo:z#$WX%ec56rv^b8n",
|
"SecurityKey": "TheSecretKeyForIwutMail,RandomInfo:z#$WX%ec56rv^b8n",
|
||||||
|
|
Loading…
Reference in New Issue