Files
16-Xikai-MesProjectNew/Interface_WebAPI/SlMesDbIterface/WebAPI/WEB/WEB_BusinessLogic.cs
2026-05-29 09:34:04 +08:00

411 lines
16 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 System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Configuration;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using ExternalDataSync;
using MesServerWork;
using MisDataSaveDate;
using System.Net.Http;
using System.Web.Http;
using MisDataSaveDate.MOM;
using System.Data.SqlClient;
using static MisDataSaveDate.Helper.ApiLogHelper;
using WebApi;
using System.Security.Policy;
using System.Data;
using MisDataFunDll;
using System.Net;
namespace MisDataSaveDate
{
/// <summary>
/// WEB业务处理类
/// </summary>
public class WEB_BusinessLogic
{
/// <summary>
/// WEB端发来的请求
/// </summary>
/// <param name="url">请求URL</param>
/// <param name="jobj">请求的JSON对象</param>
/// <returns>处理结果</returns>
public static string WEB_Request(string url, [FromBody] JObject jobj)
{
var result = new MsgResHeader<string>();
result.code = 200;
result.message = "";
if (jobj == null)
{
result.code = 500;
result.message = "参数格式不正确!";
string retString1 = JsonConvert.SerializeObject(result);
SaveMesLog("WEB进入请求", "参数格式不正确!", Helper.MesLogType.ERROR);
MyLog4Net.MyLogHelper.Info("WEB请求进入接口res:", retString1);
return retString1;
}
string str = jobj.ToString();
//存储请求日志
SaveLog_Interface_Request(url, 2, str, out int AID);
try
{
// 解析WEB请求内容
WEB_Request webRequest = JsonConvert.DeserializeObject<WEB_Request>(str);
// 必填字段校验
if (string.IsNullOrWhiteSpace(webRequest.type))
{
throw new Exception("请求类型(type)不能为空");
}
switch (webRequest.type)
{
case "OperAtion_JobStart":
// 手动重新开始工作
// 使用JObject的索引器或Value<T>方法来获取值
string workStation1 = webRequest.paramObj?["工位号"]?.ToString() ?? "";
string orderNo1 = webRequest.paramObj?["订单号"]?.ToString() ?? "";
string workpieceNo1 = webRequest.paramObj?["工件编号"]?.ToString() ?? "";
// 验证必要参数
if (string.IsNullOrWhiteSpace(workStation1) ||
string.IsNullOrWhiteSpace(orderNo1) ||
string.IsNullOrWhiteSpace(workpieceNo1))
{
throw new Exception("OperAtion_JobStart 缺少必要参数:工位号、订单号或工件编号");
}
CALL_Inerface_DataHandle.CALL_Inerface_JobStart(workStation1, orderNo1, workpieceNo1);
break;
case "OperAtion_JobFinished":
// 手动完成工作
// 使用JObject的索引器或Value<T>方法来获取值
string workStation2 = webRequest.paramObj?["工位号"]?.ToString() ?? "";
string orderNo2 = webRequest.paramObj?["订单号"]?.ToString() ?? "";
string workpieceNo2 = webRequest.paramObj?["工件编号"]?.ToString() ?? "";
// 验证必要参数
if (string.IsNullOrWhiteSpace(workStation2) ||
string.IsNullOrWhiteSpace(orderNo2) ||
string.IsNullOrWhiteSpace(workpieceNo2))
{
throw new Exception("OperAtion_JobFinished 缺少必要参数:工位号、订单号或工件编号");
}
CALL_Inerface_DataHandle.CALL_Inerface_JobFinished(workStation2, orderNo2, workpieceNo2);
break;
default:
result.code = 500;
result.message = "无此类型~";
break;
}
}
catch (Exception err)
{
// 记录错误日志
SaveMesLog("WEB端调用接口", err.Message, Helper.MesLogType.ERROR);
result.code = 500;
result.message = err.Message;
}
string retString = JsonConvert.SerializeObject(result);
// 存储响应日志
SaveLog_Interface_Response(retString, AID);
return retString;
}
/// <summary>
/// 批量读取PLC点位值
/// </summary>
/// <param name="url">请求URL</param>
/// <param name="jobj">请求的JSON对象包含OpName和TagTypeCodeIDs数组</param>
/// <returns>处理结果</returns>
public static string WEB_ReadPLCValues(string url, [FromBody] JObject jobj)
{
var result = new MsgResHeader<List<PLCTagValueResult>>
{
code = 200,
message = "",
Data = new List<PLCTagValueResult>()
};
if (jobj == null)
{
result.code = 500;
result.message = "参数格式不正确!";
string retString1 = JsonConvert.SerializeObject(result);
SaveMesLog("WEB批量读取PLC点位值", "参数格式不正确!", Helper.MesLogType.ERROR);
MyLog4Net.MyLogHelper.Info("WEB_ReadPLCValues res:", retString1);
return retString1;
}
string str = jobj.ToString();
// 存储请求日志
SaveLog_Interface_Request(url, 2, str, out int AID);
try
{
string opName = jobj["OpName"]?.ToString() ?? "";
JArray tagTypeCodeIDsArray = jobj["TagTypeCodeIDs"] as JArray;
// 参数校验
if (string.IsNullOrEmpty(opName))
{
throw new Exception("工位号(OpName)不能为空");
}
if (tagTypeCodeIDsArray == null || tagTypeCodeIDsArray.Count == 0)
{
throw new Exception("TagTypeCodeID数组不能为空");
}
int[] tagTypeCodeIDs = tagTypeCodeIDsArray.Select(x => (int)x).ToArray();
// 读取工位全部数据
var rtList = MIS_BASE.ReadPLC_OpName(opName);
if (rtList == null)
{
throw new Exception($"读取工位[{opName}]数据失败");
}
var pp = JsonConvert.SerializeObject(rtList);
// 使用 dynamic 类型避免程序集引用问题
var tagValues = JsonConvert.DeserializeObject<System.Collections.Concurrent.ConcurrentDictionary<string, dynamic>>(pp);
// 根据传入的TagTypeCodeID数组过滤并返回对应的值
foreach (var tagTypeCodeID in tagTypeCodeIDs)
{
var tagResult = new PLCTagValueResult
{
TagTypeCodeID = tagTypeCodeID,
Success = false,
TagValue = null,
Message = ""
};
try
{
var matchedTag = tagValues.Where(x => (int)x.Value.TagTypeCodeID == tagTypeCodeID).FirstOrDefault();
if (matchedTag.Value != null)
{
tagResult.Success = true;
tagResult.TagValue = (int)matchedTag.Value.TagValue;
tagResult.TagName = (string)matchedTag.Value.TagName;
tagResult.OpName = (string)matchedTag.Value.OpName;
tagResult.TimeStamp = (string)matchedTag.Value.TimeStamp;
}
else
{
tagResult.Message = $"未找到TagTypeCodeID={tagTypeCodeID}的点位";
}
}
catch (Exception ex)
{
tagResult.Message = $"读取TagTypeCodeID={tagTypeCodeID}失败: {ex.Message}";
}
result.Data.Add(tagResult);
}
result.message = "读取成功";
}
catch (Exception err)
{
// 记录错误日志
SaveMesLog("WEB批量读取PLC点位值", err.Message, Helper.MesLogType.ERROR);
result.code = 500;
result.message = err.Message;
result.Data = null;
}
string retString = JsonConvert.SerializeObject(result);
// 存储响应日志
SaveLog_Interface_Response(retString, AID);
return retString;
}
/// <summary>
/// 写入PLC点位值
/// </summary>
/// <param name="url">请求URL</param>
/// <param name="jobj">请求的JSON对象包含TagTypeCodeID、OpName和TagValue</param>
/// <returns>处理结果</returns>
public static string WEB_WritePLC(string url, [FromBody] JObject jobj)
{
var result = new MsgResHeader<object>
{
code = 200,
message = "",
Data = null
};
if (jobj == null)
{
result.code = 500;
result.message = "参数格式不正确!";
string retString1 = JsonConvert.SerializeObject(result);
SaveMesLog("WEB写入PLC", "参数格式不正确!", Helper.MesLogType.ERROR);
MyLog4Net.MyLogHelper.Info("WEB_WritePLC res:", retString1);
return retString1;
}
string str = jobj.ToString();
// 存储请求日志
SaveLog_Interface_Request(url, 2, str, out int AID);
try
{
int tagTypeCodeID = jobj["TagTypeCodeID"]?.Value<int>() ?? 0;
string opName = jobj["OpName"]?.ToString() ?? "";
object tagValue = jobj["TagValue"]?.ToObject<object>();
// 参数校验
if (string.IsNullOrEmpty(opName))
{
throw new Exception("工位号(OpName)不能为空");
}
if (tagTypeCodeID == 0)
{
throw new Exception("TagTypeCodeID不能为0");
}
// 调用MIS_BASE.WritePLC方法写入PLC
bool writeResult = MIS_BASE.WritePLC(tagTypeCodeID, opName, tagValue);
if (writeResult)
{
result.code = 200;
result.message = "写入成功";
result.Data = new { Success = true };
}
else
{
result.code = 500;
result.message = "写入失败";
result.Data = new { Success = false };
}
}
catch (Exception err)
{
// 记录错误日志
SaveMesLog("WEB写入PLC", err.Message, Helper.MesLogType.ERROR);
result.code = 500;
result.message = err.Message;
result.Data = new { Success = false };
}
string retString = JsonConvert.SerializeObject(result);
// 存储响应日志
SaveLog_Interface_Response(retString, AID);
return retString;
}
/// <summary>
/// 磨合转序
/// 调用AGV转序接口成功后执行转序存储过程
/// </summary>
/// <param name="url">请求URL</param>
/// <param name="jobj">请求的JSON对象包含转序相关参数</param>
/// <returns>处理结果</returns>
public static string WEB_RunningInTransfer(string url, [FromBody] JObject jobj)
{
var result = new MsgResHeader<object>
{
code = 200,
message = "",
Data = null
};
if (jobj == null)
{
result.code = 500;
result.message = "参数格式不正确!";
string retString1 = JsonConvert.SerializeObject(result);
SaveMesLog("WEB磨合转序", "参数格式不正确!", Helper.MesLogType.ERROR);
MyLog4Net.MyLogHelper.Info("WEB_RunningInTransfer res:", retString1);
return retString1;
}
string str = jobj.ToString();
// 存储请求日志
SaveLog_Interface_Request(url, 2, str, out int AID);
try
{
// 获取参数
string startPositionCode = jobj["startPositionCode"]?.ToString() ?? "";
string endPositionCode = jobj["endPositionCode"]?.ToString() ?? "";
string productCode = jobj["productCode"]?.ToString() ?? "";
string productModel = jobj["productModel"]?.ToString() ?? "";
string targetProcess = jobj["targetProcess"]?.ToString() ?? "";
string targetProcessNo = jobj["targetProcessNo"]?.ToString() ?? "";
// 参数校验
if (string.IsNullOrEmpty(startPositionCode) || string.IsNullOrEmpty(endPositionCode))
{
throw new Exception("起始库位号和目标库位号不能为空");
}
// 1. 调用AGV转序接口
var agvResult = CALL_Inerface_DataHandle.CALL_Inerface_MaterialTransfer(startPositionCode, endPositionCode);
int agvCode = 500;
int.TryParse(agvResult["code"]?.ToString() ?? "500", out agvCode);
if (agvCode != 200)
{
result.code = agvCode;
result.message = $"AGV调度失败{agvResult["message"]?.ToString() ?? ""}";
}
else
{
// 2. AGV调度成功执行转序存储过程
var param = new SqlParameter[] {
new SqlParameter("@库位号", startPositionCode),
new SqlParameter("@产品编号", productCode),
new SqlParameter("@产品型号", productModel),
new SqlParameter("@目标库位号", endPositionCode),
new SqlParameter("@目标工序", targetProcess),
new SqlParameter("@目标工序号", targetProcessNo)
};
DataLinkMesWork2.DataAccess2.ExecuteStoredProcedure("XD_磨合_开始下一序", ref param, out string errMessage);
if (!string.IsNullOrEmpty(errMessage))
{
result.code = 500;
result.message = $"AGV调度成功但存储过程执行失败{errMessage}";
}
else
{
result.code = 200;
result.message = "转序操作成功";
}
}
}
catch (Exception err)
{
// 记录错误日志
SaveMesLog("WEB磨合转序", err.Message, Helper.MesLogType.ERROR);
result.code = 500;
result.message = err.Message;
}
string retString = JsonConvert.SerializeObject(result);
// 存储响应日志
SaveLog_Interface_Response(retString, AID);
return retString;
}
}
}