Files
15-WeiChai-WC_CentralControl/SAP/SAP_Sync/SyncFunc_From_SAP.cs

426 lines
18 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using Newtonsoft.Json;
using SYNC_SAP_MES;
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Net.NetworkInformation;
using System.Runtime.InteropServices.ComTypes;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Xml.Linq;
/// <summary>
/// SlMesDbIterface
/// </summary>
namespace SYNC_SAP_MES
{
/// <summary>
/// SyncFunc_From_SAP
/// </summary>
public class SyncFunc_From_SAP
{
/// <summary>
/// 同步的年月日
/// </summary>
public static string SyncDate = "";
/// <summary>
/// 同步的变更时间
/// </summary>
public static string SyncTime = "";
/// <summary>
/// 发动机要生成流水号的起始流水号
/// </summary>
public static int EngineFlowNo = 0;
/// <summary>
/// 发动机要生成流水号的起始流水号
/// 的变更时间
/// </summary>
public static string EngineFlowNoTime = "";
/// <summary>
/// 当前次数,用于刷新计数
/// </summary>
public static int CurrCount = 0;
/// <summary>
/// 同步中...
/// </summary>
public static bool IsSyncing = false;
/// <summary>
/// 同步执行任务
/// </summary>
public static void SyncTask_SAP()
{
//new Thread(new ThreadStart(delegate ()
//{
// while (true)
// {
// try
// {
// if (CurrCount <= 0)
// {
// SyncFunc_From_SAP.SyncDataOperationTask("设定时间");
// CurrCount = PP.ReachSyncCount;
// }
// CurrCount--;
// }
// catch (Exception) { }
// Thread.Sleep(1000 * 60 * 60); //10分钟
// }
//}))
//{ IsBackground = true }.Start();
new Thread(new ThreadStart(delegate ()
{
while (true)
{
try
{
SyncFunc_From_SAP.SyncBarCodeDataOperationTask("周期执行");
}
catch (Exception) { }
Thread.Sleep(1000 * 1); //1秒
}
}))
{ IsBackground = true }.Start();
}
/// <summary>
/// SyncGuide
/// </summary>
/// <param name="call"></param>
public static void SyncDataOperationTask(object call)
{
var mode = (string)call;
if (IsSyncing == false)
{
IsSyncing = true;
try
{
var dt_01 = DateTime.Now;
PP.main.ShowError($"[{mode}]AMS开始同步...");
Move_Mes_DataOperation();
var dt_02 = DateTime.Now;
PP.main.ShowError($"[{mode}]AMS已完成一次同步总耗时{(dt_02 - dt_01).TotalMilliseconds.ToString("0.")} ms");
PP.main.ShowError($"");
PP.main.ShowError($"\r\n");
}
catch (Exception err)
{
PP.main.ShowError($"AMS数据同步出错{err.Message}");
}
IsSyncing = false;
}
else
{
PP.main.ShowError("您正在同步操作,不能重复操作!");
}
}
/// <summary>
/// SyncBarCodeGuide
/// </summary>
/// <param name="call"></param>
public static void SyncBarCodeDataOperationTask(object call)
{
var mode = (string)call;
if (IsSyncing == false)
{
IsSyncing = true;
try
{
var dt_01 = DateTime.Now;
//PP.main.ShowError($"[{mode}]AMS开始同步...");
Move_Mes_BarCode_DataOperation();
var dt_02 = DateTime.Now;
//PP.main.ShowError($"[{mode}]AMS已完成一次同步总耗时{(dt_02 - dt_01).TotalMilliseconds.ToString("0.")} ms");
//PP.main.ShowError($"");
//PP.main.ShowError($"\r\n");
}
catch (Exception err)
{
PP.main.ShowError($"AMS扫码数据同步出错{err.Message}");
}
IsSyncing = false;
}
else
{
PP.main.ShowError("您正在扫码数据同步操作,不能重复操作!");
}
}
/// <summary>
/// SyncBarCode
/// </summary>
private static void Move_Mes_BarCode_DataOperation()
{
//OnLineStatus_Check();
//lineId计划产线idstring必填如一号厂总装线120000001
//startDate计划开始时间date必填
//isLocked计划状态是否已锁定1代表未锁定3代表已锁定非必填
var LineID = "120000001";
//var StartDate = "2022-06-28";
var StartDate = SyncDate;
var isLocked = "3";
try
{
//StartDate = "2024-09-06";
var PlanData_From_SAP = CALL_Interfalce_WebAPI.Get_BarCode_Plans_ByWebAPI(LineID, StartDate);
var res = Sync_BarCode_ProductPlan_To_AMS(LineID, StartDate, PlanData_From_SAP);
}
catch (Exception err)
{
PP.main.ShowError($"【{LineID}_{StartDate}】生产计划读取失败,{err.Message}");
}
}
/// <summary>
/// Sync
/// </summary>
private static void Move_Mes_DataOperation()
{
//OnLineStatus_Check();
//lineId计划产线idstring必填如一号厂总装线120000001
//startDate计划开始时间date必填
//isLocked计划状态是否已锁定1代表未锁定3代表已锁定非必填
var LineID = "120000001";
//var StartDate = "2022-06-28";
var StartDate = SyncDate;
var isLocked = "3";
try
{
//StartDate = "2024-09-09";
var PlanData_From_SAP = CALL_Interfalce_WebAPI.Get_Plans_ByWebAPI(LineID, StartDate, isLocked);
var res = Sync_ProductPlan_To_AMS(LineID, StartDate, PlanData_From_SAP);
}
catch (Exception err)
{
PP.main.ShowError($"【{LineID}_{StartDate}】生产计划读取失败,{err.Message}");
}
}
public static bool Sync_ProductPlan_To_AMS(string LineID,string startDate, SyncPlan_WebAPI_ResponseBody PlanData)
{
var res_success = PlanData.code == "200" ? true : false;
var res_Message = PlanData.message;
if (res_success)
{
/*
(name = "productCode", value = "发动机编号")
(name = "itemCode", value = "订货号")
(name = "itemId", value = "订货号Id")
(name = "productType", value = "机型")
(name = "wipEntityId", value = "工单ID")
(name = "wipEntityName", value = "工单号")
(name = "bomHeaderId", value = "bom头id")
(name = "mesPlanOrder", value = "mes计划顺序")
(name = "erpStartDate", value = "计划开始时间")
(name = " mesStartDate", value = "总装上线扫描时间")
(name = "isLocked", value = "计划状态")
*/
var min_EngineNo = PlanData.Data.Min(s=>s.productCode);
var max_EngineNo = PlanData.Data.Max(s=>s.productCode);
var sql_AMS_Plan = $" SELECT [发动机编号],[订货号],[订货号ID],[机型号],[工单ID],[工单号],[BOM头ID],[MES计划顺序],[计划开始时间]," +
$"[总装上线扫描时间],[计划状态],[计划同步时间],[执行状态],[LineID],[AMS计划顺序] FROM [潍柴_接口_生产计划_执行计划] " +
$" where [发动机编号] >='{min_EngineNo}' and [发动机编号] <='{max_EngineNo}' order by AID";
SqlOperation.ExecuteSql(sql_AMS_Plan, out DataTable dt_PlanInAMS, out string err1);
DataTable dt_NewPlans = dt_PlanInAMS.Clone();
dt_NewPlans.TableName = "潍柴_接口_生产计划_执行计划";
int maxSort = Get_AMS_MaxSort();
for (int i = 0; i < PlanData.Data.Count; i++)
{
var check_ifExist = dt_PlanInAMS.Select($"发动机编号='{PlanData.Data[i].productCode}'");
if (check_ifExist.Length > 0)
{
continue;
}
DataRow newPlan= dt_NewPlans.NewRow();
newPlan["发动机编号"] = PlanData.Data[i].productCode;
newPlan["订货号"] = PlanData.Data[i].itemCode;
newPlan["订货号ID"] = PlanData.Data[i].itemId;
newPlan["机型号"] = PlanData.Data[i].productType;
newPlan["工单ID"] = PlanData.Data[i].wipEntityId;
newPlan["工单号"] = PlanData.Data[i].wipEntityName;
newPlan["BOM头ID"] = PlanData.Data[i].bomHeaderId;
newPlan["MES计划顺序"] = PlanData.Data[i].mesPlanOrder;
newPlan["计划开始时间"] = PlanData.Data[i].erpStartDate;
if(PlanData.Data[i].mesStartDate != null) newPlan["总装上线扫描时间"] = PlanData.Data[i].mesStartDate;
newPlan["计划状态"] = PlanData.Data[i].isLocked;
newPlan["计划同步时间"] = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
newPlan["执行状态"] = 1;
newPlan["LineID"] = LineID;
newPlan["AMS计划顺序"] = maxSort + i;
dt_NewPlans.Rows.Add(newPlan);
}
if (dt_NewPlans.Rows.Count > 0)
{
SqlOperation.SqlbulkcopyInsert(dt_NewPlans, out string err);
SqlOperation.ExecuteSql($"update 潍柴_接口_生产计划_标记 set [日期]='{startDate}',[更新时间]='{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}'", out string err2);
if (err.Length==0) PP.main.ShowError($"【{LineID}_{startDate}】计划数据读取成功!新增数量【{dt_NewPlans.Rows.Count}】\r\n");
else PP.main.ShowError($"【{LineID}_{startDate}】计划数据读取失败,{res_Message}");
}
else PP.main.ShowError($"【{LineID}_{startDate}】计划数据读取成功!新增数量【{dt_NewPlans.Rows.Count}】\r\n");
return true;
}
else
{
PP.main.ShowError($"【{LineID}_{startDate}】生产计划读取失败,{res_Message}");
return false;
}
}
public static int Get_AMS_MaxSort()
{
var sql = $" SELECT max(AMS计划顺序 + 1) as maxSort FROM 潍柴_接口_生产计划_执行计划";
SqlOperation.ExecuteSql(sql, out DataTable maxSortDt, out string err1);
int maxSort = Convert.ToInt32(maxSortDt.Rows[0]["maxSort"]);
return maxSort;
}
public static bool Sync_BarCode_ProductPlan_To_AMS(string LineID, string startDate, SyncPlan_WebAPI_ResponseBody PlanData)
{
var res_success = PlanData.code == "200" ? true : false;
var res_Message = PlanData.message;
if (res_success)
{
/*
(name = "productCode", value = "发动机编号")
(name = "itemCode", value = "订货号")
(name = "itemId", value = "订货号Id")
(name = "productType", value = "机型")
(name = "wipEntityId", value = "工单ID")
(name = "wipEntityName", value = "工单号")
(name = "bomHeaderId", value = "bom头id")
(name = "mesPlanOrder", value = "mes计划顺序")
(name = "erpStartDate", value = "计划开始时间")
(name = "mesStartDate", value = "总装上线扫描时间段的开始时间")
(name = "isLocked", value = "计划状态")
*/
var min_EngineNo = PlanData.Data.Min(s => s.productCode);
var max_EngineNo = PlanData.Data.Max(s => s.productCode);
string inWhere = "(";
if (PlanData.Data.Count > 0) {
PlanData.Data.ForEach(item =>
{
inWhere = inWhere += $"'{item.productCode}',";
});
inWhere = inWhere.Remove(inWhere.Length - 1) + ")";
}
int maxSort = Get_AMS_MaxSort();
var sql_AMS_Plan = $" SELECT [发动机编号],[订货号],[订货号ID],[机型号],[工单ID],[工单号],[BOM头ID],[MES计划顺序],[计划开始时间]," +
$"[总装上线扫描时间],[计划状态],[计划同步时间],[执行状态],[LineID],[AMS计划顺序] FROM [潍柴_接口_生产计划_执行计划] " +
$" where [发动机编号] in {inWhere} order by AID";
SqlOperation.ExecuteSql(sql_AMS_Plan, out DataTable dt_PlanInAMS, out string err1);
DataTable dt_NewPlans = dt_PlanInAMS.Clone();
dt_NewPlans.TableName = "潍柴_接口_生产计划_执行计划";
for (int i = 0; i < PlanData.Data.Count; i++)
{
var check_ifExist = dt_PlanInAMS.Select($"发动机编号='{PlanData.Data[i].productCode}'");
if (check_ifExist.Length > 0)
{
continue;
}
DataRow newPlan = dt_NewPlans.NewRow();
newPlan["发动机编号"] = PlanData.Data[i].productCode;
newPlan["订货号"] = PlanData.Data[i].itemCode;
newPlan["订货号ID"] = PlanData.Data[i].itemId;
newPlan["机型号"] = PlanData.Data[i].productType;
newPlan["工单ID"] = PlanData.Data[i].wipEntityId;
newPlan["工单号"] = PlanData.Data[i].wipEntityName;
newPlan["BOM头ID"] = PlanData.Data[i].bomHeaderId;
newPlan["MES计划顺序"] = PlanData.Data[i].mesPlanOrder;
newPlan["计划开始时间"] = PlanData.Data[i].erpStartDate;
if (PlanData.Data[i].mesStartDate != null) newPlan["总装上线扫描时间"] = PlanData.Data[i].mesStartDate;
newPlan["计划状态"] = PlanData.Data[i].isLocked;
newPlan["计划同步时间"] = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
newPlan["执行状态"] = 1;
newPlan["LineID"] = LineID;
newPlan["AMS计划顺序"] = maxSort;
maxSort++;
dt_NewPlans.Rows.Add(newPlan);
}
if (dt_NewPlans.Rows.Count > 0)
{
SqlOperation.SqlbulkcopyInsert(dt_NewPlans, out string err);
SqlOperation.ExecuteSql($"update 潍柴_接口_生产计划_标记 set [日期]='{startDate}',[更新时间]='{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}'", out string err2);
if (err.Length == 0)
{
PP.main.ShowError($"【{LineID}_{startDate}】计划数据读取成功!新增数量【{dt_NewPlans.Rows.Count}】");
// 发送给MisFun接口 重新申请上线 接受反馈值记录到日志
SyncPlan_WebAPI_ResponseBody res = CALL_Interfalce_WebAPI.Put_MisFun_ByWebAPI("1","OP3020");
if(res.code == "200") PP.main.ShowError($"【自动申请上线成功】Code:{res.code} msg:{res.message}\r\n");
else PP.main.ShowError($"【自动申请上线失败】Code:{res.code} msg:{res.message}\r\n");
}
else PP.main.ShowError($"【{LineID}_{startDate}】计划数据读取失败,{res_Message}");
}
//else PP.main.ShowError($"【{LineID}_{startDate}】计划数据读取成功!新增数量【{dt_NewPlans.Rows.Count}】\r\n");
return true;
}
else
{
PP.main.ShowError($"【{LineID}_{startDate}】生产计划读取失败,{res_Message}");
return false;
}
}
/// <summary>
/// 检查在线状态
/// </summary>
public static void OnLineStatus_Check()
{
try
{
PP.OnLine_Sql = SqlOperation.ExecuteSql("select getdate()", out DataTable dt, out string error);
}
catch (Exception err)
{
PP.OnLine_Sql = false;
}
try
{
//PP.OnLine_SAP = READ_SAP.GetMCode().Rows.Count > 0 ? true : false;
PP.OnLine_SAP = Ping("mes4api.weichai.com");
}
catch (Exception err)
{
PP.OnLine_SAP = false;
}
}
private static bool Ping(string ip)
{
return new Ping().Send(ip).Status == IPStatus.Success ? true : false;
}
}
}