BaseProductionorderEP3DService.cs 13.5 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 NPOI.POIFS.FileSystem;
using Hh.Mes.POJO.EnumEntitys;
using Microsoft.AspNetCore.Http;
using System.IO;
using Hh.Mes.Common.Exel;
using Hh.Mes.Common.DataTableTo;
using static Hh.Mes.Common.Exel.NpoiExcelImportHelper;

namespace Hh.Mes.Service.Base
{
    public class BaseProductionorderEP3DService : RepositorySqlSugar<base_productionOrder_EP3D>
    {
        public dynamic Load(PageReq pageReq, base_productionOrder_EP3D entity, string flag = null, string projectKeys = "")
        {
            return ExceptionsHelp.Instance.ExecuteT(() =>
            {
                var result = new Response();
                var expression = LinqWhere(entity);
                //先组合查询表达式(多表查询查看IOT 设备列表案例)
                var query = Context.Queryable<base_productionOrder_EP3D>().Where(expression);
                //Exel false 分页
                if (!entity.Exel)
                {
                    int total = 0;
                    var list = query.ToOffsetPage(pageReq.page, pageReq.limit, ref total);
                    result.Result = HandleProductionOrder(list, flag, projectKeys);
                    result.Count = total;
                }
                else
                {
                    result.Result = HandleProductionOrder(query.ToList(), flag, projectKeys);
                    result.Count = result.Result.Count();
                }
                return result;
            }, catchRetrunValue: "list");
        }

        public List<base_productionOrder_EP3D> HandleProductionOrder(List<base_productionOrder_EP3D> list, string flag, string projectKey)
        {
            return ExceptionsHelp.Instance.ExecuteT(() =>
            {
                if (list != null && flag == "fromProject" && !string.IsNullOrEmpty(projectKey))
                {
                    Guid projectKeys = Guid.Parse(projectKey);
                    List<base_productionOrder_EP3D> all = (List<base_productionOrder_EP3D>)Context.Queryable<base_productionOrder_EP3D, base_project_production_order>((x, y) =>
                                   new JoinQueryInfos(JoinType.Left, x.keys == y.productionOrderKey))
                               .Where((x, y) => x.state == (int)EnumEP3DState.未使用 || (x.state == (int)EnumEP3DState.已关联 && y.projectKeys == projectKeys)).ToList();
                    list = all;
                }
                return list;
            });
        }

        public dynamic Ins(base_productionOrder_EP3D 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(base_productionOrder_EP3D 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<base_productionOrder_EP3D>(t => ids.Contains(t.id)).ExecuteCommand();
                return response;
            });
        }

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

        public Expression<Func<base_productionOrder_EP3D, bool>> LinqWhere(base_productionOrder_EP3D model)
        {
            try
            {
                var exp = Expressionable.Create<base_productionOrder_EP3D>();
                //数据过滤条件
                //if (!string.IsNullOrWhiteSpace(model.XXX)) exp.And(x => x.XXX.Contains(model.XXX));
                if (!string.IsNullOrWhiteSpace(model.pipelineNo))
                {
                    exp.And(x => x.pipelineNo.Contains(model.pipelineNo));
                }
                if (!string.IsNullOrWhiteSpace(model.pipeSectionNo))
                {
                    exp.And(x => x.pipeSectionNo.Contains(model.pipeSectionNo));
                }
                if (!string.IsNullOrWhiteSpace(model.batchNo))
                {
                    exp.And(x => x.batchNo.Contains(model.batchNo));
                }
                return exp.ToExpression();//拼接表达式
            }
            catch (Exception ex)
            {
                throw new Exception($"{ex.Message}");
            }
        }

        #region  绑定项目-生产工单
        public dynamic BindProjectProductionOrder(Guid projectKeys, string productionOrderKeys, bool checkeds)
        {
            return ExceptionsHelp.Instance.ExecuteT(() =>
            {
                var response = new Response();
                string[] strArray = productionOrderKeys.Split(',');//多选生产工单
                if (strArray != null && strArray.Length > 0)
                {
                    Guid[] orderArray = strArray.Select(x => Guid.Parse(x)).ToArray();//所选工单
                    var poList = Context.Queryable<base_project_production_order, base_project>((x, y) => x.projectKeys.Equals(y.keys))
                                             .Where((x, y) => x.projectKeys.Equals(projectKeys) && orderArray.Contains(x.productionOrderKey))
                                             .Select((x, y) => new
                                             {
                                                 x.productionOrderKey,
                                                 x.projectKeys,
                                                 y.state,
                                                 y.projectName
                                             })
                                             .ToList();//是否存在

                    var epList = Context.Queryable<base_productionOrder_EP3D>()
                                                          .Where(x => orderArray.Contains(x.keys))
                                                          .ToList();//EP3D表数据
                    //查询生产工单是否被其它项目绑定
                    var isHaveList = Context.Queryable<base_project_production_order>()
                                         .Where(x => !x.projectKeys.Equals(projectKeys) && orderArray.Contains(x.productionOrderKey))
                                         .ToList();

                    foreach (Guid productionOrderKey in orderArray)
                    {
                        var ep = epList.FirstOrDefault(x => x.keys.Equals(productionOrderKey));
                        var isHave = isHaveList.Where(x => x.productionOrderKey.Equals(productionOrderKey));
                        var productionOrder = poList.Where(x => x.productionOrderKey.Equals(productionOrderKey));
                        var project = Context.Queryable<base_project>().Where(x => x.keys.Equals(projectKeys)).First();
                        if (project.state == (int)EnumProjectState.生产中)
                        {
                            return response.ResponseError($"项目【{project.projectName}】生产中,不允许修改绑定!!!");
                        }
                        if (checkeds)
                        {
                            if (isHave.Any())
                            {
                                return response.ResponseError($"生产工单【{isHave.First().productionOrderKey}】已经被项目【{isHave.First().projectKeys}】绑定,请选择其它工单!!!");
                            }
                            if ((!productionOrder.Any()) && ep != null)
                            {
                                //项目生产工单表新增数据
                                base_project_production_order po = new base_project_production_order();
                                po.keys = Guid.NewGuid();
                                po.projectKeys = projectKeys;
                                po.productionOrderKey = productionOrderKey;
                                po.createTime = DateTime.Now;
                                Context.Insertable(po).AddQueue();
                                //EP3D生产工单表修改状态 已关联
                                ep.state = (int)EnumEP3DState.已关联;
                                Context.Updateable(ep).AddQueue();
                            }
                        }
                        else
                        {
                            //未选中代表取消绑定,则删除关联表数据
                            if (productionOrder.Any())
                            {
                                //项目初始化状态才可解除与工单的绑定
                                if (productionOrder.First().state != (int)EnumProjectState.未开始)
                                {
                                    return response.ResponseError($"项目【{project.projectName}】不是初始化状态,不允许解除绑定!!!");
                                }

                                var po = Context.Queryable<base_project_production_order>().First(x => x.productionOrderKey == productionOrderKey);
                                Context.Deleteable(po).AddQueue();

                                //EP3D生产工单表修改状态 未使用
                                ep.state = (int)EnumEP3DState.未使用;
                                Context.Updateable(ep).AddQueue();
                            }
                        }
                    }
                }
                response.Status = Context.SaveQueuesAsync().Result > 0;
                if (!response.Status) response.Message = SystemVariable.dataActionError;
                return response;
            });
        }
        #endregion


        #region  获取项目被绑定的生产工单
        /// <summary>
        /// 获取项目被绑定的生产工单
        /// </summary>
        /// <param name="projectKeys"></param>
        /// <returns></returns>
        public dynamic GetProjectBindProductionOrder(Guid projectKeys)
        {
            return ExceptionsHelp.Instance.ExecuteT(() =>
            {
                var response = new Response();
                response.Result = Context.Queryable<base_project_production_order>()
                                         .Where(x => x.projectKeys.Equals(projectKeys))
                                         .Select(x => x.productionOrderKey)
                                         .ToList();
                if (!response.Status) response.Message = SystemVariable.dataActionError;
                return response;
            });
        }
        #endregion


        #region  工单导入(使用特性配置的方法//可增加读取配置文件的方法)
        /// <summary>
        /// 工单导入(导入表格列名与模型属性的对应关系使用ExcelCloumn特性配置)
        /// </summary>
        /// <param name="file"></param>
        /// <returns></returns>
        public dynamic ImportProject(IFormFile file)
        {
            var response = new Response();
            try
            {
                if (file == null || file.Length == 0)
                    return response.ResponseError("未上传文件");

                using var stream = file.OpenReadStream();
                string fileSuffix = Path.GetExtension(file.FileName).ToString();

                //改为采用本地方法
                var dic = NpoiExcelImportHelper._.ExcelToDataTable(file.OpenReadStream(), fileSuffix, out var result, out var resultMsg);
                if (dic == null) return response.ResponseError("导入失败!");
                var dt = dic.ElementAt(0).Value.dtData;         //注意 仅取表格第一个sheet对应的表格
                List<base_productionOrder_EP3D> lst_PO_EP3D = new List<base_productionOrder_EP3D>();
                lst_PO_EP3D = DataTableHelp.ToList<base_productionOrder_EP3D>(dt);

                #region  待增加必要的表格关键字段的校验

                #endregion

                #region List<Model>中补充数据(补充数据来源字段的值)
                foreach (var item in lst_PO_EP3D)
                {
                    item.dataSources = "本地导入";
                    item.keys = Guid.NewGuid();
                    item.state = 0;     //默认导入时状态为“未使用”
                    item.createTime = DateTime.Now;
                    item.updateTime = DateTime.Now;
                }
                #endregion

                response.Status = Add(lst_PO_EP3D);
                if (!response.Status) response.Message = SystemVariable.dataActionError;
                return response.ResponseSuccess();
            }
            catch(Exception ex)
            {
                return response.ResponseError($"处理失败: {ex.Message}");
            }
        }
        #endregion


    }
}