BaseLocationService.cs 10.8 KB
using Hh.Mes.Common.Infrastructure;
using Hh.Mes.Common.log;
using Hh.Mes.Common.Request;
using Hh.Mes.Pojo.System;
using Hh.Mes.POJO.Entity;
using Hh.Mes.POJO.EnumEntitys;
using Hh.Mes.Service.Repository;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using Hh.Mes.POJO.Response;

namespace Hh.Mes.Service.Distribution
{
    public class BaseLocationService : RepositorySqlSugar<base_location>
    {

        /// <summary>
        /// 分配选择查询
        /// </summary>
        /// <param name="pageReq"></param>
        /// <param name="entity"></param>
        /// <returns></returns>
        public dynamic LoadData(PageReq pageReq, base_location entity)
        {
            return ExceptionsHelp.Instance.ExecuteT(() =>
            {
                var result = new Response();
                var expression = LinqWhere(entity);
                //先组合查询表达式
                var query = Context.Queryable<base_location>().Where(expression);
                //Exel为ture就不分页,因为导出的话是全部导出
                if (pageReq != null)
                {
                    int total = 0;
                    result.Result = query.ToOffsetPage(pageReq.page, pageReq.limit, ref total);
                    result.Count = total;
                }
                else
                {
                    result.Result = query.ToList();
                    result.Count = result.Result.Count;
                }
                return result;
            }, catchRetrunValue: "list");
        }


        /// <summary>
        /// 页面查询
        /// </summary>
        /// <param name="pageReq"></param>
        /// <param name="model"></param>
        /// <returns></returns>
        public dynamic Load(PageReq pageReq, base_location model)
        {
            return ExceptionsHelp.Instance.ExecuteT(() =>
            {
                var result = new Response();
                string orderBy = (pageReq == null || string.IsNullOrEmpty(pageReq.field)) ? " zoneCode asc " : $"{pageReq.field} {pageReq.order} ";
                string sqlWhere = SqlWhere(model);
                var stringBuilder = new StringBuilder();
                //页码,页数
                //Exel ture 不分页
                if (!model.Exel && pageReq != null)
                {
                    stringBuilder.Append("declare @pageIndex int,@pageSize int,@offset int");
                    stringBuilder.AppendLine($"  select @pageIndex={pageReq.page}, @pageSize={pageReq.limit}, @offset=(@pageIndex - 1) * @pageSize");
                }

                stringBuilder.AppendLine($@"  select t1.*,
                                                peopleStation=stuff((select ','+t4.locationName 
                                                    from  base_location_rel t3
                                                    left join base_location t4 on t4.locationCode=t3.startPositionCode
                                                    where t1.locationCode=t3.endPositionCode  for xml path('')),1,1,'')  
                                                from  base_location t1  
                                         where {sqlWhere}
                                         order by {orderBy} ");

                //Exel ture 不分页
                if (!model.Exel)
                {
                    stringBuilder.AppendLine("  offset @offset row fetch next @pageSize row only ");
                    stringBuilder.Append($" select rowTotal= count(*) from base_location  t1  with(nolock) where {sqlWhere}");
                }
                var ds = base.Context.Ado.GetDataSetAll(stringBuilder.ToString(), new List<SugarParameter>(){
                    new SugarParameter("@locationCode", $"%{model.locationCode}%"),
                    new SugarParameter("@locationName", $"%{model.locationName}%"),
                    new SugarParameter("@stationCode", $"%{model.stationCode}%"),
                    new SugarParameter("@zoneCode",model.zoneCode)
                });
                result.Result = ds.Tables[0];
                result.Count = model.Exel ? (int)result.Result.Rows.Count : (int)ds.Tables[1].Rows[0]["rowTotal"];
                return result;
            });
        }

        public string SqlWhere(base_location model)
        {
            var stringBuilder = new StringBuilder();
            stringBuilder.Append("1=1 ");
            if (!string.IsNullOrEmpty(model.locationCode)) stringBuilder.Append(" and  t1.locationCode like  @locationCode");
            if (!string.IsNullOrEmpty(model.locationName)) stringBuilder.Append(" and  t1.locationName like @locationName ");
            if (!string.IsNullOrEmpty(model.stationCode)) stringBuilder.Append(" and  t1.stationCode like @stationCode ");
            if (model.zoneCode != 0) stringBuilder.Append(" and t1.zoneCode = @zoneCode");
            return stringBuilder.ToString();
        }



        public dynamic Ins(base_location entity)
        {
            return ExceptionsHelp.Instance.ExecuteT(() =>
            {
                var response = new Response();
                Context.Insertable(entity).ExecuteCommand();
                return response;
            });
        }

        public dynamic Upd(base_location entity)
        {
            return ExceptionsHelp.Instance.ExecuteT(() =>
            {
                var response = new Response();

                //Context.Updateable(entity).ExecuteCommand();

                //是否存在容器编码
                if (!string.IsNullOrEmpty(entity.containerCode))
                {

                    response.Status = base.Context.Queryable<base_container>()
                                                     .Where(x => x.containerCode == entity.containerCode)
                                                     .ToList().Count() > 0;

                    if (!response.Status) return response.ResponseError("容器编码不存在!");
                }

                Context.Updateable<base_location>()
                        .SetColumns(t => t.locationCode == entity.locationCode)
                        .SetColumns(t => t.locationName == entity.locationName)
                        .SetColumns(t => t.containerCode == entity.containerCode)
                        .Where(t => t.id == entity.id).ExecuteCommand();

                return response;
            });
        }

        public dynamic DelByIds(int[] ids)
        {
            return ExceptionsHelp.Instance.ExecuteT(() =>
            {
                var response = new Response();
                Context.Deleteable<base_location>(t => ids.Contains(t.id)).ExecuteCommand();
                return response;
            });
        }

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

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

                if (!string.IsNullOrWhiteSpace(model.locationName))
                {
                    exp.And(x => x.locationName.Contains(model.locationName));
                }
                if (!string.IsNullOrWhiteSpace(model.stationCode))
                {
                    exp.And(x => x.stationCode.Contains(model.stationCode));
                }

                //排除自己
                if (!string.IsNullOrWhiteSpace(model.locationCode))
                {
                    exp.And(x => x.locationCode != model.locationCode);
                }

                //排除上料点选择
                exp.And(x => x.zoneCode != (int)EnumLocationZoneCode.上料点);

                return exp.ToExpression();//拼接表达式
            }
            catch (Exception ex)
            {
                throw new Exception($"{ex.Message}");
            }
        }


        /// <summary>
        ///  读取对应的料点
        /// </summary>
        /// <returns></returns>
        public dynamic GetLocationChoiceByLocationCode(string locationCode)
        {
            var response = new Response();
            return ExceptionsHelp.Instance.ExecuteT(() =>
            {
                response.Result = Context.Queryable<base_location_rel>().Where(x => x.endPositionCode == locationCode).ToList();

                return response;
            });
        }

        /// <summary>
        /// 料点配置
        /// </summary>
        /// <returns></returns>
        public dynamic OperateLocationStation(string stationCode, string endPositionCode, bool checkeds)
        {
            var response = new Response();
            return ExceptionsHelp.Instance.ExecuteT(() =>
            {
                string[] strArray = stationCode.Split(new char[] { ',' });

                if (checkeds)
                {
                    foreach (var item in strArray)
                    {
                        //装料点
                        var stationModel = Context.Queryable<base_location>().Where(x => x.locationCode == item).First();

                        //上料点
                        var endModel = Context.Queryable<base_location>().Where(x => x.locationCode == endPositionCode).First();

                        var model = new base_location_rel
                        {
                            keys = Guid.NewGuid(),
                            endPositionCode = endPositionCode,
                            startPositionCode = item,
                            createTime = DateTime.Now,
                            startStationCode = stationModel.stationCode,
                            endStationCode = endModel.stationCode,
                            startZoneCode = stationModel.zoneCode,
                            endZoneCode = endModel.zoneCode
                        };
                        Context.Insertable(model).AddQueue();
                    }
                    response.Status = Context.SaveQueues() > 0;
                    if (!response.Status)
                    {
                        response.Message = SystemVariable.dataActionError;
                    }

                }
                else
                {
                    foreach (var item in strArray)
                    {
                        Context.Deleteable<base_location_rel>().Where(x => x.endPositionCode == endPositionCode && x.startPositionCode == item).AddQueue();
                    }
                    response.Status = Context.SaveQueues() > 0;
                    if (!response.Status)
                    {
                        response.Message = SystemVariable.dataActionError;
                    }
                }

                return response;
            });
        }
    }
}