Clear code

This commit is contained in:
Ling 2025-09-26 13:35:45 +08:00
parent d83142f48f
commit f04f48ddd4
238 changed files with 2355 additions and 4591 deletions

View File

@ -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()];
}
}
}

View File

@ -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;
}
}
}

View File

@ -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; }
}
}

View File

@ -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; }
}
}

View File

@ -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" // 工号
];
}
}

View File

@ -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;
}
}
}

View File

@ -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;
}
}
}
}
}

View File

@ -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>

View File

@ -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; }
}
}

View File

@ -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]属性,否则会异常
}
}

View File

@ -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; }
}
}

View File

@ -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]属性,否则会异常
}
}

View File

@ -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>

View File

@ -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>
{
}
}

View File

@ -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>
{
}
}

View File

@ -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>
{
}
}

View File

@ -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();
}
}

View File

@ -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>
{
}
}

View File

@ -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
{
}
}

View File

@ -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();
}
}

View File

@ -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>
(); } }
}
}

View File

@ -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>
(); } }
}
}

View File

@ -0,0 +1,22 @@
/*
*Authorjxx
*Contact283591387@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>(); } }
}
}

View File

@ -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;
}
}
}
}

View File

@ -0,0 +1,22 @@
/*
*Authorjxx
*Contact283591387@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>(); } }
}
}

View File

@ -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)

View File

@ -18,5 +18,7 @@ namespace VOL.HR.Services
public static IHR_EmployeeSyncService Instance
{
get { return AutofacContainerModule.GetService<IHR_EmployeeSyncService>(); } }
}
}

View File

@ -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;
}
}
}

View File

@ -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>

View File

@ -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>
{
}
}

View File

@ -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>
{
}
}

View File

@ -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>
{
}
}

View File

@ -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>
{
}
}

View File

@ -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>
{
}
}

View File

@ -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>
{
}
}

View File

@ -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>
{
}
}

View File

@ -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>
{
}
}

View File

@ -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>
{
}
}

View File

@ -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>
{
}
}

View File

@ -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>
{
}
}

View File

@ -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>
{
}
}

View File

@ -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>
{
}
}

View File

@ -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>
{
}
}

View File

@ -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>
{
}
}

View File

@ -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>
{
}
}

View File

@ -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>
{
}
}

View File

@ -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>
{
}
}

View File

@ -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>
{
}
}

View File

@ -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>
{
}
}

View File

@ -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>
{
}
}

View File

@ -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>
{
}
}

View File

@ -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>
{
}
}

View File

@ -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>
{
}
}

View File

@ -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>
{
}
}

View File

@ -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>
{
}
}

View File

@ -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>
{
}
}

View File

@ -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>
{
}
}

View File

@ -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>
{
}
}

View File

@ -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>
{
}
}

View File

@ -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>
{
}
}

View File

@ -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>
{
}
}

View File

@ -1,12 +0,0 @@
/*
*,
*/
using VOL.Core.BaseProvider;
using VOL.Entity.DomainModels;
namespace VOL.MES.IServices
{
public partial interface IMES_CustomerService : IService<MES_Customer>
{
}
}

View File

@ -1,12 +0,0 @@
/*
*,
*/
using VOL.Core.BaseProvider;
using VOL.Entity.DomainModels;
namespace VOL.MES.IServices
{
public partial interface IMES_DefectiveProductDisposalRecordService : IService<MES_DefectiveProductDisposalRecord>
{
}
}

View File

@ -1,12 +0,0 @@
/*
*,
*/
using VOL.Core.BaseProvider;
using VOL.Entity.DomainModels;
namespace VOL.MES.IServices
{
public partial interface IMES_DefectiveProductRecordService : IService<MES_DefectiveProductRecord>
{
}
}

View File

@ -1,12 +0,0 @@
/*
*,
*/
using VOL.Core.BaseProvider;
using VOL.Entity.DomainModels;
namespace VOL.MES.IServices
{
public partial interface IMES_EquipmentFaultRecordService : IService<MES_EquipmentFaultRecord>
{
}
}

View File

@ -1,12 +0,0 @@
/*
*,
*/
using VOL.Core.BaseProvider;
using VOL.Entity.DomainModels;
namespace VOL.MES.IServices
{
public partial interface IMES_EquipmentMaintenanceService : IService<MES_EquipmentMaintenance>
{
}
}

View File

@ -1,12 +0,0 @@
/*
*,
*/
using VOL.Core.BaseProvider;
using VOL.Entity.DomainModels;
namespace VOL.MES.IServices
{
public partial interface IMES_EquipmentManagementService : IService<MES_EquipmentManagement>
{
}
}

View File

@ -1,12 +0,0 @@
/*
*,
*/
using VOL.Core.BaseProvider;
using VOL.Entity.DomainModels;
namespace VOL.MES.IServices
{
public partial interface IMES_EquipmentRepairService : IService<MES_EquipmentRepair>
{
}
}

View File

@ -1,12 +0,0 @@
/*
*,
*/
using VOL.Core.BaseProvider;
using VOL.Entity.DomainModels;
namespace VOL.MES.IServices
{
public partial interface IMES_InventoryManagementService : IService<MES_InventoryManagement>
{
}
}

View File

@ -1,12 +0,0 @@
/*
*,
*/
using VOL.Core.BaseProvider;
using VOL.Entity.DomainModels;
namespace VOL.MES.IServices
{
public partial interface IMES_LocationManagementService : IService<MES_LocationManagement>
{
}
}

View File

@ -1,12 +0,0 @@
/*
*,
*/
using VOL.Core.BaseProvider;
using VOL.Entity.DomainModels;
namespace VOL.MES.IServices
{
public partial interface IMES_MaterialCatalogService : IService<MES_MaterialCatalog>
{
}
}

View File

@ -1,12 +0,0 @@
/*
*,
*/
using VOL.Core.BaseProvider;
using VOL.Entity.DomainModels;
namespace VOL.MES.IServices
{
public partial interface IMES_MaterialService : IService<MES_Material>
{
}
}

View File

@ -1,12 +0,0 @@
/*
*,
*/
using VOL.Core.BaseProvider;
using VOL.Entity.DomainModels;
namespace VOL.MES.IServices
{
public partial interface IMES_ProcessReportService : IService<MES_ProcessReport>
{
}
}

View File

@ -1,12 +0,0 @@
/*
*,
*/
using VOL.Core.BaseProvider;
using VOL.Entity.DomainModels;
namespace VOL.MES.IServices
{
public partial interface IMES_ProcessRouteService : IService<MES_ProcessRoute>
{
}
}

View File

@ -1,12 +0,0 @@
/*
*,
*/
using VOL.Core.BaseProvider;
using VOL.Entity.DomainModels;
namespace VOL.MES.IServices
{
public partial interface IMES_ProductInboundService : IService<MES_ProductInbound>
{
}
}

View File

@ -1,12 +0,0 @@
/*
*,
*/
using VOL.Core.BaseProvider;
using VOL.Entity.DomainModels;
namespace VOL.MES.IServices
{
public partial interface IMES_ProductOutboundService : IService<MES_ProductOutbound>
{
}
}

View File

@ -1,12 +0,0 @@
/*
*,
*/
using VOL.Core.BaseProvider;
using VOL.Entity.DomainModels;
namespace VOL.MES.IServices
{
public partial interface IMES_ProductionLineDeviceService : IService<MES_ProductionLineDevice>
{
}
}

View File

@ -1,12 +0,0 @@
/*
*,
*/
using VOL.Core.BaseProvider;
using VOL.Entity.DomainModels;
namespace VOL.MES.IServices
{
public partial interface IMES_ProductionLineService : IService<MES_ProductionLine>
{
}
}

View File

@ -1,12 +0,0 @@
/*
*,
*/
using VOL.Core.BaseProvider;
using VOL.Entity.DomainModels;
namespace VOL.MES.IServices
{
public partial interface IMES_ProductionOrderService : IService<MES_ProductionOrder>
{
}
}

View File

@ -1,12 +0,0 @@
/*
*,
*/
using VOL.Core.BaseProvider;
using VOL.Entity.DomainModels;
namespace VOL.MES.IServices
{
public partial interface IMES_ProductionPlanChangeRecordService : IService<MES_ProductionPlanChangeRecord>
{
}
}

View File

@ -1,12 +0,0 @@
/*
*,
*/
using VOL.Core.BaseProvider;
using VOL.Entity.DomainModels;
namespace VOL.MES.IServices
{
public partial interface IMES_ProductionPlanDetailService : IService<MES_ProductionPlanDetail>
{
}
}

View File

@ -1,12 +0,0 @@
/*
*,
*/
using VOL.Core.BaseProvider;
using VOL.Entity.DomainModels;
namespace VOL.MES.IServices
{
public partial interface IMES_ProductionReportingDetailService : IService<MES_ProductionReportingDetail>
{
}
}

View File

@ -1,12 +0,0 @@
/*
*,
*/
using VOL.Core.BaseProvider;
using VOL.Entity.DomainModels;
namespace VOL.MES.IServices
{
public partial interface IMES_ProductionReportingService : IService<MES_ProductionReporting>
{
}
}

View File

@ -1,12 +0,0 @@
/*
*,
*/
using VOL.Core.BaseProvider;
using VOL.Entity.DomainModels;
namespace VOL.MES.IServices
{
public partial interface IMES_QualityInspectionPlanDetailService : IService<MES_QualityInspectionPlanDetail>
{
}
}

View File

@ -1,12 +0,0 @@
/*
*,
*/
using VOL.Core.BaseProvider;
using VOL.Entity.DomainModels;
namespace VOL.MES.IServices
{
public partial interface IMES_QualityInspectionPlanService : IService<MES_QualityInspectionPlan>
{
}
}

View File

@ -1,12 +0,0 @@
/*
*,
*/
using VOL.Core.BaseProvider;
using VOL.Entity.DomainModels;
namespace VOL.MES.IServices
{
public partial interface IMES_QualityInspectionRecordService : IService<MES_QualityInspectionRecord>
{
}
}

View File

@ -1,12 +0,0 @@
/*
*,
*/
using VOL.Core.BaseProvider;
using VOL.Entity.DomainModels;
namespace VOL.MES.IServices
{
public partial interface IMES_SchedulingPlanService : IService<MES_SchedulingPlan>
{
}
}

View File

@ -1,12 +0,0 @@
/*
*,
*/
using VOL.Core.BaseProvider;
using VOL.Entity.DomainModels;
namespace VOL.MES.IServices
{
public partial interface IMES_SupplierService : IService<MES_Supplier>
{
}
}

View File

@ -1,12 +0,0 @@
/*
*,
*/
using VOL.Core.BaseProvider;
using VOL.Entity.DomainModels;
namespace VOL.MES.IServices
{
public partial interface IMES_WarehouseManagementService : IService<MES_WarehouseManagement>
{
}
}

View File

@ -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
{
}
}

View File

@ -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
{
}
}

View File

@ -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
{
}
}

View File

@ -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
{
}
}

View File

@ -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
{
}
}

View File

@ -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
{
}
}

View File

@ -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
{
}
}

View File

@ -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
{
}
}

View File

@ -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
{
}
}

View File

@ -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
{
}
}

View File

@ -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