using SqlSugar;
using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using WMS.Util;
using WMS.Info;
using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
using System.Drawing;
using System.Text.RegularExpressions;
namespace WMS.Core.ImportExecl
{
public class ImportDataOrExecl
{
///
/// 生产转发料单
///
///
///
///
///
public JsonExecl ImportProdOrder(DataTable execlDt, int busType, string loginName)
{
JsonExecl json = new JsonExecl();
json.Type = 0;
string sql = "";
SqlSugarClient sugar = null;
// 保存需要操作的表名
List LstTable = new List();
// 保存数据库表字段信息
List lstHeat = new List();
// 保存导出的数据
DataTable ImportDT = new DataTable();
try
{
sugar = SysDbCore.GetDbCtx();
sugar.BeginTran();
if (busType.ToString() != "1")
throw new Exception("单据类型不正确");
if (execlDt == null)
throw new Exception("数据源不能为null");
if (execlDt.Rows.Count <= 0)
throw new Exception("数据源数据行数必须大于0");
#region 获取数据库参数配置
// 保存关键字段
string RELATIONSHIPCEL = string.Empty;
DataTable dtTables = sugar.Ado.GetDataTable("SELECT F_NO,BUSINESSTYPE,TABLENAME,STRUCTURE,RELATIONSHIPCEL,BUSINSERTVAL FROM BASE_IMPORTRELATIONSHIP WHERE BUSINSERTVAL='" + busType + "'");
if (dtTables.Rows.Count <= 0)
throw new Exception("未找到参数设置");
foreach (DataRow rows in dtTables.Rows)
{
LstTable.Add(rows["TABLENAME"].ToString() + '|' + rows["STRUCTURE"].ToString() + "|" + rows["BUSINSERTVAL"].ToString());
if (rows["RELATIONSHIPCEL"].ToString() != "" && rows["STRUCTURE"].ToString() == "表头")
{
RELATIONSHIPCEL = rows["RELATIONSHIPCEL"].ToString();
}
}
string[] StrRELATIONSHIPCEL = RELATIONSHIPCEL.Split(',');
if (LstTable.Count < 1)
throw new Exception("数据异常");
// 保存删除的脚本
List delectsql = new List();
// 保存数据库中没有的料号
List lstmatno = new List();
string BusType = string.Empty; // 业务类型
string TableType = string.Empty; // 表类型
string TablesName = string.Empty; // 表名
string CellsName = string.Empty; // 列名
string CellsMemo = string.Empty; // 备注
string CellsType = string.Empty; // 字段类型
string CellsNULLABLE = string.Empty; // 是否允许未空
#region 获取数据库表字段信息
// 多表导入
foreach (string tabName in LstTable)
{
string[] tabs = tabName.Split('|');
TablesName = tabs[0];
TableType = tabs[1];
BusType = tabs[2];
// 保存表的备注
sql = "select * from user_col_comments t5 where t5.TABLE_NAME=upper('" + TablesName + "')";
DataTable CellTitle = sugar.Ado.GetDataTable(sql);
// 保存表的列名
sql = "select * from user_tab_columns t3 where t3.TABLE_NAME=upper('" + TablesName + "')";
DataTable dtcolums = sugar.Ado.GetDataTable(sql);
foreach (DataRow rows in dtcolums.Rows)
{
CellsName = rows["COLUMN_NAME"].ToString();
CellsMemo = CellTitle.Select("COLUMN_NAME='" + CellsName + "'")[0]["COMMENTS"].ToString();
CellsType = rows["DATA_TYPE"].ToString();
CellsNULLABLE = rows["NULLABLE"].ToString();
DBTableCell dbt = new DBTableCell();
dbt.BusType = BusType;
dbt.TablesName = TablesName;
dbt.TableType = TableType;
dbt.CellsName = CellsName;
dbt.CellsMemo = CellsMemo;
dbt.CellsType = CellsType;
dbt.CellsNULLABLE = CellsNULLABLE;
lstHeat.Add(dbt);
}
}
#endregion
#region EXECL 数据获取
// 保存 EXECL 文件中的非法列名
List execlCelName = new List();
foreach (DataColumn columns in execlDt.Columns)
{
var t = lstHeat.Where(v => v.CellsMemo == columns.ColumnName).FirstOrDefault();
if (t == null)
execlCelName.Add(columns.ColumnName);
}
if (execlCelName.Count > 0)
throw new Exception((string.Join(",", execlCelName)) + "列不是合法的列名");
#endregion
#endregion
if (LstTable.Count == 1)
{
#region 单表导入
string tablename = LstTable[0].Split('|')[0];
string inserT = string.Empty;
string inserV = string.Empty;
var t = lstHeat.Where(v => v.TableType == "表头" && v.BusType == busType.ToString() && v.TablesName == tablename).ToList();
// 单表导入
foreach (DataRow rows in execlDt.Rows)
{
inserT = string.Empty;
inserV = string.Empty;
foreach (var tlst in t)
{
if ((tablename == "BASE_MATITEM" && tlst.CellsName == "F_NO"))
{
DataTable dtmat = sugar.Ado.GetDataTable("SELECT * FROM BASE_MATITEM WHERE F_NO='" + rows[tlst.CellsMemo].ToString() + "'");
if (dtmat.Rows.Count > 0)
{
lstmatno.Add(rows[tlst.CellsMemo].ToString());
inserT = string.Empty;
inserV = string.Empty;
break;
}
}
if (execlDt.Columns.Contains(tlst.CellsMemo))
{
inserT += tlst.CellsName + ",";
inserV += GetDbCCells(tlst, rows[tlst.CellsMemo].ToString()) + ",";
}
else
{
string v1 = string.Empty;
string v2 = string.Empty;
GetDbCCell(tlst, out v1, out v2);
if (!string.IsNullOrEmpty(v2))
{
inserT += v1 + ",";
inserV += v2 + ",";
}
}
}
inserT = inserT.Trim(',');
inserV = inserV.Trim(',');
sql += "INSERT INTO " + tablename + "(" + inserT + ") VALUES(" + inserV + ");";
}
#endregion
}
else
{
if (StrRELATIONSHIPCEL.Count() <= 0)
throw new Exception("多表导入表头未设置关键字段");
// 保存关键列和值
Dictionary lstStr = new Dictionary();
#region 获取 EXECL 数据
#region 保存关键列和值
// 先将关键字段赋值为空
foreach (var str in StrRELATIONSHIPCEL)
{
lstStr.Add(str, "");
}
foreach (DataRow rows in execlDt.Rows)
{
string key = string.Empty;
string val = string.Empty;
// 遍历关键列名
foreach (var str in StrRELATIONSHIPCEL)
{
key = str;
val = rows[str].ToString();
if (lstStr[key] != val && lstStr[key] != "")
throw new Exception(key + ":关键字段不允许有两条不同的值");
else
lstStr[key] = val;
}
}
#endregion
// 将数据列按照表类型分组,分成表头和表体
var strs = lstHeat.GroupBy(v => new { v.TableType, v.TablesName }).Select(v => new
{
heat = v.Key.TableType,
tableName = v.Key.TablesName
}).ToArray();
sql = "";
string ot = "KLORDER";
string torder = DateTime.Now.ToString("yyMMddhhmmss");
string exorder = string.Empty;
bool isCF = false;
foreach (var heats in strs)
{
if (heats.heat == "表头")
{
#region 表头
string inserT = string.Empty;
string inserV = string.Empty;
{
#region 生产发料单
var t = lstHeat.Where(v => v.TableType == heats.heat && v.BusType == busType.ToString() && v.TablesName == heats.tableName).ToList();
foreach (var tlst in t)
{
if (tlst.CellsName == "F_TYPENUM")
{
inserT += tlst.CellsName + ",";
inserV += "'3',";
continue;
}
if (tlst.CellsName == "F_NO")
{
exorder = GetDbCCells(tlst, lstStr[tlst.CellsMemo]);
DataTable dt = sugar.Ado.GetDataTable("select * from BILL_ORDERGRP where " + tlst.CellsName + "='" + lstStr[tlst.CellsMemo] + "'");
if (dt.Rows.Count > 0)
{
if (dt.Rows[0]["F_STATENUM"].ToString() != "0")
{
throw new Exception("单据已存在,并且已经开始作业,无法重复导入");
}
else
{
delectsql.Add("DELETE BILL_ORDERGRP WHERE " + tlst.CellsName + "='" + lstStr[tlst.CellsMemo] + "';");
delectsql.Add("DELETE BILL_ORDERITEM WHERE F_ORDERNO='" + lstStr[tlst.CellsMemo] + "';");
}
}
}
if (lstStr.ContainsKey(tlst.CellsMemo))
{
inserT += tlst.CellsName + ",";
inserV += GetDbCCells(tlst, lstStr[tlst.CellsMemo]) + ",";
}
else
{
string v1 = string.Empty;
string v2 = string.Empty;
GetDbCCell(tlst, out v1, out v2);
if (!string.IsNullOrEmpty(v2))
{
inserT += v1 + ",";
inserV += v2 + ",";
}
}
}
#endregion
}
inserT = inserT.Trim(',');
inserV = inserV.Trim(',');
sql += "INSERT INTO " + heats.tableName + "(" + inserT + ") VALUES(" + inserV + ");";
inserT = string.Empty;
inserV = string.Empty;
if (busType.ToString() == "1")
{
{
#region 生产转收货单
var t = lstHeat.Where(v => v.TableType == heats.heat && v.BusType == busType.ToString() && v.TablesName == heats.tableName).ToList();
foreach (var tlst in t)
{
if (tlst.CellsName == "F_TYPENUM")
{
inserT += tlst.CellsName + ",";
inserV += "'1',";
continue;
}
if (tlst.CellsName == "F_NO")
{
inserT += tlst.CellsName + ",";
inserV += "'" + ot + lstStr[tlst.CellsMemo] + "',";
DataTable dt = sugar.Ado.GetDataTable("select * from BILL_ORDERGRP where " + tlst.CellsName + "='" + ot + lstStr[tlst.CellsMemo] + "'");
if (dt.Rows.Count > 0)
{
if (dt.Rows[0]["F_STATENUM"].ToString() != "0")
{
throw new Exception("单据已存在,并且已经开始作业,无法重复导入");
}
else
{
delectsql.Add("DELETE BILL_ORDERGRP WHERE " + tlst.CellsName + "='" + ot + lstStr[tlst.CellsMemo] + "';");
delectsql.Add("DELETE BILL_ORDERITEM WHERE F_ORDERNO='" + ot + lstStr[tlst.CellsMemo] + "';");
}
}
continue;
}
if (lstStr.ContainsKey(tlst.CellsMemo))
{
inserT += tlst.CellsName + ",";
inserV += GetDbCCells(tlst, lstStr[tlst.CellsMemo]) + ",";
}
else
{
string v1 = string.Empty;
string v2 = string.Empty;
GetDbCCell(tlst, out v1, out v2);
if (!string.IsNullOrEmpty(v2))
{
inserT += v1 + ",";
inserV += v2 + ",";
}
}
}
#endregion
}
inserT = inserT.Trim(',');
inserV = inserV.Trim(',');
sql += "INSERT INTO " + heats.tableName + "(" + inserT + ") VALUES(" + inserV + ");";
}
#endregion
}
else
{
#region 表体
foreach (DataRow rows in execlDt.Rows)
{
var t = lstHeat.Where(v => v.TableType == heats.heat && v.BusType == busType.ToString() && v.TablesName == heats.tableName).ToList();
string rowno = Guid.NewGuid().ToString();
string inserT = string.Empty;
string inserV = string.Empty;
#region 生产发料单
foreach (var tlst in t)
{
if (tlst.CellsName == "F_ROWNO")
{
inserT += tlst.CellsName + ",";
inserV += "'" + rowno + "',";
continue;
}
if (tlst.CellsName == "F_MATNO" && tlst.CellsMemo == "物料编号")
{
DataTable dtmat = sugar.Ado.GetDataTable("SELECT * FROM BASE_MATITEM WHERE F_NO='" + rows[tlst.CellsMemo].ToString() + "'");
if (dtmat.Rows.Count <= 0)
{
lstmatno.Add(rows[tlst.CellsMemo].ToString());
}
}
if (execlDt.Columns.Contains(tlst.CellsMemo))
{
inserT += tlst.CellsName + ",";
if (lstStr.ContainsKey(tlst.CellsMemo))
{
inserV += GetDbCCells(tlst, lstStr[tlst.CellsMemo]) + ","; ;
}
else
{
inserV += GetDbCCells(tlst, rows[tlst.CellsMemo].ToString()) + ","; ;
}
}
else
{
string v1 = string.Empty;
string v2 = string.Empty;
GetDbCCell(tlst, out v1, out v2);
if (!string.IsNullOrEmpty(v2))
{
inserT += v1 + ",";
inserV += v2 + ",";
}
}
}
#endregion
inserT = inserT.Trim(',');
inserV = inserV.Trim(',');
sql += "INSERT INTO " + heats.tableName + "(" + inserT + ") VALUES(" + inserV + ");";
inserT = string.Empty;
inserV = string.Empty;
if (busType.ToString() == "1")
{
#region 生产转收货单
foreach (var tlst in t)
{
if (tlst.CellsName == "F_ORDERNO")
{
inserT += tlst.CellsName + ",";
if (isCF)
{
inserV += "'" + ot + torder + "',";
}
else
{
inserV += "'" + ot + lstStr[tlst.CellsMemo] + "',";
}
continue;
}
if (tlst.CellsName == "F_FROMORDERNO")
{
inserT += tlst.CellsName + ",";
inserV += exorder + ",";
continue;
}
if (tlst.CellsName == "F_FROMORDERITEMNO")
{
inserT += tlst.CellsName + ",";
inserV += "'" + rowno + "',";
continue;
}
if (execlDt.Columns.Contains(tlst.CellsMemo))
{
inserT += tlst.CellsName + ",";
if (lstStr.ContainsKey(tlst.CellsMemo))
{
inserV += GetDbCCells(tlst, lstStr[tlst.CellsMemo]) + ","; ;
}
else
{
inserV += GetDbCCells(tlst, rows[tlst.CellsMemo].ToString()) + ",";
}
}
else
{
string v1 = string.Empty;
string v2 = string.Empty;
GetDbCCell(tlst, out v1, out v2);
if (!string.IsNullOrEmpty(v2))
{
inserT += v1 + ",";
inserV += v2 + ",";
}
}
}
inserT = inserT.Trim(',');
inserV = inserV.Trim(',');
sql += "INSERT INTO " + heats.tableName + "(" + inserT + ") VALUES(" + inserV + ");";
inserT = string.Empty;
inserV = string.Empty;
#endregion
}
}
#endregion
}
}
#endregion
}
if (lstmatno.Count > 0 && LstTable.Count > 1)
{
string mats = string.Join(",", lstmatno);
throw new Exception(mats + ":未找到数据");
}
else if (lstmatno.Count > 0 && LstTable.Count == 1)
{
string mats = string.Join(",", lstmatno);
}
if (!string.IsNullOrEmpty(sql))
{
foreach (string str in delectsql)
{
sql = str + sql;
}
string[] strs = sql.Split(';');
int res = 0;
foreach (string str in strs)
{
if (!string.IsNullOrEmpty(str))
{
res = sugar.Ado.ExecuteCommand(str);
if (res <= 0)
throw new Exception("添加失败:" + str);
}
}
sugar.CommitTran();
json.Type = 2;
json.Message = "操作成功";
}
}
catch (Exception ex)
{
sugar.RollbackTran();
json.Type = 0;
json.Message = ex.Message;
}
finally
{
sugar.Dispose();
}
return json;
}
public string RegexNot(string restring)
{
return restring.Trim().Replace("\n", "").Replace(" ", "").Replace("\t", "").Replace("\r", ""); //替换所有不可见字符为空格
}
///
/// 基础资料导入方法
///
/// 文件路径/param>
/// 业务类型
/// 登陆账号
public JsonExecl ImportData(DataTable dtExeclSouse, int busType, string loginName)
{
JsonExecl json = new JsonExecl();
json.Type = 0;
int OKCount = 0;
string sql = "";
SqlSugarClient sugar = SysDbCore.GetDbCtx();
try
{
if (dtExeclSouse == null)
throw new Exception("数据源不能为null");
if (dtExeclSouse.Rows.Count <= 0)
throw new Exception("数据源数据行数必须大于0");
//int heatIndex = 0;
//if (string.IsNullOrEmpty(filePath))
// throw new Exception("文件路径不能为空");
//if (!File.Exists(filePath))
// throw new Exception("文件不存在");
//if (string.IsNullOrEmpty(busType))
// throw new Exception("类型不能为空");
#region 获取数据库参数配置
// 获取参数配置
var importLst = sugar.Queryable().Where(v => v.BUSINSERTVAL == busType).First();
if (importLst == null)
throw new Exception("未找到主表参数");
var imBaseDtLst = sugar.Queryable().Where(v => v.F_NO == importLst.F_NO).ToList();
if (imBaseDtLst.Count <= 0)
throw new Exception("未找到字段参数的配置");
var GetF_NO = imBaseDtLst.Where(v => v.DBCELLNAME == "F_NO").FirstOrDefault();
if (GetF_NO == null && busType >= 1000 && busType < 2000)
throw new Exception("参数配置缺少主键 [ F_NO || F_ROWNO ] 参数");
#endregion
// 获取数据源
DataTable execlDt = dtExeclSouse;// ExcelHelper.ExcelImport(filePath, importLst.SHEETNAME, heatIndex);
List lstCells = new List();
#region 获取主数据的参数属性
sql = string.Format(@"select mome.TABLE_NAME as TableName,mome.COLUMN_NAME as CelName,mome.COMMENTS as CelMemo,cel.DATA_TYPE as CelType,CEL.NULLABLE as CelIsNull,cel.DATA_DEFAULT as CelDefualVal
from user_col_comments mome left
join user_tab_columns cel on mome.TABLE_NAME = cel.TABLE_NAME and mome.COLUMN_NAME = cel.COLUMN_NAME
where mome.TABLE_NAME = upper('{0}') and cel.TABLE_NAME = upper('{0}')", importLst.TABLENAME);
DataTable CellTitle = sugar.Ado.GetDataTable(sql);
foreach (DataRow row in CellTitle.Rows)
{
var celName = row["CelName"].ToString();
DBCells cell = new DBCells();
cell.TableName = row["TableName"].ToString();
cell.CelName = row["CelName"].ToString();
cell.CelMemo = row["CelMemo"].ToString();
cell.CelType = row["CelType"].ToString();
cell.CelIsNull = row["CelIsNull"].ToString();
cell.CelDefualVal = row["CelDefualVal"].ToString();
var tdb = imBaseDtLst.Where(v => v.DBCELLNAME == celName).FirstOrDefault();
cell.IsConfig = tdb == null ? false : true;
cell.ExeclName = tdb == null ? "" : tdb.EXECLCELLNAME;
lstCells.Add(cell);
}
#endregion
#region 验证文件的合法性
List lstErrCel = new List();
foreach (var dbHt in imBaseDtLst)
{
if (!execlDt.Columns.Contains(dbHt.EXECLCELLNAME))
{
lstErrCel.Add(dbHt.EXECLCELLNAME);
}
}
if (lstErrCel.Count > 0)
throw new Exception(string.Format("EXECL 缺少配置项:[{0}]", string.Join(",", lstErrCel)));
#endregion
int celCode = execlDt.Columns.Count;
int i = 0;
string ExSql = string.Empty;
Type t = execlDt.Columns[0].DataType;
string setCelVal = string.Empty;
DataTable dtSouse = new DataTable();
dtSouse.Columns.Add("数据类型");
dtSouse.Columns.Add("数据索引");
dtSouse.Columns.Add("数据主键");
dtSouse.Columns.Add("原因");
Dictionary dicRes = new Dictionary();
if (importLst.RELATIONSHIPCEL != "UPDATE")
{
#region 主数据,不存在增加,存在修改
foreach (DataRow exRow in execlDt.Rows)
{
ExSql = "";
if (i == 4196 || i == 5604 || i == 7743)
{
}
if (busType >= 1000 && busType < 2000)
{
#region 基础资料
var F_NO = exRow[GetF_NO.EXECLCELLNAME].ToString();
if (!string.IsNullOrEmpty(F_NO))
{
sql = string.Format("SELECT * FROM {0} WHERE F_NO='{1}'", importLst.TABLENAME, F_NO.TrimStart('0'));
DataTable tdt = sugar.Ado.GetDataTable(sql);
if (tdt != null)
{
if (tdt.Rows.Count > 0)
{
// 修改
ExSql = GetUpdateSql(exRow, lstCells, F_NO.TrimStart('0'), busType);
if (!ExSql.Contains("UPDATE"))
{
dicRes.Add(i, new string[] { F_NO.TrimStart('0'), ExSql });
dtSouse.Rows.Add("表体", i.ToString(), F_NO.TrimStart('0'), ExSql);
ExSql = "";
}
setCelVal = "修改";
}
else
{
// 增加
ExSql = GetInsertSql(exRow, lstCells, F_NO.TrimStart('0'), busType);
setCelVal = "增加";
}
}
else
{
// 增加
ExSql = GetInsertSql(exRow, lstCells, F_NO.TrimStart('0'), busType);
setCelVal = "增加";
}
if (!string.IsNullOrEmpty(ExSql))
{
try
{
int res = sugar.Ado.ExecuteCommand(ExSql);
if (res <= 0)
{
dicRes.Add(i, new string[] { F_NO.TrimStart('0'), setCelVal + "失败" });
dtSouse.Rows.Add("表体", i.ToString(), F_NO.TrimStart('0'), setCelVal + "失败");
}
//WriteExecl(filePath, celCode, i, t, setCelVal + "失败");
else
{
OKCount++;
dicRes.Add(i, new string[] { F_NO.TrimStart('0'), setCelVal + "成功" });
dtSouse.Rows.Add("表体", i.ToString(), F_NO.TrimStart('0'), setCelVal + "成功");
}
//WriteExecl(filePath, celCode, i, t, setCelVal + "成功");
}
catch (Exception ex)
{
dicRes.Add(i, new string[] { F_NO.TrimStart('0'), setCelVal + ":" + ex.Message });
dtSouse.Rows.Add("表体", i.ToString(), F_NO.TrimStart('0'), setCelVal + ":" + ex.Message);
//WriteExecl(filePath, celCode, i, t, setCelVal + ":" + ex.Message);
}
}
}
else
{
dicRes.Add(i, new string[] { F_NO.TrimStart('0'), "主键为空" });
dtSouse.Rows.Add("表体", i.ToString(), F_NO.TrimStart('0'), "主键为空");
//WriteExecl(filePath, celCode, i, t, "主键为空");
}
#endregion
}
else if (busType >= 2000)
{
string keyss = string.Empty;
// 初始化库存只增加
if (busType == 2000)
{
string F_ROWNO = Guid.NewGuid().ToString();
string Exmatmo = keyss = exRow["物料编号"].ToString();
string ExState = exRow["物料状态"].ToString();
string Exposition = exRow["存储位置"].ToString();
var ises = execlDt.Select("物料编号='" + Exmatmo + "' and 物料状态='" + ExState + "' and 存储位置='" + Exposition + "'");
if (ises.Count() > 1)
{
dicRes.Add(i, new string[] { i.ToString(), "失败:物料,物料状态,存储位置。行数重复" });
dtSouse.Rows.Add("表体", i.ToString(), Exmatmo, "失败:物料不存在");
}
else
ExSql = GetInsertINVCONTR(exRow, lstCells, F_ROWNO, busType, i, sugar, ref dtSouse, ref dicRes);
}
else if (busType == 2001)
{
string Exmatmo = keyss = exRow["物料编号"].ToString();
string Exsupno = exRow["供应商编号"].ToString();
string Exqty = exRow["数量"].ToString();
if (string.IsNullOrEmpty(Exmatmo) || string.IsNullOrEmpty(Exsupno) || string.IsNullOrEmpty(Exqty))
{
dicRes.Add(i, new string[] { i.ToString(), "失败:物料编号||供应商编号||数量 不允许未空" });
dtSouse.Rows.Add("表体", i.ToString(), Exmatmo, "失败:物料编号||供应商编号||数量 不允许未空");
}
else
{
var sup = sql = string.Format("SELECT * FROM BASE_SUPPLIER WHERE F_NO='{0}'", Exsupno);
DataTable dtSup = sugar.Ado.GetDataTable(sql);
if (dtSup.Rows.Count <= 0)
{
dicRes.Add(i, new string[] { i.ToString(), "失败:供应商不存在" });
dtSouse.Rows.Add("表体", i.ToString(), Exmatmo, "失败:供应商不存在");
}
else
{
sql = string.Format("SELECT * FROM BILL_INVCONTR WHERE F_MATNO='{0}' AND F_SUPPLIERNO='{1}'", Exmatmo, Exsupno);
DataTable dtStock = sugar.Ado.GetDataTable(sql);
if (dtStock.Rows.Count > 0)
{
if (dtStock.Rows[0]["F_ROWNO"].ToString() == "240c531a-59d6-4905-8500-4478e3c09f05")
{
}
ExSql = "UPDATE BILL_INVCONTR SET F_QTY=F_QTY+" + Exqty + " WHERE F_ROWNO='" + dtStock.Rows[0]["F_ROWNO"].ToString() + "'";
}
else
{
string F_ROWNO = Guid.NewGuid().ToString();
ExSql = GetInsertINVCONTR(exRow, lstCells, F_ROWNO, busType, i, sugar, ref dtSouse, ref dicRes);
}
}
}
}
try
{
if (!string.IsNullOrEmpty(ExSql))
{
int res = sugar.Ado.ExecuteCommand(ExSql);
if (res <= 0)
{
dicRes.Add(i, new string[] { i.ToString(), setCelVal + "失败" });
dtSouse.Rows.Add("表体", i.ToString(), keyss, setCelVal + "失败");
}
//WriteExecl(filePath, celCode, i, t, setCelVal + "失败");
else
{
OKCount++;
dicRes.Add(i, new string[] { i.ToString(), setCelVal + "成功" });
dtSouse.Rows.Add("表体", i.ToString(), keyss, setCelVal + "成功");
}
}
//WriteExecl(filePath, celCode, i, t, setCelVal + "成功");
}
catch (Exception ex)
{
dicRes.Add(i, new string[] { i.ToString(), setCelVal + ":" + ex.Message });
dtSouse.Rows.Add("表体", i.ToString(), keyss, setCelVal + ":" + ex.Message);
//WriteExecl(filePath, celCode, i, t, setCelVal + ":" + ex.Message);
}
}
i++;
}
#endregion
}
else
{
#region 只有修改,找不到就报错
bool isDb = false;
foreach (DataRow exRow in execlDt.Rows)
{
// 质检规则
if (busType == 1001)
{
#region 质检规则
isDb = false;
var F_NO = RegexNot(exRow[GetF_NO.EXECLCELLNAME].ToString());//替换所有不可见字符为空格
if (!string.IsNullOrEmpty(F_NO))
{
sql = string.Format("SELECT * FROM {0} WHERE F_NO='{1}'", importLst.TABLENAME, F_NO.TrimStart('0'));
DataTable tdt = sugar.Ado.GetDataTable(sql);
if (tdt != null)
{
if (tdt.Rows.Count > 0)
{
if (busType == 1001)
{
#region 导入质检规则
// 判断质检规则是否有配置指定参数值
var f1 = lstCells.Where(v => v.CelName == "F_QCTYPECODE").FirstOrDefault();
var f2 = lstCells.Where(v => v.CelName == "F_QCQTY").FirstOrDefault();
var f3 = lstCells.Where(v => v.CelName == "F_NO").FirstOrDefault();
if (f1 == null || f2 == null || f3 == null)
{
dicRes.Add(i, new string[] { F_NO.TrimStart('0'), "抽检方案或者数值未配置" });
dtSouse.Rows.Add("表体", i.ToString(), F_NO.TrimStart('0'), "抽检方案或者数值未配置");
}
else
{
// 获取 EXECL 值
var F_QCTYPECODE = exRow[f1.ExeclName].ToString();
var F_QCQTY = exRow[f2.ExeclName].ToString();
var GF_NO = exRow[f3.ExeclName].ToString();
if (GF_NO == "1181802")
{
}
if (F_QCTYPECODE == "固定")
{
// 判断物料的包装单位和基本但是是否为空
if (string.IsNullOrEmpty(tdt.Rows[0]["F_DEFINE04"].ToString()) || string.IsNullOrEmpty(tdt.Rows[0]["F_BASEUNITNO"].ToString()))
{
dicRes.Add(i, new string[] { F_NO.TrimStart('0'), "该物料未维护最小包装单位或者基本单位" });
dtSouse.Rows.Add("表体", i.ToString(), F_NO.TrimStart('0'), "该物料未维护最小包装单位或者基本单位");
}
else
{
// 查询转换率
sql = string.Format("SELECT * FROM BASE_MATCONVUNIT WHERE F_MATNO='{0}' and F_CONVUNIT='{1}'", GF_NO, tdt.Rows[0]["F_DEFINE04"].ToString());
DataTable GetUnit = sugar.Ado.GetDataTable(sql);
if (GetUnit.Rows.Count == 1)
{
var convval = Convert.ToDecimal(GetUnit.Rows[0]["F_CONVERSION"].ToString());
JsonConvUnitEntity cu = UnitByConvUnit.GetConvUnitByBase(busType, GF_NO, tdt.Rows[0]["F_DEFINE04"].ToString(), convval);
exRow[f2.ExeclName] = cu.Entity.BaseValue.ToString();
isDb = true;
// 修改
ExSql = GetUpdateSql(exRow, lstCells, F_NO.TrimStart('0'), busType);
if (!ExSql.Contains("UPDATE"))
{
dicRes.Add(i, new string[] { F_NO.TrimStart('0'), ExSql });
dtSouse.Rows.Add("表体", i.ToString(), F_NO.TrimStart('0'), ExSql);
ExSql = "";
}
setCelVal = "修改";
}
else
{
dicRes.Add(i, new string[] { F_NO.TrimStart('0'), "该物料未配置基本单位与包装单位的转换" });
dtSouse.Rows.Add("表体", i.ToString(), F_NO.TrimStart('0'), "该物料未配置基本单位与包装单位的转换");
}
}
}
else
{
isDb = true;
// 修改
ExSql = GetUpdateSql(exRow, lstCells, F_NO.TrimStart('0'), busType);
if (!ExSql.Contains("UPDATE"))
{
dicRes.Add(i, new string[] { F_NO.TrimStart('0'), ExSql });
dtSouse.Rows.Add("表体", i.ToString(), F_NO.TrimStart('0'), ExSql);
ExSql = "";
}
setCelVal = "修改";
}
}
#endregion
}
else
{
isDb = true;
// 修改
ExSql = GetUpdateSql(exRow, lstCells, F_NO.TrimStart('0'), busType);
if (!ExSql.Contains("UPDATE"))
{
dicRes.Add(i, new string[] { F_NO.TrimStart('0'), ExSql });
dtSouse.Rows.Add("表体", i.ToString(), F_NO.TrimStart('0'), ExSql);
ExSql = "";
}
setCelVal = "修改";
}
}
else
{
dicRes.Add(i, new string[] { F_NO.TrimStart('0'), F_NO + ":未找到主数据" });
dtSouse.Rows.Add("表体", i.ToString(), F_NO.TrimStart('0'), "未找到主数据");
}
}
else
{
dicRes.Add(i, new string[] { F_NO.TrimStart('0'), F_NO + ":未找到主数据" });
dtSouse.Rows.Add("表体", i.ToString(), F_NO.TrimStart('0'), "未找到主数据");
}
if (isDb)
{
if (!string.IsNullOrEmpty(ExSql))
{
try
{
int res = sugar.Ado.ExecuteCommand(ExSql);
if (res <= 0)
{
dicRes.Add(i, new string[] { F_NO.TrimStart('0'), setCelVal + "失败" });
dtSouse.Rows.Add("表体", i.ToString(), F_NO.TrimStart('0'), setCelVal + "失败");
}
//WriteExecl(filePath, celCode, i, t, setCelVal + "失败");
else
{
OKCount++;
dicRes.Add(i, new string[] { F_NO.TrimStart('0'), setCelVal + "成功" });
dtSouse.Rows.Add("表体", i.ToString(), F_NO.TrimStart('0'), setCelVal + "成功");
}
//WriteExecl(filePath, celCode, i, t, setCelVal + "成功");
}
catch (Exception ex)
{
dicRes.Add(i, new string[] { F_NO.TrimStart('0'), setCelVal + ":" + ex.Message });
dtSouse.Rows.Add("表体", i.ToString(), F_NO.TrimStart('0'), setCelVal + ":" + ex.Message);
//WriteExecl(filePath, celCode, i, t, setCelVal + ":" + ex.Message);
}
}
}
}
else
{
dicRes.Add(i, new string[] { F_NO.TrimStart('0'), "主键为空" });
dtSouse.Rows.Add("表体", i.ToString(), F_NO.TrimStart('0'), "主键为空");
}
#endregion
}
else if (busType == 1002)
{
var F_NO = exRow[GetF_NO.EXECLCELLNAME].ToString();
try
{
#region SAP货位
sql = string.Format("SELECT * FROM {0} WHERE F_NO='{1}'", importLst.TABLENAME, F_NO.TrimStart('0'));
DataTable tdt = sugar.Ado.GetDataTable(sql);
if (tdt != null)
{
if (tdt.Rows.Count > 0)
{
// 修改
ExSql = GetUpdateSql(exRow, lstCells, F_NO.TrimStart('0'), busType);
if (!ExSql.Contains("UPDATE"))
{
dicRes.Add(i, new string[] { F_NO.TrimStart('0'), ExSql });
dtSouse.Rows.Add("表体", i.ToString(), F_NO.TrimStart('0'), ExSql);
ExSql = "";
}
setCelVal = "修改";
if (!string.IsNullOrEmpty(ExSql))
{
int res = sugar.Ado.ExecuteCommand(ExSql);
if (res <= 0)
{
dicRes.Add(i, new string[] { F_NO.TrimStart('0'), setCelVal + "失败" });
dtSouse.Rows.Add("表体", i.ToString(), F_NO.TrimStart('0'), setCelVal + "失败");
}
//WriteExecl(filePath, celCode, i, t, setCelVal + "失败");
else
{
OKCount++;
dicRes.Add(i, new string[] { F_NO.TrimStart('0'), setCelVal + "成功" });
dtSouse.Rows.Add("表体", i.ToString(), F_NO.TrimStart('0'), setCelVal + "成功");
}
}
}
else
{
dicRes.Add(i, new string[] { F_NO.TrimStart('0'), "未找到物料" });
dtSouse.Rows.Add("表体", i.ToString(), F_NO.TrimStart('0'), "未找到物料 - 0");
}
}
else
{
dicRes.Add(i, new string[] { F_NO.TrimStart('0'), "未找到物料" });
dtSouse.Rows.Add("表体", i.ToString(), F_NO.TrimStart('0'), "未找到物料 - null");
}
}
catch (Exception ex)
{
dicRes.Add(i, new string[] { F_NO.TrimStart('0'), ex.Message });
dtSouse.Rows.Add("表体", i.ToString(), F_NO.TrimStart('0'), ex.Message);
}
#endregion
}
i++;
}
#endregion
}
ExcelConfig cof = new ExcelConfig();
cof.Title = "导入时异常信息"; // 文件名
cof.TitlePoint = 18; // 标题字号
cof.HeadPoint = 14;// 列头字号
cof.IsAllSizeColumn = true; // 列宽自适应
cof.ColumnEntity = new List() {
new ColumnModel(){Column = "数据类型",ExcelColumn = "数据类型"},
new ColumnModel(){Column = "数据索引",ExcelColumn = "数据索引"},
new ColumnModel(){Column = "数据主键",ExcelColumn = "数据主键"},
new ColumnModel(){Column = "原因",ExcelColumn = "原因",Background=Color.Red},
};
json.Message = "成功:" + OKCount + " 失败:" + (dicRes.Count() - OKCount);
json.Type = ((dicRes.Count() - OKCount)) <= 0 ? 2 : 1;
json.dtSou = dtSouse;
json.ExeclCfg = cof;
}
catch (Exception ex)
{
json.Type = 0;
if (!string.IsNullOrEmpty(json.Message))
json.Message = "数据库录入成功:" + json.Message + " \n 操作回写EXECL文件时异常!" + ex.Message;
else
json.Message = ex.Message;
}
finally
{
sugar.Dispose();
}
return json;
}
///
///
///
/// 行数据
/// 数据库列信息
/// 库存主键
/// 业务类型:固定>2000
/// 循环的索引(为了将异常数据写入EXECL反馈)
/// 数据库连接对象
/// 返回的异常信息
///
public string GetInsertINVCONTR(DataRow row, List lstCels, string F_ROWNO, int busType, int i, SqlSugarClient sugar, ref DataTable dtSouse, ref Dictionary dicRes)
{
// 保存SQL列
string resT = string.Empty;
// 保存SQL值
string valT = string.Empty;
string val = string.Empty;
// 料号
string matNoEX = RegexNot(row["物料编号"].ToString().Trim());
#region 物料
if (string.IsNullOrEmpty(matNoEX))
{
dicRes.Add(i, new string[] { i.ToString(), "失败:物料号[" + matNoEX + "]不能为空" });
dtSouse.Rows.Add("表体", i.ToString(), matNoEX, "物料号不能为空");
return "";
}
string sql = string.Format("SELECT * FROM BASE_MATITEM WHERE F_NO='{0}'", matNoEX);
DataTable dtMat = sugar.Ado.GetDataTable(sql);
if (dtMat.Rows.Count <= 0)
{
dicRes.Add(i, new string[] { i.ToString(), "失败:物料号[" + matNoEX + "]未找到物料基础信息" });
dtSouse.Rows.Add("表体", i.ToString(), matNoEX, "未找到物料基础信息");
return "";
}
#endregion
// 物料状态
int matSatet = 0;
string strWarehouse = string.Empty;
string strWareAear = string.Empty;
if (busType == 2000)
{
strWarehouse = "XN";
strWareAear = "INIT_XN";
#region 获取状态
string matSatetEX = RegexNot(row["物料状态"].ToString().Trim());
switch (matSatetEX)
{
case "UU-合格":
matSatet = 1;
break;
case "BLOCK-不合格":
matSatet = 3;
break;
case "QI-冻结":
matSatet = 4;
break;
default:
dicRes.Add(i, new string[] { i.ToString(), "失败:物料号[" + matNoEX + "]状态不是可识别的状态" });
dtSouse.Rows.Add("表体", i.ToString(), matNoEX, "状态不是可识别的状态");
return "";
}
#endregion
}
else if (busType == 2001)
{
strWarehouse = "WW";
strWareAear = "WW_Warea";
matSatet = 1;
}
// 保存数量
decimal qty = 0;
#region 数量
string StrqtyEX = RegexNot(row["数量"].ToString().Trim());
try
{
decimal qtyEX = decimal.Parse(StrqtyEX);
if (qtyEX <= 0)
{
dicRes.Add(i, new string[] { i.ToString(), "失败:物料号[" + matNoEX + "]数量值不能小于等于0" });
dtSouse.Rows.Add("表体", i.ToString(), matNoEX, "数量值不能小于等于0:");
return "";
}
else
{
if (matSatet == 1 && busType == 2000)
{
// 获取库存数量
sql = string.Format("SELECT F_QTY,F_MATNO FROM BILL_INVCONTR WHERE F_WAREHOUSENO IN('LS','2FCJ','2F','ZC','WY','JZ','WZZ','GY','PT','WTP','WH','1FDT','TB') and F_MATNO='{0}' and F_MATSTATENUM=1", matNoEX);
DataTable dtStock = sugar.Ado.GetDataTable(sql);
decimal dbqty = 0;
if (dtStock.Rows.Count > 0)
{
//var sumQty = from p in dtSouse.AsEnumerable()
// group p by new { DBmatno = p.Field("F_MATNO") } into m
// select new
// {
// DBmatno = m.Key.DBmatno,
// stockQty = m.Sum(v => v.Field("F_QTY"))
// };
foreach (DataRow item in dtStock.Rows)
{
dbqty += Convert.ToDecimal(item["F_QTY"].ToString());
}
// EXECL数量减去WMS数量等于本次要操作的数量
qty = qtyEX - dbqty;
if (qty == 0)
{
dicRes.Add(i, new string[] { i.ToString(), "失败:物料号[" + matNoEX + "]EXECL数量与WMS相同,不予以导入" });
dtSouse.Rows.Add("表体", i.ToString(), matNoEX, "EXECL数量与WMS相同,不予以导入");
return "";
}
}
else
qty = qtyEX;
}
else
// 未找到库存则已EXECL数量为准
qty = qtyEX;
}
}
catch (Exception ex)
{
dicRes.Add(i, new string[] { i.ToString(), "失败:物料号[" + matNoEX + "]数量值异常" });
dtSouse.Rows.Add("表体", i.ToString(), matNoEX, "数量值异常:" + ex.Message);
return "";
}
#endregion
string F_CONTRGRPNO = string.Empty;
if (busType == 2000)
{
#region 容器组ID
string POSITION = RegexNot(row["存储位置"].ToString().Trim());
if (!string.IsNullOrEmpty(POSITION))
{
string[] strPosi = new string[] { "3000", "3001", "3010", "3030", "3040", "3041", "3045", "3046", "3050", "3060", "3090", "3095", "3099" };
if (!strPosi.Contains(POSITION))
{
dicRes.Add(i, new string[] { i.ToString(), "失败:物料号[" + matNoEX + "]不是可识别的存储位置" });
dtSouse.Rows.Add("表体", i.ToString(), matNoEX, "不是可识别的存储位置:" + POSITION);
return "";
}
F_CONTRGRPNO = "d1f0db88-75df-483c-b7d2-XN-INIT-" + POSITION;
sql = string.Format("SELECT * FROM BASE_WARECELL WHERE F_NO ='{0}' AND F_CNTRGRPNO='{1}'", "XN-INIT-" + POSITION, F_CONTRGRPNO);
DataTable dtCell = sugar.Ado.GetDataTable(sql);
if (dtCell.Rows.Count <= 0)
{
dicRes.Add(i, new string[] { i.ToString(), "失败:物料号[" + matNoEX + "]未找到容器ID,请检查存储位置:" + POSITION });
dtSouse.Rows.Add("表体", i.ToString(), matNoEX, "未找到容器ID,请检查存储位置:" + POSITION);
return "";
}
}
else
{
dtSouse.Rows.Add("表体", i.ToString(), matNoEX, "存储位置不能为空:");
return "";
}
#endregion
}
else if (busType == 2001)
{
F_CONTRGRPNO = "00000000000000000000000000000000";
}
string TempF_BATCHNO = "CS" + System.DateTime.Now.ToString("yyyyMMdd");
string TempF_MATVERSION = "-";
string TempF_MATGEAR = "-";
resT = "F_ROWNO,F_MATSTATENUM,F_QTY,F_CONTRGRPNO,F_MATNO,F_MATNAME,F_WAREHOUSENO,F_WAREANO,F_BATCHNO,F_MATVERSION,F_MATGEAR,";
valT = string.Format("'{0}',{1},{2},'{3}','{4}','{5}','{6}','{7}','{8}','{9}','{10}',", F_ROWNO, matSatet, qty, F_CONTRGRPNO, matNoEX, dtMat.Rows[0]["F_NAME"].ToString(), strWarehouse, strWareAear, TempF_BATCHNO, TempF_MATVERSION, TempF_MATGEAR);
// 保存不需要循环获取的字段
foreach (var cel in lstCels)
{
val = string.Empty;
if (resT.Contains(cel.CelName))
continue;
if (cel.IsConfig)
{
val = RegexNot(row[cel.ExeclName].ToString().Trim());
}
if (cel.CelIsNull == "N")
{
resT += cel.CelName + ",";
#region 不允许为空
switch (cel.CelType)
{
case "DATE":
if (string.IsNullOrEmpty(val))
valT += "to_date('" + DateTime.Now.ToString("yyyy-MM-dd") + "','YYYY-MM-DD'),";
else
valT += "to_date('" + val + "','YYYY-MM-DD'),";
break;
case "NUMBER":
if (string.IsNullOrEmpty(val))
valT += "'0',";
else
valT += "'" + val + "',";
break;
default:
if (string.IsNullOrEmpty(val))
valT += "'WMS',";
else
valT += "'" + val + "',";
break;
}
#endregion
}
else
{
#region 允许为空
if (!string.IsNullOrEmpty(val))
{
resT += cel.CelName + ",";
switch (cel.CelType)
{
case "DATE":
valT += "to_date('" + val + "','YYYY-MM-DD'),";
break;
case "NUMBER":
valT += "'" + val + "',";
break;
default:
valT += "'" + val + "',";
break;
}
}
#endregion
}
}
resT = resT.Trim(',');
valT = valT.Trim(',');
return string.Format(@"INSERT INTO {0}({1}) VALUES({2})", lstCels[0].TableName, resT, valT);
}
///
/// 通用单据导入方法(简单校验)
///
///
///
///
///
public JsonExecl ImportOrderD(DataTable dtExeclSouse, int busTypeVal, string loginName)
{
JsonExecl json = new JsonExecl();
json.Type = 0;
// busType
SqlSugarClient sugar = SysDbCore.GetDbCtx();
try
{
if (dtExeclSouse == null)
throw SysExCore.ThrowFailException("数据源不能为null");
if (dtExeclSouse.Rows.Count <= 0)
throw SysExCore.ThrowFailException("数据源数据行数必须大于0");
// 获取源数据
DataTable execlDt = dtExeclSouse;//ExcelHelper.ExcelImport(filePath, 0, 0);
EOrderType otype = (EOrderType)busTypeVal;
#region 获取数据库参数配置
// 获取参数配置
var importLst = sugar.Queryable().Where(v => v.BUSINSERTVAL == busTypeVal).ToList();
var imptHt = importLst.Where(v => v.STRUCTURE == "表头").FirstOrDefault();
if (imptHt == null)
throw SysExCore.ThrowFailException("单据导入必须有表头参数定义");
// 获取表体参数
var imptDt = importLst.Where(v => v.STRUCTURE == "表体").FirstOrDefault();
if (imptDt == null)
throw SysExCore.ThrowFailException("单据导入必须有表体参数定义");
var imBaseHtLst = sugar.Queryable().Where(v => v.F_NO == imptHt.F_NO).ToList();
var imBaseDtLst = sugar.Queryable().Where(v => v.F_NO == imptDt.F_NO).ToList();
if (imBaseHtLst.Count <= 0 || imBaseDtLst.Count <= 0)
throw SysExCore.ThrowFailException("未找到字段参数的配置");
#endregion
// string busType = busTypeVal;//imptHt.BUSINESSTYPE;
// 表体区开始索引
int staIndex = 0;
// 表体区结束索引
int endIndex = 0;
int heatStaIndex = 0;
Dictionary dicKeys = new Dictionary();
List lstOrder = new List();
List lstItem = new List();
// 判断表头数据是否在 EXECL 的表头数据中
if (imBaseHtLst.Where(v => v.F_DATATYPE == "表头").FirstOrDefault() != null)
{
#region EXECL 表头表体数据混合模式
DataTable dtHead = new DataTable();
DataTable dtData = new DataTable();
List lstTitel = new List();
// 如果表头关键词为空,则从 0 索引开始查询
if (string.IsNullOrEmpty(imptDt.F_STAKEY))
{
if (string.IsNullOrEmpty(imptDt.F_ENDKEY))
throw SysExCore.ThrowFailException("EXECL 表体区,表头区混合模式下必须是 { 表体开始关键词为空,表体结束关键词不能为空 } ");
#region 初始化表头数据
BILL_ORDERGRP order = new BILL_ORDERGRP();
order.F_ISDELETE = 0;
order.F_ISSTOP = 0;
order.F_ADDUSERNO = loginName;
order.F_EDITUSERNO = loginName;
order.F_EDITTIME = DateTime.Now;
order.F_ADDTIME = DateTime.Now;
order.F_STATENUM = 0;
order.F_TYPENUM = busTypeVal;
foreach (DataColumn cel in execlDt.Columns)
{
dtHead.Columns.Add(cel.ColumnName);
}
bool IsEmtry = false;
var tlstHt = imBaseHtLst.Where(v => v.F_DATATYPE == "表体").ToList();
if (tlstHt.Count > 0)
{
#region 初始化表头对象,先从表体区找到表头的值
foreach (var ht in tlstHt)
{
var t = execlDt.Rows[0][ht.EXECLCELLNAME].ToString().Trim();
var val = RegexNot(t);
#region 表头单号
if (ht.DBCELLNAME == "F_NO")
{
if (string.IsNullOrEmpty(val))
{
SetProperties(order, "F_DEFINE15", ht.EXECLCELLNAME + ":不能为空");
}
else
{
SetProperties(order, ht.DBCELLNAME, busTypeVal + "_" + val);
}
}
#endregion
#region 表头供应商
else if (ht.DBCELLNAME == "F_SUPPLIERNO")
{
if (ht.F_ISNULL == 1 && string.IsNullOrEmpty(val))
{
SetProperties(order, "F_DEFINE15", ht.EXECLCELLNAME + ":不能为空");
}
else
{
if (!string.IsNullOrEmpty(val))
{
var sup = sugar.Queryable().Where(v => v.F_NO == val || v.F_NAME == val).First();
if (sup == null)
{
SetProperties(order, "F_DEFINE15", "供应商不存在");
}
}
}
}
#endregion
#region 表头客户
else if (ht.DBCELLNAME == "F_CUSTOMERNO")
{
if (ht.F_ISNULL == 1 && string.IsNullOrEmpty(val))
{
SetProperties(order, "F_DEFINE15", ht.EXECLCELLNAME + ":不能为空");
}
else
{
if (!string.IsNullOrEmpty(val))
{
var sup = sugar.Queryable().Where(v => v.F_NO == val || v.F_NAME == val).First();
if (sup == null)
{
SetProperties(order, "F_DEFINE15", "客户不存在");
}
}
}
}
#endregion
#region 设置字段
else
{
if (ht.F_ISNULL == 1)
{
if (string.IsNullOrEmpty(val))
{
SetProperties(order, "F_DEFINE15", ht.EXECLCELLNAME + ":不能为空");
}
else
SetProperties(order, ht.DBCELLNAME, val);
}
else
SetProperties(order, ht.DBCELLNAME, val);
}
#endregion
//if (!string.IsNullOrEmpty(val))
//{
// SetProperties(order, ht.DBCELLNAME, val);
//}
}
#endregion
}
#region 初始化表头对象,在找到表头区的值,目标是为了生成单号给表体。
for (int i = 0; i < execlDt.Rows.Count; i++)
{
IsEmtry = false;
foreach (DataColumn cel in execlDt.Columns)
{
if (!string.IsNullOrEmpty(execlDt.Rows[i][cel].ToString()))
{
IsEmtry = true;
break;
}
}
// 如果有有一列不为空,则正常走逻辑
if (IsEmtry)
{
if (execlDt.Rows[i][0].ToString() == imptDt.F_ENDKEY)
{
endIndex = i;
}
if (endIndex > 0)
{
heatStaIndex = i;
for (int l = 0; l < execlDt.Columns.Count; l++)
{
var ht = imBaseHtLst.Where(v => v.F_DATATYPE == "表头" && v.EXECLCELLNAME == execlDt.Rows[i][l].ToString()).FirstOrDefault();
if (ht != null)
{
var t = execlDt.Rows[i][l + 1].ToString();
var val = RegexNot(t);
#region 表头单号
if (ht.DBCELLNAME == "F_NO")
{
if (string.IsNullOrEmpty(val))
{
SetProperties(order, "F_DEFINE15", ht.EXECLCELLNAME + ":不能为空");
}
else
{
SetProperties(order, ht.DBCELLNAME, busTypeVal + "_" + val);
}
}
#endregion
#region 表头供应商
else if (ht.DBCELLNAME == "F_SUPPLIERNO")
{
if (ht.F_ISNULL == 1 && string.IsNullOrEmpty(val))
{
SetProperties(order, "F_DEFINE15", ht.EXECLCELLNAME + ":不能为空");
}
else
{
if (!string.IsNullOrEmpty(val))
{
var sup = sugar.Queryable().Where(v => v.F_NO == val || v.F_NAME == val).First();
if (sup == null)
{
SetProperties(order, "F_DEFINE15", "供应商不存在");
}
}
}
}
#endregion
#region 表头客户
else if (ht.DBCELLNAME == "F_CUSTOMERNO")
{
if (ht.F_ISNULL == 1 && string.IsNullOrEmpty(val))
{
SetProperties(order, "F_DEFINE15", ht.EXECLCELLNAME + ":不能为空");
}
else
{
if (!string.IsNullOrEmpty(val))
{
var sup = sugar.Queryable().Where(v => v.F_NO == val || v.F_NAME == val).First();
if (sup == null)
{
SetProperties(order, "F_DEFINE15", "客户不存在");
}
}
}
}
#endregion
#region 设置字段
else
{
if (ht.F_ISNULL == 1)
{
if (string.IsNullOrEmpty(val))
SetProperties(order, "F_DEFINE15", ht.EXECLCELLNAME + ":不能为空");
else
SetProperties(order, ht.DBCELLNAME, val);
}
else
SetProperties(order, ht.DBCELLNAME, val);
//if (!string.IsNullOrEmpty(val))
// SetProperties(order, ht.DBCELLNAME, val);
}
#endregion
}
}
}
}
}
#endregion
if (string.IsNullOrEmpty(order.F_NO))
throw SysExCore.ThrowFailException("EXECL 文件中未找到单号");
if (string.IsNullOrEmpty(order.F_NO))
throw SysExCore.ThrowFailException("单号不能为空");
// 如果F_DEFINE15等于空,表示EXECL文件中的数据是完整的。就开始验证数据库中的验证
if (string.IsNullOrEmpty(order.F_DEFINE15))
{
var torder = sugar.Queryable().Where(v => v.F_NO == order.F_NO).First();
if (torder != null)
{
if (torder.F_STATENUM > 0)
order.F_DEFINE15 = order.F_NO + ":单据已开始,无法重新覆盖";
}
}
lstOrder.Add(order);
#endregion
#region 初始化表体数据
endIndex = 0;
for (int i = 0; i < execlDt.Rows.Count; i++)
{
IsEmtry = false;
foreach (DataColumn cel in execlDt.Columns)
{
if (!string.IsNullOrEmpty(execlDt.Rows[i][cel].ToString()))
{
IsEmtry = true;
break;
}
}
// 如果有有一列不为空,则正常走逻辑
if (IsEmtry)
{
#region 非空的数据添加到临时 DataTable
if (execlDt.Rows[i][0].ToString() == imptDt.F_ENDKEY)
{
endIndex = i;
}
if (endIndex <= 0)
{
#region 表体对象初始化
BILL_ORDERITEM item = new BILL_ORDERITEM();
item.F_ROWNO = Guid.NewGuid().ToString();
item.F_ISSTOP = 0;
item.F_ISDELETE = 0;
item.F_ADDTIME = DateTime.Now;
item.F_EDITTIME = DateTime.Now;
item.F_ADDUSERNO = loginName;
item.F_EDITUSERNO = loginName;
item.F_ORDERNO = order.F_NO;
for (int l = 0; l < execlDt.Columns.Count; l++)
{
var dt = imBaseDtLst.Where(v => v.EXECLCELLNAME == execlDt.Columns[l].ToString()).FirstOrDefault();
if (dt != null)
{
if (dt.DBCELLNAME.Equals("F_ORDERNO"))
continue;
var t = execlDt.Rows[i][l].ToString();
var val = RegexNot(t);
#region 物料
if (dt.DBCELLNAME == "F_MATNO")
{
item.F_MATNO = val;
if (string.IsNullOrEmpty(val))
{
SetProperties(item, "F_DEFINE10", dt.EXECLCELLNAME + ":不能为空");
}
else
{
var mat = sugar.Queryable().Where(v => v.F_NO == val).First();
if (mat == null)
item.F_DEFINE10 = val + ":物料不存在";
else
{
if (mat.F_QCTYPECODE == null)
{
item.F_DEFINE10 = val + ":质检标示不完全";
}
else if (int.Parse(mat.F_QCTYPECODE) <= 0 || int.Parse(mat.F_QCTYPECODE) >= 4)
{
item.F_DEFINE10 = val + ":质检标示不是可识别的标识";
}
else
{
item.F_MATNAME = mat.F_NAME;
item.F_UNITNO = mat.F_BASEUNITNO;
}
}
}
}
#endregion
else
{
if (dt.F_ISNULL == 1)
{
if (string.IsNullOrEmpty(val))
SetProperties(item, "F_DEFINE10", dt.EXECLCELLNAME + ":不能为空");
else
SetProperties(item, dt.DBCELLNAME, val);
}
else
SetProperties(item, dt.DBCELLNAME, val);
}
}
}
lstItem.Add(item);
#endregion
}
#endregion
}
}
#endregion
}
else
{
// 表体开始不能为空,表体结束不能为空
if (string.IsNullOrEmpty(imptDt.F_ENDKEY) || string.IsNullOrEmpty(imptDt.F_STAKEY))
throw SysExCore.ThrowFailException("EXECL表头区,表体区,表尾区混合模式下。{ 表体的开始关键词和表体的结束关键词不能为空 }");
#region 初始化表头
BILL_ORDERGRP order = new BILL_ORDERGRP();
order.F_ISDELETE = 0;
order.F_ISSTOP = 0;
order.F_ADDUSERNO = loginName;
order.F_EDITUSERNO = loginName;
order.F_EDITTIME = DateTime.Now;
order.F_ADDTIME = DateTime.Now;
order.F_STATENUM = 0;
order.F_TYPENUM = busTypeVal;
var celName = string.Empty;
var celVal = string.Empty;
// 保存源列名和表体列名的关系
// 0:源列名
// 1:表体列名
List lstKeys = new List();
bool isNull = false;
for (int i = 0; i < execlDt.Rows.Count; i++)
{
isNull = false;
foreach (DataColumn cel in execlDt.Columns)
{
if (!string.IsNullOrEmpty(execlDt.Rows[i][cel].ToString()))
{
isNull = true;
break;
}
}
if (isNull)
{
if (execlDt.Rows[i][0].ToString() == imptDt.F_STAKEY)
{
staIndex = i;
foreach (DataColumn cel in execlDt.Columns)
{
lstKeys.Add(new string[] { cel.ColumnName, execlDt.Rows[i][cel].ToString() });
}
heatStaIndex = i;
continue;
}
if (execlDt.Rows[i][0].ToString() == imptDt.F_ENDKEY)
{
endIndex = i;
}
if (staIndex > 0 && endIndex <= 0 && lstKeys.Count > 0)
{
// 如果表头中的数据存在表体,则初始化对象
#region 初始化表头数据
// 查询表头的数据中是否在表体
var tlstHt = imBaseHtLst.Where(v => v.F_DATATYPE == "表体");
if (tlstHt != null)
{
if (tlstHt.Count() > 0)
{
foreach (var dt in tlstHt)
{
var cel = lstKeys.Where(v => v[1] == dt.EXECLCELLNAME).FirstOrDefault();
if (cel != null)
{
var t = execlDt.Rows[i][cel[0]].ToString();
var val = RegexNot(t);
#region 表头单号
if (dt.DBCELLNAME == "F_NO")
{
if (string.IsNullOrEmpty(val))
{
SetProperties(order, "F_DEFINE15", dt.EXECLCELLNAME + ":不能为空");
}
else
{
SetProperties(order, dt.DBCELLNAME, busTypeVal + "_" + val);
}
}
#endregion
#region 表头供应商
else if (dt.DBCELLNAME == "F_SUPPLIERNO")
{
if (dt.F_ISNULL == 1 && string.IsNullOrEmpty(val))
{
SetProperties(order, "F_DEFINE15", dt.EXECLCELLNAME + ":不能为空");
}
else
{
if (!string.IsNullOrEmpty(val))
{
var sup = sugar.Queryable().Where(v => v.F_NO == val || v.F_NAME == val).First();
if (sup == null)
{
SetProperties(order, "F_DEFINE15", "供应商不存在");
}
}
}
}
#endregion
#region 表头客户
else if (dt.DBCELLNAME == "F_CUSTOMERNO")
{
if (dt.F_ISNULL == 1 && string.IsNullOrEmpty(val))
{
SetProperties(order, "F_DEFINE15", dt.EXECLCELLNAME + ":不能为空");
}
else
{
if (!string.IsNullOrEmpty(val))
{
var sup = sugar.Queryable().Where(v => v.F_NO == val || v.F_NAME == val).First();
if (sup == null)
{
SetProperties(order, "F_DEFINE15", "客户不存在");
}
}
}
}
#endregion
#region 设置字段
else
{
if (dt.F_ISNULL == 1)
{
if (string.IsNullOrEmpty(val))
{
SetProperties(order, "F_DEFINE15", dt.EXECLCELLNAME + ":不能为空");
}
else
SetProperties(order, dt.DBCELLNAME, val);
}
else
SetProperties(order, dt.DBCELLNAME, val);
}
#endregion
}
}
}
}
#endregion
}
if (staIndex <= 0 || endIndex > 0)
{
for (int l = 0; l < execlDt.Columns.Count; l++)
{
celName = execlDt.Rows[i][l].ToString();
if (!string.IsNullOrEmpty(celName))
{
var imp = imBaseHtLst.Where(v => celName.Contains(v.EXECLCELLNAME) && v.F_DATATYPE == "表头").FirstOrDefault();
if (imp != null)
{
var t = execlDt.Rows[i][l + 1].ToString();
celVal = RegexNot(t);
#region 表头单号
if (imp.DBCELLNAME == "F_NO")
{
if (string.IsNullOrEmpty(celVal))
{
SetProperties(order, "F_DEFINE15", imp.EXECLCELLNAME + ":不能为空");
}
else
{
SetProperties(order, imp.DBCELLNAME, busTypeVal + "_" + celVal);
}
}
#endregion
#region 表头供应商
else if (imp.DBCELLNAME == "F_SUPPLIERNO")
{
if (imp.F_ISNULL == 1 && string.IsNullOrEmpty(celVal))
{
SetProperties(order, "F_DEFINE15", imp.EXECLCELLNAME + ":不能为空");
}
else
{
if (!string.IsNullOrEmpty(celVal))
{
var sup = sugar.Queryable().Where(v => v.F_NO == celVal || v.F_NAME == celVal).First();
if (sup == null)
{
SetProperties(order, "F_DEFINE15", "供应商不存在");
}
}
}
}
#endregion
#region 表头客户
else if (imp.DBCELLNAME == "F_CUSTOMERNO")
{
if (imp.F_ISNULL == 1 && string.IsNullOrEmpty(celVal))
{
SetProperties(order, "F_DEFINE15", imp.EXECLCELLNAME + ":不能为空");
}
else
{
if (!string.IsNullOrEmpty(celVal))
{
var sup = sugar.Queryable().Where(v => v.F_NO == celVal || v.F_NAME == celVal).First();
if (sup == null)
{
SetProperties(order, "F_DEFINE15", "客户不存在");
}
}
}
}
#endregion
#region 设置字段
else
{
if (imp.F_ISNULL == 1)
{
if (string.IsNullOrEmpty(celVal))
{
SetProperties(order, "F_DEFINE15", imp.EXECLCELLNAME + ":不能为空");
}
else
SetProperties(order, imp.DBCELLNAME, celVal);
}
else
SetProperties(order, imp.DBCELLNAME, celVal);
}
#endregion
}
}
}
}
}
}
#endregion
if (string.IsNullOrEmpty(order.F_NO))
throw SysExCore.ThrowFailException("单号不能为空");
// 如果F_DEFINE15等于空,表示EXECL文件中的数据是完整的。就开始验证数据库中的验证
if (string.IsNullOrEmpty(order.F_DEFINE15))
{
var torder = sugar.Queryable().Where(v => v.F_NO == order.F_NO).First();
if (torder != null)
{
if (torder.F_STATENUM > 0)
order.F_DEFINE15 = order.F_NO + ":单据已开始,无法重新覆盖";
}
}
lstOrder.Add(order);
staIndex = 0; endIndex = 0;
#region 初始化表体数据
for (int i = 0; i < execlDt.Rows.Count; i++)
{
isNull = false;
foreach (DataColumn cel in execlDt.Columns)
{
if (!string.IsNullOrEmpty(execlDt.Rows[i][cel].ToString()))
{
isNull = true;
break;
}
}
if (isNull)
{
if (execlDt.Rows[i][0].ToString() == imptDt.F_STAKEY)
{
staIndex = i;
continue;
}
if (execlDt.Rows[i][0].ToString() == imptDt.F_ENDKEY)
{
endIndex = i;
}
if (staIndex > 0 && endIndex <= 0 && lstKeys.Count > 0)
{
if (string.IsNullOrEmpty(order.F_NO))
throw SysExCore.ThrowFailException("单据编号值不能为空");
BILL_ORDERITEM item = new BILL_ORDERITEM();
item.F_ROWNO = Guid.NewGuid().ToString();
item.F_ISSTOP = 0;
item.F_ISDELETE = 0;
item.F_ADDTIME = DateTime.Now;
item.F_EDITTIME = DateTime.Now;
item.F_ADDUSERNO = loginName;
item.F_EDITUSERNO = loginName;
item.F_ORDERNO = order.F_NO;
foreach (var cel in lstKeys)
{
if (cel[1] == "PO单号")
{
}
//if (!string.IsNullOrEmpty(execlDt.Rows[i][cel[0]].ToString()))
//{
var impt = imBaseDtLst.Where(v => v.EXECLCELLNAME == cel[1]).FirstOrDefault();
if (impt != null)
{
var t = execlDt.Rows[i][cel[0]].ToString();
var val = RegexNot(t);
if (impt.DBCELLNAME.Equals("F_ORDERNO"))
continue;
#region 物料
if (impt.DBCELLNAME == "F_MATNO")
{
item.F_MATNO = val;
if (string.IsNullOrEmpty(val))
{
SetProperties(item, "F_DEFINE10", impt.EXECLCELLNAME + ":不能为空");
}
else
{
var mat = sugar.Queryable().Where(v => v.F_NO == val).First();
if (mat == null)
item.F_DEFINE10 = val + ":物料不存在";
else
{
if (mat.F_QCTYPECODE == null)
{
item.F_DEFINE10 = val + ":质检标示不完全";
}
else if (int.Parse(mat.F_QCTYPECODE) <= 0 || int.Parse(mat.F_QCTYPECODE) >= 4)
{
item.F_DEFINE10 = val + ":质检标示不是可识别的标识";
}
else
{
item.F_MATNAME = mat.F_NAME;
item.F_UNITNO = mat.F_BASEUNITNO;
}
}
}
}
#endregion
else
{
if (impt.F_ISNULL == 1)
{
if (string.IsNullOrEmpty(val))
SetProperties(item, "F_DEFINE10", impt.EXECLCELLNAME + ":不能为空");
else
SetProperties(item, impt.DBCELLNAME, val);
}
else
SetProperties(item, impt.DBCELLNAME, val);
}
}
}
lstItem.Add(item);
}
}
}
#endregion
}
#endregion
}
else
{
// 全表体混合模式,关键字段 [单号] ,在 EXECL 中必须用 [单号字样表示]
if (!execlDt.Columns.Contains("单号"))
throw SysExCore.ThrowFailException("EXECL表体区混合模式下, EXECL 文件中必须包含 [ 单号 ] 关键字");
if (imBaseHtLst.Where(v => v.EXECLCELLNAME == "单号").FirstOrDefault() == null)
throw SysExCore.ThrowFailException("表头字段配置参数列表中必须包含 [ 单号 ] 关系列");
if (imBaseDtLst.Where(v => v.EXECLCELLNAME == "单号").FirstOrDefault() == null)
throw SysExCore.ThrowFailException("表体字段配置参数列表中必须包含 [ 单号 ] 关系列");
#region EXECL 数据库表头 主、子 表数据,混合在 EXECL 表体区
// 临时表体源
DataTable temDt = new DataTable();
// 判断是否指定了开始行的关键词
if (!string.IsNullOrEmpty(imptDt.F_STAKEY))
{
// 如果指定了关键词,则将EXECL中的表体区数据抠出。
#region 将EXECL表体区的数据抠出来放在 temDt
// 保存源列名和现列名的关系
List lstTitel = new List();
for (int i = 0; i < execlDt.Rows.Count; i++)
{
if (execlDt.Rows[i][0].ToString() == imptDt.F_STAKEY)
{
staIndex = i;
}
if (execlDt.Rows[i][0].ToString() == imptDt.F_ENDKEY)
{
endIndex = i;
}
if (staIndex == i)
{
foreach (DataColumn cel in execlDt.Columns)
{
if (!execlDt.Rows[staIndex][cel].ToString().Contains("提交结果:"))
{
if (string.IsNullOrEmpty(execlDt.Rows[staIndex][cel].ToString().Trim()))
throw SysExCore.ThrowFailException("表体区的表头不能为空");
string[] s = new string[] { cel.ColumnName, execlDt.Rows[staIndex][cel].ToString().Trim() };
lstTitel.Add(s);
temDt.Columns.Add(execlDt.Rows[staIndex][cel].ToString().Trim());
}
}
}
if (i > staIndex && lstTitel.Count > 0)
{
if (endIndex <= 0)
{
var di = temDt.Rows.Count;
temDt.Rows.Add(1);
foreach (var ls in lstTitel)
{
temDt.Rows[di][ls[1]] = execlDt.Rows[i][ls[0]];
}
}
}
}
#endregion
}
else
{
// 如果未制定关键词,则按照源
temDt = execlDt;
}
#region 转换对象
var F_NOLst = from t in temDt.AsEnumerable()
group t by new { F_NO = t.Field("单号"), } into m
select new { F_NO = m.Key.F_NO };
foreach (var F_NO in F_NOLst)
{
if (string.IsNullOrEmpty(F_NO.F_NO))
continue;
var F_NORow = temDt.Select("单号='" + F_NO.F_NO + "'");
if (F_NORow.Length <= 0)
throw SysExCore.ThrowFailException("未找到数据信息");
#region 初始化表头
BILL_ORDERGRP order = new BILL_ORDERGRP();
order.F_ISDELETE = 0;
order.F_ISSTOP = 0;
order.F_ADDUSERNO = loginName;
order.F_EDITUSERNO = loginName;
order.F_EDITTIME = DateTime.Now;
order.F_ADDTIME = DateTime.Now;
order.F_TYPENUM = busTypeVal;
order.F_STATENUM = 0;
foreach (var imbase in imBaseHtLst)
{
if (temDt.Columns.Contains(imbase.EXECLCELLNAME))
{
var t = F_NORow[0][imbase.EXECLCELLNAME].ToString().Trim();
var val = RegexNot(t);
#region 表头单号
if (imbase.DBCELLNAME == "F_NO")
{
if (string.IsNullOrEmpty(val))
{
SetProperties(order, "F_DEFINE15", imbase.EXECLCELLNAME + ":不能为空");
}
else
{
SetProperties(order, imbase.DBCELLNAME, busTypeVal + "_" + val);
}
}
#endregion
#region 表头供应商
else if (imbase.DBCELLNAME == "F_SUPPLIERNO")
{
if (imbase.F_ISNULL == 1 && string.IsNullOrEmpty(val))
{
SetProperties(order, "F_DEFINE15", imbase.EXECLCELLNAME + ":不能为空");
}
else
{
if (!string.IsNullOrEmpty(val))
{
var sup = sugar.Queryable().Where(v => v.F_NO == val || v.F_NAME == val).First();
if (sup == null)
{
SetProperties(order, "F_DEFINE15", "供应商不存在");
}
}
}
}
#endregion
#region 表头客户
else if (imbase.DBCELLNAME == "F_CUSTOMERNO")
{
if (imbase.F_ISNULL == 1 && string.IsNullOrEmpty(val))
{
SetProperties(order, "F_DEFINE15", imbase.EXECLCELLNAME + ":不能为空");
}
else
{
if (!string.IsNullOrEmpty(val))
{
var sup = sugar.Queryable().Where(v => v.F_NO == val || v.F_NAME == val).First();
if (sup == null)
{
SetProperties(order, "F_DEFINE15", "客户不存在");
}
}
}
}
#endregion
#region 设置字段
else
{
if (imbase.F_ISNULL == 1)
{
if (string.IsNullOrEmpty(val))
{
SetProperties(order, "F_DEFINE15", imbase.EXECLCELLNAME + ":不能为空");
}
else
SetProperties(order, imbase.DBCELLNAME, val);
}
else
SetProperties(order, imbase.DBCELLNAME, val);
}
#endregion
}
}
#endregion
if (string.IsNullOrEmpty(order.F_NO))
throw SysExCore.ThrowFailException("单号不能为空");
// 如果F_DEFINE15等于空,表示EXECL文件中的数据是完整的。就开始验证数据库中的验证
if (string.IsNullOrEmpty(order.F_DEFINE15))
{
var torder = sugar.Queryable().Where(v => v.F_NO == order.F_NO).First();
if (torder != null)
{
if (torder.F_STATENUM > 0)
order.F_DEFINE15 = order.F_NO + ":单据已开始,无法重新覆盖";
}
}
lstOrder.Add(order);
#region 初始化表体
foreach (DataRow row in F_NORow)
{
BILL_ORDERITEM item = new BILL_ORDERITEM();
item.F_ROWNO = Guid.NewGuid().ToString();
item.F_ISSTOP = 0;
item.F_ISDELETE = 0;
item.F_ADDTIME = DateTime.Now;
item.F_EDITTIME = DateTime.Now;
item.F_ADDUSERNO = loginName;
item.F_EDITUSERNO = loginName;
item.F_ORDERNO = order.F_NO;
if (busTypeVal == 17)
{
item.F_MATSTATENUM = 1;
}
foreach (var imbase in imBaseDtLst)
{
var t = row[imbase.EXECLCELLNAME].ToString();
var val = RegexNot(t);
#region 物料状态
if (imbase.DBCELLNAME.Equals("F_ORDERNO"))
continue;
// 判断物料状态
if (imbase.DBCELLNAME.Equals("F_MATSTATENUM"))
{
if (!string.IsNullOrEmpty(val))
{
EMatState ot = (EMatState)Enum.Parse(typeof(EMatState), val);
SetProperties(item, imbase.DBCELLNAME, ((int)ot).ToString());
}
else
{
SetProperties(item, imbase.DBCELLNAME, "0");
}
}
#endregion
#region 物料
else if (imbase.DBCELLNAME == "F_MATNO")
{
item.F_MATNO = val;
if (string.IsNullOrEmpty(val))
{
SetProperties(item, "F_DEFINE10", imbase.EXECLCELLNAME + ":不能为空");
}
else
{
var mat = sugar.Queryable().Where(v => v.F_NO == val).First();
if (mat == null)
item.F_DEFINE10 = val + ":物料不存在";
else
{
if (mat.F_QCTYPECODE == null)
{
item.F_DEFINE10 = val + ":质检标示不完全";
}
else if (int.Parse(mat.F_QCTYPECODE) <= 0 || int.Parse(mat.F_QCTYPECODE) >= 4)
{
item.F_DEFINE10 = val + ":质检标示不是可识别的标识";
}
else
{
item.F_MATNAME = mat.F_NAME;
item.F_UNITNO = mat.F_BASEUNITNO;
}
}
}
}
#endregion
#region 设置字段
else
{
if (imbase.F_ISNULL == 1)
{
if (string.IsNullOrEmpty(val))
SetProperties(item, "F_DEFINE10", imbase.EXECLCELLNAME + ":不能为空");
else
SetProperties(item, imbase.DBCELLNAME, val);
}
else
{
SetProperties(item, imbase.DBCELLNAME, val);
}
}
#endregion
}
lstItem.Add(item);
}
#endregion
}
#endregion
#endregion
}
var vvv = lstOrder;
var bbb = lstItem;
#region MyRegion
#endregion
#region 数据库操作
if (lstItem.Count <= 0)
throw SysExCore.ThrowFailException("表体数据未空,无法导入");
if (lstOrder.Where(v => !string.IsNullOrEmpty(v.F_DEFINE15)).FirstOrDefault() == null && lstItem.Where(v => !string.IsNullOrEmpty(v.F_DEFINE10)).FirstOrDefault() == null)
{
try
{
int f = 0;
sugar.BeginTran();
foreach (var order in lstOrder)
{
f = 0;
var dbOrder = sugar.Queryable().Where(v => v.F_NO == order.F_NO).First();
if (dbOrder == null)
{
f = sugar.Insertable(order).ExecuteCommand();
if (f > 0)
{
f = sugar.Insertable(lstItem.Where(v => v.F_ORDERNO == order.F_NO).ToArray()).ExecuteCommand();
}
}
else
{
if (dbOrder.F_ISDELETE == 1 || dbOrder.F_ISSTOP == 1)
throw new Exception("此单据已经停用或者已经被删除,无法导入");
if (order.F_STATENUM < 3)
{
foreach (var item in lstItem)
{
//EOrderType _EOrderType = EOrderType.Check_In_FG;
if (order.F_TYPENUM == 7)
{
var SSS = item.F_FROMORDERNO;
if (item.F_FROMORDERNO.Split('_').Count() <= 1)
{
SSS = "SAP05" + "_" + item.F_FROMORDERNO;
}
var or5 = sugar.Queryable().Where(v => v.F_NO == SSS).First();
if (or5 == null)
throw new Exception("未找到PO指令单号");
}
else if (order.F_TYPENUM == 6)
{
var or5 = sugar.Queryable().Where(v => v.F_NO == order.F_NO).First();
if (or5 != null)
throw new Exception("INB单不允许重复导入");
}
else if (order.F_TYPENUM == 37)
{
var SSS = item.F_FROMORDERNO;
if (item.F_FROMORDERNO.Split('_').Count() <= 1)
{
SSS = "SAP06" + "_" + item.F_FROMORDERNO;
}
var or5 = sugar.Queryable().Where(v => v.F_NO == SSS).First();
if (or5 == null)
throw new Exception("未找到INB指令单号");
}
var dbItem = sugar.Queryable().Where(v => v.F_ORDERNO == order.F_NO && v.F_MATNO == item.F_MATNO).First();
if (dbItem == null)
{
f = sugar.Insertable(item).ExecuteCommand();
}
else
{
// 如果WMS的操作数量大于本次修改的计划量,将不允许修改
if (dbItem.F_AQTY > item.F_FQTY)
{
item.F_DEFINE10 = "计划量不能小于实际量";
}
else
{
dbItem.F_AQTY = item.F_AQTY;
f = sugar.Updateable(dbItem).ExecuteCommand();
}
}
}
}
else
{
order.F_DEFINE15 = string.Format("单据状态:<{0}>操作失败", order.F_NO);
}
}
}
sugar.CommitTran();
}
catch (Exception ex)
{
sugar.RollbackTran();
lstOrder.ForEach(w => w.F_DEFINE15 = ex.Message);
lstItem.ForEach(w => w.F_DEFINE10 = ex.Message);
}
}
#endregion
if (lstOrder.Where(v => !string.IsNullOrEmpty(v.F_DEFINE15)).FirstOrDefault() != null || lstItem.Where(v => !string.IsNullOrEmpty(v.F_DEFINE10)).FirstOrDefault() != null)
{
DataTable dtSouse = new DataTable();
dtSouse.Columns.Add("数据类型");
dtSouse.Columns.Add("数据值");
dtSouse.Columns.Add("原因");
var heat = lstOrder.Where(v => !string.IsNullOrEmpty(v.F_DEFINE15)).ToArray();
if (heat.Count() > 0)
{
foreach (var item in heat)
{
dtSouse.Rows.Add("表头", item.F_NO, item.F_DEFINE15);
}
}
var data = lstItem.Where(v => !string.IsNullOrEmpty(v.F_DEFINE10)).ToArray();
if (data.Count() > 0)
{
foreach (var item in data)
{
dtSouse.Rows.Add("表体", item.F_MATNO, item.F_DEFINE10);
}
}
if (dtSouse.Rows.Count > 0)
{
ExcelConfig cof = new ExcelConfig();
//cof.FileName = @"D:\Project\科勒\EXECL\ERR222.xls"; // 文件名 只能是 xls格式
cof.Title = "导入时异常信息"; // 文件名
cof.TitlePoint = 18; // 标题字号
cof.HeadPoint = 14;// 列头字号
cof.IsAllSizeColumn = true; // 列宽自适应
cof.ColumnEntity = new List() {
new ColumnModel(){Column = "数据类型",ExcelColumn = "数据类型"},
new ColumnModel(){Column = "数据值",ExcelColumn = "数据值"},
new ColumnModel(){Column = "原因",ExcelColumn = "原因",Background=Color.Red},
};
json.Type = 1;
json.Message = "导入失败";
json.dtSou = dtSouse;
json.ExeclCfg = cof;
//ExcelHelper.ExcelExport(dtSouse, cof);
}
else
{
json.Type = 2;
json.Message = "导入成功";
}
}
else
{
json.Type = 2;
json.Message = "导入成功";
}
}
catch (Exception ex)
{
json.Type = 0;
json.Message = ex.Message;
}
finally
{
sugar.Dispose();
}
return json;
}
///
/// 通用单据导入方法(没有任何验证)
///
///
///
///
///
public JsonExecl ImportOrderData(DataTable dtExeclSouse, int busTypeVal, string loginName)
{
JsonExecl json = new JsonExecl();
json.Type = 0;
// busType
SqlSugarClient sugar = SysDbCore.GetDbCtx();
try
{
if (dtExeclSouse == null)
throw SysExCore.ThrowFailException("数据源不能为null");
if (dtExeclSouse.Rows.Count <= 0)
throw SysExCore.ThrowFailException("数据源数据行数必须大于0");
// 获取源数据
DataTable execlDt = dtExeclSouse;//ExcelHelper.ExcelImport(filePath, 0, 0);
EOrderType otype = (EOrderType)busTypeVal;
List importLst = null;
#region 获取数据库参数配置
if (busTypeVal == 0)
throw SysExCore.ThrowFailException("单据类型异常");
else if (busTypeVal > 0)
// 获取参数配置
importLst = sugar.Queryable().Where(v => v.BUSINSERTVAL == busTypeVal).ToList();
else if (busTypeVal == -1 || busTypeVal == -2)
{
busTypeVal = 7; // PO收货单(中)
if (busTypeVal == -1)
importLst = sugar.Queryable().Where(v => new string[] { "9", "10" }.Contains(v.F_NO)).ToList();
else // PO收货单(英)
importLst = sugar.Queryable().Where(v => new string[] { "50", "51" }.Contains(v.F_NO)).ToList();
}
else
{
throw SysExCore.ThrowFailException("未识别的单据类型");
}
if (importLst.Count <= 0)
throw SysExCore.ThrowFailException("未找到配置参数");
var imptHt = importLst.Where(v => v.STRUCTURE == "表头").FirstOrDefault();
if (imptHt == null)
throw SysExCore.ThrowFailException("单据导入必须有表头参数定义");
// 获取表体参数
var imptDt = importLst.Where(v => v.STRUCTURE == "表体").FirstOrDefault();
if (imptDt == null)
throw SysExCore.ThrowFailException("单据导入必须有表体参数定义");
var imBaseHtLst = sugar.Queryable().Where(v => v.F_NO == imptHt.F_NO).ToList();
var imBaseDtLst = sugar.Queryable().Where(v => v.F_NO == imptDt.F_NO).ToList();
if (imBaseHtLst.Count <= 0 || imBaseDtLst.Count <= 0)
throw SysExCore.ThrowFailException("未找到字段参数的配置");
#endregion
// string busType = busTypeVal;//imptHt.BUSINESSTYPE;
// 表体区开始索引
int staIndex = 0;
// 表体区结束索引
int endIndex = 0;
int heatStaIndex = 0;
Dictionary dicKeys = new Dictionary();
List lstOrder = new List();
List lstItem = new List();
// 判断表头数据是否在 EXECL 的表头数据中
if (imBaseHtLst.Where(v => v.F_DATATYPE == "表头").FirstOrDefault() != null)
{
#region EXECL 表头表体数据混合模式
DataTable dtHead = new DataTable();
DataTable dtData = new DataTable();
List lstTitel = new List();
// 如果表头关键词为空,则从 0 索引开始查询
if (string.IsNullOrEmpty(imptDt.F_STAKEY))
{
if (string.IsNullOrEmpty(imptDt.F_ENDKEY))
throw SysExCore.ThrowFailException("EXECL 表体区,表头区混合模式下必须是 { 表体开始关键词为空,表体结束关键词不能为空 } ");
#region 初始化表头数据
BILL_ORDERGRP order = new BILL_ORDERGRP();
order.F_ISDELETE = 0;
order.F_ISSTOP = 0;
order.F_ADDUSERNO = loginName;
order.F_EDITUSERNO = loginName;
order.F_EDITTIME = DateTime.Now;
order.F_ADDTIME = DateTime.Now;
order.F_STATENUM = 0;
order.F_TYPENUM = busTypeVal;
foreach (DataColumn cel in execlDt.Columns)
{
dtHead.Columns.Add(cel.ColumnName);
}
bool IsEmtry = false;
var tlstHt = imBaseHtLst.Where(v => v.F_DATATYPE == "表体").ToList();
if (tlstHt.Count > 0)
{
#region 初始化表头对象,先从表体区找到表头的值
foreach (var ht in tlstHt)
{
var t = execlDt.Rows[0][ht.EXECLCELLNAME].ToString().Trim();
var val = RegexNot(t);
if (ht.F_ISNULL == 1)
{
if (string.IsNullOrEmpty(val))
{
SetProperties(order, "F_DEFINE15", ht.EXECLCELLNAME + ":不能为空");
}
else
SetProperties(order, ht.DBCELLNAME, val);
}
else
SetProperties(order, ht.DBCELLNAME, val);
}
#endregion
}
#region 初始化表头对象,在找到表头区的值,目标是为了生成单号给表体。
for (int i = 0; i < execlDt.Rows.Count; i++)
{
IsEmtry = false;
foreach (DataColumn cel in execlDt.Columns)
{
if (!string.IsNullOrEmpty(execlDt.Rows[i][cel].ToString()))
{
IsEmtry = true;
break;
}
}
// 如果有有一列不为空,则正常走逻辑
if (IsEmtry)
{
if (execlDt.Rows[i][0].ToString() == imptDt.F_ENDKEY)
{
endIndex = i;
}
if (endIndex > 0)
{
heatStaIndex = i;
for (int l = 0; l < execlDt.Columns.Count; l++)
{
var ht = imBaseHtLst.Where(v => v.F_DATATYPE == "表头" && v.EXECLCELLNAME == execlDt.Rows[i][l].ToString()).FirstOrDefault();
if (ht != null)
{
var t = execlDt.Rows[i][l + 1].ToString();
var val = RegexNot(t);
if (ht.F_ISNULL == 1)
{
if (string.IsNullOrEmpty(val))
SetProperties(order, "F_DEFINE15", ht.EXECLCELLNAME + ":不能为空");
else
SetProperties(order, ht.DBCELLNAME, val);
}
else
SetProperties(order, ht.DBCELLNAME, val);
}
}
}
}
}
#endregion
if (string.IsNullOrEmpty(order.F_NO))
throw SysExCore.ThrowFailException("EXECL 文件中未找到单号");
if (string.IsNullOrEmpty(order.F_NO))
throw SysExCore.ThrowFailException("单号不能为空");
lstOrder.Add(order);
#endregion
#region 初始化表体数据
endIndex = 0;
for (int i = 0; i < execlDt.Rows.Count; i++)
{
IsEmtry = false;
foreach (DataColumn cel in execlDt.Columns)
{
if (!string.IsNullOrEmpty(execlDt.Rows[i][cel].ToString()))
{
IsEmtry = true;
break;
}
}
// 如果有有一列不为空,则正常走逻辑
if (IsEmtry)
{
#region 非空的数据添加到临时 DataTable
if (execlDt.Rows[i][0].ToString() == imptDt.F_ENDKEY)
{
endIndex = i;
}
if (endIndex <= 0)
{
#region 表体对象初始化
BILL_ORDERITEM item = new BILL_ORDERITEM();
item.F_ROWNO = Guid.NewGuid().ToString();
item.F_ISSTOP = 0;
item.F_ISDELETE = 0;
item.F_ADDTIME = DateTime.Now;
item.F_EDITTIME = DateTime.Now;
item.F_ADDUSERNO = loginName;
item.F_EDITUSERNO = loginName;
item.F_ORDERNO = order.F_NO;
item.F_LOCKSTATUS = (int)ELOCKSTATUS.NoLockStatus;
for (int l = 0; l < execlDt.Columns.Count; l++)
{
var dt = imBaseDtLst.Where(v => v.EXECLCELLNAME == execlDt.Columns[l].ToString()).FirstOrDefault();
if (dt != null)
{
if (dt.DBCELLNAME.Equals("F_ORDERNO"))
continue;
var t = execlDt.Rows[i][l].ToString();
var val = RegexNot(t);
// 物料状态
if (dt.DBCELLNAME.Equals("F_MATSTATENUM"))
{
var matstate = sugar.Queryable().Where(v => v.F_PNO == "EMatState" && (v.F_NAME == val)).First();
if (matstate == null)
SetProperties(item, "F_DEFINE10", dt.EXECLCELLNAME + ":选中的值《" + val + "》不存在");
else
SetProperties(item, dt.DBCELLNAME, matstate.F_NUM.ToString());
continue;
}
if (dt.F_ISNULL == 1)
{
if (string.IsNullOrEmpty(val))
SetProperties(item, "F_DEFINE10", dt.EXECLCELLNAME + ":不能为空");
else
SetProperties(item, dt.DBCELLNAME, val);
}
else
SetProperties(item, dt.DBCELLNAME, val);
}
}
lstItem.Add(item);
#endregion
}
#endregion
}
}
#endregion
}
else
{
// 表体开始不能为空,表体结束不能为空
if (string.IsNullOrEmpty(imptDt.F_ENDKEY) || string.IsNullOrEmpty(imptDt.F_STAKEY))
throw SysExCore.ThrowFailException("EXECL表头区,表体区,表尾区混合模式下。{ 表体的开始关键词和表体的结束关键词不能为空 }");
#region 初始化表头
BILL_ORDERGRP order = new BILL_ORDERGRP();
order.F_ISDELETE = 0;
order.F_ISSTOP = 0;
order.F_ADDUSERNO = loginName;
order.F_EDITUSERNO = loginName;
order.F_EDITTIME = DateTime.Now;
order.F_ADDTIME = DateTime.Now;
order.F_STATENUM = 0;
order.F_TYPENUM = busTypeVal;
var celName = string.Empty;
var celVal = string.Empty;
// 保存源列名和表体列名的关系
// 0:源列名
// 1:表体列名
List lstKeys = new List();
bool isNull = false;
for (int i = 0; i < execlDt.Rows.Count; i++)
{
isNull = false;
foreach (DataColumn cel in execlDt.Columns)
{
if (!string.IsNullOrEmpty(execlDt.Rows[i][cel].ToString()))
{
isNull = true;
break;
}
}
if (isNull)
{
if (execlDt.Rows[i][0].ToString() == imptDt.F_STAKEY)
{
staIndex = i;
foreach (DataColumn cel in execlDt.Columns)
{
lstKeys.Add(new string[] { cel.ColumnName, execlDt.Rows[i][cel].ToString() });
}
heatStaIndex = i;
continue;
}
if (execlDt.Rows[i][0].ToString() == imptDt.F_ENDKEY)
{
endIndex = i;
}
if (staIndex > 0 && endIndex <= 0 && lstKeys.Count > 0)
{
// 如果表头中的数据存在表体,则初始化对象
#region 初始化表头数据
// 查询表头的数据中是否在表体
var tlstHt = imBaseHtLst.Where(v => v.F_DATATYPE == "表体");
if (tlstHt != null)
{
if (tlstHt.Count() > 0)
{
foreach (var dt in tlstHt)
{
var cel = lstKeys.Where(v => v[1] == dt.EXECLCELLNAME).FirstOrDefault();
if (cel != null)
{
var t = execlDt.Rows[i][cel[0]].ToString();
var val = RegexNot(t);
if (dt.F_ISNULL == 1)
{
if (string.IsNullOrEmpty(val))
{
SetProperties(order, "F_DEFINE15", dt.EXECLCELLNAME + ":不能为空");
}
else
SetProperties(order, dt.DBCELLNAME, val);
}
else
SetProperties(order, dt.DBCELLNAME, val);
}
}
}
}
#endregion
}
if (staIndex <= 0 || endIndex > 0)
{
for (int l = 0; l < execlDt.Columns.Count; l++)
{
celName = execlDt.Rows[i][l].ToString();
if (!string.IsNullOrEmpty(celName))
{
var imp = imBaseHtLst.Where(v => celName.Contains(v.EXECLCELLNAME) && v.F_DATATYPE == "表头").FirstOrDefault();
if (imp != null)
{
var t = execlDt.Rows[i][l + 1].ToString();
celVal = RegexNot(t);
if (imp.F_ISNULL == 1)
{
if (string.IsNullOrEmpty(celVal))
{
SetProperties(order, "F_DEFINE15", imp.EXECLCELLNAME + ":不能为空");
}
else
SetProperties(order, imp.DBCELLNAME, celVal);
}
else
SetProperties(order, imp.DBCELLNAME, celVal);
}
}
}
}
}
}
#endregion
if (string.IsNullOrEmpty(order.F_NO))
throw SysExCore.ThrowFailException("单号不能为空");
lstOrder.Add(order);
staIndex = 0; endIndex = 0;
#region 初始化表体数据
for (int i = 0; i < execlDt.Rows.Count; i++)
{
isNull = false;
foreach (DataColumn cel in execlDt.Columns)
{
if (!string.IsNullOrEmpty(execlDt.Rows[i][cel].ToString()))
{
isNull = true;
break;
}
}
if (isNull)
{
if (execlDt.Rows[i][0].ToString() == imptDt.F_STAKEY)
{
staIndex = i;
continue;
}
if (execlDt.Rows[i][0].ToString() == imptDt.F_ENDKEY)
{
endIndex = i;
}
if (staIndex > 0 && endIndex <= 0 && lstKeys.Count > 0)
{
if (string.IsNullOrEmpty(order.F_NO))
throw SysExCore.ThrowFailException("单据编号值不能为空");
BILL_ORDERITEM item = new BILL_ORDERITEM();
item.F_ROWNO = Guid.NewGuid().ToString();
item.F_ISSTOP = 0;
item.F_ISDELETE = 0;
item.F_ADDTIME = DateTime.Now;
item.F_EDITTIME = DateTime.Now;
item.F_ADDUSERNO = loginName;
item.F_EDITUSERNO = loginName;
item.F_ORDERNO = order.F_NO;
item.F_LOCKSTATUS = (int)ELOCKSTATUS.NoLockStatus;
foreach (var cel in lstKeys)
{
var impt = imBaseDtLst.Where(v => v.EXECLCELLNAME == cel[1]).FirstOrDefault();
if (impt != null)
{
if (impt.DBCELLNAME.Equals("F_ORDERNO"))
continue;
var t = execlDt.Rows[i][cel[0]].ToString();
var val = RegexNot(t);
// 物料状态
if (impt.DBCELLNAME.Equals("F_MATSTATENUM"))
{
var matstate = sugar.Queryable().Where(v => v.F_PNO == "EMatState" && (v.F_NAME == val)).First();
if (matstate == null)
SetProperties(item, "F_DEFINE10", impt.EXECLCELLNAME + ":选中的值《" + val + "》不存在");
else
SetProperties(item, impt.DBCELLNAME, matstate.F_NUM.ToString());
continue;
}
if (impt.F_ISNULL == 1)
{
if (string.IsNullOrEmpty(val))
SetProperties(item, "F_DEFINE10", impt.EXECLCELLNAME + ":不能为空");
else
SetProperties(item, impt.DBCELLNAME, val);
}
else
SetProperties(item, impt.DBCELLNAME, val);
}
}
lstItem.Add(item);
}
}
}
#endregion
}
#endregion
}
else
{
// 全表体混合模式,关键字段 [单号] ,在 EXECL 中必须用 [单号字样表示]
if (!execlDt.Columns.Contains("单号"))
throw SysExCore.ThrowFailException("EXECL表体区混合模式下, EXECL 文件中必须包含 [ 单号 ] 关键字");
if (imBaseHtLst.Where(v => v.EXECLCELLNAME == "单号").FirstOrDefault() == null)
throw SysExCore.ThrowFailException("表头字段配置参数列表中必须包含 [ 单号 ] 关系列");
if (imBaseDtLst.Where(v => v.EXECLCELLNAME == "单号").FirstOrDefault() == null)
throw SysExCore.ThrowFailException("表体字段配置参数列表中必须包含 [ 单号 ] 关系列");
#region EXECL 数据库表头 主、子 表数据,混合在 EXECL 表体区
// 临时表体源
DataTable temDt = new DataTable();
// 判断是否指定了开始行的关键词
if (!string.IsNullOrEmpty(imptDt.F_STAKEY))
{
// 如果指定了关键词,则将EXECL中的表体区数据抠出。
#region 将EXECL表体区的数据抠出来放在 temDt
// 保存源列名和现列名的关系
List lstTitel = new List();
for (int i = 0; i < execlDt.Rows.Count; i++)
{
if (execlDt.Rows[i][0].ToString() == imptDt.F_STAKEY)
{
staIndex = i;
}
if (execlDt.Rows[i][0].ToString() == imptDt.F_ENDKEY)
{
endIndex = i;
}
if (staIndex == i)
{
foreach (DataColumn cel in execlDt.Columns)
{
if (!execlDt.Rows[staIndex][cel].ToString().Contains("提交结果:"))
{
if (string.IsNullOrEmpty(execlDt.Rows[staIndex][cel].ToString().Trim()))
throw SysExCore.ThrowFailException("表体区的表头不能为空");
string[] s = new string[] { cel.ColumnName, execlDt.Rows[staIndex][cel].ToString().Trim() };
lstTitel.Add(s);
temDt.Columns.Add(execlDt.Rows[staIndex][cel].ToString().Trim());
}
}
}
if (i > staIndex && lstTitel.Count > 0)
{
if (endIndex <= 0)
{
var di = temDt.Rows.Count;
temDt.Rows.Add(1);
foreach (var ls in lstTitel)
{
temDt.Rows[di][ls[1]] = execlDt.Rows[i][ls[0]];
}
}
}
}
#endregion
}
else
{
// 如果未制定关键词,则按照源
temDt = execlDt;
}
#region 转换对象
var F_NOLst = from t in temDt.AsEnumerable()
group t by new { F_NO = t.Field("单号"), } into m
select new { F_NO = m.Key.F_NO };
foreach (var F_NO in F_NOLst)
{
if (string.IsNullOrEmpty(F_NO.F_NO))
continue;
var F_NORow = temDt.Select("单号='" + F_NO.F_NO + "'");
if (F_NORow.Length <= 0)
throw SysExCore.ThrowFailException("未找到数据信息");
#region 初始化表头
BILL_ORDERGRP order = new BILL_ORDERGRP();
order.F_ISDELETE = 0;
order.F_ISSTOP = 0;
order.F_ADDUSERNO = loginName;
order.F_EDITUSERNO = loginName;
order.F_EDITTIME = DateTime.Now;
order.F_ADDTIME = DateTime.Now;
order.F_TYPENUM = busTypeVal;
order.F_STATENUM = 0;
foreach (var imbase in imBaseHtLst)
{
if (temDt.Columns.Contains(imbase.EXECLCELLNAME))
{
var t = F_NORow[0][imbase.EXECLCELLNAME].ToString().Trim();
var val = RegexNot(t);
if (imbase.DBCELLNAME == "F_DEFINE02")
{
}
if (imbase.F_ISNULL == 1)
{
if (string.IsNullOrEmpty(val))
{
SetProperties(order, "F_DEFINE15", imbase.EXECLCELLNAME + ":不能为空");
}
else
SetProperties(order, imbase.DBCELLNAME, val);
}
else
SetProperties(order, imbase.DBCELLNAME, val);
}
}
#endregion
if (string.IsNullOrEmpty(order.F_NO))
throw SysExCore.ThrowFailException("单号不能为空");
//if (order.F_TYPENUM == 5 || order.F_TYPENUM == 6)
//{
// order.F_NO = order.F_TYPENUM.ToString().PadLeft(2, '0') + "_" + order.F_NO;
//}
lstOrder.Add(order);
#region 初始化表体
foreach (DataRow row in F_NORow)
{
BILL_ORDERITEM item = new BILL_ORDERITEM();
item.F_ROWNO = Guid.NewGuid().ToString();
item.F_ISSTOP = 0;
item.F_ISDELETE = 0;
item.F_ADDTIME = DateTime.Now;
item.F_EDITTIME = DateTime.Now;
item.F_ADDUSERNO = loginName;
item.F_EDITUSERNO = loginName;
item.F_OUTLINETYPE = "0";
item.F_LOCKSTATUS = 0;
if (busTypeVal == 17)
{
item.F_MATSTATENUM = 1;
}
foreach (var imbase in imBaseDtLst)
{
var t = row[imbase.EXECLCELLNAME].ToString();
var val = RegexNot(t);
// 物料状态
if (imbase.DBCELLNAME.Equals("F_MATSTATENUM"))
{
var matstate = sugar.Queryable().Where(v => v.F_PNO == "EMatState" && (v.F_NAME == val)).First();
if (matstate == null)
SetProperties(item, "F_DEFINE10", imbase.EXECLCELLNAME + ":选中的值《" + val + "》不存在");
else
SetProperties(item, imbase.DBCELLNAME, matstate.F_NUM.ToString());
continue;
}
if (imbase.F_ISNULL == 1)
{
if (string.IsNullOrEmpty(val))
SetProperties(item, "F_DEFINE10", imbase.EXECLCELLNAME + ":不能为空");
else
SetProperties(item, imbase.DBCELLNAME, val);
}
else
{
SetProperties(item, imbase.DBCELLNAME, val);
}
}
item.F_ORDERNO = order.F_NO;
lstItem.Add(item);
}
#endregion
}
#endregion
#endregion
}
var vvv = lstOrder;
var bbb = lstItem;
#region 数据库操作
if (lstItem.Count <= 0)
throw SysExCore.ThrowFailException("表体数据未空,无法导入");
if (lstOrder.Where(v => !string.IsNullOrEmpty(v.F_DEFINE15)).FirstOrDefault() == null && lstItem.Where(v => !string.IsNullOrEmpty(v.F_DEFINE10)).FirstOrDefault() == null)
{
try
{
//OrderCore core = new OrderCore();
//LoginUserInfo LoginUser = LoginBLLCore.GetLoginUser();
//var jsonAdd = core.SaveOrder(LoginUser, lstOrder, lstItem);
//if (jsonAdd.type == 0)
// throw SysExCore.ThrowFailException(jsonAdd.message);
//else if (jsonAdd.type == 1)
//{
// lstOrder = jsonAdd.lstOrder;
// lstItem = jsonAdd.lstItem;
//}
}
catch (Exception ex)
{
throw SysExCore.ThrowFailException(ex.Message);
//lstOrder.ForEach(w => w.F_DEFINE15 = ex.Message);
//lstItem.ForEach(w => w.F_DEFINE10 = ex.Message);
}
}
#endregion
if (lstOrder.Where(v => !string.IsNullOrEmpty(v.F_DEFINE15)).FirstOrDefault() != null || lstItem.Where(v => !string.IsNullOrEmpty(v.F_DEFINE10)).FirstOrDefault() != null)
{
#region 写入异常结果
DataTable dtSouse = new DataTable();
dtSouse.Columns.Add("数据类型");
dtSouse.Columns.Add("数据值");
dtSouse.Columns.Add("原因");
var heat = lstOrder.Where(v => !string.IsNullOrEmpty(v.F_DEFINE15)).ToArray();
if (heat.Count() > 0)
{
foreach (var item in heat)
{
dtSouse.Rows.Add("表头", item.F_NO, item.F_DEFINE15);
}
}
var data = lstItem.Where(v => !string.IsNullOrEmpty(v.F_DEFINE10)).ToArray();
if (data.Count() > 0)
{
foreach (var item in data)
{
dtSouse.Rows.Add("表体", item.F_MATNO, item.F_DEFINE10);
}
}
if (dtSouse.Rows.Count > 0)
{
ExcelConfig cof = new ExcelConfig();
//cof.FileName = @"D:\Project\科勒\EXECL\ERR222.xls"; // 文件名 只能是 xls格式
cof.Title = "导入时异常信息"; // 文件名
cof.TitlePoint = 18; // 标题字号
cof.HeadPoint = 14;// 列头字号
cof.IsAllSizeColumn = true; // 列宽自适应
cof.ColumnEntity = new List() {
new ColumnModel(){Column = "数据类型",ExcelColumn = "数据类型"},
new ColumnModel(){Column = "数据值",ExcelColumn = "数据值"},
new ColumnModel(){Column = "原因",ExcelColumn = "原因",Background=Color.Red},
};
json.Type = 1;
json.Message = "导入失败";
json.dtSou = dtSouse;
json.ExeclCfg = cof;
//ExcelHelper.ExcelExport(dtSouse, cof);
}
else
{
json.Type = 2;
json.Message = "导入成功";
}
#endregion
}
else
{
json.Type = 2;
json.Message = "导入成功";
}
}
catch (Exception ex)
{
json.Type = 0;
json.Message = ex.Message;
}
finally
{
sugar.Dispose();
}
return json;
}
///
/// 收货单格式验证
///
///
///
///
///
public JsonExecl ImportOrderDataCheck(DataTable dtExeclSouse, int busTypeVal, string loginName)
{
if (busTypeVal != -5)
throw SysExCore.ThrowFailException("只能验证收货单");
busTypeVal = 7;
JsonExecl json = new JsonExecl();
json.Type = 0;
// busType
SqlSugarClient sugar = SysDbCore.GetDbCtx();
try
{
if (dtExeclSouse == null)
throw SysExCore.ThrowFailException("数据源不能为null");
if (dtExeclSouse.Rows.Count <= 0)
throw SysExCore.ThrowFailException("数据源数据行数必须大于0");
// 获取源数据
DataTable execlDt = dtExeclSouse;//ExcelHelper.ExcelImport(filePath, 0, 0);
EOrderType otype = (EOrderType)busTypeVal;
List importLst = null;
#region 获取数据库参数配置
importLst = sugar.Queryable().Where(v => new string[] { "9", "10" }.Contains(v.F_NO)).ToList();
// 获取参数配置
if (importLst.Count <= 0)
throw SysExCore.ThrowFailException("未找到配置参数");
var imptHt = importLst.Where(v => v.STRUCTURE == "表头").FirstOrDefault();
if (imptHt == null)
throw SysExCore.ThrowFailException("单据导入必须有表头参数定义");
// 获取表体参数
var imptDt = importLst.Where(v => v.STRUCTURE == "表体").FirstOrDefault();
if (imptDt == null)
throw SysExCore.ThrowFailException("单据导入必须有表体参数定义");
var imBaseHtLst = sugar.Queryable().Where(v => v.F_NO == imptHt.F_NO).ToList();
var imBaseDtLst = sugar.Queryable().Where(v => v.F_NO == imptDt.F_NO).ToList();
if (imBaseHtLst.Count <= 0 || imBaseDtLst.Count <= 0)
throw SysExCore.ThrowFailException("未找到字段参数的配置");
#endregion
// string busType = busTypeVal;//imptHt.BUSINESSTYPE;
// 表体区开始索引
int staIndex = 0;
// 表体区结束索引
int endIndex = 0;
int heatStaIndex = 0;
Dictionary dicKeys = new Dictionary();
List lstOrder = new List();
List lstItem = new List();
// 判断表头数据是否在 EXECL 的表头数据中
if (imBaseHtLst.Where(v => v.F_DATATYPE == "表头").FirstOrDefault() != null)
{
#region EXECL 表头表体数据混合模式
DataTable dtHead = new DataTable();
DataTable dtData = new DataTable();
List lstTitel = new List();
// 如果表头关键词为空,则从 0 索引开始查询
if (string.IsNullOrEmpty(imptDt.F_STAKEY))
{
if (string.IsNullOrEmpty(imptDt.F_ENDKEY))
throw SysExCore.ThrowFailException("EXECL 表体区,表头区混合模式下必须是 { 表体开始关键词为空,表体结束关键词不能为空 } ");
#region 初始化表头数据
BILL_ORDERGRP order = new BILL_ORDERGRP();
order.F_ISDELETE = 0;
order.F_ISSTOP = 0;
order.F_ADDUSERNO = loginName;
order.F_EDITUSERNO = loginName;
order.F_EDITTIME = DateTime.Now;
order.F_ADDTIME = DateTime.Now;
order.F_STATENUM = 0;
order.F_TYPENUM = busTypeVal;
foreach (DataColumn cel in execlDt.Columns)
{
dtHead.Columns.Add(cel.ColumnName);
}
bool IsEmtry = false;
var tlstHt = imBaseHtLst.Where(v => v.F_DATATYPE == "表体").ToList();
if (tlstHt.Count > 0)
{
#region 初始化表头对象,先从表体区找到表头的值
foreach (var ht in tlstHt)
{
var t = execlDt.Rows[0][ht.EXECLCELLNAME].ToString().Trim();
var val = RegexNot(t);
if (ht.F_ISNULL == 1)
{
if (string.IsNullOrEmpty(val))
{
SetProperties(order, "F_DEFINE15", order.F_DEFINE15 + "|" + ht.EXECLCELLNAME + ":不能为空");
}
else
SetProperties(order, ht.DBCELLNAME, val);
}
else
SetProperties(order, ht.DBCELLNAME, val);
}
#endregion
}
#region 初始化表头对象,在找到表头区的值,目标是为了生成单号给表体。
for (int i = 0; i < execlDt.Rows.Count; i++)
{
IsEmtry = false;
foreach (DataColumn cel in execlDt.Columns)
{
if (!string.IsNullOrEmpty(execlDt.Rows[i][cel].ToString()))
{
IsEmtry = true;
break;
}
}
// 如果有有一列不为空,则正常走逻辑
if (IsEmtry)
{
if (execlDt.Rows[i][0].ToString() == imptDt.F_ENDKEY)
{
endIndex = i;
}
if (endIndex > 0)
{
heatStaIndex = i;
for (int l = 0; l < execlDt.Columns.Count; l++)
{
var ht = imBaseHtLst.Where(v => v.F_DATATYPE == "表头" && v.EXECLCELLNAME == execlDt.Rows[i][l].ToString()).FirstOrDefault();
if (ht != null)
{
var t = execlDt.Rows[i][l + 1].ToString();
var val = RegexNot(t);
if (ht.F_ISNULL == 1)
{
if (string.IsNullOrEmpty(val))
SetProperties(order, "F_DEFINE15", order.F_DEFINE15 + "|" + ht.EXECLCELLNAME + ":不能为空");
else
SetProperties(order, ht.DBCELLNAME, val);
}
else
SetProperties(order, ht.DBCELLNAME, val);
}
}
}
}
}
#endregion
if (string.IsNullOrEmpty(order.F_NO))
throw SysExCore.ThrowFailException("EXECL 文件中未找到单号");
if (string.IsNullOrEmpty(order.F_NO))
throw SysExCore.ThrowFailException("单号不能为空");
lstOrder.Add(order);
#endregion
#region 初始化表体数据
endIndex = 0;
for (int i = 0; i < execlDt.Rows.Count; i++)
{
IsEmtry = false;
foreach (DataColumn cel in execlDt.Columns)
{
if (!string.IsNullOrEmpty(execlDt.Rows[i][cel].ToString()))
{
IsEmtry = true;
break;
}
}
// 如果有有一列不为空,则正常走逻辑
if (IsEmtry)
{
#region 非空的数据添加到临时 DataTable
if (execlDt.Rows[i][0].ToString() == imptDt.F_ENDKEY)
{
endIndex = i;
}
if (endIndex <= 0)
{
#region 表体对象初始化
BILL_ORDERITEM item = new BILL_ORDERITEM();
item.F_ROWNO = Guid.NewGuid().ToString();
item.F_ISSTOP = 0;
item.F_ISDELETE = 0;
item.F_ADDTIME = DateTime.Now;
item.F_EDITTIME = DateTime.Now;
item.F_ADDUSERNO = loginName;
item.F_EDITUSERNO = loginName;
item.F_ORDERNO = order.F_NO;
item.F_LOCKSTATUS = (int)ELOCKSTATUS.NoLockStatus;
for (int l = 0; l < execlDt.Columns.Count; l++)
{
var dt = imBaseDtLst.Where(v => v.EXECLCELLNAME == execlDt.Columns[l].ToString()).FirstOrDefault();
if (dt != null)
{
if (dt.DBCELLNAME.Equals("F_ORDERNO"))
continue;
var t = execlDt.Rows[i][l].ToString();
var val = RegexNot(t);
// 物料状态
if (dt.DBCELLNAME.Equals("F_MATSTATENUM"))
{
var matstate = sugar.Queryable().Where(v => v.F_PNO == "EMatState" && (v.F_NAME == val)).First();
if (matstate == null)
SetProperties(item, "F_DEFINE10", item.F_DEFINE10 + "|" + dt.EXECLCELLNAME + ":选中的值《" + val + "》不存在");
else
SetProperties(item, dt.DBCELLNAME, matstate.F_NUM.ToString());
continue;
}
if (dt.F_ISNULL == 1)
{
if (string.IsNullOrEmpty(val))
SetProperties(item, "F_DEFINE10", item.F_DEFINE10 + "|" + dt.EXECLCELLNAME + ":不能为空");
else
SetProperties(item, dt.DBCELLNAME, val);
}
else
SetProperties(item, dt.DBCELLNAME, val);
}
}
lstItem.Add(item);
#endregion
}
#endregion
}
}
#endregion
}
else
{
// 表体开始不能为空,表体结束不能为空
if (string.IsNullOrEmpty(imptDt.F_ENDKEY) || string.IsNullOrEmpty(imptDt.F_STAKEY))
throw SysExCore.ThrowFailException("EXECL表头区,表体区,表尾区混合模式下。{ 表体的开始关键词和表体的结束关键词不能为空 }");
#region 初始化表头
BILL_ORDERGRP order = new BILL_ORDERGRP();
order.F_ISDELETE = 0;
order.F_ISSTOP = 0;
order.F_ADDUSERNO = loginName;
order.F_EDITUSERNO = loginName;
order.F_EDITTIME = DateTime.Now;
order.F_ADDTIME = DateTime.Now;
order.F_STATENUM = 0;
order.F_TYPENUM = busTypeVal;
order.F_DEFINE15 = "";
var celName = string.Empty;
var celVal = string.Empty;
// 保存源列名和表体列名的关系
// 0:源列名
// 1:表体列名
List lstKeys = new List();
bool isNull = false;
for (int i = 0; i < execlDt.Rows.Count; i++)
{
isNull = false;
foreach (DataColumn cel in execlDt.Columns)
{
if (!string.IsNullOrEmpty(execlDt.Rows[i][cel].ToString()))
{
isNull = true;
break;
}
}
if (isNull)
{
if (execlDt.Rows[i][0].ToString() == imptDt.F_STAKEY)
{
staIndex = i;
foreach (DataColumn cel in execlDt.Columns)
{
lstKeys.Add(new string[] { cel.ColumnName, execlDt.Rows[i][cel].ToString() });
}
heatStaIndex = i;
continue;
}
if (execlDt.Rows[i][0].ToString() == imptDt.F_ENDKEY)
{
endIndex = i;
}
if (staIndex > 0 && endIndex <= 0 && lstKeys.Count > 0)
{
// 如果表头中的数据存在表体,则初始化对象
#region 初始化表头数据
// 查询表头的数据中是否在表体
var tlstHt = imBaseHtLst.Where(v => v.F_DATATYPE == "表体");
if (tlstHt != null)
{
if (tlstHt.Count() > 0)
{
foreach (var dt in tlstHt)
{
var cel = lstKeys.Where(v => v[1] == dt.EXECLCELLNAME).FirstOrDefault();
if (cel != null)
{
var t = execlDt.Rows[i][cel[0]].ToString();
var val = RegexNot(t);
if (dt.F_ISNULL == 1)
{
if (string.IsNullOrEmpty(val))
{
SetProperties(order, "F_DEFINE15", order.F_DEFINE15 + "|" + dt.EXECLCELLNAME + ":不能为空");
}
else
SetProperties(order, dt.DBCELLNAME, val);
}
else
SetProperties(order, dt.DBCELLNAME, val);
}
}
}
}
#endregion
}
if (staIndex <= 0 || endIndex > 0)
{
for (int l = 0; l < execlDt.Columns.Count; l++)
{
celName = execlDt.Rows[i][l].ToString();
if (!string.IsNullOrEmpty(celName))
{
var imp = imBaseHtLst.Where(v => celName.Contains(v.EXECLCELLNAME) && v.F_DATATYPE == "表头").FirstOrDefault();
if (imp != null)
{
var t = execlDt.Rows[i][l + 1].ToString();
celVal = RegexNot(t);
if (imp.F_ISNULL == 1)
{
if (string.IsNullOrEmpty(celVal))
{
SetProperties(order, "F_DEFINE15", order.F_DEFINE15 + "|" + imp.EXECLCELLNAME + ":不能为空");
}
else
SetProperties(order, imp.DBCELLNAME, celVal);
}
else
SetProperties(order, imp.DBCELLNAME, celVal);
}
}
}
}
}
}
#endregion
if (string.IsNullOrEmpty(order.F_NO))
throw SysExCore.ThrowFailException("单号不能为空");
lstOrder.Add(order);
staIndex = 0; endIndex = 0;
#region 初始化表体数据
for (int i = 0; i < execlDt.Rows.Count; i++)
{
isNull = false;
foreach (DataColumn cel in execlDt.Columns)
{
if (!string.IsNullOrEmpty(execlDt.Rows[i][cel].ToString()))
{
isNull = true;
break;
}
}
if (isNull)
{
if (execlDt.Rows[i][0].ToString() == imptDt.F_STAKEY)
{
staIndex = i;
continue;
}
if (execlDt.Rows[i][0].ToString() == imptDt.F_ENDKEY)
{
endIndex = i;
}
if (staIndex > 0 && endIndex <= 0 && lstKeys.Count > 0)
{
if (string.IsNullOrEmpty(order.F_NO))
throw SysExCore.ThrowFailException("单据编号值不能为空");
BILL_ORDERITEM item = new BILL_ORDERITEM();
item.F_ROWNO = Guid.NewGuid().ToString();
item.F_ISSTOP = 0;
item.F_ISDELETE = 0;
item.F_ADDTIME = DateTime.Now;
item.F_EDITTIME = DateTime.Now;
item.F_ADDUSERNO = loginName;
item.F_EDITUSERNO = loginName;
item.F_ORDERNO = order.F_NO;
item.F_DEFINE10 = "";
item.F_LOCKSTATUS = (int)ELOCKSTATUS.NoLockStatus;
foreach (var cel in lstKeys)
{
var impt = imBaseDtLst.Where(v => v.EXECLCELLNAME == cel[1]).FirstOrDefault();
if (impt != null)
{
if (impt.DBCELLNAME.Equals("F_ORDERNO"))
continue;
var t = execlDt.Rows[i][cel[0]].ToString();
var val = RegexNot(t);
// 物料状态
if (impt.DBCELLNAME.Equals("F_MATSTATENUM"))
{
var matstate = sugar.Queryable().Where(v => v.F_PNO == "EMatState" && (v.F_NAME == val)).First();
if (matstate == null)
SetProperties(item, "F_DEFINE10", item.F_DEFINE10 + "|" + impt.EXECLCELLNAME + ":选中的值《" + val + "》不存在");
else
SetProperties(item, impt.DBCELLNAME, matstate.F_NUM.ToString());
continue;
}
if (impt.F_ISNULL == 1)
{
if (string.IsNullOrEmpty(val))
SetProperties(item, "F_DEFINE10", item.F_DEFINE10 + "|" + impt.EXECLCELLNAME + ":不能为空");
else
SetProperties(item, impt.DBCELLNAME, val);
}
else
SetProperties(item, impt.DBCELLNAME, val);
}
}
//if (order.F_TYPENUM == 7)
//{
// if (item.F_FROMORDERNO.Split('_').Count() <= 1)
// {
// item.F_FROMORDERNO = "SAP05" + "_" + item.F_FROMORDERNO;
// }
//}
//if (order.F_TYPENUM == 37)
//{
// if (item.F_FROMORDERNO.Split('_').Count() <= 1)
// {
// item.F_FROMORDERNO = "SAP06" + "_" + item.F_FROMORDERNO;
// }
//}
lstItem.Add(item);
}
}
}
#endregion
}
#endregion
}
else
{
throw SysExCore.ThrowFailException("数据库配置异常");
}
var vvv = lstOrder;
var bbb = lstItem;
#region 数据库操作
if (lstItem.Count <= 0)
throw SysExCore.ThrowFailException("表体数据未空,无法导入");
foreach (BILL_ORDERGRP order in lstOrder)
{
#region 单号
if (string.IsNullOrEmpty(order.F_NO))
{
order.F_DEFINE15 += "|单号不能为空";
}
#endregion
#region 供应商
if (!string.IsNullOrEmpty(order.F_SUPPLIERNO))
{
var sup = sugar.Queryable().Where(v => v.F_NO == order.F_SUPPLIERNO).First();
if (sup == null)
{
order.F_DEFINE15 += "|供应商不存在";
}
}
#endregion
#region 客户
if (!string.IsNullOrEmpty(order.F_CUSTOMERNO))
{
var cus = sugar.Queryable().Where(v => v.F_NO == order.F_CUSTOMERNO).First();
if (cus == null)
{
order.F_DEFINE15 += "|客户不存在";
}
}
#endregion
#region 单据类型
if (order.F_TYPENUM <= 0 || order.F_TYPENUM >= 39)
{
order.F_DEFINE15 += "|不是可识别的单据类型";
}
#endregion
#region 是否有表体数据
var items = lstItem.Where(v => v.F_ORDERNO == order.F_NO).ToArray();
if (items.Count() <= 0)
{
order.F_DEFINE15 += string.Format("|{0}表体数据不能为空", order.F_NO);
}
#endregion
#region 表体数据验证
foreach (var item in items)
{
if (item.F_PROSTARTIME == null)
item.F_PROSTARTIME = DateTime.Now;
if (item.F_PROENDTIME == null)
item.F_PROENDTIME = DateTime.Now;
#region 物料状态验证
// PO单,PO收货单,INB单,INB收货单,负入库,委外退料:质检中
if (new int[] { 5, 6, 7, 37, 18, 24 }.Contains(order.F_TYPENUM))
{
item.F_MATSTATENUM = 6;
if (order.F_TYPENUM == 18)
{
#region 负入库
if (string.IsNullOrEmpty(item.F_DEFINE16))
{
item.F_DEFINE10 += string.Format("|单据[{0}],是否质检不能为空", item.F_ORDERNO);
}
if (item.F_DEFINE16 == "免检-1")
item.F_MATSTATENUM = 1;
#endregion
}
if (new int[] { 7, 37 }.Contains(order.F_TYPENUM))
{
item.F_SUPPLIERNO = order.F_SUPPLIERNO;
}
}
// 生产退料单,非生产性领料,委外发料,原材料报检单,质检结果单(判断目标状态),自选状态
else if (new int[] { 14, 17, 23, 9, 12 }.Contains(order.F_TYPENUM))
{
if (item.F_MATSTATENUM <= 0)
{
item.F_DEFINE10 += string.Format("|单号[{0}],物料[{1}]状态不能为0", item.F_ORDERNO, item.F_MATNO);
}
var matstate = sugar.Queryable().Where(v => v.F_PNO == "EMatState" && v.F_NUM == item.F_MATSTATENUM).First();
if (matstate == null)
{
item.F_DEFINE10 += string.Format("|冻结指令单[{0}],[{1}]不是可识别的物料状态", item.F_ORDERNO, item.F_MATNO);
}
if (order.F_TYPENUM == 17)
{
if (matstate.F_NUM != 1)
{
item.F_DEFINE10 += string.Format("|非生产性领料,物料[{0}]状态只能为合格状态.[{1}]", item.F_ORDERNO, matstate.F_NAME);
}
}
}
// 生产计划,生产领料,可供容器退料:合格
else if (new int[] { 4, 13, 15 }.Contains(order.F_TYPENUM))
{
item.F_MATSTATENUM = 1;
if (order.F_TYPENUM == 4)
{
if (string.IsNullOrEmpty(item.F_DEFINE15))
{
item.F_DEFINE10 += string.Format("|单据[{0}],优先级不能为空", item.F_ORDERNO);
}
try
{
int.Parse(item.F_DEFINE15);
}
catch (Exception)
{
item.F_DEFINE10 += string.Format("|单据[{0}],优先级必须为数字", item.F_ORDERNO);
}
}
}
// RO退货单,PO退货单:不合格
else if (new int[] { 16, 38 }.Contains(order.F_TYPENUM))
{
if (item.F_MATSTATENUM <= 0)
{
item.F_DEFINE10 += string.Format("|物料状态不能为空", item.F_ORDERNO, item.F_MATNO);
}
// item.F_MATSTATENUM = 3;
}
// ,冻结指令单,目标状态为:冻结
else if (order.F_TYPENUM == 8)
{
item.F_MATSTATENUM = 4;
if (string.IsNullOrEmpty(item.F_DEFINE19))
{
item.F_DEFINE10 += string.Format("|单据[{0}],目标货位不能为空", item.F_ORDERNO);
}
}
else
{
}
#endregion
#region 冻结指令单,质检结果单原原状态判断
// 判断,冻结指令单,质检结果单 的原状态是否合法
if (new int[] { 8, 12 }.Contains(order.F_TYPENUM))
{
if (!string.IsNullOrEmpty(item.F_DEFINE09))
{
//int t = int.Parse(item.F_DEFINE09.Substring(0, 1));
var matstate = sugar.Queryable().Where(v => v.F_PNO == "EMatState" && (v.F_NUM.ToString() == item.F_DEFINE09.ToString() || v.F_NAME == item.F_DEFINE09.ToString())).First();
if (matstate == null)
{
item.F_DEFINE10 += string.Format("|单据[{0}],[{1}]不是可识别的原状态", item.F_ORDERNO, item.F_MATNO);
}
item.F_DEFINE09 = matstate.F_NUM.ToString();
}
else
{
item.F_DEFINE10 += string.Format("|质检结果单[{0}],[{1}]原状态不允许为空", item.F_ORDERNO, item.F_MATNO);
}
}
#endregion
if (!new int[] { 5, 6 }.Contains(order.F_TYPENUM))
{
var exists = items.Where(v => v.F_LGORT == item.F_LGORT && v.F_FROMORDERNO == item.F_FROMORDERNO && v.F_MATNO == item.F_MATNO && v.F_BATCHNO == item.F_BATCHNO && v.F_GEAR == item.F_GEAR && v.F_VERSION == item.F_VERSION).ToArray();
if (exists.Count() > 1)
{
item.F_DEFINE10 += string.Format("|同一个单号[{0}]中不允许有重复物料[{1}]信息", item.F_ORDERNO, item.F_MATNO);
}
}
BILL_ORDERITEM oldItem = null;
if (item.F_ORDERNO.Split('_').Count() <= 1)
{
//if (new int[] { 5, 6 }.Contains(order.F_TYPENUM))
item.F_ORDERNO = order.F_TYPENUM.ToString().PadLeft(2, '0') + "_" + item.F_ORDERNO;
}
if (!string.IsNullOrEmpty(item.F_FROMORDERNO))
{
if (new int[] { 7, 37 }.Contains(order.F_TYPENUM))
{
if (item.F_FROMORDERNO.Split('_').Count() <= 1)
item.F_FROMORDERNO = (order.F_TYPENUM == 7 ? "05" : "06") + "_" + item.F_FROMORDERNO;
}
}
// 获取库存中是否存在
oldItem = sugar.Queryable().Where(v => v.F_LGORT == item.F_LGORT && v.F_FROMORDERNO == item.F_FROMORDERNO && v.F_ORDERNO == item.F_ORDERNO && v.F_MATNO == item.F_MATNO && v.F_BATCHNO == item.F_BATCHNO && v.F_GEAR == item.F_GEAR && v.F_VERSION == item.F_VERSION).First();//
#region 物料信息
if (string.IsNullOrEmpty(item.F_MATNO))
{
item.F_DEFINE10 += "|" + item.F_MATNO + ":料号不能为空";
}
if (string.IsNullOrEmpty(item.F_BATCHNO))
{
item.F_DEFINE10 += "|" + item.F_MATNO + ":批次不能为空";
}
if (string.IsNullOrEmpty(item.F_VERSION))
{
item.F_DEFINE10 += "|" + item.F_MATNO + ":版本号不能为空";
}
var mat = sugar.Queryable().Where(v => v.F_NO == item.F_MATNO).First();
if (mat == null)
{
item.F_DEFINE10 += "|" + item.F_MATNO + ":未找到基础资料";
}
else
{
if (string.IsNullOrEmpty(mat.F_WAREHOUSENO))
{
item.F_DEFINE10 += "|" + item.F_MATNO + ":基础信息默认仓库为空";
}
if (string.IsNullOrEmpty(mat.F_OFFWAREA))
{
item.F_DEFINE10 += "|" + item.F_MATNO + ":基础信息默认区域为空";
}
if (string.IsNullOrEmpty(mat.F_QCTYPECODE))
{
item.F_DEFINE10 += "|" + item.F_MATNO + ":质检标示不完全";
}
else if (int.Parse(mat.F_QCTYPECODE) <= 0 || int.Parse(mat.F_QCTYPECODE) >= 4)
{
item.F_DEFINE10 += "|" + item.F_MATNO + ":质检标示不是可识别的标识";
}
item.F_MATNAME = mat.F_NAME;
}
BILL_ORDERGRP PO_Order = null;
#endregion
#region 非生性领料 负入库成本中心判断
if (order.F_TYPENUM == (int)EOrderType.NoPro_Back_Mat || order.F_TYPENUM == (int)EOrderType.NoPro_Res_Mat)
{
if (string.IsNullOrEmpty(item.F_COST))
{
item.F_DEFINE10 += "|" + item.F_MATNO + ":成本中心不能为空";
}
}
#endregion
#region 产线信息
if (!string.IsNullOrEmpty(item.F_PROLINENO))
{
var t = item.F_PROLINENO.Trim();
if (!string.IsNullOrEmpty(t))
{
BASE_DATA proline = null;
var prolineNo = item.F_PROLINENO.Substring(0, 1);
proline = sugar.Queryable().Where(v => v.F_PNO == "PROLINENO" && (v.F_VALUE == prolineNo || v.F_NO == item.F_PROLINENO || v.F_NAME == prolineNo)).First();
if (proline == null)
{
item.F_DEFINE10 += "|" + item.F_MATNO + ":产线编码不存在";
}
item.F_PROLINENO = proline.F_NO;
item.F_PROLINENAME = proline.F_NAME;
}
}
#endregion
#region 包装方式
if (!string.IsNullOrEmpty(item.F_PACKMETHOD))
{
var t = item.F_PACKMETHOD.Trim();
if (!string.IsNullOrEmpty(t))
{
SYS_DATA proline = null;
int va = 0;
try
{
var prolineNo = item.F_PACKMETHOD.Substring(0, 2);
va = int.Parse(prolineNo);
}
catch (Exception ex)
{
item.F_DEFINE10 += "|" + item.F_MATNO + ":包装方式格式不正确";
}
proline = sugar.Queryable().Where(v => v.F_PNO == "EPackType" && (v.F_NAME == t || v.F_NUM == va)).First();
if (proline == null)
{
item.F_DEFINE10 += "|" + item.F_MATNO + ":包装方式不存在";
}
item.F_PACKMETHOD = proline.F_NAME;
}
}
#endregion
#region 生产计划单特殊判断
else if (order.F_TYPENUM == (int)EOrderType.Pro_Plan)
{
if (string.IsNullOrEmpty(item.F_PROLINENO))
{
item.F_DEFINE10 += "|" + item.F_MATNO + ":产线编号不能为空";
}
var plan = sugar.Queryable().Where(v => v.F_PNO == "PROLINENO" && (v.F_NO == item.F_PROLINENO || v.F_NAME == item.F_PROLINENO || v.F_VALUE == item.F_PROLINENO)).First();
if (plan == null)
{
item.F_DEFINE10 += "|" + item.F_MATNO + ":产线编号不存在";
}
// 将产线信息重新写入
item.F_PROLINENO = plan.F_NO;
item.F_PROLINENAME = plan.F_NAME;
}
#endregion
#region 其它单据
else
{
if (oldItem != null)
{
if (item.F_FQTY <= oldItem.F_AQTY)
{
item.F_DEFINE10 += "|" + item.F_MATNO + ":修改数量不能小于已经操作的数量";
}
}
}
#endregion
#region 单位转换
{
ConvUnitEntity entity = null;
if (string.IsNullOrEmpty(item.F_MATNO) || string.IsNullOrEmpty(item.F_UNITNO))
item.F_DEFINE10 += "|料号或者转换单位不能为空";
if (item.F_FQTY <= 0)
item.F_DEFINE10 += "|参数值不能小于0";
if (mat == null)
continue;
if (string.IsNullOrEmpty(mat.F_BASEUNITNO))
item.F_DEFINE10 += "|物料基本单位未维护";
if (string.IsNullOrEmpty(mat.F_DEFINE04))
item.F_DEFINE10 += "|最小包装单位未维护";
var convUnit = sugar.Queryable().Where(v => v.F_MATNO == item.F_MATNO && v.F_CONVUNIT == item.F_UNITNO).First();
if (convUnit == null)
item.F_DEFINE10 += "|" + item.F_MATNO + ":未找到基本转换关系[" + item.F_UNITNO + "-->" + mat.F_BASEUNITNO + "]";
else
{
if (convUnit.F_CONVERSION <= 0)
item.F_DEFINE10 += "|基本转换率不能小于等于0";
}
if (mat.F_BASEUNITNO != mat.F_DEFINE04)
{
var minUnit = sugar.Queryable().Where(v => v.F_MATNO == item.F_MATNO && v.F_CONVUNIT == mat.F_DEFINE04).First();
if (minUnit == null)
item.F_DEFINE10 += "|" + item.F_MATNO + ":未找到包装转换关系[" + mat.F_BASEUNITNO + "-->" + mat.F_DEFINE04 + "]";
if (minUnit.F_CONVERSION <= 0)
item.F_DEFINE10 += "|包装转换率不能小于等于0";
}
}
#endregion
}
#endregion
}
#endregion
if (lstOrder.Where(v => !string.IsNullOrEmpty(v.F_DEFINE15)).FirstOrDefault() != null || lstItem.Where(v => !string.IsNullOrEmpty(v.F_DEFINE10)).FirstOrDefault() != null)
{
#region 写入异常结果
DataTable dtSouse = new DataTable();
dtSouse.Columns.Add("数据类型");
dtSouse.Columns.Add("数据值");
dtSouse.Columns.Add("原因");
var heat = lstOrder.Where(v => !string.IsNullOrEmpty(v.F_DEFINE15)).ToArray();
if (heat.Count() > 0)
{
foreach (var item in heat)
{
dtSouse.Rows.Add("表头", item.F_NO, item.F_DEFINE15);
}
}
var data = lstItem.Where(v => !string.IsNullOrEmpty(v.F_DEFINE10)).ToArray();
if (data.Count() > 0)
{
foreach (var item in data)
{
dtSouse.Rows.Add("表体", item.F_MATNO, item.F_DEFINE10);
}
}
if (dtSouse.Rows.Count > 0)
{
ExcelConfig cof = new ExcelConfig();
//cof.FileName = @"D:\Project\科勒\EXECL\ERR222.xls"; // 文件名 只能是 xls格式
cof.Title = "导入时异常信息"; // 文件名
cof.TitlePoint = 18; // 标题字号
cof.HeadPoint = 14;// 列头字号
cof.IsAllSizeColumn = true; // 列宽自适应
cof.ColumnEntity = new List() {
new ColumnModel(){Column = "数据类型",ExcelColumn = "数据类型"},
new ColumnModel(){Column = "数据值",ExcelColumn = "数据值"},
new ColumnModel(){Column = "原因",ExcelColumn = "原因",Background=Color.Red},
};
json.Type = 1;
json.Message = "导入失败";
json.dtSou = dtSouse;
json.ExeclCfg = cof;
//ExcelHelper.ExcelExport(dtSouse, cof);
}
else
{
json.Type = 2;
json.Message = "导入成功";
}
#endregion
}
else
{
json.Type = 2;
json.Message = "导入成功";
}
}
catch (Exception ex)
{
json.Type = 0;
json.Message = ex.Message;
}
finally
{
sugar.Dispose();
}
return json;
}
///
/// 盘点导入
///
///
///
///
public JsonExecl ImportCheckOrder(DataTable dtExeclSouse, int busTypeVal, string loginName)
{
JsonExecl json = new JsonExecl();
json.Type = 0;
// busType
SqlSugarClient sugar = SysDbCore.GetDbCtx();
try
{
if (dtExeclSouse == null)
throw SysExCore.ThrowFailException("数据源不能为null");
if (dtExeclSouse.Rows.Count <= 0)
throw SysExCore.ThrowFailException("数据源数据行数必须大于0");
// 获取源数据
DataTable execlDt = dtExeclSouse;//ExcelHelper.ExcelImport(filePath, 0, 0);
EOrderType otype = (EOrderType)busTypeVal;
if (otype != EOrderType.Inventory)
throw new Exception("类型不是盘点类型");
#region 获取数据库参数配置
// 获取参数配置
var importLst = sugar.Queryable().Where(v => v.BUSINSERTVAL == busTypeVal).ToList();
var imptHt = importLst.Where(v => v.STRUCTURE == "表头").FirstOrDefault();
if (imptHt == null)
throw SysExCore.ThrowFailException("单据导入必须有表头参数定义");
// 获取表体参数
var imptDt = importLst.Where(v => v.STRUCTURE == "表体").FirstOrDefault();
if (imptDt == null)
throw SysExCore.ThrowFailException("单据导入必须有表体参数定义");
var imBaseHtLst = sugar.Queryable().Where(v => v.F_NO == imptHt.F_NO).ToList();
var imBaseDtLst = sugar.Queryable().Where(v => v.F_NO == imptDt.F_NO).ToList();
if (imBaseHtLst.Count <= 0 || imBaseDtLst.Count <= 0)
throw SysExCore.ThrowFailException("未找到字段参数的配置");
#endregion
List lstOrder = new List();
List lstItem = new List();
// 全表体混合模式,关键字段 [单号] ,在 EXECL 中必须用 [单号字样表示]
if (!execlDt.Columns.Contains("盘点单号"))
throw SysExCore.ThrowFailException("EXECL表体区混合模式下, EXECL 文件中必须包含 [ 盘点单号 ] 关键字");
if (imBaseHtLst.Where(v => v.EXECLCELLNAME == "盘点单号").FirstOrDefault() == null)
throw SysExCore.ThrowFailException("表头字段配置参数列表中必须包含 [ 盘点单号 ] 关系列");
if (imBaseDtLst.Where(v => v.EXECLCELLNAME == "盘点单号").FirstOrDefault() == null)
throw SysExCore.ThrowFailException("表体字段配置参数列表中必须包含 [ 盘点单号 ] 关系列");
// 数据源
DataTable temDt = execlDt;
#region 转换对象
var F_NOLst = from t in temDt.AsEnumerable()
group t by new { F_NO = t.Field("盘点单号") } into m
select new { F_NO = m.Key.F_NO };
foreach (var F_NO in F_NOLst)
{
if (string.IsNullOrEmpty(F_NO.F_NO))
continue;
var F_NORow = temDt.Select("盘点单号='" + F_NO.F_NO + "'");
if (F_NORow.Length <= 0)
throw SysExCore.ThrowFailException("未找到数据信息");
#region 初始化表头
BILL_ORDERGRPCHECK order = new BILL_ORDERGRPCHECK();
order.F_ISDELETE = 0;
order.F_ISSTOP = 0;
order.F_ADDUSERNO = loginName;
order.F_EDITUSERNO = loginName;
order.F_EDITTIME = DateTime.Now;
order.F_ADDTIME = DateTime.Now;
order.F_TYPENUM = busTypeVal;
order.F_STATENUM = 0;
order.F_CHECKTYPENUM = 2; // 盘点方案 -> 抽盘
foreach (var imbase in imBaseHtLst)
{
if (temDt.Columns.Contains(imbase.EXECLCELLNAME))
{
var t = F_NORow[0][imbase.EXECLCELLNAME].ToString().Trim();
var val = RegexNot(t);
if (imbase.F_ISNULL == 1)
{
if (string.IsNullOrEmpty(val))
{
SetProperties(order, "F_DEFINE14", val);
SetProperties(order, "F_DEFINE15", imbase.EXECLCELLNAME + ":不能为空");
}
else
SetProperties(order, imbase.DBCELLNAME, val);
}
else
{
SetProperties(order, imbase.DBCELLNAME, val);
}
}
}
#endregion
if (string.IsNullOrEmpty(order.F_NO))
throw SysExCore.ThrowFailException("盘点单号不能为空");
//order.F_NO = order.F_TYPENUM.ToString().PadLeft(2, '0') + "_" + order.F_NO;
lstOrder.Add(order);
#region 初始化表体
foreach (DataRow row in F_NORow)
{
BILL_ORDERGRPCHECKWHERE item = new BILL_ORDERGRPCHECKWHERE();
item.F_ROWNO = Guid.NewGuid().ToString();
item.F_ISSTOP = 0;
item.F_ISDELETE = 0;
item.F_ADDTIME = DateTime.Now;
item.F_EDITTIME = DateTime.Now;
item.F_ADDUSERNO = loginName;
item.F_EDITUSERNO = loginName;
if (busTypeVal == 17)
{
item.F_MATSTATENUM = 1;
}
var wacode = string.Empty;
foreach (var imbase in imBaseDtLst)
{
var t = row[imbase.EXECLCELLNAME].ToString();
var val = RegexNot(t);
if (imbase.DBCELLNAME == "F_WAREHOUENO")
{
#region 仓库号
if (string.IsNullOrEmpty(val))
{
SetProperties(item, "F_DEFINE09", val);
SetProperties(item, "F_DEFINE10", imbase.EXECLCELLNAME + ":不能为空");
continue;
}
var wahouse = sugar.Queryable().Where(v => v.F_NO == val).First();
if (wahouse == null)
{
SetProperties(item, "F_DEFINE09", val);
SetProperties(item, "F_DEFINE10", "仓库编号不存在");
continue;
}
wacode = val;
#endregion
}
if (imbase.DBCELLNAME == "F_WARENO")
{
#region 区域
if (!string.IsNullOrEmpty(val))
{
var wahouse = sugar.Queryable().Where(v => v.F_NO == val && v.F_WAREHOUSENO == wacode).First();
if (wahouse == null)
{
SetProperties(item, "F_DEFINE09", val);
SetProperties(item, "F_DEFINE10", "区域编号不存在");
continue;
}
}
#endregion
}
if (imbase.DBCELLNAME == "F_WARECELLNO")
{
#region 货位
if (!string.IsNullOrEmpty(val))
{
var wahouse = sugar.Queryable().Where(v => v.F_NO == val).First();
if (wahouse == null)
{
SetProperties(item, "F_DEFINE09", val);
SetProperties(item, "F_DEFINE10", "货位编号不存在");
continue;
}
}
#endregion
}
if (imbase.DBCELLNAME == "F_MATNO")
{
#region 物料编码
if (!string.IsNullOrEmpty(val))
{
var wahouse = sugar.Queryable().Where(v => v.F_NO == val).First();
if (wahouse == null)
{
SetProperties(item, "F_DEFINE09", val);
SetProperties(item, "F_DEFINE10", "物料编码不存在");
continue;
}
}
#endregion
}
if (imbase.F_ISNULL == 1)
{
if (string.IsNullOrEmpty(val))
{
SetProperties(item, "F_DEFINE09", val);
SetProperties(item, "F_DEFINE10", imbase.EXECLCELLNAME + ":不能为空");
}
else
SetProperties(item, imbase.DBCELLNAME, val);
}
else
{
SetProperties(item, imbase.DBCELLNAME, val);
}
}
//item.F_FROMORDERNO = order.F_TYPENUM.ToString().PadLeft(2, '0') + "_" + item.F_FROMORDERNO;
item.F_ORDERNO = order.F_NO;
lstItem.Add(item);
}
#endregion
}
#endregion
#region 数据库操作
if (lstItem.Count <= 0)
throw SysExCore.ThrowFailException("表体数据未空,无法导入");
if (lstOrder.Where(v => !string.IsNullOrEmpty(v.F_DEFINE15)).FirstOrDefault() == null && lstItem.Where(v => !string.IsNullOrEmpty(v.F_DEFINE10)).FirstOrDefault() == null)
{
try
{
int f = 0;
sugar.BeginTran();
foreach (var order in lstOrder)
{
f = 0;
var dbOrder = sugar.Queryable().Where(v => v.F_NO == order.F_NO).First();
if (dbOrder == null)
{
f = sugar.Insertable(order).ExecuteCommand();
if (f > 0)
{
f = sugar.Insertable(lstItem.Where(v => v.F_ORDERNO == order.F_NO).ToArray()).ExecuteCommand();
}
}
else
{
if (dbOrder.F_ISDELETE == 1 || dbOrder.F_ISSTOP == 1)
throw new Exception("此单据已经停用或者已经被删除,无法导入");
if (order.F_STATENUM < 3)
{
foreach (var item in lstItem)
{
var dbItem = sugar.Queryable().Where(v => v.F_ORDERNO == order.F_NO && v.F_MATNO == item.F_MATNO).First();
if (dbItem == null)
{
f = sugar.Insertable(item).ExecuteCommand();
}
else
{
// 如果WMS的操作数量大于本次修改的计划量,将不允许修改
if (dbItem.F_AQTY > item.F_FQTY)
{
item.F_DEFINE10 = "计划量不能小于实际量";
}
else
{
dbItem.F_FQTY = item.F_FQTY;
f = sugar.Updateable(dbItem).ExecuteCommand();
}
}
}
}
else
{
order.F_DEFINE15 = string.Format("单据状态:<{0}>操作失败", order.F_STATENUM);
}
}
}
sugar.CommitTran();
}
catch (Exception ex)
{
sugar.RollbackTran();
lstOrder.ForEach(w => w.F_DEFINE15 = ex.Message);
lstItem.ForEach(w => w.F_DEFINE10 = ex.Message);
}
}
#endregion
#region 返回结果
if (lstOrder.Where(v => !string.IsNullOrEmpty(v.F_DEFINE15)).FirstOrDefault() != null || lstItem.Where(v => !string.IsNullOrEmpty(v.F_DEFINE10)).FirstOrDefault() != null)
{
DataTable dtSouse = new DataTable();
dtSouse.Columns.Add("数据类型");
dtSouse.Columns.Add("数据值");
dtSouse.Columns.Add("原因");
var heat = lstOrder.Where(v => !string.IsNullOrEmpty(v.F_DEFINE15)).ToArray();
if (heat.Count() > 0)
{
foreach (var item in heat)
{
dtSouse.Rows.Add("表头", item.F_DEFINE14, item.F_DEFINE15);
}
}
var data = lstItem.Where(v => !string.IsNullOrEmpty(v.F_DEFINE10)).ToArray();
if (data.Count() > 0)
{
foreach (var item in data)
{
dtSouse.Rows.Add("表体", item.F_DEFINE09, item.F_DEFINE10);
}
}
if (dtSouse.Rows.Count > 0)
{
ExcelConfig cof = new ExcelConfig();
//cof.FileName = @"D:\Project\科勒\EXECL\ERR222.xls"; // 文件名 只能是 xls格式
cof.Title = "导入时盘点异常信息"; // 文件名
cof.TitlePoint = 18; // 标题字号
cof.HeadPoint = 14;// 列头字号
cof.IsAllSizeColumn = true; // 列宽自适应
cof.ColumnEntity = new List() {
new ColumnModel(){Column = "数据类型",ExcelColumn = "数据类型"},
new ColumnModel(){Column = "数据值",ExcelColumn = "数据值"},
new ColumnModel(){Column = "原因",ExcelColumn = "原因",Background=Color.Red},
};
json.Type = 1;
json.Message = "导入失败";
json.dtSou = dtSouse;
json.ExeclCfg = cof;
//ExcelHelper.ExcelExport(dtSouse, cof);
}
else
{
json.Type = 2;
json.Message = "导入成功";
}
}
else
{
json.Type = 2;
json.Message = "导入成功";
}
#endregion
}
catch (Exception ex)
{
json.Type = 0;
json.Message = ex.Message;
}
finally
{
sugar.Dispose();
}
return json;
}
///
/// 转仓导入
///
///
///
///
public JsonExecl ImportTransferOrder(DataTable dtExeclSouse, int busTypeVal, string loginName)
{
JsonExecl json = new JsonExecl();
json.Type = 0;
// busType
SqlSugarClient sugar = SysDbCore.GetDbCtx();
try
{
if (dtExeclSouse == null)
throw SysExCore.ThrowFailException("数据源不能为null");
if (dtExeclSouse.Rows.Count <= 0)
throw SysExCore.ThrowFailException("数据源数据行数必须大于0");
// 获取源数据
DataTable execlDt = dtExeclSouse;//ExcelHelper.ExcelImport(filePath, 0, 0);
#region 获取数据库参数配置
// 获取参数配置
var importLst = sugar.Queryable().Where(v => v.BUSINSERTVAL == busTypeVal).ToList();
var imptHt = importLst.Where(v => v.STRUCTURE == "表头").FirstOrDefault();
if (imptHt == null)
throw SysExCore.ThrowFailException("单据导入必须有表头参数定义");
// 获取表体参数
var imptDt = importLst.Where(v => v.STRUCTURE == "表体").FirstOrDefault();
if (imptDt == null)
throw SysExCore.ThrowFailException("单据导入必须有表体参数定义");
#endregion
// 全表体混合模式,关键字段 [单号] ,在 EXECL 中必须用 [单号字样表示]
if (!execlDt.Columns.Contains("FromLoc"))
throw SysExCore.ThrowFailException(" EXECL 文件中必须包含 [ FromLoc ] 列");
if (!execlDt.Columns.Contains("FromPart"))
throw SysExCore.ThrowFailException(" EXECL 文件中必须包含 [ FromPart ] 列");
if (!execlDt.Columns.Contains("FromLot"))
throw SysExCore.ThrowFailException(" EXECL 文件中必须包含 [ FromLot ] 列");
if (!execlDt.Columns.Contains("FromWarehouse"))
throw SysExCore.ThrowFailException(" EXECL 文件中必须包含 [ FromWarehouse ] 列");
if (!execlDt.Columns.Contains("ToLoc"))
throw SysExCore.ThrowFailException(" EXECL 文件中必须包含 [ ToLoc ] 列");
if (!execlDt.Columns.Contains("ToPart"))
throw SysExCore.ThrowFailException(" EXECL 文件中必须包含 [ ToPart ] 列");
if (!execlDt.Columns.Contains("ToLot"))
throw SysExCore.ThrowFailException(" EXECL 文件中必须包含 [ ToLot ] 列");
if (!execlDt.Columns.Contains("ToWarehouse"))
throw SysExCore.ThrowFailException(" EXECL 文件中必须包含 [ ToWarehouse ] 列");
if (!execlDt.Columns.Contains("IssNbr"))
throw SysExCore.ThrowFailException(" EXECL 文件中必须包含 [ IssNbr ] 列");
if (!execlDt.Columns.Contains("QtyExp"))
throw SysExCore.ThrowFailException(" EXECL 文件中必须包含 [ QtyExp ] 列");
// 数据源
foreach (DataColumn item in execlDt.Columns)
{
item.ColumnName = $"F_{item.ColumnName}";
}
var orderLst = FuncTable2Entity.DataTableToList(execlDt);
orderLst = orderLst.FindAll(f => !string.IsNullOrWhiteSpace(f.F_fromLoc) && !string.IsNullOrWhiteSpace(f.F_fromPart) && !string.IsNullOrWhiteSpace(f.F_issNbr) && !string.IsNullOrWhiteSpace(f.F_toLoc) && !string.IsNullOrWhiteSpace(f.F_toPart));
sugar.Insertable(orderLst).ExecuteCommand();
json.Type = 2;
json.Message = "导入成功";
}
catch (Exception ex)
{
json.Type = 0;
json.Message = ex.Message;
}
finally
{
sugar.Dispose();
}
return json;
}
#region 通用单据方法
///
/// 初始化对象
///
///
///
///
///
public void SetProperties(T t, string CelName, string CelVal)
{
PropertyInfo properties = t.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public).Where(v => v.Name == CelName).FirstOrDefault();
if (properties == null)
{
throw SysExCore.ThrowFailException(t.GetType().Name + ">" + CelName + ">未找到指定属性");
}
var ts = properties.PropertyType;
string TVal = CelVal.ToUpper().Trim();
if (ts.FullName.Contains("Decimal"))
{
properties.SetValue(t, Convert.ToDecimal(TVal));
}
else if (ts.FullName.Contains("DateTime"))
{
properties.SetValue(t, Convert.ToDateTime(TVal));
}
else if (ts.FullName.Contains("Int32"))
{
properties.SetValue(t, Convert.ToInt32(TVal));
}
else
{
properties.SetValue(t, TVal);
}
}
public void SetProperties(T t)
{
PropertyInfo[] properties = t.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public);
foreach (var item in properties)
{
var ts = item.PropertyType;
if (ts.FullName.Contains("Decimal"))
{
item.SetValue(t, 0);
}
else if (ts.FullName.Contains("DateTime"))
{
item.SetValue(t, DateTime.Now);
}
else if (ts.FullName.Contains("Int32"))
{
item.SetValue(t, 0);
}
else
{
item.SetValue(t, "");
}
}
}
#endregion
#region 基础资料方法
///
/// 获取增加的SQL语句
///
/// 行值
/// 数据库列属性
///
public string GetUpdateSql(DataRow row, List lstCels, string F_NO, int busType)
{
string upT = string.Empty;
foreach (var cel in lstCels)
{
if (cel.IsConfig)
{
string tval = RegexNot(row[cel.ExeclName].ToString());
string val = tval.ToUpper().Trim();
if (cel.CelName == "F_NO")
val = val.TrimStart('0');
if (cel.CelName == "F_BASELOCATION")
{
if (string.IsNullOrEmpty(val))
return cel.ExeclName + ":不能为空";
}
if (cel.CelIsNull == "N")
{
switch (cel.CelType)
{
case "DATE":
if (!string.IsNullOrEmpty(val))
upT += cel.CelName + "=to_date('" + val + "','YYYY-MM-DD'),";
break;
case "NUMBER":
if (!string.IsNullOrEmpty(val))
upT += cel.CelName + "='" + val + "',";
break;
default:
if (!string.IsNullOrEmpty(val))
upT += cel.CelName + "='" + val + "',";
else
upT += cel.CelName + "=null,";
break;
}
}
else
{
#region 允许为空
if (!string.IsNullOrEmpty(val))
{
upT += cel.CelName + "=";
switch (cel.CelType)
{
case "DATE":
upT += "to_date('" + val + "','YYYY-MM-DD'),";
break;
case "NUMBER":
upT += "'" + val + "',";
break;
default:
upT += "'" + val + "',";
break;
}
}
#endregion
}
}
}
upT = upT.Trim(',');
return string.Format(@"UPDATE {0} SET {1} WHERE F_NO='{2}'", lstCels[0].TableName, upT, F_NO);
}
///
/// 获取增加的SQL语句
///
/// 行值
/// 数据库列属性
///
public string GetInsertSql(DataRow row, List lstCels, string F_NO, int busType)
{
string resT = "F_NO,";
string valT = "'" + F_NO + "',";
string val = string.Empty;
string tno = string.Empty;
if (busType >= 2000)
tno = Guid.NewGuid().ToString();
foreach (var cel in lstCels)
{
val = string.Empty;
if (cel.CelName == "F_NO")
{
if (busType < 2000)
continue;
}
if (cel.IsConfig)
{
if (string.IsNullOrEmpty(tno))
val = RegexNot(row[cel.ExeclName].ToString().Trim());
else
val = tno;
}
val = val.ToUpper().Trim();
if (cel.CelIsNull == "N")
{
resT += cel.CelName + ",";
#region 不允许为空
switch (cel.CelType)
{
case "DATE":
if (string.IsNullOrEmpty(val))
valT += "to_date('" + DateTime.Now.ToString("yyyy-MM-dd") + "','YYYY-MM-DD'),";
else
valT += "to_date('" + val + "','YYYY-MM-DD'),";
break;
case "NUMBER":
if (string.IsNullOrEmpty(val))
valT += "'0',";
else
valT += "'" + val + "',";
break;
default:
if (string.IsNullOrEmpty(val))
valT += "'WMS',";
else
valT += "'" + val + "',";
break;
}
#endregion
}
else
{
#region 允许为空
if (!string.IsNullOrEmpty(val))
{
resT += cel.CelName + ",";
switch (cel.CelType)
{
case "DATE":
valT += "to_date('" + val + "','YYYY-MM-DD'),";
break;
case "NUMBER":
valT += "'" + val + "',";
break;
default:
valT += "'" + val + "',";
break;
}
}
#endregion
}
}
resT = resT.Trim(',');
valT = valT.Trim(',');
return string.Format(@"INSERT INTO {0}({1}) VALUES({2})", lstCels[0].TableName, resT, valT);
}
#endregion
#region 生产转收货方法
public string GetDbCCells(DBTableCell cell, string t1)
{
string res = "";
switch (cell.CellsType)
{
case "DATE":
res = "to_date('" + t1 + "','yyyy-mm-dd')";
break;
case "VARCHAR2":
case "NVARCHAR2":
res = "'" + t1 + "'";
break;
case "NUMBER":
res = "'" + t1 + "'";
break;
default:
break;
}
return res;
}
public void GetDbCCell(DBTableCell cell, out string t1, out string v1)
{
t1 = cell.CellsName;
v1 = string.Empty;
string[] conkey = new string[] { "F_NO", "F_ROWNO" };
if (conkey.Contains(cell.CellsName))
{
v1 = "'" + Guid.NewGuid().ToString() + "'";
}
else if (cell.CellsNULLABLE == "N")
{
switch (cell.CellsType)
{
case "DATE":
v1 = "to_date('" + DateTime.Now.ToString("yyyy-MM-dd") + "','yyyy-mm-dd')";
break;
case "VARCHAR2":
case "NVARCHAR2":
v1 = "'System'";
break;
case "NUMBER":
v1 = "'0'";
break;
default:
break;
}
}
}
#endregion
#region 写入EXECL
///
/// 写入EXECL
///
/// 文件名
/// 写入的列索引
/// 写入的行索引
/// 原列类型
/// 写入的值
public void WriteExecl(string filePath, int celCount, Type celType, Dictionary dicVal, string Mess)
{
#region 将结果写入EXECL
ISheet sheet = null;
ICellStyle dateStyle = null;
using (FileStream file = new FileStream(filePath, FileMode.Open, FileAccess.Read))
{
if (filePath.IndexOf(".xlsx") == -1)//2003
{
HSSFWorkbook hssfworkbook = new HSSFWorkbook(file);
sheet = hssfworkbook.GetSheetAt(0);
// 定义列样式
dateStyle = hssfworkbook.CreateCellStyle();
dateStyle.FillForegroundColor = 3;
dateStyle.VerticalAlignment = VerticalAlignment.Center;
dateStyle.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center;
dateStyle.FillPattern = FillPattern.SolidForeground;
// 第一行最后一列添加操作结果
{
IRow dataRow = sheet.GetRow(0); // 获取表头行
ICell newCell = dataRow.CreateCell(celCount);
newCell.CellStyle = dateStyle;
Type dataType = celType;
string val = Mess;
ExcelHelper.SetCell(newCell, dateStyle, dataType, val);
}
foreach (var item in dicVal)
{
IRow dataRow = sheet.GetRow(item.Key + 1); // 获取表头行
ICell newCell = dataRow.CreateCell(celCount);
newCell.CellStyle = dateStyle;
Type dataType = celType;
string val = item.Value;
ExcelHelper.SetCell(newCell, dateStyle, dataType, val);
}
using (MemoryStream ms = new MemoryStream())
{
hssfworkbook.Write(ms);
ms.Flush();
ms.Position = 0;
using (FileStream fs = new FileStream(filePath, FileMode.Create, FileAccess.Write))
{
byte[] data = ms.ToArray();
fs.Write(data, 0, data.Length);
fs.Flush();
}
}
}
else//2007
{
XSSFWorkbook xssfworkbook = new XSSFWorkbook(file);
sheet = xssfworkbook.GetSheetAt(0);
// 定义列样式
dateStyle = xssfworkbook.CreateCellStyle();
dateStyle = xssfworkbook.CreateCellStyle();
dateStyle.FillForegroundColor = 5;
dateStyle.VerticalAlignment = VerticalAlignment.Center;
dateStyle.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center;
dateStyle.FillPattern = FillPattern.SolidForeground;
foreach (var item in dicVal)
{
IRow dataRow = sheet.GetRow(item.Key + 1); // 获取表头行
ICell newCell = dataRow.CreateCell(celCount);
newCell.CellStyle = dateStyle;
Type dataType = celType;
string val = item.Value;
ExcelHelper.SetCell(newCell, dateStyle, dataType, val);
}
using (MemoryStream ms = new MemoryStream())
{
xssfworkbook.Write(ms);
ms.Flush();
ms.Position = 0;
using (FileStream fs = new FileStream(filePath, FileMode.Create, FileAccess.Write))
{
byte[] data = ms.ToArray();
fs.Write(data, 0, data.Length);
fs.Flush();
}
}
}
}
#endregion
}
#endregion
}
public class DBCells
{
///
/// 表名
///
public string TableName { get; set; }
///
/// 字段名
///
public string CelName { get; set; }
///
/// 字段说明
///
public string CelMemo { get; set; }
///
/// 字段类型
///
public string CelType { get; set; }
///
/// 字段是否允许未空
///
public string CelIsNull { get; set; }
///
/// 字段默认值
///
public string CelDefualVal { get; set; }
///
/// 是否为配置项
///
public bool IsConfig { get; set; }
///
/// Execl名称
///
public string ExeclName { get; set; }
}
public class DBTableCell
{
public string BusType { get; set; } // 业务类型
public string TableType { get; set; } // 表类型
public string TablesName { get; set; } // 表名
public string CellsName { get; set; } // 列名
public string CellsMemo { get; set; } // 备注
public string CellsType { get; set; } // 字段类型
public string CellsNULLABLE { get; set; } // 是否允许未空
}
}