public string CheckExeclValid(ExcelWorksheet worksheet, int iRow, int FlowChart_Master_UID, FlowChartExcelImportParas paraItem, out string Part_Types)
        {
            Part_Types = string.Empty;
            string errorInfo = string.Empty;

            if (worksheet == null)
            {
                errorInfo = "没有worksheet内容";

                return(errorInfo);
            }
            //头样式设置
            var propertiesHead = FlowchartImportCommon.GetHeadColumn();

            bool allColumnsAreEmpty = true;

            for (var i = 1; i <= propertiesHead.Length; i++)
            {
                if (worksheet.Cells[iRow, i].Value != null && !String.IsNullOrEmpty(worksheet.Cells[iRow, i].Value.ToString()))
                {
                    allColumnsAreEmpty = false;
                    break;
                }
            }
            if (allColumnsAreEmpty)
            {
                errorInfo = "Excel格式不正确";
                return(errorInfo);
            }

            string BU_D_Name    = ExcelHelper.ConvertColumnToString(worksheet.Cells[iRow, ExcelHelper.GetColumnIndex(propertiesHead, "客户")].Value);
            string Project_Name = ExcelHelper.ConvertColumnToString(worksheet.Cells[iRow, ExcelHelper.GetColumnIndex(propertiesHead, "专案名称")].Value);

            Part_Types = ExcelHelper.ConvertColumnToString(worksheet.Cells[iRow, ExcelHelper.GetColumnIndex(propertiesHead, "部件")].Value);
            string Product_Phase = ExcelHelper.ConvertColumnToString(worksheet.Cells[iRow, ExcelHelper.GetColumnIndex(propertiesHead, "阶段")].Value);

            if (string.IsNullOrWhiteSpace(BU_D_Name) || string.IsNullOrWhiteSpace(Project_Name) || string.IsNullOrWhiteSpace(Part_Types) || string.IsNullOrWhiteSpace(Product_Phase))
            {
                errorInfo = "客户,专案名称,部件,阶段不能为空Excel格式不正确";
                return(errorInfo);
            }

            paraItem.BU_D_Name            = BU_D_Name.Trim();
            paraItem.Project_Name         = Project_Name.Trim();
            paraItem.Part_Types           = Part_Types.Trim();
            paraItem.Product_Phase        = Product_Phase.Trim();
            paraItem.FlowChart_Master_UID = FlowChart_Master_UID;
            return(errorInfo);
        }
        public string SetAndCheckExcelContent(List <FlowChartImportDetailDTO> detailDTOList, bool isEdit, ExcelWorksheet worksheet, int iRow, int totalRows, FlowChartMasterDTO newMaster, string FlowChart_Version_Comment, CustomUserInfoVM userInfo)
        {
            string errorInfo = string.Empty;
            //内容样式设置
            var propertiesContent = FlowchartImportCommon.GetEtransferContentColumn();

            //获取所有厂别
            //不考虑跨厂区权限,他们不会操作只会浏览,默认取第一个,通过三级权限获取四级
            var plantAPI = "FlowChart/QueryAllFunctionPlantsAPI?optypeUID=" + userInfo.OrgInfo.First().OPType_OrganizationUID;
            //HttpResponseMessage message = APIHelper.APIPostAsync(null,plantAPI);
            HttpResponseMessage message = APIHelper.APIGetAsync(plantAPI);
            var jsonPlants     = message.Content.ReadAsStringAsync().Result;
            var functionPlants = JsonConvert.DeserializeObject <List <SystemFunctionPlantDTO> >(jsonPlants);

            //从第四行开始读取
            iRow = iRow + 2;
            //绑定序号        //制程序号没用    //厂别               //阶层
            int Binding_Seq, Process_Seq = 1, System_FunPlant_UID, Product_Stage;

            //DRI       //场地 //工站名稱  //厂别   //颜色  //工站說明     //返工设定      //检测设定      //制程序号
            string DRI, Place, Process, plantName, Color, Process_Desc, Rework_Setting, Check_Setting, ItemNo, Edition, FromWHS, ToWHSOK, ToWHSNG;

            //返修站点数量,每个FlowChart只能允许1个站点是返工站点,颜色可以不同
            List <int> CheckRepair = new List <int>();
            //这是真正的excel行数,totalRows的行数是错误的
            int    realTotalRows = 0;
            string lastItemNo = string.Empty, lastFromWHS = string.Empty, lastToWHSOK = string.Empty, lastToWHSNG = string.Empty;
            bool   firstRow = true;

            for (var i = iRow; i <= totalRows; i++)
            {
                //绑定序号
                Binding_Seq = Convert.ToInt32(worksheet.Cells[i, ExcelHelper.GetColumnIndex(propertiesContent, "绑定序号")].Value);
                //制程序号
                ItemNo = ExcelHelper.ConvertColumnToString(worksheet.Cells[i, ExcelHelper.GetColumnIndex(propertiesContent, "制程序号")].Value);


                FromWHS = ExcelHelper.ConvertColumnToString(worksheet.Cells[i, ExcelHelper.GetColumnIndex(propertiesContent, "FromWHS")].Value);
                ToWHSOK = ExcelHelper.ConvertColumnToString(worksheet.Cells[i, ExcelHelper.GetColumnIndex(propertiesContent, "ToWHSOK")].Value);
                ToWHSNG = ExcelHelper.ConvertColumnToString(worksheet.Cells[i, ExcelHelper.GetColumnIndex(propertiesContent, "ToWHSNG")].Value);


                if (firstRow)//如果是第一行开始循环则赋值
                {
                    lastItemNo  = ItemNo;
                    lastFromWHS = FromWHS;
                    lastToWHSNG = ToWHSNG;
                    lastToWHSOK = ToWHSOK;
                }
                else //如果不是第一行则开始判断
                {
                    if (lastItemNo == ItemNo)//如果上一个制程等于这一个制程的序号,则说明是同一制程
                    {
                        if (lastFromWHS != FromWHS || lastToWHSNG != ToWHSNG || lastToWHSOK != ToWHSOK)
                        {
                            //跳出循环
                            errorInfo = string.Format("第[{0}]行FromWHS,ToWHSOK,ToWHSNG不跟上一制程一致", i);
                            return(errorInfo);
                        }
                    }
                    else
                    {
                        lastItemNo  = ItemNo;
                        lastFromWHS = FromWHS;
                        lastToWHSNG = ToWHSNG;
                        lastToWHSOK = ToWHSOK;
                    }
                }
                firstRow = false;



                DRI = ExcelHelper.ConvertColumnToString(worksheet.Cells[i, ExcelHelper.GetColumnIndex(propertiesContent, "DRI")].Value);
                if (string.IsNullOrWhiteSpace(DRI))
                {
                    //跳出循环
                    errorInfo = string.Format("第[{0}]行DRI不能为空", i);
                    return(errorInfo);
                }
                Place = ExcelHelper.ConvertColumnToString(worksheet.Cells[i, ExcelHelper.GetColumnIndex(propertiesContent, "场地")].Value);
                if (string.IsNullOrWhiteSpace(Place))
                {
                    //跳出循环
                    errorInfo = string.Format("第[{0}]行场地不能为空", i);
                    return(errorInfo);
                }
                Process = ExcelHelper.ConvertColumnToString(worksheet.Cells[i, ExcelHelper.GetColumnIndex(propertiesContent, "工站名稱")].Value);
                if (string.IsNullOrWhiteSpace(Process))
                {
                    //跳出循环
                    errorInfo = string.Format("第[{0}]行工站名稱不能为空", i);
                    return(errorInfo);
                }
                plantName = ExcelHelper.ConvertColumnToString(worksheet.Cells[i, ExcelHelper.GetColumnIndex(propertiesContent, "厂别")].Value) ?? string.Empty;
                if (string.IsNullOrWhiteSpace(plantName))
                {
                    //跳出循环
                    errorInfo = string.Format("第[{0}]行厂别不能为空", i);
                    return(errorInfo);
                }

                var hasItem = functionPlants.FirstOrDefault(m => m.FunPlant.ToLower() == plantName.ToLower().Trim());
                if (hasItem != null)
                {
                    System_FunPlant_UID = hasItem.System_FunPlant_UID;
                }
                else
                {
                    //跳出循环
                    errorInfo = string.Format("厂别[{0}]输入不正确", plantName);
                    return(errorInfo);
                }


                Product_Stage = Convert.ToInt32(worksheet.Cells[i, ExcelHelper.GetColumnIndex(propertiesContent, "阶层")].Value);
                Color         = ExcelHelper.ConvertColumnToString(worksheet.Cells[i, ExcelHelper.GetColumnIndex(propertiesContent, "颜色")].Value) ?? string.Empty;
                Edition       = ExcelHelper.ConvertColumnToString(worksheet.Cells[i, ExcelHelper.GetColumnIndex(propertiesContent, "Edition")].Value);
                Process_Desc  = ExcelHelper.ConvertColumnToString(worksheet.Cells[i, ExcelHelper.GetColumnIndex(propertiesContent, "工站說明")].Value);

                Rework_Setting = ExcelHelper.ConvertColumnToString(worksheet.Cells[i, ExcelHelper.GetColumnIndex(propertiesContent, "返工设定")].Value);
                if (Rework_Setting == "Repair")
                {
                    CheckRepair.Add(Process_Seq);
                }
                if (CheckRepair.Distinct().ToList().Count > 1)
                {
                    //跳出循环
                    errorInfo = string.Format("第[{0}]行出现重复的修复站点!", i);
                    return(errorInfo);
                }

                //检测站点赋值
                var CheckTemp = ExcelHelper.ConvertColumnToString(worksheet.Cells[i, ExcelHelper.GetColumnIndex(propertiesContent, "检测设定")].Value);
                if (!string.IsNullOrWhiteSpace(CheckTemp))
                {
                    CheckTemp = CheckTemp.Trim();
                }

                switch (CheckTemp)
                {
                case StructConstants.IsQAProcessType.InspectText:     //IPQC全检
                    Check_Setting = StructConstants.IsQAProcessType.InspectKey;
                    break;

                case StructConstants.IsQAProcessType.PollingText:     //IPQC巡检
                    Check_Setting = StructConstants.IsQAProcessType.PollingKey;
                    break;

                case StructConstants.IsQAProcessType.InspectOQCText:     //OQC检测
                    Check_Setting = StructConstants.IsQAProcessType.InspectOQCKey;
                    break;

                case StructConstants.IsQAProcessType.InspectAssembleText:     //组装检测
                    Check_Setting = StructConstants.IsQAProcessType.InspectAssembleKey;
                    break;

                case StructConstants.IsQAProcessType.AssembleOQCText:     //组装&OQC检测
                    Check_Setting = StructConstants.IsQAProcessType.AssembleOQCKey;
                    break;

                default:
                    Check_Setting = string.Empty;
                    break;
                }


                FlowChartImportDetailDTO detailDTOItem = new FlowChartImportDetailDTO();

                FlowChartDetailDTO newDetailDtoItem = new FlowChartDetailDTO();
                newDetailDtoItem.FlowChart_Master_UID = newMaster.FlowChart_Master_UID;
                newDetailDtoItem.System_FunPlant_UID  = System_FunPlant_UID;
                newDetailDtoItem.Binding_Seq          = Binding_Seq;
                var seq = Process_Seq++;
                newDetailDtoItem.Process_Seq               = seq.ToString();
                newDetailDtoItem.DRI                       = DRI;
                newDetailDtoItem.Place                     = Place;
                newDetailDtoItem.Process                   = Process;
                newDetailDtoItem.Product_Stage             = Product_Stage;
                newDetailDtoItem.Color                     = Color;
                newDetailDtoItem.Edition                   = Edition;
                newDetailDtoItem.Process_Desc              = Process_Desc;
                newDetailDtoItem.FlowChart_Version_Comment = FlowChart_Version_Comment;
                newDetailDtoItem.Rework_Flag               = Rework_Setting;
                //新增QA字段
                newDetailDtoItem.IsQAProcess   = Check_Setting;
                newDetailDtoItem.Modified_UID  = newMaster.Modified_UID;
                newDetailDtoItem.Modified_Date = newMaster.Modified_Date;
                newDetailDtoItem.BeginTime     = DateTime.Now;
                newDetailDtoItem.ItemNo        = ItemNo;
                newDetailDtoItem.FromWHS       = FromWHS;
                newDetailDtoItem.ToWHSNG       = ToWHSNG;
                newDetailDtoItem.ToWHSOK       = ToWHSOK;
                if (isEdit)
                {
                    //存到临时表里面的数据所以要加1
                    newDetailDtoItem.FlowChart_Version = newMaster.FlowChart_Version + 1;
                }
                else
                {
                    //存到正式表里面的数据不用加1
                    newDetailDtoItem.FlowChart_Version = newMaster.FlowChart_Version;
                }

                detailDTOItem.FlowChartDetailDTO = newDetailDtoItem;
                //detailDTOItem.FlowChartMgDataDTO = newMgDataDtoItem;
                detailDTOList.Add(detailDTOItem);

                //行数加1
                realTotalRows++;
            }

            var bindingSeqCount = detailDTOList.GroupBy(m => m.FlowChartDetailDTO.Binding_Seq).Select(m => m.Key).Count();
            //var processSeqCount = detailDTOList.GroupBy(m => m.FlowChartDetailDTO.Process_Seq).Select(m => m.Key).Count();
            var rowCount = realTotalRows;

            if (bindingSeqCount != rowCount)
            {
                errorInfo = "绑定序号有重复项,请修改";
                return(errorInfo);
            }
            //if (processSeqCount != rowCount)
            //{
            //    errorInfo = "制程序号有重复项,请修改";
            //    return errorInfo;
            //}

            return(errorInfo);
        }
        public override ActionResult DoHistoryExcelExport(int id, int version)
        {
            var apiUrl        = string.Format("FlowChart/DoHistoryExcelExportWUXI_MAPI?id={0}&version={1}", id, version);
            var responMessage = APIHelper.APIGetAsync(apiUrl);
            var result        = responMessage.Content.ReadAsStringAsync().Result;
            var item          = JsonConvert.DeserializeObject <FlowChartExcelExport>(result);



            var stream            = new MemoryStream();
            var fileName          = PathHelper.SetGridExportExcelName("FlowChart");
            var filePath          = Path.Combine(PathHelper.GetGridExportExcelDirectory, fileName);
            var propertiesHead    = FlowchartImportCommon.GetHeadColumn();
            var propertiesContent = FlowchartImportCommon.GetEtransferContentColumn();

            using (var excelPackage = new ExcelPackage(stream))
            {
                //set sheet name
                var worksheet = excelPackage.Workbook.Worksheets.Add("FlowChart");

                //填充Title内容
                for (int colIndex = 0; colIndex < propertiesHead.Length; colIndex++)
                {
                    worksheet.Cells[1, colIndex + 1].Value = propertiesHead[colIndex];

                    switch (colIndex)
                    {
                    case 0:
                        worksheet.Cells[2, colIndex + 1].Value = item.BU_D_Name;
                        break;

                    case 1:
                        worksheet.Cells[2, colIndex + 1].Value = item.Project_Name;
                        break;

                    case 2:
                        worksheet.Cells[2, colIndex + 1].Value = item.Part_Types;
                        break;

                    case 3:
                        worksheet.Cells[2, colIndex + 1].Value = item.Product_Phase;
                        break;
                    }
                }

                //填充Content内容
                for (int colIndex = 0; colIndex < propertiesContent.Length; colIndex++)
                {
                    worksheet.Cells[3, colIndex + 1].Value = propertiesContent[colIndex];
                }

                for (int index = 0; index < item.FlowChartDetailAndMGDataDTOList.Count(); index++)
                {
                    var currentRecord = item.FlowChartDetailAndMGDataDTOList[index];
                    //绑定序号
                    worksheet.Cells[index + 4, 1].Value = currentRecord.Binding_Seq;
                    //制程序号
                    worksheet.Cells[index + 4, 2].Value = currentRecord.ItemNo;
                    //DRI
                    worksheet.Cells[index + 4, 3].Value = currentRecord.DRI;
                    //场地
                    worksheet.Cells[index + 4, 4].Value = currentRecord.Place;
                    //Process
                    worksheet.Cells[index + 4, 5].Value = currentRecord.Process;
                    //厂别
                    worksheet.Cells[index + 4, 6].Value = currentRecord.PlantName;
                    //阶层
                    worksheet.Cells[index + 4, 7].Value = currentRecord.Product_Stage;
                    //颜色
                    worksheet.Cells[index + 4, 8].Value = currentRecord.Color;
                    //Edition
                    worksheet.Cells[index + 4, 9].Value = currentRecord.Edition;
                    //工站说明
                    worksheet.Cells[index + 4, 10].Value = currentRecord.Process_Desc;
                    //返工设定
                    worksheet.Cells[index + 4, 11].Value = currentRecord.Rework_Flag;
                    //检测设定
                    worksheet.Cells[index + 4, 12].Value = currentRecord.IsQAProcessName;
                    //FromWHS
                    worksheet.Cells[index + 4, 13].Value = currentRecord.FromWHS;
                    //ToWHSOK
                    worksheet.Cells[index + 4, 14].Value = currentRecord.ToWHSOK;
                    //ToWHSNG
                    worksheet.Cells[index + 4, 15].Value = currentRecord.ToWHSNG;

                    //目标良率
                    //worksheet.Cells[index + 4, 9].Value = currentRecord.Target_Yield;
                    //worksheet.Cells[index + 4, 9].Style.Numberformat.Format = "0.00%";
                    //计划目标
                    //worksheet.Cells[index + 4, 10].Value = currentRecord.Product_Plan;
                }

                excelPackage.Save();
            }
            return(new FileContentResult(stream.ToArray(), "application/octet-stream")
            {
                FileDownloadName = fileName
            });
        }
        public string CheckFlowchartIsMatch(FlowChartExcelImportParas paraItem, FlowChartMasterDTO newMaster, bool isEdit, string FlowChart_Version_Comment, string Part_Types, CustomUserInfoVM userInfo, out string projectUIDOrFLMasterUID)
        {
            string errorInfo = string.Empty;
            var    orgList   = userInfo.OrgInfo.Select(m => m.OPType_OrganizationUID.Value).ToList();

            paraItem.Organization_UIDList = orgList;
            if (isEdit)
            {
                paraItem.isEdit = true;
            }
            else
            {
                paraItem.isEdit = false;
            }
            var apiUrl = string.Format("FlowChart/CheckFlowChartAPI");
            HttpResponseMessage responMessage = APIHelper.APIPostAsync(paraItem, apiUrl);

            projectUIDOrFLMasterUID = responMessage.Content.ReadAsStringAsync().Result;
            projectUIDOrFLMasterUID = projectUIDOrFLMasterUID.Replace("\"", "");
            //正确返回id字符串,错误则返回出错字符串
            if (!FlowchartImportCommon.ValidIsInt(projectUIDOrFLMasterUID, isEdit))
            {
                errorInfo = projectUIDOrFLMasterUID;
                return(errorInfo);
            }

            if (isEdit)
            {
                var idList = projectUIDOrFLMasterUID.Split('_').ToList();
                newMaster.FlowChart_Master_UID = Convert.ToInt32(idList[0]);
                newMaster.Project_UID          = Convert.ToInt32(idList[1]);
                newMaster.FlowChart_Version    = Convert.ToInt32(idList[2]);
                newMaster.Organization_UID     = Convert.ToInt32(idList[3]);
                newMaster.Modified_UID         = userInfo.Account_UID;
                newMaster.Modified_Date        = DateTime.Now;


                //检查当前时间段是否包含有ProductInput的制程信息
                string productapiUrl = string.Format("ProductInput/CheckHasExistProcessAPI?MasterUID={0}&Version={1}", newMaster.FlowChart_Master_UID, newMaster.FlowChart_Version);
                HttpResponseMessage productResponMessage = APIHelper.APIGetAsync(productapiUrl);
                var hasProcess = productResponMessage.Content.ReadAsStringAsync().Result;
                if (hasProcess == "true")
                {
                    errorInfo = "当前Flowchart的相关制程还未完全录入,不能导入新版本";
                    return(errorInfo);
                }
            }
            else
            {
                int tag = projectUIDOrFLMasterUID.IndexOf('_');
                newMaster.Project_UID       = Convert.ToInt32(projectUIDOrFLMasterUID.Substring(0, tag));
                newMaster.Organization_UID  = Convert.ToInt32(projectUIDOrFLMasterUID.Substring(tag + 1));
                newMaster.FlowChart_Version = 1;
                newMaster.Created_UID       = userInfo.Account_UID;
            }
            newMaster.Part_Types = Part_Types.Trim();
            newMaster.FlowChart_Version_Comment = FlowChart_Version_Comment;
            newMaster.Is_Latest     = true;
            newMaster.Is_Closed     = false;
            newMaster.Modified_UID  = userInfo.Account_UID;
            newMaster.Modified_Date = DateTime.Now;

            return(errorInfo);
        }