/// <summary> /// 封装顶踩控件 /// </summary> /// <param name="htmlHelper"></param> /// <param name="objectId">被顶踩的对象id</param> /// <param name="userId">被顶踩的对象的UserId,用于限制不能顶踩自己</param> /// <param name="tenantTypeId">租户类型id</param> /// <param name="mode">双向操作还是单向操作</param> /// <param name="style">顶踩的样式</param> /// <param name="onSuccessCallBack">js回调函数</param> /// <returns></returns> public static MvcHtmlString SupportOppose(this HtmlHelper htmlHelper, string tenantTypeId, long objectId, long userId, AttitudeMode mode, AttitudeStyle? style = null, string onSuccessCallBack = null) { IUser CurrentUser = UserContext.CurrentUser; AttitudeService attitudeService = new AttitudeService(tenantTypeId); //查询当前登录用户是否顶踩过该对象 bool? isSupport = null; if (CurrentUser != null) { isSupport = attitudeService.IsSupport(objectId, CurrentUser.UserId); } htmlHelper.ViewData["isSupport"] = isSupport; //查询该对象总的顶踩次数 Attitude attitude = attitudeService.Get(objectId); htmlHelper.ViewData["attitude"] = attitude; //向View传递用户设置参数 htmlHelper.ViewData["tenantTypeId"] = tenantTypeId; htmlHelper.ViewData["objectId"] = objectId; htmlHelper.ViewData["userId"] = userId; htmlHelper.ViewData["mode"] = mode; htmlHelper.ViewData["style"] = style; htmlHelper.ViewData["onSuccessCallBack"] = onSuccessCallBack; //顶踩的全局设置 htmlHelper.ViewData["attitudeSettings"] = DIContainer.Resolve<ISettingsManager<AttitudeSettings>>().Get(); return htmlHelper.DisplayForModel("SupportOppose"); }
/// <summary> /// 构造器 /// </summary> /// <param name="tenantTypeId">租户类型Id</param> /// <param name="attitudeRepository">顶踩数据访问</param> /// <param name="attitudeRecordRepository">顶踩记录数据访问</param> public AttitudeService(string tenantTypeId, IAttitudeRepository attitudeRepository, IAttitudeRecordRepository attitudeRecordRepository, AttitudeMode mode = AttitudeMode.Bidirection) { this.mode = mode; this.tenantTypeId = tenantTypeId; this.attitudeRepository = attitudeRepository; this.attitudeRecordRepository = attitudeRecordRepository; }
public AttitudeStateButton(FlightComputerGUI computerin, AttitudeMode modein, string namein) { this.computer = computerin; this.mode = modein; this.name = namein; if (mode == AttitudeMode.SURFACE) { HDG = PIT = 90; HDGs = PITs = HDG.ToString(); ROL = 0; ROLs = ROL.ToString(); } }
/// <summary> /// 构造器 /// </summary> /// <param name="tenantTypeId">租户类型Id</param> /// <param name="mode">双向或单向模式</param> public AttitudeService(string tenantTypeId, AttitudeMode mode = AttitudeMode.Bidirection) : this(tenantTypeId, new AttitudeRepository(), new AttitudeRecordRepository(), mode) { }
public void SetMode(AttitudeMode mode, AttitudeButtonState input) { this.attitideActive = input.Active; if (!input.Active) { return; } switch (mode) { case AttitudeMode.MANEUVERNODE: if (input.MN != Quaternion.identity) { Target = input.MN; Reference = AttitudeReference.INERTIAL; } else { Target = Quaternion.LookRotation(vessel.ReferenceTransform.up, -vessel.ReferenceTransform.forward); Reference = AttitudeReference.INERTIAL; } break; case AttitudeMode.KILLROT: Target = Quaternion.LookRotation(vessel.ReferenceTransform.up, -vessel.ReferenceTransform.forward); Reference = AttitudeReference.INERTIAL; break; case AttitudeMode.PROGRADE: Target = Direction(Vector3d.forward, AttitudeReference.ORBIT); Reference = AttitudeReference.ORBIT; break; case AttitudeMode.RETROGRADE: Target = Direction(Vector3d.back, AttitudeReference.ORBIT); Reference = AttitudeReference.ORBIT; break; case AttitudeMode.SRF_PROGRADE: Target = Direction(Vector3d.forward, AttitudeReference.SURFACE_VELOCITY); Reference = AttitudeReference.SURFACE_VELOCITY; break; case AttitudeMode.SRF_RETROGRADE: Target = Direction(Vector3d.back, AttitudeReference.SURFACE_VELOCITY); Reference = AttitudeReference.SURFACE_VELOCITY; break; case AttitudeMode.NORMAL_PLUS: Target = Direction(Vector3d.left, AttitudeReference.ORBIT); Reference = AttitudeReference.ORBIT; break; case AttitudeMode.NORMAL_MINUS: Target = Direction(Vector3d.right, AttitudeReference.ORBIT); Reference = AttitudeReference.ORBIT; break; case AttitudeMode.RADIAL_PLUS: Target = Direction(Vector3d.up, AttitudeReference.ORBIT); Reference = AttitudeReference.ORBIT; break; case AttitudeMode.RADIAL_MINUS: Target = Direction(Vector3d.down, AttitudeReference.ORBIT); Reference = AttitudeReference.ORBIT; break; case AttitudeMode.SURFACE: if (input.USEROL) { Target = Quaternion.AngleAxis(input.HDG, Vector3.up) * Quaternion.AngleAxis(-input.PIT, Vector3.right) * Quaternion.AngleAxis(-input.ROL, Vector3.forward); } else { Target = Direction(Quaternion.AngleAxis(input.HDG, Vector3.up) * Quaternion.AngleAxis(-input.PIT, Vector3.right) * Vector3d.forward, AttitudeReference.SURFACE_NORTH); } Reference = AttitudeReference.SURFACE_NORTH; break; } }
public void SetMode(AttitudeMode mode, AttitudeButtonState input) { this.attitideActive = input.Active; if (!input.Active) { return; } switch (mode) { case AttitudeMode.MANEUVERNODE: if (input.MN != Quaternion.identity) { Target = input.MN; Reference = AttitudeReference.INERTIAL; } else { Target = Quaternion.LookRotation(vessel.ReferenceTransform.up, -vessel.ReferenceTransform.forward); Reference = AttitudeReference.INERTIAL; } break; case AttitudeMode.KILLROT: Target = Quaternion.LookRotation(vessel.ReferenceTransform.up, -vessel.ReferenceTransform.forward); Reference = AttitudeReference.INERTIAL; break; case AttitudeMode.PROGRADE: Target = Direction(Vector3d.forward, AttitudeReference.ORBIT); Reference = AttitudeReference.ORBIT; break; case AttitudeMode.RETROGRADE: Target = Direction(Vector3d.back, AttitudeReference.ORBIT); Reference = AttitudeReference.ORBIT; break; case AttitudeMode.SRF_PROGRADE: Target = Direction(Vector3d.forward, AttitudeReference.SURFACE_VELOCITY); Reference = AttitudeReference.SURFACE_VELOCITY; break; case AttitudeMode.SRF_RETROGRADE: Target = Direction(Vector3d.back, AttitudeReference.SURFACE_VELOCITY); Reference = AttitudeReference.SURFACE_VELOCITY; break; case AttitudeMode.NORMAL_PLUS: Target = Direction(Vector3d.left, AttitudeReference.ORBIT); Reference = AttitudeReference.ORBIT; break; case AttitudeMode.NORMAL_MINUS: Target = Direction(Vector3d.right, AttitudeReference.ORBIT); Reference = AttitudeReference.ORBIT; break; case AttitudeMode.RADIAL_PLUS: Target = Direction(Vector3d.up, AttitudeReference.ORBIT); Reference = AttitudeReference.ORBIT; break; case AttitudeMode.RADIAL_MINUS: Target = Direction(Vector3d.down, AttitudeReference.ORBIT); Reference = AttitudeReference.ORBIT; break; case AttitudeMode.SURFACE: if (input.USEROL) Target = Quaternion.AngleAxis(input.HDG, Vector3.up) * Quaternion.AngleAxis(-input.PIT, Vector3.right) * Quaternion.AngleAxis(-input.ROL, Vector3.forward); else Target = Direction(Quaternion.AngleAxis(input.HDG, Vector3.up) * Quaternion.AngleAxis(-input.PIT, Vector3.right) * Vector3d.forward, AttitudeReference.SURFACE_NORTH); Reference = AttitudeReference.SURFACE_NORTH; break; } }
public JsonResult _SupportOppose(string tenantTypeId, long objectId, long userId, AttitudeMode mode, bool operation) { IUser currentUser = UserContext.CurrentUser; //未登录用户不能操作 if (currentUser == null) { return Json(new StatusMessageData(StatusMessageType.Error, "未登录用户不能操作!")); } //当前用户不能顶踩自己 if (currentUser.UserId == userId) { return Json(new StatusMessageData(StatusMessageType.Error, "不能顶踩自己!")); } AttitudeService attitudeService = new AttitudeService(tenantTypeId, mode); AttitudeSettings attitudeSettings = attitudeSettingsManager.Get(); //操作结果 bool success = false; bool? isSupport = attitudeService.IsSupport(objectId, currentUser.UserId); if (mode == AttitudeMode.Bidirection) { //对于双向操作,已顶踩过的不能再进行同方向操作 if (isSupport.HasValue && isSupport.Value == operation) { return Json(new StatusMessageData(StatusMessageType.Error, "不能进行重复操作!")); } //对于双向操作,如果不可修改,也不可以进行反方向操作 if (!attitudeSettings.IsModify && isSupport.HasValue && isSupport.Value != operation) { return Json(new StatusMessageData(StatusMessageType.Error, "不能修改原有的操作!")); } if (operation) { success = attitudeService.Support(objectId, currentUser.UserId); } else { success = attitudeService.Oppose(objectId, currentUser.UserId); } } else { //对于单向操作,如果已经操作过,并且不可取消,则直接返回错误提示 if (isSupport.HasValue && !attitudeSettings.EnableCancel) { return Json(new StatusMessageData(StatusMessageType.Error, "不能取消原有的操作!")); } if (!isSupport.HasValue || !isSupport.Value) { success = attitudeService.Support(objectId, currentUser.UserId); } else { success = attitudeService.Oppose(objectId, currentUser.UserId); } } //返回操作结果 if (success) { return Json(new StatusMessageData(StatusMessageType.Success, "操作成功!")); } else { return Json(new StatusMessageData(StatusMessageType.Error, "操作失败,请稍后再试!")); } }
/// <summary> /// 对操作对象进行顶操作 /// </summary> /// <param name="objectId">操作对象Id</param> /// <param name="tenantTypeId">租户类型Id</param> /// <param name="userId">操作用户Id</param> /// <param name="mode">顶踩的操作模式</param> /// <returns>是否操作成功,Ture-成功</returns> public bool Support(long objectId, string tenantTypeId, long userId, AttitudeMode mode = AttitudeMode.Bidirection) { Database dao = CreateDAO(); dao.OpenSharedConnection(); AttitudeSettings attitudeSettings = attitudeSettingsManager.Get(); AttitudeOnlySupportSettings attitudeOnlySupportSettings = attitudeOnlySupportSettingsManager.Get(); bool returnValue = false; var sql = Sql.Builder; sql.Where("ObjectId = @0 and TenantTypeId = @1", objectId, tenantTypeId); Attitude entity = dao.FirstOrDefault <Attitude>(sql); if (entity == null) { entity = Attitude.New(); entity.TenantTypeId = tenantTypeId; entity.ObjectId = objectId; dao.Insert(entity); } #region 判断是否双向 if (AttitudeMode.Bidirection == mode) { #region 判断是否可修改 //判断是否可修改 if (attitudeSettings.IsModify) { #region 判断是否取消 //判断是否可取消 if (attitudeSettings.EnableCancel) { IList <Sql> sqls = new List <Sql>(); int affectCount = 0; //判断是否有过操作记录 bool?isSupport = IsSupport(objectId, tenantTypeId, userId); switch (isSupport) { //顶过记录 case true: returnValue = false; break; //踩过记录 case false: sqls.Add(Sql.Builder.Append(@"DELETE FROM tn_AttitudeRecords WHERE (UserId = @0) AND (TenantTypeId = @1) and (ObjectId = @2)" , userId, tenantTypeId, objectId)); sqls.Add(Sql.Builder.Append(@"UPDATE tn_Attitudes SET OpposeCount = OpposeCount - 1, Comprehensive = Comprehensive - @0 WHERE (ObjectId = @1) AND (TenantTypeId = @2)" , attitudeSettings.OpposeWeights, objectId, tenantTypeId)); using (var transaction = dao.GetTransaction()) { affectCount = dao.Execute(sqls); transaction.Complete(); } if (affectCount > 0) { if (RealTimeCacheHelper.EnableCache) { EntityData.ForType(typeof(AttitudeRecord)).RealTimeCacheHelper.IncreaseAreaVersion("ObjectId", objectId); //更新缓存 Get(objectId, tenantTypeId, false); //清除顶踩状态缓存 cacheService.Remove(GetCacheKey_IsSupport(objectId, tenantTypeId, userId)); } returnValue = true; } else { returnValue = false; } break; default: sqls.Add(Sql.Builder.Append(@"UPDATE tn_Attitudes SET SupportCount = SupportCount + 1, Comprehensive = Comprehensive + @0 WHERE (ObjectId = @1) AND (TenantTypeId = @2)" , attitudeSettings.SupportWeights, objectId, tenantTypeId)); sqls.Add(Sql.Builder.Append(@"INSERT INTO tn_AttitudeRecords (ObjectId, UserId, TenantTypeId, IsSupport) VALUES (@0, @1, @2, 1)" , objectId, userId, tenantTypeId)); using (var transaction = dao.GetTransaction()) { affectCount = dao.Execute(sqls); transaction.Complete(); } if (affectCount > 0) { if (RealTimeCacheHelper.EnableCache) { EntityData.ForType(typeof(AttitudeRecord)).RealTimeCacheHelper.IncreaseAreaVersion("ObjectId", objectId); //更新缓存 Get(objectId, tenantTypeId, false); cacheService.Set(GetCacheKey_IsSupport(objectId, tenantTypeId, userId), true, CachingExpirationType.SingleObject); } returnValue = true; } else { returnValue = false; } break; } } else { IList <Sql> sqls = new List <Sql>(); int affectCount = 0; //判断是否有过操作记录 bool?isSupport = IsSupport(objectId, tenantTypeId, userId); switch (isSupport) { //已经顶过 case true: returnValue = false; break; //已经踩过 case false: sqls.Add(Sql.Builder.Append(@"UPDATE tn_Attitudes SET OpposeCount = OpposeCount - 1 ,SupportCount = SupportCount + 1, Comprehensive = Comprehensive + @0 - @1 WHERE (ObjectId = @2) AND (TenantTypeId = @3)" , attitudeSettings.SupportWeights, attitudeSettings.OpposeWeights, objectId, tenantTypeId )); sqls.Add(Sql.Builder.Append(@"UPDATE tn_AttitudeRecords SET IsSupport =1 WHERE(ObjectId = @0) AND (UserId = @1) AND (TenantTypeId = @2)" , objectId, userId, tenantTypeId)); using (var transaction = dao.GetTransaction()) { affectCount = dao.Execute(sqls); transaction.Complete(); } if (affectCount > 0) { if (RealTimeCacheHelper.EnableCache) { EntityData.ForType(typeof(AttitudeRecord)).RealTimeCacheHelper.IncreaseAreaVersion("ObjectId", objectId); //更新缓存 Get(objectId, tenantTypeId, false); cacheService.Set(GetCacheKey_IsSupport(objectId, tenantTypeId, userId), true, CachingExpirationType.SingleObject); } returnValue = true; } else { returnValue = false; } break; default: //没有操作过的记录就 添加记录 sqls.Add(Sql.Builder.Append(@"UPDATE tn_Attitudes SET SupportCount = SupportCount + 1, Comprehensive = Comprehensive + @0 WHERE (ObjectId = @1) AND (TenantTypeId = @2)" , attitudeSettings.SupportWeights, objectId, tenantTypeId)); sqls.Add(Sql.Builder.Append(@"INSERT INTO tn_AttitudeRecords (ObjectId, UserId, TenantTypeId, IsSupport) VALUES (@0, @1, @2, 1)" , objectId, userId, tenantTypeId)); using (var transaction = dao.GetTransaction()) { affectCount = dao.Execute(sqls); transaction.Complete(); } if (affectCount > 0) { if (RealTimeCacheHelper.EnableCache) { EntityData.ForType(typeof(AttitudeRecord)).RealTimeCacheHelper.IncreaseAreaVersion("ObjectId", objectId); //更新缓存 Get(objectId, tenantTypeId, false); cacheService.Set(GetCacheKey_IsSupport(objectId, tenantTypeId, userId), true, CachingExpirationType.SingleObject); } returnValue = true; } else { returnValue = false; } break; } } #endregion 判断是否取消 } else { //先判断一下是否有顶踩记录 IList <Sql> sqls = new List <Sql>(); int affectCount = 0; //判断是否有过操作记录 bool?isSupport = IsSupport(objectId, tenantTypeId, userId); if (isSupport == null) { //没有记录就 添加记录 sqls.Add(Sql.Builder.Append(@"UPDATE tn_Attitudes SET SupportCount = SupportCount + 1, Comprehensive = Comprehensive + @0 WHERE (ObjectId = @2) AND (TenantTypeId = @3)" , attitudeSettings.SupportWeights, attitudeSettings.OpposeWeights, objectId, tenantTypeId )); sqls.Add(Sql.Builder.Append(@"INSERT INTO tn_AttitudeRecords (ObjectId, UserId, TenantTypeId, IsSupport) VALUES (@0, @1, @2, 1)" , objectId, userId, tenantTypeId)); using (var transaction = dao.GetTransaction()) { affectCount = dao.Execute(sqls); transaction.Complete(); } if (affectCount > 0) { if (RealTimeCacheHelper.EnableCache) { EntityData.ForType(typeof(AttitudeRecord)).RealTimeCacheHelper.IncreaseAreaVersion("ObjectId", objectId); //更新缓存 Get(objectId, tenantTypeId, false); cacheService.Set(GetCacheKey_IsSupport(objectId, tenantTypeId, userId), true, CachingExpirationType.SingleObject); } returnValue = true; } else { returnValue = false; } } } #endregion 判断是否可修改 } else { //单向 #region 是否可取消操作 //是否可取消操作 if (attitudeOnlySupportSettings.IsCancel) { IList <Sql> sqls = new List <Sql>(); int affectCount = 0; //判断是否有过操作记录 bool?isSupport = IsSupport(objectId, tenantTypeId, userId); switch (isSupport) { //顶过记录 case true: sqls.Add(Sql.Builder.Append(@"DELETE FROM tn_AttitudeRecords WHERE UserId = @0 and TenantTypeId = @1 and ObjectId = @2" , userId, tenantTypeId, objectId)); sqls.Add(Sql.Builder.Append(@"UPDATE tn_Attitudes SET SupportCount = SupportCount-1, Comprehensive = SupportCount-1 WHERE ObjectId = @0 and TenantTypeId = @1", objectId, tenantTypeId)); using (var transaction = dao.GetTransaction()) { affectCount = dao.Execute(sqls); transaction.Complete(); } if (affectCount > 0) { if (RealTimeCacheHelper.EnableCache) { EntityData.ForType(typeof(AttitudeRecord)).RealTimeCacheHelper.IncreaseAreaVersion("ObjectId", objectId); //更新缓存 Get(objectId, tenantTypeId, false); //清除顶踩状态缓存 cacheService.Remove(GetCacheKey_IsSupport(objectId, tenantTypeId, userId)); } returnValue = true; } else { returnValue = false; } break; default: sqls.Add(Sql.Builder.Append(@"UPDATE tn_Attitudes SET SupportCount = SupportCount+1, Comprehensive = SupportCount+1 WHERE (ObjectId = @0) AND (TenantTypeId = @1)" , objectId, tenantTypeId)); sqls.Add(Sql.Builder.Append(@"INSERT INTO tn_AttitudeRecords (ObjectId, UserId, TenantTypeId, IsSupport) VALUES (@0, @1, @2, 1)" , objectId, userId, tenantTypeId)); using (var transaction = dao.GetTransaction()) { affectCount = dao.Execute(sqls); transaction.Complete(); } if (affectCount > 0) { if (RealTimeCacheHelper.EnableCache) { EntityData.ForType(typeof(AttitudeRecord)).RealTimeCacheHelper.IncreaseAreaVersion("ObjectId", objectId); //更新缓存 Get(objectId, tenantTypeId, false); cacheService.Set(GetCacheKey_IsSupport(objectId, tenantTypeId, userId), true, CachingExpirationType.SingleObject); } returnValue = true; } else { returnValue = false; } break; } } else { //不可取消的单向操作 IList <Sql> sqls = new List <Sql>(); int affectCount = 0; //判断是否有过操作记录 bool?isSupport = IsSupport(objectId, tenantTypeId, userId); if (isSupport == null) { sqls.Add(Sql.Builder.Append(@"UPDATE tn_Attitudes SET SupportCount = SupportCount + 1, Comprehensive = SupportCount + 1 WHERE (ObjectId = @0) AND (TenantTypeId = @1)" , objectId, tenantTypeId)); sqls.Add(Sql.Builder.Append(@"INSERT INTO tn_AttitudeRecords (ObjectId, UserId, TenantTypeId, IsSupport) VALUES (@0, @1, @2, 1)" , objectId, userId, tenantTypeId)); using (var transaction = dao.GetTransaction()) { affectCount = dao.Execute(sqls); transaction.Complete(); } if (affectCount > 0) { if (RealTimeCacheHelper.EnableCache) { EntityData.ForType(typeof(AttitudeRecord)).RealTimeCacheHelper.IncreaseAreaVersion("ObjectId", objectId); //更新缓存 Get(objectId, tenantTypeId, false); cacheService.Set(GetCacheKey_IsSupport(objectId, tenantTypeId, userId), true, CachingExpirationType.SingleObject); } returnValue = true; } else { returnValue = false; } } } #endregion 是否可取消操作 } #endregion 判断是否双向 dao.CloseSharedConnection(); return(returnValue); }
/// <summary> /// 封装顶踩控件 /// </summary> /// <param name="htmlHelper"></param> /// <param name="objectId">被顶踩的对象id</param> /// <param name="userId">被顶踩的对象的UserId,用于限制不能顶踩自己</param> /// <param name="tenantTypeId">租户类型id</param> /// <param name="mode">双向操作还是单向操作</param> /// <param name="style">顶踩的样式</param> /// <param name="onSuccessCallBack">js回调函数</param> /// <returns></returns> public static MvcHtmlString SupportOppose(this HtmlHelper htmlHelper, string tenantTypeId, long objectId, long userId, AttitudeMode mode, AttitudeStyle?style = null, string onSuccessCallBack = null) { IUser CurrentUser = UserContext.CurrentUser; AttitudeService attitudeService = new AttitudeService(tenantTypeId); //查询当前登录用户是否顶踩过该对象 bool?isSupport = null; if (CurrentUser != null) { isSupport = attitudeService.IsSupport(objectId, CurrentUser.UserId); } htmlHelper.ViewData["isSupport"] = isSupport; //查询该对象总的顶踩次数 Attitude attitude = attitudeService.Get(objectId); htmlHelper.ViewData["attitude"] = attitude; //向View传递用户设置参数 htmlHelper.ViewData["tenantTypeId"] = tenantTypeId; htmlHelper.ViewData["objectId"] = objectId; htmlHelper.ViewData["userId"] = userId; htmlHelper.ViewData["mode"] = mode; htmlHelper.ViewData["style"] = style; htmlHelper.ViewData["onSuccessCallBack"] = onSuccessCallBack; //顶踩的全局设置 htmlHelper.ViewData["attitudeSettings"] = DIContainer.Resolve <IAttitudeSettingsManager>().Get(); ; return(htmlHelper.DisplayForModel("SupportOppose")); }
///// <summary> ///// 顶踩 ///// </summary> ///// <returns></returns> public string _SupportOppose(string tenantTypeId, long objectId, long userId, AttitudeMode mode, bool operation) { return CachedUrlHelper.Action("_SupportOppose", "Channel", CommonAreaName, new RouteValueDictionary { { "tenantTypeId", tenantTypeId }, { "objectId", objectId }, { "userId", userId }, { "mode", mode }, { "operation", operation } }); }