2026-02-27 11:05:35 +08:00
|
|
|
|
using System.Linq;
|
2026-02-28 10:57:21 +08:00
|
|
|
|
using System;
|
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
|
using System.Configuration;
|
|
|
|
|
|
using System.IO;
|
|
|
|
|
|
using System.Net.Http;
|
|
|
|
|
|
using System.Threading.Tasks;
|
|
|
|
|
|
|
2026-02-27 11:05:35 +08:00
|
|
|
|
|
|
|
|
|
|
namespace BLL
|
|
|
|
|
|
{
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 数据共享互通辅助服务
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public class APIDataShareSyncService
|
|
|
|
|
|
{
|
|
|
|
|
|
#region 班组
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 获取班组Id
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="TeamGroupName"></param>
|
|
|
|
|
|
/// <param name="projectId"></param>
|
|
|
|
|
|
/// <param name="unitId"></param>
|
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
|
public static string GetTeamGroupId(string TeamGroupName, string projectId, string unitId)
|
|
|
|
|
|
{
|
|
|
|
|
|
string TeamGroupId = null;
|
|
|
|
|
|
if (!string.IsNullOrEmpty(TeamGroupName))
|
|
|
|
|
|
{
|
|
|
|
|
|
var tg = Funs.DB.ProjectData_TeamGroup.Where(x => x.TeamGroupName == TeamGroupName && x.ProjectId == projectId && x.UnitId == unitId).ToList();
|
|
|
|
|
|
if (tg.Count == 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
Model.ProjectData_TeamGroup newTeamGroup = new Model.ProjectData_TeamGroup
|
|
|
|
|
|
{
|
|
|
|
|
|
TeamGroupId = SQLHelper.GetNewID(typeof(Model.ProjectData_TeamGroup)),
|
|
|
|
|
|
ProjectId = projectId,
|
|
|
|
|
|
UnitId = unitId,
|
|
|
|
|
|
TeamGroupName = TeamGroupName,
|
|
|
|
|
|
Remark = "导入"
|
|
|
|
|
|
};
|
|
|
|
|
|
TeamGroupService.AddTeamGroup(newTeamGroup);
|
|
|
|
|
|
TeamGroupId = newTeamGroup.TeamGroupId;
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
TeamGroupId = tg.FirstOrDefault().TeamGroupId;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
return TeamGroupId;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#endregion
|
2026-02-28 10:57:21 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#region 获取作业区域
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 作业区域
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="UnitWorkName"></param>
|
|
|
|
|
|
/// <param name="projectId"></param>
|
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
|
public static string getUnitWorkId(string UnitWorkName, string projectId)
|
|
|
|
|
|
{
|
|
|
|
|
|
string UnitWorkId = null;
|
|
|
|
|
|
if (!string.IsNullOrEmpty(UnitWorkName))
|
|
|
|
|
|
{
|
|
|
|
|
|
var uw = Funs.DB.WBS_UnitWork.Where(x =>
|
|
|
|
|
|
x.UnitWorkName == UnitWorkName && x.ProjectId == projectId && x.SuperUnitWork == null).ToList();
|
|
|
|
|
|
if (uw.Count == 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
Model.WBS_UnitWork newUnitWork = new Model.WBS_UnitWork
|
|
|
|
|
|
{
|
|
|
|
|
|
UnitWorkId = SQLHelper.GetNewID(typeof(Model.WBS_UnitWork)),
|
|
|
|
|
|
ProjectId = projectId,
|
|
|
|
|
|
UnitWorkName = UnitWorkName,
|
|
|
|
|
|
};
|
|
|
|
|
|
UnitWorkService.AddUnitWork(newUnitWork);
|
|
|
|
|
|
UnitWorkId = newUnitWork.UnitWorkId;
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
UnitWorkId = uw.FirstOrDefault().UnitWorkId;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
return UnitWorkId;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
|
|
#region 获取系统用户
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 获取系统用户
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="userName"></param>
|
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
|
public static string getUserId(string userName)
|
|
|
|
|
|
{
|
|
|
|
|
|
string UserId = null;
|
|
|
|
|
|
if (!string.IsNullOrEmpty(userName))
|
|
|
|
|
|
{
|
|
|
|
|
|
var u = Funs.DB.Sys_User.Where(x =>
|
|
|
|
|
|
x.UserName == userName).ToList();
|
|
|
|
|
|
if (u.Count == 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
Model.Sys_User newUser = new Model.Sys_User
|
|
|
|
|
|
{
|
|
|
|
|
|
UserId = SQLHelper.GetNewID(typeof(Model.Sys_User)),
|
|
|
|
|
|
UserName = userName,
|
|
|
|
|
|
// Remark = "导入",
|
|
|
|
|
|
};
|
|
|
|
|
|
UserService.AddUser(newUser);
|
|
|
|
|
|
UserId = newUser.UserId;
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
UserId = u.FirstOrDefault().UserId;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return UserId;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#region 获取检查类别
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 获取检查类别
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="userName"></param>
|
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
|
public static string getCheckItemSetId(string checkItemName)
|
|
|
|
|
|
{
|
|
|
|
|
|
string CheckItemSetId = null;
|
|
|
|
|
|
if (!string.IsNullOrEmpty(checkItemName))
|
|
|
|
|
|
{
|
|
|
|
|
|
var cis = Funs.DB.Technique_CheckItemSet.Where(x =>
|
|
|
|
|
|
x.CheckItemName == checkItemName && x.CheckType == "2").ToList();
|
|
|
|
|
|
if (cis.Count == 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
Model.Technique_CheckItemSet newCheckItemSet = new Model.Technique_CheckItemSet
|
|
|
|
|
|
{
|
|
|
|
|
|
CheckItemSetId = SQLHelper.GetNewID(typeof(Model.Technique_CheckItemSet)),
|
|
|
|
|
|
CheckItemName = checkItemName,
|
|
|
|
|
|
SupCheckItem = "0",
|
|
|
|
|
|
CheckType = "2",
|
|
|
|
|
|
};
|
|
|
|
|
|
Technique_CheckItemSetService.AddCheckItemSet(newCheckItemSet);
|
|
|
|
|
|
CheckItemSetId = newCheckItemSet.CheckItemSetId;
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
CheckItemSetId = cis.FirstOrDefault().CheckItemSetId;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return CheckItemSetId;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#region 获取巡检问题类型
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 获取巡检问题类型
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="RegisterTypesName"></param>
|
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
|
public static string getRegisterTypesId(string RegisterTypesName)
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
string RegisterTypesId = null;
|
|
|
|
|
|
if (!string.IsNullOrEmpty(RegisterTypesName))
|
|
|
|
|
|
{
|
|
|
|
|
|
var ht = Funs.DB.HSSE_Hazard_HazardRegisterTypes.Where(x =>
|
|
|
|
|
|
x.RegisterTypesName == RegisterTypesName && x.HazardRegisterType == "1").ToList();
|
|
|
|
|
|
if (ht.Count == 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
Model.HSSE_Hazard_HazardRegisterTypes newHazardRegisterTypes = new Model.HSSE_Hazard_HazardRegisterTypes
|
|
|
|
|
|
{
|
|
|
|
|
|
RegisterTypesId = SQLHelper.GetNewID(typeof(Model.HSSE_Hazard_HazardRegisterTypes)),
|
|
|
|
|
|
RegisterTypesName = RegisterTypesName,
|
|
|
|
|
|
HazardRegisterType = "1",
|
|
|
|
|
|
Remark = "导入",
|
|
|
|
|
|
};
|
|
|
|
|
|
HSSE_Hazard_HazardRegisterTypesService.AddHazardRegisterTypes(newHazardRegisterTypes);
|
|
|
|
|
|
RegisterTypesId = newHazardRegisterTypes.RegisterTypesId;
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
RegisterTypesId = ht.FirstOrDefault().RegisterTypesId;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
return RegisterTypesId;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#region 获取特岗证书
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 特岗证书
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="CertificateName"></param>
|
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
|
public static Model.CertificateItem GetPersonQualityByPersonId(string personId)
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
Model.CertificateItem item = new Model.CertificateItem();
|
|
|
|
|
|
var personQuality = PersonQualityService.GetPersonQualityByPersonId(personId);
|
|
|
|
|
|
if (personQuality != null)
|
|
|
|
|
|
{
|
|
|
|
|
|
item.PersonQualityId = personQuality.PersonQualityId;//主键
|
|
|
|
|
|
item.CertificateId = personQuality.CertificateId;
|
|
|
|
|
|
item.CertificateName = personQuality.CertificateName;
|
|
|
|
|
|
item.CertificateNo = personQuality.CertificateNo;
|
|
|
|
|
|
item.CertificateLimitDate = personQuality.LimitDate;
|
|
|
|
|
|
}
|
|
|
|
|
|
return item;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#region 保存或修改特岗证书数据
|
|
|
|
|
|
|
|
|
|
|
|
public static void ProcessPersonQualityData(Model.CertificateItem item, string personId)
|
|
|
|
|
|
{
|
|
|
|
|
|
using (Model.SGGLDB db = new Model.SGGLDB(Funs.ConnString))
|
|
|
|
|
|
{
|
|
|
|
|
|
if (item == null)
|
|
|
|
|
|
{
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
if (!string.IsNullOrEmpty(item.CertificateId))
|
|
|
|
|
|
{
|
|
|
|
|
|
var personQuality = BLL.PersonQualityService.GetPersonQualityByPersonId(personId);
|
|
|
|
|
|
var certificate =
|
|
|
|
|
|
db.Base_Certificate.FirstOrDefault(e => e.CertificateId == item.CertificateId);
|
|
|
|
|
|
var CertificateId = string.Empty;
|
|
|
|
|
|
if (certificate != null)
|
|
|
|
|
|
{
|
|
|
|
|
|
CertificateId = certificate.CertificateId;
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
Model.Base_Certificate newCertificate = new Model.Base_Certificate
|
|
|
|
|
|
{
|
|
|
|
|
|
CertificateId = SQLHelper.GetNewID(typeof(Model.Base_Certificate)),
|
|
|
|
|
|
CertificateName = item.CertificateName,
|
|
|
|
|
|
Remark = "导入"
|
|
|
|
|
|
};
|
|
|
|
|
|
db.Base_Certificate.InsertOnSubmit(newCertificate);
|
|
|
|
|
|
db.SubmitChanges();
|
|
|
|
|
|
// BLL.CertificateService.AddCertificate(newCertificate);
|
|
|
|
|
|
CertificateId = newCertificate.CertificateId;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (personQuality != null)
|
|
|
|
|
|
{
|
|
|
|
|
|
personQuality.CertificateId = CertificateId;
|
|
|
|
|
|
personQuality.CertificateName = item.CertificateName;
|
|
|
|
|
|
personQuality.CertificateNo = item.CertificateNo;
|
|
|
|
|
|
personQuality.LimitDate = item.CertificateLimitDate;
|
|
|
|
|
|
|
|
|
|
|
|
BLL.PersonQualityService.UpdatePersonQuality(personQuality);
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
Model.QualityAudit_PersonQuality newPersonQuality = new Model.QualityAudit_PersonQuality
|
|
|
|
|
|
{
|
|
|
|
|
|
PersonQualityId = SQLHelper.GetNewID(typeof(Model.QualityAudit_PersonQuality)),
|
|
|
|
|
|
PersonId = personId,
|
|
|
|
|
|
};
|
|
|
|
|
|
newPersonQuality.CertificateId = CertificateId;
|
|
|
|
|
|
newPersonQuality.CertificateName = item.CertificateName;
|
|
|
|
|
|
newPersonQuality.CertificateNo = item.CertificateNo;
|
|
|
|
|
|
newPersonQuality.LimitDate = item.CertificateLimitDate;
|
|
|
|
|
|
BLL.PersonQualityService.AddPersonQuality(newPersonQuality);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#region 岗位
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 岗位
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="WorkPostName"></param>
|
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
|
public static string getWorkPostId(string WorkPostName, string PostType, string IsHsse, string IsCQMS)
|
|
|
|
|
|
{
|
|
|
|
|
|
string WorkPostId = null;
|
|
|
|
|
|
if (!string.IsNullOrEmpty(WorkPostName))
|
|
|
|
|
|
{
|
|
|
|
|
|
var wp = Funs.DB.Base_WorkPost.Where(x => x.WorkPostName == WorkPostName).ToList();
|
|
|
|
|
|
if (wp.Count == 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
Model.Base_WorkPost newWorkPost = new Model.Base_WorkPost
|
|
|
|
|
|
{
|
|
|
|
|
|
WorkPostId = SQLHelper.GetNewID(typeof(Model.Base_WorkPost)),
|
|
|
|
|
|
WorkPostName = WorkPostName,
|
|
|
|
|
|
PostType = PostType,
|
|
|
|
|
|
IsHsse = Convert.ToBoolean(IsHsse),
|
|
|
|
|
|
IsCQMS = Convert.ToBoolean(IsCQMS),
|
|
|
|
|
|
Remark = "导入"
|
|
|
|
|
|
};
|
|
|
|
|
|
WorkPostService.AddWorkPost(newWorkPost);
|
|
|
|
|
|
WorkPostId = newWorkPost.WorkPostId;
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
WorkPostId = wp.FirstOrDefault().WorkPostId;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return WorkPostId;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
|
|
#region 单位工程
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 单位工程
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="WorkAreaName"></param>
|
|
|
|
|
|
/// <param name="projectId"></param>
|
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
|
public static string getWorkAreaId(string WorkAreaName, string projectId)
|
|
|
|
|
|
{
|
|
|
|
|
|
string WorkAreaId = null;
|
|
|
|
|
|
if (!string.IsNullOrEmpty(WorkAreaName))
|
|
|
|
|
|
{
|
|
|
|
|
|
var names = WorkAreaName.Split(',');
|
|
|
|
|
|
List<string> workAreaIdList = new List<string>();
|
|
|
|
|
|
foreach (var name in names)
|
|
|
|
|
|
{
|
|
|
|
|
|
var uw = Funs.DB.WBS_UnitWork.Where(x =>
|
|
|
|
|
|
x.UnitWorkName == name && x.ProjectId == projectId).ToList();
|
|
|
|
|
|
if (uw.Count == 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
Model.WBS_UnitWork newUnitWork = new Model.WBS_UnitWork
|
|
|
|
|
|
{
|
|
|
|
|
|
UnitWorkId = SQLHelper.GetNewID(typeof(Model.WBS_UnitWork)),
|
|
|
|
|
|
ProjectId = projectId,
|
|
|
|
|
|
UnitWorkName = name,
|
|
|
|
|
|
};
|
|
|
|
|
|
UnitWorkService.AddUnitWork(newUnitWork);
|
|
|
|
|
|
workAreaIdList.Add(newUnitWork.UnitWorkId);
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
workAreaIdList.Add(uw.FirstOrDefault().UnitWorkId);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
WorkAreaId = string.Join(",", workAreaIdList);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return WorkAreaId;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
|
|
#region 获取根据id获取单位工程名称
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 获取根据id获取单位工程名称
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="WorkAreaId"></param>
|
|
|
|
|
|
/// <param name="projectId"></param>
|
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
|
public static string GetWorkAreaNames(string WorkAreaId, string projectId)
|
|
|
|
|
|
{
|
|
|
|
|
|
string WorkAreaNames = string.Empty;
|
|
|
|
|
|
if (!string.IsNullOrEmpty(WorkAreaId))
|
|
|
|
|
|
{
|
|
|
|
|
|
var workAreas = WorkAreaId.Split(',');
|
|
|
|
|
|
//创建一个数组集合
|
|
|
|
|
|
List<string> workAreaNameList = new List<string>();
|
|
|
|
|
|
foreach (var workArea in workAreas)
|
|
|
|
|
|
{
|
|
|
|
|
|
var WorkAreaName = Funs.DB.WBS_UnitWork
|
|
|
|
|
|
.First(x => x.UnitWorkId == workArea && x.ProjectId == projectId)
|
|
|
|
|
|
.UnitWorkName;
|
|
|
|
|
|
workAreaNameList.Add(WorkAreaName);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
WorkAreaNames = string.Join(",", workAreaNameList);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return WorkAreaNames;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
|
|
#region 根据地址获取base64的文件
|
|
|
|
|
|
|
|
|
|
|
|
public static async Task<byte[]> DownloadHeadImageAsync(string webUrl, string photoUrl)
|
|
|
|
|
|
{
|
|
|
|
|
|
byte[] b = null;
|
|
|
|
|
|
try
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!string.IsNullOrEmpty(photoUrl))
|
|
|
|
|
|
{
|
|
|
|
|
|
string localRoot = ConfigurationManager.AppSettings["localRoot"]; // 物理路径
|
|
|
|
|
|
// 先下载到本地(异步等待完成)
|
|
|
|
|
|
DownloadAndSaveFileWithRetryAsync(webUrl, photoUrl, localRoot);
|
|
|
|
|
|
b = AttachFileService.SetImageToByteArray(localRoot + photoUrl.Split(',')[0]);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
|
{
|
|
|
|
|
|
throw ex;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return b;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
|
|
#region 向AttachFile文件表中添加或修改数据
|
|
|
|
|
|
|
|
|
|
|
|
public static async Task OperationAttachFile(string webUrl, string tokeyId, string menuId, string attachFileUrl)
|
|
|
|
|
|
{
|
|
|
|
|
|
using (Model.SGGLDB db = new Model.SGGLDB(Funs.ConnString))
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!string.IsNullOrEmpty(attachFileUrl))
|
|
|
|
|
|
{
|
|
|
|
|
|
string localRoot = ConfigurationManager.AppSettings["localRoot"]; //物理路径
|
|
|
|
|
|
//attachFileUrl可能是多个
|
|
|
|
|
|
string[] attachFileUrls = attachFileUrl.Split(',');
|
|
|
|
|
|
|
|
|
|
|
|
var attachFile = db.AttachFile.FirstOrDefault(x => x.ToKeyId == tokeyId && x.MenuId == menuId);
|
|
|
|
|
|
if (attachFile != null)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (attachFile.AttachUrl != attachFileUrl)
|
|
|
|
|
|
{
|
|
|
|
|
|
string[] oldAttachFileUrls = attachFile.AttachUrl.Split(',');
|
|
|
|
|
|
foreach (var oldFileUrl in oldAttachFileUrls)
|
|
|
|
|
|
{
|
|
|
|
|
|
//删除之前的
|
|
|
|
|
|
UploadFileService.DeleteFile(localRoot, oldFileUrl);
|
|
|
|
|
|
}
|
|
|
|
|
|
foreach (var fileUrl in attachFileUrls)
|
|
|
|
|
|
{
|
|
|
|
|
|
DownloadAndSaveFileWithRetryAsync(webUrl, fileUrl, localRoot);
|
|
|
|
|
|
}
|
|
|
|
|
|
UploadFileService.SaveAttachUrl(
|
|
|
|
|
|
UploadFileService.GetSourceByAttachUrl(attachFileUrl, 10, null),
|
|
|
|
|
|
attachFileUrl, menuId, tokeyId);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
foreach (var fileUrl in attachFileUrls)
|
|
|
|
|
|
{
|
|
|
|
|
|
DownloadAndSaveFileWithRetryAsync(webUrl, fileUrl, localRoot);
|
|
|
|
|
|
}
|
|
|
|
|
|
UploadFileService.SaveAttachUrl(
|
|
|
|
|
|
UploadFileService.GetSourceByAttachUrl(attachFileUrl, 10, null),
|
|
|
|
|
|
attachFileUrl, menuId, tokeyId);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public static async Task DownloadAndSaveFileAsync(string webUrl, string attachFileUrl, string localPath)
|
|
|
|
|
|
{
|
|
|
|
|
|
// 验证输入参数
|
|
|
|
|
|
if (string.IsNullOrEmpty(webUrl) || string.IsNullOrEmpty(attachFileUrl) || string.IsNullOrEmpty(localPath))
|
|
|
|
|
|
{
|
|
|
|
|
|
BLL.ErrLogInfo.WriteLog(
|
|
|
|
|
|
$"下载文件参数无效: webUrl={webUrl}, attachFileUrl={attachFileUrl}, localPath={localPath}");
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
try
|
|
|
|
|
|
{
|
|
|
|
|
|
// 构造完整的远程文件 URL
|
|
|
|
|
|
string fullRemoteUrl = $"{webUrl.TrimEnd('/')}/{attachFileUrl.TrimStart('/')}";
|
|
|
|
|
|
|
|
|
|
|
|
// 构造本地文件路径
|
|
|
|
|
|
string localFilePath = Path.Combine(localPath, attachFileUrl);
|
|
|
|
|
|
|
|
|
|
|
|
// 确保本地目录存在
|
|
|
|
|
|
string directoryPath = Path.GetDirectoryName(localFilePath);
|
|
|
|
|
|
if (!string.IsNullOrEmpty(directoryPath) && !Directory.Exists(directoryPath))
|
|
|
|
|
|
{
|
|
|
|
|
|
Directory.CreateDirectory(directoryPath);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 使用独立的HttpClient实例并配置不捕获同步上下文
|
|
|
|
|
|
using (var httpClient = new HttpClient())
|
|
|
|
|
|
{
|
|
|
|
|
|
// 设置合理的超时时间
|
|
|
|
|
|
httpClient.Timeout = TimeSpan.FromMinutes(3);
|
|
|
|
|
|
|
|
|
|
|
|
// 下载文件字节(使用ConfigureAwait(false)避免上下文问题)
|
|
|
|
|
|
byte[] fileBytes = await httpClient.GetByteArrayAsync(fullRemoteUrl).ConfigureAwait(false);
|
|
|
|
|
|
|
|
|
|
|
|
// 写入文件(同样使用ConfigureAwait(false))
|
|
|
|
|
|
await Task.Run(() => File.WriteAllBytes(localFilePath, fileBytes)).ConfigureAwait(false);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
catch (HttpRequestException httpEx)
|
|
|
|
|
|
{
|
|
|
|
|
|
BLL.ErrLogInfo.WriteLog($"HTTP请求失败 - URL: {webUrl}/{attachFileUrl}", httpEx);
|
|
|
|
|
|
// 不抛出异常,让调用方继续处理
|
|
|
|
|
|
}
|
|
|
|
|
|
catch (DirectoryNotFoundException dirEx)
|
|
|
|
|
|
{
|
|
|
|
|
|
BLL.ErrLogInfo.WriteLog($"目录创建失败 - 路径: {localPath}", dirEx);
|
|
|
|
|
|
}
|
|
|
|
|
|
catch (UnauthorizedAccessException authEx)
|
|
|
|
|
|
{
|
|
|
|
|
|
BLL.ErrLogInfo.WriteLog($"文件访问权限不足 - 路径: {Path.Combine(localPath, attachFileUrl)}", authEx);
|
|
|
|
|
|
}
|
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
|
{
|
|
|
|
|
|
BLL.ErrLogInfo.WriteLog($"下载文件失败 - URL: {webUrl}/{attachFileUrl}", ex);
|
|
|
|
|
|
// 不重新抛出异常,避免中断整个流程
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 添加重试机制的下载方法
|
|
|
|
|
|
public static async Task<bool> DownloadAndSaveFileWithRetryAsync(string webUrl, string attachFileUrl,
|
|
|
|
|
|
string localPath, int maxRetries = 3)
|
|
|
|
|
|
{
|
|
|
|
|
|
for (int attempt = 0; attempt < maxRetries; attempt++)
|
|
|
|
|
|
{
|
|
|
|
|
|
try
|
|
|
|
|
|
{
|
|
|
|
|
|
await DownloadAndSaveFileAsync(webUrl, attachFileUrl, localPath);
|
|
|
|
|
|
return true; // 成功下载
|
|
|
|
|
|
}
|
|
|
|
|
|
catch (HttpRequestException)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (attempt == maxRetries - 1)
|
|
|
|
|
|
{
|
|
|
|
|
|
BLL.ErrLogInfo.WriteLog($"下载失败,已重试{maxRetries}次 - URL: {webUrl}/{attachFileUrl}");
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 等待后重试
|
|
|
|
|
|
await Task.Delay(TimeSpan.FromSeconds(Math.Pow(2, attempt)));
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
|
|
|
2026-02-27 11:05:35 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|