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() |
| | | { |
| | | mes.code = "200"; |
| | | mes.message = "æ¥è¯¢æåï¼"; |
| | | mes.data = await _schedulerFactory.GetJobs(); |
| | | try |
| | | { |
| | | mes.code = "200"; |
| | | mes.message = "æ¥è¯¢æåï¼"; |
| | | mes.data = await _schedulerFactory.GetJobs(_quartzRepo); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | mes.code = "300"; |
| | | mes.message = "æ¥è¯¢å¤±è´¥ï¼" + ex.Message; |
| | | mes.data = null; |
| | | } |
| | | return Json(mes); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// è·åä½ä¸è¿è¡æ¥å¿ |
| | | /// </summary> |
| | | /// <param name="taskName"></param> |
| | | /// <param name="groupName"></param> |
| | | /// <param name="page"></param> |
| | | /// <returns></returns> |
| | | [Route(template: "GetRunLog")] |
| | | [Route("GetRunLog")] |
| | | [HttpGet] |
| | | public IActionResult GetRunLog(string taskName, string groupName, int page = 1) |
| | | public async Task<IActionResult> GetRunLog(string taskName, string groupName, int page = 1) |
| | | { |
| | | mes.code = "200"; |
| | | mes.data = FileQuartz.GetJobRunLog(taskName, groupName, page); |
| | | // å
¥åæ ¡éª |
| | | if (string.IsNullOrEmpty(taskName) || string.IsNullOrEmpty(groupName)) |
| | | { |
| | | mes.code = "300"; |
| | | mes.message = "ä»»å¡åååç»åä¸è½ä¸ºç©ºï¼"; |
| | | mes.data = null; |
| | | return Json(mes); |
| | | } |
| | | try |
| | | { |
| | | mes.code = "200"; |
| | | mes.message = "æ¥è¯¢æåï¼"; |
| | | mes.data = await _quartzRepo.GetJobRunLogAsync(taskName, groupName, page); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | mes.code = "300"; |
| | | mes.message = "æ¥è¯¢å¤±è´¥ï¼" + ex.Message; |
| | | mes.data = null; |
| | | } |
| | | return Json(mes); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æ·»å ä»»å¡ |
| | | /// </summary> |
| | | /// <param name="taskOptions"></param> |
| | | /// <returns></returns> |
| | | [Route(template: "Add")] |
| | | [Route("Add")] |
| | | [HttpPost] |
| | | //[TaskAuthor] |
| | | public async Task<IActionResult> Add(TaskOptions taskOptions) |
| | | { |
| | | return Json(await taskOptions.AddJob(_schedulerFactory, jobFactory: _jobFactory)); |
| | | if (string.IsNullOrEmpty(taskOptions.TaskName) || string.IsNullOrEmpty(taskOptions.GroupName)) |
| | | { |
| | | mes.code = "300"; |
| | | mes.message = "ä»»å¡åååç»åä¸è½ä¸ºç©ºï¼"; |
| | | return Json(mes); |
| | | } |
| | | return Json(await taskOptions.AddJob(_schedulerFactory, false, _jobFactory, _quartzRepo)); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// å é¤ä»»å¡ |
| | | /// </summary> |
| | | /// <param name="taskOptions"></param> |
| | | /// <returns></returns> |
| | | [Route(template: "Remove")] |
| | | [Route("Remove")] |
| | | [HttpPost] |
| | | //[TaskAuthor] |
| | | public async Task<IActionResult> Remove(TaskOptions taskOptions) |
| | | { |
| | | return Json(await _schedulerFactory.Remove(taskOptions)); |
| | | if (string.IsNullOrEmpty(taskOptions.TaskName) || string.IsNullOrEmpty(taskOptions.GroupName)) |
| | | { |
| | | mes.code = "300"; |
| | | mes.message = "ä»»å¡åååç»åä¸è½ä¸ºç©ºï¼"; |
| | | return Json(mes); |
| | | } |
| | | return Json(await _schedulerFactory.Remove(taskOptions, _quartzRepo)); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// ä¿®æ¹ä»»å¡ |
| | | /// </summary> |
| | | /// <param name="taskOptions"></param> |
| | | /// <returns></returns> |
| | | [Route(template: "Update")] |
| | | [Route("Update")] |
| | | [HttpPost] |
| | | //[TaskAuthor] |
| | | public async Task<IActionResult> Update(TaskOptions taskOptions) |
| | | { |
| | | return Json(await _schedulerFactory.Update(taskOptions)); |
| | | if (string.IsNullOrEmpty(taskOptions.TaskName) || string.IsNullOrEmpty(taskOptions.GroupName)) |
| | | { |
| | | mes.code = "300"; |
| | | mes.message = "ä»»å¡åååç»åä¸è½ä¸ºç©ºï¼"; |
| | | return Json(mes); |
| | | } |
| | | return Json(await _schedulerFactory.Update(taskOptions, _quartzRepo)); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æåä»»å¡ |
| | | /// </summary> |
| | | /// <param name="taskOptions"></param> |
| | | /// <returns></returns> |
| | | [Route(template: "Pause")] |
| | | [Route("Pause")] |
| | | [HttpPost] |
| | | //[TaskAuthor] |
| | | public async Task<IActionResult> Pause(TaskOptions taskOptions) |
| | | { |
| | | return Json(await _schedulerFactory.Pause(taskOptions)); |
| | | if (string.IsNullOrEmpty(taskOptions.TaskName) || string.IsNullOrEmpty(taskOptions.GroupName)) |
| | | { |
| | | mes.code = "300"; |
| | | mes.message = "ä»»å¡åååç»åä¸è½ä¸ºç©ºï¼"; |
| | | return Json(mes); |
| | | } |
| | | // æ ¡éªä»»å¡æ¯å¦åå¨ |
| | | if (!await _quartzRepo.TaskExistsAsync(taskOptions.TaskName, taskOptions.GroupName)) |
| | | { |
| | | mes.code = "300"; |
| | | mes.message = "ä»»å¡ä¸åå¨ï¼"; |
| | | return Json(mes); |
| | | } |
| | | return Json(await _schedulerFactory.Pause(taskOptions, _quartzRepo)); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// å¼å¯ä»»å¡ |
| | | /// </summary> |
| | | /// <param name="taskOptions"></param> |
| | | /// <returns></returns> |
| | | [Route(template: "Start")] |
| | | [Route("Start")] |
| | | [HttpPost] |
| | | //[TaskAuthor] |
| | | public async Task<IActionResult> Start(TaskOptions taskOptions) |
| | | { |
| | | return Json(await _schedulerFactory.Start(taskOptions)); |
| | | if (string.IsNullOrEmpty(taskOptions.TaskName) || string.IsNullOrEmpty(taskOptions.GroupName)) |
| | | { |
| | | mes.code = "300"; |
| | | mes.message = "ä»»å¡åååç»åä¸è½ä¸ºç©ºï¼"; |
| | | return Json(mes); |
| | | } |
| | | if (!await _quartzRepo.TaskExistsAsync(taskOptions.TaskName, taskOptions.GroupName)) |
| | | { |
| | | mes.code = "300"; |
| | | mes.message = "ä»»å¡ä¸åå¨ï¼"; |
| | | return Json(mes); |
| | | } |
| | | return Json(await _schedulerFactory.Start(taskOptions, _quartzRepo)); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// ç«å³æ§è¡ |
| | | /// </summary> |
| | | /// <param name="taskOptions"></param> |
| | | /// <returns></returns> |
| | | [Route(template: "Run")] |
| | | [Route("Run")] |
| | | [HttpPost] |
| | | //[TaskAuthor] |
| | | public async Task<IActionResult> Run(TaskOptions taskOptions) |
| | | { |
| | | return Json(await _schedulerFactory.Run(taskOptions)); |
| | | if (string.IsNullOrEmpty(taskOptions.TaskName) || string.IsNullOrEmpty(taskOptions.GroupName)) |
| | | { |
| | | mes.code = "300"; |
| | | mes.message = "ä»»å¡åååç»åä¸è½ä¸ºç©ºï¼"; |
| | | return Json(mes); |
| | | } |
| | | if (!await _quartzRepo.TaskExistsAsync(taskOptions.TaskName, taskOptions.GroupName)) |
| | | { |
| | | mes.code = "300"; |
| | | mes.message = "ä»»å¡ä¸åå¨ï¼"; |
| | | return Json(mes); |
| | | } |
| | | return Json(await _schedulerFactory.Run(taskOptions, _quartzRepo)); |
| | | } |
| | | } |
| | | } |
| | |
| | | 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) |
| | | { |
| | |
| | | #endregion |
| | | |
| | | #region[ERP订åä¸è¾¾] |
| | | public static ToMessage MarkSaveErpOrder(string erporderid, string sbid, string erpordercode, string saleordercode, string partcode,string deptcode, string wkshopcode, string warehousecode, string erpqty, string markqty, string ordernum, string relse_qty, string idTopInventory, string TopInventoryCode, string TopInventoryName, string saleOrderDeliveryDate, string paystartdate, string payenddate, string clerkuser, User us) |
| | | public static ToMessage MarkSaveErpOrder(string erporderid, string sbid, string erpordercode, string saleordercode, string partcode, string deptcode, string wkshopcode, string warehousecode, string erpqty, string markqty, string ordernum, string relse_qty, string idTopInventory, string TopInventoryCode, string TopInventoryName, string saleOrderDeliveryDate, string paystartdate, string payenddate, string clerkuser, User us) |
| | | { |
| | | var sql = ""; |
| | | string orderstatus = "", isstep = ""; //å·¥åç¶æãæ¯å¦ç»å®å·¥èº |
| | |
| | | wo_code = wo, |
| | | wotype = "PO", |
| | | status = orderstatus, //"NEW" |
| | | dept_code= deptcode, |
| | | dept_code = deptcode, |
| | | wkshp_code = wkshopcode, |
| | | plan_qty = cdqty + (decimal.Parse(markqty) - sumqty), //æ«åä¸åæ°é=ååæ°é+(ä¸åæ°é-累计ååä¸åæ°é) |
| | | stck_code = warehousecode, |
| | |
| | | wo_code = wo, |
| | | wotype = "PO", |
| | | status = orderstatus, //"NEW" |
| | | dept_code=deptcode, |
| | | dept_code = deptcode, |
| | | wkshp_code = wkshopcode, |
| | | plan_qty = cdqty, |
| | | stck_code = warehousecode, |
| | |
| | | wo_code = wo, |
| | | wotype = "PO", |
| | | status = orderstatus, //"NEW" |
| | | dept_code=model.deptcode, |
| | | dept_code = model.deptcode, |
| | | wkshp_code = model.wkshopcode, |
| | | plan_qty = decimal.Parse(model.erpqty), //è®¢åæ°é |
| | | stck_code = model.warehousecode, |
| | | sbid = model.sbid, |
| | | materiel_code = model.partcode, |
| | | route_code=data0.Rows.Count<=0?"": data0.Rows[0]["default_route"].ToString(), |
| | | route_code = data0.Rows.Count <= 0 ? "" : data0.Rows[0]["default_route"].ToString(), |
| | | sourceid = model.erporderid, |
| | | m_po = model.erpordercode, |
| | | username = us.usercode, |
| | |
| | | data_sources = "ERP", |
| | | isstep = isstep, //æ¯å¦å
³èå·¥åº "N" |
| | | clerkuser = model.clerkuser, //éå®è®¢åä¸å¡å |
| | | idTopInventory =model.idTopInventory, |
| | | idTopInventory = model.idTopInventory, |
| | | TopInventoryCode = model.TopInventoryCode, |
| | | TopInventoryName = model.TopInventoryName |
| | | } |
| | |
| | | seq = data0.Rows[i]["seq"].ToString(), |
| | | step_code = data0.Rows[i]["step_code"].ToString(), |
| | | route_code = data0.Rows[i]["default_route"].ToString(), |
| | | stepprice = decimal.Parse(data0.Rows[i]["unprice"].ToString()==""|| data0.Rows[i]["unprice"].ToString() ==null? "0":data0.Rows[i]["unprice"].ToString()), |
| | | stepprice = decimal.Parse(data0.Rows[i]["unprice"].ToString() == "" || data0.Rows[i]["unprice"].ToString() == null ? "0" : data0.Rows[i]["unprice"].ToString()), |
| | | plan_quantity = decimal.Parse(model.erpqty), //è®¢åæ°é |
| | | plan_qty = decimal.Parse(model.erpqty), //è®¢åæ°é |
| | | ratio = 0, |
| | |
| | | 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 |
| | |
| | | materiel_code = json.partcode, |
| | | route_code = route_code, |
| | | sourceid = json.sourceid == "" ? null : json.sourceid, //æ æºåæ¶èµå¼NULL |
| | | saleOrderCode=json.saleordercode, |
| | | saleOrderCode = json.saleordercode, |
| | | m_po = json.sourcewo, |
| | | saleOrderDeliveryDate = json.deliverydate, |
| | | plan_startdate = json.paystartdate, |
| | |
| | | stepprice = json.WorkListSub[i].stepprice, |
| | | plan_quantity = json.woqty, |
| | | plan_qty = json.WorkListSub[i].sumqty, |
| | | ratio=json.WorkListSub[i].ratio, |
| | | ratio = json.WorkListSub[i].ratio, |
| | | status = json.wostatus, |
| | | isbott = json.WorkListSub[i].isbott, |
| | | isend = json.WorkListSub[i].isend, |
| | |
| | | stepprice = json.WorkListSub[i].stepprice, |
| | | plan_quantity = json.woqty, |
| | | plan_qty = json.WorkListSub[i].sumqty, |
| | | ratio=json.WorkListSub[i].ratio, |
| | | ratio = json.WorkListSub[i].ratio, |
| | | status = json.wostatus, |
| | | isbott = json.WorkListSub[i].isbott, |
| | | isend = json.WorkListSub[i].isend, |
| | |
| | | |
| | | if (worksteplist[i].data_sources == "ERP") //æ°æ®æ¥æºERP |
| | | { |
| | | |
| | | |
| | | //æ¥è¯¢å½åå·¥åå¯ä¿®æ¹æ°é=è®¢åæ»æ°-å·²ä¸è¾¾å·¥åæ»æ° |
| | | sql = @"select isnull(plan_qty,0) as plan_qty from TK_Wrk_Man |
| | | where sourceid=@sourceid and m_po=@sourcewo and wo_code=@wocode"; |
| | |
| | | |
| | | // ååå
¸ä¸æ·»å æ°æ® |
| | | dict.Add("canupdate_qty", canupdate_qty); |
| | | dict.Add("stepdata", data1); |
| | | dict.Add("stepdata", data1); |
| | | // å°åå
¸æ·»å å°åè¡¨ä¸ |
| | | dir.Add(dict); |
| | | mes.code = "200"; |
| | |
| | | materiel_code = json[i].partcode, |
| | | route_code = route_code, |
| | | sourceid = json[i].sourceid == "" ? null : json[i].sourceid, //æ æºåæ¶èµå¼NULL |
| | | saleOrderCode=json[i].saleordercode, |
| | | saleOrderCode = json[i].saleordercode, |
| | | m_po = json[i].sourcewo, |
| | | saleOrderDeliveryDate = json[i].deliverydate, |
| | | plan_startdate = json[i].paystartdate, |
| | |
| | | stepprice = json[i].WorkListSub[j].stepprice, |
| | | plan_quantity = json[i].woqty, |
| | | plan_qty = json[i].WorkListSub[j].sumqty, |
| | | ratio=json[i].WorkListSub[j].ratio, |
| | | ratio = json[i].WorkListSub[j].ratio, |
| | | status = json[i].wostatus, |
| | | isbott = json[i].WorkListSub[j].isbott, |
| | | isend = json[i].WorkListSub[j].isend, |
| | |
| | | materiel_code = json[i].partcode, |
| | | route_code = route_code, |
| | | sourceid = json[i].sourceid == "" ? null : json[i].sourceid, //æ æºåæ¶èµå¼NULL |
| | | saleOrderCode=json[i].saleordercode, |
| | | saleOrderCode = json[i].saleordercode, |
| | | m_po = json[i].sourcewo, |
| | | saleOrderDeliveryDate = json[i].deliverydate, |
| | | plan_startdate = json[i].paystartdate, |
| | |
| | | stepprice = json[i].WorkListSub[j].stepprice, |
| | | plan_quantity = json[i].woqty, |
| | | plan_qty = json[i].WorkListSub[j].sumqty, |
| | | ratio=json[i].WorkListSub[j].ratio, |
| | | ratio = json[i].WorkListSub[j].ratio, |
| | | status = json[i].wostatus, |
| | | isbott = json[i].WorkListSub[j].isbott, |
| | | isend = json[i].WorkListSub[j].isend, |
| | |
| | | { |
| | | wocode = wocodelist, |
| | | status = "ALLO", |
| | | distributionuser=us.usercode, |
| | | distributiontime= DateTime.Now.ToString() |
| | | distributionuser = us.usercode, |
| | | distributiontime = DateTime.Now.ToString() |
| | | } |
| | | }); |
| | | //æ´æ°å·¥åºä»»å¡è¡¨ç¶æ |
| | |
| | | |
| | | |
| | | #region[çäº§å¼æ¥å·¥æ«ç è·åå·¥å对åºå·¥åºä»»å¡(èªå¶)] |
| | | public static ToMessage MesOrderStepSearch(string wkshopcode, string wocode,string orderno,string saorderno, string partcode, string partname, string partspec, int startNum, int endNum, string prop, string order) |
| | | public static ToMessage MesOrderStepSearch(string wkshopcode, string wocode, string orderno, string saorderno, string partcode, string partname, string partspec, int startNum, int endNum, string prop, string order) |
| | | { |
| | | var sql = ""; |
| | | string search = ""; |
| | |
| | | #endregion |
| | | |
| | | #region[çäº§å¼æ¥å·¥æ«ç è·åå·¥å对åºå·¥åºä»»å¡(å¤å)] |
| | | public static ToMessage MesOrderWxStepSearch(string wkshopcode, string wocode, string orderno,string saorderno, string partcode, string partname, string partspec, int startNum, int endNum, string prop, string order) |
| | | public static ToMessage MesOrderWxStepSearch(string wkshopcode, string wocode, string orderno, string saorderno, string partcode, string partname, string partspec, int startNum, int endNum, string prop, string order) |
| | | { |
| | | var sql = ""; |
| | | string search = ""; |
| | |
| | | #endregion |
| | | |
| | | #region[çäº§å¼æ¥å·¥æ«ç è·åå·¥å对åºå·¥åºä»»å¡(ä¸è¯)] |
| | | public static ToMessage MesOrderNgStepSearch(string wkshopcode, string wocode, string orderno,string saorderno, string partcode, string partname, string partspec, int startNum, int endNum, string prop, string order) |
| | | public static ToMessage MesOrderNgStepSearch(string wkshopcode, string wocode, string orderno, string saorderno, string partcode, string partname, string partspec, int startNum, int endNum, string prop, string order) |
| | | { |
| | | var sql = ""; |
| | | string search = ""; |
| | |
| | | rt.stepname = data.Rows[0]["stepname"].ToString(); //å·¥åºåç§° |
| | | rt.stepdesc = data.Rows[0]["descr"].ToString(); //å·¥åºæè¿° |
| | | rt.planqty = decimal.Parse(data.Rows[0]["plan_qty"].ToString()); //ä»»å¡è¶
äº§æ»æ°é |
| | | rt.planquantity= decimal.Parse(data.Rows[0]["plan_quantity"].ToString()); //任塿°é |
| | | rt.planquantity = decimal.Parse(data.Rows[0]["plan_quantity"].ToString()); //任塿°é |
| | | rt.noreportqty = decimal.Parse(data.Rows[0]["good_qty"].ToString()); //æ¥å·¥æ°é |
| | | rt.noputqty = decimal.Parse(data.Rows[0]["ng_qty"].ToString()); //ä¸è¯æ°é |
| | | string isend = data.Rows[0]["isend"].ToString();//æ«éå·¥åº |
| | |
| | | else //ä¸æåºæ¶åæ |
| | | { |
| | | mes = ScanStartReport.NoWXEncodingSeach(SelectType, wocode, stepcode); |
| | | } |
| | | } |
| | | break; |
| | | default: |
| | | break; |
| | |
| | | #endregion |
| | | |
| | | #region[çäº§å¼æ¥å·¥,æ¥å·¥æäº¤] |
| | | public static ToMessage SavaMesOrderStepReport(string mesordercode, string partcode, string stepseq, string stepcode, string stepprice, string eqpcode, string inbarcode, string reckway, string usergroupcode, string reportuser,string payrate, string taskqty, string startqty, string reportqty, List<ReportDefectList> defectobjs, string remarks, User us) |
| | | public static ToMessage SavaMesOrderStepReport(string mesordercode, string partcode, string stepseq, string stepcode, string stepprice, string eqpcode, string inbarcode, string reckway, string usergroupcode, string reportuser, string payrate, string taskqty, string startqty, string reportqty, List<ReportDefectList> defectobjs, string remarks, User us) |
| | | { |
| | | var sql = ""; |
| | | decimal ngqty = 0; |
| | |
| | | { |
| | | m_id = int.Parse(dt.Rows[0]["ID"].ToString()), |
| | | eqp_code = eqpcode, |
| | | payrate= payrate, |
| | | payrate = payrate, |
| | | report_person = reportuser, |
| | | report_date = date, |
| | | report_qty = reportqty, |
| | |
| | | //åå
¥ç¼ºé·è®°å½è¡¨ |
| | | 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 } }); |
| | | |
| | | } |
| | | } |
| | |
| | | { |
| | | m_id = int.Parse(dt.Rows[0]["ID"].ToString()), |
| | | eqp_code = eqpcode, |
| | | payrate= payrate, |
| | | payrate = payrate, |
| | | report_person = reportuser, |
| | | report_date = date, |
| | | report_qty = reportqty, |
| | |
| | | //åå
¥ç¼ºé·è®°å½è¡¨ |
| | | 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 } }); |
| | | |
| | | } |
| | | } |
| | |
| | | |
| | | |
| | | #region[ç产æ§è¡,æ¥å·¥è°æ´æ°æ®æ¥è¯¢æ¥å£] |
| | | public static ToMessage MesOrderStepVerifySearch(string wkshopcode, string wo_code,string orderno,string saorderno, string partnumber, string partname, string partspec,string stepcode, string reportuser, string reportdateopendate, string reportdateclosedate, int startNum, int endNum, string prop, string order) |
| | | public static ToMessage MesOrderStepVerifySearch(string wkshopcode, string wo_code, string orderno, string saorderno, string partnumber, string partname, string partspec, string stepcode, string reportuser, string reportdateopendate, string reportdateclosedate, int startNum, int endNum, string prop, string order) |
| | | { |
| | | var dynamicParams = new DynamicParameters(); |
| | | string search = ""; |
| | |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | else //ä¸æåº |
| | |
| | | //æ§å¶é»è¾ï¼å½åå·¥åºæ¥å·¥è°æ´-> (æ¬éå·¥åºå½åè°æ´åæ ¼æ°+æ¬éå·¥åºéå½åæ¥å·¥åæ ¼æ»æ°)<ä¸éå·¥åºæ¥å·¥æ»æ°(åæ ¼+ä¸è¯+æ¥åº) ==ä¸è½å°äºä¸éæ¥å·¥æ»æ° |
| | | list.Clear(); |
| | | //夿å½åå·¥åºæ¯èªå¶å·¥åºè¿æ¯å¤åå·¥åº |
| | | if (json[0].flw_type.ToString() == "Z") |
| | | if (json[0].flw_type.ToString() == "Z") |
| | | { |
| | | |
| | | //æ¥è¯¢å½åæ¥å·¥å·¥åºéæ¤æ¬¡æ¥å·¥ï¼æ»æ¥å·¥æ°éãæ»ä¸è¯æ°éãæ»å·¥åºæ°éãæ»æåºæ°é |
| | | |
| | | //æ¥è¯¢å½åæ¥å·¥å·¥åºéæ¤æ¬¡æ¥å·¥ï¼æ»æ¥å·¥æ°éãæ»ä¸è¯æ°éãæ»å·¥åºæ°éãæ»æåºæ°é |
| | | sql = @"select isnull(sum(good_qty),0) as good_qty,isnull(sum(ng_qty),0) as ng_qty,isnull(sum(laborbad_qty),0) as laborbad_qty,isnull(sum(materielbad_qty),0) as materielbad_qty |
| | | from TK_Wrk_Record where wo_code=@wo_code and style='B' and id<>@id and step_code=@step_code"; |
| | | dynamicParams.Add("@wo_code", json[0].wo_code); |
| | |
| | | return mes; |
| | | } |
| | | } |
| | | if (json[0].flw_type.ToString() == "W") |
| | | if (json[0].flw_type.ToString() == "W") |
| | | { |
| | | //è·åå½åå·¥åºãä¾åºå对åºçæ»åææ°é |
| | | sql = @"select isnull(sum(fqty),0) as fqty |
| | |
| | | decimal notthis_ngqty = decimal.Parse(dt.Rows[0]["ng_qty"].ToString()); //å½åæ«éå·¥åºéæ¬æ¬¡æ¥å·¥æ»æ° |
| | | decimal notthis_laborbad_qty = decimal.Parse(dt.Rows[0]["laborbad_qty"].ToString()); //å½åæ«éå·¥åºéæ¬æ¬¡æ¥å·¥å·¥åºæ»æ° |
| | | decimal notthis_materielbad_qty = decimal.Parse(dt.Rows[0]["materielbad_qty"].ToString()); //å½åæ«éå·¥åºéæ¬æ¬¡æ¥å·¥æåºæ»æ° |
| | | //è·åå½åæ«éå·¥åºæ¶ææ»æ°éï¼æ¬æ¬¡ä¿®æ¹æ¶ææ°é+æ¬æ¬¡ä¿®æ¹ä¸è¯æ°é+æ¬æ¬¡ä¿®æ¹å·¥åºæ°é+æ¬æ¬¡ä¿®æ¹æ¥å·¥æåºæ°é+å½åå·¥åºéæ¬æ¬¡æ¶ææ»æ°+å½åå·¥åºéæ¬æ¬¡ä¸è¯æ»æ°+å½åå·¥åºéæ¬æ¬¡å·¥åºæ»æ°+å½åå·¥åºéæ¬æ¬¡æåºæ»æ° |
| | | //è·åå½åæ«éå·¥åºæ¶ææ»æ°éï¼æ¬æ¬¡ä¿®æ¹æ¶ææ°é+æ¬æ¬¡ä¿®æ¹ä¸è¯æ°é+æ¬æ¬¡ä¿®æ¹å·¥åºæ°é+æ¬æ¬¡ä¿®æ¹æ¥å·¥æåºæ°é+å½åå·¥åºéæ¬æ¬¡æ¶ææ»æ°+å½åå·¥åºéæ¬æ¬¡ä¸è¯æ»æ°+å½åå·¥åºéæ¬æ¬¡å·¥åºæ»æ°+å½åå·¥åºéæ¬æ¬¡æåºæ»æ° |
| | | decimal updatereportsumqty = this_reportqty + this_ngqty + this_laborbadqty + this_materielbadqty + notthis_reportqty + notthis_ngqty + notthis_laborbad_qty + notthis_materielbad_qty; |
| | | //夿å½åå·¥åºä¾åºåæ¶ææ»æ°>å½åå·¥åºä¾åºå对åºåææ°é |
| | | if (updatereportsumqty > decimal.Parse(dt_0.Rows[0]["fqty"].ToString())) |
| | |
| | | |
| | | //åå对åºçæ¥å·¥è®°å½åè¡¨åæ ¼æ°éãä¸è¯æ°éãæ¥åºæ°é |
| | | 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 |
| | | } |
| | |
| | | str = sql, |
| | | parm = new |
| | | { |
| | | step_price=decimal.Parse(json[0].unprice), |
| | | step_price = decimal.Parse(json[0].unprice), |
| | | good_qty = decimal.Parse(json[0].report_dvalue), |
| | | ng_qty = this_ng_dvalue, |
| | | laborbad_qty = this_laborbad_dvalue, |
| | |
| | | { |
| | | //ååä¸è¯ |
| | | 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 |
| | | } |
| | |
| | | str = sql, |
| | | parm = new |
| | | { |
| | | step_price=decimal.Parse(json[0].unprice), |
| | | step_price = decimal.Parse(json[0].unprice), |
| | | good_qty = decimal.Parse(json[0].report_dvalue), |
| | | ng_qty = this_ng_dvalue, |
| | | laborbad_qty = this_laborbad_dvalue, |
| | |
| | | { |
| | | //ååä¸è¯ |
| | | 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 |
| | | } |
| | |
| | | if (aa) |
| | | { |
| | | //åå
¥æä½è®°å½è¡¨ |
| | | LogHelper.DbOperateLog(us.usercode, "æ¹éä¿®æ¹å·¥ä»·", "æ¥å·¥ID:" + string.Join(",",json.Select(bp => bp.id).ToArray())+",æä½ç±»å:"+ string.Join(",", json.Select(bp => bp.type).ToArray()), us.usertype); |
| | | LogHelper.DbOperateLog(us.usercode, "æ¹éä¿®æ¹å·¥ä»·", "æ¥å·¥ID:" + string.Join(",", json.Select(bp => bp.id).ToArray()) + ",æä½ç±»å:" + string.Join(",", json.Select(bp => bp.type).ToArray()), us.usertype); |
| | | mes.code = "200"; |
| | | mes.count = 0; |
| | | mes.message = "æä½æå!"; |
| | |
| | | mes.data = null; |
| | | } |
| | | } |
| | | else |
| | | else |
| | | { |
| | | mes.code = "300"; |
| | | mes.count = 0; |
| | |
| | | |
| | | |
| | | #region[ç产æ§è¡,æ¥å·¥å®¡æ ¸åè¡¨æ°æ®æ¥è¯¢æ¥å£] |
| | | public static ToMessage MesOrderStepReportVerifySearch(string reviewstatus, string wkshopcode, string wo_code, string orderno,string saorderno, string partnumber, string partname, string partspec, string stepname, string reportuser, string reportdateopendate, string reportdateclosedate, int startNum, int endNum, string prop, string order) |
| | | public static ToMessage MesOrderStepReportVerifySearch(string reviewstatus, string wkshopcode, string wo_code, string orderno, string saorderno, string partnumber, string partname, string partspec, string stepname, string reportuser, string reportdateopendate, string reportdateclosedate, int startNum, int endNum, string prop, string order) |
| | | { |
| | | var dynamicParams = new DynamicParameters(); |
| | | string search = ""; |
| | |
| | | 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) |
| | | { |
| | | Content = content |
| | | }; |
| | | if (headers != null) |
| | | { |
| | | foreach (var header in headers) |
| | | { |
| | | request.Headers.Add(header.Key, header.Value); |
| | | } |
| | | } |
| | | string finalUrl = url; |
| | | HttpContent content = new StringContent(""); |
| | | |
| | | try |
| | | { |
| | | HttpResponseMessage httpResponseMessage = await client.SendAsync(request); |
| | | // ====================== GET 请æ±ï¼æ¼æ¥åæ°å° URL ====================== |
| | | if (method == HttpMethod.Get && !string.IsNullOrWhiteSpace(parameters)) |
| | | { |
| | | finalUrl = url.Contains("?") |
| | | ? $"{url}&{parameters}" |
| | | : $"{url}?{parameters}"; |
| | | } |
| | | |
| | | var result = await httpResponseMessage.Content |
| | | .ReadAsStringAsync(); |
| | | return result; |
| | | // ====================== POST 请æ±ï¼åæ°æ¾å
¥ Body ====================== |
| | | if (method == HttpMethod.Post && !string.IsNullOrWhiteSpace(parameters)) |
| | | { |
| | | content = new StringContent( |
| | | parameters, |
| | | System.Text.Encoding.UTF8, |
| | | "application/x-www-form-urlencoded"); |
| | | } |
| | | |
| | | var request = new HttpRequestMessage(method, finalUrl) { Content = content }; |
| | | |
| | | // 追å 请æ±å¤´ |
| | | if (headers != null) |
| | | { |
| | | foreach (var header in headers) |
| | | { |
| | | if (!request.Headers.TryAddWithoutValidation(header.Key, header.Value)) |
| | | { |
| | | content.Headers.TryAddWithoutValidation(header.Key, header.Value); |
| | | } |
| | | } |
| | | } |
| | | |
| | | using (var response = await client.SendAsync(request)) |
| | | { |
| | | response.EnsureSuccessStatusCode(); |
| | | return await response.Content.ReadAsStringAsync(); |
| | | } |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | Console.WriteLine(ex.Message); |
| | | return ex.Message; |
| | | return $"请æ±å¤±è´¥ï¼{ex.Message}"; |
| | | } |
| | | } |
| | | |
| | | public static async Task<HttpResult> HttpSendAsync(this IHttpClientFactory httpClientFactory,HttpMethod method,string url,string parameters = null,Dictionary<string, string> headers = null) |
| | | { |
| | | if (httpClientFactory == null) |
| | | throw new ArgumentNullException(nameof(httpClientFactory)); |
| | | if (method == null) |
| | | throw new ArgumentNullException(nameof(method)); |
| | | if (string.IsNullOrEmpty(url)) |
| | | throw new ArgumentNullException(nameof(url)); |
| | | |
| | | var client = httpClientFactory.CreateClient(); |
| | | string finalUrl = url; |
| | | HttpContent content = new StringContent(""); |
| | | |
| | | try |
| | | { |
| | | // GET æ¼æ¥åæ° |
| | | if (method == HttpMethod.Get && !string.IsNullOrWhiteSpace(parameters)) |
| | | { |
| | | finalUrl = url.Contains("?") ? $"{url}&{parameters}" : $"{url}?{parameters}"; |
| | | } |
| | | |
| | | // POST å¤çåæ° |
| | | if (method == HttpMethod.Post && !string.IsNullOrWhiteSpace(parameters)) |
| | | { |
| | | content = new StringContent(parameters, Encoding.UTF8, "application/x-www-form-urlencoded"); |
| | | } |
| | | |
| | | var request = new HttpRequestMessage(method, finalUrl) { Content = content }; |
| | | |
| | | // 请æ±å¤´ |
| | | if (headers != null) |
| | | { |
| | | foreach (var header in headers) |
| | | { |
| | | if (!request.Headers.TryAddWithoutValidation(header.Key, header.Value)) |
| | | { |
| | | content.Headers.TryAddWithoutValidation(header.Key, header.Value); |
| | | } |
| | | } |
| | | } |
| | | |
| | | using (var response = await client.SendAsync(request)) |
| | | { |
| | | // 读åè¿åå
容 |
| | | string responseContent = await response.Content.ReadAsStringAsync(); |
| | | |
| | | return new HttpResult |
| | | { |
| | | IsSuccess = response.IsSuccessStatusCode, // æ¯å¦æå |
| | | StatusCode = (int)response.StatusCode, // ç¶æç 200/404/500 |
| | | Content = responseContent, // è¿åå
容 |
| | | ErrorMsg = response.IsSuccessStatusCode ? "" : $"HTTP请æ±å¤±è´¥ï¼ç¶æç ï¼{(int)response.StatusCode}" |
| | | }; |
| | | } |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | // ç½ç»å¼å¸¸ãè¶
æ¶ç |
| | | return new HttpResult |
| | | { |
| | | IsSuccess = false, |
| | | StatusCode = 0, // ç½ç»å¼å¸¸ç¶æç 设为0 |
| | | Content = "", |
| | | ErrorMsg = ex.Message |
| | | }; |
| | | } |
| | | } |
| | | /// <summary> |
| | | /// HTTP 请æ±ç»ä¸è¿å模å |
| | | /// </summary> |
| | | public class HttpResult |
| | | { |
| | | /// <summary> |
| | | /// æ¯å¦è¯·æ±æåï¼200-299ï¼ |
| | | /// </summary> |
| | | public bool IsSuccess { get; set; } |
| | | |
| | | /// <summary> |
| | | /// HTTP ç¶æç ï¼æ°åï¼200,404,500ï¼ |
| | | /// </summary> |
| | | public int StatusCode { get; set; } |
| | | |
| | | /// <summary> |
| | | /// è¿åå
容 |
| | | /// </summary> |
| | | public string Content { get; set; } |
| | | |
| | | /// <summary> |
| | | /// éè¯¯ä¿¡æ¯ |
| | | /// </summary> |
| | | public string ErrorMsg { get; set; } |
| | | } |
| | | } |
| | | } |
| | |
| | | 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); |
| | | //åå
¥ä»»å¡å表 |
| | | } |
| | | if (taskOptions.MessagePush == "N"||taskOptions.PushUserCode==null) //æ¯å¦éè¦æ¨é |
| | | { |
| | | _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) |
| | | catch (Exception ex) |
| | | { |
| | | // è®°å½æ¥å¿åå
¥ææ¨é失败çå¼å¸¸ |
| | | _log.Error($"ä½ä¸[{taskOptions.TaskName}]æ¥å¿åå
¥/SignalRæ¨éå¼å¸¸:{ex.Message}", ex); |
| | | } |
| | | Console.WriteLine(trigger.FullName + " " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:sss") + " " + httpMessage); |
| | | return; |
| | | // ç³»ç»æ¥å¿è¾åºï¼ä»»å¡æ§è¡ç»æ |
| | | _log.Info($"ä½ä¸[{taskOptions.TaskName}]ç»æ:{DateTime.Now:yyyy-MM-dd HH:mm:ss} ç»æ:{result.ErrorMsg}"); |
| | | } |
| | | } |
| | | } |
| | |
| | | } |
| | | 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; |
| | | try |
| | | string errorMsg = string.Empty; |
| | | // åå§åå
åä»»å¡å表 |
| | | _taskList = taskList; |
| | | |
| | | foreach (var task in taskList) |
| | | { |
| | | _taskList = JsonConvert.DeserializeObject<List<TaskOptions>>(jobConfig); |
| | | _taskList.ForEach(x => |
| | | try |
| | | { |
| | | options = x; |
| | | var result = x.AddJob(_schedulerFactory, true, jobFactory: services.GetService<IJobFactory>()).GetAwaiter().GetResult(); |
| | | }); |
| | | //var result = task.AddJob(schedulerFactory, true, services.GetService<IJobFactory>()).GetAwaiter().GetResult(); |
| | | // è°ç¨TaskOptionsçAddJobæ¹æ³æ·»å ä»»å¡å°è°åº¦å¨ |
| | | // ä¼ å
¥ä»å¨ç¨äºæ°æ®åºæä½ï¼ä¼ å
¥JobFactoryç¨äºèªå®ä¹Jobå®ä¾å |
| | | var result = task.AddJob(schedulerFactory, true, services.GetService<IJobFactory>(), quartzRepo).GetAwaiter().GetResult(); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | // è®°å½å个任å¡åå§åå¤±è´¥ä¿¡æ¯ |
| | | errorCount++; |
| | | errorMsg += $"ä½ä¸:{task.TaskName},å¼å¸¸ï¼{ex.Message};"; |
| | | } |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | errorCount = +1; |
| | | errorMsg += $"ä½ä¸:{options?.TaskName},å¼å¸¸ï¼{ex.Message}"; |
| | | } |
| | | string content = $"æå:{ _taskList.Count - errorCount}个,失败{errorCount}个,å¼å¸¸ï¼{errorMsg}\r\n"; |
| | | FileQuartz.WriteStartLog(content); |
| | | // 4. è®°å½æ´ä½åå§åç»ææ¥å¿ |
| | | var content = $"æå:{taskList.Count - errorCount}个,失败{errorCount}个,å¼å¸¸ï¼{errorMsg}"; |
| | | quartzRepo.WriteStartLogAsync($"{DateTime.Now:yyyy-MM-dd HH:mm:ss},{content}").GetAwaiter().GetResult(); |
| | | |
| | | |
| | | return applicationBuilder; |
| | | return app; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// è·åææçä½ä¸ |
| | | /// è·åè°åº¦å¨ä¸ææä»»å¡ï¼å¹¶åæ¥å
å/æ°æ®åºç¶æï¼æ ¸å¿ä¿®å¤ï¼è§£å³å
ååè¡¨ä¸æ°æ®åºä¸ä¸è´é®é¢ï¼ |
| | | /// </summary> |
| | | /// <param name="schedulerFactory"></param> |
| | | /// <returns></returns> |
| | | public static async Task<List<TaskOptions>> GetJobs(this ISchedulerFactory schedulerFactory) |
| | | /// <param name="schedulerFactory">è°åº¦å¨å·¥å</param> |
| | | /// <param name="quartzRepo">Quartzä»å¨</param> |
| | | /// <returns>ææ°çä»»å¡å表</returns> |
| | | public static async Task<List<TaskOptions>> GetJobs(this ISchedulerFactory schedulerFactory, QuartzRepository quartzRepo) |
| | | { |
| | | List<TaskOptions> list = new List<TaskOptions>(); |
| | | var list = new List<TaskOptions>(); |
| | | try |
| | | { |
| | | IScheduler _scheduler = await schedulerFactory.GetScheduler(); |
| | | var groups = await _scheduler.GetJobGroupNames(); |
| | | var scheduler = await schedulerFactory.GetScheduler(); |
| | | // ç¡®ä¿Schedulerå¤äºå¯å¨ç¶æï¼é²å¾¡æ§ç¼ç¨ï¼ |
| | | if (!scheduler.IsStarted) await scheduler.Start(); |
| | | // 1. è·åææä»»å¡åç»ï¼Quartz任塿åç»ç®¡çï¼ |
| | | var groups = await scheduler.GetJobGroupNames(); |
| | | |
| | | foreach (var groupName in groups) |
| | | { |
| | | foreach (var jobKey in await _scheduler.GetJobKeys(GroupMatcher<JobKey>.GroupEquals(groupName))) |
| | | // 2. è·ååç»ä¸ææ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] + " "; |
| | | } |
| | | taskOptions.Interval = resultString; |
| | | return new ToMessage { code = "300", count = 0, message = $"ä½ä¸:{task.TaskName},åç»ï¼{task.GroupName}å·²ç»åå¨", data = null }; |
| | | } |
| | | (bool, string) validExpression = taskOptions.Interval.IsValidExpression(); |
| | | if (!validExpression.Item1) |
| | | return new { code = 300,count=0,Message=validExpression.Item2,data="null" }; |
| | | |
| | | (bool, object) result = taskOptions.Exists(init); |
| | | if (!result.Item1) |
| | | return result.Item2; |
| | | // 4. éåå§åé¶æ®µï¼æ°å¢ä»»å¡å°å
å+æ°æ®åº+è®°å½æä½æ¥å¿ |
| | | if (!init) |
| | | { |
| | | //å°åå²ä»»å¡åæ°å¢å ä»»å¡å¤©å å°Listéå |
| | | _taskList.Add(taskOptions); |
| | | //å°éåæ°æ®æ·»å å°jsonæä»¶(è¦çå¼) |
| | | FileQuartz.WriteJobConfig(_taskList); |
| | | //å°å½åæ°ä»»å¡æ·»å å°æ°æ®è¡¨ |
| | | bool aa = QuartzSearchData.QuartzCreate(taskOptions); |
| | | _taskList.Add(task);// å
åæ·»å |
| | | await quartzRepo.CreateTaskAsync(task);// æ°æ®åºæ·»å |
| | | await quartzRepo.AddJobActionLogAsync(JobAction.æ°å¢.ToString(), task.TaskName, task.GroupName, "æ°å¢ä»»å¡æå");// æä½æ¥å¿ |
| | | } |
| | | // 5. æå»ºQuartz Jobï¼ä»»å¡æ§è¡ä½ï¼ |
| | | var job = JobBuilder.Create<HttpResultfulJob>()// HttpResultfulJobï¼èªå®ä¹çHTTP请æ±åJob |
| | | .WithIdentity(task.TaskName, task.GroupName)// 设置Jobå¯ä¸æ è¯ï¼åç§°+åç»ï¼ |
| | | .Build(); |
| | | |
| | | IJobDetail job = JobBuilder.Create<HttpResultfulJob>().WithIdentity(taskOptions.TaskName, taskOptions.GroupName).Build(); |
| | | ITrigger trigger = TriggerBuilder.Create() |
| | | .WithIdentity(taskOptions.TaskName, taskOptions.GroupName) |
| | | .StartNow() |
| | | .WithDescription(taskOptions.Describe) |
| | | .WithCronSchedule(taskOptions.Interval) |
| | | .Build(); |
| | | // 6. æå»ºCron触åå¨ï¼æCron表达å¼è§¦åï¼ |
| | | var trigger = TriggerBuilder.Create() |
| | | .WithIdentity(task.TaskName, task.GroupName)// 触åå¨å¯ä¸æ è¯ï¼ä¸Jobä¿æä¸è´ï¼ |
| | | .StartNow()// ç«å³å¯å¨ |
| | | .WithDescription(task.Describe)// ä»»å¡æè¿° |
| | | .WithCronSchedule(task.Interval)// ç»å®Cronè¡¨è¾¾å¼ |
| | | .Build(); |
| | | |
| | | IScheduler scheduler = await schedulerFactory.GetScheduler(); |
| | | |
| | | if (jobFactory == null) |
| | | { |
| | | try |
| | | { |
| | | jobFactory = HttpContext.Current.RequestServices.GetService<IJobFactory>(); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | Console.WriteLine($"å建任å¡[{taskOptions.TaskName}]å¼å¸¸,{ex.Message}"); |
| | | } |
| | | } |
| | | |
| | | // 7. è·åè°åº¦å¨å¹¶ç¡®ä¿å¯å¨ |
| | | var scheduler = await schedulerFactory.GetScheduler(); |
| | | if (!scheduler.IsStarted) await scheduler.Start(); // ç¡®ä¿å¯å¨ |
| | | // 8. 设置èªå®ä¹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 ="æ§è¡æåï¼"; |
| | | mes.message = "æ§è¡æåï¼"; |
| | | mes.data = null; |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | mes.code = "300"; |
| | | mes.count = 0; |
| | | mes.message = ex.Message; |
| | | mes.data = null; |
| | | return new { status = false, msg = ex.Message }; |
| | | return new ToMessage { code = "300", count = 0, message = ex.Message, data = null }; |
| | | } |
| | | return mes; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// ç§»é¤ä½ä¸ |
| | | /// ç§»é¤ï¼å é¤ï¼ä»»å¡ |
| | | /// </summary> |
| | | /// <param name="schedulerFactory"></param> |
| | | /// <param name="taskName"></param> |
| | | /// <param name="groupName"></param> |
| | | /// <returns></returns> |
| | | public static Task<object> Remove(this ISchedulerFactory schedulerFactory, TaskOptions taskOptions) |
| | | /// <param name="schedulerFactory">è°åº¦å¨å·¥å</param> |
| | | /// <param name="task">ä»»å¡é
ç½®</param> |
| | | /// <param name="quartzRepo">Quartzä»å¨</param> |
| | | /// <returns>æä½ç»æ</returns> |
| | | public static Task<object> Remove(this ISchedulerFactory schedulerFactory, TaskOptions task, QuartzRepository quartzRepo) |
| | | { |
| | | return schedulerFactory.TriggerAction(taskOptions.TaskName, taskOptions.GroupName, JobAction.å é¤, taskOptions); |
| | | return TriggerAction(schedulerFactory, task.TaskName, task.GroupName, JobAction.å é¤, task, quartzRepo); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æ´æ°ä½ä¸ |
| | | /// ä¿®æ¹ä»»å¡é
ç½® |
| | | /// </summary> |
| | | /// <param name="schedulerFactory"></param> |
| | | /// <param name="taskOptions"></param> |
| | | /// <returns></returns> |
| | | public static Task<object> Update(this ISchedulerFactory schedulerFactory, TaskOptions taskOptions) |
| | | /// <param name="schedulerFactory">è°åº¦å¨å·¥å</param> |
| | | /// <param name="task">æ°çä»»å¡é
ç½®</param> |
| | | /// <param name="quartzRepo">Quartzä»å¨</param> |
| | | /// <returns>æä½ç»æ</returns> |
| | | public static Task<object> Update(this ISchedulerFactory schedulerFactory, TaskOptions task, QuartzRepository quartzRepo) |
| | | { |
| | | return schedulerFactory.TriggerAction(taskOptions.TaskName, taskOptions.GroupName, JobAction.ä¿®æ¹, taskOptions); |
| | | return TriggerAction(schedulerFactory, task.TaskName, task.GroupName, JobAction.ä¿®æ¹, task, quartzRepo); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æåä½ä¸ |
| | | /// æåä»»å¡ |
| | | /// </summary> |
| | | /// <param name="schedulerFactory"></param> |
| | | /// <param name="taskOptions"></param> |
| | | /// <returns></returns> |
| | | public static Task<object> Pause(this ISchedulerFactory schedulerFactory, TaskOptions taskOptions) |
| | | /// <param name="schedulerFactory">è°åº¦å¨å·¥å</param> |
| | | /// <param name="task">ä»»å¡é
ç½®</param> |
| | | /// <param name="quartzRepo">Quartzä»å¨</param> |
| | | /// <returns>æä½ç»æ</returns> |
| | | public static Task<object> Pause(this ISchedulerFactory schedulerFactory, TaskOptions task, QuartzRepository quartzRepo) |
| | | { |
| | | return schedulerFactory.TriggerAction(taskOptions.TaskName, taskOptions.GroupName, JobAction.æå, taskOptions); |
| | | return TriggerAction(schedulerFactory, task.TaskName, task.GroupName, JobAction.æå, task, quartzRepo); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// å¯å¨ä½ä¸ |
| | | /// å¯å¨ï¼æ¢å¤ï¼ä»»å¡ |
| | | /// </summary> |
| | | /// <param name="schedulerFactory"></param> |
| | | /// <param name="taskOptions"></param> |
| | | /// <returns></returns> |
| | | public static Task<object> Start(this ISchedulerFactory schedulerFactory, TaskOptions taskOptions) |
| | | /// <param name="schedulerFactory">è°åº¦å¨å·¥å</param> |
| | | /// <param name="task">ä»»å¡é
ç½®</param> |
| | | /// <param name="quartzRepo">Quartzä»å¨</param> |
| | | /// <returns>æä½ç»æ</returns> |
| | | public static Task<object> Start(this ISchedulerFactory schedulerFactory, TaskOptions task, QuartzRepository quartzRepo) |
| | | { |
| | | return schedulerFactory.TriggerAction(taskOptions.TaskName, taskOptions.GroupName, JobAction.å¼å¯, taskOptions); |
| | | return TriggerAction(schedulerFactory, task.TaskName, task.GroupName, JobAction.å¼å¯, task, quartzRepo); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// ç«å³æ§è¡ä¸æ¬¡ä½ä¸ |
| | | /// ç«å³æ§è¡ä»»å¡ï¼æ è§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.å é¤: |
| | | case JobAction.ä¿®æ¹: |
| | | // æå触åå¨ -> è§£ç»è§¦åå¨ -> å é¤Job -> 忥å
å+æ°æ®åº -> è®°å½æ¥å¿ |
| | | await scheduler.PauseTrigger(trigger.Key); |
| | | await scheduler.UnscheduleJob(trigger.Key);// ç§»é¤è§¦åå¨ |
| | | await scheduler.DeleteJob(trigger.JobKey); |
| | | result = taskOptions.ModifyTaskEntity(schedulerFactory, action); |
| | | await scheduler.UnscheduleJob(trigger.Key); |
| | | await scheduler.DeleteJob(jobKey); |
| | | _taskList.RemoveAll(x => x.TaskName == taskName && x.GroupName == groupName); |
| | | await quartzRepo.DeleteTaskAsync(taskName, groupName); |
| | | await quartzRepo.AddJobActionLogAsync(action.ToString(), taskName, groupName, "å é¤ä»»å¡æå"); |
| | | break; |
| | | |
| | | case JobAction.ä¿®æ¹: |
| | | // ä¿®æ¹é»è¾ï¼å
å 餿§ä»»å¡ -> éæ°æ·»å æ°é
ç½® -> è®°å½æ¥å¿ |
| | | await scheduler.PauseTrigger(trigger.Key); |
| | | await scheduler.UnscheduleJob(trigger.Key); |
| | | await scheduler.DeleteJob(jobKey); |
| | | _taskList.RemoveAll(x => x.TaskName == taskName && x.GroupName == groupName); |
| | | await quartzRepo.DeleteTaskAsync(taskName, groupName); |
| | | result = await task.AddJob(schedulerFactory, false, null, quartzRepo);// éæ°æ·»å ä»»å¡ |
| | | await quartzRepo.AddJobActionLogAsync(action.ToString(), taskName, groupName, JsonConvert.SerializeObject(task)); |
| | | break; |
| | | |
| | | case JobAction.æå: |
| | | case JobAction.忢: |
| | | case JobAction.å¼å¯: |
| | | result = taskOptions.ModifyTaskEntity(schedulerFactory, action); |
| | | if (action == JobAction.æå) |
| | | { |
| | | await scheduler.PauseTrigger(trigger.Key); |
| | | } |
| | | else if (action == JobAction.å¼å¯) |
| | | { |
| | | await scheduler.ResumeTrigger(trigger.Key); |
| | | // await scheduler.RescheduleJob(trigger.Key, trigger); |
| | | } |
| | | else |
| | | { |
| | | await scheduler.Shutdown(); |
| | | } |
| | | // æå触åå¨ -> æ´æ°ä»»å¡ç¶æ -> 忥å
å+æ°æ®åº -> è®°å½æ¥å¿ |
| | | await scheduler.PauseTrigger(trigger.Key); |
| | | task.Status = (int)TriggerState.Paused; |
| | | await quartzRepo.UpdateTaskAsync(task); |
| | | _taskList.RemoveAll(x => x.TaskName == taskName && x.GroupName == groupName); |
| | | _taskList.Add(task); // 忥å
åç¶æ |
| | | await quartzRepo.AddJobActionLogAsync(action.ToString(), taskName, groupName, "æå任塿å"); |
| | | break; |
| | | |
| | | case JobAction.å¼å¯: |
| | | // æ¢å¤è§¦åå¨ -> æ´æ°ä»»å¡ç¶æ -> 忥å
å+æ°æ®åº -> è®°å½æ¥å¿ |
| | | await scheduler.ResumeTrigger(trigger.Key); |
| | | task.Status = (int)TriggerState.Normal; |
| | | await quartzRepo.UpdateTaskAsync(task); |
| | | _taskList.RemoveAll(x => x.TaskName == taskName && x.GroupName == groupName); |
| | | _taskList.Add(task); // 忥å
åç¶æ |
| | | await quartzRepo.AddJobActionLogAsync(action.ToString(), taskName, groupName, "å¼å¯ä»»å¡æå"); |
| | | break; |
| | | |
| | | case JobAction.ç«å³æ§è¡: |
| | | if (taskOptions != null && taskOptions.Status != (int)TriggerState.Normal) |
| | | // ç«å³æ§è¡åç¡®ä¿ä»»å¡å¤äºå¯å¨ç¶æ -> 触åJobç«å³æ§è¡ -> è®°å½æ¥å¿ |
| | | if (task.Status != (int)TriggerState.Normal) |
| | | { |
| | | result = taskOptions.ModifyTaskEntity(schedulerFactory, JobAction.å¼å¯); |
| | | await scheduler.ResumeTrigger(trigger.Key); |
| | | |
| | | task.Status = (int)TriggerState.Normal; |
| | | await quartzRepo.UpdateTaskAsync(task); |
| | | _taskList.RemoveAll(x => x.TaskName == taskName && x.GroupName == groupName); |
| | | _taskList.Add(task); |
| | | await scheduler.ResumeTrigger(trigger.Key); |
| | | } |
| | | else { |
| | | await scheduler.TriggerJob(jobKey); |
| | | } |
| | | |
| | | await scheduler.TriggerJob(jobKey); // ç«å³è§¦å任塿§è¡ |
| | | await quartzRepo.AddJobActionLogAsync(action.ToString(), taskName, groupName, "ç«å³æ§è¡ä»»å¡æå"); |
| | | break; |
| | | } |
| | | mes.code = "200"; |
| | |
| | | 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) |
| | | { |
| | | if (string.IsNullOrEmpty(usercode)) |
| | | { |
| | | _logger.LogWarning("AddUseræ¹æ³æ¥æ¶çusercode为空ï¼å¿½ç¥æä½"); |
| | | return; |
| | | } |
| | | |
| | | string cid = Context.ConnectionId; |
| | | if (!UserIdsStore.Ids.ContainsValue(usercode)) |
| | | try |
| | | { |
| | | await Task.Run(() => UserIdsStore.Ids.Add(cid, usercode)); |
| | | // è°ç¨çº¿ç¨å®å
¨çæ·»å /æ´æ°æ¹æ³ |
| | | UserIdsStore.AddOrUpdateUser(cid, usercode); |
| | | _logger.LogInformation($"ç¨æ·[{usercode}]çè¿æ¥[{cid}]已注åå°å¨çº¿å表"); |
| | | } |
| | | else |
| | | catch (Exception ex) |
| | | { |
| | | //lambada表达å¼:æ ¹æ®å¼å»é®åKey |
| | | string key = UserIdsStore.Ids.FirstOrDefault(d => d.Value == usercode).Key.ToString(); |
| | | // å建ä¸ä¸ªæ°çé®å¼å¯¹ |
| | | UserIdsStore.Ids.Add(cid, usercode); |
| | | // ç§»é¤æ§çé®å¼å¯¹ |
| | | UserIdsStore.Ids.Remove(key); |
| | | _logger.LogError(ex, $"æ·»å ç¨æ·[{usercode}]è¿æ¥[{cid}]失败"); |
| | | throw; // æåºå¼å¸¸è®©å®¢æ·ç«¯æç¥é误 |
| | | } |
| | | |
| | | await Task.CompletedTask; // æ 弿¥æä½æ¶è¿åå·²å®æä»»å¡ |
| | | } |
| | | } |
| | | } |
| | |
| | | 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æ°æ®åºé¾æ¥é
置端å£å· |