wwp há 3 semanas
ascendente
cometimento
23fe63bf02
38 ficheiros alterados com 943 adições e 117 eliminações
  1. +16
    -0
      SafeCampus.API/SafeCampus.Application/Const/ApplicationConst.cs
  2. +46
    -1
      SafeCampus.API/SafeCampus.Application/SafeCampus.Application.xml
  3. +3
    -1
      SafeCampus.API/SafeCampus.Application/Services/Business/ClassRoomCallService/ClassRoomCallService.cs
  4. +16
    -0
      SafeCampus.API/SafeCampus.Application/Services/Business/ClassRoomCallService/Dto/ClassRoomCallUpdate.cs
  5. +5
    -3
      SafeCampus.API/SafeCampus.Application/Services/Business/MajorService/Dto/MajorDto.cs
  6. +6
    -1
      SafeCampus.API/SafeCampus.Application/Services/Business/PersonInfoService/Dto/PersonInfoDto.cs
  7. +2
    -2
      SafeCampus.API/SafeCampus.Application/Services/Business/PersonInfoService/PersonInfoService.cs
  8. +1
    -1
      SafeCampus.API/SafeCampus.Application/Services/Business/PersonSetInfoService/IPersonSetInfoService.cs
  9. +2
    -1
      SafeCampus.API/SafeCampus.Application/Services/Business/PersonSetInfoService/PersonSetInfoService.cs
  10. +8
    -0
      SafeCampus.API/SafeCampus.Application/Services/Business/Warn/Dto/WarnInfoSearch.cs
  11. +2
    -0
      SafeCampus.API/SafeCampus.Application/Services/Business/Warn/Service/WarnInfoService.cs
  12. +27
    -0
      SafeCampus.API/SafeCampus.Core/Enum/AlarmType.cs
  13. +1
    -11
      SafeCampus.API/SafeCampus.SqlSugar/Startup.cs
  14. +1
    -1
      SafeCampus.API/SafeCampus.System/Entity/MajorInfo.cs
  15. +1
    -1
      SafeCampus.API/SafeCampus.System/Entity/PersonSetInfo.cs
  16. +9
    -0
      SafeCampus.API/SafeCampus.System/SeedData/CameraGroupSeedData.cs
  17. +23
    -0
      SafeCampus.API/SafeCampus.System/SeedData/Json/seed_bus_cameraGroup.json
  18. +1
    -11
      SafeCampus.API/SafeCampus.System/SeedData/SysUserSeedData.cs
  19. +39
    -1
      SafeCampus.API/SafeCampus.Web.Core/Controllers/Application/Business/ClassRoomCallApi.cs
  20. +3
    -2
      SafeCampus.API/SafeCampus.Web.Core/Controllers/Application/Business/DepartmentController.cs
  21. +4
    -4
      SafeCampus.API/SafeCampus.Web.Core/Controllers/Application/Business/DfieldApi.cs
  22. +1
    -1
      SafeCampus.API/SafeCampus.Web.Core/Controllers/Application/Business/DormitoryController.cs
  23. +1
    -1
      SafeCampus.API/SafeCampus.Web.Core/Controllers/Application/Business/Dto/DfieldInput.cs
  24. +8
    -0
      SafeCampus.API/SafeCampus.Web.Core/Controllers/Application/Business/Dto/MajorDepPersonSetModel.cs
  25. +3
    -2
      SafeCampus.API/SafeCampus.Web.Core/Controllers/Application/Business/MajorController.cs
  26. +53
    -0
      SafeCampus.API/SafeCampus.Web.Core/Controllers/Application/Business/MobileController.cs
  27. +2
    -2
      SafeCampus.API/SafeCampus.Web.Core/Controllers/Application/LargeScreen/LargeScreenController.cs
  28. +20
    -0
      SafeCampus.API/SafeCampus.Web.Core/Controllers/Application/Violation/Dto/SearchType.cs
  29. +13
    -0
      SafeCampus.API/SafeCampus.Web.Core/Controllers/Application/Violation/SummarySeach.cs
  30. +131
    -6
      SafeCampus.API/SafeCampus.Web.Core/Controllers/Application/Violation/VioPortraitSummary.cs
  31. +81
    -7
      SafeCampus.API/SafeCampus.Web.Core/SafeCampus.Web.Core.xml
  32. +1
    -1
      SafeCampus.API/SafeCampus.Web.Entry/Properties/PublishProfiles/FolderProfile.pubxml.user
  33. +30
    -6
      monitorMobile/components/cell.vue
  34. +0
    -2
      monitorMobile/components/selectRadio.vue
  35. +58
    -32
      monitorMobile/components/selectSearch.vue
  36. +252
    -0
      monitorMobile/components/selectTree.vue
  37. +72
    -15
      monitorMobile/pages/attendanceCall/passengerFlow/add.vue
  38. +1
    -1
      monitorMobile/pages/attendanceCall/returnBed/index.vue

+ 16
- 0
SafeCampus.API/SafeCampus.Application/Const/ApplicationConst.cs Ver ficheiro

@@ -16,4 +16,20 @@ public class ApplicationConst
public const string BIZ_POS = "岗位";

#endregion 别称

#region 学校基础摄像头分组配置
/// <summary>
/// 图书馆分组id
/// </summary>
public const long TSG = 583660006621253;
/// <summary>
/// 食堂分组id
/// </summary>
public const long ST = 583659984986181;
/// <summary>
/// 学校大门分组id
/// </summary>
public const long XXDM = 583659952070725;

#endregion
}

+ 46
- 1
SafeCampus.API/SafeCampus.Application/SafeCampus.Application.xml Ver ficheiro

@@ -14,6 +14,21 @@
岗位
</summary>
</member>
<member name="F:SafeCampus.Application.ApplicationConst.TSG">
<summary>
图书馆分组id
</summary>
</member>
<member name="F:SafeCampus.Application.ApplicationConst.ST">
<summary>
食堂分组id
</summary>
</member>
<member name="F:SafeCampus.Application.ApplicationConst.XXDM">
<summary>
学校大门分组id
</summary>
</member>
<member name="T:SafeCampus.Application.Manager.DeepelephManager.DeepelephManager">
<summary>
深象智能对接实现
@@ -807,6 +822,21 @@
人员id
</summary>
</member>
<member name="P:SafeCampus.Application.Services.Business.ClassRoomCallService.ClassRoomCallInsert.PersonSetId">
<summary>
关联底库id 如果为空,表示该人员未匹配到底库
</summary>
</member>
<member name="P:SafeCampus.Application.Services.Business.ClassRoomCallService.ClassRoomCallInsert.PersonId">
<summary>
人员id
</summary>
</member>
<member name="P:SafeCampus.Application.Services.Business.ClassRoomCallService.ClassRoomCallInsert.TaskId">
<summary>
所属点名任务
</summary>
</member>
<member name="M:SafeCampus.Application.Services.Business.ClassRoomCallService.IClassRoomCallService.Add(SafeCampus.Application.Services.Business.ClassRoomCallService.ClassRoomCallDto)">
<summary>
添加点名记录
@@ -1259,6 +1289,11 @@
院系id
</summary>
</member>
<member name="P:SafeCampus.Application.Services.Business.MajorService.MajorDto.Sort">
<summary>
排序
</summary>
</member>
<member name="P:SafeCampus.Application.Services.Business.MajorService.MajorSearch.Name">
<summary>
专业名称
@@ -1622,7 +1657,7 @@
<param name="input"></param>
<returns></returns>
</member>
<member name="M:SafeCampus.Application.Services.Business.PersonSetInfoService.IPersonSetInfoService.GetPageList(System.Nullable{System.Int64})">
<member name="M:SafeCampus.Application.Services.Business.PersonSetInfoService.IPersonSetInfoService.GetPageList(System.Nullable{System.Int64},System.String)">
<summary>
获取底库列表
</summary>
@@ -1888,6 +1923,11 @@
班级id(不是必填)
</summary>
</member>
<member name="P:SafeCampus.Application.Services.Business.Warn.Dto.WarnInfoSearch.PersonId">
<summary>
人员id
</summary>
</member>
<member name="P:SafeCampus.Application.Services.Business.Warn.Dto.WarnInfoSearch.StartTick">
<summary>
事件发生时间开始
@@ -1903,6 +1943,11 @@
摄像头id
</summary>
</member>
<member name="P:SafeCampus.Application.Services.Business.Warn.Dto.WarnInfoSearch.CameraIds">
<summary>
摄像头ids(不是必填)
</summary>
</member>
<member name="P:SafeCampus.Application.Services.Business.Warn.Dto.WarnInfoSearch.WarnHand">
<summary>
预警处理状态


+ 3
- 1
SafeCampus.API/SafeCampus.Application/Services/Business/ClassRoomCallService/ClassRoomCallService.cs Ver ficheiro

@@ -1,4 +1,6 @@
namespace SafeCampus.Application.Services.Business.ClassRoomCallService;
using Dm;

namespace SafeCampus.Application.Services.Business.ClassRoomCallService;

public class ClassRoomCallService : DbRepository<ClassRoomCall>, IClassRoomCallService
{


+ 16
- 0
SafeCampus.API/SafeCampus.Application/Services/Business/ClassRoomCallService/Dto/ClassRoomCallUpdate.cs Ver ficheiro

@@ -14,4 +14,20 @@ public class ClassRoomCallUpdate
/// 人员id
/// </summary>
public string PersonId { get; set; }
}

public class ClassRoomCallInsert
{
/// <summary>
/// 关联底库id 如果为空,表示该人员未匹配到底库
/// </summary>
public string PersonSetId { get; set; }
/// <summary>
/// 人员id
/// </summary>
public string PersonId { get; set; }
/// <summary>
///所属点名任务
/// </summary>
public string TaskId { get; set; }
}

+ 5
- 3
SafeCampus.API/SafeCampus.Application/Services/Business/MajorService/Dto/MajorDto.cs Ver ficheiro

@@ -1,6 +1,4 @@
using SafeCampus.Application.Services.Business.DepartmentService;

namespace SafeCampus.Application.Services.Business.MajorService;
namespace SafeCampus.Application.Services.Business.MajorService;

public class MajorDto
{
@@ -21,6 +19,10 @@ public class MajorDto
/// 院系id
/// </summary>
public long DepId { get; set; }
/// <summary>
/// 排序
/// </summary>
public int Sort { get; set; }

public string DepartmentName { get; set; }
}


+ 6
- 1
SafeCampus.API/SafeCampus.Application/Services/Business/PersonInfoService/Dto/PersonInfoDto.cs Ver ficheiro

@@ -66,6 +66,9 @@ public class PersonInfoDto
/// 进班时间
/// </summary>
public DateTime? InsTime { get; set; }

public string DepName { get; set; }
public string MajorName { get; set; }
}
public class PersonInfoDtoMapper : IRegister
{
@@ -76,6 +79,8 @@ public class PersonInfoDtoMapper : IRegister
.Map(dest => dest.PersonSetId, src => src.PersonSetId)
.Map(dest => dest.PersonSetName, src => src.PersonSetInfoItem.PersonSetName)
.Map(dest => dest.Faces, src => src.PersonFacesList)
.Map(dest => dest.DormitoryName, src => src.DormitoryInfoItem.Name);
.Map(dest => dest.DormitoryName, src => src.DormitoryInfoItem.Name)
.Map(dest => dest.DepName, src => src.PersonSetInfoItem.MajorInfoItem.DepartmentInfoItem.Name)
.Map(dest => dest.MajorName, src => src.PersonSetInfoItem.MajorInfoItem.Name);
}
}

+ 2
- 2
SafeCampus.API/SafeCampus.Application/Services/Business/PersonInfoService/PersonInfoService.cs Ver ficheiro

@@ -29,7 +29,7 @@ public class PersonInfoService:DbRepository<PersonInfo>, IPersonInfoService
{
var model = await Context.Queryable<PersonInfo>()
.Includes(x => x.DormitoryInfoItem)
.Includes(x => x.PersonSetInfoItem)
.Includes(x => x.PersonSetInfoItem,x=>x.MajorInfoItem,x=>x.DepartmentInfoItem)
.Includes(x => x.PersonFacesList)
.FirstAsync(x => x.PersonId == id);
if (model == null)
@@ -64,7 +64,7 @@ public class PersonInfoService:DbRepository<PersonInfo>, IPersonInfoService
public async Task<SqlSugarPagedList<PersonInfoDto>> GetPageList(PersonInfoSearch search)
{
var query = Context.Queryable<PersonInfo>()
.Includes(x => x.PersonSetInfoItem)
.Includes(x => x.PersonSetInfoItem, x => x.MajorInfoItem, x => x.DepartmentInfoItem)
.Includes(x=>x.PersonFacesList)
.Includes(x=>x.DormitoryInfoItem)
.WhereIF(!string.IsNullOrEmpty(search.PersonSetId), x => x.PersonSetId == search.PersonSetId)


+ 1
- 1
SafeCampus.API/SafeCampus.Application/Services/Business/PersonSetInfoService/IPersonSetInfoService.cs Ver ficheiro

@@ -23,5 +23,5 @@ public interface IPersonSetInfoService:ITransient
/// 获取底库列表
/// </summary>
/// <returns></returns>
Task<List<PersonSetInfoDto>> GetPageList(long? majorId);
Task<List<PersonSetInfoDto>> GetPageList(long? majorId,string setName);
}

+ 2
- 1
SafeCampus.API/SafeCampus.Application/Services/Business/PersonSetInfoService/PersonSetInfoService.cs Ver ficheiro

@@ -38,12 +38,13 @@ public class PersonSetInfoService:DbRepository<PersonSetInfo>, IPersonSetInfoSer
return true;
}

public async Task<List<PersonSetInfoDto>> GetPageList(long? majorId)
public async Task<List<PersonSetInfoDto>> GetPageList(long? majorId, string setName)
{
var list =await Context.Queryable<PersonSetInfo>()
.Includes(x=>x.MajorInfoItem,x=>x.DepartmentInfoItem)
.Where(x=>x.PersonSetId!=SafeCampusConst.ZDRY)
.WhereIF(majorId.HasValue,x=>x.MajorId==majorId)
.WhereIF(!string.IsNullOrEmpty(setName),x=>x.PersonSetName.Contains(setName))
.Includes(x => x.ClassTeacherItem, st => st.SysUserItem)
.ToListAsync();
return list.Adapt<List<PersonSetInfoDto>>();


+ 8
- 0
SafeCampus.API/SafeCampus.Application/Services/Business/Warn/Dto/WarnInfoSearch.cs Ver ficheiro

@@ -15,6 +15,10 @@ public class WarnInfoSearch:BasePageInput
/// </summary>
public List<string> PersonSetIds { get; set; }
/// <summary>
/// 人员id
/// </summary>
public string PersonId { get; set; }
/// <summary>
/// 事件发生时间开始
/// </summary>
public DateTime? StartTick { get; set; }
@@ -27,6 +31,10 @@ public class WarnInfoSearch:BasePageInput
/// </summary>
public string CameraId { get; set; }
/// <summary>
/// 摄像头ids(不是必填)
/// </summary>
public List<string> CameraIds { get; set; }
/// <summary>
/// 预警处理状态
/// </summary>
public int? WarnHand { get; set; }

+ 2
- 0
SafeCampus.API/SafeCampus.Application/Services/Business/Warn/Service/WarnInfoService.cs Ver ficheiro

@@ -137,7 +137,9 @@ public class WarnInfoService:DbRepository<WarnInfo>, IWarnInfoService,ITransient
.WhereIF(!string.IsNullOrEmpty(search.AlarmType), x => x.AlarmType == search.AlarmType)
.WhereIF(search.AlarmTypes!=null&&search.AlarmTypes.Any(),x=>search.AlarmTypes.Contains(x.AlarmType))
.WhereIF(search.PersonSetIds != null&&search.PersonSetIds.Any(),x=>search.PersonSetIds.Contains(x.PersonSetId))
.WhereIF(search.CameraIds != null&&search.CameraIds.Any(),x=>search.CameraIds.Contains(x.CameraId))
.WhereIF(!string.IsNullOrEmpty(search.CameraId), x => x.CameraId == search.CameraId)
.WhereIF(!string.IsNullOrEmpty(search.PersonId), x => x.PersonId == search.PersonId)
.WhereIF(search.StartTick.HasValue, x => x.Tick >= search.StartTick)
.WhereIF(search.EndTick.HasValue, x => x.Tick <= search.EndTick);



+ 27
- 0
SafeCampus.API/SafeCampus.Core/Enum/AlarmType.cs Ver ficheiro

@@ -6,136 +6,163 @@ public enum AlarmType
/// 周界入侵
/// </summary>
[Description("周界入侵")]
[Display(Name = "visual_fence")]
visual_fence,
/// <summary>
/// 翻越
/// </summary>
[Description("翻越")]
[Display(Name = "climb_over")]
climb_over,
/// <summary>
/// 人群聚集
/// </summary>
[Description("人群聚集")]
[Display(Name = "crowd")]
crowd,
/// <summary>
/// 烟火告警
/// </summary>
[Description("烟火告警")]
[Display(Name = "fire_smoke")]
fire_smoke,
/// <summary>
/// 可疑徘徊
/// </summary>
[Description("可疑徘徊")]
[Display(Name = "wander")]
wander,
/// <summary>
/// 重点人员布控
/// </summary>
[Description("重点人员布控")]
[Display(Name = "blacklist")]
blacklist,
/// <summary>
/// 奔跑
/// </summary>
[Description("奔跑")]
[Display(Name = "run")]
run,
/// <summary>
/// 追逐
/// </summary>
[Description("追逐")]
[Display(Name = "chase")]
chase,
/// <summary>
/// 摔倒
/// </summary>
[Description("摔倒")]
[Display(Name = "fall_down")]
fall_down,
/// <summary>
/// 跨线
/// </summary>
[Description("跨线")]
[Display(Name = "cross_line")]
cross_line,
/// <summary>
/// 教室点名
/// </summary>
[Description("教室点名")]
[Display(Name = "class_room_call")]
class_room_call,
/// <summary>
/// 趴桌子
/// </summary>
[Description("趴桌子")]
[Display(Name = "lie_on_table")]
lie_on_table,
/// <summary>
/// 抽烟检测
/// </summary>
[Description("抽烟检测")]
[Display(Name = "person_smoke")]
person_smoke,
/// <summary>
/// 猫鼠检测
/// </summary>
[Description("猫鼠检测")]
[Display(Name = "animal_break_in")]
animal_break_in,
/// <summary>
/// 巡更检测
/// </summary>
[Description("巡更检测")]
[Display(Name = "patrol")]
patrol,
/// <summary>
/// 离岗检测
/// </summary>
[Description("离岗检测")]
[Display(Name = "off_duty")]
off_duty,
/// <summary>
/// 打闹检测
/// </summary>
[Description("打闹检测")]
[Display(Name = "fight")]
fight,
/// <summary>
/// 未戴帽子检测
/// </summary>
[Description("未戴帽子检测")]
[Display(Name = "hat_detect")]
hat_detect,
/// <summary>
/// 未戴口罩检测
/// </summary>
[Description("未戴口罩检测")]
[Display(Name = "mask_detect")]
mask_detect,
/// <summary>
/// 未穿工作服检测
/// </summary>
[Description("未穿工作服检测")]
[Display(Name = "cloth_detect")]
cloth_detect,
/// <summary>
/// 洗手行为采集
/// </summary>
[Description("洗手行为采集")]
[Display(Name = "wash_hand")]
wash_hand,
/// <summary>
/// 车辆违停
/// </summary>
[Description("车辆违停")]
[Display(Name = "vehicle_parking")]
vehicle_parking,
/// <summary>
/// 车辆超速
/// </summary>
[Description("车辆超速")]
[Display(Name = "vehicle_speeding")]
vehicle_speeding,
/// <summary>
/// 违规占道
/// </summary>
[Description("违规占道")]
[Display(Name = "violation_occupy")]
violation_occupy,
/// <summary>
/// 玩手机
/// </summary>
[Description("玩手机")]
[Display(Name = "play_phone")]
play_phone,
/// <summary>
/// 骑车未戴头盔
/// </summary>
[Description("骑车未戴头盔")]
[Display(Name = "bike_without_helmet")]
bike_without_helmet,
/// <summary>
/// 儿童骑平衡车
/// </summary>
[Description("儿童骑平衡车/滑板车")]
[Display(Name = "segway_with_child")]
segway_with_child



+ 1
- 11
SafeCampus.API/SafeCampus.SqlSugar/Startup.cs Ver ficheiro

@@ -1,14 +1,4 @@

//








namespace SafeCampus.SqlSugar;
namespace SafeCampus.SqlSugar;

/// <summary>
/// AppStartup启动类


+ 1
- 1
SafeCampus.API/SafeCampus.System/Entity/MajorInfo.cs Ver ficheiro

@@ -34,6 +34,6 @@ public class MajorInfo : PrimaryKeyEntity
/// <summary>
/// 院系信息
/// </summary>
[Navigate(NavigateType.OneToOne, nameof(DepartmentInfo.Id), nameof(DepId))]
[Navigate(NavigateType.OneToOne, nameof(DepId))]
public DepartmentInfo DepartmentInfoItem { get; set; }
}

+ 1
- 1
SafeCampus.API/SafeCampus.System/Entity/PersonSetInfo.cs Ver ficheiro

@@ -24,7 +24,7 @@ public class PersonSetInfo
/// <summary>
/// 专业信息
/// </summary>
[Navigate(NavigateType.OneToOne, nameof(MajorInfo.Id), nameof(MajorId))]
[Navigate(NavigateType.OneToOne, nameof(MajorId))]
public MajorInfo MajorInfoItem { get; set; }
/// <summary>
/// 班主任信息


+ 9
- 0
SafeCampus.API/SafeCampus.System/SeedData/CameraGroupSeedData.cs Ver ficheiro

@@ -0,0 +1,9 @@
namespace SafeCampus.System;

public class CameraGroupSeedData : ISqlSugarEntitySeedData<CameraGroup>
{
public IEnumerable<CameraGroup> SeedData()
{
return SeedDataUtil.GetSeedData<CameraGroup>("seed_sys_user.json");
}
}

+ 23
- 0
SafeCampus.API/SafeCampus.System/SeedData/Json/seed_bus_cameraGroup.json Ver ficheiro

@@ -0,0 +1,23 @@
{
"RECORDS": [
{
"Id": "583659544297541",
"Name": "学校点位配置"
},
{
"Id": "583659952070725",
"Name": "学校大门",
"ParentId": "583659544297541"
},
{
"Id": "583659984986181",
"Name": "食堂",
"ParentId": "583659544297541"
},
{
"Id": "583660006621253",
"Name": "图书馆",
"ParentId": "583659544297541"
}
]
}

+ 1
- 11
SafeCampus.API/SafeCampus.System/SeedData/SysUserSeedData.cs Ver ficheiro

@@ -1,14 +1,4 @@

//








namespace SafeCampus.System;
namespace SafeCampus.System;

/// <summary>
/// 用户表种子数据


+ 39
- 1
SafeCampus.API/SafeCampus.Web.Core/Controllers/Application/Business/ClassRoomCallApi.cs Ver ficheiro

@@ -1,9 +1,11 @@
using MoYu.FriendlyException;
using Dm;
using MoYu.FriendlyException;
using MoYu.RemoteRequest.Extensions;
using Newtonsoft.Json.Linq;
using SafeCampus.Application.Manager.DeepelephManager;
using SafeCampus.Application.Services.Business.ClassRoomCallService;
using SafeCampus.Application.Services.Business.ClassRoomCallTaskService;
using SafeCampus.Core.Extension;

namespace SafeCampus.Web.Core.Controllers.Application.Business;
/// <summary>
@@ -141,10 +143,46 @@ public class ClassRoomCallApi : IDynamicApiController
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[Obsolete]
public async Task<bool> Update(ClassRoomCallUpdate input)
{
return await _classRoomCallService.Update(input);
}
/// <summary>
/// 手动点名
/// </summary>
/// <returns></returns>
public async Task<bool> ManualRoll(List<ClassRoomCallInsert> input)
{
var appSettings = App.GetOptionsMonitor<AppInfoOptions>();
foreach (var item in input)
{
var model = new ClassRoomCallDto
{
TenantCode = appSettings.TenantCode,
PoiId = appSettings.PoiId,
TaskId = item.TaskId,
AlarmType = "class_room_call",
AlarmTypeDesc = AlarmType.class_room_call.GetDescription(),
EventId ="",
CameraId = "",
Tick = DateTime.Now,
PersonSetId = item.PersonSetId,
PersonId = item.PersonId,
Similarity = 1,
FaceScore = 100,
SnapshotUrl = "",
SnapshotData = "",
Rects = "",
Extend = "",
CreateTime = DateTime.Now,
TrackId = ""
};
await _classRoomCallService.Add(model);
}

return true;
}

/// <summary>
/// 删除点名记录(只可删除待处理的记录)


+ 3
- 2
SafeCampus.API/SafeCampus.Web.Core/Controllers/Application/Business/DepartmentController.cs Ver ficheiro

@@ -52,9 +52,10 @@ public class DepartmentController
/// </summary>
/// <param name="id">id</param>
/// <returns></returns>
public async Task<bool> Delete(List<long> id)
[HttpPost]
public async Task<bool> Delete(BaseIdListInput id)
{
return await _departmentService.Delete(id);
return await _departmentService.Delete(id.Ids);
}

/// <summary>


+ 4
- 4
SafeCampus.API/SafeCampus.Web.Core/Controllers/Application/Business/DfieldApi.cs Ver ficheiro

@@ -45,7 +45,7 @@ public class DfieldApi : IDynamicApiController
var model = JsonConvert.DeserializeObject<JObject>(str);
if ((bool)model["success"])
{
await _personSetInfoService.Add(new PersonSetInfoDto{PersonSetId = personSetId ,PersonSetName = input.Name,MajorId = input.MagjorId});
await _personSetInfoService.Add(new PersonSetInfoDto{PersonSetId = personSetId ,PersonSetName = input.Name,MajorId = input.MajorId});
return model["data"];
}

@@ -55,9 +55,9 @@ public class DfieldApi : IDynamicApiController
/// 查询底库列表
/// </summary>
/// <returns></returns>
public async Task<dynamic> QueryAll(long? majorId)
public async Task<dynamic> QueryAll(long? majorId,string setName)
{
return await _personSetInfoService.GetPageList(majorId);
return await _personSetInfoService.GetPageList(majorId, setName);
var appSettings = App.GetOptionsMonitor<AppInfoOptions>();
var str = await $"{appSettings.SXAPIURL}/dfield-api/ecology/person/set/queryAll"
.SetBody(new
@@ -152,7 +152,7 @@ public class DfieldApi : IDynamicApiController
{
PersonSetId = input.Id,
PersonSetName = input.Name,
MajorId = input.MagjorId
MajorId = input.MajorId
});
}
return isOk;


+ 1
- 1
SafeCampus.API/SafeCampus.Web.Core/Controllers/Application/Business/DormitoryController.cs Ver ficheiro

@@ -145,7 +145,7 @@ public class DormitoryController
configId = queryList["data"][0]["configId"].ParseToInt();
}
var time = new { timeBegin = input.TimeBegin, timeEnd = input.TimeEnd };
var personSetIds = await _personSetInfoService.GetPageList(null);
var personSetIds = await _personSetInfoService.GetPageList(null,null);
var cameras = await _cameraInfoService.GetPageList(new CameraSearch{PageSize = 1000,PageNum = 1});
var body = new
{


+ 1
- 1
SafeCampus.API/SafeCampus.Web.Core/Controllers/Application/Business/Dto/DfieldInput.cs Ver ficheiro

@@ -13,7 +13,7 @@ public class ControllersNameInput
/// <summary>
/// 专业id
/// </summary>
public long MagjorId { get; set; }
public long MajorId { get; set; }
}
public class ControllersIdInput
{


+ 8
- 0
SafeCampus.API/SafeCampus.Web.Core/Controllers/Application/Business/Dto/MajorDepPersonSetModel.cs Ver ficheiro

@@ -0,0 +1,8 @@
namespace SafeCampus.Web.Core.Controllers.Application.Business.Dto;

public class MajorDepPersonSetModel
{
public string Label { get; set; }
public object Value { get; set; }
public List<MajorDepPersonSetModel> Children { get; set; }
}

+ 3
- 2
SafeCampus.API/SafeCampus.Web.Core/Controllers/Application/Business/MajorController.cs Ver ficheiro

@@ -51,9 +51,10 @@ public class MajorController
/// </summary>
/// <param name="id">id</param>
/// <returns></returns>
public async Task<bool> Delete(List<long> id)
[HttpPost]
public async Task<bool> Delete(BaseIdListInput id)
{
return await _majorService.Delete(id);
return await _majorService.Delete(id.Ids);
}

/// <summary>


+ 53
- 0
SafeCampus.API/SafeCampus.Web.Core/Controllers/Application/Business/MobileController.cs Ver ficheiro

@@ -0,0 +1,53 @@
using SafeCampus.Application.Services.Business.DepartmentService;
using SafeCampus.Application.Services.Business.MajorService;
using SafeCampus.Application.Services.Business.PersonSetInfoService;
using SafeCampus.Web.Core.Controllers.Application.Business.Dto;

namespace SafeCampus.Web.Core.Controllers.Application.Business;
/// <summary>
/// 移动端接口
/// </summary>
[ApiDescriptionSettings(ApiGroupConsts.SYSTEM_Business, Order = 81, Tag = "移动端接口")]
[Route("/business/mobile")]
[RolePermission]
public class MobileController
{
private readonly IDepartmentService _departmentService;
private readonly IMajorService _majorService;
private readonly IPersonSetInfoService _personSetInfoService;

public MobileController(IDepartmentService departmentService, IMajorService majorService, IPersonSetInfoService personSetInfoService)
{
_departmentService = departmentService;
_majorService = majorService;
_personSetInfoService = personSetInfoService;
}

/// <summary>
/// 移动端获取专业系部班级列表
/// </summary>
/// <returns></returns>
public async Task<List<MajorDepPersonSetModel>> GetMajorDep()
{
var dep = await _departmentService.GetNoPageList(new DepartmentSearch());
var major = await _majorService.GetNoPageList(new MajorSearch());
var set = await _personSetInfoService.GetPageList(null, null);
var list = dep.Select(item => new MajorDepPersonSetModel
{
Label = item.Name,
Value = item.Id,
Children = major.Where(x => x.DepId == item.Id)
.Select(x => new MajorDepPersonSetModel
{
Label = x.Name,
Value = x.Id,
Children = set.Where(xx => xx.MajorId == x.Id)
.Select(xxx => new MajorDepPersonSetModel { Label = xxx.PersonSetName, Value = xxx.PersonSetId })
.ToList()
})
.ToList(),
})
.ToList();
return await Task.FromResult(list);
}
}

+ 2
- 2
SafeCampus.API/SafeCampus.Web.Core/Controllers/Application/LargeScreen/LargeScreenController.cs Ver ficheiro

@@ -308,9 +308,9 @@ public class LargeScreenController
/// 获取班级列表
/// </summary>
/// <returns></returns>
public async Task<dynamic> GetPersonSetNoPageList(long? majorId)
public async Task<dynamic> GetPersonSetNoPageList(long? majorId,string setName)
{
return await _personSetInfoService.GetPageList(majorId);
return await _personSetInfoService.GetPageList(majorId, setName);
}
/// <summary>
/// 获取专业


+ 20
- 0
SafeCampus.API/SafeCampus.Web.Core/Controllers/Application/Violation/Dto/SearchType.cs Ver ficheiro

@@ -0,0 +1,20 @@
namespace SafeCampus.Web.Core.Controllers.Application.Violation;

public enum SearchType
{
/// <summary>
/// 本周
/// </summary>
[Description("本周")]
ThisWeek=1,
/// <summary>
/// 上周
/// </summary>
[Description("上周")]
LastWeek,
/// <summary>
/// 本月
/// </summary>
[Description("本月")]
ThisMonth,
}

+ 13
- 0
SafeCampus.API/SafeCampus.Web.Core/Controllers/Application/Violation/SummarySeach.cs Ver ficheiro

@@ -0,0 +1,13 @@
namespace SafeCampus.Web.Core.Controllers.Application.Violation;

public class SummarySeach
{
/// <summary>
/// 搜索条件
/// </summary>
public SearchType SearchType { get; set; }
/// <summary>
/// 人员id
/// </summary>
public string PersonId { get; set; }
}

+ 131
- 6
SafeCampus.API/SafeCampus.Web.Core/Controllers/Application/Violation/VioPortraitSummary.cs Ver ficheiro

@@ -1,4 +1,10 @@
using SafeCampus.Application.Services.Business.PersonInfoService;
using Masuit.Tools.Systems;
using SafeCampus.Application.Services.Business.CameraInfoService;
using SafeCampus.Application.Services.Business.PersonInfoService;
using SafeCampus.Application.Services.Business.Warn.Dto;
using SafeCampus.Application.Services.Business.Warn.Service;
using System;

namespace SafeCampus.Web.Core.Controllers.Application.Violation;

/// <summary>
@@ -10,10 +16,14 @@ namespace SafeCampus.Web.Core.Controllers.Application.Violation;
public class VioPortraitSummary
{
private readonly IPersonInfoService _personInfoService;
private readonly ICameraInfoService _cameraInfoService;
private readonly IWarnInfoService _warnInfoService;

public VioPortraitSummary(IPersonInfoService personInfoService)
public VioPortraitSummary(IPersonInfoService personInfoService, ICameraInfoService cameraInfoService, IWarnInfoService warnInfoService)
{
_personInfoService = personInfoService;
_cameraInfoService = cameraInfoService;
_warnInfoService = warnInfoService;
}

/// <summary>
@@ -64,16 +74,131 @@ public class VioPortraitSummary
return new { label, value };
}
/// <summary>
/// 获取学生属性标签
/// 学生--告警分类统计
/// </summary>
/// <returns></returns>
public async Task<dynamic> GetStudentDetail()
public async Task<dynamic> GetStudentDetail(SummarySeach seach)
{
var random = new Random();
var label = new List<string> { "打闹", "趴桌子", "爱运动", "喜欢读书", "性格孤僻" };
var value = label.Select(item => random.Next(2, 20)).ToList();
//var value = new List<int>() { 10, 5, 8, 5, 1 };
return new { label, value };
return await Task.FromResult(new { label, value ,PF="93",XF="90"});
}
/// <summary>
/// 学生--出勤情况
/// </summary>
/// <returns></returns>
public async Task<dynamic> Attendance(SummarySeach seach)
{
switch (seach.SearchType)
{
case SearchType.ThisWeek:
case SearchType.LastWeek:
case SearchType.ThisMonth:
default:
var random = new Random();
var label = new List<string> { "正常出勤", "缺勤", "迟到" };
var value = label.Select(item => random.Next(2, 20)).ToList();
return await Task.FromResult(new { label, value });
}
}
/// <summary>
/// 学生--出校
/// </summary>
/// <returns></returns>
public async Task<dynamic> OutsideSchool(SummarySeach seach)
{
return await StudentSummary(seach, ApplicationConst.XXDM);
}
/// <summary>
/// 学生--图书馆
/// </summary>
/// <returns></returns>
public async Task<dynamic> Library(SummarySeach seach)
{
return await StudentSummary(seach, ApplicationConst.TSG);
}
/// <summary>
/// 学生--食堂
/// </summary>
/// <returns></returns>
public async Task<dynamic> Canteen(SummarySeach seach)
{
return await StudentSummary(seach, ApplicationConst.ST);
}
/// <summary>
/// 学生画像统计
/// </summary>
/// <param name="seach"></param>
/// <param name="groupId"></param>
/// <returns></returns>
private async Task<dynamic> StudentSummary(SummarySeach seach,long groupId)
{
var camera = await _cameraInfoService.GetPageList(new CameraSearch { GroupId = groupId, PageSize = 1000, PageNum = 1 });
var cameraIds = camera.List.Select(x => x.SensorId).ToList();
DateTime endWeek = DateTime.Now;
// 获取本周的第一天(假设一周从周一开始)
DateTime startOfWeek = endWeek.AddDays(-(int)endWeek.DayOfWeek + (int)DayOfWeek.Monday);
var label = new List<string>();
var value = new List<int>();
switch (seach.SearchType)
{
case SearchType.ThisWeek:
var list = await _warnInfoService.GetListNoPage(new WarnInfoSearch
{
AlarmType = AlarmType.visual_fence.GetDisplay(),
CameraIds = cameraIds,
PersonId = seach.PersonId,
StartTick = startOfWeek,
EndTick = endWeek
});

for (var i = startOfWeek; i < endWeek;)
{
label.Add(i.ToString("yyyy-MM-dd"));
value.Add(list.Count(x => x.Tick.Year == i.Year && x.Tick.Month == i.Month && x.Tick.Day == i.Day));
i = i.AddDays(1);
}
return new { label, value };
case SearchType.LastWeek:
DateTime startOfLastWeek = startOfWeek.AddDays(-7);
DateTime endOfLastWeek = startOfLastWeek.AddDays(6).Date.AddDays(1).AddTicks(-1); // 上周的最后一刻
var list1 = await _warnInfoService.GetListNoPage(new WarnInfoSearch
{
AlarmType = AlarmType.visual_fence.GetDisplay(),
CameraIds = cameraIds,
PersonId = seach.PersonId,
StartTick = startOfLastWeek,
EndTick = endOfLastWeek
});

for (var i = startOfWeek; i < endWeek;)
{
label.Add(i.ToString("yyyy-MM-dd"));
value.Add(list1.Count(x => x.Tick.Year == i.Year && x.Tick.Month == i.Month && x.Tick.Day == i.Day));
i = i.AddDays(1);
}
return new { label, value };
case SearchType.ThisMonth:
DateTime startOfMonth = new DateTime(endWeek.Year, endWeek.Month, 1);
var list2 = await _warnInfoService.GetListNoPage(new WarnInfoSearch
{
AlarmType = AlarmType.visual_fence.GetDisplay(),
CameraIds = cameraIds,
PersonId = seach.PersonId,
StartTick = startOfMonth,
EndTick = endWeek
});

for (var i = startOfWeek; i < endWeek;)
{
label.Add(i.ToString("yyyy-MM-dd"));
value.Add(list2.Count(x => x.Tick.Year == i.Year && x.Tick.Month == i.Month && x.Tick.Day == i.Day));
i = i.AddDays(1);
}
return new { label, value };
default:
return null;
}
}
}

+ 81
- 7
SafeCampus.API/SafeCampus.Web.Core/SafeCampus.Web.Core.xml Ver ficheiro

@@ -269,6 +269,12 @@
<param name="input"></param>
<returns></returns>
</member>
<member name="M:SafeCampus.Web.Core.Controllers.Application.Business.ClassRoomCallApi.ManualRoll(System.Collections.Generic.List{SafeCampus.Application.Services.Business.ClassRoomCallService.ClassRoomCallInsert})">
<summary>
手动点名
</summary>
<returns></returns>
</member>
<member name="M:SafeCampus.Web.Core.Controllers.Application.Business.ClassRoomCallApi.Remove(System.Int64)">
<summary>
删除点名记录(只可删除待处理的记录)
@@ -411,7 +417,7 @@
<param name="id"></param>
<returns></returns>
</member>
<member name="M:SafeCampus.Web.Core.Controllers.Application.Business.DepartmentController.Delete(System.Collections.Generic.List{System.Int64})">
<member name="M:SafeCampus.Web.Core.Controllers.Application.Business.DepartmentController.Delete(SafeCampus.Core.BaseIdListInput)">
<summary>
删除
</summary>
@@ -516,7 +522,7 @@
</summary>
<returns></returns>
</member>
<member name="M:SafeCampus.Web.Core.Controllers.Application.Business.DfieldApi.QueryAll(System.Nullable{System.Int64})">
<member name="M:SafeCampus.Web.Core.Controllers.Application.Business.DfieldApi.QueryAll(System.Nullable{System.Int64},System.String)">
<summary>
查询底库列表
</summary>
@@ -837,7 +843,7 @@
结束时间
</summary>
</member>
<member name="P:SafeCampus.Web.Core.Controllers.Application.Business.ControllersNameInput.MagjorId">
<member name="P:SafeCampus.Web.Core.Controllers.Application.Business.ControllersNameInput.MajorId">
<summary>
专业id
</summary>
@@ -959,7 +965,7 @@
<param name="id"></param>
<returns></returns>
</member>
<member name="M:SafeCampus.Web.Core.Controllers.Application.Business.MajorController.Delete(System.Collections.Generic.List{System.Int64})">
<member name="M:SafeCampus.Web.Core.Controllers.Application.Business.MajorController.Delete(SafeCampus.Core.BaseIdListInput)">
<summary>
删除
</summary>
@@ -979,6 +985,17 @@
<param name="search"></param>
<returns></returns>
</member>
<member name="T:SafeCampus.Web.Core.Controllers.Application.Business.MobileController">
<summary>
移动端接口
</summary>
</member>
<member name="M:SafeCampus.Web.Core.Controllers.Application.Business.MobileController.GetMajorDep">
<summary>
移动端获取专业系部班级列表
</summary>
<returns></returns>
</member>
<member name="T:SafeCampus.Web.Core.Controllers.Application.Business.PassengerFlowApi">
<summary>
客流查询接口
@@ -1225,7 +1242,7 @@
</summary>
<returns></returns>
</member>
<member name="M:SafeCampus.Web.Core.Controllers.Application.LargeScreen.LargeScreenController.GetPersonSetNoPageList(System.Nullable{System.Int64})">
<member name="M:SafeCampus.Web.Core.Controllers.Application.LargeScreen.LargeScreenController.GetPersonSetNoPageList(System.Nullable{System.Int64},System.String)">
<summary>
获取班级列表
</summary>
@@ -1264,6 +1281,31 @@
包含的班级id
</summary>
</member>
<member name="F:SafeCampus.Web.Core.Controllers.Application.Violation.SearchType.ThisWeek">
<summary>
本周
</summary>
</member>
<member name="F:SafeCampus.Web.Core.Controllers.Application.Violation.SearchType.LastWeek">
<summary>
上周
</summary>
</member>
<member name="F:SafeCampus.Web.Core.Controllers.Application.Violation.SearchType.ThisMonth">
<summary>
本月
</summary>
</member>
<member name="P:SafeCampus.Web.Core.Controllers.Application.Violation.SummarySeach.SearchType">
<summary>
搜索条件
</summary>
</member>
<member name="P:SafeCampus.Web.Core.Controllers.Application.Violation.SummarySeach.PersonId">
<summary>
人员id
</summary>
</member>
<member name="T:SafeCampus.Web.Core.Controllers.Application.Violation.VioAnalysisController">
<summary>
预警分析控制器
@@ -1358,10 +1400,42 @@
</summary>
<returns></returns>
</member>
<member name="M:SafeCampus.Web.Core.Controllers.Application.Violation.VioPortraitSummary.GetStudentDetail">
<member name="M:SafeCampus.Web.Core.Controllers.Application.Violation.VioPortraitSummary.GetStudentDetail(SafeCampus.Web.Core.Controllers.Application.Violation.SummarySeach)">
<summary>
学生--告警分类统计
</summary>
<returns></returns>
</member>
<member name="M:SafeCampus.Web.Core.Controllers.Application.Violation.VioPortraitSummary.Attendance(SafeCampus.Web.Core.Controllers.Application.Violation.SummarySeach)">
<summary>
学生--出勤情况
</summary>
<returns></returns>
</member>
<member name="M:SafeCampus.Web.Core.Controllers.Application.Violation.VioPortraitSummary.OutsideSchool(SafeCampus.Web.Core.Controllers.Application.Violation.SummarySeach)">
<summary>
学生--出校
</summary>
<returns></returns>
</member>
<member name="M:SafeCampus.Web.Core.Controllers.Application.Violation.VioPortraitSummary.Library(SafeCampus.Web.Core.Controllers.Application.Violation.SummarySeach)">
<summary>
学生--图书馆
</summary>
<returns></returns>
</member>
<member name="M:SafeCampus.Web.Core.Controllers.Application.Violation.VioPortraitSummary.Canteen(SafeCampus.Web.Core.Controllers.Application.Violation.SummarySeach)">
<summary>
学生--食堂
</summary>
<returns></returns>
</member>
<member name="M:SafeCampus.Web.Core.Controllers.Application.Violation.VioPortraitSummary.StudentSummary(SafeCampus.Web.Core.Controllers.Application.Violation.SummarySeach,System.Int64)">
<summary>
获取学生属性标签
学生画像统计
</summary>
<param name="seach"></param>
<param name="groupId"></param>
<returns></returns>
</member>
<member name="T:SafeCampus.Web.Core.BizOrgController">


+ 1
- 1
SafeCampus.API/SafeCampus.Web.Entry/Properties/PublishProfiles/FolderProfile.pubxml.user Ver ficheiro

@@ -5,7 +5,7 @@ https://go.microsoft.com/fwlink/?LinkID=208121.
<Project>
<PropertyGroup>
<_PublishTargetUrl>F:\Project\QJKJ\SafeCampus\SafeCampus.API\SafeCampus.Web.Entry\bin\Release\net6.0\publish\</_PublishTargetUrl>
<History>True|2024-08-19T05:38:29.9236695Z;False|2024-08-19T13:29:18.8873264+08:00;True|2024-08-19T12:31:57.9280692+08:00;True|2024-08-19T11:50:36.7241244+08:00;True|2024-08-19T10:24:05.0018377+08:00;True|2024-08-19T10:23:30.0445364+08:00;True|2024-08-19T10:12:33.8316906+08:00;True|2024-08-19T10:10:48.0967630+08:00;True|2024-08-16T12:17:51.5743944+08:00;True|2024-08-16T11:36:15.1880346+08:00;True|2024-08-12T11:27:42.2864171+08:00;True|2024-08-09T14:54:42.9062124+08:00;True|2024-08-09T11:49:01.0339449+08:00;True|2024-08-09T11:43:21.9947939+08:00;True|2024-08-09T10:43:25.7641675+08:00;True|2024-08-08T15:23:17.0510180+08:00;True|2024-08-08T15:20:50.3450876+08:00;True|2024-08-08T11:06:43.0783261+08:00;True|2024-08-07T17:24:03.0780935+08:00;True|2024-08-07T17:20:50.6266614+08:00;True|2024-08-07T17:18:15.6367265+08:00;True|2024-08-06T17:31:40.3452266+08:00;True|2024-07-31T16:54:03.1890463+08:00;True|2024-07-30T17:11:33.2514194+08:00;True|2024-07-30T17:08:14.5888060+08:00;True|2024-07-30T09:56:08.6349163+08:00;True|2024-07-30T09:50:02.2368269+08:00;True|2024-07-29T16:20:12.3202393+08:00;True|2024-07-29T16:16:29.9634841+08:00;True|2024-07-29T16:09:51.7696392+08:00;True|2024-07-29T16:06:49.4145658+08:00;True|2024-07-29T15:58:50.6654249+08:00;True|2024-07-29T11:32:11.6206514+08:00;True|2024-07-29T11:26:26.1574563+08:00;True|2024-07-29T11:04:41.1896705+08:00;True|2024-07-29T10:38:38.4560275+08:00;True|2024-07-29T10:33:38.5288332+08:00;False|2024-07-29T10:33:21.0642261+08:00;False|2024-07-29T10:33:00.1005216+08:00;True|2024-07-29T09:54:59.2794860+08:00;True|2024-07-29T09:08:54.4899269+08:00;True|2024-07-26T18:02:13.5407348+08:00;True|2024-07-26T17:46:06.7922851+08:00;True|2024-07-26T15:50:48.6986834+08:00;True|2024-07-26T15:11:17.1696147+08:00;True|2024-07-26T13:58:49.6884964+08:00;True|2024-07-25T17:31:33.0050952+08:00;True|2024-07-25T17:09:12.7084910+08:00;True|2024-07-25T17:02:01.2617736+08:00;True|2024-07-25T16:59:51.6271873+08:00;True|2024-07-25T16:58:05.5249148+08:00;True|2024-07-25T14:14:10.2008367+08:00;False|2024-07-25T14:13:54.0300465+08:00;True|2024-07-25T14:08:57.0244482+08:00;True|2024-07-25T13:41:48.8201522+08:00;True|2024-07-25T10:41:30.7277553+08:00;True|2024-07-25T10:16:05.9105335+08:00;True|2024-07-24T15:31:54.7914854+08:00;True|2024-07-24T09:54:17.6182454+08:00;True|2024-07-23T17:01:18.1510211+08:00;True|2024-07-23T16:41:53.3366577+08:00;True|2024-07-23T16:07:25.4129335+08:00;True|2024-07-23T15:50:42.2437488+08:00;True|2024-07-23T15:19:00.1900116+08:00;True|2024-07-23T14:59:22.8551233+08:00;True|2024-07-23T14:19:55.1193373+08:00;True|2024-07-19T18:04:32.2703039+08:00;True|2024-07-19T15:56:25.4103701+08:00;True|2024-07-19T15:09:00.9662436+08:00;True|2024-07-19T15:05:35.7255851+08:00;True|2024-07-19T13:14:42.9559521+08:00;False|2024-07-19T11:37:52.4020673+08:00;True|2024-07-19T11:10:22.8661346+08:00;True|2024-07-19T11:00:00.8819251+08:00;True|2024-07-19T10:45:46.8271770+08:00;True|2024-07-19T10:45:03.8183458+08:00;True|2024-07-18T18:04:42.1000382+08:00;True|2024-07-18T18:01:51.3964409+08:00;True|2024-07-18T17:57:50.3509206+08:00;True|2024-07-18T16:32:46.2184830+08:00;True|2024-07-18T16:00:11.1381449+08:00;True|2024-07-18T15:11:52.6472758+08:00;True|2024-07-18T11:54:49.4848006+08:00;True|2024-07-18T09:25:58.7204846+08:00;True|2024-07-17T17:29:28.6175272+08:00;True|2024-07-17T17:10:54.5184246+08:00;True|2024-07-17T16:57:59.8174060+08:00;True|2024-07-17T16:18:13.8137834+08:00;True|2024-07-17T15:59:16.2360757+08:00;True|2024-07-17T15:31:41.9159909+08:00;True|2024-07-17T14:41:14.6127340+08:00;True|2024-07-17T14:28:53.4455461+08:00;True|2024-07-17T14:09:44.1826222+08:00;True|2024-07-17T13:57:12.3372528+08:00;True|2024-07-17T11:39:19.5754602+08:00;True|2024-07-16T17:44:10.6162562+08:00;True|2024-07-16T17:13:48.3928403+08:00;True|2024-07-16T17:00:47.7458109+08:00;True|2024-07-16T14:07:19.3463408+08:00;True|2024-07-15T16:05:13.3561511+08:00;</History>
<History>True|2024-08-27T07:31:21.7026102Z;True|2024-08-20T11:12:26.7141701+08:00;True|2024-08-19T17:23:34.5703879+08:00;True|2024-08-19T15:55:28.3484786+08:00;True|2024-08-19T15:45:49.5623372+08:00;True|2024-08-19T14:56:17.7733738+08:00;True|2024-08-19T14:52:03.2782392+08:00;True|2024-08-19T14:10:57.7043528+08:00;True|2024-08-19T13:38:29.9236695+08:00;False|2024-08-19T13:29:18.8873264+08:00;True|2024-08-19T12:31:57.9280692+08:00;True|2024-08-19T11:50:36.7241244+08:00;True|2024-08-19T10:24:05.0018377+08:00;True|2024-08-19T10:23:30.0445364+08:00;True|2024-08-19T10:12:33.8316906+08:00;True|2024-08-19T10:10:48.0967630+08:00;True|2024-08-16T12:17:51.5743944+08:00;True|2024-08-16T11:36:15.1880346+08:00;True|2024-08-12T11:27:42.2864171+08:00;True|2024-08-09T14:54:42.9062124+08:00;True|2024-08-09T11:49:01.0339449+08:00;True|2024-08-09T11:43:21.9947939+08:00;True|2024-08-09T10:43:25.7641675+08:00;True|2024-08-08T15:23:17.0510180+08:00;True|2024-08-08T15:20:50.3450876+08:00;True|2024-08-08T11:06:43.0783261+08:00;True|2024-08-07T17:24:03.0780935+08:00;True|2024-08-07T17:20:50.6266614+08:00;True|2024-08-07T17:18:15.6367265+08:00;True|2024-08-06T17:31:40.3452266+08:00;True|2024-07-31T16:54:03.1890463+08:00;True|2024-07-30T17:11:33.2514194+08:00;True|2024-07-30T17:08:14.5888060+08:00;True|2024-07-30T09:56:08.6349163+08:00;True|2024-07-30T09:50:02.2368269+08:00;True|2024-07-29T16:20:12.3202393+08:00;True|2024-07-29T16:16:29.9634841+08:00;True|2024-07-29T16:09:51.7696392+08:00;True|2024-07-29T16:06:49.4145658+08:00;True|2024-07-29T15:58:50.6654249+08:00;True|2024-07-29T11:32:11.6206514+08:00;True|2024-07-29T11:26:26.1574563+08:00;True|2024-07-29T11:04:41.1896705+08:00;True|2024-07-29T10:38:38.4560275+08:00;True|2024-07-29T10:33:38.5288332+08:00;False|2024-07-29T10:33:21.0642261+08:00;False|2024-07-29T10:33:00.1005216+08:00;True|2024-07-29T09:54:59.2794860+08:00;True|2024-07-29T09:08:54.4899269+08:00;True|2024-07-26T18:02:13.5407348+08:00;True|2024-07-26T17:46:06.7922851+08:00;True|2024-07-26T15:50:48.6986834+08:00;True|2024-07-26T15:11:17.1696147+08:00;True|2024-07-26T13:58:49.6884964+08:00;True|2024-07-25T17:31:33.0050952+08:00;True|2024-07-25T17:09:12.7084910+08:00;True|2024-07-25T17:02:01.2617736+08:00;True|2024-07-25T16:59:51.6271873+08:00;True|2024-07-25T16:58:05.5249148+08:00;True|2024-07-25T14:14:10.2008367+08:00;False|2024-07-25T14:13:54.0300465+08:00;True|2024-07-25T14:08:57.0244482+08:00;True|2024-07-25T13:41:48.8201522+08:00;True|2024-07-25T10:41:30.7277553+08:00;True|2024-07-25T10:16:05.9105335+08:00;True|2024-07-24T15:31:54.7914854+08:00;True|2024-07-24T09:54:17.6182454+08:00;True|2024-07-23T17:01:18.1510211+08:00;True|2024-07-23T16:41:53.3366577+08:00;True|2024-07-23T16:07:25.4129335+08:00;True|2024-07-23T15:50:42.2437488+08:00;True|2024-07-23T15:19:00.1900116+08:00;True|2024-07-23T14:59:22.8551233+08:00;True|2024-07-23T14:19:55.1193373+08:00;True|2024-07-19T18:04:32.2703039+08:00;True|2024-07-19T15:56:25.4103701+08:00;True|2024-07-19T15:09:00.9662436+08:00;True|2024-07-19T15:05:35.7255851+08:00;True|2024-07-19T13:14:42.9559521+08:00;False|2024-07-19T11:37:52.4020673+08:00;True|2024-07-19T11:10:22.8661346+08:00;True|2024-07-19T11:00:00.8819251+08:00;True|2024-07-19T10:45:46.8271770+08:00;True|2024-07-19T10:45:03.8183458+08:00;True|2024-07-18T18:04:42.1000382+08:00;True|2024-07-18T18:01:51.3964409+08:00;True|2024-07-18T17:57:50.3509206+08:00;True|2024-07-18T16:32:46.2184830+08:00;True|2024-07-18T16:00:11.1381449+08:00;True|2024-07-18T15:11:52.6472758+08:00;True|2024-07-18T11:54:49.4848006+08:00;True|2024-07-18T09:25:58.7204846+08:00;True|2024-07-17T17:29:28.6175272+08:00;True|2024-07-17T17:10:54.5184246+08:00;True|2024-07-17T16:57:59.8174060+08:00;True|2024-07-17T16:18:13.8137834+08:00;True|2024-07-17T15:59:16.2360757+08:00;True|2024-07-17T15:31:41.9159909+08:00;True|2024-07-17T14:41:14.6127340+08:00;True|2024-07-17T14:28:53.4455461+08:00;</History>
<LastFailureDetails />
</PropertyGroup>
</Project>

+ 30
- 6
monitorMobile/components/cell.vue Ver ficheiro

@@ -1,27 +1,51 @@
<template>
<u-cell :title="title" isLink :border="false" @click="click"></u-cell>
<u-cell :title="title" isLink :border="false" @click="click" :titleStyle="{fontSize:'28rpx'}">
<view v-if="multiple&&cellValue.length" slot="title" class="u-slot-title selectedBox">
<view v-for="(item,index) in cellValue" :key="index">
{{item}}
</view>
</view>
</u-cell>
</template>

<script>
export default {
name: "radio",
name: "myCell",
props: {
title: {
default: "",
type: String
},
multiple: {
default: false,
},
cellValue: {
default: () => [],
}
},
methods:{
click(){
methods: {
click() {
this.$emit("click")
}
}
}
</script>

<style scoped>
<style scoped lang="scss">
.u-cell {
background: #fff;
border-radius: 20rpx;
}
.selectedBox{
display: flex;
flex-wrap: wrap;
>view{
display: inline-block;
background-color: #F2F8FF;
border-radius: 8rpx;
padding: 12rpx 18rpx;
margin: 6rpx;
font-size: 26rpx;
color: #000;
}
}
</style>

+ 0
- 2
monitorMobile/components/selectRadio.vue Ver ficheiro

@@ -19,7 +19,6 @@
props: {
value: {
default: "",
type: String | Number
},
options: {
default: [],
@@ -27,7 +26,6 @@
},
title:{
default: "",
type: String
},
cellVisible: {
default: true,


+ 58
- 32
monitorMobile/components/selectSearch.vue Ver ficheiro

@@ -1,20 +1,23 @@
<template>
<view>
<myCell v-show="cellVisible" :title="title_" isLink :border="false" @click="show = true"></myCell>
<myCell v-show="cellVisible" :multiple="multiple" :cellValue="cellValue" :title="title_" isLink :border="false" @click="show = true">
</myCell>
<u-popup :show="show" mode="bottom" :closeable="true" :round="10" @close="close" @open="open">
<view>
<view class="title">
{{'请选择' + popupTitle}}
{{popupTitle}}
</view>
<view v-if="filterable" style="padding: 0 30rpx 30rpx 30rpx">
<u-search v-model="searchText" :placeholder="'请输入'+(searchPlaceHolder||popupTitle)" shape="round"
<u-search v-model="searchText" :placeholder="searchPlaceholder" shape="round"
:showAction="false"></u-search>
</view>
<u-radio-group v-if="!multiple" :value="value_" iconPlacement="right" placement="column" @change="change" borderBottom>
<u-radio-group v-if="!multiple" :value="value_" iconPlacement="right" placement="column"
@change="change" borderBottom>
<u-radio v-show="item.label.includes(searchText)" v-for="(item,index) in options" :key="index"
:label="item.label" :name="item.value"></u-radio>
</u-radio-group>
<u-checkbox-group v-else :value="value_" iconPlacement="right" placement="column" @change="change" borderBottom>
<u-checkbox-group v-else v-model="value_" iconPlacement="right" placement="column" @change="change"
borderBottom>
<u-checkbox v-show="item.label.includes(searchText)" v-for="(item, index) in options" :key="index"
:label="item.label" :name="item.value">
</u-checkbox>
@@ -38,47 +41,60 @@
props: {
value: {
default: "",
type: String | Number
},
options: {
default: [],
type: Array
},
title: {
default: "",
type: String
// 是否显示cell回显
cellVisible: {
default: true,
},
// cell回显默认文字
placeholder:{
default:'请选择'
},
// 弹框标题
popupTitle: {
default: "",
default: "请选择",
type: String
},
searchPlaceHolder: {
default: "",
// 是否显示搜索
filterable: {
default: true,
},
// 搜索框默认文字
searchPlaceholder: {
default: "请输入",
type: String
},
cellVisible: {
default: true,
// 单选时候cell回显的文字
title: {
default: "",
},
// 是否多选
multiple: {
default: false,
},
filterable: {
default: true,
},
},
data() {
return {
show: false,
title_: this.title,
title_: this.title||this.placeholder,
value_: this.value,
radioValue: '',
searchText: ''
gruopValue: '',
searchText: '',
cellValue:[],
};
},
mounted() {
if (this.value) {
if (this.multiple) this.gruopValue = []
if (!this.multiple) {
let obj = this.options.find(e1 => e1.value == this.value)
if (obj) this.title_ = obj.label
} else {
let arr = this.options.filter(e1 => this.value.includes(e1.value))
this.cellValue = arr.map(e => e.label)
}
},
methods: {
@@ -86,20 +102,30 @@
this.show = false
},
open() {
let obj = this.options.find(e1 => e1.value == this.value)
if (obj) this.title_ = obj.label
this.title_ = obj ? obj.label : (this.popupTitle || this.title)
if (this.multiple) this.gruopValue = []
if (!this.multiple) {
let obj = this.options.find(e1 => e1.value == this.value)
if (obj) this.title_ = obj.label
} else {
let arr = this.options.filter(e1 => this.value.includes(e1.value))
this.cellValue = arr.map(e => e.label)
}
this.value_ = this.value
this.searchText = ''
},
change(e) {
this.radioValue = e
this.gruopValue = e
},
cofirm() {
this.$emit("update:value", this.radioValue)
this.$emit("change", this.radioValue)
let obj = this.options.find(e1 => e1.value == this.radioValue)
if (obj) this.title_ = obj.label
this.$emit("update:value", this.gruopValue)
this.$emit("change", this.gruopValue)
if (!this.multiple) {
let obj = this.options.find(e1 => e1.value == this.gruopValue)
if (obj) this.title_ = obj.label
} else {
let arr = this.options.filter(e1 => this.gruopValue.includes(e1.value))
this.cellValue = arr.map(e => e.label)
}
this.close()
},
}
@@ -126,13 +152,13 @@
padding: 24rpx 0;
}
}
.u-checkbox-group {
width: 92%;
max-height: 680rpx;
overflow-y: auto;
padding: 0 30rpx;
.u-cell {
background-color: #fff;
border-radius: 20rpx 20rpx 0 0;
@@ -147,7 +173,7 @@
.u-radio {
margin-top: 18rpx;
}
.u-checkbox {
margin-top: 18rpx;
}

+ 252
- 0
monitorMobile/components/selectTree.vue Ver ficheiro

@@ -0,0 +1,252 @@
<template>
<view>
<myCell v-show="cellVisible" :title="title" isLink :border="false" @click="show = true"></myCell>
<u-popup :show="show" mode="bottom" :closeable="true" :round="10" @close="close" @open="open">
<view class="title">
{{popupTitle}}
</view>
<view>
<u-tabs :list="tabsList" :current="tabIndex" @change="tabsChange" :activeStyle="{
color: '#000000',
}" itemStyle="height:84rpx;width:33.33%;box-sizing:border-box;background:#fff;border-top:1rpx solid rgba(0,0,0,0.03)"></u-tabs>
<view v-for="(item) in tabsList" :key="item.value">
<template v-if="tabIndex == item.value">
<u-radio-group v-model="selectValue" iconPlacement="right" placement="column" @change="change"
borderBottom>
<u-radio v-for="(item,index) in selectOptions" :key="index" :label="item.label"
:name="item.value"></u-radio>
</u-radio-group>
</template>
</view>
<view style="padding: 36rpx 50rpx">
<u-button @click="cofirm" type="primary" style="border-radius: 36rpx;height: 72rpx;"
text="确定"></u-button>
</view>
</view>
</u-popup>
</view>
</template>

<script>
import myCell from "@/components/cell.vue"
export default {
name: "selectRadio",
components: {
myCell
},
props: {
value: {
default: () => [],
type: Array
},
labels: {
default: () => [],
type: Array
},
placeholder: {
default: '请选择'
},
popupTitle: {
default: "请选择",
type: String
},
cellVisible: {
default: true,
},
},
data() {
return {
show: false,
title: this.labels.join('/') || this.placeholder,
tabsList: [{
name: "系部",
cate:"系部",
value: 0,
disabled: false,
list: [{
value: 222,
label: '信息系'
}, {
value: 333,
label: '金融系'
}]
},
{
name: "专业",
cate:"专业",
value: 1,
disabled: true,
list: [{
value: 222,
label: '计算机应用'
}, {
value: 333,
label: '土木工程'
}]
},
{
name: "班级",
cate:"班级",
value: 2,
disabled: true,
list: [{
value: 222,
label: '1班'
}, {
value: 333,
label: '2班'
}]
},
],
tabIndex: 0,
selectValue: null,
selectOptions: [],

selectValues: this.value,
selectLabels: [],
};
},
mounted() {
// 获取第一个tab的selectOptions
},
methods: {
close() {
this.show = false
},
// 打开选择弹框
open() {
this.selectValues = this.value || []
this.title = this.labels.join('/') || this.placeholder
if(!this.selectValues.length){
// 展示tabs第一个数据
this.tabIndex = 0
}else{
// 展示tabs最后一个数据
this.tabIndex = 2
}
this.setSelectOptions()
this.show = true
},
// 设置单选列表数据
setSelectOptions(){
switch(this.tabIndex){
case 0:
this.selectOptions = this.tabsList[0].list
break
case 1:
this.selectOptions = this.tabsList[1].list
break
case 2:
this.selectOptions = this.tabsList[2].list
break
}
},
// 单选改变
change(e) {
// 赋值
this.selectValues[this.tabIndex] = e
let obj = this.selectOptions.find(e1 => e1.value == e)
this.selectLabels[this.tabIndex] = obj.label
// 切换tab
if (this.tabIndex < this.tabsList.length - 1) {
let nextItem = this.tabsList[this.tabIndex + 1]
this.tabsChange(nextItem)
}
if(this.tabIndex == this.tabsList.length - 1){
this.tabsList[this.tabIndex].name = obj.label
}
},
// 切换tab
tabsChange(item) {
console.log(1)
if (this.tabIndex == item.value) return
this.tabIndex = item.value
setTimeout(() => {
this.setSelectOptions()
this.selectValue = null
this.initTabs()
}, 150)
},
// 初始化tab数据
initTabs() {
for (let item of this.tabsList) {
if (item.value > this.tabIndex) {
item.disabled = true
this.selectValues[item.value] = ''
this.selectLabels[item.value] = ''
} else if (item.value < this.tabIndex) {
item.disabled = false
} else {
item.disabled = false
this.selectValues[item.value] = ''
this.selectLabels[item.value] = ''
}
item.name = this.selectLabels[item.value]||item.cate
}
},
// 确定
cofirm() {
if (this.selectValues[2]) {
this.$emit("input", this.selectValues)
this.$emit("update:labels", this.selectLabels)
this.$emit("change", this.selectValues)
this.title = this.selectLabels.join('/')
this.close()
}else{
this.$emit("input", [])
this.$emit("update:labels", [])
this.$emit("change", [])
this.title = this.placeholder
this.close()
}
},
}
}
</script>

<style scoped lang="scss">
.title {
color: #000000;
font-size: 32rpx;
text-align: center;
line-height: 100rpx;
}

.u-radio-group {
width: 92%;
max-height: 680rpx;
overflow-y: auto;
padding: 0 30rpx;

.u-cell {
background-color: #fff;
border-radius: 20rpx 20rpx 0 0;
padding: 24rpx 0;
}
}

.u-checkbox-group {
width: 92%;
max-height: 680rpx;
overflow-y: auto;
padding: 0 30rpx;

.u-cell {
background-color: #fff;
border-radius: 20rpx 20rpx 0 0;
padding: 24rpx 0;
}
}

.u-border-bottom {
border-color: #F6F6F6 !important;
}

.u-radio {
margin-top: 18rpx;
}

.u-checkbox {
margin-top: 18rpx;
}
</style>

+ 72
- 15
monitorMobile/pages/attendanceCall/passengerFlow/add.vue Ver ficheiro

@@ -1,31 +1,88 @@
<template>
<view>
<u--form labelPosition="top" :model="form" :rules="rules" ref="uForm">
<u-form-item label="姓名" prop="name" borderBottom>
<u--input v-model="form.name" border="none"></u--input>
</u-form-item>
</u--form>
<view style="padding-top: 30rpx;">
<view class="whiteCard">
<u--form labelPosition="top" :labelStyle="{fontSize:'32rpx',color:'#666'}" labelWidth="200" :model="form" :rules="rules" ref="uForm">
<u-form-item label="摄像头(多选)" prop="name" borderBottom>
<view
style="width: 160%;margin-left: -30rpx;margin-right: -30rpx;margin-bottom: -20rpx;margin-top: -10rpx;">
<selectSearch :value.sync="form.shexiangtou"
:options="[{value:1,label:'走廊尽头(海康)'},{value:2,label:'厨房(海康)'},{value:3,label:'走廊尽头(海康)'},{value:4,label:'厨房(海康)'}]"
placeholder="请选择摄像头" :filterable="false" multiple />
</view>
</u-form-item>
<u-form-item label="查询时间段" prop="timeslot" borderBottom>
<uni-datetime-picker v-model="form.tick" type="datetimerange">
<view class="demo-layout">
<view>
{{form.tick.length?form.tick.join('-'):'请选择'}}
</view>
<image style="width: 30rpx;height:30rpx;"
src="@/static/image/earlyWarning/calendar.png" mode=""></image>
</view>
</uni-datetime-picker>
</u-form-item>
<u-form-item label="系部/专业/班级" prop="timeslot" borderBottom>
<view
style="width: 160%;margin-left: -30rpx;margin-right: -30rpx;margin-bottom: -20rpx;margin-top: -10rpx;">
<selectTree v-model="form.departCalss" :labels.sync="form.departCalssName"/>
</view>
</u-form-item>
<u-form-item labelPosition="left" label="分片类型(天/小时)" prop="timeslot" borderBottom>
<u-radio-group v-model="form.type">
<u-radio v-for="(item,index) in [{value:'1',label:'天'},{value:'2',label:'小时'}]" :key="index" :label="item.label"
:name="item.value"></u-radio>
</u-radio-group>
</u-form-item>
</u--form>
</view>
</view>
</template>

<script>
import selectSearch from "@/components/selectSearch.vue"
import selectTree from "@/components/selectTree.vue"
export default {
components: {
selectSearch,
selectTree
},
data() {
return {
form: {},
form: {
shexiangtou: [],
tick: [],
},
rules: []
}
}
},
methods: {}
}
</script>

<style scoped lang="scss">
.u-form {
background-color: #fff;
// border-radius: 18rpx;
// margin: 30rpx 28rpx;
// padding: 30rpx;
// color: #333333;
margin-top: 100rpx;
.whiteCard {
padding: 30rpx 30rpx;
margin: 15rpx 30rpx;
border-radius: 18rpx;
background-color: #ffffff;
font-size: 32rpx;
}
.demo-layout{
display: flex;
padding: 15rpx 0;
justify-content: space-between;
align-items: center;
&:first-child{
flex: 1;
padding-right:30rpx;
}
}
.u-radio-group{
&>*:first-child{
margin-right: 36rpx;
}
}
</style>

+ 1
- 1
monitorMobile/pages/attendanceCall/returnBed/index.vue Ver ficheiro

@@ -4,7 +4,7 @@
<selectRadio :value.sync="search.loudong" :options="[{value:1,label:'loudong1'},{value:2,label:'loudong2'}]"
title="楼栋" />
<selectSearch :value.sync="search.qinshi" :options="[{value:1,label:'qinshi1'},{value:2,label:'qinshi2'}]"
title="寝室" search-place-holder="寝室号"/>
placeholder="请选择寝室" popupTitle="请选择寝室" search-placeholder="请输入寝室号"/>
</view>
<u-empty marginTop="100rpx" :show="false" mode="list" text="暂无数据"></u-empty>
<u-list @scrolltolower="scrolltolower" style="height: calc(100% - 220rpx);">


Carregando…
Cancelar
Guardar