yl
2024-08-26 b28e8fbf2a78cc9ae5047d2fbe1820fe42850151
VueWebCoreApi/Tools/ImportExcelData.cs
@@ -3379,114 +3379,123 @@
            List<ExcelErro> list = new List<ExcelErro>();
            list = ImportExcel.InportExcelToTableListErro(excelTable);    //验证Excel数据必填字段是否为空、唯一字段是否重复
            //模具表
            for (int k = 0; k < excelTable[0].Rows.Count; k++)
            //查询模具信息
            sql = @"select code,name,spec  from TMouldInfo";
            dt = DapperHelper.selecttable(sql);
            if (dt.Rows.Count > 0)
            {
                if (excelTable[0].Rows[k][0].ToString().Trim() != null && excelTable[0].Rows[k][0].ToString().Trim() != "")
                //校验当前上传的模具信息与数据表中的模具信息是否重复
                // 使用LINQ和Lambda表达式来查找在数据库中重复的记录
                var aRows = excelTable[0].AsEnumerable();
                var duplicates = aRows.Where(aRow =>
                    dt.AsEnumerable().Any(bRow =>
                        aRow["*模具编号(唯一)"].Equals(bRow["code"])||
                        aRow["*模具名称"].Equals(bRow["name"])
                    )
                ).ToList();
                if (duplicates.Count > 0)
                {
                    sql = @"select *  from TMouldInfo where code=@code";
                    dynamicParams.Add("@code", excelTable[0].Rows[k][0].ToString().Trim());
                    dt = DapperHelper.selectdata(sql, dynamicParams);
                    if (dt.Rows.Count > 0)
                    // 输出或处理找到的重复记录
                    foreach (DataRow duplicateRow in duplicates)
                    {
                        ExcelErro erro = new ExcelErro();
                        erro.RoeNumber = "/";
                        erro.ErrorField = "{*模具编号(唯一)}";
                        erro.ErrorCont = "模具表:{*模具编号(唯一)}字段" + excelTable[0].Rows[k][0].ToString().Trim() + "已存在";
                        list.Add(erro);
                    }
                }
                if (excelTable[0].Rows[k][1].ToString().Trim() != null && excelTable[0].Rows[k][1].ToString().Trim() != "")
                {
                    sql = @"select *  from TMouldInfo where name=@name";
                    dynamicParams.Add("@name", excelTable[0].Rows[k][1].ToString().Trim());
                    dt = DapperHelper.selectdata(sql, dynamicParams);
                    if (dt.Rows.Count > 0)
                    {
                        ExcelErro erro = new ExcelErro();
                        erro.RoeNumber = "/";
                        erro.ErrorField = "{*模具名称}";
                        erro.ErrorCont = "模具表:{*模具名称}字段" + excelTable[0].Rows[k][1].ToString().Trim() + "已存在";
                        list.Add(erro);
                    }
                }
                //判断仓库编码是否为空
                if (excelTable[0].Rows[k][4].ToString().Trim() != null && excelTable[0].Rows[k][4].ToString().Trim() != "")
                {
                    sql = @"select *  from TSecStck where code=@code";
                    dynamicParams.Add("@code", excelTable[0].Rows[k][4].ToString().Trim());
                    dt = DapperHelper.selectdata(sql, dynamicParams);
                    if (dt.Rows.Count <= 0)
                    {
                        ExcelErro erro = new ExcelErro();
                        erro.RoeNumber = "/";
                        erro.ErrorField = "{*仓库编码}";
                        erro.ErrorCont = "模具表:{*仓库编码}字段" + excelTable[0].Rows[k][4].ToString().Trim() + "不存在";
                        list.Add(erro);
                    }
                }
                //判断库位编码是否为空
                if (excelTable[0].Rows[k][5].ToString().Trim() != null && excelTable[0].Rows[k][5].ToString().Trim() != "")
                {
                    //库位不为空时,判断仓库是否为空
                    if (excelTable[0].Rows[k][4].ToString().Trim() != null && excelTable[0].Rows[k][4].ToString().Trim() != "")
                    {
                        //判断库位是否存在
                        sql = @"select *  from TSecLoca where code=@code";
                        dynamicParams.Add("@code", excelTable[0].Rows[k][5].ToString().Trim());
                        dt = DapperHelper.selectdata(sql, dynamicParams);
                        if (dt.Rows.Count <= 0)
                        {
                            ExcelErro erro = new ExcelErro();
                            erro.RoeNumber = "/";
                            erro.ErrorField = "{*库位编码}";
                            erro.ErrorCont = "模具表:{*库位编码}字段" + excelTable[0].Rows[k][5].ToString().Trim() + "不存在";
                            list.Add(erro);
                        }
                        else
                        {
                            //判断库位是否属于当前仓库
                            if (excelTable[0].Rows[k][4].ToString().Trim() != dt.Rows[0]["idwarehouse"].ToString())
                            {
                                ExcelErro erro = new ExcelErro();
                                erro.RoeNumber = "/";
                                erro.ErrorField = "{*库位编码}";
                                erro.ErrorCont = "模具表:{*库位编码}字段" + excelTable[0].Rows[k][5].ToString().Trim() + "与{*仓库编码}字段:" + excelTable[0].Rows[k][4].ToString().Trim() + "不匹配";
                                list.Add(erro);
                            }
                        }
                    }
                    else
                    {
                        ExcelErro erro = new ExcelErro();
                        erro.RoeNumber = "/";
                        erro.ErrorField = "{*库位编码}";
                        erro.ErrorCont = "模具表:{*库位编码}字段" + excelTable[0].Rows[k][5].ToString().Trim() + "对应的仓库字段不能为空";
                        erro.ErrorField = "{*模具编号(唯一)}/{*模具名称}";
                        erro.ErrorCont = $"*模具编号(唯一): {duplicateRow["*模具编号(唯一)"]},或,*模具名称: {duplicateRow["*模具名称"]}已存在!";
                        list.Add(erro);
                    }
                }
            }
            //模具关联产品表
            for (int j = 0; j < excelTable[1].Rows.Count; j++)
            //查询仓库信息
            sql = @"select code,name  from TSecStck";
            dt = DapperHelper.selecttable(sql);
            if (dt.Rows.Count > 0)
            {
                if (excelTable[1].Rows[j][1].ToString().Trim() != null && excelTable[1].Rows[j][1].ToString().Trim() != "")
                //校验当前上传的模具仓库是否存在
                var aRows = excelTable[0].AsEnumerable();
                var bCodes = dt.AsEnumerable().Select(row => row["code"].ToString()).ToList(); // 提取数据库查询中所有code值
                // 使用LINQ和Lambda表达式来查找提交数据仓库编码中在数据库中不存在的code
                var notInB = aRows.Where(aRow => !bCodes.Contains(aRow["*仓库编码"].ToString())).ToList();
                // 输出或处理找到的记录
                foreach (DataRow row in notInB)
                {
                    sql = @"select *  from TMateriel_Info where partcode=@partcode";
                    dynamicParams.Add("@partcode", excelTable[1].Rows[j][1].ToString().Trim());
                    dt = DapperHelper.selectdata(sql, dynamicParams);
                    if (dt.Rows.Count <= 0)
                    ExcelErro erro = new ExcelErro();
                    erro.RoeNumber = "/";
                    erro.ErrorField = "{*仓库编码}";
                    erro.ErrorCont = $"*仓库编码: {row["*仓库编码"]}不存在!";
                    list.Add(erro);
                }
            }
            //查询库位信息
            sql = @"select code,idwarehouse  from TSecLoca";
            dt = DapperHelper.selecttable(sql);
            if (dt.Rows.Count > 0)
            {
                //校验当前上传的模具库位是否存在
                var aRows = excelTable[0].AsEnumerable();
                var bCodes = dt.AsEnumerable().Select(row => row["code"].ToString()).ToList(); // 提取数据库查询中所有code值
                // 使用LINQ和Lambda表达式来查找提交数据库位编码中在数据库中不存在的code
                var notInB = aRows.Where(aRow => !bCodes.Contains(aRow["*库位编码"].ToString())).ToList();
                // 输出或处理找到的记录
                foreach (DataRow row in notInB)
                {
                    ExcelErro erro = new ExcelErro();
                    erro.RoeNumber = "/";
                    erro.ErrorField = "{*库位编码}";
                    erro.ErrorCont = $"*库位编码: {row["*仓库编码"]}不存在!";
                    list.Add(erro);
                }
                //校验当前上传的模具库位跟仓库是否匹配
                var aItems = aRows.Select(row => new
                {
                    WarehouseCode = row["*仓库编码"].ToString(),
                    LocationCode = row["*库位编码"].ToString(),
                }).ToList();
                var bItems = dt.AsEnumerable().Select(row => new
                {
                    IdWarehouse = row["idwarehouse"].ToString(),
                    Code = row["code"].ToString(),
                }).ToList();
                // 使用LINQ和Lambda表达式来查找A中在B中没有匹配idwarehouse+code的项
                var notMatching = aItems.Where(a => !bItems.Any(b =>
                    a.WarehouseCode == b.IdWarehouse && a.LocationCode == b.Code
                )).ToList();
                // 输出或处理找到的不匹配项
                foreach (var item in notMatching)
                {
                    ExcelErro erro = new ExcelErro();
                    erro.RoeNumber = "/";
                    erro.ErrorField = "{*仓库编码}/{*库位编码}";
                    erro.ErrorCont = $"*仓库编码: {item.WarehouseCode},与,*库位编码: {item.LocationCode}不匹配!";
                    list.Add(erro);
                }
            }
            //模具关联产品表
            if (excelTable[1].Rows.Count > 0)
            {
                sql = @"select partcode,partname,partspec  from TMateriel_Info";
                dt = DapperHelper.selecttable(sql);
                if (dt.Rows.Count > 0)
                {
                    //校验当前上传的模具仓库是否存在
                    var aRows = excelTable[1].AsEnumerable();
                    var bCodes = dt.AsEnumerable().Select(row => row["partcode"].ToString()).ToList(); // 提取数据库查询中所有partcode值
                   // 使用LINQ和Lambda表达式来查找提交数据产品编码中在数据库中不存在的code
                    var notInB = aRows.Where(aRow => !bCodes.Contains(aRow["产品编码"].ToString())).ToList();
                    // 输出或处理找到的记录
                    foreach (DataRow row in notInB)
                    {
                        ExcelErro erro = new ExcelErro();
                        erro.RoeNumber = "/";
                        erro.ErrorField = "{产品编码}";
                        erro.ErrorCont = "模具关联产品表:{产品编码}字段" + excelTable[1].Rows[j][1].ToString().Trim() + "不存在";
                        erro.ErrorCont = "模具关联产品表:{产品编码}:" +row["产品编码"] +"不存在!";
                        list.Add(erro);
                    }
                }
            }
            //判断模具关联产品表是否有数据
            if (excelTable[1].Rows.Count > 0)
            {
                //判断子表外键不存在于主表主键中的数据
                var dt3 = from r in excelTable[1].AsEnumerable()
                          where !(