1.车间综合看板接口调整
2.报工记录子表和不良记录表写入报工人员,班组编码
3.修改调整定时任务写入到数据库,并实现消息推送
| | |
| | | [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() |
| | | { |
| | | try |
| | | { |
| | | mes.code = "200"; |
| | | mes.message = "æ¥è¯¢æåï¼"; |
| | | mes.data = await _schedulerFactory.GetJobs(); |
| | | 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) |
| | | { |
| | | // å
¥åæ ¡éª |
| | | if (string.IsNullOrEmpty(taskName) || string.IsNullOrEmpty(groupName)) |
| | | { |
| | | mes.code = "300"; |
| | | mes.message = "ä»»å¡åååç»åä¸è½ä¸ºç©ºï¼"; |
| | | mes.data = null; |
| | | return Json(mes); |
| | | } |
| | | try |
| | | { |
| | | mes.code = "200"; |
| | | mes.data = FileQuartz.GetJobRunLog(taskName, groupName, page); |
| | | 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)); |
| | | } |
| | | } |
| | | } |
| | |
| | | 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) |
| | | { |
| | |
| | | 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 |
| | |
| | | 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 |
| | |
| | | //åå
¥ç¼ºé·è®°å½è¡¨ |
| | | 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 } }); |
| | | |
| | | } |
| | | } |
| | |
| | | //åå
¥ç¼ºé·è®°å½è¡¨ |
| | | 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 } }); |
| | | |
| | | } |
| | | } |
| | |
| | | //åå
¥ç¼ºé·è®°å½è¡¨ |
| | | 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 } }); |
| | | |
| | | } |
| | | } |
| | |
| | | //åå
¥ç¼ºé·è®°å½è¡¨ |
| | | 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 } }); |
| | | |
| | | } |
| | | } |
| | |
| | | |
| | | //åå对åºçæ¥å·¥è®°å½åè¡¨åæ ¼æ°éãä¸è¯æ°éãæ¥åºæ°é |
| | | 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 |
| | | { |
| | |
| | | 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 |
| | | } |
| | |
| | | { |
| | | //ååä¸è¯ |
| | | 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 |
| | | { |
| | |
| | | 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 |
| | | } |
| | |
| | | |
| | | //åå对åºçå¤åè®°å½åè¡¨æ¶ææ°éãä¸è¯æ°éãæ¥åºæ°é |
| | | 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 |
| | | { |
| | |
| | | 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 |
| | | } |
| | |
| | | { |
| | | //ååä¸è¯ |
| | | 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 |
| | | { |
| | |
| | | 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 |
| | | } |
| | |
| | | using System.Linq; |
| | | using System.Net.Http; |
| | | using System.Net.Http.Headers; |
| | | using System.Text; |
| | | using System.Threading.Tasks; |
| | | |
| | | namespace VueWebCoreApi.Quartz |
| | |
| | | { |
| | | 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) |
| | | string finalUrl = url; |
| | | HttpContent content = new StringContent(""); |
| | | |
| | | try |
| | | { |
| | | Content = content |
| | | }; |
| | | // ====================== GET 请æ±ï¼æ¼æ¥åæ°å° URL ====================== |
| | | if (method == HttpMethod.Get && !string.IsNullOrWhiteSpace(parameters)) |
| | | { |
| | | finalUrl = url.Contains("?") |
| | | ? $"{url}&{parameters}" |
| | | : $"{url}?{parameters}"; |
| | | } |
| | | |
| | | // ====================== 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) |
| | | { |
| | | request.Headers.Add(header.Key, header.Value); |
| | | } |
| | | } |
| | | try |
| | | if (!request.Headers.TryAddWithoutValidation(header.Key, header.Value)) |
| | | { |
| | | HttpResponseMessage httpResponseMessage = await client.SendAsync(request); |
| | | content.Headers.TryAddWithoutValidation(header.Key, header.Value); |
| | | } |
| | | } |
| | | } |
| | | |
| | | var result = await httpResponseMessage.Content |
| | | .ReadAsStringAsync(); |
| | | return result; |
| | | 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; } |
| | | } |
| | | } |
| | | } |
| | |
| | | using VueWebCoreApi.Extensions; |
| | | using VueWebCoreApi.SignalR; |
| | | using VueWebCoreApi.Tools; |
| | | using static VueWebCoreApi.Quartz.HttpManager; |
| | | |
| | | namespace VueWebCoreApi.Quartz |
| | | { |
| | | /// <summary> |
| | | /// 宿¶ä»»å¡æ§è¡ç±»ï¼Quartzå°æ¶é´åï¼èªå¨è¿è¡è¿ä¸ªç±»çExecuteæ¹æ³ |
| | | /// ä½ç¨ï¼åéHTTP请æ±ãè®°å½ä»»å¡æ¥å¿ãæ¨éæ§è¡ç»æ |
| | | /// </summary> |
| | | public class HttpResultfulJob : IJob |
| | | { |
| | | private ILog log = LogManager.GetLogger(Startup.repository.Name, typeof(ChatHub)); |
| | | // æ¥å¿è®°å½å·¥å
·ï¼log4netï¼ |
| | | 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 表达å¼ï¼å°æ¶é´å**èªå¨è°ç¨**è¿ä¸ªæ¹æ³ |
| | | /// ä½ç¨ï¼æ§è¡å
·ä½çä»»å¡é»è¾ï¼åéHTTP请æ±ï¼ |
| | | /// </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 ä¸ä¸æè·åå½åè¦æ§è¡çä»»å¡é
ç½®ï¼åç§°ãåç»ãURLãCronçï¼ |
| | | 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")}æªé
ç½®url,", true); |
| | | // æªé
ç½®APIå°åï¼è®°å½æ¥å¿ |
| | | await _quartzRepo.AddJobRunLogAsync(taskOptions.TaskName, taskOptions.GroupName, beginTime, DateTime.Now, "æªé
ç½®URL", 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); |
| | | // å¤æè¯·æ±æ¹å¼ï¼GET æ POSTï¼é»è®¤POSTï¼ |
| | | 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; |
| | | // å¦æè¯·æ±å¼å¸¸ï¼ç½ç»éè¯¯ãæ¥å£æ¥éï¼ï¼è®°å½å¼å¸¸ä¿¡æ¯ |
| | | 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(); //å¹é
å·²ç»ç»å½çæ¨é人åconnectionIds |
| | | 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); |
| | | //åå
¥ä»»å¡å表 |
| | | } |
| | | } |
| | | catch (Exception) |
| | | if (taskOptions.MessagePush == "N"||taskOptions.PushUserCode==null) //æ¯å¦éè¦æ¨é |
| | | { |
| | | } |
| | | Console.WriteLine(trigger.FullName + " " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:sss") + " " + httpMessage); |
| | | _log.Info($"ä½ä¸[{taskOptions.TaskName}]æ éè¦æ¨éçç¨æ·ï¼è·³è¿SignalRæ¨é"); |
| | | return; |
| | | } |
| | | //æ¥éª¤2ï¼æåç¨æ·ç¼ç ï¼å»é + 空å¼è¿æ»¤ï¼ |
| | | var departmentIDs = taskOptions.PushUserCode.Split(',').ToList(); |
| | | |
| | | if (departmentIDs.Count == 0) |
| | | { |
| | | _log.Info($"ä½ä¸[{taskOptions.TaskName}]æ¥è¯¢å°çç¨æ·ç¼ç 为空ï¼è·³è¿SignalRæ¨é"); |
| | | return; |
| | | } |
| | | // æ¥éª¤3ï¼è·åå¨çº¿ç¨æ·çè¿æ¥IDï¼ä½¿ç¨çº¿ç¨å®å
¨æ¹æ³ï¼ |
| | | var targetConnIds = UserIdsStore.GetConnectionIdsByUserCodes(departmentIDs); |
| | | if (targetConnIds.Count == 0) |
| | | { |
| | | _log.Info($"ä½ä¸[{taskOptions.TaskName}]ç®æ ç¨æ·åä¸å¨çº¿ï¼è·³è¿SignalRæ¨é"); |
| | | 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 ex) |
| | | { |
| | | // è®°å½æ¥å¿åå
¥ææ¨é失败çå¼å¸¸ |
| | | _log.Error($"ä½ä¸[{taskOptions.TaskName}]æ¥å¿åå
¥/SignalRæ¨éå¼å¸¸:{ex.Message}", ex); |
| | | } |
| | | // ç³»ç»æ¥å¿è¾åºï¼ä»»å¡æ§è¡ç»æ |
| | | _log.Info($"ä½ä¸[{taskOptions.TaskName}]ç»æ:{DateTime.Now:yyyy-MM-dd HH:mm:ss} ç»æ:{result.ErrorMsg}"); |
| | | } |
| | | } |
| | | } |
| | |
| | | } |
| | | public IJob NewJob(TriggerFiredBundle bundle, IScheduler scheduler) |
| | | { |
| | | // ä»DI容å¨è·åJobå®ä¾ï¼æ¯ææé 彿°æ³¨å
¥ï¼ |
| | | return _serviceProvider.GetService(bundle.JobDetail.JobType) as IJob; |
| | | |
| | | } |
| | | |
| | | public void ReturnJob(IJob job) |
| | | { |
| | | // éæ¾èµæºï¼è¥éè¦ï¼ |
| | | (job as IDisposable)?.Dispose(); |
| | | } |
| | | } |
| | |
| | | å é¤ = 2, |
| | | ä¿®æ¹ = 3, |
| | | æå = 4, |
| | | 忢, |
| | | å¼å¯, |
| | | ç«å³æ§è¡ |
| | | 忢 = 5, |
| | | å¼å¯ = 6, |
| | | ç«å³æ§è¡ = 7 |
| | | } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | using 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; } |
| | | } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | using 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 |
| | | { |
| | | // é
ç½®æä»¶è¯»åï¼å»ºè®®æ¾å°appsettings.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); |
| | | } |
| | | } |
| | | } |
| | | } |
| | |
| | | |
| | | namespace VueWebCoreApi.Quartz |
| | | { |
| | | /// <summary> |
| | | /// Quartzæä»¶åå¨å¸¸éé
ç½® |
| | | /// </summary> |
| | | public class QuartzFileInfo |
| | | { |
| | | /// <summary> |
| | |
| | | |
| | | namespace VueWebCoreApi.Extensions |
| | | { |
| | | /// <summary> |
| | | /// Quartz.NET æ©å±æ¹æ³ç±» |
| | | /// å°è£
Quartzä»»å¡çåå§åãå¢å æ¹æ¥ãå¯åãç«å³æ§è¡çæ ¸å¿æä½ |
| | | /// è§£å³äºSchedulerå¯å¨ãå
å䏿°æ®åºç¶æåæ¥ãCron表达å¼å
¼å®¹ãKeyå¹é
çæ ¸å¿é®é¢ |
| | | /// </summary> |
| | | public static class QuartzNETExtension |
| | | { |
| | | public static ToMessage mes = new ToMessage(); //å®ä¹å
¨å±è¿åä¿¡æ¯å¯¹è±¡ |
| | | /// <summary> |
| | | /// å
¨å±è¿åä¿¡æ¯å¯¹è±¡ï¼ç»ä¸æ¥å£è¿åæ ¼å¼ï¼ |
| | | /// å
å«code(ç¶æç )ãcount(æ°é)ãmessage(æç¤ºä¿¡æ¯)ãdata(æ°æ®) |
| | | /// </summary> |
| | | public static ToMessage mes = new ToMessage(); |
| | | /// <summary> |
| | | /// å
å级任å¡å表ç¼å |
| | | /// ç¨äºåå°æ°æ®åºæ¥è¯¢ï¼åæ¶ä¿è¯å
å䏿°æ®åºç¶æä¸è´ |
| | | /// </summary> |
| | | private static List<TaskOptions> _taskList = new List<TaskOptions>(); |
| | | |
| | | /// <summary> |
| | | /// åå§åä½ä¸ |
| | | /// æ©å±IApplicationBuilderï¼åå§åQuartzä»»å¡è°åº¦å¨å¹¶å è½½ææä»»å¡ |
| | | /// ãæ ¸å¿ä¿®å¤ãè§£å³Quartzé»è®¤ä¸å¯å¨Schedulerçé®é¢ |
| | | /// </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; |
| | | // ä»DI容å¨è·åä¾èµæå¡ |
| | | var services = app.ApplicationServices; |
| | | // Quartzè°åº¦å¨å·¥å |
| | | var schedulerFactory = services.GetService<ISchedulerFactory>(); |
| | | // èªå®ä¹Quartzä»å¨ï¼æ°æ®åºæä½ï¼ |
| | | 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. æ ¸å¿ä¿®å¤ï¼Quartzé»è®¤ä¸ä¼èªå¨å¯å¨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; |
| | | string errorMsg = string.Empty; |
| | | // åå§åå
åä»»å¡å表 |
| | | _taskList = taskList; |
| | | |
| | | foreach (var task in taskList) |
| | | { |
| | | try |
| | | { |
| | | _taskList = JsonConvert.DeserializeObject<List<TaskOptions>>(jobConfig); |
| | | _taskList.ForEach(x => |
| | | { |
| | | 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çAddJobæ¹æ³æ·»å ä»»å¡å°è°åº¦å¨ |
| | | // ä¼ å
¥ä»å¨ç¨äºæ°æ®åºæä½ï¼ä¼ å
¥JobFactoryç¨äºèªå®ä¹Jobå®ä¾å |
| | | var result = task.AddJob(schedulerFactory, true, services.GetService<IJobFactory>(), quartzRepo).GetAwaiter().GetResult(); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | errorCount = +1; |
| | | errorMsg += $"ä½ä¸:{options?.TaskName},å¼å¸¸ï¼{ex.Message}"; |
| | | // è®°å½å个任å¡åå§åå¤±è´¥ä¿¡æ¯ |
| | | errorCount++; |
| | | errorMsg += $"ä½ä¸:{task.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. è·ååç»ä¸ææJobKeyï¼ä»»å¡å¯ä¸æ è¯ï¼åç§°+åç»ï¼ |
| | | 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. è·åä»»å¡å
³èç触åå¨ï¼Quartzä»»å¡éè¿è§¦åå¨è§¦åæ§è¡ï¼ |
| | | 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) |
| | | { |
| | |
| | | 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>ç»ä¸è¿åç»æï¼ToMessageï¼</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. ä¿®å¤åç«¯ä¼ å
¥çCron表达å¼å
¼å®¹æ§é®é¢ |
| | | 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] + " "; |
| | | return new ToMessage { code = "300", count = 0, message = $"ä½ä¸:{task.TaskName},åç»ï¼{task.GroupName}å·²ç»åå¨", data = null }; |
| | | } |
| | | taskOptions.Interval = resultString; |
| | | } |
| | | (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, "æ°å¢ä»»å¡æå");// æä½æ¥å¿ |
| | | } |
| | | |
| | | 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) |
| | | // 5. æå»ºQuartz Jobï¼ä»»å¡æ§è¡ä½ï¼ |
| | | var job = JobBuilder.Create<HttpResultfulJob>()// HttpResultfulJobï¼èªå®ä¹çHTTP请æ±åJob |
| | | .WithIdentity(task.TaskName, task.GroupName)// 设置Jobå¯ä¸æ è¯ï¼åç§°+åç»ï¼ |
| | | .Build(); |
| | | |
| | | IScheduler scheduler = await schedulerFactory.GetScheduler(); |
| | | // 6. æå»ºCron触åå¨ï¼æCron表达å¼è§¦åï¼ |
| | | var trigger = TriggerBuilder.Create() |
| | | .WithIdentity(task.TaskName, task.GroupName)// 触åå¨å¯ä¸æ è¯ï¼ä¸Jobä¿æä¸è´ï¼ |
| | | .StartNow()// ç«å³å¯å¨ |
| | | .WithDescription(task.Describe)// ä»»å¡æè¿° |
| | | .WithCronSchedule(task.Interval)// ç»å®Cronè¡¨è¾¾å¼ |
| | | .Build(); |
| | | |
| | | 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. 设置èªå®ä¹JobFactoryï¼å¦éæ§å¶Jobçä¾èµæ³¨å
¥/å®ä¾åï¼ |
| | | if (jobFactory != null) |
| | | { |
| | | scheduler.JobFactory = jobFactory; |
| | | } |
| | | |
| | | // 9. å°Jobå触åå¨ç»å®å°è°åº¦å¨ |
| | | 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);// æ¾å¼æ¢å¤ï¼ç¡®ä¿è§¦å卿£å¸¸è¿è¡ï¼ |
| | | } |
| | | 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 ="æ§è¡æåï¼"; |
| | |
| | | } |
| | | 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> |
| | | /// ç«å³æ§è¡ä¸æ¬¡ä½ä¸ |
| | | /// ç«å³æ§è¡ä»»å¡ï¼æ è§Cron表达å¼ï¼ |
| | | /// </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. é¢å¤çCron表达å¼ï¼ä¿®å¤åç«¯ä¼ å
¥ç表达å¼ï¼ |
| | | if (task != null) task.Interval = FixCronExpression(task.Interval); |
| | | |
| | | if (trigger == null) |
| | | // 2. è·åè°åº¦å¨å¹¶ç¡®ä¿å¯å¨ï¼æ ¸å¿ä¿®å¤1ï¼å
¨å±Schedulerå¯å¨æ ¡éªï¼ |
| | | var scheduler = await schedulerFactory.GetScheduler(); |
| | | // æ ¸å¿ä¿®å¤1ï¼ç¡®ä¿Schedulerå
¨å±å¯å¨ |
| | | if (!scheduler.IsStarted) await scheduler.Start(); |
| | | |
| | | // 3. æ ¸å¿ä¿®å¤2ï¼æ£ç¡®æå»ºJobKeyï¼ä»»å¡å+åç»ï¼ï¼è§£å³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.å é¤: |
| | | // æå触åå¨ -> è§£ç»è§¦åå¨ -> å é¤Job -> 忥å
å+æ°æ®åº -> è®°å½æ¥å¿ |
| | | 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); |
| | | await quartzRepo.AddJobActionLogAsync(action.ToString(), taskName, groupName, "å é¤ä»»å¡æå"); |
| | | break; |
| | | |
| | | case JobAction.ä¿®æ¹: |
| | | // ä¿®æ¹é»è¾ï¼å
å 餿§ä»»å¡ -> éæ°æ·»å æ°é
ç½® -> è®°å½æ¥å¿ |
| | | 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); |
| | | 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(); |
| | | } |
| | | 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.ç«å³æ§è¡: |
| | | if (taskOptions != null && taskOptions.Status != (int)TriggerState.Normal) |
| | | { |
| | | result = taskOptions.ModifyTaskEntity(schedulerFactory, JobAction.å¼å¯); |
| | | |
| | | 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.ç«å³æ§è¡: |
| | | // ç«å³æ§è¡åç¡®ä¿ä»»å¡å¤äºå¯å¨ç¶æ -> 触åJobç«å³æ§è¡ -> è®°å½æ¥å¿ |
| | | if (task.Status != (int)TriggerState.Normal) |
| | | { |
| | | 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"; |
| | |
| | | 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> |
| | | /// |
| | | /// ä¿®å¤åç«¯ä¼ å
¥çCron表达å¼ç¼ºé· |
| | | /// å
¼å®¹ASP.NET Core 3.1ä¸Cron表达å¼ç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 è¯æ³ï¼ |
| | | // ä¿®å¤åºæ¯ï¼Dayåæ®µä¸º1L/2L...7L ä¸ å¨å段为? æ¶ï¼äº¤æ¢Dayåå¨å段 |
| | | // åå ï¼å端å¯è½æ··æ·äºDay/å¨å段çåæ³ï¼Quartz对Lï¼æåä¸å¤©ï¼çè§£ææç¹å®è§å |
| | | 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]; // å¨å段 = åDayåæ®µ |
| | | 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å
ç½®çCronTriggerImpléªè¯è¡¨è¾¾å¼ |
| | | var trigger = new CronTriggerImpl(); |
| | | trigger.CronExpressionString = cronExpression; |
| | | DateTimeOffset? date = trigger.ComputeFirstFireTimeUtc(null); |
| | | return (date != null, date == null ? $"请确认表达å¼{cronExpression}æ¯å¦æ£ç¡®!" : ""); |
| | | // 计ç®ç¬¬ä¸ä¸ªè§¦åæ¶é´ï¼nullè¡¨ç¤ºè¡¨è¾¾å¼æ æ |
| | | var date = trigger.ComputeFirstFireTimeUtc(null); |
| | | return (date != null, date == null ? $"表达å¼{cronExpression}æ æ!" : string.Empty); |
| | | } |
| | | catch (Exception e) |
| | | { |
| | | return (false, $"请确认表达å¼{cronExpression}æ¯å¦æ£ç¡®!{e.Message}"); |
| | | } |
| | | return (false, $"表达å¼{cronExpression}æ æ!{e.Message}"); |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// ä»Jobæ§è¡ä¸ä¸æè·åä»»å¡é
ç½® |
| | | /// ç¨äº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); |
| | | } |
| | | } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | using 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 |
| | | } |
| | | } |
| | |
| | | { |
| | | 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; } |
| | | } |
| | | } |
| | |
| | | { |
| | | 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> |
| | | /// ä»»å¡è§¦åçæ¥å£å°åï¼GET/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> |
| | | /// è¯·æ±æ¹å¼ï¼GET/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; } |
| | | } |
| | | } |
| | |
| | | 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> |
| | |
| | | _logger.LogInformation($"Client ConnectionId=> [[{id}]] Already Connection Serverï¼"); |
| | | return base.OnConnectedAsync(); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 客æ·ç«¯æå¼è¿æ¥ |
| | | /// </summary> |
| | |
| | | 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> |
| | |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æ·»å å°å¨çº¿ç¨æ·å表 |
| | | /// æ·»å å°å¨çº¿ç¨æ·å表ï¼çº¿ç¨å®å
¨çï¼ |
| | | /// </summary> |
| | | /// <param name="usercode"></param> |
| | | /// <param name="usercode">ç¨æ·ç¼ç </param> |
| | | /// <returns></returns> |
| | | public async Task AddUser(string usercode) |
| | | { |
| | | string cid = Context.ConnectionId; |
| | | if (!UserIdsStore.Ids.ContainsValue(usercode)) |
| | | if (string.IsNullOrEmpty(usercode)) |
| | | { |
| | | await Task.Run(() => UserIdsStore.Ids.Add(cid, usercode)); |
| | | } |
| | | else |
| | | { |
| | | //lambada表达å¼:æ ¹æ®å¼å»é®åKey |
| | | string key = UserIdsStore.Ids.FirstOrDefault(d => d.Value == usercode).Key.ToString(); |
| | | // å建ä¸ä¸ªæ°çé®å¼å¯¹ |
| | | UserIdsStore.Ids.Add(cid, usercode); |
| | | // ç§»é¤æ§çé®å¼å¯¹ |
| | | UserIdsStore.Ids.Remove(key); |
| | | _logger.LogWarning("AddUseræ¹æ³æ¥æ¶çusercode为空ï¼å¿½ç¥æä½"); |
| | | return; |
| | | } |
| | | |
| | | string cid = Context.ConnectionId; |
| | | try |
| | | { |
| | | // è°ç¨çº¿ç¨å®å
¨çæ·»å /æ´æ°æ¹æ³ |
| | | UserIdsStore.AddOrUpdateUser(cid, usercode); |
| | | _logger.LogInformation($"ç¨æ·[{usercode}]çè¿æ¥[{cid}]已注åå°å¨çº¿å表"); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | _logger.LogError(ex, $"æ·»å ç¨æ·[{usercode}]è¿æ¥[{cid}]失败"); |
| | | throw; // æåºå¼å¸¸è®©å®¢æ·ç«¯æç¥é误 |
| | | } |
| | | await Task.CompletedTask; // æ 弿¥æä½æ¶è¿åå·²å®æä»»å¡ |
| | | } |
| | | } |
| | | } |
| | |
| | | namespace VueWebCoreApi.SignalR |
| | | { |
| | | /// <summary> |
| | | /// ç¨æ·idéå |
| | | /// ç¨æ·è¿æ¥IDä¸ç¨æ·ç¼ç æ å°åå¨ï¼çº¿ç¨å®å
¨çï¼ |
| | | /// è§£å³å¤çº¿ç¨å¹¶å读å导è´çåå
¸æ°æ®éä¹±é®é¢ |
| | | /// </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>(); |
| | | // å éä¿è¯åå
¸æä½çååæ§ï¼æ¯ConcurrentDictionaryæ´çµæ´»æ§å¶æ¹éæä½ï¼ |
| | | 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> |
| | | /// æ ¹æ®ç¨æ·ç¼ç è·åææå¨çº¿è¿æ¥IDï¼ä¸ä¸ªç¨æ·å¯è½å¤ç«¯ç»å½æ¶è¿åå¤ä¸ªï¼ |
| | | /// </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(); |
| | | } |
| | | } |
| | | } |
| | | } |
| | |
| | | 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 |
| | |
| | | |
| | | }); |
| | | #endregion |
| | | |
| | | // å
éå®å HTTPSï¼å¦æéè¦ï¼ |
| | | app.UseHttpsRedirection(); |
| | | |
| | | app.UseRouting(); |
| | | |
| | | app.UseAuthorization(); |
| | | //æ·»å éææä»¶ä¸é´ä»¶ |
| | | app.UseDefaultFiles(); |
| | | //æ·»å æææä»¶ |
| | |
| | | app.UseStaticFiles(); |
| | | //è·¨å |
| | | app.UseCors("cors"); |
| | | //è·¯ç± |
| | | app.UseRouting(); |
| | | //ææ |
| | | app.UseAuthorization(); |
| | | |
| | | //ç¨æ·sessionæå¡ |
| | | app.UseSession(); |
| | | //cookies |
| | |
| | | "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æ°æ®åºé¾æ¥é
ç½®ip |
| | | "RedisConnIp": "127.0.0.1", |
| | | //redisæ°æ®åºé¾æ¥é
置端å£å· |