BusUtilizationRateService.cs 8.83 KB
using Autofac.Core;
using Hh.Mes.Common.Infrastructure;
using Hh.Mes.Common.Json;
using Hh.Mes.Common.log;
using Hh.Mes.Common.Request;
using Hh.Mes.Pojo.System;
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;

namespace Hh.Mes.Service.Material
{
    public class BusUtilizationRateService : RepositorySqlSugar<bus_utilization_rate>
    {
        #region 属性
        public string totLength = "0";
        public string totUtiliza = "0%";
        #endregion
        public dynamic Load(PageReq pageReq, bus_utilization_rate entity)
        {
            return ExceptionsHelp.Instance.ExecuteT(() =>
            {
                var result = new Response();
                var expression = LinqWhere(entity);
                //先组合查询表达式(多表查询查看IOT 设备列表案例)
                var cutHeads  = Context.Queryable<bus_cutplan_head>().Where(expression).ToList();
                if (cutHeads != null && cutHeads.Count > 0)
                {
                    //如果余料大于3000 利用率算为100
                    foreach (var item in cutHeads)
                    {
                        if (item.oddmentsLength >= 3000)
                        {
                            item.lossCount = 1;
                        }
                    }
                    totLength = cutHeads.Sum(x => x.pipeLength).ToString();
                    totUtiliza = Math.Round(cutHeads.Average(x => x.lossCount)*100,2 ).ToString()+"%";
                   
                }

                List<string> materialCodes = cutHeads.Select(x=>x.materialCode).Distinct().ToList();
                //数据可能重复单独取
                List<base_material> base_Materials =  Context.Queryable<base_material>().In(x=>x.materialCode,materialCodes).ToList();
                var cut_list = GetCutDetailList(entity);
                List<Utilization_rate> rates = new List<Utilization_rate>();
                foreach (var item in materialCodes)
                {
                    Utilization_rate rate = new Utilization_rate();
                    rate.materialCode = item;
                    rate.lineCode = entity.lineCode;
                    if (cutHeads.Where(x => x.materialCode == item).ToList().Count > 0)
                    {
                        double d = Convert.ToDouble(cutHeads.Where(x => x.materialCode == item).ToList().Sum(x => x.pipeLength));
                        rate.pipeLength = d;
                        rate.pipeCount = cutHeads.Where(x => x.materialCode == item).ToList().Count;
                        rate.lossCount = Convert.ToDouble(cutHeads.Where(x => x.materialCode == item).ToList().Average(x => x.lossCount));
                        if (base_Materials.Select(x => x.materialCode == item && x.isDelete == 1).ToList().Count > 0)
                        {
                            rate.materialName = base_Materials.First(x => x.materialCode == item && x.isDelete == 1).materialName;
                        }
                    }
                    else
                    {
                        rate.pipeLength = 0;
                        rate.pipeCount = 0;
                        rate.lossCount = 0;
                    }
                    if (cut_list != null && cut_list.Count > 0)
                    {
                        var materialCutList = cut_list.Where(x => x.materialCode == item && x.extend4 == rate.lineCode).ToList();
                        rate.pipePartCount = materialCutList == null ? 0 : materialCutList.Count;
                    }
                    rates.Add(rate);
                }

                result.Result = rates;
                if (pageReq != null)
                {
                    result.Count = rates.Count;
                    result.Message = new { totUtiliza = totUtiliza, totLength = totLength }.ToJson();
                }
                
                return result;
            }, catchRetrunValue: "list");
        }

        public dynamic Ins(bus_utilization_rate entity)
        {
            return ExceptionsHelp.Instance.ExecuteT(() =>
            {
                var response = new Response();
                //entity.createBy = sysWebUser.Account;
                //entity.createTime = DateTime.Now;
                response.Status = Add(entity);
                if (!response.Status) response.Message = SystemVariable.dataActionError;
                return response;
            });
        }

        public dynamic Upd(bus_utilization_rate 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(int[] ids)
        {
            return ExceptionsHelp.Instance.ExecuteT(() =>
            {
                var response = new Response();
                Context.Deleteable<bus_utilization_rate>(t => ids.Contains(t.id)).ExecuteCommand();
                return response;
            });
        }

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

        public Expression<Func<bus_cutplan_head, bool>> LinqWhere(bus_utilization_rate model)
        {
            try
            {
                var exp = Expressionable.Create<bus_cutplan_head>();
                if (string.IsNullOrWhiteSpace(model.lineCode))
                { 
                    model.lineCode = "line1";
                }

                //数据过滤条件
                //if (!string.IsNullOrWhiteSpace(model.XXX)) exp.And(x => x.XXX.Contains(model.XXX));
                if (!string.IsNullOrWhiteSpace(model.materialCode))
                {
                    exp.And(x => x.materialCode.Contains(model.materialCode));
                }
                if (!string.IsNullOrWhiteSpace(model.lineCode))
                {
                    exp.And(x => x.lineCode.Contains(model.lineCode));
                }
                if ( model.startTime != DateTime.MinValue)
                {
                    exp.And(x => Convert.ToDateTime( x.createTime) >= model.startTime);
                }
                if (model.endTime != DateTime.MinValue)
                {
                    exp.And(x => Convert.ToDateTime(x.createTime) <= model.endTime.AddDays(1));
                }
                return exp.ToExpression();//拼接表达式
            }
            catch (Exception ex)
            {
                throw new Exception($"{ex.Message}");
            }
        }

        public List<bus_cutplan_detail> GetCutDetailList(bus_utilization_rate model)
        { 
            try
            {
                var exp = Expressionable.Create<bus_cutplan_detail>();
                if (string.IsNullOrWhiteSpace(model.lineCode))
                {
                    model.lineCode = "line1";
                } 
                //数据过滤条件
                //if (!string.IsNullOrWhiteSpace(model.XXX)) exp.And(x => x.XXX.Contains(model.XXX));
                if (!string.IsNullOrWhiteSpace(model.materialCode))
                {
                    exp.And(x => x.materialCode.Contains(model.materialCode));
                }
                if (!string.IsNullOrWhiteSpace(model.lineCode))
                {
                   exp.And(x => x.extend4.Contains(model.lineCode));
                }
                if (model.startTime != DateTime.MinValue)
                {
                    exp.And(x => Convert.ToDateTime(x.cutEndTime) >= model.startTime);
                }
                if (model.endTime != DateTime.MinValue)
                {
                    exp.And(x => Convert.ToDateTime(x.cutEndTime) <= model.endTime.AddDays(1));
                }
                //return exp.ToExpression();//拼接表达式
                List<bus_cutplan_detail> list = Context.Queryable<bus_cutplan_detail, bus_cutplan_head>((x, c) => new JoinQueryInfos(JoinType.Left, x.headKeys == c.keys)).Where(exp.ToExpression()).Select((x, c) => new bus_cutplan_detail
                {
                    barCode = x.barCode,
                    materialCode= c.materialCode,
                    extend4 = x.extend4,
                    iwpNo=x.iwpNo,
                    id=x.id,
                    cuttingLength=x.cuttingLength,
                    headKeys=x.headKeys,
                    cutState=x.cutState
                }).OrderBy(x=>x.iwpNo).ToList(); 
                return list;
            }
            catch (Exception ex)
            {
                throw new Exception($"{ex.Message}");
            }
        }
    }
}