From ecad98aa74a1284a036572fa364bcc352480149c Mon Sep 17 00:00:00 2001
From: yl <ykxkd@outlook.com>
Date: 星期一, 11 五月 2026 08:01:35 +0800
Subject: [PATCH] 1.车间综合看板接口调整 2.报工记录子表和不良记录表写入报工人员,班组编码 3.修改调整定时任务写入到数据库,并实现消息推送
---
VueWebCoreApi/Quartz/TaskOptions.cs | 44 +
VueWebCoreApi/Quartz/IOCJobFactory.cs | 2
VueWebCoreApi/DLL/DAL/WorkOrderDAL.cs | 119 +-
VueWebCoreApi/Quartz/HttpResultfulJob.cs | 150 +++-
VueWebCoreApi/Quartz/JobActionLog.cs | 17
VueWebCoreApi/Quartz/QuartzNETExtension.cs | 646 +++++++++----------
VueWebCoreApi/Quartz/QuartzRepository.cs | 143 ++++
VueWebCoreApi/SignalR/ChatHub.cs | 39
VueWebCoreApi/SignalR/UserIdsStore.cs | 90 ++
VueWebCoreApi/Quartz/QuartzFileInfo.cs | 3
/dev/null | 116 ---
VueWebCoreApi/Quartz/HttpManager.cs | 189 ++++-
VueWebCoreApi/Controllers/TaskBackGroundController.cs | 181 +++--
VueWebCoreApi/Quartz/JobAction.cs | 6
VueWebCoreApi/Quartz/QuartzDapperHelper.cs | 135 ++++
VueWebCoreApi/Startup.cs | 40
VueWebCoreApi/DLL/DAL/KanBanManagerentDAL.cs | 6
VueWebCoreApi/appsettings.json | 6
VueWebCoreApi/Quartz/TaskLog.cs | 4
19 files changed, 1,242 insertions(+), 694 deletions(-)
diff --git a/VueWebCoreApi/Controllers/TaskBackGroundController.cs b/VueWebCoreApi/Controllers/TaskBackGroundController.cs
index e256430..716ec04 100644
--- a/VueWebCoreApi/Controllers/TaskBackGroundController.cs
+++ b/VueWebCoreApi/Controllers/TaskBackGroundController.cs
@@ -16,122 +16,161 @@
[Route("api/[controller]")]
public class TaskBackGroundController : Controller
{
- //瀹氫箟鍏ㄥ眬淇℃伅杩斿洖鍙橀噺
ToMessage mes = new ToMessage();
private readonly ISchedulerFactory _schedulerFactory;
private readonly IJobFactory _jobFactory;
- public TaskBackGroundController(ISchedulerFactory schedulerFactory, IJobFactory jobFactory)
+ private readonly QuartzRepository _quartzRepo;
+
+ public TaskBackGroundController(ISchedulerFactory schedulerFactory,
+ IJobFactory jobFactory,
+ QuartzRepository quartzRepo)
{
- this._jobFactory = jobFactory;
- this._schedulerFactory = schedulerFactory;
+ _schedulerFactory = schedulerFactory;
+ _jobFactory = jobFactory;
+ _quartzRepo = quartzRepo;
}
- /// <summary>
- /// 鑾峰彇鎵�鏈夌殑浣滀笟
- /// </summary>
- /// <returns></returns>
- [Route(template: "GetJobs")]
+ [Route("GetJobs")]
[HttpGet]
public async Task<IActionResult> GetJobs()
{
- mes.code = "200";
- mes.message = "鏌ヨ鎴愬姛锛�";
- mes.data = await _schedulerFactory.GetJobs();
+ try
+ {
+ mes.code = "200";
+ mes.message = "鏌ヨ鎴愬姛锛�";
+ mes.data = await _schedulerFactory.GetJobs(_quartzRepo);
+ }
+ catch (Exception ex)
+ {
+ mes.code = "300";
+ mes.message = "鏌ヨ澶辫触锛�" + ex.Message;
+ mes.data = null;
+ }
return Json(mes);
}
- /// <summary>
- /// 鑾峰彇浣滀笟杩愯鏃ュ織
- /// </summary>
- /// <param name="taskName"></param>
- /// <param name="groupName"></param>
- /// <param name="page"></param>
- /// <returns></returns>
- [Route(template: "GetRunLog")]
+ [Route("GetRunLog")]
[HttpGet]
- public IActionResult GetRunLog(string taskName, string groupName, int page = 1)
+ public async Task<IActionResult> GetRunLog(string taskName, string groupName, int page = 1)
{
- mes.code = "200";
- mes.data = FileQuartz.GetJobRunLog(taskName, groupName, page);
+ // 鍏ュ弬鏍¢獙
+ if (string.IsNullOrEmpty(taskName) || string.IsNullOrEmpty(groupName))
+ {
+ mes.code = "300";
+ mes.message = "浠诲姟鍚嶅拰鍒嗙粍鍚嶄笉鑳戒负绌猴紒";
+ mes.data = null;
+ return Json(mes);
+ }
+ try
+ {
+ mes.code = "200";
+ mes.message = "鏌ヨ鎴愬姛锛�";
+ mes.data = await _quartzRepo.GetJobRunLogAsync(taskName, groupName, page);
+ }
+ catch (Exception ex)
+ {
+ mes.code = "300";
+ mes.message = "鏌ヨ澶辫触锛�" + ex.Message;
+ mes.data = null;
+ }
return Json(mes);
}
- /// <summary>
- /// 娣诲姞浠诲姟
- /// </summary>
- /// <param name="taskOptions"></param>
- /// <returns></returns>
- [Route(template: "Add")]
+ [Route("Add")]
[HttpPost]
- //[TaskAuthor]
public async Task<IActionResult> Add(TaskOptions taskOptions)
{
- return Json(await taskOptions.AddJob(_schedulerFactory, jobFactory: _jobFactory));
+ if (string.IsNullOrEmpty(taskOptions.TaskName) || string.IsNullOrEmpty(taskOptions.GroupName))
+ {
+ mes.code = "300";
+ mes.message = "浠诲姟鍚嶅拰鍒嗙粍鍚嶄笉鑳戒负绌猴紒";
+ return Json(mes);
+ }
+ return Json(await taskOptions.AddJob(_schedulerFactory, false, _jobFactory, _quartzRepo));
}
- /// <summary>
- /// 鍒犻櫎浠诲姟
- /// </summary>
- /// <param name="taskOptions"></param>
- /// <returns></returns>
- [Route(template: "Remove")]
+ [Route("Remove")]
[HttpPost]
- //[TaskAuthor]
public async Task<IActionResult> Remove(TaskOptions taskOptions)
{
- return Json(await _schedulerFactory.Remove(taskOptions));
+ if (string.IsNullOrEmpty(taskOptions.TaskName) || string.IsNullOrEmpty(taskOptions.GroupName))
+ {
+ mes.code = "300";
+ mes.message = "浠诲姟鍚嶅拰鍒嗙粍鍚嶄笉鑳戒负绌猴紒";
+ return Json(mes);
+ }
+ return Json(await _schedulerFactory.Remove(taskOptions, _quartzRepo));
}
- /// <summary>
- /// 淇敼浠诲姟
- /// </summary>
- /// <param name="taskOptions"></param>
- /// <returns></returns>
- [Route(template: "Update")]
+ [Route("Update")]
[HttpPost]
- //[TaskAuthor]
public async Task<IActionResult> Update(TaskOptions taskOptions)
{
- return Json(await _schedulerFactory.Update(taskOptions));
+ if (string.IsNullOrEmpty(taskOptions.TaskName) || string.IsNullOrEmpty(taskOptions.GroupName))
+ {
+ mes.code = "300";
+ mes.message = "浠诲姟鍚嶅拰鍒嗙粍鍚嶄笉鑳戒负绌猴紒";
+ return Json(mes);
+ }
+ return Json(await _schedulerFactory.Update(taskOptions, _quartzRepo));
}
- /// <summary>
- /// 鏆傚仠浠诲姟
- /// </summary>
- /// <param name="taskOptions"></param>
- /// <returns></returns>
- [Route(template: "Pause")]
+ [Route("Pause")]
[HttpPost]
- //[TaskAuthor]
public async Task<IActionResult> Pause(TaskOptions taskOptions)
{
- return Json(await _schedulerFactory.Pause(taskOptions));
+ if (string.IsNullOrEmpty(taskOptions.TaskName) || string.IsNullOrEmpty(taskOptions.GroupName))
+ {
+ mes.code = "300";
+ mes.message = "浠诲姟鍚嶅拰鍒嗙粍鍚嶄笉鑳戒负绌猴紒";
+ return Json(mes);
+ }
+ // 鏍¢獙浠诲姟鏄惁瀛樺湪
+ if (!await _quartzRepo.TaskExistsAsync(taskOptions.TaskName, taskOptions.GroupName))
+ {
+ mes.code = "300";
+ mes.message = "浠诲姟涓嶅瓨鍦紒";
+ return Json(mes);
+ }
+ return Json(await _schedulerFactory.Pause(taskOptions, _quartzRepo));
}
- /// <summary>
- /// 寮�鍚换鍔�
- /// </summary>
- /// <param name="taskOptions"></param>
- /// <returns></returns>
- [Route(template: "Start")]
+ [Route("Start")]
[HttpPost]
- //[TaskAuthor]
public async Task<IActionResult> Start(TaskOptions taskOptions)
{
- return Json(await _schedulerFactory.Start(taskOptions));
+ if (string.IsNullOrEmpty(taskOptions.TaskName) || string.IsNullOrEmpty(taskOptions.GroupName))
+ {
+ mes.code = "300";
+ mes.message = "浠诲姟鍚嶅拰鍒嗙粍鍚嶄笉鑳戒负绌猴紒";
+ return Json(mes);
+ }
+ if (!await _quartzRepo.TaskExistsAsync(taskOptions.TaskName, taskOptions.GroupName))
+ {
+ mes.code = "300";
+ mes.message = "浠诲姟涓嶅瓨鍦紒";
+ return Json(mes);
+ }
+ return Json(await _schedulerFactory.Start(taskOptions, _quartzRepo));
}
- /// <summary>
- /// 绔嬪嵆鎵ц
- /// </summary>
- /// <param name="taskOptions"></param>
- /// <returns></returns>
- [Route(template: "Run")]
+ [Route("Run")]
[HttpPost]
- //[TaskAuthor]
public async Task<IActionResult> Run(TaskOptions taskOptions)
{
- return Json(await _schedulerFactory.Run(taskOptions));
+ if (string.IsNullOrEmpty(taskOptions.TaskName) || string.IsNullOrEmpty(taskOptions.GroupName))
+ {
+ mes.code = "300";
+ mes.message = "浠诲姟鍚嶅拰鍒嗙粍鍚嶄笉鑳戒负绌猴紒";
+ return Json(mes);
+ }
+ if (!await _quartzRepo.TaskExistsAsync(taskOptions.TaskName, taskOptions.GroupName))
+ {
+ mes.code = "300";
+ mes.message = "浠诲姟涓嶅瓨鍦紒";
+ return Json(mes);
+ }
+ return Json(await _schedulerFactory.Run(taskOptions, _quartzRepo));
}
}
}
diff --git a/VueWebCoreApi/DLL/DAL/KanBanManagerentDAL.cs b/VueWebCoreApi/DLL/DAL/KanBanManagerentDAL.cs
index 6661bbf..af7c314 100644
--- a/VueWebCoreApi/DLL/DAL/KanBanManagerentDAL.cs
+++ b/VueWebCoreApi/DLL/DAL/KanBanManagerentDAL.cs
@@ -214,17 +214,13 @@
public static ToMessage WorkShopCompreRightBottom()
{
var sql = "";
- Dictionary<object, object> dir = new Dictionary<object, object>();
try
{
sql = @"select * from h_v_JLKanBan_WorkShopCompreRightBottom";
var data = DapperHelper.selecttable(sql);
- dir.Add("Y", data.Rows[0]["BaseQuantity"].ToString());
- dir.Add("B", data.Rows[1]["BaseQuantity"].ToString());
- dir.Add("C", data.Rows[2]["BaseQuantity"].ToString());
mes.code = "200";
mes.message = "鏌ヨ鎴愬姛!";
- mes.data = dir;
+ mes.data = data;
}
catch (Exception e)
{
diff --git a/VueWebCoreApi/DLL/DAL/WorkOrderDAL.cs b/VueWebCoreApi/DLL/DAL/WorkOrderDAL.cs
index 83002ae..f69e311 100644
--- a/VueWebCoreApi/DLL/DAL/WorkOrderDAL.cs
+++ b/VueWebCoreApi/DLL/DAL/WorkOrderDAL.cs
@@ -133,7 +133,7 @@
#endregion
#region[ERP璁㈠崟涓嬭揪]
- public static ToMessage MarkSaveErpOrder(string erporderid, string sbid, string erpordercode, string saleordercode, string partcode,string deptcode, string wkshopcode, string warehousecode, string erpqty, string markqty, string ordernum, string relse_qty, string idTopInventory, string TopInventoryCode, string TopInventoryName, string saleOrderDeliveryDate, string paystartdate, string payenddate, string clerkuser, User us)
+ public static ToMessage MarkSaveErpOrder(string erporderid, string sbid, string erpordercode, string saleordercode, string partcode, string deptcode, string wkshopcode, string warehousecode, string erpqty, string markqty, string ordernum, string relse_qty, string idTopInventory, string TopInventoryCode, string TopInventoryName, string saleOrderDeliveryDate, string paystartdate, string payenddate, string clerkuser, User us)
{
var sql = "";
string orderstatus = "", isstep = ""; //宸ュ崟鐘舵�併�佹槸鍚︾粦瀹氬伐鑹�
@@ -230,7 +230,7 @@
wo_code = wo,
wotype = "PO",
status = orderstatus, //"NEW"
- dept_code= deptcode,
+ dept_code = deptcode,
wkshp_code = wkshopcode,
plan_qty = cdqty + (decimal.Parse(markqty) - sumqty), //鏈崟涓嬪崟鏁伴噺=鍒囧垎鏁伴噺+(涓嬪崟鏁伴噺-绱鍒囧垎涓嬪崟鏁伴噺)
stck_code = warehousecode,
@@ -298,7 +298,7 @@
wo_code = wo,
wotype = "PO",
status = orderstatus, //"NEW"
- dept_code=deptcode,
+ dept_code = deptcode,
wkshp_code = wkshopcode,
plan_qty = cdqty,
stck_code = warehousecode,
@@ -500,13 +500,13 @@
wo_code = wo,
wotype = "PO",
status = orderstatus, //"NEW"
- dept_code=model.deptcode,
+ dept_code = model.deptcode,
wkshp_code = model.wkshopcode,
plan_qty = decimal.Parse(model.erpqty), //璁㈠崟鏁伴噺
stck_code = model.warehousecode,
sbid = model.sbid,
materiel_code = model.partcode,
- route_code=data0.Rows.Count<=0?"": data0.Rows[0]["default_route"].ToString(),
+ route_code = data0.Rows.Count <= 0 ? "" : data0.Rows[0]["default_route"].ToString(),
sourceid = model.erporderid,
m_po = model.erpordercode,
username = us.usercode,
@@ -518,7 +518,7 @@
data_sources = "ERP",
isstep = isstep, //鏄惁鍏宠仈宸ュ簭 "N"
clerkuser = model.clerkuser, //閿�鍞鍗曚笟鍔″憳
- idTopInventory =model.idTopInventory,
+ idTopInventory = model.idTopInventory,
TopInventoryCode = model.TopInventoryCode,
TopInventoryName = model.TopInventoryName
}
@@ -540,7 +540,7 @@
seq = data0.Rows[i]["seq"].ToString(),
step_code = data0.Rows[i]["step_code"].ToString(),
route_code = data0.Rows[i]["default_route"].ToString(),
- stepprice = decimal.Parse(data0.Rows[i]["unprice"].ToString()==""|| data0.Rows[i]["unprice"].ToString() ==null? "0":data0.Rows[i]["unprice"].ToString()),
+ stepprice = decimal.Parse(data0.Rows[i]["unprice"].ToString() == "" || data0.Rows[i]["unprice"].ToString() == null ? "0" : data0.Rows[i]["unprice"].ToString()),
plan_quantity = decimal.Parse(model.erpqty), //璁㈠崟鏁伴噺
plan_qty = decimal.Parse(model.erpqty), //璁㈠崟鏁伴噺
ratio = 0,
@@ -931,7 +931,7 @@
var total = 0; //鎬绘潯鏁�
var sql = @"select A.id, A.status,A.wotype,A.wo_code,A.materiel_code as partcode,B.partname,B.partspec,A.idTopInventory,A.TopInventoryCode,A.TopInventoryName,A.route_code,B.default_route,R.name as route_name,A.plan_qty,A.wkshp_code,C.torg_name as wkshp_name,
A.stck_code,D.name as stck_name,A.plan_startdate,A.plan_enddate,A.piroque,A.sourceid,A.m_po,A.saleOrderDeliveryDate,A.saleOrderCode,U.username as lm_user,A.lm_date,A.data_sources,A.isstep,A.clerkuser,
- B.priuserdefnvc1,B.priuserdefnvc2,B.priuserdefnvc3,B.priuserdefnvc4,B.priuserdefnvc5,B.priuserdefnvc6,A.printcount
+ B.priuserdefnvc1,B.priuserdefnvc2,B.priuserdefnvc3,B.priuserdefnvc4,B.priuserdefnvc5,B.priuserdefnvc6,A.printcount,W.memo,W.bomsubspec
from TK_Wrk_Man A
left join TKimp_Ewo W on A.m_po=W.wo and A.materiel_code=W.materiel_code and A.sbid=W.sbid
left join TMateriel_Info B on A.materiel_code=B.partcode
@@ -1019,7 +1019,7 @@
var total = 0; //鎬绘潯鏁�
var sql = @"select A.id, A.status,A.wotype,A.wo_code,A.materiel_code as partcode,B.partname,B.partspec,A.idTopInventory,A.TopInventoryCode,A.TopInventoryName,A.plan_qty,A.wkshp_code,C.torg_name as wkshp_name,
A.stck_code,D.name as stck_name,A.plan_startdate,A.plan_enddate,A.piroque,A.sourceid,A.m_po,A.saleOrderDeliveryDate,W.saleOrderCode,U.username as lm_user,A.lm_date,S.laborbad_qty,S.materielbad_qty,
- B.priuserdefnvc1,B.priuserdefnvc2,B.priuserdefnvc3,B.priuserdefnvc4,B.priuserdefnvc5,B.priuserdefnvc6
+ B.priuserdefnvc1,B.priuserdefnvc2,B.priuserdefnvc3,B.priuserdefnvc4,B.priuserdefnvc5,B.priuserdefnvc6,W.memo,W.bomsubspec
from TK_Wrk_Man A
left join TKimp_Ewo W on A.m_po=W.wo and A.materiel_code=W.materiel_code and A.sbid=W.sbid
left join (select wo_code,isnull(sum(laborbad_qty),0) as laborbad_qty,isnull(sum(materielbad_qty),0) as materielbad_qty from TK_Wrk_Step where (laborbad_qty+materielbad_qty)>0 group by wo_code) S on A.wo_code=S.wo_code
@@ -1178,7 +1178,7 @@
materiel_code = json.partcode,
route_code = route_code,
sourceid = json.sourceid == "" ? null : json.sourceid, //鏃犳簮鍗曟椂璧嬪�糔ULL
- saleOrderCode=json.saleordercode,
+ saleOrderCode = json.saleordercode,
m_po = json.sourcewo,
saleOrderDeliveryDate = json.deliverydate,
plan_startdate = json.paystartdate,
@@ -1206,7 +1206,7 @@
stepprice = json.WorkListSub[i].stepprice,
plan_quantity = json.woqty,
plan_qty = json.WorkListSub[i].sumqty,
- ratio=json.WorkListSub[i].ratio,
+ ratio = json.WorkListSub[i].ratio,
status = json.wostatus,
isbott = json.WorkListSub[i].isbott,
isend = json.WorkListSub[i].isend,
@@ -1288,7 +1288,7 @@
stepprice = json.WorkListSub[i].stepprice,
plan_quantity = json.woqty,
plan_qty = json.WorkListSub[i].sumqty,
- ratio=json.WorkListSub[i].ratio,
+ ratio = json.WorkListSub[i].ratio,
status = json.wostatus,
isbott = json.WorkListSub[i].isbott,
isend = json.WorkListSub[i].isend,
@@ -1382,7 +1382,7 @@
if (worksteplist[i].data_sources == "ERP") //鏁版嵁鏉ユ簮ERP
{
-
+
//鏌ヨ褰撳墠宸ュ崟鍙慨鏀规暟閲�=璁㈠崟鎬绘暟-宸蹭笅杈惧伐鍗曟�绘暟
sql = @"select isnull(plan_qty,0) as plan_qty from TK_Wrk_Man
where sourceid=@sourceid and m_po=@sourcewo and wo_code=@wocode";
@@ -1421,7 +1421,7 @@
// 鍚戝瓧鍏镐腑娣诲姞鏁版嵁
dict.Add("canupdate_qty", canupdate_qty);
- dict.Add("stepdata", data1);
+ dict.Add("stepdata", data1);
// 灏嗗瓧鍏告坊鍔犲埌鍒楄〃涓�
dir.Add(dict);
mes.code = "200";
@@ -1478,7 +1478,7 @@
materiel_code = json[i].partcode,
route_code = route_code,
sourceid = json[i].sourceid == "" ? null : json[i].sourceid, //鏃犳簮鍗曟椂璧嬪�糔ULL
- saleOrderCode=json[i].saleordercode,
+ saleOrderCode = json[i].saleordercode,
m_po = json[i].sourcewo,
saleOrderDeliveryDate = json[i].deliverydate,
plan_startdate = json[i].paystartdate,
@@ -1506,7 +1506,7 @@
stepprice = json[i].WorkListSub[j].stepprice,
plan_quantity = json[i].woqty,
plan_qty = json[i].WorkListSub[j].sumqty,
- ratio=json[i].WorkListSub[j].ratio,
+ ratio = json[i].WorkListSub[j].ratio,
status = json[i].wostatus,
isbott = json[i].WorkListSub[j].isbott,
isend = json[i].WorkListSub[j].isend,
@@ -1555,7 +1555,7 @@
materiel_code = json[i].partcode,
route_code = route_code,
sourceid = json[i].sourceid == "" ? null : json[i].sourceid, //鏃犳簮鍗曟椂璧嬪�糔ULL
- saleOrderCode=json[i].saleordercode,
+ saleOrderCode = json[i].saleordercode,
m_po = json[i].sourcewo,
saleOrderDeliveryDate = json[i].deliverydate,
plan_startdate = json[i].paystartdate,
@@ -1592,7 +1592,7 @@
stepprice = json[i].WorkListSub[j].stepprice,
plan_quantity = json[i].woqty,
plan_qty = json[i].WorkListSub[j].sumqty,
- ratio=json[i].WorkListSub[j].ratio,
+ ratio = json[i].WorkListSub[j].ratio,
status = json[i].wostatus,
isbott = json[i].WorkListSub[j].isbott,
isend = json[i].WorkListSub[j].isend,
@@ -2034,8 +2034,8 @@
{
wocode = wocodelist,
status = "ALLO",
- distributionuser=us.usercode,
- distributiontime= DateTime.Now.ToString()
+ distributionuser = us.usercode,
+ distributiontime = DateTime.Now.ToString()
}
});
//鏇存柊宸ュ簭浠诲姟琛ㄧ姸鎬�
@@ -2276,7 +2276,7 @@
#region[鐢熶骇寮�鎶ュ伐鎵爜鑾峰彇宸ュ崟瀵瑰簲宸ュ簭浠诲姟(鑷埗)]
- public static ToMessage MesOrderStepSearch(string wkshopcode, string wocode,string orderno,string saorderno, string partcode, string partname, string partspec, int startNum, int endNum, string prop, string order)
+ public static ToMessage MesOrderStepSearch(string wkshopcode, string wocode, string orderno, string saorderno, string partcode, string partname, string partspec, int startNum, int endNum, string prop, string order)
{
var sql = "";
string search = "";
@@ -2389,7 +2389,7 @@
#endregion
#region[鐢熶骇寮�鎶ュ伐鎵爜鑾峰彇宸ュ崟瀵瑰簲宸ュ簭浠诲姟(澶栧崗)]
- public static ToMessage MesOrderWxStepSearch(string wkshopcode, string wocode, string orderno,string saorderno, string partcode, string partname, string partspec, int startNum, int endNum, string prop, string order)
+ public static ToMessage MesOrderWxStepSearch(string wkshopcode, string wocode, string orderno, string saorderno, string partcode, string partname, string partspec, int startNum, int endNum, string prop, string order)
{
var sql = "";
string search = "";
@@ -2505,7 +2505,7 @@
#endregion
#region[鐢熶骇寮�鎶ュ伐鎵爜鑾峰彇宸ュ崟瀵瑰簲宸ュ簭浠诲姟(涓嶈壇)]
- public static ToMessage MesOrderNgStepSearch(string wkshopcode, string wocode, string orderno,string saorderno, string partcode, string partname, string partspec, int startNum, int endNum, string prop, string order)
+ public static ToMessage MesOrderNgStepSearch(string wkshopcode, string wocode, string orderno, string saorderno, string partcode, string partname, string partspec, int startNum, int endNum, string prop, string order)
{
var sql = "";
string search = "";
@@ -2647,7 +2647,7 @@
rt.stepname = data.Rows[0]["stepname"].ToString(); //宸ュ簭鍚嶇О
rt.stepdesc = data.Rows[0]["descr"].ToString(); //宸ュ簭鎻忚堪
rt.planqty = decimal.Parse(data.Rows[0]["plan_qty"].ToString()); //浠诲姟瓒呬骇鎬绘暟閲�
- rt.planquantity= decimal.Parse(data.Rows[0]["plan_quantity"].ToString()); //浠诲姟鏁伴噺
+ rt.planquantity = decimal.Parse(data.Rows[0]["plan_quantity"].ToString()); //浠诲姟鏁伴噺
rt.noreportqty = decimal.Parse(data.Rows[0]["good_qty"].ToString()); //鎶ュ伐鏁伴噺
rt.noputqty = decimal.Parse(data.Rows[0]["ng_qty"].ToString()); //涓嶈壇鏁伴噺
string isend = data.Rows[0]["isend"].ToString();//鏈亾宸ュ簭
@@ -2741,7 +2741,7 @@
else //涓嶆寜搴忔敹鍙戞枡
{
mes = ScanStartReport.NoWXEncodingSeach(SelectType, wocode, stepcode);
- }
+ }
break;
default:
break;
@@ -2759,7 +2759,7 @@
#endregion
#region[鐢熶骇寮�鎶ュ伐,鎶ュ伐鎻愪氦]
- public static ToMessage SavaMesOrderStepReport(string mesordercode, string partcode, string stepseq, string stepcode, string stepprice, string eqpcode, string inbarcode, string reckway, string usergroupcode, string reportuser,string payrate, string taskqty, string startqty, string reportqty, List<ReportDefectList> defectobjs, string remarks, User us)
+ public static ToMessage SavaMesOrderStepReport(string mesordercode, string partcode, string stepseq, string stepcode, string stepprice, string eqpcode, string inbarcode, string reckway, string usergroupcode, string reportuser, string payrate, string taskqty, string startqty, string reportqty, List<ReportDefectList> defectobjs, string remarks, User us)
{
var sql = "";
decimal ngqty = 0;
@@ -2865,7 +2865,7 @@
{
m_id = int.Parse(dt.Rows[0]["ID"].ToString()),
eqp_code = eqpcode,
- payrate= payrate,
+ payrate = payrate,
report_person = reportuser,
report_date = date,
report_qty = reportqty,
@@ -2883,9 +2883,9 @@
//鍐欏叆缂洪櫡璁板綍琛�
for (int i = 0; i < groupedItems.Count; i++)
{
- sql = @"insert into CSR_WorkRecord_Defect(record_id,wo_code,partnumber,step_seq,step_code,defect_qty,defect_pendqty,defect_code,remarks,style,lm_user,lm_date)
- values(@record_id,@wo_code,@partcode,@stepseq,@stepcode,@ngqty,@defect_pendqty,@defect_code,@remarks,@style,@lm_user,@lm_date)";
- list.Add(new { str = sql, parm = new { record_id = int.Parse(dt.Rows[0]["ID"].ToString()), wo_code = mesordercode, partcode = partcode, stepseq = stepseq, stepcode = stepcode, ngqty = groupedItems[i].badqty, defect_pendqty = groupedItems[i].badqty, defect_code = groupedItems[i].defect_code, remarks = remarks, style = "B", lm_user = us.usercode, lm_date = date } });
+ sql = @"insert into CSR_WorkRecord_Defect(record_id,wo_code,partnumber,step_seq,step_code,defect_qty,defect_pendqty,defect_code,report_person,usergroup_code,remarks,style,lm_user,lm_date)
+ values(@record_id,@wo_code,@partcode,@stepseq,@stepcode,@ngqty,@defect_pendqty,@defect_code,@report_person,@usergroup_code,@remarks,@style,@lm_user,@lm_date)";
+ list.Add(new { str = sql, parm = new { record_id = int.Parse(dt.Rows[0]["ID"].ToString()), wo_code = mesordercode, partcode = partcode, stepseq = stepseq, stepcode = stepcode, ngqty = groupedItems[i].badqty, defect_pendqty = groupedItems[i].badqty, defect_code = groupedItems[i].defect_code,report_person=reportuser,usergroup_code= usergroupcode, remarks = remarks, style = "B", lm_user = us.usercode, lm_date = date } });
}
}
@@ -2910,7 +2910,7 @@
{
m_id = int.Parse(dt.Rows[0]["ID"].ToString()),
eqp_code = eqpcode,
- payrate= payrate,
+ payrate = payrate,
report_person = reportuser,
report_date = date,
report_qty = reportqty,
@@ -2928,9 +2928,9 @@
//鍐欏叆缂洪櫡璁板綍琛�
for (int i = 0; i < groupedItems.Count; i++)
{
- sql = @"insert into CSR_WorkRecord_Defect(record_id,wo_code,partnumber,step_seq,step_code,defect_qty,defect_pendqty,defect_code,remarks,style,lm_user,lm_date)
- values(@record_id,@wo_code,@partcode,@stepseq,@stepcode,@ngqty,@defect_pendqty,@defect_code,@remarks,@style,@lm_user,@lm_date)";
- list.Add(new { str = sql, parm = new { record_id = int.Parse(dt.Rows[0]["ID"].ToString()), wo_code = mesordercode, partcode = partcode, stepseq = stepseq, stepcode = stepcode, ngqty = groupedItems[i].badqty, defect_pendqty = groupedItems[i].badqty, defect_code = groupedItems[i].defect_code, remarks = remarks, style = "B", lm_user = us.usercode, lm_date = date } });
+ sql = @"insert into CSR_WorkRecord_Defect(record_id,wo_code,partnumber,step_seq,step_code,defect_qty,defect_pendqty,defect_code,report_person,usergroup_code,remarks,style,lm_user,lm_date)
+ values(@record_id,@wo_code,@partcode,@stepseq,@stepcode,@ngqty,@defect_pendqty,@defect_code,@report_person,@usergroup_code,@remarks,@style,@lm_user,@lm_date)";
+ list.Add(new { str = sql, parm = new { record_id = int.Parse(dt.Rows[0]["ID"].ToString()), wo_code = mesordercode, partcode = partcode, stepseq = stepseq, stepcode = stepcode, ngqty = groupedItems[i].badqty, defect_pendqty = groupedItems[i].badqty, defect_code = groupedItems[i].defect_code, report_person=reportuser, usergroup_code =usergroupcode, remarks = remarks, style = "B", lm_user = us.usercode, lm_date = date } });
}
}
@@ -3160,9 +3160,9 @@
//鍐欏叆缂洪櫡璁板綍琛�
for (int i = 0; i < groupedItems.Count; i++)
{
- sql = @"insert into CSR_WorkRecord_Defect(record_id,wo_code,partnumber,step_seq,step_code,defect_qty,defect_pendqty,defect_code,remarks,style,lm_user,lm_date)
- values(@record_id,@wo_code,@partcode,@stepseq,@stepcode,@ngqty,@defect_pendqty,@defect_code,@remarks,@style,@lm_user,@lm_date)";
- list.Add(new { str = sql, parm = new { record_id = int.Parse(dt.Rows[0]["ID"].ToString()), wo_code = mesordercode, partcode = partcode, stepseq = stepseq, stepcode = stepcode, ngqty = groupedItems[i].badqty, defect_pendqty = groupedItems[i].badqty, defect_code = groupedItems[i].defect_code, remarks = remarks, style = "S", lm_user = us.usercode, lm_date = date } });
+ sql = @"insert into CSR_WorkRecord_Defect(record_id,wo_code,partnumber,step_seq,step_code,defect_qty,defect_pendqty,defect_code,report_person,remarks,style,lm_user,lm_date)
+ values(@record_id,@wo_code,@partcode,@stepseq,@stepcode,@ngqty,@defect_pendqty,@defect_code,@report_person,@remarks,@style,@lm_user,@lm_date)";
+ list.Add(new { str = sql, parm = new { record_id = int.Parse(dt.Rows[0]["ID"].ToString()), wo_code = mesordercode, partcode = partcode, stepseq = stepseq, stepcode = stepcode, ngqty = groupedItems[i].badqty, defect_pendqty = groupedItems[i].badqty, defect_code = groupedItems[i].defect_code, report_person=inuser, remarks = remarks, style = "S", lm_user = us.usercode, lm_date = date } });
}
}
@@ -3187,9 +3187,9 @@
//鍐欏叆缂洪櫡璁板綍琛�
for (int i = 0; i < groupedItems.Count; i++)
{
- sql = @"insert into CSR_WorkRecord_Defect(record_id,wo_code,partnumber,step_seq,step_code,defect_qty,defect_pendqty,defect_code,remarks,style,lm_user,lm_date)
- values(@record_id,@wo_code,@partcode,@stepseq,@stepcode,@ngqty,@defect_pendqty,@defect_code,@remarks,@style,@lm_user,@lm_date)";
- list.Add(new { str = sql, parm = new { record_id = int.Parse(dt.Rows[0]["ID"].ToString()), wo_code = mesordercode, partcode = partcode, stepseq = stepseq, stepcode = stepcode, ngqty = groupedItems[i].badqty, defect_pendqty = groupedItems[i].badqty, defect_code = groupedItems[i].defect_code, remarks = remarks, style = "S", lm_user = us.usercode, lm_date = date } });
+ sql = @"insert into CSR_WorkRecord_Defect(record_id,wo_code,partnumber,step_seq,step_code,defect_qty,defect_pendqty,defect_code,report_person,remarks,style,lm_user,lm_date)
+ values(@record_id,@wo_code,@partcode,@stepseq,@stepcode,@ngqty,@defect_pendqty,@defect_code,@report_person,@remarks,@style,@lm_user,@lm_date)";
+ list.Add(new { str = sql, parm = new { record_id = int.Parse(dt.Rows[0]["ID"].ToString()), wo_code = mesordercode, partcode = partcode, stepseq = stepseq, stepcode = stepcode, ngqty = groupedItems[i].badqty, defect_pendqty = groupedItems[i].badqty, defect_code = groupedItems[i].defect_code, report_person=inuser, remarks = remarks, style = "S", lm_user = us.usercode, lm_date = date } });
}
}
@@ -3509,7 +3509,7 @@
#region[鐢熶骇鎵ц,鎶ュ伐璋冩暣鏁版嵁鏌ヨ鎺ュ彛]
- public static ToMessage MesOrderStepVerifySearch(string wkshopcode, string wo_code,string orderno,string saorderno, string partnumber, string partname, string partspec,string stepcode, string reportuser, string reportdateopendate, string reportdateclosedate, int startNum, int endNum, string prop, string order)
+ public static ToMessage MesOrderStepVerifySearch(string wkshopcode, string wo_code, string orderno, string saorderno, string partnumber, string partname, string partspec, string stepcode, string reportuser, string reportdateopendate, string reportdateclosedate, int startNum, int endNum, string prop, string order)
{
var dynamicParams = new DynamicParameters();
string search = "";
@@ -4217,7 +4217,7 @@
}
}
}
- }
+ }
}
}
else //涓嶆寜搴�
@@ -4225,10 +4225,10 @@
//鎺у埗閫昏緫锛氬綋鍓嶅伐搴忔姤宸ヨ皟鏁�-> (鏈亾宸ュ簭褰撳墠璋冩暣鍚堟牸鏁�+鏈亾宸ュ簭闈炲綋鍓嶆姤宸ュ悎鏍兼�绘暟)<涓嬮亾宸ュ簭鎶ュ伐鎬绘暟(鍚堟牸+涓嶈壇+鎶ュ簾) ==涓嶈兘灏忎簬涓嬮亾鎶ュ伐鎬绘暟
list.Clear();
//鍒ゆ柇褰撳墠宸ュ簭鏄嚜鍒跺伐搴忚繕鏄鍗忓伐搴�
- if (json[0].flw_type.ToString() == "Z")
+ if (json[0].flw_type.ToString() == "Z")
{
-
- //鏌ヨ褰撳墠鎶ュ伐宸ュ簭闈炴娆℃姤宸ワ細鎬绘姤宸ユ暟閲忋�佹�讳笉鑹暟閲忋�佹�诲伐搴熸暟閲忋�佹�绘枡搴熸暟閲�
+
+ //鏌ヨ褰撳墠鎶ュ伐宸ュ簭闈炴娆℃姤宸ワ細鎬绘姤宸ユ暟閲忋�佹�讳笉鑹暟閲忋�佹�诲伐搴熸暟閲忋�佹�绘枡搴熸暟閲�
sql = @"select isnull(sum(good_qty),0) as good_qty,isnull(sum(ng_qty),0) as ng_qty,isnull(sum(laborbad_qty),0) as laborbad_qty,isnull(sum(materielbad_qty),0) as materielbad_qty
from TK_Wrk_Record where wo_code=@wo_code and style='B' and id<>@id and step_code=@step_code";
dynamicParams.Add("@wo_code", json[0].wo_code);
@@ -4250,7 +4250,7 @@
return mes;
}
}
- if (json[0].flw_type.ToString() == "W")
+ if (json[0].flw_type.ToString() == "W")
{
//鑾峰彇褰撳墠宸ュ簭銆佷緵搴斿晢瀵瑰簲鐨勬�诲彂鏂欐暟閲�
sql = @"select isnull(sum(fqty),0) as fqty
@@ -4272,7 +4272,7 @@
decimal notthis_ngqty = decimal.Parse(dt.Rows[0]["ng_qty"].ToString()); //褰撳墠鏈亾宸ュ簭闈炴湰娆℃姤宸ユ�绘暟
decimal notthis_laborbad_qty = decimal.Parse(dt.Rows[0]["laborbad_qty"].ToString()); //褰撳墠鏈亾宸ュ簭闈炴湰娆℃姤宸ュ伐搴熸�绘暟
decimal notthis_materielbad_qty = decimal.Parse(dt.Rows[0]["materielbad_qty"].ToString()); //褰撳墠鏈亾宸ュ簭闈炴湰娆℃姤宸ユ枡搴熸�绘暟
- //鑾峰彇褰撳墠鏈亾宸ュ簭鏀舵枡鎬绘暟閲忥細鏈淇敼鏀舵枡鏁伴噺+鏈淇敼涓嶈壇鏁伴噺+鏈淇敼宸ュ簾鏁伴噺+鏈淇敼鎶ュ伐鏂欏簾鏁伴噺+褰撳墠宸ュ簭闈炴湰娆℃敹鏂欐�绘暟+褰撳墠宸ュ簭闈炴湰娆′笉鑹�绘暟+褰撳墠宸ュ簭闈炴湰娆″伐搴熸�绘暟+褰撳墠宸ュ簭闈炴湰娆℃枡搴熸�绘暟
+ //鑾峰彇褰撳墠鏈亾宸ュ簭鏀舵枡鎬绘暟閲忥細鏈淇敼鏀舵枡鏁伴噺+鏈淇敼涓嶈壇鏁伴噺+鏈淇敼宸ュ簾鏁伴噺+鏈淇敼鎶ュ伐鏂欏簾鏁伴噺+褰撳墠宸ュ簭闈炴湰娆℃敹鏂欐�绘暟+褰撳墠宸ュ簭闈炴湰娆′笉鑹�绘暟+褰撳墠宸ュ簭闈炴湰娆″伐搴熸�绘暟+褰撳墠宸ュ簭闈炴湰娆℃枡搴熸�绘暟
decimal updatereportsumqty = this_reportqty + this_ngqty + this_laborbadqty + this_materielbadqty + notthis_reportqty + notthis_ngqty + notthis_laborbad_qty + notthis_materielbad_qty;
//鍒ゆ柇褰撳墠宸ュ簭渚涘簲鍟嗘敹鏂欐�绘暟>褰撳墠宸ュ簭渚涘簲鍟嗗搴斿彂鏂欐暟閲�
if (updatereportsumqty > decimal.Parse(dt_0.Rows[0]["fqty"].ToString()))
@@ -4293,7 +4293,7 @@
//鍥炲啓瀵瑰簲鐨勬姤宸ヨ褰曞瓙琛ㄥ悎鏍兼暟閲忋�佷笉鑹暟閲忋�佹姤搴熸暟閲�
sql = @"update TK_Wrk_RecordSub set report_qty=report_qty+@repair_qty,ng_qty=ng_qty+@ng_qty,laborbad_qty=laborbad_qty+@laborbad_qty,materielbad_qty=materielbad_qty+@materielbad_qty,
- updatereportuser=@updatereportuser,updatereportdate=@updatereportdate
+ report_person=@report_person,usergroup_code=@usergroup_code,updatereportuser=@updatereportuser,updatereportdate=@updatereportdate
where m_id=@m_id and id=@id and style='B'";
list.Add(new
{
@@ -4307,6 +4307,8 @@
laborbad_qty = this_laborbad_dvalue,
materielbad_qty = this_materielbad_dvalue,
//bad_money = decimal.Parse(json[i].badmoney_dvalue),
+ report_person = json[0].usercode,
+ usergroup_code = json[0].groupcode,
updatereportuser = us.usercode,
updatereportdate = date
}
@@ -4320,7 +4322,7 @@
str = sql,
parm = new
{
- step_price=decimal.Parse(json[0].unprice),
+ step_price = decimal.Parse(json[0].unprice),
good_qty = decimal.Parse(json[0].report_dvalue),
ng_qty = this_ng_dvalue,
laborbad_qty = this_laborbad_dvalue,
@@ -4353,7 +4355,7 @@
{
//鍥炲啓涓嶈壇
sql = @"update CSR_WorkRecord_Defect set defect_qty=defect_qty+@ng_qty,defect_pendqty=defect_pendqty+@ng_qty,laborbad_qty=laborbad_qty+@laborbad_qty,materielbad_qty=materielbad_qty+@materielbad_qty,
- updatereportuser=@updatereportuser,updatereportdate=@updatereportdate
+ report_person=@report_person,usergroup_code=@usergroup_code,updatereportuser=@updatereportuser,updatereportdate=@updatereportdate
where wo_code=@wo_code and step_code=@step_code and id=@ng_id and record_id=@record_id and style='B'";
list.Add(new
{
@@ -4367,6 +4369,8 @@
step_code = json[0].step_code,
ng_id = int.Parse(json[0].children[i].ng_id),
record_id = json[0].id,
+ report_person = json[0].usercode,
+ usergroup_code = json[0].groupcode,
updatereportuser = us.usercode,
updatereportdate = date
}
@@ -4395,7 +4399,7 @@
//鍥炲啓瀵瑰簲鐨勫鍗忚褰曞瓙琛ㄦ敹鏂欐暟閲忋�佷笉鑹暟閲忋�佹姤搴熸暟閲�
sql = @"update TK_Wrk_OutRecordSub set sqty=sqty+@repair_qty,ng_qty=ng_qty+@ng_qty,laborbad_qty=laborbad_qty+@laborbad_qty,materielbad_qty=materielbad_qty+@materielbad_qty,
- updatereportuser=@updatereportuser,updatereportdate=@updatereportdate
+ out_person=@out_person,updatereportuser=@updatereportuser,updatereportdate=@updatereportdate
where m_id=@m_id and id=@id and style='S' and wx_code=@wx_code";
list.Add(new
{
@@ -4410,6 +4414,7 @@
materielbad_qty = this_materielbad_dvalue,
wx_code = json[0].wxcode,
//bad_money = decimal.Parse(json[i].badmoney_dvalue),
+ out_person = json[0].usercode,
updatereportuser = us.usercode,
updatereportdate = date
}
@@ -4423,7 +4428,7 @@
str = sql,
parm = new
{
- step_price=decimal.Parse(json[0].unprice),
+ step_price = decimal.Parse(json[0].unprice),
good_qty = decimal.Parse(json[0].report_dvalue),
ng_qty = this_ng_dvalue,
laborbad_qty = this_laborbad_dvalue,
@@ -4457,7 +4462,7 @@
{
//鍥炲啓涓嶈壇
sql = @"update CSR_WorkRecord_Defect set defect_qty=defect_qty+@ng_qty,defect_pendqty=defect_pendqty+@ng_qty,laborbad_qty=laborbad_qty+@laborbad_qty,materielbad_qty=materielbad_qty+@materielbad_qty,
- updatereportuser=@updatereportuser,updatereportdate=@updatereportdate
+ report_person=@report_person,usergroup_code=@usergroup_code,updatereportuser=@updatereportuser,updatereportdate=@updatereportdate
where wo_code=@wo_code and step_code=@step_code and id=@ng_id and record_id=@record_id and style='S'";
list.Add(new
{
@@ -4471,6 +4476,8 @@
step_code = json[0].step_code,
ng_id = int.Parse(json[0].children[i].ng_id),
record_id = json[0].id,
+ report_person = json[0].usercode,
+ usergroup_code = json[0].groupcode,
updatereportuser = us.usercode,
updatereportdate = date
}
@@ -4606,7 +4613,7 @@
if (aa)
{
//鍐欏叆鎿嶄綔璁板綍琛�
- LogHelper.DbOperateLog(us.usercode, "鎵归噺淇敼宸ヤ环", "鎶ュ伐ID:" + string.Join(",",json.Select(bp => bp.id).ToArray())+",鎿嶄綔绫诲瀷:"+ string.Join(",", json.Select(bp => bp.type).ToArray()), us.usertype);
+ LogHelper.DbOperateLog(us.usercode, "鎵归噺淇敼宸ヤ环", "鎶ュ伐ID:" + string.Join(",", json.Select(bp => bp.id).ToArray()) + ",鎿嶄綔绫诲瀷:" + string.Join(",", json.Select(bp => bp.type).ToArray()), us.usertype);
mes.code = "200";
mes.count = 0;
mes.message = "鎿嶄綔鎴愬姛!";
@@ -4620,7 +4627,7 @@
mes.data = null;
}
}
- else
+ else
{
mes.code = "300";
mes.count = 0;
@@ -4641,7 +4648,7 @@
#region[鐢熶骇鎵ц,鎶ュ伐瀹℃牳鍒楄〃鏁版嵁鏌ヨ鎺ュ彛]
- public static ToMessage MesOrderStepReportVerifySearch(string reviewstatus, string wkshopcode, string wo_code, string orderno,string saorderno, string partnumber, string partname, string partspec, string stepname, string reportuser, string reportdateopendate, string reportdateclosedate, int startNum, int endNum, string prop, string order)
+ public static ToMessage MesOrderStepReportVerifySearch(string reviewstatus, string wkshopcode, string wo_code, string orderno, string saorderno, string partnumber, string partname, string partspec, string stepname, string reportuser, string reportdateopendate, string reportdateclosedate, int startNum, int endNum, string prop, string order)
{
var dynamicParams = new DynamicParameters();
string search = "";
diff --git a/VueWebCoreApi/Quartz/HttpManager.cs b/VueWebCoreApi/Quartz/HttpManager.cs
index f1f9c4a..af2f55d 100644
--- a/VueWebCoreApi/Quartz/HttpManager.cs
+++ b/VueWebCoreApi/Quartz/HttpManager.cs
@@ -4,6 +4,7 @@
using System.Linq;
using System.Net.Http;
using System.Net.Http.Headers;
+using System.Text;
using System.Threading.Tasks;
namespace VueWebCoreApi.Quartz
@@ -12,62 +13,182 @@
{
public static string GetUserIP(IHttpContextAccessor httpContextAccessor)
{
- var Request = httpContextAccessor.HttpContext.Request;
- string realIP = null;
- string forwarded = null;
- string remoteIpAddress = httpContextAccessor.HttpContext.Connection.RemoteIpAddress.ToString();
- if (Request.Headers.ContainsKey("X-Real-IP"))
+ if (httpContextAccessor?.HttpContext == null)
+ return string.Empty;
+
+ var request = httpContextAccessor.HttpContext.Request;
+ string remoteIpAddress = httpContextAccessor.HttpContext.Connection.RemoteIpAddress?.ToString() ?? string.Empty;
+
+ if (request.Headers.ContainsKey("X-Real-IP"))
{
- realIP = Request.Headers["X-Real-IP"].ToString();
- if (realIP != remoteIpAddress)
+ var realIp = request.Headers["X-Real-IP"].ToString();
+ if (!string.IsNullOrEmpty(realIp) && realIp != remoteIpAddress)
{
- remoteIpAddress = realIP;
+ remoteIpAddress = realIp;
}
}
- if (Request.Headers.ContainsKey("X-Forwarded-For"))
+
+ if (request.Headers.ContainsKey("X-Forwarded-For"))
{
- forwarded = Request.Headers["X-Forwarded-For"].ToString();
- if (forwarded != remoteIpAddress)
+ var forwarded = request.Headers["X-Forwarded-For"].ToString();
+ if (!string.IsNullOrEmpty(forwarded) && forwarded != remoteIpAddress)
{
remoteIpAddress = forwarded;
}
}
+
return remoteIpAddress;
}
-
-
- public static async Task<string> HttpSendAsync(this IHttpClientFactory httpClientFactory, HttpMethod method, string url, Dictionary<string, string> headers = null)
+ public static async Task<string> HttpSendAsyncString(this IHttpClientFactory httpClientFactory, HttpMethod method, string url, string parameters = null, Dictionary<string, string> headers = null)
{
+ if (httpClientFactory == null)
+ throw new ArgumentNullException(nameof(httpClientFactory));
+ if (method == null)
+ throw new ArgumentNullException(nameof(method));
+ if (string.IsNullOrEmpty(url))
+ throw new ArgumentNullException(nameof(url));
var client = httpClientFactory.CreateClient();
- var content = new StringContent("");
- //content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
- //content.Headers.ContentType.CharSet = "utf-8";
- var request = new HttpRequestMessage(method, url)
- {
- Content = content
- };
- if (headers != null)
- {
- foreach (var header in headers)
- {
- request.Headers.Add(header.Key, header.Value);
- }
- }
+ string finalUrl = url;
+ HttpContent content = new StringContent("");
+
try
{
- HttpResponseMessage httpResponseMessage = await client.SendAsync(request);
+ // ====================== GET 璇锋眰锛氭嫾鎺ュ弬鏁板埌 URL ======================
+ if (method == HttpMethod.Get && !string.IsNullOrWhiteSpace(parameters))
+ {
+ finalUrl = url.Contains("?")
+ ? $"{url}&{parameters}"
+ : $"{url}?{parameters}";
+ }
- var result = await httpResponseMessage.Content
- .ReadAsStringAsync();
- return result;
+ // ====================== POST 璇锋眰锛氬弬鏁版斁鍏� Body ======================
+ if (method == HttpMethod.Post && !string.IsNullOrWhiteSpace(parameters))
+ {
+ content = new StringContent(
+ parameters,
+ System.Text.Encoding.UTF8,
+ "application/x-www-form-urlencoded");
+ }
+
+ var request = new HttpRequestMessage(method, finalUrl) { Content = content };
+
+ // 杩藉姞璇锋眰澶�
+ if (headers != null)
+ {
+ foreach (var header in headers)
+ {
+ if (!request.Headers.TryAddWithoutValidation(header.Key, header.Value))
+ {
+ content.Headers.TryAddWithoutValidation(header.Key, header.Value);
+ }
+ }
+ }
+
+ using (var response = await client.SendAsync(request))
+ {
+ response.EnsureSuccessStatusCode();
+ return await response.Content.ReadAsStringAsync();
+ }
}
catch (Exception ex)
{
- Console.WriteLine(ex.Message);
- return ex.Message;
+ return $"璇锋眰澶辫触锛歿ex.Message}";
}
}
+
+ public static async Task<HttpResult> HttpSendAsync(this IHttpClientFactory httpClientFactory,HttpMethod method,string url,string parameters = null,Dictionary<string, string> headers = null)
+ {
+ if (httpClientFactory == null)
+ throw new ArgumentNullException(nameof(httpClientFactory));
+ if (method == null)
+ throw new ArgumentNullException(nameof(method));
+ if (string.IsNullOrEmpty(url))
+ throw new ArgumentNullException(nameof(url));
+
+ var client = httpClientFactory.CreateClient();
+ string finalUrl = url;
+ HttpContent content = new StringContent("");
+
+ try
+ {
+ // GET 鎷兼帴鍙傛暟
+ if (method == HttpMethod.Get && !string.IsNullOrWhiteSpace(parameters))
+ {
+ finalUrl = url.Contains("?") ? $"{url}&{parameters}" : $"{url}?{parameters}";
+ }
+
+ // POST 澶勭悊鍙傛暟
+ if (method == HttpMethod.Post && !string.IsNullOrWhiteSpace(parameters))
+ {
+ content = new StringContent(parameters, Encoding.UTF8, "application/x-www-form-urlencoded");
+ }
+
+ var request = new HttpRequestMessage(method, finalUrl) { Content = content };
+
+ // 璇锋眰澶�
+ if (headers != null)
+ {
+ foreach (var header in headers)
+ {
+ if (!request.Headers.TryAddWithoutValidation(header.Key, header.Value))
+ {
+ content.Headers.TryAddWithoutValidation(header.Key, header.Value);
+ }
+ }
+ }
+
+ using (var response = await client.SendAsync(request))
+ {
+ // 璇诲彇杩斿洖鍐呭
+ string responseContent = await response.Content.ReadAsStringAsync();
+
+ return new HttpResult
+ {
+ IsSuccess = response.IsSuccessStatusCode, // 鏄惁鎴愬姛
+ StatusCode = (int)response.StatusCode, // 鐘舵�佺爜 200/404/500
+ Content = responseContent, // 杩斿洖鍐呭
+ ErrorMsg = response.IsSuccessStatusCode ? "" : $"HTTP璇锋眰澶辫触锛岀姸鎬佺爜锛歿(int)response.StatusCode}"
+ };
+ }
+ }
+ catch (Exception ex)
+ {
+ // 缃戠粶寮傚父銆佽秴鏃剁瓑
+ return new HttpResult
+ {
+ IsSuccess = false,
+ StatusCode = 0, // 缃戠粶寮傚父鐘舵�佺爜璁句负0
+ Content = "",
+ ErrorMsg = ex.Message
+ };
+ }
+ }
+ /// <summary>
+ /// HTTP 璇锋眰缁熶竴杩斿洖妯″瀷
+ /// </summary>
+ public class HttpResult
+ {
+ /// <summary>
+ /// 鏄惁璇锋眰鎴愬姛锛�200-299锛�
+ /// </summary>
+ public bool IsSuccess { get; set; }
+
+ /// <summary>
+ /// HTTP 鐘舵�佺爜锛堟暟瀛楋細200,404,500锛�
+ /// </summary>
+ public int StatusCode { get; set; }
+
+ /// <summary>
+ /// 杩斿洖鍐呭
+ /// </summary>
+ public string Content { get; set; }
+
+ /// <summary>
+ /// 閿欒淇℃伅
+ /// </summary>
+ public string ErrorMsg { get; set; }
+ }
}
}
diff --git a/VueWebCoreApi/Quartz/HttpResultfulJob.cs b/VueWebCoreApi/Quartz/HttpResultfulJob.cs
index c3aa4e5..5fecec2 100644
--- a/VueWebCoreApi/Quartz/HttpResultfulJob.cs
+++ b/VueWebCoreApi/Quartz/HttpResultfulJob.cs
@@ -12,83 +12,157 @@
using VueWebCoreApi.Extensions;
using VueWebCoreApi.SignalR;
using VueWebCoreApi.Tools;
+using static VueWebCoreApi.Quartz.HttpManager;
namespace VueWebCoreApi.Quartz
{
+ /// <summary>
+ /// 瀹氭椂浠诲姟鎵ц绫伙細Quartz鍒版椂闂村悗锛岃嚜鍔ㄨ繍琛岃繖涓被鐨凟xecute鏂规硶
+ /// 浣滅敤锛氬彂閫丠TTP璇锋眰銆佽褰曚换鍔℃棩蹇椼�佹帹閫佹墽琛岀粨鏋�
+ /// </summary>
public class HttpResultfulJob : IJob
{
- private ILog log = LogManager.GetLogger(Startup.repository.Name, typeof(ChatHub));
+ // 鏃ュ織璁板綍宸ュ叿锛坙og4net锛�
+ private readonly ILog _log = LogManager.GetLogger(Startup.repository.Name, typeof(ChatHub));
+ // SignalR 瀹炴椂鎺ㄩ�佸伐鍏凤紙缁欏墠绔帹閫佹秷鎭級
private readonly IHubContext<ChatHub, IChatClient> _hubContext;
+ // HttpClient 宸ュ巶锛氱敤浜庡彂閫� HTTP 璇锋眰
+ private readonly IHttpClientFactory _httpClientFactory;
+ // 鏁版嵁搴撲粨鍌細鐢ㄤ簬璁板綍浠诲姟杩愯鏃ュ織銆佹洿鏂版渶鍚庢墽琛屾椂闂�
+ private readonly QuartzRepository _quartzRepo;
- readonly IHttpClientFactory httpClientFactory;
/// <summary>
- /// 2020.05.31澧炲姞鏋勯�犳柟娉�
+ /// 鏋勯�犲嚱鏁帮細渚濊禆娉ㄥ叆锛堣嚜鍔ㄨ祴鍊兼墍鏈夐渶瑕佺殑鏈嶅姟锛�
/// </summary>
- /// <param name="serviceProvider"></param>
- /// <param name="httpClientFactory"></param>
- public HttpResultfulJob(IServiceProvider serviceProvider, IHttpClientFactory httpClientFactory, IHubContext<ChatHub, IChatClient> hubContext)
+ public HttpResultfulJob(IServiceProvider serviceProvider,
+ IHttpClientFactory httpClientFactory,
+ IHubContext<ChatHub, IChatClient> hubContext,
+ QuartzRepository quartzRepo)
{
- this.httpClientFactory = httpClientFactory;
+ _httpClientFactory = httpClientFactory;
_hubContext = hubContext;
- //serviceProvider.GetService()
+ _quartzRepo = quartzRepo;
}
+
+ /// <summary>
+ /// 銆愭牳蹇冩柟娉曘��
+ /// Quartz 璋冨害鍣ㄦ牴鎹� Cron 琛ㄨ揪寮忥紝鍒版椂闂村悗**鑷姩璋冪敤**杩欎釜鏂规硶
+ /// 浣滅敤锛氭墽琛屽叿浣撶殑浠诲姟閫昏緫锛堝彂閫丠TTP璇锋眰锛�
+ /// </summary>
public async Task Execute(IJobExecutionContext context)
{
- DateTime dateTime = DateTime.Now;
- TaskOptions taskOptions = context.GetTaskOptions();
- string httpMessage = "";
- AbstractTrigger trigger = (context as JobExecutionContextImpl).Trigger as AbstractTrigger;
+ // 璁板綍浠诲姟寮�濮嬫墽琛屾椂闂�
+ var beginTime = DateTime.Now;
+ // 浠� Quartz 涓婁笅鏂囪幏鍙栧綋鍓嶈鎵ц鐨勪换鍔¢厤缃紙鍚嶇О銆佸垎缁勩�乁RL銆丆ron绛夛級
+ var taskOptions = context.GetTaskOptions();
+ // 瀛樺偍 HTTP 璇锋眰杩斿洖鐨勭粨鏋滀俊鎭�
+ string httpMessage = string.Empty;
+ HttpResult result = new HttpResult();
+
+ // ==========================================
+ // 绗竴姝ワ細鏍¢獙浠诲姟鏄惁瀛樺湪
+ // ==========================================
if (taskOptions == null)
{
- FileHelper.WriteFile(FileQuartz.LogPath + trigger.Group, $"{trigger.Name}.txt", "鏈埌鎵句綔涓氭垨鍙兘琚Щ闄�", true);
+ // 濡傛灉浠诲姟涓虹┖锛岃褰曢敊璇棩蹇楀埌鏁版嵁搴�
+ var trigger = context.Trigger;
+ await _quartzRepo.AddJobRunLogAsync(trigger.Key.Name, trigger.Key.Group, beginTime, DateTime.Now, "鏈壘鍒颁綔涓氭垨鍙兘琚Щ闄�", taskOptions.MessagePush, taskOptions.PushUserCode);
return;
}
- Console.WriteLine($"浣滀笟[{taskOptions.TaskName}]寮�濮�:{ DateTime.Now.ToString("yyyy-MM-dd HH:mm:sss")}");
+ // 绯荤粺鏃ュ織杈撳嚭锛氫换鍔″紑濮嬫墽琛�
+ _log.Info($"浣滀笟[{taskOptions.TaskName}]寮�濮�:{beginTime:yyyy-MM-dd HH:mm:ss}");
+
+ // ==========================================
+ // 绗簩姝ワ細鏍¢獙浠诲姟鏄惁閰嶇疆浜嗚姹傚湴鍧�
+ // ==========================================
if (string.IsNullOrEmpty(taskOptions.ApiUrl) || taskOptions.ApiUrl == "/")
{
- FileHelper.WriteFile(FileQuartz.LogPath + trigger.Group, $"{trigger.Name}.txt", $"{ DateTime.Now.ToString("yyyy-MM-dd HH:mm:sss")}鏈厤缃畊rl,", true);
+ // 鏈厤缃瓵PI鍦板潃锛岃褰曟棩蹇�
+ await _quartzRepo.AddJobRunLogAsync(taskOptions.TaskName, taskOptions.GroupName, beginTime, DateTime.Now, "鏈厤缃甎RL", taskOptions.MessagePush, taskOptions.PushUserCode);
return;
}
-
+ // ==========================================
+ // 绗笁姝ワ細鍙戦�� HTTP 璇锋眰锛堟牳蹇冧笟鍔★級
+ // ==========================================
try
{
- Dictionary<string, string> header = new Dictionary<string, string>();
+ // 瀛樺偍璇锋眰澶达紙韬唤楠岃瘉淇℃伅锛�
+ var headers = new Dictionary<string, string>();
+ // 濡傛灉閰嶇疆浜� AuthKey 鍜� AuthValue锛屾坊鍔犲埌璇锋眰澶�
if (!string.IsNullOrEmpty(taskOptions.AuthKey) && !string.IsNullOrEmpty(taskOptions.AuthValue))
{
- header.Add(taskOptions.AuthKey.Trim(), taskOptions.AuthValue.Trim());
+ headers.Add(taskOptions.AuthKey.Trim(), taskOptions.AuthValue.Trim());
}
-
- httpMessage = await httpClientFactory.HttpSendAsync(taskOptions.RequestType?.ToLower() == "get" ? HttpMethod.Get : HttpMethod.Post, taskOptions.ApiUrl, header);
+ // 鍒ゆ柇璇锋眰鏂瑰紡锛欸ET 鎴� POST锛堥粯璁OST锛�
+ var method = taskOptions.RequestType?.ToLower() == "get" ? HttpMethod.Get : HttpMethod.Post;
+ // 璋冪敤宸ュ叿绫伙紝鍙戦�� HTTP 璇锋眰锛屽苟鑾峰彇杩斿洖缁撴灉
+ result = await _httpClientFactory.HttpSendAsync(method, taskOptions.ApiUrl, taskOptions.RequestParameters, headers);
}
catch (Exception ex)
{
- httpMessage = ex.Message;
+ // 濡傛灉璇锋眰寮傚父锛堢綉缁滈敊璇�佹帴鍙f姤閿欙級锛岃褰曞紓甯镐俊鎭�
+ result.ErrorMsg = ex.Message;
+ _log.Error($"浣滀笟[{taskOptions.TaskName}]鎵ц寮傚父:{ex.Message}", ex);
}
try
{
- string logContent = $"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}_{dateTime.ToString("yyyy-MM-dd HH:mm:ss")}_{(string.IsNullOrEmpty(httpMessage) ? "OK" : httpMessage)}\r\n";
- FileHelper.WriteFile(FileQuartz.LogPath + taskOptions.GroupName + "\\", $"{taskOptions.TaskName}.txt", logContent, true);
- //await _hubContext.Clients.All.SendAsync("SendMessage绯荤粺閫氱煡:"+$"鏈�鏂版秷鎭瘂DateTime.Now}");
- //await _hubContext.Clients.All.SendAll(logContent);
- //鏌ユ壘绯荤粺鐢ㄦ埛
- var sql = @"select usercode as code,username as name
- from TUser
- where is_delete='0' and enable='Y' and password='123'";
- var data = DapperHelper.selecttable(sql);
- var departmentIDs = data.AsEnumerable().Select(x => x.Field<string>("code")).ToList();//鑾峰彇鎺ㄩ�佷汉鍛樼紪鐮�
- var FindPublicBaseDic = UserIdsStore.Ids.Where(d => departmentIDs.Contains(d.Value)).Select(x => x.Key).ToList(); //鍖归厤宸茬粡鐧诲綍鐨勬帹閫佷汉鍛榗onnectionIds
- if (FindPublicBaseDic.Count > 0)
+ // 1. 鎶婃湰娆℃墽琛岃褰曞啓鍏� SQL Server 鏁版嵁搴擄紙浠诲姟杩愯鏃ュ織琛級
+ await _quartzRepo.AddJobRunLogAsync(taskOptions.TaskName, taskOptions.GroupName, beginTime, DateTime.Now,result.StatusCode==200?result.Content.ToString():result.ErrorMsg, taskOptions.MessagePush, taskOptions.PushUserCode);
+ // 2. 鏇存柊浠诲姟琛ㄤ腑鐨勩�愭渶鍚庢墽琛屾椂闂淬��
+ await _quartzRepo.UpdateTaskLastRunTimeAsync(taskOptions.TaskName, taskOptions.GroupName, beginTime);
+
+ // ==========================================
+ // 浠ヤ笅鏄� SignalR 瀹炴椂鎺ㄩ�侊紙缁欏墠绔〉闈㈠彂娑堟伅锛�
+ // ==========================================
+ //鍒ゆ柇璇锋眰鏄惁鎴愬姛
+ if (result.IsSuccess)
{
- //鎺ㄩ�佹寚瀹氱敤鎴�
- await _hubContext.Clients.Clients(FindPublicBaseDic).SendCustomUserMessage(logContent);
+ //鍐欏叆浠诲姟瀛愯〃
+ }
+ if (taskOptions.MessagePush == "N"||taskOptions.PushUserCode==null) //鏄惁闇�瑕佹帹閫�
+ {
+ _log.Info($"浣滀笟[{taskOptions.TaskName}]鏃犻渶瑕佹帹閫佺殑鐢ㄦ埛锛岃烦杩嘢ignalR鎺ㄩ��");
+ return;
+ }
+ //姝ラ2锛氭彁鍙栫敤鎴风紪鐮侊紙鍘婚噸 + 绌哄�艰繃婊わ級
+ var departmentIDs = taskOptions.PushUserCode.Split(',').ToList();
+
+ if (departmentIDs.Count == 0)
+ {
+ _log.Info($"浣滀笟[{taskOptions.TaskName}]鏌ヨ鍒扮殑鐢ㄦ埛缂栫爜涓虹┖锛岃烦杩嘢ignalR鎺ㄩ��");
+ return;
+ }
+ // 姝ラ3锛氳幏鍙栧湪绾跨敤鎴风殑杩炴帴ID锛堜娇鐢ㄧ嚎绋嬪畨鍏ㄦ柟娉曪級
+ var targetConnIds = UserIdsStore.GetConnectionIdsByUserCodes(departmentIDs);
+ if (targetConnIds.Count == 0)
+ {
+ _log.Info($"浣滀笟[{taskOptions.TaskName}]鐩爣鐢ㄦ埛鍧囦笉鍦ㄧ嚎锛岃烦杩嘢ignalR鎺ㄩ��");
+ return;
+ }
+ // 姝ラ4锛氭瀯閫犳帹閫佹秷鎭紙鏍囧噯鍖栨牸寮忥級
+ var logContent = $"銆恵taskOptions.TaskName}銆戞墽琛岀粨鏋滐細{beginTime:yyyy-MM-dd HH:mm:ss} 鑷� {DateTime.Now:yyyy-MM-dd HH:mm:ss} | 缁撴灉锛歿(string.IsNullOrEmpty(httpMessage) ? "鎵ц鎴愬姛" : httpMessage)}";
+ // 姝ラ5锛氭壒閲忔帹閫侊紙澧炲姞瓒呮椂+寮傚父鎹曡幏锛�
+ _log.Info($"浣滀笟[{taskOptions.TaskName}]寮�濮嬪悜[{targetConnIds.Count}]涓湪绾胯繛鎺ユ帹閫佹秷鎭細{logContent}");
+ // 璁剧疆鎺ㄩ�佽秴鏃舵椂闂达紙閬垮厤闀挎椂闂撮樆濉烇級
+ var pushTask = _hubContext.Clients.Clients(targetConnIds).SendCustomUserMessage(logContent);
+ if (await Task.WhenAny(pushTask, Task.Delay(5000)) == pushTask)
+ {
+ await pushTask; // 鎺ㄩ�佹垚鍔�
+ _log.Info($"浣滀笟[{taskOptions.TaskName}]SignalR鎺ㄩ�佸畬鎴愶紝鐩爣杩炴帴鏁帮細{targetConnIds.Count}");
+ }
+ else
+ {
+ _log.Warn($"浣滀笟[{taskOptions.TaskName}]SignalR鎺ㄩ�佽秴鏃讹紙5绉掞級锛岀洰鏍囪繛鎺ユ暟锛歿targetConnIds.Count}");
}
}
- catch (Exception)
+ catch (Exception ex)
{
+ // 璁板綍鏃ュ織鍐欏叆鎴栨帹閫佸け璐ョ殑寮傚父
+ _log.Error($"浣滀笟[{taskOptions.TaskName}]鏃ュ織鍐欏叆/SignalR鎺ㄩ�佸紓甯�:{ex.Message}", ex);
}
- Console.WriteLine(trigger.FullName + " " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:sss") + " " + httpMessage);
- return;
+ // 绯荤粺鏃ュ織杈撳嚭锛氫换鍔℃墽琛岀粨鏉�
+ _log.Info($"浣滀笟[{taskOptions.TaskName}]缁撴潫:{DateTime.Now:yyyy-MM-dd HH:mm:ss} 缁撴灉:{result.ErrorMsg}");
}
}
}
diff --git a/VueWebCoreApi/Quartz/IOCJobFactory.cs b/VueWebCoreApi/Quartz/IOCJobFactory.cs
index 4240437..82d4e23 100644
--- a/VueWebCoreApi/Quartz/IOCJobFactory.cs
+++ b/VueWebCoreApi/Quartz/IOCJobFactory.cs
@@ -16,12 +16,14 @@
}
public IJob NewJob(TriggerFiredBundle bundle, IScheduler scheduler)
{
+ // 浠嶥I瀹瑰櫒鑾峰彇Job瀹炰緥锛堟敮鎸佹瀯閫犲嚱鏁版敞鍏ワ級
return _serviceProvider.GetService(bundle.JobDetail.JobType) as IJob;
}
public void ReturnJob(IJob job)
{
+ // 閲婃斁璧勬簮锛堣嫢闇�瑕侊級
(job as IDisposable)?.Dispose();
}
}
diff --git a/VueWebCoreApi/Quartz/JobAction.cs b/VueWebCoreApi/Quartz/JobAction.cs
index be66f29..fece9a1 100644
--- a/VueWebCoreApi/Quartz/JobAction.cs
+++ b/VueWebCoreApi/Quartz/JobAction.cs
@@ -11,8 +11,8 @@
鍒犻櫎 = 2,
淇敼 = 3,
鏆傚仠 = 4,
- 鍋滄,
- 寮�鍚�,
- 绔嬪嵆鎵ц
+ 鍋滄 = 5,
+ 寮�鍚� = 6,
+ 绔嬪嵆鎵ц = 7
}
}
diff --git a/VueWebCoreApi/Quartz/JobActionLog.cs b/VueWebCoreApi/Quartz/JobActionLog.cs
new file mode 100644
index 0000000..6b12d82
--- /dev/null
+++ b/VueWebCoreApi/Quartz/JobActionLog.cs
@@ -0,0 +1,17 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+
+namespace VueWebCoreApi.Quartz
+{
+ public class JobActionLog
+ {
+ public long Id { get; set; }
+ public string ActionType { get; set; }
+ public string TaskName { get; set; }
+ public string GroupName { get; set; }
+ public string Content { get; set; }
+ public DateTime CreateTime { get; set; }
+ }
+}
diff --git a/VueWebCoreApi/Quartz/QuartzDapperHelper.cs b/VueWebCoreApi/Quartz/QuartzDapperHelper.cs
new file mode 100644
index 0000000..e6a6795
--- /dev/null
+++ b/VueWebCoreApi/Quartz/QuartzDapperHelper.cs
@@ -0,0 +1,135 @@
+锘縰sing Dapper;
+using System;
+using System.Collections.Generic;
+using System.Data;
+using System.Data.SqlClient;
+using System.Linq;
+using System.Threading.Tasks;
+using VueWebCoreApi.Tools;
+
+namespace VueWebCoreApi.Quartz
+{
+ public static class DapperHelper
+ {
+ // 閰嶇疆鏂囦欢璇诲彇锛屽缓璁斁鍒癮ppsettings.json
+ private static readonly string _connectionString = AppSetting.GetAppSetting("DBServer");
+ /// <summary>
+ /// 鑾峰彇鏁版嵁搴撹繛鎺�
+ /// </summary>
+ public static IDbConnection GetConnection()
+ {
+ var conn = new SqlConnection(_connectionString);
+ if (conn.State != ConnectionState.Open)
+ conn.Open();
+ return conn;
+ }
+
+ /// <summary>
+ /// 鎵ц鏌ヨ杩斿洖DataTable
+ /// </summary>
+ public static DataTable SelectTable(string sql, object param = null)
+ {
+ using (var conn = GetConnection())
+ {
+ var reader = conn.ExecuteReader(sql, param);
+ var dt = new DataTable();
+ dt.Load(reader);
+ return dt;
+ }
+ }
+
+ /// <summary>
+ /// 鎵ц澧炲垹鏀�
+ /// </summary>
+ public static int Execute(string sql, object param = null)
+ {
+ using (var conn = GetConnection())
+ {
+ return conn.Execute(sql, param);
+ }
+ }
+
+ /// <summary>
+ /// 寮傛鎵ц澧炲垹鏀�
+ /// </summary>
+ public static async Task<int> ExecuteAsync(string sql, object param = null)
+ {
+ using (var conn = GetConnection())
+ {
+ return await conn.ExecuteAsync(sql, param);
+ }
+ }
+
+ /// <summary>
+ /// 鎵ц浜嬪姟
+ /// </summary>
+ public static bool DoTransaction(List<(string Sql, object Param)> list)
+ {
+ using (var conn = GetConnection())
+ {
+ using (var tran = conn.BeginTransaction())
+ {
+ try
+ {
+ foreach (var item in list)
+ {
+ conn.Execute(item.Sql, item.Param, tran);
+ }
+ tran.Commit();
+ return true;
+ }
+ catch
+ {
+ tran.Rollback();
+ return false;
+ }
+ }
+ }
+ }
+
+ /// <summary>
+ /// 鏌ヨ鍒楄〃
+ /// </summary>
+ public static List<T> Query<T>(string sql, object param = null)
+ {
+ using (var conn = GetConnection())
+ {
+ return conn.Query<T>(sql, param).ToList();
+ }
+ }
+
+ /// <summary>
+ /// 寮傛鏌ヨ鍒楄〃
+ /// </summary>
+ public static async Task<List<T>> QueryAsync<T>(string sql, object param = null)
+ {
+ using (var conn = GetConnection())
+ {
+ var result = await conn.QueryAsync<T>(sql, param);
+ return result.ToList();
+ }
+ }
+
+ /// <summary>
+ /// 鏌ヨ鍗曚釜瀵硅薄
+ /// </summary>
+ public static T QueryFirstOrDefault<T>(string sql, object param = null)
+ {
+ using (var conn = GetConnection())
+ {
+ return conn.QueryFirstOrDefault<T>(sql, param);
+ }
+ }
+
+ /// <summary>
+ /// 寮傛鏌ヨ鍗曚釜瀵硅薄
+ /// </summary>
+ public static async Task<T> QueryFirstOrDefaultAsync<T>(string sql, object param = null)
+ {
+ using (var conn = GetConnection())
+ {
+ return await conn.QueryFirstOrDefaultAsync<T>(sql, param);
+ }
+ }
+ }
+}
diff --git a/VueWebCoreApi/Quartz/QuartzFileInfo.cs b/VueWebCoreApi/Quartz/QuartzFileInfo.cs
index c588a6d..0ada0b9 100644
--- a/VueWebCoreApi/Quartz/QuartzFileInfo.cs
+++ b/VueWebCoreApi/Quartz/QuartzFileInfo.cs
@@ -5,6 +5,9 @@
namespace VueWebCoreApi.Quartz
{
+ /// <summary>
+ /// Quartz鏂囦欢瀛樺偍甯搁噺閰嶇疆
+ /// </summary>
public class QuartzFileInfo
{
/// <summary>
diff --git a/VueWebCoreApi/Quartz/QuartzNETExtension.cs b/VueWebCoreApi/Quartz/QuartzNETExtension.cs
index 51e3bdf..65aa095 100644
--- a/VueWebCoreApi/Quartz/QuartzNETExtension.cs
+++ b/VueWebCoreApi/Quartz/QuartzNETExtension.cs
@@ -17,110 +17,142 @@
namespace VueWebCoreApi.Extensions
{
+ /// <summary>
+ /// Quartz.NET 鎵╁睍鏂规硶绫�
+ /// 灏佽Quartz浠诲姟鐨勫垵濮嬪寲銆佸鍒犳敼鏌ャ�佸惎鍋溿�佺珛鍗虫墽琛岀瓑鏍稿績鎿嶄綔
+ /// 瑙e喅浜哠cheduler鍚姩銆佸唴瀛樹笌鏁版嵁搴撶姸鎬佸悓姝ャ�丆ron琛ㄨ揪寮忓吋瀹广�並ey鍖归厤绛夋牳蹇冮棶棰�
+ /// </summary>
public static class QuartzNETExtension
{
- public static ToMessage mes = new ToMessage(); //瀹氫箟鍏ㄥ眬杩斿洖淇℃伅瀵硅薄
+ /// <summary>
+ /// 鍏ㄥ眬杩斿洖淇℃伅瀵硅薄锛堢粺涓�鎺ュ彛杩斿洖鏍煎紡锛�
+ /// 鍖呭惈code(鐘舵�佺爜)銆乧ount(鏁伴噺)銆乵essage(鎻愮ず淇℃伅)銆乨ata(鏁版嵁)
+ /// </summary>
+ public static ToMessage mes = new ToMessage();
+ /// <summary>
+ /// 鍐呭瓨绾т换鍔″垪琛ㄧ紦瀛�
+ /// 鐢ㄤ簬鍑忓皯鏁版嵁搴撴煡璇紝鍚屾椂淇濊瘉鍐呭瓨涓庢暟鎹簱鐘舵�佷竴鑷�
+ /// </summary>
private static List<TaskOptions> _taskList = new List<TaskOptions>();
/// <summary>
- /// 鍒濆鍖栦綔涓�
+ /// 鎵╁睍IApplicationBuilder锛屽垵濮嬪寲Quartz浠诲姟璋冨害鍣ㄥ苟鍔犺浇鎵�鏈変换鍔�
+ /// 銆愭牳蹇冧慨澶嶃�戣В鍐砆uartz榛樿涓嶅惎鍔⊿cheduler鐨勯棶棰�
/// </summary>
- /// <param name="applicationBuilder"></param>
- /// <param name="env"></param>
- /// <returns></returns>
- public static IApplicationBuilder UseQuartz(this IApplicationBuilder applicationBuilder, IWebHostEnvironment env)
+ /// <param name="app">ASP.NET Core搴旂敤鏋勫缓鍣�</param>
+ /// <param name="env">Web涓绘満鐜</param>
+ /// <returns>搴旂敤鏋勫缓鍣紙閾惧紡璋冪敤锛�</returns>
+ public static IApplicationBuilder UseQuartz(this IApplicationBuilder app, IWebHostEnvironment env)
{
- IServiceProvider services = applicationBuilder.ApplicationServices;
+ // 浠嶥I瀹瑰櫒鑾峰彇渚濊禆鏈嶅姟
+ var services = app.ApplicationServices;
+ // Quartz璋冨害鍣ㄥ伐鍘�
+ var schedulerFactory = services.GetService<ISchedulerFactory>();
+ // 鑷畾涔塓uartz浠撳偍锛堟暟鎹簱鎿嶄綔锛�
+ var quartzRepo = services.GetService<QuartzRepository>();
- ISchedulerFactory _schedulerFactory = services.GetService<ISchedulerFactory>();
-
- string path = FileQuartz.CreateQuartzRootPath(env);
- //鏌ユ壘浠诲姟鍒楄〃
- var data = QuartzSearchData.QuartzSearch();
- if (data.Rows.Count <= 0)
+ // 1. 鏍稿績淇锛歈uartz榛樿涓嶄細鑷姩鍚姩Scheduler锛屽繀椤绘樉寮忓惎鍔�
+ var scheduler = schedulerFactory.GetScheduler().GetAwaiter().GetResult();
+ if (!scheduler.IsStarted)
{
- FileHelper.WriteFile(FileQuartz.LogPath, "start.txt", $"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")},娌℃湁榛樿閰嶇疆浠诲姟\r\n", true);
- return applicationBuilder;
+ scheduler.Start().GetAwaiter().GetResult();
}
- string jobConfig = JsonConvert.SerializeObject(data);
-
- //string jobConfig = FileHelper.ReadFile(path + QuartzFileInfo.JobConfigFileName);
- //if (string.IsNullOrEmpty(jobConfig))
- //{
- // FileHelper.WriteFile(FileQuartz.LogPath, "start.txt", $"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")},娌℃湁榛樿閰嶇疆浠诲姟\r\n", true);
- // return applicationBuilder;
- //}
-
+ // 2. 浠庢暟鎹簱鍔犺浇鎵�鏈夐厤缃殑浠诲姟
+ var taskList = quartzRepo.GetAllTasksAsync().GetAwaiter().GetResult();
+ if (taskList.Count == 0)
+ {
+ //鏃犱换鍔℃椂璁板綍鍚姩鏃ュ織
+ quartzRepo.WriteStartLogAsync($"{DateTime.Now:yyyy-MM-dd HH:mm:ss},娌℃湁榛樿閰嶇疆浠诲姟").GetAwaiter().GetResult();
+ return app;
+ }
+ // 3. 閬嶅巻浠诲姟骞跺垵濮嬪寲锛堣褰曞け璐ユ暟鍜屽紓甯镐俊鎭級
int errorCount = 0;
- string errorMsg = "";
- TaskOptions options = null;
- try
+ string errorMsg = string.Empty;
+ // 鍒濆鍖栧唴瀛樹换鍔″垪琛�
+ _taskList = taskList;
+
+ foreach (var task in taskList)
{
- _taskList = JsonConvert.DeserializeObject<List<TaskOptions>>(jobConfig);
- _taskList.ForEach(x =>
+ try
{
- options = x;
- var result = x.AddJob(_schedulerFactory, true, jobFactory: services.GetService<IJobFactory>()).GetAwaiter().GetResult();
- });
+ //var result = task.AddJob(schedulerFactory, true, services.GetService<IJobFactory>()).GetAwaiter().GetResult();
+ // 璋冪敤TaskOptions鐨凙ddJob鏂规硶娣诲姞浠诲姟鍒拌皟搴﹀櫒
+ // 浼犲叆浠撳偍鐢ㄤ簬鏁版嵁搴撴搷浣滐紝浼犲叆JobFactory鐢ㄤ簬鑷畾涔塉ob瀹炰緥鍖�
+ var result = task.AddJob(schedulerFactory, true, services.GetService<IJobFactory>(), quartzRepo).GetAwaiter().GetResult();
+ }
+ catch (Exception ex)
+ {
+ // 璁板綍鍗曚釜浠诲姟鍒濆鍖栧け璐ヤ俊鎭�
+ errorCount++;
+ errorMsg += $"浣滀笟:{task.TaskName},寮傚父锛歿ex.Message};";
+ }
}
- catch (Exception ex)
- {
- errorCount = +1;
- errorMsg += $"浣滀笟:{options?.TaskName},寮傚父锛歿ex.Message}";
- }
- string content = $"鎴愬姛:{ _taskList.Count - errorCount}涓�,澶辫触{errorCount}涓�,寮傚父锛歿errorMsg}\r\n";
- FileQuartz.WriteStartLog(content);
+ // 4. 璁板綍鏁翠綋鍒濆鍖栫粨鏋滄棩蹇�
+ var content = $"鎴愬姛:{taskList.Count - errorCount}涓�,澶辫触{errorCount}涓�,寮傚父锛歿errorMsg}";
+ quartzRepo.WriteStartLogAsync($"{DateTime.Now:yyyy-MM-dd HH:mm:ss},{content}").GetAwaiter().GetResult();
-
- return applicationBuilder;
+ return app;
}
/// <summary>
- /// 鑾峰彇鎵�鏈夌殑浣滀笟
+ /// 鑾峰彇璋冨害鍣ㄤ腑鎵�鏈変换鍔★紝骞跺悓姝ュ唴瀛�/鏁版嵁搴撶姸鎬侊紙鏍稿績淇锛氳В鍐冲唴瀛樺垪琛ㄤ笌鏁版嵁搴撲笉涓�鑷撮棶棰橈級
/// </summary>
- /// <param name="schedulerFactory"></param>
- /// <returns></returns>
- public static async Task<List<TaskOptions>> GetJobs(this ISchedulerFactory schedulerFactory)
+ /// <param name="schedulerFactory">璋冨害鍣ㄥ伐鍘�</param>
+ /// <param name="quartzRepo">Quartz浠撳偍</param>
+ /// <returns>鏈�鏂扮殑浠诲姟鍒楄〃</returns>
+ public static async Task<List<TaskOptions>> GetJobs(this ISchedulerFactory schedulerFactory, QuartzRepository quartzRepo)
{
- List<TaskOptions> list = new List<TaskOptions>();
+ var list = new List<TaskOptions>();
try
{
- IScheduler _scheduler = await schedulerFactory.GetScheduler();
- var groups = await _scheduler.GetJobGroupNames();
+ var scheduler = await schedulerFactory.GetScheduler();
+ // 纭繚Scheduler澶勪簬鍚姩鐘舵�侊紙闃插尽鎬х紪绋嬶級
+ if (!scheduler.IsStarted) await scheduler.Start();
+ // 1. 鑾峰彇鎵�鏈変换鍔″垎缁勶紙Quartz浠诲姟鎸夊垎缁勭鐞嗭級
+ var groups = await scheduler.GetJobGroupNames();
+
foreach (var groupName in groups)
{
- foreach (var jobKey in await _scheduler.GetJobKeys(GroupMatcher<JobKey>.GroupEquals(groupName)))
+ // 2. 鑾峰彇鍒嗙粍涓嬫墍鏈塉obKey锛堜换鍔″敮涓�鏍囪瘑锛氬悕绉�+鍒嗙粍锛�
+ var jobKeys = await scheduler.GetJobKeys(GroupMatcher<JobKey>.GroupEquals(groupName));
+ foreach (var jobKey in jobKeys)
{
- TaskOptions taskOptions = _taskList.Where(x => x.GroupName == jobKey.Group && x.TaskName == jobKey.Name)
- .FirstOrDefault();
- if (taskOptions == null)
- continue;
-
- var triggers = await _scheduler.GetTriggersOfJob(jobKey);
- foreach (ITrigger trigger in triggers)
+ // 3. 鏍稿績淇锛氫紭鍏堜粠鏁版嵁搴撹幏鍙栨渶鏂颁换鍔★紙閬垮厤鍐呭瓨鏁版嵁杩囨湡锛�
+ var dbTask = await quartzRepo.TaskExists(jobKey.Name, jobKey.Group);
+ // 鏁版嵁搴撴棤鏁版嵁鏃讹紝闄嶇骇浠庡唴瀛樺垪琛ㄨ幏鍙�
+ var task = dbTask.FirstOrDefault() ?? _taskList.FirstOrDefault(x => x.GroupName == jobKey.Group && x.TaskName == jobKey.Name);
+ // 杩囨护鏃犳晥浠诲姟
+ if (task == null) continue;
+ // 4. 鑾峰彇浠诲姟鍏宠仈鐨勮Е鍙戝櫒锛圦uartz浠诲姟閫氳繃瑙﹀彂鍣ㄨЕ鍙戞墽琛岋級
+ var triggers = await scheduler.GetTriggersOfJob(jobKey);
+ foreach (var trigger in triggers)
{
- DateTimeOffset? dateTimeOffset = trigger.GetPreviousFireTimeUtc();
- if (dateTimeOffset != null)
+ // 5. 鍚屾瑙﹀彂鍣ㄥ疄闄呯姸鎬佸埌浠诲姟瀵硅薄锛屽苟鏇存柊鍒版暟鎹簱
+ task.Status = (int)await scheduler.GetTriggerState(trigger.Key);
+ await quartzRepo.UpdateTaskAsync(task); // 鐘舵�佸悓姝ュ埌搴�
+ // 6. 鍚屾浠诲姟鏈�鍚庢墽琛屾椂闂�
+ if (trigger.GetPreviousFireTimeUtc() != null)
{
- taskOptions.LastRunTime = Convert.ToDateTime(dateTimeOffset.ToString());
- //鏇存敼鏈�鍚庢墽琛屾椂闂�
- bool aa = QuartzSearchData.QuartzUpdate(taskOptions);
+ // 浼樺厛浠庤Е鍙戝櫒鑾峰彇鏈�鍚庢墽琛屾椂闂达紙UTC杞湰鍦版椂闂达級
+ task.LastRunTime = trigger.GetPreviousFireTimeUtc()?.LocalDateTime;
+ await quartzRepo.UpdateTaskLastRunTimeAsync(task.TaskName, task.GroupName, task.LastRunTime.Value);
}
else
{
- var runlog = FileQuartz.GetJobRunLog(taskOptions.TaskName, taskOptions.GroupName, 1, 2);
- if (runlog.Count > 0)
+ // 瑙﹀彂鍣ㄦ棤璁板綍鏃讹紝浠庢墽琛屾棩蹇椾腑鑾峰彇鏈�鍚庢墽琛屾椂闂�
+ var logs = await quartzRepo.GetJobRunLogAsync(task.TaskName, task.GroupName, 1, 1);
+ if (logs.Count > 0 && DateTime.TryParse(logs[0].BeginDate, out var lastRunTime))
{
- DateTime.TryParse(runlog[0].BeginDate, out DateTime lastRunTime);
- taskOptions.LastRunTime = lastRunTime;
- //鏇存敼鏈�鍚庢墽琛屾椂闂�
- bool aa = QuartzSearchData.QuartzUpdate(taskOptions);
+ task.LastRunTime = lastRunTime;
+ await quartzRepo.UpdateTaskLastRunTimeAsync(task.TaskName, task.GroupName, lastRunTime);
}
}
}
- list.Add(taskOptions);
+ list.Add(task);
}
}
+ // 7. 鍚屾鍐呭瓨鍒楄〃涓烘渶鏂版暟鎹紙淇濊瘉鍚庣画鎿嶄綔浣跨敤鏈�鏂扮姸鎬侊級
+ _taskList = list;
}
catch (Exception ex)
{
@@ -128,314 +160,246 @@
mes.count = 0;
mes.message = ex.Message + ex.StackTrace;
mes.data = null;
- FileQuartz.WriteStartLog("鑾峰彇浣滀笟寮傚父锛�" + ex.Message + ex.StackTrace);
+ await quartzRepo.WriteStartLogAsync($"鑾峰彇浣滀笟寮傚父锛歿ex.Message}{ex.StackTrace}");
+ return new List<TaskOptions>();
}
return list;
}
/// <summary>
- /// 娣诲姞浣滀笟
+ /// 鏂板Quartz浠诲姟锛堝垵濮嬪寲/鎵嬪姩娣诲姞閫氱敤锛�
/// </summary>
- /// <param name="taskOptions"></param>
- /// <param name="schedulerFactory"></param>
- /// <param name="init">鏄惁鍒濆鍖�,鍚�=闇�瑕侀噸鏂扮敓鎴愰厤缃枃浠讹紝鏄�=涓嶉噸鏂扮敓鎴愰厤缃枃浠�</param>
- /// <returns></returns>
- public static async Task<object> AddJob(this TaskOptions taskOptions, ISchedulerFactory schedulerFactory, bool init = false, IJobFactory jobFactory = null)
+ /// <param name="task">浠诲姟閰嶇疆椤�</param>
+ /// <param name="schedulerFactory">璋冨害鍣ㄥ伐鍘�</param>
+ /// <param name="init">鏄惁涓哄垵濮嬪寲闃舵锛堝垵濮嬪寲鏃朵笉閲嶅鍏ュ簱锛�</param>
+ /// <param name="jobFactory">Job宸ュ巶锛堣嚜瀹氫箟Job瀹炰緥鍖栭�昏緫锛�</param>
+ /// <param name="quartzRepo">Quartz浠撳偍</param>
+ /// <returns>缁熶竴杩斿洖缁撴灉锛圱oMessage锛�</returns>
+ public static async Task<object> AddJob(this TaskOptions task, ISchedulerFactory schedulerFactory, bool init = false, IJobFactory jobFactory = null, QuartzRepository quartzRepo = null)
{
try
{
- //澶勭悊鍓嶇Corn琛ㄨ揪寮忔渶鍚庝竴涓湀鐨勬槦鏈熷ぉ琛ㄨ揪寮忕己闄烽棶棰�
- string resultString = "";
- string[] str = taskOptions.Interval.Split(" ");
- if ((str[3].Equals("1L") || str[3].Equals("2L") || str[3].Equals("3L") || str[3].Equals("4L") || str[3].Equals("5L") || str[3].Equals("6L") || str[3].Equals("7L")) && str[5].Equals("?"))
+ // 1. 淇鍓嶇浼犲叆鐨凜ron琛ㄨ揪寮忓吋瀹规�ч棶棰�
+ task.Interval = FixCronExpression(task.Interval);
+ // 2. 楠岃瘉Cron琛ㄨ揪寮忔湁鏁堟��
+ var (isValid, msg) = task.Interval.IsValidExpression();
+ if (!isValid)
+ return new ToMessage { code = "300", count = 0, message = msg, data = null };
+ // 3. 闈炲垵濮嬪寲闃舵锛氭牎楠屼换鍔℃槸鍚﹀凡瀛樺湪锛堥伩鍏嶉噸澶嶆坊鍔狅級
+ if (!init && await quartzRepo.TaskExistsAsync(task.TaskName, task.GroupName))
{
- str[5] = str[3];
- str[3] = "?";
- for (int i = 0; i < str.Length; i++)
- {
- resultString += str[i] + " ";
- }
- taskOptions.Interval = resultString;
+ return new ToMessage { code = "300", count = 0, message = $"浣滀笟:{task.TaskName},鍒嗙粍锛歿task.GroupName}宸茬粡瀛樺湪", data = null };
}
- (bool, string) validExpression = taskOptions.Interval.IsValidExpression();
- if (!validExpression.Item1)
- return new { code = 300,count=0,Message=validExpression.Item2,data="null" };
-
- (bool, object) result = taskOptions.Exists(init);
- if (!result.Item1)
- return result.Item2;
+ // 4. 闈炲垵濮嬪寲闃舵锛氭柊澧炰换鍔″埌鍐呭瓨+鏁版嵁搴�+璁板綍鎿嶄綔鏃ュ織
if (!init)
{
- //灏嗗巻鍙蹭换鍔″強鏂板鍔犱换鍔″ぉ鍔犲埌List闆嗗悎
- _taskList.Add(taskOptions);
- //灏嗛泦鍚堟暟鎹坊鍔犲埌json鏂囦欢(瑕嗙洊寮�)
- FileQuartz.WriteJobConfig(_taskList);
- //灏嗗綋鍓嶆柊浠诲姟娣诲姞鍒版暟鎹〃
- bool aa = QuartzSearchData.QuartzCreate(taskOptions);
+ _taskList.Add(task);// 鍐呭瓨娣诲姞
+ await quartzRepo.CreateTaskAsync(task);// 鏁版嵁搴撴坊鍔�
+ await quartzRepo.AddJobActionLogAsync(JobAction.鏂板.ToString(), task.TaskName, task.GroupName, "鏂板浠诲姟鎴愬姛");// 鎿嶄綔鏃ュ織
}
+ // 5. 鏋勫缓Quartz Job锛堜换鍔℃墽琛屼綋锛�
+ var job = JobBuilder.Create<HttpResultfulJob>()// HttpResultfulJob锛氳嚜瀹氫箟鐨凥TTP璇锋眰鍨婮ob
+ .WithIdentity(task.TaskName, task.GroupName)// 璁剧疆Job鍞竴鏍囪瘑锛堝悕绉�+鍒嗙粍锛�
+ .Build();
- IJobDetail job = JobBuilder.Create<HttpResultfulJob>().WithIdentity(taskOptions.TaskName, taskOptions.GroupName).Build();
- ITrigger trigger = TriggerBuilder.Create()
- .WithIdentity(taskOptions.TaskName, taskOptions.GroupName)
- .StartNow()
- .WithDescription(taskOptions.Describe)
- .WithCronSchedule(taskOptions.Interval)
- .Build();
+ // 6. 鏋勫缓Cron瑙﹀彂鍣紙鎸塁ron琛ㄨ揪寮忚Е鍙戯級
+ var trigger = TriggerBuilder.Create()
+ .WithIdentity(task.TaskName, task.GroupName)// 瑙﹀彂鍣ㄥ敮涓�鏍囪瘑锛堜笌Job淇濇寔涓�鑷达級
+ .StartNow()// 绔嬪嵆鍚姩
+ .WithDescription(task.Describe)// 浠诲姟鎻忚堪
+ .WithCronSchedule(task.Interval)// 缁戝畾Cron琛ㄨ揪寮�
+ .Build();
- IScheduler scheduler = await schedulerFactory.GetScheduler();
-
- if (jobFactory == null)
- {
- try
- {
- jobFactory = HttpContext.Current.RequestServices.GetService<IJobFactory>();
- }
- catch (Exception ex)
- {
- Console.WriteLine($"鍒涘缓浠诲姟[{taskOptions.TaskName}]寮傚父,{ex.Message}");
- }
- }
-
+ // 7. 鑾峰彇璋冨害鍣ㄥ苟纭繚鍚姩
+ var scheduler = await schedulerFactory.GetScheduler();
+ if (!scheduler.IsStarted) await scheduler.Start(); // 纭繚鍚姩
+ // 8. 璁剧疆鑷畾涔塉obFactory锛堝闇�鎺у埗Job鐨勪緷璧栨敞鍏�/瀹炰緥鍖栵級
if (jobFactory != null)
{
scheduler.JobFactory = jobFactory;
}
+ // 9. 灏咼ob鍜岃Е鍙戝櫒缁戝畾鍒拌皟搴﹀櫒
await scheduler.ScheduleJob(job, trigger);
- if (taskOptions.Status == (int)TriggerState.Normal)
+
+ // 10. 鏍规嵁浠诲姟鐘舵�佽缃Е鍙戝櫒鍚仠
+ if (task.Status == (int)TriggerState.Normal)
{
- await scheduler.Start();
+ await scheduler.ResumeTrigger(trigger.Key);// 鏄惧紡鎭㈠锛堢‘淇濊Е鍙戝櫒姝e父杩愯锛�
}
else
{
- await scheduler.PauseJob(job.Key);
- // await schedulerFactory.Pause(taskOptions);
- FileQuartz.WriteStartLog($"浣滀笟:{taskOptions.TaskName},鍒嗙粍:{taskOptions.GroupName},鏂板缓鏃舵湭鍚姩鍘熷洜,鐘舵�佷负:{taskOptions.Status}");
+ await scheduler.PauseJob(job.Key);// 鏆傚仠浠诲姟
+ await quartzRepo.WriteStartLogAsync($"浣滀笟:{task.TaskName},鍒嗙粍:{task.GroupName},鏂板缓鏃舵湭鍚姩鍘熷洜,鐘舵�佷负:{task.Status}");
}
- if (!init)
- FileQuartz.WriteJobAction(JobAction.鏂板, taskOptions.TaskName, taskOptions.GroupName);
mes.code = "200";
mes.count = 0;
- mes.message ="鎵ц鎴愬姛锛�";
+ mes.message = "鎵ц鎴愬姛锛�";
mes.data = null;
}
catch (Exception ex)
{
- mes.code = "300";
- mes.count = 0;
- mes.message = ex.Message;
- mes.data = null;
- return new { status = false, msg = ex.Message };
+ return new ToMessage { code = "300", count = 0, message = ex.Message, data = null };
}
return mes;
}
/// <summary>
- /// 绉婚櫎浣滀笟
+ /// 绉婚櫎锛堝垹闄わ級浠诲姟
/// </summary>
- /// <param name="schedulerFactory"></param>
- /// <param name="taskName"></param>
- /// <param name="groupName"></param>
- /// <returns></returns>
- public static Task<object> Remove(this ISchedulerFactory schedulerFactory, TaskOptions taskOptions)
+ /// <param name="schedulerFactory">璋冨害鍣ㄥ伐鍘�</param>
+ /// <param name="task">浠诲姟閰嶇疆</param>
+ /// <param name="quartzRepo">Quartz浠撳偍</param>
+ /// <returns>鎿嶄綔缁撴灉</returns>
+ public static Task<object> Remove(this ISchedulerFactory schedulerFactory, TaskOptions task, QuartzRepository quartzRepo)
{
- return schedulerFactory.TriggerAction(taskOptions.TaskName, taskOptions.GroupName, JobAction.鍒犻櫎, taskOptions);
+ return TriggerAction(schedulerFactory, task.TaskName, task.GroupName, JobAction.鍒犻櫎, task, quartzRepo);
}
/// <summary>
- /// 鏇存柊浣滀笟
+ /// 淇敼浠诲姟閰嶇疆
/// </summary>
- /// <param name="schedulerFactory"></param>
- /// <param name="taskOptions"></param>
- /// <returns></returns>
- public static Task<object> Update(this ISchedulerFactory schedulerFactory, TaskOptions taskOptions)
+ /// <param name="schedulerFactory">璋冨害鍣ㄥ伐鍘�</param>
+ /// <param name="task">鏂扮殑浠诲姟閰嶇疆</param>
+ /// <param name="quartzRepo">Quartz浠撳偍</param>
+ /// <returns>鎿嶄綔缁撴灉</returns>
+ public static Task<object> Update(this ISchedulerFactory schedulerFactory, TaskOptions task, QuartzRepository quartzRepo)
{
- return schedulerFactory.TriggerAction(taskOptions.TaskName, taskOptions.GroupName, JobAction.淇敼, taskOptions);
+ return TriggerAction(schedulerFactory, task.TaskName, task.GroupName, JobAction.淇敼, task, quartzRepo);
}
/// <summary>
- /// 鏆傚仠浣滀笟
+ /// 鏆傚仠浠诲姟
/// </summary>
- /// <param name="schedulerFactory"></param>
- /// <param name="taskOptions"></param>
- /// <returns></returns>
- public static Task<object> Pause(this ISchedulerFactory schedulerFactory, TaskOptions taskOptions)
+ /// <param name="schedulerFactory">璋冨害鍣ㄥ伐鍘�</param>
+ /// <param name="task">浠诲姟閰嶇疆</param>
+ /// <param name="quartzRepo">Quartz浠撳偍</param>
+ /// <returns>鎿嶄綔缁撴灉</returns>
+ public static Task<object> Pause(this ISchedulerFactory schedulerFactory, TaskOptions task, QuartzRepository quartzRepo)
{
- return schedulerFactory.TriggerAction(taskOptions.TaskName, taskOptions.GroupName, JobAction.鏆傚仠, taskOptions);
+ return TriggerAction(schedulerFactory, task.TaskName, task.GroupName, JobAction.鏆傚仠, task, quartzRepo);
}
/// <summary>
- /// 鍚姩浣滀笟
+ /// 鍚姩锛堟仮澶嶏級浠诲姟
/// </summary>
- /// <param name="schedulerFactory"></param>
- /// <param name="taskOptions"></param>
- /// <returns></returns>
- public static Task<object> Start(this ISchedulerFactory schedulerFactory, TaskOptions taskOptions)
+ /// <param name="schedulerFactory">璋冨害鍣ㄥ伐鍘�</param>
+ /// <param name="task">浠诲姟閰嶇疆</param>
+ /// <param name="quartzRepo">Quartz浠撳偍</param>
+ /// <returns>鎿嶄綔缁撴灉</returns>
+ public static Task<object> Start(this ISchedulerFactory schedulerFactory, TaskOptions task, QuartzRepository quartzRepo)
{
- return schedulerFactory.TriggerAction(taskOptions.TaskName, taskOptions.GroupName, JobAction.寮�鍚�, taskOptions);
+ return TriggerAction(schedulerFactory, task.TaskName, task.GroupName, JobAction.寮�鍚�, task, quartzRepo);
}
/// <summary>
- /// 绔嬪嵆鎵ц涓�娆′綔涓�
+ /// 绔嬪嵆鎵ц浠诲姟锛堟棤瑙咰ron琛ㄨ揪寮忥級
/// </summary>
- /// <param name="schedulerFactory"></param>
- /// <param name="taskOptions"></param>
- /// <returns></returns>
- public static Task<object> Run(this ISchedulerFactory schedulerFactory, TaskOptions taskOptions)
+ /// <param name="schedulerFactory">璋冨害鍣ㄥ伐鍘�</param>
+ /// <param name="task">浠诲姟閰嶇疆</param>
+ /// <param name="quartzRepo">Quartz浠撳偍</param>
+ /// <returns>鎿嶄綔缁撴灉</returns>
+ public static Task<object> Run(this ISchedulerFactory schedulerFactory, TaskOptions task, QuartzRepository quartzRepo)
{
- return schedulerFactory.TriggerAction(taskOptions.TaskName, taskOptions.GroupName, JobAction.绔嬪嵆鎵ц, taskOptions);
- }
-
- public static object ModifyTaskEntity(this TaskOptions taskOptions, ISchedulerFactory schedulerFactory, JobAction action)
- {
- TaskOptions options = null;
- object result = null;
- switch (action)
- {
- case JobAction.鍒犻櫎:
- for (int i = 0; i < _taskList.Count; i++)
- {
- options = _taskList[i];
- if (options.TaskName == taskOptions.TaskName && options.GroupName == taskOptions.GroupName)
- {
- _taskList.RemoveAt(i);
- //鍒犻櫎浠诲姟
- bool aa = QuartzSearchData.QuartzDelete(options);
- }
- }
- break;
- case JobAction.淇敼:
- options = _taskList.Where(x => x.TaskName == taskOptions.TaskName && x.GroupName == taskOptions.GroupName).FirstOrDefault();
- //绉婚櫎浠ュ墠鐨勯厤缃�
- if (options != null)
- {
- _taskList.Remove(options);
- //鍒犻櫎浠诲姟
- bool aa = QuartzSearchData.QuartzDelete(options);
- }
-
- //鐢熸垚浠诲姟骞舵坊鍔犳柊閰嶇疆
- result = taskOptions.AddJob(schedulerFactory, false).GetAwaiter().GetResult();
- break;
- case JobAction.鏆傚仠:
- case JobAction.寮�鍚�:
- case JobAction.鍋滄:
- case JobAction.绔嬪嵆鎵ц:
- options = _taskList.Where(x => x.TaskName == taskOptions.TaskName && x.GroupName == taskOptions.GroupName).FirstOrDefault();
- if (action == JobAction.鏆傚仠)
- {
- options.Status = (int)TriggerState.Paused;
- //鏇存柊浠诲姟鐘舵��
- bool aa= QuartzSearchData.QuartzUpdate(options);
- }
- else if (action == JobAction.鍋滄)
- {
- options.Status = (int)action;
- //鏇存柊浠诲姟鐘舵��
- bool aa = QuartzSearchData.QuartzUpdate(options);
- }
- else
- {
- options.Status = (int)TriggerState.Normal;
- //鏇存柊浠诲姟鐘舵��
- bool aa = QuartzSearchData.QuartzUpdate(options);
- }
- break;
- }
- //鐢熸垚閰嶇疆鏂囦欢
- FileQuartz.WriteJobConfig(_taskList);
- FileQuartz.WriteJobAction(action, taskOptions.TaskName, taskOptions.GroupName, "鎿嶄綔瀵硅薄锛�" + JsonConvert.SerializeObject(taskOptions));
- return result;
+ return TriggerAction(schedulerFactory, task.TaskName, task.GroupName, JobAction.绔嬪嵆鎵ц, task, quartzRepo);
}
/// <summary>
- /// 瑙﹀彂鏂板銆佸垹闄ゃ�佷慨鏀广�佹殏鍋溿�佸惎鐢ㄣ�佺珛鍗虫墽琛屼簨浠�
+ /// 浠诲姟鎿嶄綔鏍稿績閫昏緫锛堟牳蹇冧慨澶嶏細Key鍖归厤+鐘舵�佸悓姝�+Scheduler鍚姩鏍¢獙锛�
+ /// 灏佽鍒犻櫎/淇敼/鏆傚仠/寮�鍚�/绔嬪嵆鎵ц鐨勯�氱敤閫昏緫锛岄伩鍏嶄唬鐮佸啑浣�
/// </summary>
- /// <param name="schedulerFactory"></param>
- /// <param name="taskName"></param>
- /// <param name="groupName"></param>
- /// <param name="action"></param>
- /// <param name="taskOptions"></param>
- /// <returns></returns>
- public static async Task<object> TriggerAction(this ISchedulerFactory schedulerFactory, string taskName, string groupName, JobAction action, TaskOptions taskOptions = null)
+ /// <param name="schedulerFactory">璋冨害鍣ㄥ伐鍘�</param>
+ /// <param name="taskName">浠诲姟鍚嶇О</param>
+ /// <param name="groupName">鍒嗙粍鍚嶇О</param>
+ /// <param name="action">鎿嶄綔绫诲瀷锛堝垹闄�/淇敼/鏆傚仠/寮�鍚�/绔嬪嵆鎵ц锛�</param>
+ /// <param name="task">浠诲姟閰嶇疆</param>
+ /// <param name="quartzRepo">Quartz浠撳偍</param>
+ /// <returns>鎿嶄綔缁撴灉</returns>
+ private static async Task<object> TriggerAction(this ISchedulerFactory schedulerFactory, string taskName, string groupName, JobAction action, TaskOptions task, QuartzRepository quartzRepo)
{
- string errorMsg = "";
try
{
- //澶勭悊鍓嶇Corn琛ㄨ揪寮忔渶鍚庝竴涓湀鐨勬槦鏈熷ぉ琛ㄨ揪寮忕己闄烽棶棰�
- string resultString = "";
- string[] str = taskOptions.Interval.Split(" ");
- if ((str[3].Equals("1L") || str[3].Equals("2L") || str[3].Equals("3L") || str[3].Equals("4L") || str[3].Equals("5L") || str[3].Equals("6L") || str[3].Equals("7L")) && str[5].Equals("?"))
- {
- str[5] = str[3];
- str[3] = "?";
- for (int i = 0; i < str.Length; i++)
- {
- resultString += str[i] + " ";
- }
- taskOptions.Interval = resultString;
- }
- IScheduler scheduler = await schedulerFactory.GetScheduler();
- List<JobKey> jobKeys = scheduler.GetJobKeys(GroupMatcher<JobKey>.GroupEquals(groupName)).Result.ToList();
- if (jobKeys == null || jobKeys.Count() == 0)
- {
- errorMsg = $"鏈壘鍒板垎缁刐{groupName}]";
- return new { code = 300, count = 0, Message = errorMsg, data = "null" };
- //return new { status = false, msg = errorMsg };
- }
- JobKey jobKey = jobKeys.Where(s => scheduler.GetTriggersOfJob(s).Result.Any(x => (x as CronTriggerImpl).Name == taskName)).FirstOrDefault();
- if (jobKey == null)
- {
- errorMsg = $"鏈壘鍒拌Е鍙戝櫒[{taskName}]";
- return new { code = 300, count = 0, Message = errorMsg, data = "null" };
- }
- var triggers = await scheduler.GetTriggersOfJob(jobKey);
- ITrigger trigger = triggers?.Where(x => (x as CronTriggerImpl).Name == taskName).FirstOrDefault();
+ // 1. 棰勫鐞咰ron琛ㄨ揪寮忥紙淇鍓嶇浼犲叆鐨勮〃杈惧紡锛�
+ if (task != null) task.Interval = FixCronExpression(task.Interval);
- if (trigger == null)
+ // 2. 鑾峰彇璋冨害鍣ㄥ苟纭繚鍚姩锛堟牳蹇冧慨澶�1锛氬叏灞�Scheduler鍚姩鏍¢獙锛�
+ var scheduler = await schedulerFactory.GetScheduler();
+ // 鏍稿績淇1锛氱‘淇漇cheduler鍏ㄥ眬鍚姩
+ if (!scheduler.IsStarted) await scheduler.Start();
+
+ // 3. 鏍稿績淇2锛氭纭瀯寤篔obKey锛堜换鍔″悕+鍒嗙粍锛夛紝瑙e喅Key鍖归厤澶辫触闂
+ var jobKey = new JobKey(taskName, groupName);
+ if (!await scheduler.CheckExists(jobKey))
{
- errorMsg = $"鏈壘鍒拌Е鍙戝櫒[{taskName}]";
- return new { code = 300, count = 0, Message = errorMsg, data = "null" };
+ return new ToMessage { code = "300", count = 0, message = $"鏈壘鍒颁换鍔{taskName}-{groupName}]", data = null };
}
+
+ // 4. 鑾峰彇浠诲姟鍏宠仈鐨勮Е鍙戝櫒锛堟棤瑙﹀彂鍣ㄥ垯浠诲姟鏃犳硶鎵ц锛�
+ var triggers = await scheduler.GetTriggersOfJob(jobKey);
+ if (triggers == null || !triggers.Any())
+ {
+ return new ToMessage { code = "300", count = 0, message = $"浠诲姟[{taskName}-{groupName}]鏃犺Е鍙戝櫒", data = null };
+ }
+ // 鍙栫涓�涓Е鍙戝櫒锛堝崟浠诲姟榛樿缁戝畾涓�涓Е鍙戝櫒锛�
+ var trigger = triggers.First();
+
object result = null;
+ // 5. 鏍规嵁鎿嶄綔绫诲瀷鎵ц涓嶅悓閫昏緫
switch (action)
{
case JobAction.鍒犻櫎:
- case JobAction.淇敼:
+ // 鏆傚仠瑙﹀彂鍣� -> 瑙g粦瑙﹀彂鍣� -> 鍒犻櫎Job -> 鍚屾鍐呭瓨+鏁版嵁搴� -> 璁板綍鏃ュ織
await scheduler.PauseTrigger(trigger.Key);
- await scheduler.UnscheduleJob(trigger.Key);// 绉婚櫎瑙﹀彂鍣�
- await scheduler.DeleteJob(trigger.JobKey);
- result = taskOptions.ModifyTaskEntity(schedulerFactory, action);
+ await scheduler.UnscheduleJob(trigger.Key);
+ await scheduler.DeleteJob(jobKey);
+ _taskList.RemoveAll(x => x.TaskName == taskName && x.GroupName == groupName);
+ await quartzRepo.DeleteTaskAsync(taskName, groupName);
+ await quartzRepo.AddJobActionLogAsync(action.ToString(), taskName, groupName, "鍒犻櫎浠诲姟鎴愬姛");
break;
+
+ case JobAction.淇敼:
+ // 淇敼閫昏緫锛氬厛鍒犻櫎鏃т换鍔� -> 閲嶆柊娣诲姞鏂伴厤缃� -> 璁板綍鏃ュ織
+ await scheduler.PauseTrigger(trigger.Key);
+ await scheduler.UnscheduleJob(trigger.Key);
+ await scheduler.DeleteJob(jobKey);
+ _taskList.RemoveAll(x => x.TaskName == taskName && x.GroupName == groupName);
+ await quartzRepo.DeleteTaskAsync(taskName, groupName);
+ result = await task.AddJob(schedulerFactory, false, null, quartzRepo);// 閲嶆柊娣诲姞浠诲姟
+ await quartzRepo.AddJobActionLogAsync(action.ToString(), taskName, groupName, JsonConvert.SerializeObject(task));
+ break;
+
case JobAction.鏆傚仠:
- case JobAction.鍋滄:
- case JobAction.寮�鍚�:
- result = taskOptions.ModifyTaskEntity(schedulerFactory, action);
- if (action == JobAction.鏆傚仠)
- {
- await scheduler.PauseTrigger(trigger.Key);
- }
- else if (action == JobAction.寮�鍚�)
- {
- await scheduler.ResumeTrigger(trigger.Key);
- // await scheduler.RescheduleJob(trigger.Key, trigger);
- }
- else
- {
- await scheduler.Shutdown();
- }
+ // 鏆傚仠瑙﹀彂鍣� -> 鏇存柊浠诲姟鐘舵�� -> 鍚屾鍐呭瓨+鏁版嵁搴� -> 璁板綍鏃ュ織
+ await scheduler.PauseTrigger(trigger.Key);
+ task.Status = (int)TriggerState.Paused;
+ await quartzRepo.UpdateTaskAsync(task);
+ _taskList.RemoveAll(x => x.TaskName == taskName && x.GroupName == groupName);
+ _taskList.Add(task); // 鍚屾鍐呭瓨鐘舵��
+ await quartzRepo.AddJobActionLogAsync(action.ToString(), taskName, groupName, "鏆傚仠浠诲姟鎴愬姛");
break;
+
+ case JobAction.寮�鍚�:
+ // 鎭㈠瑙﹀彂鍣� -> 鏇存柊浠诲姟鐘舵�� -> 鍚屾鍐呭瓨+鏁版嵁搴� -> 璁板綍鏃ュ織
+ await scheduler.ResumeTrigger(trigger.Key);
+ task.Status = (int)TriggerState.Normal;
+ await quartzRepo.UpdateTaskAsync(task);
+ _taskList.RemoveAll(x => x.TaskName == taskName && x.GroupName == groupName);
+ _taskList.Add(task); // 鍚屾鍐呭瓨鐘舵��
+ await quartzRepo.AddJobActionLogAsync(action.ToString(), taskName, groupName, "寮�鍚换鍔℃垚鍔�");
+ break;
+
case JobAction.绔嬪嵆鎵ц:
- if (taskOptions != null && taskOptions.Status != (int)TriggerState.Normal)
+ // 绔嬪嵆鎵ц鍓嶇‘淇濅换鍔″浜庡惎鍔ㄧ姸鎬� -> 瑙﹀彂Job绔嬪嵆鎵ц -> 璁板綍鏃ュ織
+ if (task.Status != (int)TriggerState.Normal)
{
- result = taskOptions.ModifyTaskEntity(schedulerFactory, JobAction.寮�鍚�);
- await scheduler.ResumeTrigger(trigger.Key);
-
+ task.Status = (int)TriggerState.Normal;
+ await quartzRepo.UpdateTaskAsync(task);
+ _taskList.RemoveAll(x => x.TaskName == taskName && x.GroupName == groupName);
+ _taskList.Add(task);
+ await scheduler.ResumeTrigger(trigger.Key);
}
- else {
- await scheduler.TriggerJob(jobKey);
- }
-
+ await scheduler.TriggerJob(jobKey); // 绔嬪嵆瑙﹀彂浠诲姟鎵ц
+ await quartzRepo.AddJobActionLogAsync(action.ToString(), taskName, groupName, "绔嬪嵆鎵ц浠诲姟鎴愬姛");
break;
}
mes.code = "200";
@@ -443,70 +407,78 @@
mes.message = $"浣滀笟{action.ToString()}鎴愬姛";
mes.data = null;
return result ?? mes;
- //return result ?? new { status = true, msg = $"浣滀笟{action.ToString()}鎴愬姛" };
}
catch (Exception ex)
{
- errorMsg = ex.Message;
- mes.code = "300";
- mes.count = 0;
- mes.message = errorMsg;
- mes.data = null;
- return mes;
- //return new { status = false, msg = ex.Message };
- }
- finally
- {
- FileQuartz.WriteJobAction(action, taskName, groupName, errorMsg);
+ await quartzRepo.AddJobActionLogAsync(action.ToString(), taskName, groupName, $"鎿嶄綔澶辫触锛歿ex.Message}");
+ return new ToMessage { code = "300", count = 0, message = ex.Message, data = null };
}
}
/// <summary>
- ///
+ /// 淇鍓嶇浼犲叆鐨凜ron琛ㄨ揪寮忕己闄�
+ /// 鍏煎ASP.NET Core 3.1涓瑿ron琛ㄨ揪寮忕殑Day/Week瀛楁鍐欐硶闂
/// </summary>
- /// <param name="context"></param>閫氳繃浣滀笟涓婁笅鏂囪幏鍙栦綔涓氬搴旂殑閰嶇疆鍙傛暟
- /// <returns></returns>
- public static TaskOptions GetTaskOptions(this IJobExecutionContext context)
+ /// <param name="cron">鍘熷Cron琛ㄨ揪寮�</param>
+ /// <returns>淇鍚庣殑Cron琛ㄨ揪寮�</returns>
+ private static string FixCronExpression(string cron)
{
- AbstractTrigger trigger = (context as JobExecutionContextImpl).Trigger as AbstractTrigger;
- TaskOptions taskOptions = _taskList.Where(x => x.TaskName == trigger.Name && x.GroupName == trigger.Group).FirstOrDefault();
- return taskOptions ?? _taskList.Where(x => x.TaskName == trigger.JobName && x.GroupName == trigger.JobGroup).FirstOrDefault();
+ if (string.IsNullOrEmpty(cron))
+ return cron;
+
+ // 鎷嗗垎Cron琛ㄨ揪寮忥紙鏍囧噯Cron锛氱 鍒� 鏃� 鏃� 鏈� 鍛� 骞达紙鍙�夛級锛�
+ var str = cron.Split(" ", StringSplitOptions.RemoveEmptyEntries);
+ if (str.Length < 6)
+ return cron;
+
+ // 鍏煎 ASP.NET Core 3.1 鐨勫啓娉曪紙鏇挎崲 or 璇硶锛�
+ // 淇鍦烘櫙锛欴ay瀛楁涓�1L/2L...7L 涓� 鍛ㄥ瓧娈典负? 鏃讹紝浜ゆ崲Day鍜屽懆瀛楁
+ // 鍘熷洜锛氬墠绔彲鑳芥贩娣嗕簡Day/鍛ㄥ瓧娈电殑鍐欐硶锛孮uartz瀵筁锛堟渶鍚庝竴澶╋級鐨勮В鏋愭湁鐗瑰畾瑙勫垯
+ var dayValue = str[3];// 绗�4涓瓧娈碉細Day
+ if ((dayValue == "1L" || dayValue == "2L" || dayValue == "3L" ||
+ dayValue == "4L" || dayValue == "5L" || dayValue == "6L" || dayValue == "7L") && str[5] == "?")
+ {
+ str[5] = str[3]; // 鍛ㄥ瓧娈� = 鍘烡ay瀛楁
+ str[3] = "?"; // Day瀛楁 = ?
+ return string.Join(" ", str);
+ }
+
+ return cron;
}
/// <summary>
- /// 浣滀笟鏄惁瀛樺湪
+ /// 楠岃瘉Cron琛ㄨ揪寮忔槸鍚︽湁鏁�
/// </summary>
- /// <param name="taskOptions"></param>
- /// <param name="init">鍒濆鍖栫殑涓嶉渶瑕佸垽鏂�</param>
- /// <returns></returns>
- public static (bool, object) Exists(this TaskOptions taskOptions, bool init)
- {
- if (!init && _taskList.Any(x => x.TaskName == taskOptions.TaskName && x.GroupName == taskOptions.GroupName))
- {
- return (false,
- new
- {
- status = false,
- msg = $"浣滀笟:{taskOptions.TaskName},鍒嗙粍锛歿taskOptions.GroupName}宸茬粡瀛樺湪"
- });
- }
- return (true, null);
- }
-
+ /// <param name="cronExpression">Cron琛ㄨ揪寮�</param>
+ /// <returns>鏄惁鏈夋晥 + 閿欒淇℃伅</returns>
public static (bool, string) IsValidExpression(this string cronExpression)
{
try
{
- CronTriggerImpl trigger = new CronTriggerImpl();
+ // 閫氳繃Quartz鍐呯疆鐨凜ronTriggerImpl楠岃瘉琛ㄨ揪寮�
+ var trigger = new CronTriggerImpl();
trigger.CronExpressionString = cronExpression;
- DateTimeOffset? date = trigger.ComputeFirstFireTimeUtc(null);
- return (date != null, date == null ? $"璇风‘璁よ〃杈惧紡{cronExpression}鏄惁姝g‘!" : "");
+ // 璁$畻绗竴涓Е鍙戞椂闂达細null琛ㄧず琛ㄨ揪寮忔棤鏁�
+ var date = trigger.ComputeFirstFireTimeUtc(null);
+ return (date != null, date == null ? $"琛ㄨ揪寮弡cronExpression}鏃犳晥!" : string.Empty);
}
catch (Exception e)
{
- return (false, $"璇风‘璁よ〃杈惧紡{cronExpression}鏄惁姝g‘!{e.Message}");
+ return (false, $"琛ㄨ揪寮弡cronExpression}鏃犳晥!{e.Message}");
}
}
- }
+ /// <summary>
+ /// 浠嶫ob鎵ц涓婁笅鏂囪幏鍙栦换鍔¢厤缃�
+ /// 鐢ㄤ簬Job鎵ц鏃惰幏鍙栨渶鏂扮殑浠诲姟鍙傛暟
+ /// </summary>
+ /// <param name="context">Job鎵ц涓婁笅鏂�</param>
+ /// <returns>浠诲姟閰嶇疆椤�</returns>
+ public static TaskOptions GetTaskOptions(this IJobExecutionContext context)
+ {
+ var jobKey = context.JobDetail.Key;
+ // 浠庡唴瀛樺垪琛ㄤ腑鑾峰彇鍖归厤鐨勪换鍔★紙Job鎵ц鏃朵紭鍏堢敤鍐呭瓨锛屽噺灏戞暟鎹簱鏌ヨ锛�
+ return _taskList.FirstOrDefault(x => x.TaskName == jobKey.Name && x.GroupName == jobKey.Group);
+ }
+ }
}
diff --git a/VueWebCoreApi/Quartz/QuartzRepository.cs b/VueWebCoreApi/Quartz/QuartzRepository.cs
new file mode 100644
index 0000000..0e1ab47
--- /dev/null
+++ b/VueWebCoreApi/Quartz/QuartzRepository.cs
@@ -0,0 +1,143 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+
+namespace VueWebCoreApi.Quartz
+{
+ public class QuartzRepository
+ {
+ #region 浠诲姟鍩虹鎿嶄綔
+ public async Task<List<TaskOptions>> GetAllTasksAsync()
+ {
+ var sql = @"SELECT TaskName,GroupName,Interval,ApiUrl,AuthKey,AuthValue,Describe,MessagePush,PushUserCode,RequestType,LastRunTime,Status,CreateAuthor,CreateTime,UpdateTime
+ FROM ScheduleInfo";
+ return await DapperHelper.QueryAsync<TaskOptions>(sql);
+ }
+
+ public async Task<bool> CreateTaskAsync(TaskOptions task)
+ {
+ var sql = @"INSERT INTO ScheduleInfo(TaskName,GroupName,Interval,ApiUrl,RequestParameters,AuthKey,AuthValue,Describe,MessagePush,PushUserCode,RequestType,LastRunTime,Status,CreateAuthor,CreateTime,UpdateTime)
+ VALUES(@TaskName,@GroupName,@Interval,@ApiUrl,@RequestParameters,@AuthKey,@AuthValue,@Describe,@MessagePush,@PushUserCode,@RequestType,@LastRunTime,@Status,'9999',GETDATE(),GETDATE())";
+ var rows = await DapperHelper.ExecuteAsync(sql, task);
+ return rows > 0;
+ }
+
+ /// <summary>
+ /// 淇锛氬鍔犳洿鏂扮粨鏋滄牎楠岋紝杩斿洖鍏蜂綋淇℃伅
+ /// </summary>
+ public async Task<(bool Success, string Msg)> UpdateTaskWithCheckAsync(TaskOptions task)
+ {
+ if (string.IsNullOrEmpty(task.TaskName) || string.IsNullOrEmpty(task.GroupName))
+ {
+ return (false, "浠诲姟鍚�/鍒嗙粍鍚嶄笉鑳戒负绌�");
+ }
+ // 鍏堟牎楠屼换鍔℃槸鍚﹀瓨鍦�
+ if (!await TaskExistsAsync(task.TaskName, task.GroupName))
+ {
+ return (false, $"浠诲姟[{task.TaskName}-{task.GroupName}]涓嶅瓨鍦�");
+ }
+ var sql = @"UPDATE ScheduleInfo
+ SET Interval=@Interval,ApiUrl=@ApiUrl,RequestParameters=@RequestParameters,AuthKey=@AuthKey,AuthValue=@AuthValue,Describe=@Describe,
+ MessagePush=@MessagePush,PushUserCode=@PushUserCode,RequestType=@RequestType,LastRunTime=@LastRunTime,Status=@Status,UpdateTime=GETDATE()
+ WHERE TaskName=@TaskName AND GroupName=@GroupName";
+ var rows = await DapperHelper.ExecuteAsync(sql, task);
+ return rows > 0 ? (true, "鏇存柊鎴愬姛") : (false, "鏇存柊澶辫触锛堟棤鏁版嵁琛屾洿鏂帮級");
+ }
+
+ // 鍏煎鍘熸湁鏂规硶
+ public async Task<bool> UpdateTaskAsync(TaskOptions task)
+ {
+ var (success, _) = await UpdateTaskWithCheckAsync(task);
+ return success;
+ }
+
+ public async Task<bool> DeleteTaskAsync(string taskName, string groupName)
+ {
+ var sql = "DELETE FROM ScheduleInfo WHERE TaskName=@TaskName AND GroupName=@GroupName";
+ var rows = await DapperHelper.ExecuteAsync(sql, new { TaskName = taskName, GroupName = groupName });
+ return rows > 0;
+ }
+
+ public async Task<List<TaskOptions>> TaskExists(string taskName, string groupName)
+ {
+ var sql = "SELECT * FROM ScheduleInfo WHERE TaskName=@TaskName AND GroupName=@GroupName";
+ return await DapperHelper.QueryAsync<TaskOptions>(sql, new { TaskName = taskName, GroupName = groupName });
+ }
+
+ public async Task<bool> TaskExistsAsync(string taskName, string groupName)
+ {
+ var sql = "SELECT 1 FROM ScheduleInfo WHERE TaskName=@TaskName AND GroupName=@GroupName";
+ var result = await DapperHelper.QueryFirstOrDefaultAsync<int?>(sql, new { TaskName = taskName, GroupName = groupName });
+ return result.HasValue;
+ }
+
+ public async Task<bool> UpdateTaskLastRunTimeAsync(string taskName, string groupName, DateTime lastRunTime)
+ {
+ var sql = "UPDATE ScheduleInfo SET LastRunTime=@LastRunTime,UpdateTime=GETDATE() WHERE TaskName=@TaskName AND GroupName=@GroupName";
+ var rows = await DapperHelper.ExecuteAsync(sql, new { TaskName = taskName, GroupName = groupName, LastRunTime = lastRunTime });
+ return rows > 0;
+ }
+ #endregion
+
+ #region 浠诲姟杩愯鏃ュ織鎿嶄綔
+ public async Task<bool> AddJobRunLogAsync(string taskName, string groupName, DateTime beginDate, DateTime endDate, string msg,string MessagePush,string PushUserCode)
+ {
+ var sql = @"INSERT INTO JobRunLog(TaskName,GroupName,BeginDate,EndDate,Msg,CreateTime,MessagePush,PushUserCode)
+ VALUES(@TaskName,@GroupName,@BeginDate,@EndDate,@Msg,GETDATE(),@MessagePush,@PushUserCode)";
+ var param = new
+ {
+ TaskName = taskName,
+ GroupName = groupName,
+ BeginDate = beginDate,
+ EndDate = endDate,
+ Msg = msg,
+ MessagePush= MessagePush,
+ PushUserCode= PushUserCode
+ };
+ var rows = await DapperHelper.ExecuteAsync(sql, param);
+ return rows > 0;
+ }
+
+ /// <summary>
+ /// 淇锛氬垎椤靛弬鏁板彲閰嶇疆锛岄伩鍏嶅啓姝�100
+ /// </summary>
+ public async Task<List<TaskLog>> GetJobRunLogAsync(string taskName, string groupName, int page, int pageSize = 20)
+ {
+ var sql = $@"SELECT Id,TaskName,GroupName,CONVERT(VARCHAR(20),BeginDate,120) AS BeginDate,
+ CONVERT(VARCHAR(20),EndDate,120) AS EndDate,Msg,CreateTime,MessagePush,PushUserCode
+ FROM JobRunLog
+ WHERE TaskName=@TaskName AND GroupName=@GroupName
+ ORDER BY CreateTime DESC
+ OFFSET {(page - 1) * pageSize} ROWS FETCH NEXT {pageSize} ROWS ONLY";
+ return await DapperHelper.QueryAsync<TaskLog>(sql, new { TaskName = taskName, GroupName = groupName });
+ }
+ #endregion
+
+ #region 浠诲姟鎿嶄綔鏃ュ織鎿嶄綔
+ public async Task<bool> AddJobActionLogAsync(string actionType, string taskName, string groupName, string content)
+ {
+ var sql = @"INSERT INTO JobActionLog(ActionType,TaskName,GroupName,Content,CreateTime)
+ VALUES(@ActionType,@TaskName,@GroupName,@Content,GETDATE())";
+ var param = new
+ {
+ ActionType = actionType,
+ TaskName = taskName,
+ GroupName = groupName,
+ Content = content
+ };
+ var rows = await DapperHelper.ExecuteAsync(sql, param);
+ return rows > 0;
+ }
+ #endregion
+
+ #region 绯荤粺鍚姩鏃ュ織鎿嶄綔
+ public async Task<bool> WriteStartLogAsync(string content)
+ {
+ var sql = "INSERT INTO SystemStartLog(Content,CreateTime) VALUES(@Content,GETDATE())";
+ var rows = await DapperHelper.ExecuteAsync(sql, new { Content = content });
+ return rows > 0;
+ }
+ #endregion
+ }
+}
diff --git a/VueWebCoreApi/Quartz/QuartzSearchData.cs b/VueWebCoreApi/Quartz/QuartzSearchData.cs
deleted file mode 100644
index 7f34698..0000000
--- a/VueWebCoreApi/Quartz/QuartzSearchData.cs
+++ /dev/null
@@ -1,116 +0,0 @@
-锘縰sing Dapper;
-using System;
-using System.Collections.Generic;
-using System.Data;
-using System.Linq;
-using System.Threading.Tasks;
-using VueWebCoreApi.Tools;
-
-namespace VueWebCoreApi.Quartz
-{
- public class QuartzSearchData
- {
- /// <summary>
- /// 鏌ヨ浠诲姟鍒楄〃
- /// </summary>
- /// <returns></returns>
- public static DataTable QuartzSearch()
- {
- //鏌ユ壘浠诲姟鍒楄〃
- var sql = @"select TaskName,GroupName,Interval,ApiUrl,AuthKey,AuthValue,Describe,RequestType,LastRunTime,Status
- from ScheduleInfo";
- var data = DapperHelper.selecttable(sql);
- return data;
- }
-
- /// <summary>
- /// 鏂板浠诲姟
- /// </summary>
- /// <param name="taskOptions"></param>
- /// <returns></returns>
- public static bool QuartzCreate(TaskOptions taskOptions)
- {
- List<object> list = new List<object>();
- string sql = @"insert into ScheduleInfo(TaskName,GroupName,Interval,ApiUrl,AuthKey,AuthValue,Describe,RequestType,LastRunTime,Status,CreateAuthr,CreateTime)
- values(@TaskName,@GroupName,@Interval,@ApiUrl,@AuthKey,@AuthValue,@Describe,@RequestType,@LastRunTime,@Status,@CreateAuthr,@CreateTime)";
- list.Add(new { str = sql, parm = new {
- TaskName = taskOptions.TaskName,
- GroupName = taskOptions.GroupName,
- Interval = taskOptions.Interval,
- ApiUrl = taskOptions.ApiUrl,
- AuthKey = taskOptions.AuthKey,
- AuthValue = taskOptions.AuthValue,
- Describe = taskOptions.Describe,
- RequestType = taskOptions.RequestType,
- LastRunTime = taskOptions.LastRunTime,
- Status=taskOptions.Status,
- CreateAuthr="9999",
- CreateTime= DateTime.Now.ToString()
- }
- });
- bool aa = DapperHelper.DoTransaction(list);
- return aa;
- }
-
- /// <summary>
- /// 淇敼浠诲姟
- /// </summary>
- /// <param name="taskOptions"></param>
- /// <returns></returns>
- public static bool QuartzUpdate(TaskOptions taskOptions)
- {
- List<object> list = new List<object>();
- string sql = @"update ScheduleInfo set TaskName=@TaskName,GroupName=@GroupName,Interval=@Interval,ApiUrl=@ApiUrl,AuthKey=@AuthKey,AuthValue=@AuthValue,Describe=@Describe,RequestType=@RequestType,LastRunTime=@LastRunTime,Status=@Status
- where TaskName=@TaskName and GroupName=@GroupName";
- list.Add(new
- {
- str = sql,
- parm = new
- {
- TaskName = taskOptions.TaskName,
- GroupName = taskOptions.GroupName,
- Interval = taskOptions.Interval,
- ApiUrl = taskOptions.ApiUrl,
- AuthKey = taskOptions.AuthKey,
- AuthValue = taskOptions.AuthValue,
- Describe = taskOptions.Describe,
- RequestType = taskOptions.RequestType,
- LastRunTime = taskOptions.LastRunTime,
- Status = taskOptions.Status
- }
- });
- bool aa = DapperHelper.DoTransaction(list);
- return aa;
- }
-
- /// <summary>
- /// 鍒犻櫎浠诲姟
- /// </summary>
- /// <param name="taskOptions"></param>
- /// <returns></returns>
- public static bool QuartzDelete(TaskOptions taskOptions)
- {
- List<object> list = new List<object>();
- string sql = @"delete ScheduleInfo where TaskName=@TaskName and GroupName=@GroupName";
- list.Add(new
- {
- str = sql,
- parm = new
- {
- TaskName = taskOptions.TaskName,
- GroupName = taskOptions.GroupName,
- Interval = taskOptions.Interval,
- ApiUrl = taskOptions.ApiUrl,
- AuthKey = taskOptions.AuthKey,
- AuthValue = taskOptions.AuthValue,
- Describe = taskOptions.Describe,
- RequestType = taskOptions.RequestType,
- LastRunTime = taskOptions.LastRunTime,
- Status = taskOptions.Status
- }
- });
- bool aa = DapperHelper.DoTransaction(list);
- return aa;
- }
- }
-}
diff --git a/VueWebCoreApi/Quartz/TaskLog.cs b/VueWebCoreApi/Quartz/TaskLog.cs
index d106211..44db825 100644
--- a/VueWebCoreApi/Quartz/TaskLog.cs
+++ b/VueWebCoreApi/Quartz/TaskLog.cs
@@ -7,8 +7,12 @@
{
public class TaskLog
{
+ public long Id { get; set; }
+ public string TaskName { get; set; }
+ public string GroupName { get; set; }
public string BeginDate { get; set; }
public string EndDate { get; set; }
public string Msg { get; set; }
+ public DateTime CreateTime { get; set; }
}
}
diff --git a/VueWebCoreApi/Quartz/TaskOptions.cs b/VueWebCoreApi/Quartz/TaskOptions.cs
index a921c10..775bf0c 100644
--- a/VueWebCoreApi/Quartz/TaskOptions.cs
+++ b/VueWebCoreApi/Quartz/TaskOptions.cs
@@ -7,15 +7,57 @@
{
public class TaskOptions
{
+ /// <summary>
+ /// 浠诲姟鍚嶇О
+ /// </summary>
public string TaskName { get; set; }
+ /// <summary>
+ /// 浠诲姟缁勫悕绉�
+ /// </summary>
public string GroupName { get; set; }
+ /// <summary>
+ /// Cron琛ㄨ揪寮忥紙浠诲姟鎵ц鏃堕棿瑙勫垯锛�
+ /// </summary>
public string Interval { get; set; }
+ /// <summary>
+ /// 浠诲姟瑙﹀彂鐨勬帴鍙e湴鍧�锛圙ET/POST璇锋眰鍦板潃锛�
+ /// </summary>
public string ApiUrl { get; set; }
+ /// <summary>
+ /// 璇锋眰鍙傛暟
+ /// </summary>
+ public string RequestParameters { get; set; }
+ /// <summary>
+ /// 鎺ュ彛璇锋眰鎺堟潈Key锛堣姹傚ご鍙傛暟锛�
+ /// </summary>
public string AuthKey { get; set; }
+ /// <summary>
+ /// 鎺ュ彛璇锋眰鎺堟潈Value锛堣姹傚ご鍙傛暟锛�
+ /// </summary>
public string AuthValue { get; set; }
+ /// <summary>
+ /// 浠诲姟鎻忚堪/澶囨敞锛堣鏄庝换鍔$敤閫旓級
+ /// </summary>
public string Describe { get; set; }
+ /// <summary>
+ /// 璇锋眰鏂瑰紡锛欸ET/POST
+ /// </summary>
public string RequestType { get; set; }
- public DateTime? LastRunTime { get; set; }
+ /// <summary>
+ /// 鏄惁娑堟伅鎺ㄩ�侊細Y/N
+ /// </summary>
+ public string MessagePush { get; set; }
+ /// <summary>
+ /// 娑堟伅鎺ㄩ�佺敤鎴风紪鍙烽泦鍚�
+ /// </summary>
+ public string PushUserCode { get; set; }
+ /// <summary>
+ /// 浠诲姟鐘舵��
+ /// </summary>
public int Status { get; set; }
+ /// <summary>
+ /// 鏈�鍚庢墽琛屾椂闂�
+ /// </summary>
+ public DateTime? LastRunTime { get; set; }
}
}
diff --git a/VueWebCoreApi/SignalR/ChatHub.cs b/VueWebCoreApi/SignalR/ChatHub.cs
index 643cdf2..7eefa98 100644
--- a/VueWebCoreApi/SignalR/ChatHub.cs
+++ b/VueWebCoreApi/SignalR/ChatHub.cs
@@ -19,11 +19,13 @@
private readonly IHttpContextAccessor _httpContextAccessor;
private ILog log = LogManager.GetLogger(Startup.repository.Name, typeof(ChatHub));
ILogger<ChatHub> _logger;
+
public ChatHub(ILogger<ChatHub> logger, IHttpContextAccessor httpContextAccessor)
{
_logger = logger;
_httpContextAccessor = httpContextAccessor;
}
+
/// <summary>
/// 瀹㈡埛绔繛鎺ユ湇鍔$
/// </summary>
@@ -35,6 +37,7 @@
_logger.LogInformation($"Client ConnectionId=> [[{id}]] Already Connection Server锛�");
return base.OnConnectedAsync();
}
+
/// <summary>
/// 瀹㈡埛绔柇寮�杩炴帴
/// </summary>
@@ -43,14 +46,12 @@
public override Task OnDisconnectedAsync(Exception exception)
{
var id = Context.ConnectionId;
- // 鍒犻櫎鐢ㄦ埛ID
- UserIdsStore.Ids.Remove(id);
+ // 浣跨敤绾跨▼瀹夊叏鏂规硶绉婚櫎杩炴帴
+ UserIdsStore.RemoveUser(id);
_logger.LogInformation($"Client ConnectionId=> [[{id}]] Already Close Connection Server!");
return base.OnDisconnectedAsync(exception);
}
- /**
- * 娴嬭瘯
- * */
+
/// <summary>
/// 缁欐墍鏈夊鎴风鍙戦�佹秷鎭�
/// </summary>
@@ -61,27 +62,31 @@
}
/// <summary>
- /// 娣诲姞鍒板湪绾跨敤鎴峰垪琛�
+ /// 娣诲姞鍒板湪绾跨敤鎴峰垪琛紙绾跨▼瀹夊叏鐗堬級
/// </summary>
- /// <param name="usercode"></param>
+ /// <param name="usercode">鐢ㄦ埛缂栫爜</param>
/// <returns></returns>
public async Task AddUser(string usercode)
{
+ if (string.IsNullOrEmpty(usercode))
+ {
+ _logger.LogWarning("AddUser鏂规硶鎺ユ敹鐨剈sercode涓虹┖锛屽拷鐣ユ搷浣�");
+ return;
+ }
+
string cid = Context.ConnectionId;
- if (!UserIdsStore.Ids.ContainsValue(usercode))
+ try
{
- await Task.Run(() => UserIdsStore.Ids.Add(cid, usercode));
+ // 璋冪敤绾跨▼瀹夊叏鐨勬坊鍔�/鏇存柊鏂规硶
+ UserIdsStore.AddOrUpdateUser(cid, usercode);
+ _logger.LogInformation($"鐢ㄦ埛[{usercode}]鐨勮繛鎺{cid}]宸叉敞鍐屽埌鍦ㄧ嚎鍒楄〃");
}
- else
+ catch (Exception ex)
{
- //lambada琛ㄨ揪寮�:鏍规嵁鍊煎幓閿悕Key
- string key = UserIdsStore.Ids.FirstOrDefault(d => d.Value == usercode).Key.ToString();
- // 鍒涘缓涓�涓柊鐨勯敭鍊煎
- UserIdsStore.Ids.Add(cid, usercode);
- // 绉婚櫎鏃х殑閿�煎
- UserIdsStore.Ids.Remove(key);
+ _logger.LogError(ex, $"娣诲姞鐢ㄦ埛[{usercode}]杩炴帴[{cid}]澶辫触");
+ throw; // 鎶涘嚭寮傚父璁╁鎴风鎰熺煡閿欒
}
-
+ await Task.CompletedTask; // 鏃犲紓姝ユ搷浣滄椂杩斿洖宸插畬鎴愪换鍔�
}
}
}
diff --git a/VueWebCoreApi/SignalR/UserIdsStore.cs b/VueWebCoreApi/SignalR/UserIdsStore.cs
index 4090d89..518f115 100644
--- a/VueWebCoreApi/SignalR/UserIdsStore.cs
+++ b/VueWebCoreApi/SignalR/UserIdsStore.cs
@@ -6,10 +6,96 @@
namespace VueWebCoreApi.SignalR
{
/// <summary>
- /// 鐢ㄦ埛id闆嗗悎
+ /// 鐢ㄦ埛杩炴帴ID涓庣敤鎴风紪鐮佹槧灏勫瓨鍌紙绾跨▼瀹夊叏鐗堬級
+ /// 瑙e喅澶氱嚎绋嬪苟鍙戣鍐欏鑷寸殑瀛楀吀鏁版嵁閿欎贡闂
/// </summary>
public static class UserIdsStore
{
- public static Dictionary<string, string> Ids = new Dictionary<string, string>();
+ // 鏇挎崲涓虹嚎绋嬪畨鍏ㄧ殑骞跺彂瀛楀吀
+ private static readonly Dictionary<string, string> _ids = new Dictionary<string, string>();
+ // 鍔犻攣淇濊瘉瀛楀吀鎿嶄綔鐨勫師瀛愭�э紙姣擟oncurrentDictionary鏇寸伒娲绘帶鍒舵壒閲忔搷浣滐級
+ private static readonly object _lockObj = new object();
+
+ /// <summary>
+ /// 瀵瑰鏆撮湶鐨勮繛鎺ユ槧灏勶紙鍙锛岄伩鍏嶅閮ㄧ洿鎺ヤ慨鏀癸級
+ /// </summary>
+ public static IReadOnlyDictionary<string, string> Ids
+ {
+ get
+ {
+ lock (_lockObj)
+ {
+ // 杩斿洖鏂板瓧鍏革紝閬垮厤澶栭儴鎷垮埌寮曠敤鍚庝慨鏀�
+ return new Dictionary<string, string>(_ids);
+ }
+ }
+ }
+
+ /// <summary>
+ /// 娣诲姞/鏇存柊鐢ㄦ埛杩炴帴锛堝師瀛愭搷浣滐級
+ /// </summary>
+ /// <param name="connectionId">SignalR杩炴帴ID</param>
+ /// <param name="userCode">鐢ㄦ埛缂栫爜</param>
+ public static void AddOrUpdateUser(string connectionId, string userCode)
+ {
+ if (string.IsNullOrEmpty(connectionId) || string.IsNullOrEmpty(userCode))
+ throw new ArgumentNullException("杩炴帴ID鍜岀敤鎴风紪鐮佷笉鑳戒负绌�");
+
+ lock (_lockObj)
+ {
+ // 鍏堢Щ闄よ鐢ㄦ埛鐨勬棫杩炴帴锛堜竴涓敤鎴峰彧淇濈暀鏈�鏂扮殑杩炴帴锛�
+ var oldConnIds = _ids.Where(kv => kv.Value == userCode).Select(kv => kv.Key).ToList();
+ foreach (var oldConnId in oldConnIds)
+ {
+ _ids.Remove(oldConnId);
+ }
+ // 娣诲姞鏂拌繛鎺ワ紙瑕嗙洊鍚屽悕connectionId锛岄伩鍏嶉噸澶嶏級
+ if (_ids.ContainsKey(connectionId))
+ {
+ _ids[connectionId] = userCode;
+ }
+ else
+ {
+ _ids.Add(connectionId, userCode);
+ }
+ }
+ }
+
+ /// <summary>
+ /// 绉婚櫎鎸囧畾杩炴帴ID鐨勬槧灏�
+ /// </summary>
+ /// <param name="connectionId">SignalR杩炴帴ID</param>
+ public static void RemoveUser(string connectionId)
+ {
+ if (string.IsNullOrEmpty(connectionId))
+ return;
+
+ lock (_lockObj)
+ {
+ if (_ids.ContainsKey(connectionId))
+ {
+ _ids.Remove(connectionId);
+ }
+ }
+ }
+
+ /// <summary>
+ /// 鏍规嵁鐢ㄦ埛缂栫爜鑾峰彇鎵�鏈夊湪绾胯繛鎺D锛堜竴涓敤鎴峰彲鑳藉绔櫥褰曟椂杩斿洖澶氫釜锛�
+ /// </summary>
+ /// <param name="userCodes">鐢ㄦ埛缂栫爜鍒楄〃</param>
+ /// <returns>杩炴帴ID鍒楄〃</returns>
+ public static List<string> GetConnectionIdsByUserCodes(List<string> userCodes)
+ {
+ if (userCodes == null || userCodes.Count == 0)
+ return new List<string>();
+
+ lock (_lockObj)
+ {
+ return _ids.Where(kv => userCodes.Contains(kv.Value))
+ .Select(kv => kv.Key)
+ .Distinct() // 鍘婚噸锛岄伩鍏嶉噸澶嶆帹閫�
+ .ToList();
+ }
+ }
}
}
diff --git a/VueWebCoreApi/Startup.cs b/VueWebCoreApi/Startup.cs
index 875f154..f7f001d 100644
--- a/VueWebCoreApi/Startup.cs
+++ b/VueWebCoreApi/Startup.cs
@@ -93,23 +93,38 @@
XmlConfigurator.Configure(repository, new FileInfo("Config/log4net.config"));
BasicConfigurator.Configure(repository);
services.AddControllersWithViews();
- //Quartz
- services.AddHttpClient();
+ // 注册HttpContextAccessor
services.AddHttpContextAccessor();
- services.AddSingleton<IPathProvider, PathProvider>();
- services.AddTransient<HttpResultfulJob>();
- services.AddSingleton<ISchedulerFactory, StdSchedulerFactory>();
- services.AddSingleton<IJobFactory, IOCJobFactory>();
+ // 注册HttpClient
+ services.AddHttpClient();
+ // 注册Quartz(补充IOCJobFactory)
+ services.AddSingleton<ISchedulerFactory, StdSchedulerFactory>();
+ services.AddSingleton<IJobFactory>(sp => new IOCJobFactory(sp)); // 关键:注册自定义JobFactory
+ services.AddSingleton<HttpResultfulJob>();
+ services.AddSingleton<QuartzRepository>();
+ // 注册路径提供器
+ services.AddScoped<IPathProvider, PathProvider>();
//跨域设置
+ //services.AddCors(options =>
+ //{
+ // options.AddPolicy(
+ // "cors",
+ // set =>
+ // {
+ // set.SetIsOriginAllowed(origin => true).AllowAnyHeader().AllowAnyMethod().AllowCredentials();
+ // });
+ //});
services.AddCors(options =>
{
options.AddPolicy(
"cors",
set =>
{
- set.SetIsOriginAllowed(origin => true).AllowAnyHeader().AllowAnyMethod().AllowCredentials();
+ set.AllowAnyOrigin()
+ .AllowAnyHeader()
+ .AllowAnyMethod();
});
});
//设置SignalR
@@ -164,11 +179,9 @@
});
#endregion
+
+ // 先重定向 HTTPS(如果需要)
app.UseHttpsRedirection();
-
- app.UseRouting();
-
- app.UseAuthorization();
//添加静态文件中间件
app.UseDefaultFiles();
//添加授权文件
@@ -185,6 +198,11 @@
app.UseStaticFiles();
//跨域
app.UseCors("cors");
+ //路由
+ app.UseRouting();
+ //授权
+ app.UseAuthorization();
+
//用户session服务
app.UseSession();
//cookies
diff --git a/VueWebCoreApi/appsettings.json b/VueWebCoreApi/appsettings.json
index 80b74b6..0b01d76 100644
--- a/VueWebCoreApi/appsettings.json
+++ b/VueWebCoreApi/appsettings.json
@@ -9,13 +9,13 @@
"AllowedHosts": "*",
//鏈嶅姟鍣ㄧ幆澧�
"ConnectionStrings": {
- "DBServer": "Data Source=121.196.36.24,1533;Initial Catalog=vmes_yy;User ID=sa;Password=xkd@20230101;pooling=false",
+ "DBServer": "Data Source=121.196.36.24,1533;Initial Catalog=vmes_alkv2;User ID=sa;Password=xkd@20230101;pooling=false",
//浼佷笟缂栫爜
"CompanyCode": "000",
//浼佷笟鍚嶇О
- "CompanyName": "娴欐睙瀵呭瘏绉戞妧鏈夐檺鍏徃",
+ "CompanyName": "娴欐睙闃块瞾鍏嬪仴韬櫒鏉愭湁闄愬叕鍙�",
//redis浼佷笟閰嶇疆
- "Enterprise": "NewYYMES",
+ "Enterprise": "NewAlkV2MES",
//redis鏁版嵁搴撻摼鎺ラ厤缃甶p
"RedisConnIp": "127.0.0.1",
//redis鏁版嵁搴撻摼鎺ラ厤缃鍙e彿
--
Gitblit v1.9.3