|
|
|
|
using Mesnac.Action.ChemicalWeighing.DBHelper;
|
|
|
|
|
using Mesnac.Action.ChemicalWeighing.Entity;
|
|
|
|
|
using Mesnac.Action.ChemicalWeighing.Entity.material;
|
|
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.Data;
|
|
|
|
|
using System.Linq;
|
|
|
|
|
using System.Text;
|
|
|
|
|
using System.Threading.Tasks;
|
|
|
|
|
using System.Windows.Forms;
|
|
|
|
|
|
|
|
|
|
namespace Mesnac.Action.ChemicalWeighing
|
|
|
|
|
{
|
|
|
|
|
public class XLHelper
|
|
|
|
|
{
|
|
|
|
|
public static void DownXlPlan(DataTable dt)
|
|
|
|
|
{
|
|
|
|
|
var list = DataTableHelper.DataTableToList(dt);
|
|
|
|
|
List<Hw_WareHouse_Sub> subList = new List<Hw_WareHouse_Sub>();
|
|
|
|
|
List<xl_recipe> recipeList = new List<xl_recipe>();
|
|
|
|
|
|
|
|
|
|
list.ForEach((a) =>
|
|
|
|
|
{
|
|
|
|
|
Hw_WareHouse_Sub sb = new Hw_WareHouse_Sub();
|
|
|
|
|
sb.MainId = 1;
|
|
|
|
|
sb.PId = a.PId;
|
|
|
|
|
sb.ProductName = a.ProductName;
|
|
|
|
|
sb.BinId = a.BinId == "" || a.BinId == null ? 0 : int.Parse(a.BinId);
|
|
|
|
|
a.Plan_State = 3;//待下发
|
|
|
|
|
sb.MaterialID = a.Material_Code;
|
|
|
|
|
sb.Material_Code = a.Material_Code;
|
|
|
|
|
sb.MaterialName = a.MaterialName;
|
|
|
|
|
sb.MaterialType = a.MaterialType;
|
|
|
|
|
sb.SetWeight = Convert.ToDouble(a.SetWeight);
|
|
|
|
|
sb.SetError = Convert.ToDouble(a.SetError);
|
|
|
|
|
sb.Difference = a.Difference;
|
|
|
|
|
sb.Fixed = a.Fixed == "" || a.Fixed == null ? false : true;
|
|
|
|
|
sb.FixedRatio = a.FixedRatio == a.FixedRatio ? 0.00 : Convert.ToDouble(a.FixedRatio);
|
|
|
|
|
sb.Recipe = a.Recipe;
|
|
|
|
|
sb.Remark = a.Remark;
|
|
|
|
|
subList.Add(sb);
|
|
|
|
|
});
|
|
|
|
|
//查询小料数据
|
|
|
|
|
var xlList = subList.Where(d => d.MaterialType.Contains("尾料"));
|
|
|
|
|
var xt = (from d in xlList
|
|
|
|
|
select new
|
|
|
|
|
{
|
|
|
|
|
d.PId,
|
|
|
|
|
d.ProductName,
|
|
|
|
|
d.MaterialType,
|
|
|
|
|
d.Recipe,
|
|
|
|
|
|
|
|
|
|
}).Distinct();
|
|
|
|
|
foreach (var item in xt)
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
#region 配方
|
|
|
|
|
xl_recipe recipe = new xl_recipe();
|
|
|
|
|
recipe.ID = Guid.NewGuid().ToString("N");
|
|
|
|
|
recipe.Equip_Code = "01";
|
|
|
|
|
recipe.Recipe_Code = item.Recipe;
|
|
|
|
|
recipe.Version = "1";
|
|
|
|
|
recipe.Recipe_Name = item.Recipe;
|
|
|
|
|
recipe.Recipe_Verify = 1;
|
|
|
|
|
recipe.Total_Weight = 0;
|
|
|
|
|
recipe.Total_Error = 0;
|
|
|
|
|
recipe.CreateDateTime = DateTime.Now;
|
|
|
|
|
recipe.IsCheck = 0;
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
#region 物料
|
|
|
|
|
var repiceList = xlList.Where(d => item.PId.Equals(d.PId) && item.ProductName.Equals(d.ProductName) && item.Recipe.Equals(d.Recipe));
|
|
|
|
|
int i = 1;
|
|
|
|
|
List<xl_weigh> weighList = new List<xl_weigh>();
|
|
|
|
|
foreach (var sub in repiceList)
|
|
|
|
|
{
|
|
|
|
|
xl_weigh material = new xl_weigh();
|
|
|
|
|
material.Equip_Code = "01";
|
|
|
|
|
material.Recipe_ID = recipe.ID;
|
|
|
|
|
|
|
|
|
|
material.Weight_Id = i;
|
|
|
|
|
if (sub.Material_Code == null | sub.Material_Code == "")
|
|
|
|
|
{
|
|
|
|
|
throw new Exception("未查询到物料!");
|
|
|
|
|
}
|
|
|
|
|
var obj = GetMaterial(sub.Material_Code);
|
|
|
|
|
if (obj == null)
|
|
|
|
|
{
|
|
|
|
|
throw new Exception("未查询到当前物料!");
|
|
|
|
|
}
|
|
|
|
|
material.Material_ID = obj.ID;
|
|
|
|
|
if (sub.BinId == 0)
|
|
|
|
|
{
|
|
|
|
|
throw new Exception("未查询到对应料仓!");
|
|
|
|
|
}
|
|
|
|
|
var binInfo = GetBinInfo(sub.BinId, obj.ID);
|
|
|
|
|
if (binInfo == null)
|
|
|
|
|
{
|
|
|
|
|
throw new Exception("未查询到对应料仓!");
|
|
|
|
|
}
|
|
|
|
|
material.Bin_Serial = sub.BinId;
|
|
|
|
|
material.Set_Weight = Convert.ToDecimal(sub.SetWeight);
|
|
|
|
|
material.Set_Error = Convert.ToDecimal(sub.SetError);
|
|
|
|
|
recipe.Total_Weight = recipe.Total_Weight + material.Set_Weight;
|
|
|
|
|
recipe.Total_Error = recipe.Total_Error + material.Set_Error;
|
|
|
|
|
weighList.Add(material);
|
|
|
|
|
i++;
|
|
|
|
|
}
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
#region 计划
|
|
|
|
|
xl_plan plan = new xl_plan();
|
|
|
|
|
plan.Dosing_Id = 0;
|
|
|
|
|
|
|
|
|
|
plan.Equip_Code = "01";
|
|
|
|
|
plan.Batch = item.PId;
|
|
|
|
|
plan.ProductName = item.ProductName;
|
|
|
|
|
int serialNum = 0;
|
|
|
|
|
int rtPlanSNum = GetNextSerialNum(); //xl_plan序号
|
|
|
|
|
int lrPlanSNum = GetNextSerialNumFromLRPlan(DateTime.Now); //LR_Plan序号
|
|
|
|
|
if (rtPlanSNum >= lrPlanSNum)
|
|
|
|
|
{
|
|
|
|
|
serialNum = rtPlanSNum;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
serialNum = lrPlanSNum;
|
|
|
|
|
}
|
|
|
|
|
string planID = CommHelper.GenerateNextPlanIDNew(DateTime.Now, 1, serialNum); //计划号
|
|
|
|
|
|
|
|
|
|
plan.Plan_Id = planID;
|
|
|
|
|
plan.Plan_Serial = serialNum;
|
|
|
|
|
plan.Recipe_ID = recipe.ID;
|
|
|
|
|
plan.Recipe_Code = item.Recipe;
|
|
|
|
|
plan.Recipe_Name = item.Recipe;
|
|
|
|
|
plan.Version = "1";
|
|
|
|
|
plan.Recipe_Type = 0;
|
|
|
|
|
plan.Shift_Id = "1";
|
|
|
|
|
plan.Shift_Class = "";
|
|
|
|
|
plan.Plan_Num = 1;
|
|
|
|
|
plan.Real_Num = 0;
|
|
|
|
|
plan.Duration_Time = 0;
|
|
|
|
|
plan.Mixer_Line = "0";
|
|
|
|
|
plan.End_Date = null;
|
|
|
|
|
plan.Weight_Man = null;
|
|
|
|
|
plan.Stock_Man = null;
|
|
|
|
|
plan.Plan_Batch = null;
|
|
|
|
|
plan.Plan_State = (int)PlanState.UnStart;
|
|
|
|
|
plan.Plan_StateText = CommHelper.StateToShow((int)PlanState.UnStart);
|
|
|
|
|
plan.Plan_Date = String.Format("{0:yyyy-MM-dd}", DateTime.Now);
|
|
|
|
|
plan.IF_FLAG = 1;
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
if (recipe == null)
|
|
|
|
|
{
|
|
|
|
|
throw new Exception("配方数据不可为空!");
|
|
|
|
|
}
|
|
|
|
|
if (weighList == null)
|
|
|
|
|
{
|
|
|
|
|
throw new Exception("配方物料数据不可为空!");
|
|
|
|
|
}
|
|
|
|
|
if (plan == null)
|
|
|
|
|
{
|
|
|
|
|
throw new Exception("计划数据不可为空!");
|
|
|
|
|
}
|
|
|
|
|
if (repiceList == null)
|
|
|
|
|
{
|
|
|
|
|
throw new Exception("反应釜计划数据不可为空!");
|
|
|
|
|
}
|
|
|
|
|
bool r = SaveRecipe(recipe, weighList, plan, repiceList.ToList());
|
|
|
|
|
if (r == false)
|
|
|
|
|
{
|
|
|
|
|
string msg = $"批次[{plan.Batch}];配方[{item.Recipe}],导入数据失败!";
|
|
|
|
|
MessageBox.Show(msg, Mesnac.Basic.LanguageHelper.WarnCaption, MessageBoxButtons.OK, MessageBoxIcon.Warning);
|
|
|
|
|
//Console.WriteLine($"批次[{plan.Batch}];配方[{item.Recipe}],导入数据失败!");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//Console.WriteLine($"{item.PId}——{item.ProductName}——{item.Recipe};状态:{r}");
|
|
|
|
|
}
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
{
|
|
|
|
|
string msg = $"配方[{item.Recipe}] 导入失败!异常信息:{ex.Message}";
|
|
|
|
|
MessageBox.Show(msg, Mesnac.Basic.LanguageHelper.WarnCaption, MessageBoxButtons.OK, MessageBoxIcon.Warning);
|
|
|
|
|
//Console.WriteLine($"配方[{item.Recipe}] 导入失败!异常信息:{ex.Message}");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#region 根据二维码获取物料
|
|
|
|
|
public static xl_material GetMaterial(string barCode)
|
|
|
|
|
{
|
|
|
|
|
IFreeSql _freeSql = FreeHelper.Instance;
|
|
|
|
|
string sql = $"select * from xl_material where Material_code='{barCode}'";
|
|
|
|
|
var obj = _freeSql.Select<xl_material>().WithSql(sql).ToOne();
|
|
|
|
|
return obj;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
#region 根据料桶编号和物料二维码查询料仓信息
|
|
|
|
|
public static Pmt_Bin GetBinInfo(int binId, string materialId)
|
|
|
|
|
{
|
|
|
|
|
IFreeSql _freeSql = FreeHelper.Instance;
|
|
|
|
|
string sql = $"select * from Pmt_Bin where Bin_Serial='{binId}' and Material_ID='{materialId}'";
|
|
|
|
|
var obj = _freeSql.Select<Pmt_Bin>().WithSql(sql).ToOne();
|
|
|
|
|
return obj;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
public static int GetNextSerialNum()
|
|
|
|
|
{
|
|
|
|
|
string sql = "SELECT * FROM xl_plan";
|
|
|
|
|
IFreeSql _freeSql = FreeHelper.Instance;
|
|
|
|
|
var result = _freeSql.Select<xl_plan>(sql).Max(d => d.Plan_Serial);
|
|
|
|
|
|
|
|
|
|
if (result == 0)
|
|
|
|
|
{
|
|
|
|
|
return 1;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
return Convert.ToInt32(result) + 1;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#region GetNextSerialNumFromLRPlan 获取下一个可用的序号SerialNum 规则:同机台、同日期、同班次 计划号最后2位的最大值加1(xl_plan)
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 获取下一个可用的序号
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="planDate">计划生产日期</param>
|
|
|
|
|
/// <returns>返回可用的序号</returns>
|
|
|
|
|
public static int GetNextSerialNumFromLRPlan(DateTime planDate)
|
|
|
|
|
{
|
|
|
|
|
string strSql = $"SELECT * FROM LR_plan where LEFT(Plan_Id,8) = '{String.Format("{0:yyyyMMdd}", planDate)}' and RIGHT(Plan_Id,2)=(select MAX(RIGHT(Plan_Id,2)) as Id from LR_plan)";
|
|
|
|
|
IFreeSql _freeSql = FreeHelper.Instance;
|
|
|
|
|
var result = _freeSql.Select<LR_plan>().WithSql(strSql).ToOne();
|
|
|
|
|
|
|
|
|
|
if (result == null)
|
|
|
|
|
{
|
|
|
|
|
return 1;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
string serial = result.Plan_Id.Substring(result.Plan_Id.Length - 2, 2);
|
|
|
|
|
return Convert.ToInt32(serial) + 1;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#region 保存配方、计划物料信息
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 保存配方、计划物料信息
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="recipeList">配方、物料</param>
|
|
|
|
|
/// <param name="xl_weighList"></param>
|
|
|
|
|
/// <param name="plan"></param>
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
/// <exception cref="Exception"></exception>
|
|
|
|
|
public static bool SaveRecipe(xl_recipe recipeList, List<xl_weigh> xl_weighList, xl_plan plan, List<Hw_WareHouse_Sub> sub)
|
|
|
|
|
{
|
|
|
|
|
IFreeSql _freeSql = FreeHelper.Instance;
|
|
|
|
|
_freeSql.Transaction(() =>
|
|
|
|
|
{
|
|
|
|
|
var affrows = _freeSql.Insert(recipeList).ExecuteAffrows();//保存配方
|
|
|
|
|
if (affrows < 1)
|
|
|
|
|
throw new Exception("保存小料配方失败!");
|
|
|
|
|
affrows = _freeSql.Insert(xl_weighList).ExecuteAffrows();//保存配方物料
|
|
|
|
|
if (affrows < 1)
|
|
|
|
|
throw new Exception("保存配方物料失败!");
|
|
|
|
|
affrows = _freeSql.Insert(plan).ExecuteAffrows();//保存计划
|
|
|
|
|
if (affrows < 1)
|
|
|
|
|
throw new Exception("保存计划失败!");
|
|
|
|
|
affrows = _freeSql.Insert(sub).ExecuteAffrows();//保存反应釜计划
|
|
|
|
|
if (affrows < 1)
|
|
|
|
|
throw new Exception("保存反应釜计划失败!");
|
|
|
|
|
});
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
#endregion
|
|
|
|
|
}
|
|
|
|
|
}
|