using System;
|
using System.Collections.Generic;
|
using System.Linq;
|
using System.Linq.Expressions;
|
using System.Reflection.Metadata;
|
using System.Security.Cryptography;
|
using System.Text;
|
using System.Threading.Tasks;
|
using Newtonsoft.Json;
|
using OfficeOpenXml.FormulaParsing.Excel.Functions.Math;
|
using SqlSugar;
|
using WIDESEA_Common;
|
using WIDESEA_Common.AGVEunm;
|
using WIDESEA_Core;
|
using WIDESEA_Core.Enums;
|
using WIDESEA_Core.Helper;
|
using WIDESEA_Core.Log;
|
using WIDESEA_ITaskInfoService;
|
using WIDESEA_Model.Models;
|
using static WIDESEA_Common.AGVEunm.AGVTaskrevoke;
|
|
|
namespace WIDESEA_TaskInfoService
|
{
|
|
public partial class TaskService
|
{
|
public string url1 = AppSettings.Configuration["AGVTaskrevokes"];
|
/// <summary>
|
/// 立库出库AGV搬运
|
/// </summary>
|
/// <param name="outTask"></param>
|
/// <returns></returns>
|
public WebResponseContent ShelfOutboundCarry(Dt_Task outTask)
|
{
|
Dt_CachePoint cachePoint = GetCachePointByStartPoint(outTask.TargetAddress);
|
|
Dt_Task task = new()
|
{
|
CurrentAddress = outTask.TargetAddress,
|
Grade = 0,
|
NextAddress = cachePoint.PointCode,
|
OrderNo = outTask.OrderNo,
|
PalletCode = outTask.PalletCode + "-AGV",
|
Roadway = "",
|
SourceAddress = outTask.TargetAddress,
|
TargetAddress = cachePoint.PointCode,
|
SourceKey = outTask.TaskId,
|
TaskNum = BaseDal.GetTaskNum(nameof(SequenceEnum.SeqTaskNum)),
|
TaskStatus = AGVTaskStatusEnum.AGV_New.ObjToInt(),
|
TaskType = TaskTypeEnum.AGVCarry.ObjToInt(),
|
CreateDate = DateTime.Now,
|
Creater = App.User.UserId > 0 ? App.User.UserName : "System",
|
};
|
cachePoint.PointStatus = LocationStatusEnum.Lock.ObjToInt();
|
|
_basicService.CachePointService.Repository.UpdateData(cachePoint);
|
Repository.AddData(task);
|
return WebResponseContent.Instance.OK();
|
}
|
|
/// <summary>
|
/// 叫料
|
/// </summary>
|
/// <param name="endPoint"></param>
|
/// <returns></returns>
|
public WebResponseContent CallMateriel(string endPoint)
|
{
|
try
|
{
|
Dt_CachePoint cachePoint = GetCachePointByEndPoint(endPoint);
|
|
Dt_Task task = new Dt_Task()
|
{
|
CurrentAddress = cachePoint.PointCode,
|
Grade = 0,
|
NextAddress = endPoint,
|
OrderNo = "",
|
PalletCode = cachePoint.Remark,
|
Roadway = "",
|
SourceAddress = cachePoint.PointCode,
|
TargetAddress = endPoint,
|
SourceKey = 0,
|
TaskNum = BaseDal.GetTaskNum(nameof(SequenceEnum.SeqTaskNum)),
|
TaskStatus = AGVTaskStatusEnum.AGV_New.ObjToInt(),
|
TaskType = TaskTypeEnum.AGVCarry.ObjToInt(),
|
};
|
cachePoint.PointStatus = LocationStatusEnum.Lock.ObjToInt();
|
|
_basicService.CachePointService.Repository.UpdateData(cachePoint);
|
Repository.AddData(task);
|
return WebResponseContent.Instance.OK();
|
}
|
catch (Exception ex)
|
{
|
return WebResponseContent.Instance.Error(ex.Message);
|
}
|
|
}
|
|
/// <summary>
|
/// 物料搬运
|
/// </summary>
|
/// <param name="startPoint"></param>
|
/// <returns></returns>
|
public WebResponseContent MaterielCarry(string startPoint)
|
{
|
try
|
{
|
Dt_CachePoint cachePoint = GetCachePointByStartPoint(startPoint);
|
|
Dt_Task task = new()
|
{
|
CurrentAddress = startPoint,
|
Grade = 0,
|
NextAddress = cachePoint.PointCode,
|
OrderNo = "",
|
PalletCode = startPoint + "-AGV",
|
Roadway = "",
|
SourceAddress = startPoint,
|
TargetAddress = cachePoint.PointCode,
|
SourceKey = 0,
|
TaskNum = BaseDal.GetTaskNum(nameof(SequenceEnum.SeqTaskNum)),
|
TaskStatus = AGVTaskStatusEnum.AGV_New.ObjToInt(),
|
TaskType = TaskTypeEnum.AGVCarry.ObjToInt(),
|
};
|
cachePoint.PointStatus = LocationStatusEnum.Lock.ObjToInt();
|
|
_basicService.CachePointService.Repository.UpdateData(cachePoint);
|
Repository.AddData(task);
|
return WebResponseContent.Instance.OK();
|
}
|
catch (Exception ex)
|
{
|
return WebResponseContent.Instance.Error(ex.Message);
|
}
|
}
|
|
private Dt_CachePoint GetCachePointByStartPoint(string startPoint)
|
{
|
Dt_AreaRouter areaRouter = _basicService.AreaRouterService.Repository.QueryFirst(x => x.StartArea == startPoint);
|
if (areaRouter == null)
|
{
|
throw new Exception("未找到路由信息!");
|
}
|
Dt_AreaInfo areaInfo = _basicService.AreaInfoService.Repository.QueryFirst(x => x.AreaCode == areaRouter.NextArea);
|
if (areaInfo == null)
|
{
|
throw new Exception("未找到下一区域信息!");
|
}
|
|
Dt_CachePoint? cachePoint = _basicService.CachePointService.AssignCachePoint(areaInfo.Id);
|
if (cachePoint == null)
|
{
|
throw new Exception("未找到空闲缓存点!");
|
}
|
|
return cachePoint;
|
}
|
|
private Dt_CachePoint GetCachePointByEndPoint(string endPoint)
|
{
|
Dt_AreaRouter areaRouter = _basicService.AreaRouterService.Repository.QueryFirst(x => x.NextArea == endPoint);
|
if (areaRouter == null)
|
{
|
throw new Exception("未找到路由信息!");
|
}
|
Dt_AreaInfo areaInfo = _basicService.AreaInfoService.Repository.QueryFirst(x => x.AreaCode == areaRouter.StartArea);
|
if (areaInfo == null)
|
{
|
throw new Exception("未找到起点缓存区域信息!");
|
}
|
|
Dt_CachePoint? cachePoint = _basicService.CachePointService.GetIbStockCachePoint(areaInfo.Id);
|
if (cachePoint == null)
|
{
|
throw new Exception("未找到有货缓存点!");
|
}
|
return cachePoint;
|
}
|
|
public object AGVTaskFeedBack(AGVTaskFeedBackModel model)
|
{
|
Dt_Task task = BaseDal.QueryFirst(x => x.TaskId == Convert.ToInt32(model.Task_id));
|
if (task == null)
|
{
|
return new { code = 404, message = "未找到该任务!" };
|
}
|
|
Dt_CachePoint startCachePoint = _basicService.CachePointService.Repository.QueryFirst(x => x.PointCode == task.SourceAddress);
|
if (startCachePoint != null)
|
{
|
startCachePoint.PointStatus = LocationStatusEnum.Free.ObjToInt();
|
_basicService.CachePointService.Repository.UpdateData(startCachePoint);
|
}
|
|
Dt_CachePoint endCachePoint = _basicService.CachePointService.Repository.QueryFirst(x => x.PointCode == task.TargetAddress);
|
if (endCachePoint != null)
|
{
|
endCachePoint.PointStatus = LocationStatusEnum.InStock.ObjToInt();
|
_basicService.CachePointService.Repository.UpdateData(endCachePoint);
|
}
|
BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId == 0 ? OperateType.自动完成 : OperateType.人工完成);
|
|
return new { code = 200, message = "成功" };
|
}
|
/// <summary>
|
/// 查询AGV新建任务
|
/// </summary>
|
/// <returns></returns>
|
public List<Dt_Task> GetTasks()
|
{
|
WebResponseContent content = new WebResponseContent();
|
//Expression<Func<Dt_Task, bool>> expressionOrder = x => true;
|
return BaseDal.QueryData(x => x.TaskStatus == AGVTaskStatusEnum.AGV_New.ObjToInt() || x.TaskStatus == AGVTaskStatusEnum.AGV_Wait.ObjToInt()).ToList();
|
}
|
/// <summary>
|
/// 查询原材料出库任务
|
/// </summary>
|
/// <returns></returns>
|
public Dt_Task GetTasksout()
|
{
|
WebResponseContent content = new WebResponseContent();
|
//Expression<Func<Dt_Task, bool>> expressionOrder = x => true;
|
return BaseDal.QueryFirst(x => x.TaskType == TaskTypeEnum.Outbound.ObjToInt() && x.SourceAddress.Contains("原材料") && x.TaskStatus == AGVTaskStatusEnum.AGV_Query.ObjToInt());
|
}
|
/// <summary>
|
/// 查询成品有货货位
|
/// </summary>
|
/// <returns></returns>
|
public Dt_CachePoint GetTasksoin()
|
{
|
WebResponseContent content = new WebResponseContent();
|
Expression<Func<Dt_CachePoint, bool>> expressionOrder = x => true;
|
return _basicService.CachePointService.Repository.QueryFirst(x => x.PointCode.Contains("成品库") && x.PointStatus == LocationStatusEnum.InStock.ObjToInt());
|
}
|
/// <summary>
|
/// AGV告警反馈
|
/// </summary>
|
/// <param name="saveModel"></param>
|
/// <returns></returns>
|
public WCSback EquipmentTask(AGVTaskEquipment saveModel)
|
{
|
WCSback content = new WCSback();
|
try
|
{
|
var broad = saveModel.data.detail.FirstOrDefault();
|
Dt_Equipment equipment = new Dt_Equipment
|
{
|
deviceId = broad.deviceId.ToString(),
|
deviceName = broad.deviceName.ToString(),
|
taskNo = broad.taskNo.ToString(),
|
eventId = broad.eventId.ToString(),
|
title = broad.title.ToString(),
|
message = broad.message.ToString(),
|
status = broad.status.ToString(),
|
Creater = App.User.UserId > 0 ? App.User.UserName : "System",
|
};
|
_basicService.EquipmentService.AddData(equipment);
|
content = WCSback.Instance.OK();
|
}
|
catch (Exception ex)
|
{
|
content = WCSback.Instance.Error($"异常,错误信息:{ex.Message}");
|
throw;
|
}
|
return content;
|
}
|
public WebResponseContent PrintStatusUp(int tasknum, string palletCode)
|
{
|
WebResponseContent content = new WebResponseContent();
|
try
|
{
|
Dt_Task task = BaseDal.QueryFirst(x => x.TaskNum == tasknum && x.PalletCode == palletCode);
|
if (task == null)
|
{
|
return content.Error("打印信息不存在");
|
}
|
task.Status = PrintEnum.Printed.ObjToInt();
|
BaseDal.UpdateData(task);
|
return content.OK();
|
}
|
catch (Exception ex)
|
{
|
content.Error("错误:" + ex.Message);
|
}
|
return content;
|
}
|
/// <summary>
|
/// 叉车报警
|
/// </summary>
|
/// <returns></returns>
|
public WebResponseContent GetConfig()
|
{
|
WebResponseContent content = new WebResponseContent();
|
DateTime currentTime = DateTime.Now; // 获取当前时间
|
DateTime twoSecondsBefore = currentTime.AddSeconds(-1000);
|
Dt_Equipment equipment = _basicService.EquipmentService.Repository.QueryFirst(x => x.CreateDate > twoSecondsBefore);
|
if (equipment != null)
|
{
|
content = WebResponseContent.Instance.OK(data: "设备id" + equipment.deviceId.ToString() + " " + "设备名称" + equipment.deviceName.ToString() + " " + "任务号" + equipment.taskNo.ToString()
|
+ " " + equipment.eventId.ToString() + " " + "告警标题" + equipment.title.ToString() + " " + "告警内容" + equipment.message.ToString() + " " + "告警状态" + equipment.status.ToString());
|
}
|
return content;
|
}
|
|
/// <summary>
|
/// 任务完成
|
/// </summary>
|
/// <param name="feedback"></param>
|
/// <returns></returns>
|
public WCSback UpdateAgvTask(AGVTaskFeedback feedback)
|
{
|
try
|
{
|
WCSback content = new WCSback();
|
var bored = feedback.data.detail.FirstOrDefault();
|
//接受任务号对应wcs任务号,任务状态判断.......需修改
|
int tasknum = bored.taskNo.ObjToInt();//任务号
|
int taskState = bored.taskState.ObjToInt();//任务状态
|
var task = BaseDal.QueryData(x => x.TaskNum == tasknum).First();
|
if (task != null)
|
{
|
Update(task, taskState);
|
content.code = 200;
|
content.message = "处理成功";
|
}
|
return content;
|
}
|
catch (Exception ex)
|
{
|
return WCSback.Instance.Error(ex.Message);
|
}
|
}
|
private void Update(Dt_Task task, int taskState)
|
{
|
Thread.Sleep(1000);
|
if (taskState == 99)
|
{
|
int TaskStatus = AGVTaskStatusEnum.AGV_Finish.ObjToInt();
|
_taskHtyService.AddTaskHty(task, TaskStatus);
|
HCJFree(task, TaskStatus);
|
BaseDal.DeleteData(task);
|
WriteLog.GetLog("无人叉车任务完成").Write("任务号:" + task.TaskNum, "无人叉车任务完成");
|
}
|
else if (taskState == 90)
|
{
|
int TaskStatus = AGVTaskStatusEnum.AGV_Cancel.ObjToInt();
|
_taskHtyService.AddTaskHty(task, TaskStatus);
|
HCJFree(task, TaskStatus);
|
BaseDal.DeleteData(task);
|
WriteLog.GetLog("无人叉车任务取消").Write("任务号:" + task.TaskNum, "无人叉车任务取消");
|
}
|
else if (taskState == 91)
|
{
|
int TaskStatus = AGVTaskStatusEnum.AGV_Fail.ObjToInt();
|
_taskHtyService.AddTaskHty(task, TaskStatus);
|
HCJFree(task, TaskStatus);
|
BaseDal.DeleteData(task);
|
}
|
else if (taskState == 93)
|
{
|
int TaskStatus = AGVTaskStatusEnum.AGV_Complete.ObjToInt();
|
if (task.SourceAddress.Contains("原材料库"))
|
{
|
HCJCope(task, TaskStatus);
|
}
|
BaseDal.UpdateData(task);
|
}
|
else if (taskState == 60)
|
{
|
task.TaskStatus = AGVTaskStatusEnum.AGV_Executing.ObjToInt();
|
BaseDal.UpdateData(task);
|
}
|
}
|
/// <summary>
|
/// 撤销已下发任务
|
/// </summary>
|
/// <param name="taskNum">任务号</param>
|
/// <returns>返回处理结果</returns>
|
public WebResponseContent AGVTaskrevokes(int tasknum)
|
{
|
try
|
{
|
WebResponseContent content = new WebResponseContent();
|
Dt_Task task = BaseDal.QueryFirst(x => x.TaskNum == tasknum);
|
AGVTaskrevoke taskrevoke = new AGVTaskrevoke();
|
revoke data = new revoke();
|
Taskrevoke taskrevoke1 = new Taskrevoke();
|
{
|
taskrevoke1.taskNo = task.TaskNum.ToString();
|
DateTime date = DateTime.Now;
|
taskrevoke1.stateTime = date.ToString("yyyy-MM-dd HH:mm:ss");
|
taskrevoke1.taskState = "90";
|
taskrevoke1.toLoc = task.TargetAddress.ToString();
|
DateTime date1 = task.CreateDate;
|
taskrevoke1.taskDate = date1.ToString("yyyy-MM-dd HH:mm:ss");
|
}
|
data.detail.Add(taskrevoke1);
|
taskrevoke.data = data;
|
var time = new DateTimeOffset(DateTime.Now);
|
long timestampStr = time.ToUnixTimeMilliseconds();//时间戳
|
|
string appkeystr = "appsalt=" + AGVopenApi.appsalt + "&appkey=" + AGVopenApi.appkey;
|
|
string appkeyEcrypt = GetMD5Hex(appkeystr);
|
|
string origin = appkeyEcrypt + "&appsecret=" + AGVopenApi.appsecret + "×tamp=" + timestampStr + "&uniquestr=" + timestampStr;
|
|
string signstr = GetMD5Hex(origin);
|
|
Dictionary<string, string> headers = new Dictionary<string, string>()
|
{
|
{"appkey",AGVopenApi.appkey },
|
{"timestamp",timestampStr.ToString() },
|
{"sign",signstr }
|
};
|
|
string posy = JsonConvert.SerializeObject(taskrevoke);
|
var respone = HttpHelper.Post(url1, posy, headers: headers);
|
var res = JsonConvert.DeserializeObject<WebResponseContent>(respone);
|
if (res.success)
|
{
|
return WebResponseContent.Instance.OK();
|
}
|
else
|
{
|
return WebResponseContent.Instance.Error(res.msg);
|
}
|
}
|
catch (Exception ex)
|
{
|
return WebResponseContent.Instance.Error(ex.Message);
|
}
|
}
|
/// <summary>
|
/// 继续任务
|
/// </summary>
|
/// <param name="tasknum"></param>
|
/// <returns></returns>
|
/// <exception cref="Exception"></exception>
|
public WebResponseContent AGVTaskConts(int tasknum)
|
{
|
try
|
{
|
WebResponseContent content = new WebResponseContent();
|
Dt_Task task = BaseDal.QueryFirst(x => x.TaskNum == tasknum);
|
AGVTaskCont taskCont = new AGVTaskCont();
|
Cont data = new Cont();
|
TaskCont taskconts = new TaskCont();
|
{
|
taskconts.taskNo = task.TaskNum.ToString();
|
}
|
data.detail.Add(taskconts);
|
taskCont.data = data;
|
|
var time = new DateTimeOffset(DateTime.Now);
|
long timestampStr = time.ToUnixTimeMilliseconds();//时间戳
|
|
string appkeystr = "appsalt=" + AGVopenApi.appsalt + "&appkey=" + AGVopenApi.appkey;
|
|
string appkeyEcrypt = GetMD5Hex(appkeystr);
|
|
string origin = appkeyEcrypt + "&appsecret=" + AGVopenApi.appsecret + "×tamp=" + timestampStr + "&uniquestr=" + timestampStr;
|
|
string signstr = GetMD5Hex(origin);
|
|
Dictionary<string, string> headers = new Dictionary<string, string>()
|
{
|
{"appkey",AGVopenApi.appkey },
|
{"timestamp",timestampStr.ToString() },
|
{"sign",signstr }
|
};
|
|
string posy = JsonConvert.SerializeObject(taskCont);
|
var respone = HttpHelper.Post(url1, posy, headers: headers);
|
var res = JsonConvert.DeserializeObject<WebResponseContent>(respone);
|
if (res.success)
|
{
|
return WebResponseContent.Instance.OK();
|
}
|
else
|
{
|
return WebResponseContent.Instance.Error(res.msg);
|
}
|
}
|
catch (Exception ex)
|
{
|
return WebResponseContent.Instance.Error(ex.Message);
|
}
|
}
|
/// <summary>
|
/// 完成任务
|
/// </summary>
|
/// <param name="tasknum"></param>
|
/// <returns></returns>
|
/// <exception cref="Exception"></exception>
|
public WebResponseContent AGVTaskEnds(int tasknum)
|
{
|
try
|
{
|
WebResponseContent content = new WebResponseContent();
|
Dt_Task task = BaseDal.QueryFirst(x => x.TaskNum == tasknum);
|
AGVTaskEnd taskEnd = new AGVTaskEnd();
|
End data = new End();
|
TaskEnd taskEnds = new TaskEnd();
|
{
|
taskEnds.taskNo = task.TaskNum.ToString();
|
taskEnds.goBack = "1";
|
}
|
data.detail.Add(taskEnds);
|
taskEnd.data = data;
|
var time = new DateTimeOffset(DateTime.Now);
|
long timestampStr = time.ToUnixTimeMilliseconds();//时间戳
|
|
string appkeystr = "appsalt=" + AGVopenApi.appsalt + "&appkey=" + AGVopenApi.appkey;
|
|
string appkeyEcrypt = GetMD5Hex(appkeystr);
|
|
string origin = appkeyEcrypt + "&appsecret=" + AGVopenApi.appsecret + "×tamp=" + timestampStr + "&uniquestr=" + timestampStr;
|
|
string signstr = GetMD5Hex(origin);
|
|
Dictionary<string, string> headers = new Dictionary<string, string>()
|
{
|
{"appkey",AGVopenApi.appkey },
|
{"timestamp",timestampStr.ToString() },
|
{"sign",signstr }
|
};
|
|
string posy = JsonConvert.SerializeObject(taskEnd);
|
var respone = HttpHelper.Post(url1, posy, headers: headers);
|
var res = JsonConvert.DeserializeObject<WebResponseContent>(respone);
|
if (res.success)
|
{
|
int TaskStatus = AGVTaskStatusEnum.AGV_Finish.ObjToInt();
|
//_taskHtyService.AddTaskHty(task, TaskStatus);
|
BaseDal.DeleteData(task);
|
return WebResponseContent.Instance.OK();
|
}
|
else
|
{
|
return WebResponseContent.Instance.Error(res.msg);
|
}
|
}
|
catch (Exception ex)
|
{
|
return WebResponseContent.Instance.Error(ex.Message);
|
}
|
}
|
/// <summary>
|
/// 暂停任务
|
/// </summary>
|
/// <param name="tasknum"></param>
|
/// <returns></returns>
|
/// <exception cref="Exception"></exception>
|
public WebResponseContent AGVTaskSuspends(int tasknum)
|
{
|
try
|
{
|
WebResponseContent content = new WebResponseContent();
|
Dt_Task task = BaseDal.QueryFirst(x => x.TaskNum == tasknum);
|
AGVTaskSuspend suspend = new AGVTaskSuspend();
|
spend data = new spend();
|
TaskSuspend suspends = new TaskSuspend();
|
{
|
suspends.taskNo = task.TaskNum.ToString();
|
}
|
data.detail.Add(suspends);
|
suspend.data = data;
|
var respone = HttpHelper.Post<WebResponseContent>(url + "AGVTaskSuspend/" + suspend, "暂停任务");
|
int TaskStatus = AGVTaskStatusEnum.AGV_Finish.ObjToInt();
|
_taskHtyService.AddTaskHty(task, TaskStatus);
|
BaseDal.DeleteData(task);
|
if (respone.success)
|
{
|
return WebResponseContent.Instance.OK();
|
}
|
else
|
{
|
return WebResponseContent.Instance.Error(respone.msg);
|
}
|
}
|
catch (Exception ex)
|
{
|
return WebResponseContent.Instance.Error(ex.Message);
|
}
|
}
|
/// <summary>
|
/// 恢复任务
|
/// </summary>
|
/// <param name="tasknum"></param>
|
/// <returns></returns>
|
/// <exception cref="Exception"></exception>
|
public WebResponseContent AGVTaskRecoverys(int tasknum)
|
{
|
try
|
{
|
WebResponseContent content = new WebResponseContent();
|
Dt_Task task = BaseDal.QueryFirst(x => x.TaskNum == tasknum);
|
AGVTaskRecovery recovery = new AGVTaskRecovery();
|
Recovery data = new Recovery();
|
TaskRecovery recoverys = new TaskRecovery();
|
{
|
recoverys.taskNo = task.TaskNum.ToString();
|
}
|
data.detail.Add(recoverys);
|
recovery.data = data;
|
var respone = HttpHelper.Post<WebResponseContent>(url + "AGVTaskRecovery/" + recovery, "恢复任务");
|
if (respone.success)
|
{
|
return WebResponseContent.Instance.OK();
|
}
|
else
|
{
|
return WebResponseContent.Instance.Error(respone.msg);
|
}
|
}
|
catch (Exception ex)
|
{
|
return WebResponseContent.Instance.Error(ex.Message);
|
}
|
|
}
|
|
public string GetMD5Hex(string appkeystr)
|
{
|
using MD5 md5Hash = MD5.Create();
|
|
// 将输入字符串转换为字节数组并计算其MD5哈希。
|
byte[] dataBytes = Encoding.UTF8.GetBytes(appkeystr);
|
byte[] hashBytes = md5Hash.ComputeHash(dataBytes);
|
|
// 创建一个新的Stringbuilder来收集字节并创建一个字符串。
|
StringBuilder builder = new StringBuilder();
|
|
// 循环通过每个字节的哈希,并格式化为十六进制字符串。
|
for (int i = 0; i < hashBytes.Length; i++)
|
{
|
builder.Append(hashBytes[i].ToString("x2"));
|
}
|
|
string appkeyEcrypt = builder.ToString();
|
|
return appkeyEcrypt;
|
}
|
}
|
}
|