using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Configuration;
using System.IO;
using System.Net.Http;
using System.Threading.Tasks;
using Model;
using Newtonsoft.Json;
using RestSharp;
using System.Net;
namespace BLL
{
///
/// 质量巡检同步服务
///
public class APICheckControlSyncService
{
#region 根据项目、单位获取质量巡检列表
///
/// 根据项目、单位获取质量巡检列表
///
/// 项目ID
/// 单位ID
/// 数据ID(可选,用于单条数据同步)
/// 质量巡检数据列表
public static List GetCheckControlListsByProjectIdUnitIdPage(
string projectId, string unitId, string dataId = "")
{
using (Model.SGGLDB db = new Model.SGGLDB(Funs.ConnString))
{
var list = from x in db.Check_CheckControl
where x.ProjectId == projectId
select x;
if (!string.IsNullOrEmpty(unitId))
{
list = list.Where(x => x.UnitId == unitId);
}
if (!string.IsNullOrEmpty(dataId))
{
list = list.Where(x => x.CheckControlCode == dataId);
}
var dataList = (from x in list
join unit in db.Base_Unit on x.UnitId equals unit.UnitId into unitTemp
from unit in unitTemp.DefaultIfEmpty()
join pro in db.Base_CNProfessional on x.CNProfessionalCode equals pro.CNProfessionalId into proTemp
from pro in proTemp.DefaultIfEmpty()
join uw in db.WBS_UnitWork on x.UnitWorkId equals uw.UnitWorkId into uwTemp
from uw in uwTemp.DefaultIfEmpty()
join qqt in db.Base_QualityQuestionType on x.QuestionType equals qqt.QualityQuestionTypeId into qqtTemp
from qqt in qqtTemp.DefaultIfEmpty()
join u1 in db.Sys_User on x.CheckMan equals u1.UserId into u1Temp
from u1 in u1Temp.DefaultIfEmpty()
join u2 in db.Sys_User on x.SubmitMan equals u2.UserId into u2Temp
from u2 in u2Temp.DefaultIfEmpty()
join pu in db.Base_Unit on x.ProposeUnitId equals pu.UnitId into puTemp
from pu in puTemp.DefaultIfEmpty()
join att in db.AttachFile on x.CheckControlCode equals att.ToKeyId into attTemp
from att in attTemp.DefaultIfEmpty()
join attRe in db.AttachFile on x.CheckControlCode + "r" equals attRe.ToKeyId into attReTemp
from attRe in attReTemp.DefaultIfEmpty()
select new CheckControlSyncItem
{
CheckControlCode = x.CheckControlCode,
ProjectId = x.ProjectId,
UnitWorkId = x.UnitWorkId,
UnitWorkName = uw.UnitWorkName,
UnitId = x.UnitId,
UnitName = unit.UnitName,
CheckDate = x.CheckDate,
CheckMan = x.CheckMan,
CheckManName = u1.UserName,
CheckSite = x.CheckSite,
DocCode = x.DocCode,
CNProfessionalCode = x.CNProfessionalCode,
CNProfessionalName = pro.ProfessionalName,
QuestionType = x.QuestionType,
QuestionTypeName = qqt.QualityQuestionType,
QuestionDef = x.QuestionDef,
RectifyOpinion = x.RectifyOpinion,
LimitDate = x.LimitDate,
AttachUrl = att.AttachUrl,
HandleWay = x.HandleWay,
RectifyDate = x.RectifyDate,
ReAttachUrl = attRe.AttachUrl,
State = x.State,
IsSubmit = x.IsSubmit,
SubmitMan = x.SubmitMan,
SubmitManName = u2.UserName,
IsOK = x.IsOK,
ProposeUnitId = x.ProposeUnitId,
ProposeUnitName = pu.UnitName,
SaveHandleMan = x.SaveHandleMan,
DataSource = "1"
}).ToList();
return dataList;
}
}
#endregion
#region 拉取质量巡检数据
///
/// 拉取质量巡检数据
///
/// 处理结果消息
public static string getCheckControlLists(string projectId = "")
{
int code = 0;
string message = "";
try
{
string CollCropCode = string.Empty;
string unitId = string.Empty;
var thisUnit = CommonService.GetIsThisUnit(); //当前单位
if (thisUnit != null)
{
CollCropCode = thisUnit.CollCropCode; //社会统一信用代码
unitId = thisUnit.UnitId;
}
var ProjectList = (from x in Funs.DB.Base_Project
where (x.IsDelete == null || x.IsDelete == false) &&
x.SubjectUnit != null && x.SubjectProject != null
select x).ToList();
if (!string.IsNullOrEmpty(projectId))
{
ProjectList = ProjectList.Where(x => x.ProjectId == projectId).ToList();
}
if (ProjectList.Count > 0)
{
foreach (var project in ProjectList)
{
string SubjectUnitId = project.SubjectUnit; //集团的单位id
string SubjectProjectId = project.SubjectProject; //集团的项目id
//获取对应单位的apiurl地址
var Url = BLL.UnitService.getUnitApiUrlByUnitId(SubjectUnitId);
var ApiUrl = "";
var WebUrl = "";
if (!string.IsNullOrEmpty(Url))
{
var urls = Url.Split(',');
ApiUrl = urls[0];
if (urls.Length > 1)
{
WebUrl = urls[1];
}
}
string url = "/api/CheckControlSync/getCheckControlListByProjectIdAndCollCropCode?projectId=" +
SubjectProjectId + "&collCropCode=" + CollCropCode;
string baseurl = ApiUrl + url;
string contenttype = "application/json;charset=unicode";
var strJosn = APIGetHttpService.Http(baseurl, "GET", contenttype, null, null);
if (!string.IsNullOrEmpty(strJosn))
{
JObject obj = JObject.Parse(strJosn);
code = Funs.GetNewIntOrZero(obj["code"].ToString());
message = obj["message"].ToString();
if (code == 1)
{
var getData = JsonConvert.DeserializeObject>(obj["data"].ToString());
if (getData.Count() > 0)
{
ProcessCheckControlData(getData, project.ProjectId, unitId, WebUrl, "pull");
}
message = "获取成功:同步质量巡检数" + getData.Count().ToString() + "条";
}
}
}
}
}
catch (Exception ex)
{
message = "获取失败:" + ex.Message;
ErrLogInfo.WriteLog("质量巡检获取!", ex);
}
return message;
}
#endregion
#region 推送质量巡检数据
///
/// 推送质量巡检数据
///
/// 项目ID
/// 数据ID(可选,用于单条数据推送)
/// 推送结果
public static ReturnData pushCheckControlLists(string projectId, string dataId = "")
{
Model.ReturnData responeData = new Model.ReturnData();
responeData.code = 0;
responeData.message = string.Empty;
var project = Funs.DB.Base_Project.FirstOrDefault(x => x.ProjectId == projectId);
try
{
if (project != null)
{
//获取质量巡检数据
var items = GetCheckControlListsByProjectIdUnitIdPage(projectId, "", dataId);
if (items.Count() > 0)
{
var thisUnit = CommonService.GetIsThisUnit(); //当前单位
var apiurl = "/api/CheckControlSync/SaveCheckControlSyncData";
//总包单位接口地址
var Url = BLL.UnitService.getUnitApiUrlByUnitId(project.SubjectUnit);
var ApiUrl = "";
var WebUrl = "";
if (!string.IsNullOrEmpty(Url))
{
var urls = Url.Split(',');
ApiUrl = urls[0];
if (urls.Length > 1)
{
WebUrl = urls[1];
}
}
var pushData = new CheckControlSyncData
{
CollCropCode = thisUnit.CollCropCode, //分包单位社会统一信用码
ProjectId = project.SubjectProject, //主包项目Id
UnitDomain = Funs.SGGLUrl, //分包单位域名地址【文件存储地址】
Items = items //质量巡检数据
};
var pushContent = JsonConvert.SerializeObject(pushData);
string baseurl = ApiUrl + apiurl;
string contenttype = "application/json;charset=unicode";
var returndata = APIGetHttpService.Http(baseurl, "Post", contenttype, null, pushContent);
if (!string.IsNullOrEmpty(returndata))
{
JObject obj = JObject.Parse(returndata);
string code = obj["code"].ToString();
string message = obj["message"].ToString();
responeData.code = int.Parse(code);
responeData.message = message;
}
}
else
{
responeData.code = 0;
responeData.message = "当前没有质量巡检数据";
}
}
}
catch (Exception ex)
{
responeData.message = "同步到总包单位失败!";
ErrLogInfo.WriteLog("【质量巡检】同步到总包单位失败!", ex);
}
return responeData;
}
#endregion
#region 接收保存质量巡检数据
///
/// 接收保存质量巡检数据
///
/// 质量巡检同步数据
/// 处理结果消息
public static string SaveCheckControlSyncData(Model.CheckControlSyncData items)
{
int code = 0;
string message = "";
try
{
if (items.Items.Count > 0 || items.Items.Count > 0)
{
var CollCropCode = items.CollCropCode; //分包单位社会统一信用码
var ProjectId = items.ProjectId; //总包项目Id
var UnitDomain = items.UnitDomain; //分包单位域名地址【文件存储地址】
var unit = Funs.DB.Base_Unit.FirstOrDefault(x => x.CollCropCode == CollCropCode); //根据CollCropCode获取单位id
if (unit == null)
{
message = "总包单位不存在本单位,请登录总包系统检查维护本单位信息!";
}
else
{
//判断主包项目是否存在
var porject = BLL.ProjectService.GetProjectByProjectId(ProjectId);
if (porject == null)
{
message = "总包单位不存在本项目,请检查总包项目关联是否正确!";
}
else
{
ProcessCheckControlData(items.Items, ProjectId, unit.UnitId, UnitDomain, "push");
message = "数据推送成功!";
}
}
}
else
{
message = "暂无质量巡检数据!";
}
}
catch (Exception ex)
{
throw ex;
}
return message;
}
#endregion
#region 处理质量巡检数据的新增或更新逻辑
///
/// 处理质量巡检数据的新增或更新逻辑
///
/// 质量巡检数据列表
/// 项目id
/// 单位ID
/// Web地址
///
private static void ProcessCheckControlData(
List getData,
string projectId,
string unitId,
string WebUrl, string type)
{
using (Model.SGGLDB db = new Model.SGGLDB(Funs.ConnString))
{
foreach (var item in getData)
{
Model.Check_CheckControl model = db.Check_CheckControl.FirstOrDefault(x => x.CheckControlCode == item.CheckControlCode);
if (model == null)
{
//新增
Model.Check_CheckControl newModel = new Model.Check_CheckControl
{
CheckControlCode = item.CheckControlCode,
ProjectId = projectId,
UnitWorkId = APIDataShareSyncService.getUnitWorkId(item.UnitWorkName, projectId),
UnitId = getUnitIdByUnitName(item.UnitName) ?? unitId,
CheckDate = item.CheckDate,
CheckMan = APIDataShareSyncService.getUserId(item.CheckManName),
CheckSite = item.CheckSite,
DocCode = item.DocCode,
CNProfessionalCode = getCNProfessionalId(item.CNProfessionalName),
QuestionType = getQualityQuestionTypeId(item.QuestionTypeName, projectId),
QuestionDef = item.QuestionDef,
RectifyOpinion = item.RectifyOpinion,
LimitDate = item.LimitDate,
AttachUrl = item.AttachUrl,
HandleWay = item.HandleWay,
RectifyDate = item.RectifyDate,
ReAttachUrl = item.ReAttachUrl,
State = item.State,
IsSubmit = item.IsSubmit,
SubmitMan = APIDataShareSyncService.getUserId(item.SubmitManName),
IsOK = item.IsOK,
ProposeUnitId = getUnitIdByUnitName(item.ProposeUnitName),
SaveHandleMan = item.SaveHandleMan
};
if (type == "pull")
{
newModel.DataSource = item.DataSource;
}
db.Check_CheckControl.InsertOnSubmit(newModel);
db.SubmitChanges();
}
else
{
//更新
model.ProjectId = projectId;
model.UnitWorkId = APIDataShareSyncService.getUnitWorkId(item.UnitWorkName, projectId);
model.UnitId = getUnitIdByUnitName(item.UnitName) ?? unitId;
model.CheckDate = item.CheckDate;
model.CheckMan = APIDataShareSyncService.getUserId(item.CheckManName);
model.CheckSite = item.CheckSite;
model.DocCode = item.DocCode;
model.CNProfessionalCode = getCNProfessionalId(item.CNProfessionalName);
model.QuestionType = getQualityQuestionTypeId(item.QuestionTypeName, projectId);
model.QuestionDef = item.QuestionDef;
model.RectifyOpinion = item.RectifyOpinion;
model.LimitDate = item.LimitDate;
model.AttachUrl = item.AttachUrl;
model.HandleWay = item.HandleWay;
model.RectifyDate = item.RectifyDate;
model.ReAttachUrl = item.ReAttachUrl;
model.State = item.State;
model.IsSubmit = item.IsSubmit;
model.SubmitMan = APIDataShareSyncService.getUserId(item.SubmitManName);
model.IsOK = item.IsOK;
model.ProposeUnitId = getUnitIdByUnitName(item.ProposeUnitName);
model.SaveHandleMan = item.SaveHandleMan;
if (type == "pull")
{
model.DataSource = item.DataSource;
}
db.SubmitChanges();
}
//处理整改前附件
if (!string.IsNullOrEmpty(item.AttachUrl))
{
APIDataShareSyncService.OperationAttachFile(WebUrl, item.CheckControlCode,
BLL.Const.CheckListMenuId, item.AttachUrl);
}
//处理整改后附件
if (!string.IsNullOrEmpty(item.ReAttachUrl))
{
APIDataShareSyncService.OperationAttachFile(WebUrl, item.CheckControlCode + "R",
BLL.Const.CheckListMenuId, item.ReAttachUrl);
}
}
}
}
#endregion
#region 辅助映射方法
///
/// 获取质量问题类型ID(不存在则创建)
///
/// 问题类型名称
/// 项目ID
/// 问题类型ID
private static string getQualityQuestionTypeId(string questionTypeName, string projectId)
{
string questionTypeId = null;
if (!string.IsNullOrEmpty(questionTypeName))
{
var qqt = Funs.DB.Base_QualityQuestionType.FirstOrDefault(x => x.QualityQuestionType == questionTypeName);
if (qqt == null)
{
//不存在则创建
Model.Base_QualityQuestionType newQqt = new Model.Base_QualityQuestionType
{
QualityQuestionTypeId = SQLHelper.GetNewID(typeof(Model.Base_QualityQuestionType)),
QualityQuestionType = questionTypeName
};
QualityQuestionTypeService.AddQualityQuestionType(newQqt);
questionTypeId = newQqt.QualityQuestionTypeId;
}
else
{
questionTypeId = qqt.QualityQuestionTypeId;
}
}
return questionTypeId;
}
///
/// 获取专业ID(不存在则创建)
///
///
///
///
private static string getCNProfessionalId(string ProfessionalName)
{
string Id = null;
if (!string.IsNullOrEmpty(ProfessionalName))
{
var names = ProfessionalName.Split(',');
List IdList = new List();
foreach (var name in names)
{
var cnProfessional = Funs.DB.Base_CNProfessional.Where(x =>
x.ProfessionalName == name).ToList();
if (cnProfessional.Count == 0)
{
Model.Base_CNProfessional newCnProfessional = new Model.Base_CNProfessional
{
CNProfessionalId = SQLHelper.GetNewID(typeof(Model.WBS_UnitWork)),
ProfessionalName = name,
};
CNProfessionalService.AddCNProfessional(newCnProfessional);
IdList.Add(newCnProfessional.CNProfessionalId);
}
else
{
IdList.Add(cnProfessional.FirstOrDefault().CNProfessionalId);
}
}
Id = string.Join(",", IdList);
}
return Id;
}
///
/// 获取单位ID(根据名称)
///
/// 单位名称
/// 单位ID
private static string getUnitIdByUnitName(string unitName)
{
string unitId = null;
if (!string.IsNullOrEmpty(unitName))
{
var unit = Funs.DB.Base_Unit.FirstOrDefault(x => x.UnitName == unitName);
if (unit != null)
{
unitId = unit.UnitId;
}
}
return unitId;
}
#endregion
}
}