BaseProjectService.cs 8.89 KB
using Hh.Mes.Common.Infrastructure;
using Hh.Mes.Common.log;
using Hh.Mes.Common.Request;
using Hh.Mes.POJO.Entity;
using Hh.Mes.POJO.Response;
using Hh.Mes.Service.Repository;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using Hh.Mes.Pojo.System;
using ApkInfo;
using Microsoft.AspNetCore.Http;
using System.IO;
using System.Threading;
using Hh.Mes.Common.config;
using Microsoft.AspNetCore.Hosting;
using MySqlX.XDevAPI.Common;
using System.Security.Claims;
using NPOI.SS.Formula.Functions;
using Org.BouncyCastle.Utilities;
using NetTaste;
using System.Data;
using Hh.Mes.POJO.EnumEntitys;

namespace Hh.Mes.Service.Configure
{
	public class BaseProjectService : RepositorySqlSugar<base_project>
	{
		/// <summary>
		/// 项目地图 主页接口 
		/// </summary>
		/// <param name="pageReq"></param>
		/// <param name="entity"></param>
		/// <returns></returns>
		public dynamic Load(PageReq pageReq, base_project entity)
		{
			return ExceptionsHelp.Instance.ExecuteT(() =>
			{
				var result = new Response();
				//用户-客户 客户关联的项目
				string user = sysWebUser.Account;
				if (user != SystemVariable.DefaultCreated)//非管理员,查询登陆用户绑定客户管理的项目
				{
					sys_user_client_rel clientKeys = Context.Queryable<sys_user_client_rel>().Where(x => x.userAccount == user).First();
					if (clientKeys != null)
					{
						List<Guid> projectKeysList = Context.Queryable<base_project_client_rel>().Where(x => x.clientKeys == clientKeys.clientKeys).Select(x => x.projectKeys).ToList();
						entity.projectKeysString = string.Join(",", projectKeysList);
					}
				}
				var expression = LinqWhere(entity);
				//先组合查询表达式
				var query = Context.Queryable<base_project>().Where(expression);

				if (string.IsNullOrEmpty(entity.projectKeysString) && user != SystemVariable.DefaultCreated)
				{//非管理员,且无关联项目
					query = Context.Queryable<base_project>().Where(x => false);
				}

				//项目地图调用  返回结果
				if (entity.flag == "projectMapList")
				{
					List<base_project> list = query.ToList();
					var sumEqCount = 0;
					var sumEqOnlineCount = 0;
					var equipment = Context.Queryable<base_equipment>().ToList();
					var eqStatus = Context.Queryable<base_equipment, daq_equipment_status_record>(
												  (x, y) => new JoinQueryInfos(JoinType.Inner, x.equipmentCode == y.equipmentCode))
										  .Select((x, y) => new
										  {
											  x.projectKeys,
											  y.updateTime,
											  y.status
										  })
										  .ToList();
					var currentTime = DateTime.Now;
					foreach (base_project i in list)
					{
						i.eqCount = equipment.Where(x => x.projectKeys == i.keys).Count();//单个项目设备数
						i.eqOnLineCount = eqStatus.Where((x) => x.projectKeys == i.keys && x.status == EquipmentStatus.Running.ToString()
																&& SqlFunc.SqlServer_DateDiff("Minute",currentTime, x.updateTime) <= 5).Count();
						i.eqFreeCount = eqStatus.Where((x) => x.projectKeys == i.keys && x.status == EquipmentStatus.Free.ToString()).Count();//待机数
						i.eqFailureCount = eqStatus.Where((x) => x.projectKeys == i.keys && x.status == EquipmentStatus.Failure.ToString()).Count();//待机数
						i.eqOfflineCount = i.eqCount - i.eqOnLineCount - i.eqFreeCount - i.eqFailureCount;

						sumEqCount += i.eqCount;//关联项目 总设备数量
						sumEqOnlineCount += i.eqOnLineCount;
					}
					//返回 项目数据、总设备数、在线率、妥善率
					decimal d = (decimal)sumEqOnlineCount / sumEqCount;//在线数÷总设备数
					string onlineRate = string.Format("{0:P2}", Math.Round(d, 4));//在线率
					result.Result = new {
						list= list,
						sumEqCount= sumEqCount,
						onlineRate = onlineRate== "0.00%" ? "0%" : onlineRate,
						tuoShanRate="20%"
					};
					return result;
				}
				//Exel为ture就不分页,因为导出的话是全部导出
				if (pageReq != null && !entity.Exel)
				{
					int total = 0;
					result.Result = query.ToOffsetPage(pageReq.page, pageReq.limit, ref total);
					result.Count = total;
					return result;
				}
				result.Result = query.ToList();
				result.Count = result.Result.Count();
				return result;
			}, catchRetrunValue: "list");
		}

		public dynamic Ins(base_project entity)
		{
			return ExceptionsHelp.Instance.ExecuteT(() =>
			{
				var response = new Response();
				var projectKey = Guid.NewGuid();
				entity.keys = projectKey;
				entity.createBy = sysWebUser.Account;
				entity.createTime = DateTime.Now;

				Context.Insertable(entity).AddQueue();

				var factory = new base_factory
				{
					keys = Guid.NewGuid(),
					factoryCode = "fac_" + entity.projectCode,
					factoryName = entity.projectName + "默认一厂",
					createBy = sysWebUser.Account,
					createTime = DateTime.Now,
					projectKeys = projectKey
				};
				Context.Insertable(factory).AddQueue();
				var result = Context.SaveQueuesAsync().Result > 0;
				response.Status = result;
				if (!result) response.Message = SystemVariable.dataActionError;
				return response;
			});
		}

		public dynamic Upd(base_project entity)
		{
			return ExceptionsHelp.Instance.ExecuteT(() =>
			{
				var response = new Response();
				entity.updateBy = sysWebUser?.Account;
				entity.updateTime = DateTime.Now;
				response.Status = Update(entity);
				if (!response.Status) response.Message = SystemVariable.dataActionError;
				return response;
			});
		}

		public dynamic DelByIds(Guid[] keysList)
		{
			return ExceptionsHelp.Instance.ExecuteT(() =>
			{
				var response = new Response();
				//1.1删除项目需要判断绑定客户
				var isBindClient = Context.Queryable<base_project_client_rel>().Any(x => keysList.Contains(x.projectKeys));
				if (isBindClient)
				{
					return response.ResponseError("选中删除的项目已关联绑定客户,不能直接删除,请选取消项目关联客户!");
				}
				//1.2 项目是否绑定设备 通过设备绑定是否存在projectKeys
				//var isBindEq = Context.Queryable<base_equipment>().Any(x => keysList.Contains(x.projectKeys));
				//if (isBindEq)
				//{
				//    return response.ResponseError("选中删除的项目已关联绑定设备,不能直接删除,请删除设备后在删除项目!");
				//}
				Context.Deleteable<base_project>(t => keysList.Contains(t.keys)).AddQueue();
				Context.Deleteable<base_factory>(t => keysList.Contains(t.projectKeys)).AddQueue();

				var result = Context.SaveQueues() > 0;
				response.Status = result;
				if (!result) response.Message = SystemVariable.dataActionError;
				return response;
			});
		}

		public Response ExportData(base_project entity)
		{
			return Load(null, entity);
		}

		public Expression<Func<base_project, bool>> LinqWhere(base_project model)
		{
			try
			{
				var exp = Expressionable.Create<base_project>();
				//数据过滤条件
				//if (!string.IsNullOrWhiteSpace(model.XXX)) exp.And(x => x.XXX.Contains(model.XXX));

				if (!string.IsNullOrEmpty(model.projectKeysString))
				{
					model.projectKeysString.Split(",").ToList()
						.ForEach(i => exp.Or(x => x.keys == new Guid(i)));
				}
				if (!string.IsNullOrWhiteSpace(model.projectName))
				{
					exp.And(x => x.projectName.Contains(model.projectName));
				}
				if (!string.IsNullOrWhiteSpace(model.projectAddress))
				{
					exp.And(x => x.projectAddress.Contains(model.projectAddress));
				}
				if (!string.IsNullOrWhiteSpace(model.projectManager))
				{
					exp.And(x => x.projectManager.Contains(model.projectManager));
				}
				return exp.ToExpression();//拼接表达式
			}
			catch (Exception ex)
			{
				throw new Exception($"{ex.Message}");
			}
		}

		public dynamic LoadProjectOverview(base_project entity)
		{
			return ExceptionsHelp.Instance.ExecuteT(() =>
			{
				var result = new Response();
				//项目地图调用  返回结果
				project_overview po = new project_overview();

				//设备概述
				po.eqSumCount = Context.Queryable<base_equipment>().Where(x => x.projectKeys == entity.keys).ToList().Count;//单个项目 设备总数
				var eqInfo = Context.Queryable<base_equipment, daq_equipment_status_record>(
										   (x, y) => new JoinQueryInfos(JoinType.Inner, x.equipmentCode == y.equipmentCode))
										 .Where((x, y) => x.projectKeys == entity.keys)
										 .Select((x, y) => new { y.status })
										 .ToList();
				po.eqOnLineCount = eqInfo.Where(i => i.status == EquipmentStatus.Running.ToString()).ToList().Count;//在线数
				po.eqStandByCount = eqInfo.Where(i => i.status == EquipmentStatus.Free.ToString()).ToList().Count;//待机数

				//设备运行(当天):故障时间、运行时间、待机时间、在线率

				decimal d = (decimal)po.eqOnLineCount / po.eqSumCount;//在线数÷总设备数
				string onlineRate = string.Format("{0:P2}", Math.Round(d, 4));//在线率
				po.runningRate = onlineRate == "0.00%" ? "0%" : onlineRate;
				result.Result = po;
				return result;
			}, catchRetrunValue: "list");
		}
	}
}