chore: initial commit

This commit is contained in:
XingCheng3
2026-05-29 09:34:04 +08:00
commit 78ae9dcd2e
683 changed files with 68110 additions and 0 deletions

View File

@@ -0,0 +1,411 @@
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;
}
}
}

View File

@@ -0,0 +1,67 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json.Linq;
namespace MisDataSaveDate
{
/// <summary>
/// WEB请求类型
/// </summary>
public class WEB_Request
{
/// <summary>
/// Type 操作类型 用来区分Web的各操作
/// </summary>
public string type { get; set; }
/// <summary>
/// 参数对象 根据Type 会传递不同的参数
/// 使用JObject可以接收任意JSON结构的数据无需定义实体类
/// </summary>
public JObject paramObj { get; set; }
}
/// <summary>
/// PLC点位值返回结果
/// </summary>
public class PLCTagValueResult
{
/// <summary>
/// TagTypeCodeID
/// </summary>
public int TagTypeCodeID { get; set; }
/// <summary>
/// 是否读取成功
/// </summary>
public bool Success { get; set; }
/// <summary>
/// 点位值
/// </summary>
public object TagValue { get; set; }
/// <summary>
/// 点位名称
/// </summary>
public string TagName { get; set; }
/// <summary>
/// 工位号
/// </summary>
public string OpName { get; set; }
/// <summary>
/// 时间戳
/// </summary>
public string TimeStamp { get; set; }
/// <summary>
/// 消息(错误时返回错误信息)
/// </summary>
public string Message { get; set; }
}
}