[feature] a little python

This commit is contained in:
IMAXS 2024-11-04 22:26:45 +08:00
parent bacea33214
commit dfbab8f6d7
12 changed files with 160 additions and 25 deletions

1
.gitignore vendored
View File

@ -361,3 +361,4 @@ MigrationBackup/
# Fody - auto-generated XML schema # Fody - auto-generated XML schema
FodyWeavers.xsd FodyWeavers.xsd
/SiteManagementSystem(SoftwareEngineering)/Service/PythonServiceFile/.idea

View File

@ -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;
} }
} }

View File

@ -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; }

View File

@ -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

View File

@ -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)
); );

View File

@ -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 是否删除成功

View File

@ -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")

View File

@ -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

View File

@ -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

View File

@ -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;}
} }
} }

View File

@ -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>

View File

@ -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",