Clear code
This commit is contained in:
parent
d83142f48f
commit
f04f48ddd4
|
@ -0,0 +1,33 @@
|
|||
using Newtonsoft.Json;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace VOL.DingTalk.Models.Biz
|
||||
{
|
||||
|
||||
public class DingTalkDepartment
|
||||
{
|
||||
public bool auto_add_user { get; set; }
|
||||
public bool create_dept_group { get; set; }
|
||||
public int dept_id { get; set; }
|
||||
public string name { get; set; }
|
||||
public int parent_id { get; set; }
|
||||
|
||||
public string ext { get; set; }
|
||||
|
||||
[JsonIgnore]
|
||||
public List<DingTalkDepartment> subDepartments { get; set; } = [];
|
||||
|
||||
/// <summary>
|
||||
/// 递归获取部门ID列表
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public List<int> GetDeptIds()
|
||||
{
|
||||
return [dept_id, ..subDepartments.SelectMany(i => i.GetDeptIds()).ToList()];
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,38 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace VOL.DingTalk.Models.Biz
|
||||
{
|
||||
public class DingTalkEmployee
|
||||
{
|
||||
|
||||
public string? UserId { get; set; }
|
||||
|
||||
public string? Name { get; set; }
|
||||
public string? Email { get; set; }
|
||||
public string? Mobile { get; set; }
|
||||
public string? JobNumber { get; set; }
|
||||
public string? ReportManager { get; set; }
|
||||
public string? Position { get; set; }
|
||||
public string? Dept { get; set; }
|
||||
|
||||
public static DingTalkEmployee TranFrom(DingTalkEmployeeRsp emp)
|
||||
{
|
||||
var obj = new DingTalkEmployee
|
||||
{
|
||||
UserId = emp.userid,
|
||||
Name = emp.fieldDataList?.FirstOrDefault(f => f.fieldCode == "sys00-name")?.fieldValueList?.First()?.label,
|
||||
Email = emp.fieldDataList?.FirstOrDefault(f => f.fieldCode == "sys00-email")?.fieldValueList?.First()?.label,
|
||||
Mobile = emp.fieldDataList?.FirstOrDefault(f => f.fieldCode == "sys00-mobile")?.fieldValueList?.First()?.label,
|
||||
JobNumber = emp.fieldDataList?.FirstOrDefault(f => f.fieldCode == "sys00-jobNumber")?.fieldValueList?.First()?.label,
|
||||
ReportManager = emp.fieldDataList?.FirstOrDefault(f => f.fieldCode == "sys00-reportManager")?.fieldValueList?.First()?.label,
|
||||
Position = emp.fieldDataList?.FirstOrDefault(f => f.fieldCode == "sys00-position")?.fieldValueList?.First()?.label,
|
||||
Dept = emp.fieldDataList?.FirstOrDefault(f => f.fieldCode == "sys00-dept")?.fieldValueList?.First()?.label,
|
||||
};
|
||||
return obj;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,41 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace VOL.DingTalk.Models.Biz
|
||||
{
|
||||
public class DingTalkEmployeeRsp
|
||||
{
|
||||
|
||||
public FieldDataList[] fieldDataList { get; set; }
|
||||
public string corpId { get; set; }
|
||||
public string userid { get; set; }
|
||||
}
|
||||
|
||||
public class FieldDataList
|
||||
{
|
||||
public string fieldCode { get; set; }
|
||||
public string fieldName { get; set; }
|
||||
public string groupId { get; set; }
|
||||
public string label { get; set; }
|
||||
public string value { get; set; }
|
||||
|
||||
public List<FieldValueList> fieldValueList { get; set;}
|
||||
}
|
||||
|
||||
public class FieldValueList
|
||||
{
|
||||
public int itemIndex { get; set; }
|
||||
public string label { get; set; }
|
||||
public string value { get; set; }
|
||||
}
|
||||
|
||||
public class EmployeeQuery {
|
||||
|
||||
public List<string> data_list { get; set; }
|
||||
public long? next_cursor { get; set; }
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,18 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace VOL.DingTalk.Models.Biz
|
||||
{
|
||||
internal class DingTalkResponse<T>
|
||||
{
|
||||
public int errcode { get; set; }
|
||||
public string errmsg { get; set; }
|
||||
public T result { get; set; }
|
||||
public string request_id { get; set; }
|
||||
public bool? success { get; set; }
|
||||
|
||||
}
|
||||
}
|
|
@ -0,0 +1,36 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace VOL.DingTalk.Models
|
||||
{
|
||||
/*
|
||||
"dingtalk": {
|
||||
"corp_id": "dingec656045526ce9c0ee0f45d8e4f7c288",
|
||||
"app_key": "dingtl9hb00ktdkguzrh",
|
||||
"app_secret": "NkWagc8VEhdZyjEPkK0oYbi_ZzqVMHLelmFWdGswBjh2zGgSt0UWLj1W58xNHwfv",
|
||||
"agent_id": 3973173455
|
||||
},
|
||||
*/
|
||||
public class DingTalkConfig
|
||||
{
|
||||
public string CorpId = "dingec656045526ce9c0ee0f45d8e4f7c288";
|
||||
public string AppKey = "dingtl9hb00ktdkguzrh";
|
||||
public string AppSecret = "NkWagc8VEhdZyjEPkK0oYbi_ZzqVMHLelmFWdGswBjh2zGgSt0UWLj1W58xNHwfv";
|
||||
public long AgentId = 3973173455;
|
||||
|
||||
public List<string> fields = [
|
||||
|
||||
"sys00-name", // 姓名
|
||||
"sys00-email", // 邮箱
|
||||
"sys00-mobile", // 手机号
|
||||
"sys02-certNo", // 证件号码
|
||||
"sys02-birthTime", // 出生日期
|
||||
"sys02-sexType", // 性别
|
||||
"sys00-dept", // 部门
|
||||
"sys00-jobNumber" // 工号
|
||||
];
|
||||
}
|
||||
}
|
|
@ -0,0 +1,21 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace VOL.DingTalk.Models
|
||||
{
|
||||
public class SystemToken
|
||||
{
|
||||
public string Token { get; set; }
|
||||
public int TokenExpiry { get; set; }
|
||||
public DateTime TokenEndTime { get; set; } = DateTime.Now;
|
||||
|
||||
public bool IsTokenExpiry()
|
||||
{
|
||||
//if (TokenEndTime == null) return true;
|
||||
return TokenExpiry == 0 || TokenEndTime > DateTime.Now;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,33 +1,23 @@
|
|||
using Microsoft.Extensions.Logging;
|
||||
using Newtonsoft.Json;
|
||||
using Newtonsoft.Json;
|
||||
using System.Globalization;
|
||||
using System.Linq;
|
||||
using System.Net.Http.Headers;
|
||||
using System.Text;
|
||||
using VOL.Core.Services;
|
||||
using VOL.DingTalk.Models;
|
||||
using VOL.DingTalk.Models.Biz;
|
||||
|
||||
namespace VOL.HR.Services.DingTalk
|
||||
namespace VOL.DingTalk.Services.Biz
|
||||
{
|
||||
public class DingTalkService
|
||||
{
|
||||
|
||||
private readonly string _corpId;
|
||||
private readonly string _appKey;
|
||||
private readonly string _appSecret;
|
||||
private readonly string _agentId;
|
||||
private string _accessToken;
|
||||
private DateTime _tokenExpiry;
|
||||
private readonly SemaphoreSlim _tokenLock = new SemaphoreSlim(1, 1);
|
||||
private readonly ILogger<DingTalkService> _logger;
|
||||
|
||||
// 钉钉API地址
|
||||
private readonly string _tokenUrl;
|
||||
private const string DepartmentSubUrl = "https://oapi.dingtalk.com/topapi/v2/department/listsub";
|
||||
private const string UserListIdUrl = "https://oapi.dingtalk.com/topapi/user/listid";
|
||||
private const string RosterUrl = "https://api.dingtalk.com/v1.0/hrm/rosters/lists/query";
|
||||
private const string UpdateEmployeeUrl = "https://oapi.dingtalk.com/topapi/smartwork/hrm/employee/v2/update";
|
||||
|
||||
private const string UserListIdUrl = "https://oapi.dingtalk.com/topapi/user/listid";
|
||||
// 需要获取的花名册字段代码
|
||||
private readonly List<string> _fieldCodes = new List<string>
|
||||
{
|
||||
private readonly List<string> _fieldCodes =
|
||||
[
|
||||
"sys00-name", // 姓名
|
||||
"sys00-email", // 邮箱
|
||||
"sys00-mobile", // 手机号
|
||||
|
@ -35,132 +25,140 @@ namespace VOL.HR.Services.DingTalk
|
|||
"sys02-birthTime", // 出生日期
|
||||
"sys02-sexType", // 性别
|
||||
"sys00-dept", // 部门
|
||||
"sys00-jobNumber" // 工号
|
||||
};
|
||||
"sys00-jobNumber", // 工号
|
||||
"sys00-reportManager", // 直接主管
|
||||
"sys00-position" // 职位
|
||||
];
|
||||
|
||||
public DingTalkService(string corpId, string appKey, string appSecret, string agentId, ILogger<DingTalkService> logger)
|
||||
{
|
||||
_corpId = corpId;
|
||||
_appKey = appKey;
|
||||
_appSecret = appSecret;
|
||||
_agentId = agentId;
|
||||
_tokenUrl = $"https://api.dingtalk.com/v1.0/oauth2/{_corpId}/token";
|
||||
_logger = logger ?? throw new ArgumentNullException(nameof(logger));
|
||||
}
|
||||
private readonly SemaphoreSlim _tokenLock = new SemaphoreSlim(1, 1);
|
||||
// 钉钉API地址
|
||||
private readonly string _tokenUrl;
|
||||
|
||||
private async Task<string> GetAccessTokenAsync()
|
||||
private DingTalkConfig _config;
|
||||
private SystemToken _token;
|
||||
public DingTalkService(SystemToken token, DingTalkConfig config)
|
||||
{
|
||||
var payload = new Dictionary<string, string>
|
||||
_token = token;
|
||||
_config = config;
|
||||
//Init();
|
||||
_tokenUrl = $"https://api.dingtalk.com/v1.0/oauth2/{_config.CorpId}/token";
|
||||
}
|
||||
public List<Dictionary<string, string>> ExtractEmployeeData(List<Dictionary<string, object>> rosterData)
|
||||
{
|
||||
{ "client_id", _appKey },
|
||||
{ "client_secret", _appSecret },
|
||||
{ "grant_type", "client_credentials" }
|
||||
};
|
||||
var employees = new List<Dictionary<string, string>>();
|
||||
|
||||
using (var client = new HttpClient())
|
||||
foreach (var userData in rosterData)
|
||||
{
|
||||
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
|
||||
var jsonPayload = JsonConvert.SerializeObject(payload);
|
||||
var content = new StringContent(jsonPayload, Encoding.UTF8, "application/json");
|
||||
var emp = new Dictionary<string, string> { { "userid", userData["userId"].ToString() } };
|
||||
|
||||
try
|
||||
{
|
||||
var response = await client.PostAsync(_tokenUrl, content);
|
||||
response.EnsureSuccessStatusCode();
|
||||
var responseContent = await response.Content.ReadAsStringAsync();
|
||||
var data = JsonConvert.DeserializeObject<Dictionary<string, string>>(responseContent);
|
||||
return data["access_token"];
|
||||
}
|
||||
catch (HttpRequestException ex)
|
||||
{
|
||||
_logger.LogError($"获取access_token失败: {ex.Message}");
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
var fieldDataList = (Newtonsoft.Json.Linq.JArray)userData["fieldDataList"];
|
||||
|
||||
public async Task<string> GetValidTokenAsync()
|
||||
foreach (Newtonsoft.Json.Linq.JObject field in fieldDataList)
|
||||
{
|
||||
await _tokenLock.WaitAsync();
|
||||
try
|
||||
string fieldCode = field["fieldCode"].ToString();
|
||||
string fieldValue = "";
|
||||
|
||||
var fieldValueList = (Newtonsoft.Json.Linq.JArray)field["fieldValueList"];
|
||||
if (fieldValueList != null && fieldValueList.Count > 0)
|
||||
{
|
||||
// 如果token不存在或已过期,重新获取
|
||||
if (string.IsNullOrEmpty(_accessToken) || DateTime.Now >= _tokenExpiry)
|
||||
// 处理部门信息
|
||||
if (fieldCode == "sys00-dept")
|
||||
{
|
||||
_logger.LogInformation("钉钉access_token已过期,重新获取...");
|
||||
var token = await GetAccessTokenAsync();
|
||||
if (token != null)
|
||||
{
|
||||
_accessToken = token;
|
||||
// 钉钉token有效期为7200秒,提前300秒刷新
|
||||
_tokenExpiry = DateTime.Now + TimeSpan.FromSeconds(6900);
|
||||
// 部门可能有多个,取第一个
|
||||
fieldValue = field["fieldValueList"][0]["label"].ToString();
|
||||
}
|
||||
else
|
||||
{
|
||||
_logger.LogError("无法获取有效的钉钉access_token");
|
||||
return null;
|
||||
}
|
||||
}
|
||||
return _accessToken;
|
||||
}
|
||||
finally
|
||||
{
|
||||
_tokenLock.Release();
|
||||
fieldValue = field["fieldValueList"][0]["label"].ToString();
|
||||
}
|
||||
}
|
||||
|
||||
public async Task<List<Dictionary<string, object>>> GetSubDepartmentsAsync(long parentId = 1)
|
||||
// 映射字段到中文名
|
||||
switch (fieldCode)
|
||||
{
|
||||
case "sys00-name":
|
||||
emp["姓名"] = fieldValue;
|
||||
break;
|
||||
|
||||
case "sys00-email":
|
||||
emp["邮箱"] = fieldValue;
|
||||
break;
|
||||
|
||||
case "sys00-dept":
|
||||
emp["部门"] = fieldValue;
|
||||
break;
|
||||
|
||||
case "sys00-mobile":
|
||||
emp["手机号"] = fieldValue;
|
||||
break;
|
||||
|
||||
case "sys02-certNo":
|
||||
emp["证件号码"] = fieldValue;
|
||||
break;
|
||||
|
||||
case "sys02-birthTime":
|
||||
emp["出生日期"] = fieldValue;
|
||||
break;
|
||||
|
||||
case "sys02-sexType":
|
||||
emp["性别"] = fieldValue;
|
||||
break;
|
||||
|
||||
case "sys00-jobNumber":
|
||||
emp["工号"] = fieldValue;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
employees.Add(emp);
|
||||
}
|
||||
|
||||
return employees;
|
||||
}
|
||||
|
||||
public async Task<List<DingTalkEmployee>> GetAllEmployeesAsync()
|
||||
{
|
||||
DateTime startTime = DateTime.Now;
|
||||
|
||||
Logger.Info("正在获取钉钉访问凭证...");
|
||||
var accessToken = await GetValidTokenAsync();
|
||||
if (accessToken == null)
|
||||
{
|
||||
return new List<Dictionary<string, object>>();
|
||||
return new List<DingTalkEmployee>();
|
||||
}
|
||||
|
||||
var departments = new List<Dictionary<string, object>>();
|
||||
var payload = new Dictionary<string, object> { { "dept_id", parentId } };
|
||||
var queryParams = new Dictionary<string, string> { { "access_token", accessToken } };
|
||||
Logger.Info("正在获取部门结构...");
|
||||
var departments = await GetSubDepartmentsAsync();
|
||||
Logger.Info($"共获取到 {departments.Count} 个部门");
|
||||
|
||||
try
|
||||
HashSet<string> allUserIds = new HashSet<string>();
|
||||
Logger.Info("正在获取部门用户列表...");
|
||||
foreach (var dept in departments)
|
||||
{
|
||||
using (var client = new HttpClient())
|
||||
{
|
||||
var jsonPayload = JsonConvert.SerializeObject(payload);
|
||||
var content = new StringContent(jsonPayload, Encoding.UTF8, "application/json");
|
||||
var uriBuilder = new UriBuilder(DepartmentSubUrl);
|
||||
uriBuilder.Query = string.Join("&", queryParams.Select(kvp => $"{kvp.Key}={kvp.Value}"));
|
||||
var userIds = await GetDeptUserIdsAsync(Convert.ToInt64(dept.dept_id));
|
||||
allUserIds.UnionWith(userIds);
|
||||
Logger.Info($"部门 {dept.name} 有 {userIds.Count} 个用户");
|
||||
}
|
||||
|
||||
var response = await client.PostAsync(uriBuilder.Uri, content);
|
||||
response.EnsureSuccessStatusCode();
|
||||
var responseContent = await response.Content.ReadAsStringAsync();
|
||||
var data = JsonConvert.DeserializeObject<Dictionary<string, object>>(responseContent);
|
||||
List<string> userIdList = allUserIds.ToList();
|
||||
Logger.Info($"共获取到 {userIdList.Count} 个用户");
|
||||
|
||||
if (Convert.ToInt32(data["errcode"]) == 0)
|
||||
// 分批处理用户(每批100人)
|
||||
var allEmployees = new List<DingTalkEmployee>();
|
||||
int batchSize = 100;
|
||||
for (int i = 0; i < userIdList.Count; i += batchSize)
|
||||
{
|
||||
var result = (Newtonsoft.Json.Linq.JArray)data["result"];
|
||||
foreach (Newtonsoft.Json.Linq.JObject dept in result)
|
||||
{
|
||||
long deptId = (long)dept["dept_id"];
|
||||
var department = new Dictionary<string, object>
|
||||
{
|
||||
{ "id", deptId },
|
||||
{ "name", dept["name"].ToString() },
|
||||
{ "parent_id", (long)dept["parent_id"] }
|
||||
};
|
||||
departments.Add(department);
|
||||
var batch = userIdList.GetRange(i, Math.Min(batchSize, userIdList.Count - i));
|
||||
Logger.Info($"正在处理用户批次 {i / batchSize + 1}/{(userIdList.Count - 1) / batchSize + 1}");
|
||||
|
||||
// 递归获取子部门
|
||||
departments.AddRange(await GetSubDepartmentsAsync(deptId));
|
||||
}
|
||||
}
|
||||
return departments;
|
||||
}
|
||||
}
|
||||
catch (HttpRequestException ex)
|
||||
{
|
||||
_logger.LogError($"获取部门列表失败: {ex.Message}");
|
||||
return new List<Dictionary<string, object>>();
|
||||
var rosterData = await GetRosterInfoAsync(batch);
|
||||
allEmployees.AddRange([.. rosterData.Select(DingTalkEmployee.TranFrom)]);
|
||||
}
|
||||
|
||||
Logger.Info($"成功获取 {allEmployees.Count} 名员工信息");
|
||||
Logger.Info($"钉钉数据获取完成,耗时: {DateTime.Now.Subtract(startTime).TotalSeconds:.2f}秒");
|
||||
|
||||
return allEmployees;
|
||||
}
|
||||
|
||||
public async Task<List<string>> GetDeptUserIdsAsync(long deptId)
|
||||
|
@ -198,30 +196,30 @@ namespace VOL.HR.Services.DingTalk
|
|||
}
|
||||
catch (HttpRequestException ex)
|
||||
{
|
||||
_logger.LogError($"获取部门用户失败: {ex.Message}");
|
||||
Logger.Error($"获取部门用户失败: {ex.Message}");
|
||||
return new List<string>();
|
||||
}
|
||||
}
|
||||
|
||||
public async Task<List<Dictionary<string, object>>> GetRosterInfoAsync(List<string> userIds)
|
||||
public async Task<List<DingTalkEmployeeRsp>> GetRosterInfoAsync(List<string> userIds)
|
||||
{
|
||||
var accessToken = await GetValidTokenAsync();
|
||||
if (accessToken == null)
|
||||
{
|
||||
return new List<Dictionary<string, object>>();
|
||||
return new List<DingTalkEmployeeRsp>();
|
||||
}
|
||||
|
||||
var headers = new Dictionary<string, string>
|
||||
{
|
||||
{ "x-acs-dingtalk-access-token", accessToken },
|
||||
{ "Content-Type", "application/json" }
|
||||
//{ "Content-Type", "application/json" }
|
||||
};
|
||||
|
||||
var payload = new Dictionary<string, object>
|
||||
{
|
||||
{ "userIdList", userIds },
|
||||
{ "fieldFilterList", _fieldCodes },
|
||||
{ "appAgentId", _agentId },
|
||||
{ "appAgentId", _config.AgentId },
|
||||
{ "text2SelectConvert", true }
|
||||
};
|
||||
|
||||
|
@ -229,6 +227,7 @@ namespace VOL.HR.Services.DingTalk
|
|||
{
|
||||
using (var client = new HttpClient())
|
||||
{
|
||||
client.DefaultRequestHeaders.Clear();
|
||||
foreach (var header in headers)
|
||||
{
|
||||
client.DefaultRequestHeaders.Add(header.Key, header.Value);
|
||||
|
@ -240,127 +239,111 @@ namespace VOL.HR.Services.DingTalk
|
|||
var response = await client.PostAsync(RosterUrl, content);
|
||||
response.EnsureSuccessStatusCode();
|
||||
var responseContent = await response.Content.ReadAsStringAsync();
|
||||
var data = JsonConvert.DeserializeObject<Dictionary<string, object>>(responseContent);
|
||||
return ((Newtonsoft.Json.Linq.JArray)data["result"]).ToObject<List<Dictionary<string, object>>>();
|
||||
//var data = JsonConvert.DeserializeObject<Dictionary<string, object>>(responseContent);
|
||||
//return ((Newtonsoft.Json.Linq.JArray)data["result"]).ToObject<List<DingTalkEmployeeRsp>>();
|
||||
var rspResult = JsonConvert.DeserializeObject<DingTalkResponse<List<DingTalkEmployeeRsp>>>(responseContent);
|
||||
return rspResult.result;
|
||||
}
|
||||
}
|
||||
catch (HttpRequestException ex)
|
||||
{
|
||||
_logger.LogError($"获取花名册失败: {ex.Message}");
|
||||
return new List<Dictionary<string, object>>();
|
||||
Logger.Error($"获取花名册失败: {ex.Message}");
|
||||
return new List<DingTalkEmployeeRsp>();
|
||||
}
|
||||
}
|
||||
|
||||
public List<Dictionary<string, string>> ExtractEmployeeData(List<Dictionary<string, object>> rosterData)
|
||||
public async Task<List<DingTalkDepartment>> GetSubDepartmentsAsync(long parentId = 1)
|
||||
{
|
||||
var employees = new List<Dictionary<string, string>>();
|
||||
|
||||
foreach (var userData in rosterData)
|
||||
{
|
||||
var emp = new Dictionary<string, string> { { "userid", userData["userId"].ToString() } };
|
||||
|
||||
var fieldDataList = (Newtonsoft.Json.Linq.JArray)userData["fieldDataList"];
|
||||
|
||||
foreach (Newtonsoft.Json.Linq.JObject field in fieldDataList)
|
||||
{
|
||||
string fieldCode = field["fieldCode"].ToString();
|
||||
string fieldValue = "";
|
||||
|
||||
var fieldValueList = (Newtonsoft.Json.Linq.JArray)field["fieldValueList"];
|
||||
if (fieldValueList != null && fieldValueList.Count > 0)
|
||||
{
|
||||
// 处理部门信息
|
||||
if (fieldCode == "sys00-dept")
|
||||
{
|
||||
// 部门可能有多个,取第一个
|
||||
fieldValue = field["fieldValueList"][0]["label"].ToString();
|
||||
}
|
||||
else
|
||||
{
|
||||
fieldValue = field["fieldValueList"][0]["label"].ToString();
|
||||
}
|
||||
}
|
||||
|
||||
// 映射字段到中文名
|
||||
switch (fieldCode)
|
||||
{
|
||||
case "sys00-name":
|
||||
emp["姓名"] = fieldValue;
|
||||
break;
|
||||
case "sys00-email":
|
||||
emp["邮箱"] = fieldValue;
|
||||
break;
|
||||
case "sys00-dept":
|
||||
emp["部门"] = fieldValue;
|
||||
break;
|
||||
case "sys00-mobile":
|
||||
emp["手机号"] = fieldValue;
|
||||
break;
|
||||
case "sys02-certNo":
|
||||
emp["证件号码"] = fieldValue;
|
||||
break;
|
||||
case "sys02-birthTime":
|
||||
emp["出生日期"] = fieldValue;
|
||||
break;
|
||||
case "sys02-sexType":
|
||||
emp["性别"] = fieldValue;
|
||||
break;
|
||||
case "sys00-jobNumber":
|
||||
emp["工号"] = fieldValue;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
employees.Add(emp);
|
||||
}
|
||||
|
||||
return employees;
|
||||
}
|
||||
|
||||
public async Task<(List<Dictionary<string, string>>, List<Dictionary<string, object>>)> GetAllEmployeesAsync()
|
||||
{
|
||||
DateTime startTime = DateTime.Now;
|
||||
|
||||
_logger.LogInformation("正在获取钉钉访问凭证...");
|
||||
var accessToken = await GetValidTokenAsync();
|
||||
if (accessToken == null)
|
||||
{
|
||||
return (new List<Dictionary<string, string>>(), new List<Dictionary<string, object>>());
|
||||
return new List<DingTalkDepartment>();
|
||||
}
|
||||
|
||||
_logger.LogInformation("正在获取部门结构...");
|
||||
var departments = await GetSubDepartmentsAsync();
|
||||
_logger.LogInformation($"共获取到 {departments.Count} 个部门");
|
||||
var departments = new List<DingTalkDepartment>();
|
||||
var payload = new Dictionary<string, object> { { "dept_id", parentId } };
|
||||
var queryParams = new Dictionary<string, string> { { "access_token", accessToken } };
|
||||
|
||||
HashSet<string> allUserIds = new HashSet<string>();
|
||||
_logger.LogInformation("正在获取部门用户列表...");
|
||||
foreach (var dept in departments)
|
||||
try
|
||||
{
|
||||
var userIds = await GetDeptUserIdsAsync(Convert.ToInt64(dept["id"]));
|
||||
allUserIds.UnionWith(userIds);
|
||||
_logger.LogInformation($"部门 {dept["name"]} 有 {userIds.Count} 个用户");
|
||||
}
|
||||
|
||||
List<string> userIdList = allUserIds.ToList();
|
||||
_logger.LogInformation($"共获取到 {userIdList.Count} 个用户");
|
||||
|
||||
// 分批处理用户(每批100人)
|
||||
List<Dictionary<string, string>> allEmployees = new List<Dictionary<string, string>>();
|
||||
int batchSize = 100;
|
||||
for (int i = 0; i < userIdList.Count; i += batchSize)
|
||||
using (var client = new HttpClient())
|
||||
{
|
||||
var batch = userIdList.GetRange(i, Math.Min(batchSize, userIdList.Count - i));
|
||||
_logger.LogInformation($"正在处理用户批次 {i / batchSize + 1}/{(userIdList.Count - 1) / batchSize + 1}");
|
||||
var jsonPayload = JsonConvert.SerializeObject(payload);
|
||||
var content = new StringContent(jsonPayload, Encoding.UTF8, "application/json");
|
||||
var uriBuilder = new UriBuilder(DepartmentSubUrl);
|
||||
uriBuilder.Query = string.Join("&", queryParams.Select(kvp => $"{kvp.Key}={kvp.Value}"));
|
||||
|
||||
var rosterData = await GetRosterInfoAsync(batch);
|
||||
var employees = ExtractEmployeeData(rosterData);
|
||||
allEmployees.AddRange(employees);
|
||||
var response = await client.PostAsync(uriBuilder.Uri, content);
|
||||
response.EnsureSuccessStatusCode();
|
||||
var responseContent = await response.Content.ReadAsStringAsync();
|
||||
var data = JsonConvert.DeserializeObject<Dictionary<string, object>>(responseContent);
|
||||
|
||||
if (Convert.ToInt32(data["errcode"]) == 0)
|
||||
{
|
||||
var result = (Newtonsoft.Json.Linq.JArray)data["result"];
|
||||
foreach (Newtonsoft.Json.Linq.JObject dept in result)
|
||||
{
|
||||
long deptId = (long)dept["dept_id"];
|
||||
// var department = new DingTalkDepartment
|
||||
//{
|
||||
// { "id", deptId },
|
||||
// { "name", dept["name"].ToString() },
|
||||
// { "parent_id", (long)dept["parent_id"] }
|
||||
//};
|
||||
var department = new DingTalkDepartment
|
||||
{
|
||||
dept_id = (int)dept["dept_id"],
|
||||
name = dept["name"].ToString(),
|
||||
parent_id = (int)dept["parent_id"],
|
||||
auto_add_user = (bool)dept["auto_add_user"],
|
||||
create_dept_group = (bool)dept["create_dept_group"],
|
||||
ext = dept["ext"]?.ToString()
|
||||
};
|
||||
departments.Add(department);
|
||||
|
||||
//await Task.Delay(1500); // 间隔1.5秒,避免请求过快
|
||||
// 递归获取子部门
|
||||
departments.AddRange(await GetSubDepartmentsAsync(deptId));
|
||||
}
|
||||
}
|
||||
return departments;
|
||||
}
|
||||
}
|
||||
catch (HttpRequestException ex)
|
||||
{
|
||||
Logger.Error($"获取部门列表失败: {ex.Message}");
|
||||
return new List<DingTalkDepartment>();
|
||||
}
|
||||
}
|
||||
|
||||
_logger.LogInformation($"成功获取 {allEmployees.Count} 名员工信息");
|
||||
_logger.LogInformation($"钉钉数据获取完成,耗时: {DateTime.Now.Subtract(startTime).TotalSeconds:.2f}秒");
|
||||
|
||||
return (allEmployees, departments);
|
||||
public async Task<string> GetValidTokenAsync()
|
||||
{
|
||||
await _tokenLock.WaitAsync();
|
||||
try
|
||||
{
|
||||
// 如果token不存在或已过期,重新获取
|
||||
if (_token.IsTokenExpiry())
|
||||
{
|
||||
Logger.Info("钉钉access_token已过期,重新获取...");
|
||||
var token = await GetAccessTokenAsync();
|
||||
if (token != null)
|
||||
{
|
||||
_token.Token = token;
|
||||
// 钉钉token有效期为7200秒,提前300秒刷新
|
||||
_token.TokenExpiry = 6900;
|
||||
}
|
||||
else
|
||||
{
|
||||
Logger.Error("无法获取有效的钉钉access_token");
|
||||
return null;
|
||||
}
|
||||
}
|
||||
return _token.Token;
|
||||
}
|
||||
finally
|
||||
{
|
||||
_tokenLock.Release();
|
||||
}
|
||||
}
|
||||
|
||||
public async Task<bool> UpdateEmployeeAsync(string userId, Dictionary<string, Dictionary<string, string>> fieldUpdates)
|
||||
|
@ -421,7 +404,7 @@ namespace VOL.HR.Services.DingTalk
|
|||
var queryParams = new Dictionary<string, string> { { "access_token", accessToken } };
|
||||
var payload = new Dictionary<string, object>
|
||||
{
|
||||
{ "agentid", _agentId },
|
||||
{ "agentid", _config.AgentId },
|
||||
{
|
||||
"param", new Dictionary<string, object>
|
||||
{
|
||||
|
@ -433,7 +416,7 @@ namespace VOL.HR.Services.DingTalk
|
|||
|
||||
try
|
||||
{
|
||||
_logger.LogInformation($"钉钉更新请求: {JsonConvert.SerializeObject(payload, Formatting.None)}");
|
||||
Logger.Info($"钉钉更新请求: {JsonConvert.SerializeObject(payload, Formatting.None)}");
|
||||
|
||||
using (var client = new HttpClient())
|
||||
{
|
||||
|
@ -444,8 +427,8 @@ namespace VOL.HR.Services.DingTalk
|
|||
var content = new StringContent(jsonPayload, Encoding.UTF8, "application/json");
|
||||
|
||||
var response = await client.PostAsync(uriBuilder.Uri, content);
|
||||
_logger.LogInformation($"钉钉更新响应状态: {response.StatusCode}");
|
||||
_logger.LogInformation($"钉钉更新响应内容: {await response.Content.ReadAsStringAsync()}");
|
||||
Logger.Info($"钉钉更新响应状态: {response.StatusCode}");
|
||||
Logger.Info($"钉钉更新响应内容: {await response.Content.ReadAsStringAsync()}");
|
||||
|
||||
response.EnsureSuccessStatusCode();
|
||||
var responseContent = await response.Content.ReadAsStringAsync();
|
||||
|
@ -456,24 +439,40 @@ namespace VOL.HR.Services.DingTalk
|
|||
Convert.ToBoolean(data.GetValueOrDefault("result", false)) &&
|
||||
Convert.ToBoolean(data.GetValueOrDefault("success", false)))
|
||||
{
|
||||
_logger.LogInformation($"员工 {userId} 更新成功");
|
||||
Logger.Info($"员工 {userId} 更新成功");
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
string errorMsg = data.GetValueOrDefault("errmsg", "未知错误")?.ToString();
|
||||
_logger.LogError($"员工更新失败: {errorMsg}");
|
||||
Logger.Error($"员工更新失败: {errorMsg}");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (HttpRequestException ex)
|
||||
{
|
||||
_logger.LogError($"更新员工信息失败: {ex.Message}");
|
||||
Logger.Error($"更新员工信息失败: {ex.Message}");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
private string ConvertGenderForDingTalk(string gender)
|
||||
{
|
||||
if (gender == "男")
|
||||
{
|
||||
return "1";
|
||||
}
|
||||
else if (gender == "女")
|
||||
{
|
||||
return "2";
|
||||
}
|
||||
else
|
||||
{
|
||||
return gender;
|
||||
}
|
||||
}
|
||||
|
||||
private string FormatDate(string dateStr)
|
||||
{
|
||||
try
|
||||
|
@ -505,21 +504,35 @@ namespace VOL.HR.Services.DingTalk
|
|||
}
|
||||
}
|
||||
|
||||
private string ConvertGenderForDingTalk(string gender)
|
||||
private async Task<string> GetAccessTokenAsync()
|
||||
{
|
||||
if (gender == "男")
|
||||
var payload = new Dictionary<string, string>
|
||||
{
|
||||
return "1";
|
||||
}
|
||||
else if (gender == "女")
|
||||
{
|
||||
return "2";
|
||||
}
|
||||
else
|
||||
{
|
||||
return gender;
|
||||
}
|
||||
}
|
||||
{ "client_id", _config.AppKey },
|
||||
{ "client_secret", _config.AppSecret },
|
||||
{ "grant_type", "client_credentials" }
|
||||
};
|
||||
|
||||
}
|
||||
using (var client = new HttpClient())
|
||||
{
|
||||
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
|
||||
var jsonPayload = JsonConvert.SerializeObject(payload);
|
||||
var content = new StringContent(jsonPayload, Encoding.UTF8, "application/json");
|
||||
|
||||
try
|
||||
{
|
||||
var response = await client.PostAsync(_tokenUrl, content);
|
||||
response.EnsureSuccessStatusCode();
|
||||
var responseContent = await response.Content.ReadAsStringAsync();
|
||||
var data = JsonConvert.DeserializeObject<Dictionary<string, string>>(responseContent);
|
||||
return data["access_token"];
|
||||
}
|
||||
catch (HttpRequestException ex)
|
||||
{
|
||||
Logger.Error($"获取access_token失败: {ex.Message}");
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,13 @@
|
|||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net8.0</TargetFramework>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\VOL.Core\VOL.Core.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
|
@ -0,0 +1,69 @@
|
|||
/*
|
||||
*代码由框架生成,任何更改都可能导致被代码生成器覆盖
|
||||
*如果数据库字段发生变化,请在代码生器重新生成此Model
|
||||
*/
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.ComponentModel.DataAnnotations.Schema;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using SqlSugar;
|
||||
using VOL.Entity.SystemModels;
|
||||
|
||||
namespace VOL.Entity.DomainModels
|
||||
{
|
||||
[Entity(TableCnName = "跨系统部门关联",TableName = "HR_DeptShip")]
|
||||
public partial class HR_DeptShip:BaseEntity
|
||||
{
|
||||
/// <summary>
|
||||
///关联关系ID
|
||||
/// </summary>
|
||||
[SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
|
||||
[Key]
|
||||
[Display(Name ="关联关系ID")]
|
||||
[Column(TypeName="int")]
|
||||
[Editable(true)]
|
||||
[Required(AllowEmptyStrings=false)]
|
||||
public int ShipId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
///YSERP部门ID
|
||||
/// </summary>
|
||||
[Display(Name ="YSERP部门ID")]
|
||||
[MaxLength(100)]
|
||||
[Column(TypeName="nvarchar(100)")]
|
||||
[Editable(true)]
|
||||
public string YSDeptId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
///YS部门名称
|
||||
/// </summary>
|
||||
[Display(Name ="YS部门名称")]
|
||||
[MaxLength(100)]
|
||||
[Column(TypeName="nvarchar(100)")]
|
||||
[Editable(true)]
|
||||
public string YSDeptName { get; set; }
|
||||
|
||||
/// <summary>
|
||||
///钉钉部门ID
|
||||
/// </summary>
|
||||
[Display(Name ="钉钉部门ID")]
|
||||
[MaxLength(100)]
|
||||
[Column(TypeName="nvarchar(100)")]
|
||||
[Editable(true)]
|
||||
public string DingTalkDeptId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
///钉钉部门名称
|
||||
/// </summary>
|
||||
[Display(Name ="钉钉部门名称")]
|
||||
[MaxLength(100)]
|
||||
[Column(TypeName="nvarchar(100)")]
|
||||
[Editable(true)]
|
||||
public string DingTalkDeptName { get; set; }
|
||||
|
||||
|
||||
}
|
||||
}
|
|
@ -0,0 +1,22 @@
|
|||
/*
|
||||
*代码由框架生成,任何更改都可能导致被代码生成器覆盖
|
||||
*如果数据库字段发生变化,请在代码生器重新生成此Model
|
||||
*/
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.ComponentModel.DataAnnotations.Schema;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using SqlSugar;
|
||||
using VOL.Entity.SystemModels;
|
||||
|
||||
namespace VOL.Entity.DomainModels
|
||||
{
|
||||
|
||||
public partial class HR_DeptShip
|
||||
{
|
||||
//此处配置字段(字段配置见此model的另一个partial),如果表中没有此字段请加上 [NotMapped]属性,否则会异常
|
||||
}
|
||||
}
|
|
@ -0,0 +1,64 @@
|
|||
/*
|
||||
*代码由框架生成,任何更改都可能导致被代码生成器覆盖
|
||||
*如果数据库字段发生变化,请在代码生器重新生成此Model
|
||||
*/
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.ComponentModel.DataAnnotations.Schema;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using SqlSugar;
|
||||
using VOL.Entity.SystemModels;
|
||||
|
||||
namespace VOL.Entity.DomainModels
|
||||
{
|
||||
[Entity(TableCnName = "部门信息同步",TableName = "HR_DeptSync")]
|
||||
public partial class HR_DeptSync:BaseEntity
|
||||
{
|
||||
/// <summary>
|
||||
///同步ID
|
||||
/// </summary>
|
||||
[SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
|
||||
[Key]
|
||||
[Display(Name ="同步ID")]
|
||||
[Column(TypeName="int")]
|
||||
[Required(AllowEmptyStrings=false)]
|
||||
public int DeptSyncId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
///YS部门ID
|
||||
/// </summary>
|
||||
[Display(Name ="YS部门ID")]
|
||||
[MaxLength(100)]
|
||||
[Column(TypeName="nvarchar(100)")]
|
||||
public string YSDeptId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
///YS部门名称
|
||||
/// </summary>
|
||||
[Display(Name ="YS部门名称")]
|
||||
[MaxLength(100)]
|
||||
[Column(TypeName="nvarchar(100)")]
|
||||
public string YSDeptName { get; set; }
|
||||
|
||||
/// <summary>
|
||||
///钉钉部门ID
|
||||
/// </summary>
|
||||
[Display(Name ="钉钉部门ID")]
|
||||
[MaxLength(100)]
|
||||
[Column(TypeName="nvarchar(100)")]
|
||||
public string DingTalkDeptId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
///钉钉部门名称
|
||||
/// </summary>
|
||||
[Display(Name ="钉钉部门名称")]
|
||||
[MaxLength(100)]
|
||||
[Column(TypeName="nvarchar(100)")]
|
||||
public string DingTalkDeptName { get; set; }
|
||||
|
||||
|
||||
}
|
||||
}
|
|
@ -0,0 +1,22 @@
|
|||
/*
|
||||
*代码由框架生成,任何更改都可能导致被代码生成器覆盖
|
||||
*如果数据库字段发生变化,请在代码生器重新生成此Model
|
||||
*/
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.ComponentModel.DataAnnotations.Schema;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using SqlSugar;
|
||||
using VOL.Entity.SystemModels;
|
||||
|
||||
namespace VOL.Entity.DomainModels
|
||||
{
|
||||
|
||||
public partial class HR_DeptSync
|
||||
{
|
||||
//此处配置字段(字段配置见此model的另一个partial),如果表中没有此字段请加上 [NotMapped]属性,否则会异常
|
||||
}
|
||||
}
|
|
@ -15,6 +15,7 @@ using VOL.Entity.SystemModels;
|
|||
namespace VOL.Entity.DomainModels
|
||||
{
|
||||
[Entity(TableCnName = "员工信息同步",TableName = "HR_EmployeeSync")]
|
||||
[SugarTable("HR_EmployeeSync")]
|
||||
public partial class HR_EmployeeSync:BaseEntity
|
||||
{
|
||||
/// <summary>
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
*代码由框架生成,任何更改都可能导致被代码生成器覆盖
|
||||
*Repository提供数据库操作,如果要增加数据库操作请在当前目录下Partial文件夹IMES_ProcessRepository编写接口
|
||||
*Repository提供数据库操作,如果要增加数据库操作请在当前目录下Partial文件夹IHR_DeptShipRepository编写接口
|
||||
*/
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
@ -10,9 +10,9 @@ using System.Threading.Tasks;
|
|||
using VOL.Core.BaseProvider;
|
||||
using VOL.Entity.DomainModels;
|
||||
using VOL.Core.Extensions.AutofacManager;
|
||||
namespace VOL.MES.IRepositories
|
||||
namespace VOL.HR.IRepositories
|
||||
{
|
||||
public partial interface IMES_ProcessRepository : IDependency,IRepository<MES_Process>
|
||||
public partial interface IHR_DeptShipRepository : IDependency,IRepository<HR_DeptShip>
|
||||
{
|
||||
}
|
||||
}
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
*代码由框架生成,任何更改都可能导致被代码生成器覆盖
|
||||
*Repository提供数据库操作,如果要增加数据库操作请在当前目录下Partial文件夹ITestServiceRepository编写接口
|
||||
*Repository提供数据库操作,如果要增加数据库操作请在当前目录下Partial文件夹IHR_DeptSyncRepository编写接口
|
||||
*/
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
@ -10,9 +10,9 @@ using System.Threading.Tasks;
|
|||
using VOL.Core.BaseProvider;
|
||||
using VOL.Entity.DomainModels;
|
||||
using VOL.Core.Extensions.AutofacManager;
|
||||
namespace VOL.MES.IRepositories
|
||||
namespace VOL.HR.IRepositories
|
||||
{
|
||||
public partial interface ITestServiceRepository : IDependency,IRepository<TestService>
|
||||
public partial interface IHR_DeptSyncRepository : IDependency,IRepository<HR_DeptSync>
|
||||
{
|
||||
}
|
||||
}
|
|
@ -4,9 +4,9 @@
|
|||
using VOL.Core.BaseProvider;
|
||||
using VOL.Entity.DomainModels;
|
||||
|
||||
namespace VOL.MES.IServices
|
||||
namespace VOL.HR.IServices
|
||||
{
|
||||
public partial interface IMES_ProcessService : IService<MES_Process>
|
||||
public partial interface IHR_DeptShipService : IService<HR_DeptShip>
|
||||
{
|
||||
}
|
||||
}
|
|
@ -0,0 +1,15 @@
|
|||
/*
|
||||
*所有关于HR_DeptShip类的业务代码接口应在此处编写
|
||||
*/
|
||||
using VOL.Core.BaseProvider;
|
||||
using VOL.Entity.DomainModels;
|
||||
using VOL.Core.Utilities;
|
||||
using System.Linq.Expressions;
|
||||
using VOL.YSErp.Models.Biz;
|
||||
namespace VOL.HR.IServices
|
||||
{
|
||||
public partial interface IHR_DeptShipService
|
||||
{
|
||||
Task<List<YSERPDepartment>> GetYSERPDepartments();
|
||||
}
|
||||
}
|
|
@ -4,9 +4,9 @@
|
|||
using VOL.Core.BaseProvider;
|
||||
using VOL.Entity.DomainModels;
|
||||
|
||||
namespace VOL.MES.IServices
|
||||
namespace VOL.HR.IServices
|
||||
{
|
||||
public partial interface ITestServiceService : IService<TestService>
|
||||
public partial interface IHR_DeptSyncService : IService<HR_DeptSync>
|
||||
{
|
||||
}
|
||||
}
|
|
@ -1,13 +1,13 @@
|
|||
/*
|
||||
*所有关于MES_Process类的业务代码接口应在此处编写
|
||||
*所有关于HR_DeptSync类的业务代码接口应在此处编写
|
||||
*/
|
||||
using VOL.Core.BaseProvider;
|
||||
using VOL.Entity.DomainModels;
|
||||
using VOL.Core.Utilities;
|
||||
using System.Linq.Expressions;
|
||||
namespace VOL.MES.IServices
|
||||
namespace VOL.HR.IServices
|
||||
{
|
||||
public partial interface IMES_ProcessService
|
||||
public partial interface IHR_DeptSyncService
|
||||
{
|
||||
}
|
||||
}
|
|
@ -5,9 +5,18 @@ using VOL.Core.BaseProvider;
|
|||
using VOL.Entity.DomainModels;
|
||||
using VOL.Core.Utilities;
|
||||
using System.Linq.Expressions;
|
||||
using VOL.YSErp.Models.Biz;
|
||||
using VOL.DingTalk.Models.Biz;
|
||||
namespace VOL.HR.IServices
|
||||
{
|
||||
public partial interface IHR_EmployeeSyncService
|
||||
{
|
||||
Task<List<YSERPEmployee>> GetAllYSEmployees();
|
||||
|
||||
|
||||
Task<List<DingTalkEmployee>> GetAllDingTalkEmployees();
|
||||
|
||||
|
||||
Task GenEmpSystemShip();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,26 @@
|
|||
/*
|
||||
*代码由框架生成,任何更改都可能导致被代码生成器覆盖
|
||||
*Repository提供数据库操作,如果要增加数据库操作请在当前目录下Partial文件夹HR_DeptShipRepository编写代码
|
||||
*/
|
||||
using VOL.HR.IRepositories;
|
||||
using VOL.Core.BaseProvider;
|
||||
using VOL.Core.DbContext;
|
||||
using VOL.Core.Extensions.AutofacManager;
|
||||
using VOL.Entity.DomainModels;
|
||||
|
||||
namespace VOL.HR.Repositories
|
||||
{
|
||||
public partial class HR_DeptShipRepository : RepositoryBase<HR_DeptShip>
|
||||
, IHR_DeptShipRepository
|
||||
{
|
||||
public HR_DeptShipRepository(VOLContext dbContext)
|
||||
: base(dbContext)
|
||||
{
|
||||
|
||||
}
|
||||
public static IHR_DeptShipRepository Instance
|
||||
{
|
||||
get { return AutofacContainerModule.GetService<IHR_DeptShipRepository>
|
||||
(); } }
|
||||
}
|
||||
}
|
|
@ -0,0 +1,26 @@
|
|||
/*
|
||||
*代码由框架生成,任何更改都可能导致被代码生成器覆盖
|
||||
*Repository提供数据库操作,如果要增加数据库操作请在当前目录下Partial文件夹HR_DeptSyncRepository编写代码
|
||||
*/
|
||||
using VOL.HR.IRepositories;
|
||||
using VOL.Core.BaseProvider;
|
||||
using VOL.Core.DbContext;
|
||||
using VOL.Core.Extensions.AutofacManager;
|
||||
using VOL.Entity.DomainModels;
|
||||
|
||||
namespace VOL.HR.Repositories
|
||||
{
|
||||
public partial class HR_DeptSyncRepository : RepositoryBase<HR_DeptSync>
|
||||
, IHR_DeptSyncRepository
|
||||
{
|
||||
public HR_DeptSyncRepository(VOLContext dbContext)
|
||||
: base(dbContext)
|
||||
{
|
||||
|
||||
}
|
||||
public static IHR_DeptSyncRepository Instance
|
||||
{
|
||||
get { return AutofacContainerModule.GetService<IHR_DeptSyncRepository>
|
||||
(); } }
|
||||
}
|
||||
}
|
|
@ -0,0 +1,22 @@
|
|||
/*
|
||||
*Author:jxx
|
||||
*Contact:283591387@qq.com
|
||||
*代码由框架生成,此处任何更改都可能导致被代码生成器覆盖
|
||||
*所有业务编写全部应在Partial文件夹下HR_DeptShipService与IHR_DeptShipService中编写
|
||||
*/
|
||||
using VOL.HR.IRepositories;
|
||||
using VOL.HR.IServices;
|
||||
using VOL.Core.BaseProvider;
|
||||
using VOL.Core.Extensions.AutofacManager;
|
||||
using VOL.Entity.DomainModels;
|
||||
|
||||
namespace VOL.HR.Services
|
||||
{
|
||||
public partial class HR_DeptShipService : ServiceBase<HR_DeptShip, IHR_DeptShipRepository>
|
||||
, IHR_DeptShipService, IDependency
|
||||
{
|
||||
public static IHR_DeptShipService Instance
|
||||
{
|
||||
get { return AutofacContainerModule.GetService<IHR_DeptShipService>(); } }
|
||||
}
|
||||
}
|
|
@ -0,0 +1,67 @@
|
|||
/*
|
||||
*所有关于HR_DeptShip类的业务代码应在此处编写
|
||||
*可使用repository.调用常用方法,获取EF/Dapper等信息
|
||||
*如果需要事务请使用repository.DbContextBeginTransaction
|
||||
*也可使用DBServerProvider.手动获取数据库相关信息
|
||||
*用户信息、权限、角色等使用UserContext.Current操作
|
||||
*HR_DeptShipService对增、删、改查、导入、导出、审核业务代码扩展参照ServiceFunFilter
|
||||
*/
|
||||
using Microsoft.AspNetCore.Http;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using Newtonsoft.Json;
|
||||
using VOL.DingTalk.Models.Biz;
|
||||
using VOL.DingTalk.Services.Biz;
|
||||
using VOL.HR.IRepositories;
|
||||
using VOL.YSErp.Models.Biz;
|
||||
using VOL.YSErp.Services.Biz;
|
||||
|
||||
namespace VOL.HR.Services
|
||||
{
|
||||
public partial class HR_DeptShipService
|
||||
{
|
||||
private readonly IHttpContextAccessor _httpContextAccessor;
|
||||
private readonly IHR_DeptShipRepository _repository;//访问数据库
|
||||
|
||||
private readonly DingTalkService _dingTalkService;
|
||||
private readonly YSERPService _ysService;
|
||||
[ActivatorUtilitiesConstructor]
|
||||
private readonly Core.CacheManager.ICacheService _cacheService;
|
||||
|
||||
[ActivatorUtilitiesConstructor]
|
||||
public HR_DeptShipService(
|
||||
IHR_DeptShipRepository dbRepository,
|
||||
IHttpContextAccessor httpContextAccessor,
|
||||
Core.CacheManager.ICacheService cacheService
|
||||
)
|
||||
: base(dbRepository)
|
||||
{
|
||||
_httpContextAccessor = httpContextAccessor;
|
||||
_repository = dbRepository;
|
||||
//多租户会用到这init代码,其他情况可以不用
|
||||
//base.Init(dbRepository);
|
||||
_cacheService = cacheService;
|
||||
|
||||
_dingTalkService = new DingTalkService(new DingTalk.Models.SystemToken(), new DingTalk.Models.DingTalkConfig());
|
||||
_ysService = new YSERPService(new YSErp.Models.SystemToken(), new YSErp.Models.YSConfig());
|
||||
}
|
||||
|
||||
|
||||
public Task<List<YSERPDepartment>> GetYSERPDepartments()
|
||||
{
|
||||
|
||||
if (_cacheService.Exists("YS_DEPT_CACHE"))
|
||||
{
|
||||
return Task.FromResult(_cacheService.Get<List<YSERPDepartment>>("YS_DEPT_CACHE"));
|
||||
}
|
||||
else
|
||||
{
|
||||
var depts = _ysService.GetAllDepartmentsAsync();
|
||||
if (depts != null)
|
||||
{
|
||||
_cacheService.Add("YS_DEPT_CACHE", JsonConvert.SerializeObject(depts.Result), 600);
|
||||
}
|
||||
return depts;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,22 @@
|
|||
/*
|
||||
*Author:jxx
|
||||
*Contact:283591387@qq.com
|
||||
*代码由框架生成,此处任何更改都可能导致被代码生成器覆盖
|
||||
*所有业务编写全部应在Partial文件夹下HR_DeptSyncService与IHR_DeptSyncService中编写
|
||||
*/
|
||||
using VOL.HR.IRepositories;
|
||||
using VOL.HR.IServices;
|
||||
using VOL.Core.BaseProvider;
|
||||
using VOL.Core.Extensions.AutofacManager;
|
||||
using VOL.Entity.DomainModels;
|
||||
|
||||
namespace VOL.HR.Services
|
||||
{
|
||||
public partial class HR_DeptSyncService : ServiceBase<HR_DeptSync, IHR_DeptSyncRepository>
|
||||
, IHR_DeptSyncService, IDependency
|
||||
{
|
||||
public static IHR_DeptSyncService Instance
|
||||
{
|
||||
get { return AutofacContainerModule.GetService<IHR_DeptSyncService>(); } }
|
||||
}
|
||||
}
|
|
@ -1,10 +1,10 @@
|
|||
/*
|
||||
*所有关于TestService类的业务代码应在此处编写
|
||||
*所有关于HR_DeptSync类的业务代码应在此处编写
|
||||
*可使用repository.调用常用方法,获取EF/Dapper等信息
|
||||
*如果需要事务请使用repository.DbContextBeginTransaction
|
||||
*也可使用DBServerProvider.手动获取数据库相关信息
|
||||
*用户信息、权限、角色等使用UserContext.Current操作
|
||||
*TestServiceService对增、删、改查、导入、导出、审核业务代码扩展参照ServiceFunFilter
|
||||
*HR_DeptSyncService对增、删、改查、导入、导出、审核业务代码扩展参照ServiceFunFilter
|
||||
*/
|
||||
using VOL.Core.BaseProvider;
|
||||
using VOL.Core.Extensions.AutofacManager;
|
||||
|
@ -16,18 +16,18 @@ using VOL.Core.Extensions;
|
|||
using Microsoft.EntityFrameworkCore;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using Microsoft.AspNetCore.Http;
|
||||
using VOL.MES.IRepositories;
|
||||
using VOL.HR.IRepositories;
|
||||
|
||||
namespace VOL.MES.Services
|
||||
namespace VOL.HR.Services
|
||||
{
|
||||
public partial class TestServiceService
|
||||
public partial class HR_DeptSyncService
|
||||
{
|
||||
private readonly IHttpContextAccessor _httpContextAccessor;
|
||||
private readonly ITestServiceRepository _repository;//访问数据库
|
||||
private readonly IHR_DeptSyncRepository _repository;//访问数据库
|
||||
|
||||
[ActivatorUtilitiesConstructor]
|
||||
public TestServiceService(
|
||||
ITestServiceRepository dbRepository,
|
||||
public HR_DeptSyncService(
|
||||
IHR_DeptSyncRepository dbRepository,
|
||||
IHttpContextAccessor httpContextAccessor
|
||||
)
|
||||
: base(dbRepository)
|
|
@ -18,5 +18,7 @@ namespace VOL.HR.Services
|
|||
public static IHR_EmployeeSyncService Instance
|
||||
{
|
||||
get { return AutofacContainerModule.GetService<IHR_EmployeeSyncService>(); } }
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -6,17 +6,29 @@
|
|||
*用户信息、权限、角色等使用UserContext.Current操作
|
||||
*HR_EmployeeSyncService对增、删、改查、导入、导出、审核业务代码扩展参照ServiceFunFilter
|
||||
*/
|
||||
using VOL.Core.BaseProvider;
|
||||
using VOL.Core.Extensions.AutofacManager;
|
||||
using VOL.Entity.DomainModels;
|
||||
using System.Linq;
|
||||
using VOL.Core.Utilities;
|
||||
using System.Linq.Expressions;
|
||||
using VOL.Core.Extensions;
|
||||
using Microsoft.AspNetCore.Http;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using Microsoft.AspNetCore.Http;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Newtonsoft.Json;
|
||||
using System.Collections.Generic;
|
||||
using System.Globalization;
|
||||
using System.Linq;
|
||||
using System.Linq.Expressions;
|
||||
using System.Net.Http.Headers;
|
||||
using System.Text;
|
||||
using VOL.Core.BaseProvider;
|
||||
using VOL.Core.CacheManager;
|
||||
using VOL.Core.DBManager;
|
||||
using VOL.Core.Extensions;
|
||||
using VOL.Core.Extensions.AutofacManager;
|
||||
using VOL.Core.Utilities;
|
||||
using VOL.DingTalk.Models.Biz;
|
||||
using VOL.DingTalk.Services.Biz;
|
||||
using VOL.Entity.DomainModels;
|
||||
using VOL.HR.IRepositories;
|
||||
using VOL.YSErp.Models.Biz;
|
||||
using VOL.YSErp.Services.Biz;
|
||||
|
||||
namespace VOL.HR.Services
|
||||
{
|
||||
|
@ -24,11 +36,16 @@ namespace VOL.HR.Services
|
|||
{
|
||||
private readonly IHttpContextAccessor _httpContextAccessor;
|
||||
private readonly IHR_EmployeeSyncRepository _repository;//访问数据库
|
||||
private readonly DingTalkService _dingTalkService;
|
||||
private readonly YSERPService _ysService;
|
||||
|
||||
[ActivatorUtilitiesConstructor]
|
||||
private ICacheService _cacheService;
|
||||
[ActivatorUtilitiesConstructor]
|
||||
public HR_EmployeeSyncService(
|
||||
IHR_EmployeeSyncRepository dbRepository,
|
||||
IHttpContextAccessor httpContextAccessor
|
||||
IHttpContextAccessor httpContextAccessor,
|
||||
ICacheService cacheService
|
||||
)
|
||||
: base(dbRepository)
|
||||
{
|
||||
|
@ -36,6 +53,98 @@ namespace VOL.HR.Services
|
|||
_repository = dbRepository;
|
||||
//多租户会用到这init代码,其他情况可以不用
|
||||
//base.Init(dbRepository);
|
||||
|
||||
_cacheService = cacheService;
|
||||
|
||||
_dingTalkService = new DingTalkService(new DingTalk.Models.SystemToken(),new DingTalk.Models.DingTalkConfig());
|
||||
_ysService = new YSERPService(new YSErp.Models.SystemToken(), new YSErp.Models.YSConfig());
|
||||
}
|
||||
public Task<List<YSERPEmployee>> GetAllYSEmployees()
|
||||
{
|
||||
if (_cacheService.Exists("YS_EMP_CACHE"))
|
||||
{
|
||||
return Task.FromResult(_cacheService.Get<List<YSERPEmployee>>("YS_EMP_CACHE"));
|
||||
}
|
||||
else
|
||||
{
|
||||
var emps = _ysService.GetAllEmployeesAsync();
|
||||
if(emps != null)
|
||||
{
|
||||
_cacheService.Add("YS_EMP_CACHE", JsonConvert.SerializeObject(emps.Result), 600);
|
||||
}
|
||||
return emps;
|
||||
}
|
||||
}
|
||||
public Task<List<DingTalkEmployee>> GetAllDingTalkEmployees()
|
||||
{
|
||||
if (_cacheService.Exists("DingTalk_EMP_CACHE"))
|
||||
{
|
||||
return Task.FromResult(_cacheService.Get<List<DingTalkEmployee>>("DingTalk_EMP_CACHE"));
|
||||
}
|
||||
else
|
||||
{
|
||||
var emps = _dingTalkService.GetAllEmployeesAsync();
|
||||
if(emps != null)
|
||||
{
|
||||
_cacheService.Add("DingTalk_EMP_CACHE", JsonConvert.SerializeObject(emps.Result), 600);
|
||||
}
|
||||
return emps;
|
||||
}
|
||||
}
|
||||
|
||||
public Task GenEmpSystemShip()
|
||||
{
|
||||
List<DingTalkEmployee> dingTalkEmployees = [];
|
||||
List<YSERPEmployee> ysERPEmployees = [];
|
||||
|
||||
var ysTask = GetAllYSEmployees().ContinueWith(x =>
|
||||
{
|
||||
ysERPEmployees = x.Result;
|
||||
});
|
||||
var dingTalkTask = GetAllDingTalkEmployees().ContinueWith(x =>
|
||||
{
|
||||
dingTalkEmployees = x.Result;
|
||||
});
|
||||
Task.WaitAll(ysTask, dingTalkTask);
|
||||
if (ysERPEmployees.Count != 0)
|
||||
{
|
||||
var newList = new List<HR_EmployeeSync>();
|
||||
ysERPEmployees.ForEach(emp =>
|
||||
{
|
||||
var dingTalkInfo = dingTalkEmployees?.FirstOrDefault(e => e.Mobile == emp.mobile);
|
||||
if (dingTalkInfo != null)
|
||||
{
|
||||
//_repository.AddRange()
|
||||
newList.Add(new HR_EmployeeSync
|
||||
{
|
||||
EmpYSID = emp.id,
|
||||
EmpYSMobile = emp.mobile,
|
||||
EmpYSDeptID = emp.dept_id,
|
||||
EmpJobNumber = emp.code,
|
||||
|
||||
EmpDingDingID = dingTalkInfo.UserId,
|
||||
EmpDingDingMobile = dingTalkInfo.Mobile,
|
||||
EmpLastSyncInfo = "Init generate for system.",
|
||||
});
|
||||
}
|
||||
});
|
||||
//_repository.AddRange(newList)
|
||||
var db = DBServerProvider.SqlSugarClient;
|
||||
try
|
||||
{
|
||||
db.BeginTran();
|
||||
// 清空重新生成
|
||||
db.Deleteable<HR_EmployeeSync>();
|
||||
db.Fastest<HR_EmployeeSync>().BulkCopy(newList);
|
||||
db.CommitTran();
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
db.RollbackTran();
|
||||
}
|
||||
}
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -8,11 +8,13 @@
|
|||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\VOL.Core\VOL.Core.csproj" />
|
||||
<ProjectReference Include="..\VOL.DingTalk\VOL.DingTalk.csproj" />
|
||||
<ProjectReference Include="..\VOL.Entity\VOL.Entity.csproj" />
|
||||
<ProjectReference Include="..\VOL.YSErp\VOL.YSErp.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Folder Include="Services\YSERP\" />
|
||||
<Folder Include="IRepositories\EmployeeSync\Partial\" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
|
|
|
@ -1,18 +0,0 @@
|
|||
/*
|
||||
*代码由框架生成,任何更改都可能导致被代码生成器覆盖
|
||||
*Repository提供数据库操作,如果要增加数据库操作请在当前目录下Partial文件夹IMES_Bom_DetailRepository编写接口
|
||||
*/
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using VOL.Core.BaseProvider;
|
||||
using VOL.Entity.DomainModels;
|
||||
using VOL.Core.Extensions.AutofacManager;
|
||||
namespace VOL.MES.IRepositories
|
||||
{
|
||||
public partial interface IMES_Bom_DetailRepository : IDependency,IRepository<MES_Bom_Detail>
|
||||
{
|
||||
}
|
||||
}
|
|
@ -1,18 +0,0 @@
|
|||
/*
|
||||
*代码由框架生成,任何更改都可能导致被代码生成器覆盖
|
||||
*Repository提供数据库操作,如果要增加数据库操作请在当前目录下Partial文件夹IMES_Bom_MainRepository编写接口
|
||||
*/
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using VOL.Core.BaseProvider;
|
||||
using VOL.Entity.DomainModels;
|
||||
using VOL.Core.Extensions.AutofacManager;
|
||||
namespace VOL.MES.IRepositories
|
||||
{
|
||||
public partial interface IMES_Bom_MainRepository : IDependency,IRepository<MES_Bom_Main>
|
||||
{
|
||||
}
|
||||
}
|
|
@ -1,18 +0,0 @@
|
|||
/*
|
||||
*代码由框架生成,任何更改都可能导致被代码生成器覆盖
|
||||
*Repository提供数据库操作,如果要增加数据库操作请在当前目录下Partial文件夹IMES_CustomerRepository编写接口
|
||||
*/
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using VOL.Core.BaseProvider;
|
||||
using VOL.Entity.DomainModels;
|
||||
using VOL.Core.Extensions.AutofacManager;
|
||||
namespace VOL.MES.IRepositories
|
||||
{
|
||||
public partial interface IMES_CustomerRepository : IDependency,IRepository<MES_Customer>
|
||||
{
|
||||
}
|
||||
}
|
|
@ -1,18 +0,0 @@
|
|||
/*
|
||||
*代码由框架生成,任何更改都可能导致被代码生成器覆盖
|
||||
*Repository提供数据库操作,如果要增加数据库操作请在当前目录下Partial文件夹IMES_DefectiveProductDisposalRecordRepository编写接口
|
||||
*/
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using VOL.Core.BaseProvider;
|
||||
using VOL.Entity.DomainModels;
|
||||
using VOL.Core.Extensions.AutofacManager;
|
||||
namespace VOL.MES.IRepositories
|
||||
{
|
||||
public partial interface IMES_DefectiveProductDisposalRecordRepository : IDependency,IRepository<MES_DefectiveProductDisposalRecord>
|
||||
{
|
||||
}
|
||||
}
|
|
@ -1,18 +0,0 @@
|
|||
/*
|
||||
*代码由框架生成,任何更改都可能导致被代码生成器覆盖
|
||||
*Repository提供数据库操作,如果要增加数据库操作请在当前目录下Partial文件夹IMES_DefectiveProductRecordRepository编写接口
|
||||
*/
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using VOL.Core.BaseProvider;
|
||||
using VOL.Entity.DomainModels;
|
||||
using VOL.Core.Extensions.AutofacManager;
|
||||
namespace VOL.MES.IRepositories
|
||||
{
|
||||
public partial interface IMES_DefectiveProductRecordRepository : IDependency,IRepository<MES_DefectiveProductRecord>
|
||||
{
|
||||
}
|
||||
}
|
|
@ -1,18 +0,0 @@
|
|||
/*
|
||||
*代码由框架生成,任何更改都可能导致被代码生成器覆盖
|
||||
*Repository提供数据库操作,如果要增加数据库操作请在当前目录下Partial文件夹IMES_EquipmentFaultRecordRepository编写接口
|
||||
*/
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using VOL.Core.BaseProvider;
|
||||
using VOL.Entity.DomainModels;
|
||||
using VOL.Core.Extensions.AutofacManager;
|
||||
namespace VOL.MES.IRepositories
|
||||
{
|
||||
public partial interface IMES_EquipmentFaultRecordRepository : IDependency,IRepository<MES_EquipmentFaultRecord>
|
||||
{
|
||||
}
|
||||
}
|
|
@ -1,18 +0,0 @@
|
|||
/*
|
||||
*代码由框架生成,任何更改都可能导致被代码生成器覆盖
|
||||
*Repository提供数据库操作,如果要增加数据库操作请在当前目录下Partial文件夹IMES_EquipmentMaintenanceRepository编写接口
|
||||
*/
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using VOL.Core.BaseProvider;
|
||||
using VOL.Entity.DomainModels;
|
||||
using VOL.Core.Extensions.AutofacManager;
|
||||
namespace VOL.MES.IRepositories
|
||||
{
|
||||
public partial interface IMES_EquipmentMaintenanceRepository : IDependency,IRepository<MES_EquipmentMaintenance>
|
||||
{
|
||||
}
|
||||
}
|
|
@ -1,18 +0,0 @@
|
|||
/*
|
||||
*代码由框架生成,任何更改都可能导致被代码生成器覆盖
|
||||
*Repository提供数据库操作,如果要增加数据库操作请在当前目录下Partial文件夹IMES_EquipmentManagementRepository编写接口
|
||||
*/
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using VOL.Core.BaseProvider;
|
||||
using VOL.Entity.DomainModels;
|
||||
using VOL.Core.Extensions.AutofacManager;
|
||||
namespace VOL.MES.IRepositories
|
||||
{
|
||||
public partial interface IMES_EquipmentManagementRepository : IDependency,IRepository<MES_EquipmentManagement>
|
||||
{
|
||||
}
|
||||
}
|
|
@ -1,18 +0,0 @@
|
|||
/*
|
||||
*代码由框架生成,任何更改都可能导致被代码生成器覆盖
|
||||
*Repository提供数据库操作,如果要增加数据库操作请在当前目录下Partial文件夹IMES_EquipmentRepairRepository编写接口
|
||||
*/
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using VOL.Core.BaseProvider;
|
||||
using VOL.Entity.DomainModels;
|
||||
using VOL.Core.Extensions.AutofacManager;
|
||||
namespace VOL.MES.IRepositories
|
||||
{
|
||||
public partial interface IMES_EquipmentRepairRepository : IDependency,IRepository<MES_EquipmentRepair>
|
||||
{
|
||||
}
|
||||
}
|
|
@ -1,18 +0,0 @@
|
|||
/*
|
||||
*代码由框架生成,任何更改都可能导致被代码生成器覆盖
|
||||
*Repository提供数据库操作,如果要增加数据库操作请在当前目录下Partial文件夹IMES_InventoryManagementRepository编写接口
|
||||
*/
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using VOL.Core.BaseProvider;
|
||||
using VOL.Entity.DomainModels;
|
||||
using VOL.Core.Extensions.AutofacManager;
|
||||
namespace VOL.MES.IRepositories
|
||||
{
|
||||
public partial interface IMES_InventoryManagementRepository : IDependency,IRepository<MES_InventoryManagement>
|
||||
{
|
||||
}
|
||||
}
|
|
@ -1,18 +0,0 @@
|
|||
/*
|
||||
*代码由框架生成,任何更改都可能导致被代码生成器覆盖
|
||||
*Repository提供数据库操作,如果要增加数据库操作请在当前目录下Partial文件夹IMES_LocationManagementRepository编写接口
|
||||
*/
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using VOL.Core.BaseProvider;
|
||||
using VOL.Entity.DomainModels;
|
||||
using VOL.Core.Extensions.AutofacManager;
|
||||
namespace VOL.MES.IRepositories
|
||||
{
|
||||
public partial interface IMES_LocationManagementRepository : IDependency,IRepository<MES_LocationManagement>
|
||||
{
|
||||
}
|
||||
}
|
|
@ -1,18 +0,0 @@
|
|||
/*
|
||||
*代码由框架生成,任何更改都可能导致被代码生成器覆盖
|
||||
*Repository提供数据库操作,如果要增加数据库操作请在当前目录下Partial文件夹IMES_MaterialCatalogRepository编写接口
|
||||
*/
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using VOL.Core.BaseProvider;
|
||||
using VOL.Entity.DomainModels;
|
||||
using VOL.Core.Extensions.AutofacManager;
|
||||
namespace VOL.MES.IRepositories
|
||||
{
|
||||
public partial interface IMES_MaterialCatalogRepository : IDependency,IRepository<MES_MaterialCatalog>
|
||||
{
|
||||
}
|
||||
}
|
|
@ -1,18 +0,0 @@
|
|||
/*
|
||||
*代码由框架生成,任何更改都可能导致被代码生成器覆盖
|
||||
*Repository提供数据库操作,如果要增加数据库操作请在当前目录下Partial文件夹IMES_MaterialRepository编写接口
|
||||
*/
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using VOL.Core.BaseProvider;
|
||||
using VOL.Entity.DomainModels;
|
||||
using VOL.Core.Extensions.AutofacManager;
|
||||
namespace VOL.MES.IRepositories
|
||||
{
|
||||
public partial interface IMES_MaterialRepository : IDependency,IRepository<MES_Material>
|
||||
{
|
||||
}
|
||||
}
|
|
@ -1,18 +0,0 @@
|
|||
/*
|
||||
*代码由框架生成,任何更改都可能导致被代码生成器覆盖
|
||||
*Repository提供数据库操作,如果要增加数据库操作请在当前目录下Partial文件夹IMES_ProcessReportRepository编写接口
|
||||
*/
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using VOL.Core.BaseProvider;
|
||||
using VOL.Entity.DomainModels;
|
||||
using VOL.Core.Extensions.AutofacManager;
|
||||
namespace VOL.MES.IRepositories
|
||||
{
|
||||
public partial interface IMES_ProcessReportRepository : IDependency,IRepository<MES_ProcessReport>
|
||||
{
|
||||
}
|
||||
}
|
|
@ -1,18 +0,0 @@
|
|||
/*
|
||||
*代码由框架生成,任何更改都可能导致被代码生成器覆盖
|
||||
*Repository提供数据库操作,如果要增加数据库操作请在当前目录下Partial文件夹IMES_ProcessRouteRepository编写接口
|
||||
*/
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using VOL.Core.BaseProvider;
|
||||
using VOL.Entity.DomainModels;
|
||||
using VOL.Core.Extensions.AutofacManager;
|
||||
namespace VOL.MES.IRepositories
|
||||
{
|
||||
public partial interface IMES_ProcessRouteRepository : IDependency,IRepository<MES_ProcessRoute>
|
||||
{
|
||||
}
|
||||
}
|
|
@ -1,18 +0,0 @@
|
|||
/*
|
||||
*代码由框架生成,任何更改都可能导致被代码生成器覆盖
|
||||
*Repository提供数据库操作,如果要增加数据库操作请在当前目录下Partial文件夹IMES_ProductInboundRepository编写接口
|
||||
*/
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using VOL.Core.BaseProvider;
|
||||
using VOL.Entity.DomainModels;
|
||||
using VOL.Core.Extensions.AutofacManager;
|
||||
namespace VOL.MES.IRepositories
|
||||
{
|
||||
public partial interface IMES_ProductInboundRepository : IDependency,IRepository<MES_ProductInbound>
|
||||
{
|
||||
}
|
||||
}
|
|
@ -1,18 +0,0 @@
|
|||
/*
|
||||
*代码由框架生成,任何更改都可能导致被代码生成器覆盖
|
||||
*Repository提供数据库操作,如果要增加数据库操作请在当前目录下Partial文件夹IMES_ProductOutboundRepository编写接口
|
||||
*/
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using VOL.Core.BaseProvider;
|
||||
using VOL.Entity.DomainModels;
|
||||
using VOL.Core.Extensions.AutofacManager;
|
||||
namespace VOL.MES.IRepositories
|
||||
{
|
||||
public partial interface IMES_ProductOutboundRepository : IDependency,IRepository<MES_ProductOutbound>
|
||||
{
|
||||
}
|
||||
}
|
|
@ -1,18 +0,0 @@
|
|||
/*
|
||||
*代码由框架生成,任何更改都可能导致被代码生成器覆盖
|
||||
*Repository提供数据库操作,如果要增加数据库操作请在当前目录下Partial文件夹IMES_ProductionLineDeviceRepository编写接口
|
||||
*/
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using VOL.Core.BaseProvider;
|
||||
using VOL.Entity.DomainModels;
|
||||
using VOL.Core.Extensions.AutofacManager;
|
||||
namespace VOL.MES.IRepositories
|
||||
{
|
||||
public partial interface IMES_ProductionLineDeviceRepository : IDependency,IRepository<MES_ProductionLineDevice>
|
||||
{
|
||||
}
|
||||
}
|
|
@ -1,18 +0,0 @@
|
|||
/*
|
||||
*代码由框架生成,任何更改都可能导致被代码生成器覆盖
|
||||
*Repository提供数据库操作,如果要增加数据库操作请在当前目录下Partial文件夹IMES_ProductionLineRepository编写接口
|
||||
*/
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using VOL.Core.BaseProvider;
|
||||
using VOL.Entity.DomainModels;
|
||||
using VOL.Core.Extensions.AutofacManager;
|
||||
namespace VOL.MES.IRepositories
|
||||
{
|
||||
public partial interface IMES_ProductionLineRepository : IDependency,IRepository<MES_ProductionLine>
|
||||
{
|
||||
}
|
||||
}
|
|
@ -1,18 +0,0 @@
|
|||
/*
|
||||
*代码由框架生成,任何更改都可能导致被代码生成器覆盖
|
||||
*Repository提供数据库操作,如果要增加数据库操作请在当前目录下Partial文件夹IMES_ProductionOrderRepository编写接口
|
||||
*/
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using VOL.Core.BaseProvider;
|
||||
using VOL.Entity.DomainModels;
|
||||
using VOL.Core.Extensions.AutofacManager;
|
||||
namespace VOL.MES.IRepositories
|
||||
{
|
||||
public partial interface IMES_ProductionOrderRepository : IDependency,IRepository<MES_ProductionOrder>
|
||||
{
|
||||
}
|
||||
}
|
|
@ -1,18 +0,0 @@
|
|||
/*
|
||||
*代码由框架生成,任何更改都可能导致被代码生成器覆盖
|
||||
*Repository提供数据库操作,如果要增加数据库操作请在当前目录下Partial文件夹IMES_ProductionPlanChangeRecordRepository编写接口
|
||||
*/
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using VOL.Core.BaseProvider;
|
||||
using VOL.Entity.DomainModels;
|
||||
using VOL.Core.Extensions.AutofacManager;
|
||||
namespace VOL.MES.IRepositories
|
||||
{
|
||||
public partial interface IMES_ProductionPlanChangeRecordRepository : IDependency,IRepository<MES_ProductionPlanChangeRecord>
|
||||
{
|
||||
}
|
||||
}
|
|
@ -1,18 +0,0 @@
|
|||
/*
|
||||
*代码由框架生成,任何更改都可能导致被代码生成器覆盖
|
||||
*Repository提供数据库操作,如果要增加数据库操作请在当前目录下Partial文件夹IMES_ProductionPlanDetailRepository编写接口
|
||||
*/
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using VOL.Core.BaseProvider;
|
||||
using VOL.Entity.DomainModels;
|
||||
using VOL.Core.Extensions.AutofacManager;
|
||||
namespace VOL.MES.IRepositories
|
||||
{
|
||||
public partial interface IMES_ProductionPlanDetailRepository : IDependency,IRepository<MES_ProductionPlanDetail>
|
||||
{
|
||||
}
|
||||
}
|
|
@ -1,18 +0,0 @@
|
|||
/*
|
||||
*代码由框架生成,任何更改都可能导致被代码生成器覆盖
|
||||
*Repository提供数据库操作,如果要增加数据库操作请在当前目录下Partial文件夹IMES_ProductionReportingDetailRepository编写接口
|
||||
*/
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using VOL.Core.BaseProvider;
|
||||
using VOL.Entity.DomainModels;
|
||||
using VOL.Core.Extensions.AutofacManager;
|
||||
namespace VOL.MES.IRepositories
|
||||
{
|
||||
public partial interface IMES_ProductionReportingDetailRepository : IDependency,IRepository<MES_ProductionReportingDetail>
|
||||
{
|
||||
}
|
||||
}
|
|
@ -1,18 +0,0 @@
|
|||
/*
|
||||
*代码由框架生成,任何更改都可能导致被代码生成器覆盖
|
||||
*Repository提供数据库操作,如果要增加数据库操作请在当前目录下Partial文件夹IMES_ProductionReportingRepository编写接口
|
||||
*/
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using VOL.Core.BaseProvider;
|
||||
using VOL.Entity.DomainModels;
|
||||
using VOL.Core.Extensions.AutofacManager;
|
||||
namespace VOL.MES.IRepositories
|
||||
{
|
||||
public partial interface IMES_ProductionReportingRepository : IDependency,IRepository<MES_ProductionReporting>
|
||||
{
|
||||
}
|
||||
}
|
|
@ -1,18 +0,0 @@
|
|||
/*
|
||||
*代码由框架生成,任何更改都可能导致被代码生成器覆盖
|
||||
*Repository提供数据库操作,如果要增加数据库操作请在当前目录下Partial文件夹IMES_QualityInspectionPlanDetailRepository编写接口
|
||||
*/
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using VOL.Core.BaseProvider;
|
||||
using VOL.Entity.DomainModels;
|
||||
using VOL.Core.Extensions.AutofacManager;
|
||||
namespace VOL.MES.IRepositories
|
||||
{
|
||||
public partial interface IMES_QualityInspectionPlanDetailRepository : IDependency,IRepository<MES_QualityInspectionPlanDetail>
|
||||
{
|
||||
}
|
||||
}
|
|
@ -1,18 +0,0 @@
|
|||
/*
|
||||
*代码由框架生成,任何更改都可能导致被代码生成器覆盖
|
||||
*Repository提供数据库操作,如果要增加数据库操作请在当前目录下Partial文件夹IMES_QualityInspectionPlanRepository编写接口
|
||||
*/
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using VOL.Core.BaseProvider;
|
||||
using VOL.Entity.DomainModels;
|
||||
using VOL.Core.Extensions.AutofacManager;
|
||||
namespace VOL.MES.IRepositories
|
||||
{
|
||||
public partial interface IMES_QualityInspectionPlanRepository : IDependency,IRepository<MES_QualityInspectionPlan>
|
||||
{
|
||||
}
|
||||
}
|
|
@ -1,18 +0,0 @@
|
|||
/*
|
||||
*代码由框架生成,任何更改都可能导致被代码生成器覆盖
|
||||
*Repository提供数据库操作,如果要增加数据库操作请在当前目录下Partial文件夹IMES_QualityInspectionRecordRepository编写接口
|
||||
*/
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using VOL.Core.BaseProvider;
|
||||
using VOL.Entity.DomainModels;
|
||||
using VOL.Core.Extensions.AutofacManager;
|
||||
namespace VOL.MES.IRepositories
|
||||
{
|
||||
public partial interface IMES_QualityInspectionRecordRepository : IDependency,IRepository<MES_QualityInspectionRecord>
|
||||
{
|
||||
}
|
||||
}
|
|
@ -1,18 +0,0 @@
|
|||
/*
|
||||
*代码由框架生成,任何更改都可能导致被代码生成器覆盖
|
||||
*Repository提供数据库操作,如果要增加数据库操作请在当前目录下Partial文件夹IMES_SchedulingPlanRepository编写接口
|
||||
*/
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using VOL.Core.BaseProvider;
|
||||
using VOL.Entity.DomainModels;
|
||||
using VOL.Core.Extensions.AutofacManager;
|
||||
namespace VOL.MES.IRepositories
|
||||
{
|
||||
public partial interface IMES_SchedulingPlanRepository : IDependency,IRepository<MES_SchedulingPlan>
|
||||
{
|
||||
}
|
||||
}
|
|
@ -1,18 +0,0 @@
|
|||
/*
|
||||
*代码由框架生成,任何更改都可能导致被代码生成器覆盖
|
||||
*Repository提供数据库操作,如果要增加数据库操作请在当前目录下Partial文件夹IMES_SupplierRepository编写接口
|
||||
*/
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using VOL.Core.BaseProvider;
|
||||
using VOL.Entity.DomainModels;
|
||||
using VOL.Core.Extensions.AutofacManager;
|
||||
namespace VOL.MES.IRepositories
|
||||
{
|
||||
public partial interface IMES_SupplierRepository : IDependency,IRepository<MES_Supplier>
|
||||
{
|
||||
}
|
||||
}
|
|
@ -1,18 +0,0 @@
|
|||
/*
|
||||
*代码由框架生成,任何更改都可能导致被代码生成器覆盖
|
||||
*Repository提供数据库操作,如果要增加数据库操作请在当前目录下Partial文件夹IMES_WarehouseManagementRepository编写接口
|
||||
*/
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using VOL.Core.BaseProvider;
|
||||
using VOL.Entity.DomainModels;
|
||||
using VOL.Core.Extensions.AutofacManager;
|
||||
namespace VOL.MES.IRepositories
|
||||
{
|
||||
public partial interface IMES_WarehouseManagementRepository : IDependency,IRepository<MES_WarehouseManagement>
|
||||
{
|
||||
}
|
||||
}
|
|
@ -1,12 +0,0 @@
|
|||
/*
|
||||
*代码由框架生成,任何更改都可能导致被代码生成器覆盖
|
||||
*/
|
||||
using VOL.Core.BaseProvider;
|
||||
using VOL.Entity.DomainModels;
|
||||
|
||||
namespace VOL.MES.IServices
|
||||
{
|
||||
public partial interface IMES_Bom_DetailService : IService<MES_Bom_Detail>
|
||||
{
|
||||
}
|
||||
}
|
|
@ -1,12 +0,0 @@
|
|||
/*
|
||||
*代码由框架生成,任何更改都可能导致被代码生成器覆盖
|
||||
*/
|
||||
using VOL.Core.BaseProvider;
|
||||
using VOL.Entity.DomainModels;
|
||||
|
||||
namespace VOL.MES.IServices
|
||||
{
|
||||
public partial interface IMES_Bom_MainService : IService<MES_Bom_Main>
|
||||
{
|
||||
}
|
||||
}
|
|
@ -1,12 +0,0 @@
|
|||
/*
|
||||
*代码由框架生成,任何更改都可能导致被代码生成器覆盖
|
||||
*/
|
||||
using VOL.Core.BaseProvider;
|
||||
using VOL.Entity.DomainModels;
|
||||
|
||||
namespace VOL.MES.IServices
|
||||
{
|
||||
public partial interface IMES_CustomerService : IService<MES_Customer>
|
||||
{
|
||||
}
|
||||
}
|
|
@ -1,12 +0,0 @@
|
|||
/*
|
||||
*代码由框架生成,任何更改都可能导致被代码生成器覆盖
|
||||
*/
|
||||
using VOL.Core.BaseProvider;
|
||||
using VOL.Entity.DomainModels;
|
||||
|
||||
namespace VOL.MES.IServices
|
||||
{
|
||||
public partial interface IMES_DefectiveProductDisposalRecordService : IService<MES_DefectiveProductDisposalRecord>
|
||||
{
|
||||
}
|
||||
}
|
|
@ -1,12 +0,0 @@
|
|||
/*
|
||||
*代码由框架生成,任何更改都可能导致被代码生成器覆盖
|
||||
*/
|
||||
using VOL.Core.BaseProvider;
|
||||
using VOL.Entity.DomainModels;
|
||||
|
||||
namespace VOL.MES.IServices
|
||||
{
|
||||
public partial interface IMES_DefectiveProductRecordService : IService<MES_DefectiveProductRecord>
|
||||
{
|
||||
}
|
||||
}
|
|
@ -1,12 +0,0 @@
|
|||
/*
|
||||
*代码由框架生成,任何更改都可能导致被代码生成器覆盖
|
||||
*/
|
||||
using VOL.Core.BaseProvider;
|
||||
using VOL.Entity.DomainModels;
|
||||
|
||||
namespace VOL.MES.IServices
|
||||
{
|
||||
public partial interface IMES_EquipmentFaultRecordService : IService<MES_EquipmentFaultRecord>
|
||||
{
|
||||
}
|
||||
}
|
|
@ -1,12 +0,0 @@
|
|||
/*
|
||||
*代码由框架生成,任何更改都可能导致被代码生成器覆盖
|
||||
*/
|
||||
using VOL.Core.BaseProvider;
|
||||
using VOL.Entity.DomainModels;
|
||||
|
||||
namespace VOL.MES.IServices
|
||||
{
|
||||
public partial interface IMES_EquipmentMaintenanceService : IService<MES_EquipmentMaintenance>
|
||||
{
|
||||
}
|
||||
}
|
|
@ -1,12 +0,0 @@
|
|||
/*
|
||||
*代码由框架生成,任何更改都可能导致被代码生成器覆盖
|
||||
*/
|
||||
using VOL.Core.BaseProvider;
|
||||
using VOL.Entity.DomainModels;
|
||||
|
||||
namespace VOL.MES.IServices
|
||||
{
|
||||
public partial interface IMES_EquipmentManagementService : IService<MES_EquipmentManagement>
|
||||
{
|
||||
}
|
||||
}
|
|
@ -1,12 +0,0 @@
|
|||
/*
|
||||
*代码由框架生成,任何更改都可能导致被代码生成器覆盖
|
||||
*/
|
||||
using VOL.Core.BaseProvider;
|
||||
using VOL.Entity.DomainModels;
|
||||
|
||||
namespace VOL.MES.IServices
|
||||
{
|
||||
public partial interface IMES_EquipmentRepairService : IService<MES_EquipmentRepair>
|
||||
{
|
||||
}
|
||||
}
|
|
@ -1,12 +0,0 @@
|
|||
/*
|
||||
*代码由框架生成,任何更改都可能导致被代码生成器覆盖
|
||||
*/
|
||||
using VOL.Core.BaseProvider;
|
||||
using VOL.Entity.DomainModels;
|
||||
|
||||
namespace VOL.MES.IServices
|
||||
{
|
||||
public partial interface IMES_InventoryManagementService : IService<MES_InventoryManagement>
|
||||
{
|
||||
}
|
||||
}
|
|
@ -1,12 +0,0 @@
|
|||
/*
|
||||
*代码由框架生成,任何更改都可能导致被代码生成器覆盖
|
||||
*/
|
||||
using VOL.Core.BaseProvider;
|
||||
using VOL.Entity.DomainModels;
|
||||
|
||||
namespace VOL.MES.IServices
|
||||
{
|
||||
public partial interface IMES_LocationManagementService : IService<MES_LocationManagement>
|
||||
{
|
||||
}
|
||||
}
|
|
@ -1,12 +0,0 @@
|
|||
/*
|
||||
*代码由框架生成,任何更改都可能导致被代码生成器覆盖
|
||||
*/
|
||||
using VOL.Core.BaseProvider;
|
||||
using VOL.Entity.DomainModels;
|
||||
|
||||
namespace VOL.MES.IServices
|
||||
{
|
||||
public partial interface IMES_MaterialCatalogService : IService<MES_MaterialCatalog>
|
||||
{
|
||||
}
|
||||
}
|
|
@ -1,12 +0,0 @@
|
|||
/*
|
||||
*代码由框架生成,任何更改都可能导致被代码生成器覆盖
|
||||
*/
|
||||
using VOL.Core.BaseProvider;
|
||||
using VOL.Entity.DomainModels;
|
||||
|
||||
namespace VOL.MES.IServices
|
||||
{
|
||||
public partial interface IMES_MaterialService : IService<MES_Material>
|
||||
{
|
||||
}
|
||||
}
|
|
@ -1,12 +0,0 @@
|
|||
/*
|
||||
*代码由框架生成,任何更改都可能导致被代码生成器覆盖
|
||||
*/
|
||||
using VOL.Core.BaseProvider;
|
||||
using VOL.Entity.DomainModels;
|
||||
|
||||
namespace VOL.MES.IServices
|
||||
{
|
||||
public partial interface IMES_ProcessReportService : IService<MES_ProcessReport>
|
||||
{
|
||||
}
|
||||
}
|
|
@ -1,12 +0,0 @@
|
|||
/*
|
||||
*代码由框架生成,任何更改都可能导致被代码生成器覆盖
|
||||
*/
|
||||
using VOL.Core.BaseProvider;
|
||||
using VOL.Entity.DomainModels;
|
||||
|
||||
namespace VOL.MES.IServices
|
||||
{
|
||||
public partial interface IMES_ProcessRouteService : IService<MES_ProcessRoute>
|
||||
{
|
||||
}
|
||||
}
|
|
@ -1,12 +0,0 @@
|
|||
/*
|
||||
*代码由框架生成,任何更改都可能导致被代码生成器覆盖
|
||||
*/
|
||||
using VOL.Core.BaseProvider;
|
||||
using VOL.Entity.DomainModels;
|
||||
|
||||
namespace VOL.MES.IServices
|
||||
{
|
||||
public partial interface IMES_ProductInboundService : IService<MES_ProductInbound>
|
||||
{
|
||||
}
|
||||
}
|
|
@ -1,12 +0,0 @@
|
|||
/*
|
||||
*代码由框架生成,任何更改都可能导致被代码生成器覆盖
|
||||
*/
|
||||
using VOL.Core.BaseProvider;
|
||||
using VOL.Entity.DomainModels;
|
||||
|
||||
namespace VOL.MES.IServices
|
||||
{
|
||||
public partial interface IMES_ProductOutboundService : IService<MES_ProductOutbound>
|
||||
{
|
||||
}
|
||||
}
|
|
@ -1,12 +0,0 @@
|
|||
/*
|
||||
*代码由框架生成,任何更改都可能导致被代码生成器覆盖
|
||||
*/
|
||||
using VOL.Core.BaseProvider;
|
||||
using VOL.Entity.DomainModels;
|
||||
|
||||
namespace VOL.MES.IServices
|
||||
{
|
||||
public partial interface IMES_ProductionLineDeviceService : IService<MES_ProductionLineDevice>
|
||||
{
|
||||
}
|
||||
}
|
|
@ -1,12 +0,0 @@
|
|||
/*
|
||||
*代码由框架生成,任何更改都可能导致被代码生成器覆盖
|
||||
*/
|
||||
using VOL.Core.BaseProvider;
|
||||
using VOL.Entity.DomainModels;
|
||||
|
||||
namespace VOL.MES.IServices
|
||||
{
|
||||
public partial interface IMES_ProductionLineService : IService<MES_ProductionLine>
|
||||
{
|
||||
}
|
||||
}
|
|
@ -1,12 +0,0 @@
|
|||
/*
|
||||
*代码由框架生成,任何更改都可能导致被代码生成器覆盖
|
||||
*/
|
||||
using VOL.Core.BaseProvider;
|
||||
using VOL.Entity.DomainModels;
|
||||
|
||||
namespace VOL.MES.IServices
|
||||
{
|
||||
public partial interface IMES_ProductionOrderService : IService<MES_ProductionOrder>
|
||||
{
|
||||
}
|
||||
}
|
|
@ -1,12 +0,0 @@
|
|||
/*
|
||||
*代码由框架生成,任何更改都可能导致被代码生成器覆盖
|
||||
*/
|
||||
using VOL.Core.BaseProvider;
|
||||
using VOL.Entity.DomainModels;
|
||||
|
||||
namespace VOL.MES.IServices
|
||||
{
|
||||
public partial interface IMES_ProductionPlanChangeRecordService : IService<MES_ProductionPlanChangeRecord>
|
||||
{
|
||||
}
|
||||
}
|
|
@ -1,12 +0,0 @@
|
|||
/*
|
||||
*代码由框架生成,任何更改都可能导致被代码生成器覆盖
|
||||
*/
|
||||
using VOL.Core.BaseProvider;
|
||||
using VOL.Entity.DomainModels;
|
||||
|
||||
namespace VOL.MES.IServices
|
||||
{
|
||||
public partial interface IMES_ProductionPlanDetailService : IService<MES_ProductionPlanDetail>
|
||||
{
|
||||
}
|
||||
}
|
|
@ -1,12 +0,0 @@
|
|||
/*
|
||||
*代码由框架生成,任何更改都可能导致被代码生成器覆盖
|
||||
*/
|
||||
using VOL.Core.BaseProvider;
|
||||
using VOL.Entity.DomainModels;
|
||||
|
||||
namespace VOL.MES.IServices
|
||||
{
|
||||
public partial interface IMES_ProductionReportingDetailService : IService<MES_ProductionReportingDetail>
|
||||
{
|
||||
}
|
||||
}
|
|
@ -1,12 +0,0 @@
|
|||
/*
|
||||
*代码由框架生成,任何更改都可能导致被代码生成器覆盖
|
||||
*/
|
||||
using VOL.Core.BaseProvider;
|
||||
using VOL.Entity.DomainModels;
|
||||
|
||||
namespace VOL.MES.IServices
|
||||
{
|
||||
public partial interface IMES_ProductionReportingService : IService<MES_ProductionReporting>
|
||||
{
|
||||
}
|
||||
}
|
|
@ -1,12 +0,0 @@
|
|||
/*
|
||||
*代码由框架生成,任何更改都可能导致被代码生成器覆盖
|
||||
*/
|
||||
using VOL.Core.BaseProvider;
|
||||
using VOL.Entity.DomainModels;
|
||||
|
||||
namespace VOL.MES.IServices
|
||||
{
|
||||
public partial interface IMES_QualityInspectionPlanDetailService : IService<MES_QualityInspectionPlanDetail>
|
||||
{
|
||||
}
|
||||
}
|
|
@ -1,12 +0,0 @@
|
|||
/*
|
||||
*代码由框架生成,任何更改都可能导致被代码生成器覆盖
|
||||
*/
|
||||
using VOL.Core.BaseProvider;
|
||||
using VOL.Entity.DomainModels;
|
||||
|
||||
namespace VOL.MES.IServices
|
||||
{
|
||||
public partial interface IMES_QualityInspectionPlanService : IService<MES_QualityInspectionPlan>
|
||||
{
|
||||
}
|
||||
}
|
|
@ -1,12 +0,0 @@
|
|||
/*
|
||||
*代码由框架生成,任何更改都可能导致被代码生成器覆盖
|
||||
*/
|
||||
using VOL.Core.BaseProvider;
|
||||
using VOL.Entity.DomainModels;
|
||||
|
||||
namespace VOL.MES.IServices
|
||||
{
|
||||
public partial interface IMES_QualityInspectionRecordService : IService<MES_QualityInspectionRecord>
|
||||
{
|
||||
}
|
||||
}
|
|
@ -1,12 +0,0 @@
|
|||
/*
|
||||
*代码由框架生成,任何更改都可能导致被代码生成器覆盖
|
||||
*/
|
||||
using VOL.Core.BaseProvider;
|
||||
using VOL.Entity.DomainModels;
|
||||
|
||||
namespace VOL.MES.IServices
|
||||
{
|
||||
public partial interface IMES_SchedulingPlanService : IService<MES_SchedulingPlan>
|
||||
{
|
||||
}
|
||||
}
|
|
@ -1,12 +0,0 @@
|
|||
/*
|
||||
*代码由框架生成,任何更改都可能导致被代码生成器覆盖
|
||||
*/
|
||||
using VOL.Core.BaseProvider;
|
||||
using VOL.Entity.DomainModels;
|
||||
|
||||
namespace VOL.MES.IServices
|
||||
{
|
||||
public partial interface IMES_SupplierService : IService<MES_Supplier>
|
||||
{
|
||||
}
|
||||
}
|
|
@ -1,12 +0,0 @@
|
|||
/*
|
||||
*代码由框架生成,任何更改都可能导致被代码生成器覆盖
|
||||
*/
|
||||
using VOL.Core.BaseProvider;
|
||||
using VOL.Entity.DomainModels;
|
||||
|
||||
namespace VOL.MES.IServices
|
||||
{
|
||||
public partial interface IMES_WarehouseManagementService : IService<MES_WarehouseManagement>
|
||||
{
|
||||
}
|
||||
}
|
|
@ -1,13 +0,0 @@
|
|||
/*
|
||||
*所有关于MES_Bom_Detail类的业务代码接口应在此处编写
|
||||
*/
|
||||
using VOL.Core.BaseProvider;
|
||||
using VOL.Entity.DomainModels;
|
||||
using VOL.Core.Utilities;
|
||||
using System.Linq.Expressions;
|
||||
namespace VOL.MES.IServices
|
||||
{
|
||||
public partial interface IMES_Bom_DetailService
|
||||
{
|
||||
}
|
||||
}
|
|
@ -1,13 +0,0 @@
|
|||
/*
|
||||
*所有关于MES_Bom_Main类的业务代码接口应在此处编写
|
||||
*/
|
||||
using VOL.Core.BaseProvider;
|
||||
using VOL.Entity.DomainModels;
|
||||
using VOL.Core.Utilities;
|
||||
using System.Linq.Expressions;
|
||||
namespace VOL.MES.IServices
|
||||
{
|
||||
public partial interface IMES_Bom_MainService
|
||||
{
|
||||
}
|
||||
}
|
|
@ -1,13 +0,0 @@
|
|||
/*
|
||||
*所有关于MES_Customer类的业务代码接口应在此处编写
|
||||
*/
|
||||
using VOL.Core.BaseProvider;
|
||||
using VOL.Entity.DomainModels;
|
||||
using VOL.Core.Utilities;
|
||||
using System.Linq.Expressions;
|
||||
namespace VOL.MES.IServices
|
||||
{
|
||||
public partial interface IMES_CustomerService
|
||||
{
|
||||
}
|
||||
}
|
|
@ -1,13 +0,0 @@
|
|||
/*
|
||||
*所有关于MES_DefectiveProductDisposalRecord类的业务代码接口应在此处编写
|
||||
*/
|
||||
using VOL.Core.BaseProvider;
|
||||
using VOL.Entity.DomainModels;
|
||||
using VOL.Core.Utilities;
|
||||
using System.Linq.Expressions;
|
||||
namespace VOL.MES.IServices
|
||||
{
|
||||
public partial interface IMES_DefectiveProductDisposalRecordService
|
||||
{
|
||||
}
|
||||
}
|
|
@ -1,13 +0,0 @@
|
|||
/*
|
||||
*所有关于MES_DefectiveProductRecord类的业务代码接口应在此处编写
|
||||
*/
|
||||
using VOL.Core.BaseProvider;
|
||||
using VOL.Entity.DomainModels;
|
||||
using VOL.Core.Utilities;
|
||||
using System.Linq.Expressions;
|
||||
namespace VOL.MES.IServices
|
||||
{
|
||||
public partial interface IMES_DefectiveProductRecordService
|
||||
{
|
||||
}
|
||||
}
|
|
@ -1,13 +0,0 @@
|
|||
/*
|
||||
*所有关于MES_EquipmentFaultRecord类的业务代码接口应在此处编写
|
||||
*/
|
||||
using VOL.Core.BaseProvider;
|
||||
using VOL.Entity.DomainModels;
|
||||
using VOL.Core.Utilities;
|
||||
using System.Linq.Expressions;
|
||||
namespace VOL.MES.IServices
|
||||
{
|
||||
public partial interface IMES_EquipmentFaultRecordService
|
||||
{
|
||||
}
|
||||
}
|
|
@ -1,13 +0,0 @@
|
|||
/*
|
||||
*所有关于MES_EquipmentMaintenance类的业务代码接口应在此处编写
|
||||
*/
|
||||
using VOL.Core.BaseProvider;
|
||||
using VOL.Entity.DomainModels;
|
||||
using VOL.Core.Utilities;
|
||||
using System.Linq.Expressions;
|
||||
namespace VOL.MES.IServices
|
||||
{
|
||||
public partial interface IMES_EquipmentMaintenanceService
|
||||
{
|
||||
}
|
||||
}
|
|
@ -1,13 +0,0 @@
|
|||
/*
|
||||
*所有关于MES_EquipmentManagement类的业务代码接口应在此处编写
|
||||
*/
|
||||
using VOL.Core.BaseProvider;
|
||||
using VOL.Entity.DomainModels;
|
||||
using VOL.Core.Utilities;
|
||||
using System.Linq.Expressions;
|
||||
namespace VOL.MES.IServices
|
||||
{
|
||||
public partial interface IMES_EquipmentManagementService
|
||||
{
|
||||
}
|
||||
}
|
|
@ -1,13 +0,0 @@
|
|||
/*
|
||||
*所有关于MES_EquipmentRepair类的业务代码接口应在此处编写
|
||||
*/
|
||||
using VOL.Core.BaseProvider;
|
||||
using VOL.Entity.DomainModels;
|
||||
using VOL.Core.Utilities;
|
||||
using System.Linq.Expressions;
|
||||
namespace VOL.MES.IServices
|
||||
{
|
||||
public partial interface IMES_EquipmentRepairService
|
||||
{
|
||||
}
|
||||
}
|
|
@ -1,13 +0,0 @@
|
|||
/*
|
||||
*所有关于MES_InventoryManagement类的业务代码接口应在此处编写
|
||||
*/
|
||||
using VOL.Core.BaseProvider;
|
||||
using VOL.Entity.DomainModels;
|
||||
using VOL.Core.Utilities;
|
||||
using System.Linq.Expressions;
|
||||
namespace VOL.MES.IServices
|
||||
{
|
||||
public partial interface IMES_InventoryManagementService
|
||||
{
|
||||
}
|
||||
}
|
|
@ -1,13 +0,0 @@
|
|||
/*
|
||||
*所有关于MES_LocationManagement类的业务代码接口应在此处编写
|
||||
*/
|
||||
using VOL.Core.BaseProvider;
|
||||
using VOL.Entity.DomainModels;
|
||||
using VOL.Core.Utilities;
|
||||
using System.Linq.Expressions;
|
||||
namespace VOL.MES.IServices
|
||||
{
|
||||
public partial interface IMES_LocationManagementService
|
||||
{
|
||||
}
|
||||
}
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue