@@ -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 | |||
} |
@@ -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> | |||
预警处理状态 | |||
@@ -1,4 +1,6 @@ | |||
namespace SafeCampus.Application.Services.Business.ClassRoomCallService; | |||
using Dm; | |||
namespace SafeCampus.Application.Services.Business.ClassRoomCallService; | |||
public class ClassRoomCallService : DbRepository<ClassRoomCall>, IClassRoomCallService | |||
{ | |||
@@ -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; } | |||
} |
@@ -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; } | |||
} | |||
@@ -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); | |||
} | |||
} |
@@ -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) | |||
@@ -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); | |||
} |
@@ -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>>(); | |||
@@ -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; } |
@@ -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); | |||
@@ -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,14 +1,4 @@ | |||
| |||
// | |||
namespace SafeCampus.SqlSugar; | |||
namespace SafeCampus.SqlSugar; | |||
/// <summary> | |||
/// AppStartup启动类 | |||
@@ -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; } | |||
} |
@@ -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> | |||
/// 班主任信息 | |||
@@ -0,0 +1,9 @@ | |||
namespace SafeCampus.System; | |||
public class CameraGroupSeedData : ISqlSugarEntitySeedData<CameraGroup> | |||
{ | |||
public IEnumerable<CameraGroup> SeedData() | |||
{ | |||
return SeedDataUtil.GetSeedData<CameraGroup>("seed_sys_user.json"); | |||
} | |||
} |
@@ -0,0 +1,23 @@ | |||
{ | |||
"RECORDS": [ | |||
{ | |||
"Id": "583659544297541", | |||
"Name": "学校点位配置" | |||
}, | |||
{ | |||
"Id": "583659952070725", | |||
"Name": "学校大门", | |||
"ParentId": "583659544297541" | |||
}, | |||
{ | |||
"Id": "583659984986181", | |||
"Name": "食堂", | |||
"ParentId": "583659544297541" | |||
}, | |||
{ | |||
"Id": "583660006621253", | |||
"Name": "图书馆", | |||
"ParentId": "583659544297541" | |||
} | |||
] | |||
} |
@@ -1,14 +1,4 @@ | |||
| |||
// | |||
namespace SafeCampus.System; | |||
namespace SafeCampus.System; | |||
/// <summary> | |||
/// 用户表种子数据 | |||
@@ -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> | |||
/// 删除点名记录(只可删除待处理的记录) | |||
@@ -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> | |||
@@ -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; | |||
@@ -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 | |||
{ | |||
@@ -13,7 +13,7 @@ public class ControllersNameInput | |||
/// <summary> | |||
/// 专业id | |||
/// </summary> | |||
public long MagjorId { get; set; } | |||
public long MajorId { get; set; } | |||
} | |||
public class ControllersIdInput | |||
{ | |||
@@ -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; } | |||
} |
@@ -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> | |||
@@ -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); | |||
} | |||
} |
@@ -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> | |||
/// 获取专业 | |||
@@ -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, | |||
} |
@@ -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; } | |||
} |
@@ -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; | |||
} | |||
} | |||
} |
@@ -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"> | |||
@@ -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> |
@@ -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> |
@@ -19,7 +19,6 @@ | |||
props: { | |||
value: { | |||
default: "", | |||
type: String | Number | |||
}, | |||
options: { | |||
default: [], | |||
@@ -27,7 +26,6 @@ | |||
}, | |||
title:{ | |||
default: "", | |||
type: String | |||
}, | |||
cellVisible: { | |||
default: true, | |||
@@ -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; | |||
} |
@@ -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> |
@@ -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> |
@@ -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);"> | |||