7e47d1856a1db4367ce103a8b7de37fb0f3590b0..4c7cbee3e351f289fac1400e976bc8f10dc7e169
2025-06-24 Tjiny
上海日东agv任务做任务时间解除只要第一次的限制
4c7cbe 对比 | 目录
2025-06-24 Tjiny
定时充电任务调度流程
6b9e8c 对比 | 目录
4个文件已添加
7个文件已修改
251 ■■■■■ 已修改文件
HH.WCS.Mobox3.RiDong/Program.cs 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.Mobox3.RiDong/Quartz/HelloQuartzJob.cs 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.Mobox3.RiDong/Quartz/QuartzJobCreate.cs 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.Mobox3.RiDong/Quartz/TaskCD.cs 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.Mobox3.RiDong/dispatch/NDC.cs 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.Mobox3.RiDong/dto/ChargingSwitch.cs 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.Mobox3.RiDong/generalMethod/AdoSqlMethod.cs 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.Mobox3.RiDong/generalMethod/PipeLineHelper.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.Mobox3.RiDong/generalMethod/TaskHelper.cs 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.Mobox3.RiDong/models/ConveyorLinesInfo.cs 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.Mobox3.RiDong/wms/WCSHelper.cs 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.Mobox3.RiDong/Program.cs
@@ -6,16 +6,21 @@
using System.Threading.Tasks;
using HH.WCS.Mobox3.RiDong.device;
using HH.WCS.Mobox3.RiDong.generalMethod;
using HH.WCS.Mobox3.RiDong.Quartz;
using HH.WCS.Mobox3.RiDong.util;
using Microsoft.Owin.Hosting;
using Quartz;
using Quartz.Impl;
using Topshelf;
namespace HH.WCS.Mobox3.RiDong
{
    internal class Program
    {
        static void Main(string[] args)
        static async Task Main(string[] args)
        {
            // await QuartzJobCreate.CreateJob();
            Settings.Init();
            //1.0 开启api
            Startup();
@@ -35,9 +40,8 @@
                x.SetDescription("hh123");
                x.SetDisplayName("hh123.wms");
                x.SetServiceName("hh123.wms");
            });
            var exitCode = (int)Convert.ChangeType(rc, rc.GetTypeCode());
            Environment.ExitCode = exitCode;
        }
@@ -80,6 +84,7 @@
        /// </summary>
        public class  WorkThread
        {
            public void Start()
            {
                List<Task> tasks = new List<Task>
@@ -99,10 +104,12 @@
                    // 出库agv任务推送
                    GetTaskS(ThreadMenthod.DispatchFromAGV),
                    // 读取线体信息并做对应的处理
                    GetTask(ThreadMenthod.ReadConveyorlinesMessage)
                    GetTask(ThreadMenthod.ReadConveyorlinesMessage),
                };
                Task.WaitAll(tasks.ToArray());
            }
            public void Stop()
            {
HH.WCS.Mobox3.RiDong/Quartz/HelloQuartzJob.cs
New file
@@ -0,0 +1,50 @@
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using HH.WCS.Mobox3.RiDong.dto;
using HH.WCS.Mobox3.RiDong.generalMethod;
using HH.WCS.Mobox3.RiDong.util;
using Quartz;
namespace HH.WCS.Mobox3.RiDong.Quartz;
/// <summary>
/// 任务(工作、需要完成的事)
/// </summary>
public class HelloQuartzJob : IJob
{
    /// <summary>
    ///
    /// </summary>
    /// <param name="context"></param>
    /// <returns></returns>
    /// <exception cref="NotImplementedException"></exception>
    public Task Execute(IJobExecutionContext context)
    {
        return Task.Factory.StartNew(() =>
        {
            var chargingSwitch = AdoSqlMethod<ChargingSwitch>.QueryFirst();
            if (chargingSwitch.IS_ENABLED == "否")
            {
                return;
            }
            List<TaskCD> taskCDs = new List<TaskCD>
            {
                new () {No = DateTime.Now.ToString("yyMMdd") + "001", CarNo = "1"},
                new () {No = DateTime.Now.ToString("yyMMdd") + "002", CarNo = "2"},
                new () {No = DateTime.Now.ToString("yyMMdd") + "003", CarNo = "3"}
            };
            foreach (var taskCD in taskCDs)
            {
                Console.WriteLine($"当前充电任务:任务号{taskCD.No},车号{taskCD.CarNo}");
                LogHelper.Info($"当前充电任务:任务号{taskCD.No},车号{taskCD.CarNo}");
                // 给设备充电
                TaskHelper.SendCd(taskCD);
            }
        });
    }
}
HH.WCS.Mobox3.RiDong/Quartz/QuartzJobCreate.cs
New file
@@ -0,0 +1,39 @@
using System.Threading.Tasks;
using Quartz;
using Quartz.Impl;
namespace HH.WCS.Mobox3.RiDong.Quartz;
/// <summary>
/// 创建
/// </summary>
public static class QuartzJobCreate
{
    /// <summary>
    /// 创建任务
    /// </summary>
    public static async Task CreateJob()
    {
        //创建一个调度器工厂
        var schedulerFactory = new StdSchedulerFactory();
        //获取调度器
        var scheduler = await schedulerFactory.GetScheduler();
        //开启调度器
        await scheduler.Start();
        //创建一个工作,并分组进Test,名字为类名
        IJobDetail job = JobBuilder.Create<HelloQuartzJob>()
            .WithIdentity("HelloQuartzJob", "Test")
            .Build();
        //创建一个触发条件:WithCronSchedule,定时,每天哪个时间,或者每个月哪天
        ITrigger trigger1 = TriggerBuilder.Create()
            .WithIdentity("trigger3", "group1")
            .WithCronSchedule("0 10 17 * * ?")
            .ForJob("HelloQuartzJob", "Test")
            .Build();
        //添加调度(将工作和触发条件添加到调度器中)
        await scheduler.ScheduleJob(job, trigger1);
    }
}
HH.WCS.Mobox3.RiDong/Quartz/TaskCD.cs
New file
@@ -0,0 +1,17 @@
namespace HH.WCS.Mobox3.RiDong.Quartz;
/// <summary>
/// 充电
/// </summary>
public class TaskCD
{
    /// <summary>
    /// 任务号
    /// </summary>
    public string No { get; set; }
    /// <summary>
    /// 车编号
    /// </summary>
    public string CarNo { get; set; }
}
HH.WCS.Mobox3.RiDong/dispatch/NDC.cs
@@ -74,6 +74,48 @@
            return new AGVResult { Res = new Res { ErrCode = -1, ErrInfo = e.Message } };
        }
    }
    public static AGVResult OrderAdd(int ts, Dictionary<string, string> param, Dictionary<string, string> param1)
    {
        //< Req >< Order TS = '1' Pri = '1' No = 'TN2302020001' Ext1 = '' Ext2 = '' N_CNTR_COUNT = '' >< Param Name = 'From' Value = '2' />< Param Name = 'To' Value = '1' /></ Order ></ Req >
        var bufin = GetReqStr2(ts, param, param1);
        try
        {
            var result = callClient.OrderAdd(bufin);
            LogHelper.Info($"OrderAdd req={bufin} res={result}", "NDC");
            //LogHelper.Info(result.bufout, "ts");
            return GetResult(result);
        }
        catch (Exception e)
        {
            LogHelper.Info($"OrderAdd req={bufin} res={e.Message}", "NDC");
            return new AGVResult { Res = new Res { ErrCode = -1, ErrInfo = e.Message } };
        }
    }
    private static string GetReqStr2(int ts, Dictionary<string, string> param, Dictionary<string, string> param1)
    {
        //< Order  TS = '60'  Pri = '" + mst.CN_N_PRIORITY.ToString() + "' From = '" + start.CN_N_AGV_LOCATION + "' To = '" + end.CN_N_AGV_LOCATION + "'  No = '" + mst.S_TASK_NO + "_1' Ext1 = '1' Ext2 = '" + Constants.TN_MID_COMMANDEQ_CALLAGVOrderCommandType + "'  N_CNTR_COUNT = ''   FRow = '" + sFloor + "'  TRow = '" + eFloor + "' />
        var sb = new StringBuilder();
        sb.Append($"<Req><Order ");
        if (ts != 0)
        {
            sb.Append($"TS='{ts}'");
        }
        foreach (var kv in param)
        {
            sb.Append($" {kv.Key}='{kv.Value}'");
        }
        sb.Append($" NoCallback='0' >");
        foreach (var p1 in param1)
        {
            sb.Append($"<Param Name='{p1.Key}' Value='{p1.Value}' />");
        }
        sb.Append("</Order></Req>");
        return sb.ToString();
    }
    private static string GetReqStr(int ts, Dictionary<string, string> param)
    {
HH.WCS.Mobox3.RiDong/dto/ChargingSwitch.cs
New file
@@ -0,0 +1,16 @@
using HH.WCS.Mobox3.RiDong.models;
using SqlSugar;
namespace HH.WCS.Mobox3.RiDong.dto;
/// <summary>
///
/// </summary>
[SugarTable("TN_charging_switch")]
public class ChargingSwitch : BaseModel
{
    /// <summary>
    /// 是否开启
    /// </summary>
    public string IS_ENABLED { get; set; }
}
HH.WCS.Mobox3.RiDong/generalMethod/AdoSqlMethod.cs
@@ -12,6 +12,19 @@
/// </summary>
public static class AdoSqlMethod<T> where T : class, new()
{
    /// <summary>
    /// 查询一条数据
    /// </summary>
    /// <returns></returns>
    public static T QueryFirst()
    {
        var db = new SqlHelper<object>().GetInstance();
        // 返回数据
        return db.Queryable<T>().First();
    }
    /// <summary>
    /// 根据条件查询一条数据
    /// </summary>
HH.WCS.Mobox3.RiDong/generalMethod/PipeLineHelper.cs
@@ -168,7 +168,7 @@
                        conveyorLinesInfo.TASKFINISH = 3;
                        // 出库方向
                        conveyorLinesInfo.DIRECTION = ConveyorLinesInfo.GetDirection(queryFirst.S_OUT_TARGET);
                        conveyorLinesInfo.DIRECTION = ConveyorLinesInfo.GetDirection(queryFirst.S_OUT_TARGET, queryFirst.S_OP_DEF_NAME);
                        AdoSqlMethod<ConveyorLinesInfo>.UpdateFirst(conveyorLinesInfo, p => new { p.TASKFINISH, p.DIRECTION });
                        // 中间表数据添加
HH.WCS.Mobox3.RiDong/generalMethod/TaskHelper.cs
@@ -4,6 +4,7 @@
using HH.WCS.Mobox3.RiDong.dispatch;
using HH.WCS.Mobox3.RiDong.dto;
using HH.WCS.Mobox3.RiDong.models;
using HH.WCS.Mobox3.RiDong.Quartz;
using HH.WCS.Mobox3.RiDong.util;
using HH.WCS.Mobox3.RiDong.wms;
@@ -341,7 +342,29 @@
        dic.Add("Door", lockNo);
        NDC.StartNewOrderWithQCmd(164, DateTime.Now.Ticks.ToString(), dic);
    }
    /// <summary>
    /// 发送充电
    /// </summary>
    /// <returns></returns>
    public static void SendCd(TaskCD task)
    {
        var dic = new Dictionary<string, string>();
        var dic1 = new Dictionary<string, string>();
        dic.Add("No", task.No);
        dic.Add("Pri", "0");
        dic1.Add("ExtDeviceNo", task.CarNo);
        //判断
        var res = NDC.OrderAdd(99, dic, dic1);
        if (res != null && (res.Res.ErrCode == 0 || res.Res.ErrCode == 50009))
        {
            //    dstart.N_STATE = 1;
            //    db.Updateable<TN_CD>(dstart).UpdateColumns(a => new { a.N_STATE }).ExecuteCommand();
        }
    }
    /// <summary>  
    /// 修改任务状态  
    /// </summary>  
@@ -503,4 +526,7 @@
            }
        }
    }
}
HH.WCS.Mobox3.RiDong/models/ConveyorLinesInfo.cs
@@ -126,7 +126,7 @@
        /// </summary>
        /// <param name="dir"></param>
        /// <returns></returns>
        public static int GetDirection(string dir)
        public static int GetDirection(string dir, string type)
        {
            switch (dir)
            {
@@ -138,6 +138,26 @@
                    return 3;
                case "产线四":
                    return 4;
                case "国外线":
                    switch (type)
                    {
                        case "整托出库":
                            return 5;
                        case "分拣出库":
                            return 7;
                        default:
                            return 0;
                    }
                case "国内线":
                    switch (type)
                    {
                        case "整托出库":
                            return 6;
                        case "分拣出库":
                            return 8;
                        default:
                            return 0;
                    }
                default:
                    return 0;
            }
HH.WCS.Mobox3.RiDong/wms/WCSHelper.cs
@@ -180,7 +180,7 @@
                task.N_B_STATE = 2;
                task.S_B_STATE = Task.GetStateStr(task.N_B_STATE);
                // task.T_START_TIME = DateTime.Now;
                db.Updateable(task).UpdateColumns(it => new { it.N_B_STATE, it.S_B_STATE }).ExecuteCommand();
                db.Updateable(task).UpdateColumns(it => new { it.N_B_STATE, it.S_B_STATE, it.T_START_TIME }).ExecuteCommand();
            }
        }
    }
@@ -193,11 +193,8 @@
        {
            if (task.N_B_STATE == 1)
            {
                if (task.T_START_TIME == null)
                {
                    task.T_START_TIME = DateTime.Now;
                    db.Updateable(task).UpdateColumns(it => new { it.T_START_TIME }).ExecuteCommand();
                }
                task.T_START_TIME = DateTime.Now;
                db.Updateable(task).UpdateColumns(it => new { it.T_START_TIME }).ExecuteCommand();
            }
        }
    }