杨张扬
4 天以前 c2d2f4eb78c54bdfdb6ffb0df5932751d538ed14
新增PDA搬送,线边空托到原材料上线口
9个文件已修改
257 ■■■■■ 已修改文件
api/ApiHelper.cs 204 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
api/ApiModel.cs 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
api/MoboxController.cs 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
config/config.json 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
config/configDesc.txt 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
core/WCSCore.cs 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
device/TcpServer.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
util/Settings.cs 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
wms/SpecHelper.cs 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
api/ApiHelper.cs
@@ -123,10 +123,12 @@
        internal static SimpleResult PDAFullCheckIn(PDAFullCheckInfo model)
        {
            LogHelper.Info("触发API:PDA满托复检判断" + JsonConvert.SerializeObject(model), "API");
            var db = new SqlHelper<object>().GetInstance();
            var result = new SimpleResult();//返回结果
            try
            {
                var db = new SqlHelper<object>().GetInstance();
                var locCnt = db.Queryable<TN_Loc_Container>().First(a => a.S_CNTR_CODE == model.rfId);
                if (locCnt == null)
                {
@@ -323,6 +325,179 @@
        }
        /// <summary>
        /// 线边空托到原材料输送线
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        internal static SimpleResult EmptyLineToLine(EmptyLineToLineInfo model)
        {
            LogHelper.Info("触发API:线边空托到原材料输送线" + JsonConvert.SerializeObject(model), "API");
            var result = new SimpleResult();//返回结果
            try
            {
                var db = new SqlHelper<object>().GetInstance();
                var startLoc = db.Queryable<TN_Location>().First(o => o.S_CODE == model.startLoc);
                if (startLoc == null)
                {
                    result.resultCode = 1;
                    result.resultMsg = $"数据库中未找到此货位:{model.startLoc}";
                    LogHelper.Info(result.resultMsg);
                    return result;
                }
                if (startLoc.N_CURRENT_NUM == 1 || db.Queryable<TN_Loc_Container>().Any(a=>a.S_LOC_CODE==model.startLoc))
                {
                    result.resultCode = 2;
                    result.resultMsg = $"此货位:{model.startLoc},已绑定托盘";
                    LogHelper.Info(result.resultMsg);
                    return result;
                }
                if (startLoc.N_LOCK_STATE != 0  || startLoc.S_LOCK_STATE != "无")
                {
                    result.resultCode = 3;
                    result.resultMsg = $"此货位:{model.startLoc},已上锁";
                    LogHelper.Info(result.resultMsg);
                    return result;
                }
                if (startLoc.C_ENABLE != "Y")
                {
                    result.resultCode = 4;
                    result.resultMsg = $"此货位:{model.startLoc},未启用";
                    LogHelper.Info(result.resultMsg);
                    return result;
                }
                var startLocArea = Settings.Areas[13];
                if (startLoc.S_AREA_CODE != startLocArea)
                {
                    result.resultCode = 5;
                    result.resultMsg = $"此货位:{model.startLoc},不属于线边空托区{startLocArea}";
                    LogHelper.Info(result.resultMsg);
                    return result;
                }
                var endLocIndex = Settings.LineSorting;
                var endLocLine = Settings.ProductionLines.FirstOrDefault(a => a.Sorting == endLocIndex);
                if (endLocLine == null)
                {
                    result.resultCode = 6;
                    result.resultMsg = $"配置文件中未找到序号为:{endLocIndex}的原材料产线的信息";
                    LogHelper.Info(result.resultMsg);
                    return result;
                }
                var endLoc = db.Queryable<TN_Location>().First(a => a.S_CODE == endLocLine.PointIn);
                if (endLoc == null)
                {
                    result.resultCode = 7;
                    result.resultMsg = $"数据库中未找到原材料产线空托上线口:{endLocLine.PointIn}";
                    LogHelper.Info(result.resultMsg);
                    return result;
                }
                var endLocArea = Settings.Areas[14];
                if (endLoc.S_AREA_CODE != endLocArea)
                {
                    result.resultCode = 8;
                    result.resultMsg = $"此货位:{endLoc.S_CODE},不属于原材料产线空托区{endLocArea}";
                    LogHelper.Info(result.resultMsg);
                    return result;
                }
                if (endLoc.N_CURRENT_NUM == 1 || db.Queryable<TN_Loc_Container>().Any(a => a.S_LOC_CODE == endLocLine.PointIn))
                {
                    result.resultCode = 9;
                    result.resultMsg = $"此货位:{model.startLoc},已绑定托盘";
                    LogHelper.Info(result.resultMsg);
                    return result;
                }
                if (endLoc.N_LOCK_STATE != 0 || endLoc.S_LOCK_STATE != "无")
                {
                    result.resultCode = 10;
                    result.resultMsg = $"此货位:{model.startLoc},已上锁";
                    LogHelper.Info(result.resultMsg);
                    return result;
                }
                if (endLoc.C_ENABLE != "Y")
                {
                    result.resultCode = 11;
                    result.resultMsg = $"此货位:{model.startLoc},未启用";
                    LogHelper.Info(result.resultMsg);
                    return result;
                }
                var Cnt = Guid.NewGuid().ToString("D");
                using (var trans = db.Ado.UseTran())
                {
                    startLoc.N_CURRENT_NUM = 1;
                    startLoc.N_LOCK_STATE = 2;
                    startLoc.S_LOCK_STATE = "出库锁";
                    endLoc.N_LOCK_STATE = 1;
                    endLoc.S_LOCK_STATE = "入库锁";
                    var locCnt = new TN_Loc_Container()
                    {
                        S_LOC_CODE = startLoc.S_CODE,
                        S_CNTR_CODE = Cnt,
                    };
                    var task = new TN_Task()
                    {
                        S_CODE = WCSHelper.GenerateTaskNo(),
                        S_START_AREA = startLoc.S_AREA_CODE,
                        S_END_AREA = endLoc.S_AREA_CODE,
                        S_START_LOC = startLoc.S_CODE,
                        S_END_LOC = endLoc.S_CODE,
                        S_TYPE = "线边空托上线",
                        N_PRIORITY = 3,
                        N_SCHEDULE_TYPE = 1,
                        N_B_STATE = 0,
                        S_B_STATE = "等待",
                        S_CNTR_CODE = Cnt,
                    };
                    if (
                        db.Updateable<TN_Location>(startLoc).UpdateColumns(it=>new {it.N_CURRENT_NUM,it.N_LOCK_STATE,it.S_LOCK_STATE }).ExecuteCommand() == 1 &&
                        db.Updateable<TN_Location>(endLoc).UpdateColumns(it=>new {it.N_LOCK_STATE,it.S_LOCK_STATE }).ExecuteCommand() == 1 &&
                        db.Insertable<TN_Loc_Container>(locCnt).ExecuteCommand() == 1 &&
                        db.Insertable<TN_Task>(task).ExecuteCommand() == 1
                        )
                    {
                        if (Settings.LineSorting < Settings.ProductionLines.Count - 1)
                        {
                            Settings.LineSorting++;
                        }
                        else
                        {
                            Settings.LineSorting = 0;
                        }
                        trans.CommitTran();
                        result.resultCode = 0;
                        result.resultMsg = $"创建 线边空托上线 任务成功,起点:{startLoc.S_CODE},终点:{endLoc.S_CODE}";
                        LogHelper.Info(result.resultMsg);
                        return result;
                    }
                    else
                    {
                        trans.RollbackTran();
                        result.resultCode = 12;
                        result.resultMsg = $"创建 线边空托上线 任务失败,起点:{startLoc.S_CODE},终点:{endLoc.S_CODE}";
                        LogHelper.Info(result.resultMsg);
                        return result;
                    }
                }
            }
            catch(Exception ex)
            {
                result.resultCode = -1;
                result.resultMsg = $"PDA满托复检判断,发生了异常:{ex.Message}";
                LogHelper.Info(result.resultMsg);
                return result;
            }
        }
        /// <summary>
        /// 人工次品回炉
        /// </summary>
        /// <param name="model"></param>
@@ -330,11 +505,13 @@
        internal static SimpleResult PDAReturnReset(PDAReturnResetInfo model)
        {
            LogHelper.Info("触发API:人工次品回炉" + JsonConvert.SerializeObject(model), "API");
            var db = new SqlHelper<object>().GetInstance();
            var result = new SimpleResult();//返回结果
            try
            {
                var db = new SqlHelper<object>().GetInstance();
                var startLoc  =  db.Queryable<TN_Location>().First(o => o.S_CODE == model.startLoc && o.N_CURRENT_NUM ==0 && o.N_LOCK_STATE == 0 && o.S_LOCK_STATE=="无" && o.S_AREA_CODE == Settings.Areas[4]);
                if (startLoc == null)
                {
@@ -679,11 +856,13 @@
        /// </summary>
        internal static SimpleResult PDAFullInArea(PDAFullInAreaInfo model)
        {
            var db = new SqlHelper<object>().GetInstance();
            var result = new SimpleResult();//返回结果
            LogHelper.Info("触发API:PDA满托下线入库" + JsonConvert.SerializeObject(model), "API");
            try
            {
                var db = new SqlHelper<object>().GetInstance();
                if (model.RfId.Length < 16)
                {
                    result.resultCode = 1;
@@ -971,10 +1150,11 @@
            LogHelper.Info("触发API:满托出库上线" + JsonConvert.SerializeObject(model), "API");
            var result = new SimpleResult();
            var db = new SqlHelper<object>().GetInstance();
            TN_Location endLoc = new TN_Location();
            try
            {
                var db = new SqlHelper<object>().GetInstance();
                if (model.EndLoc != string.Empty)//指定终点货位
                {
                    endLoc = db.Queryable<TN_Location>().First(a => a.S_CODE == model.EndLoc);
@@ -1120,13 +1300,14 @@
        {
            LogHelper.Info("触发API:空托下线堆叠" + JsonConvert.SerializeObject(model), "API");
            var result = new SimpleResult();
            var db = new SqlHelper<object>().GetInstance();
            TN_Location startLoc = new TN_Location();
            try
            {
                var db = new SqlHelper<object>().GetInstance();
                var startLocCntrRel = db.Queryable<TN_Loc_Container>().First(a => a.S_LOC_CODE == model.startLoc && a.S_CNTR_CODE == model.cntID);
                if (startLocCntrRel != null)
                {
@@ -1221,13 +1402,13 @@
            LogHelper.Info("触发API:余料下线入库" + JsonConvert.SerializeObject(model), "API");
            var result = new SimpleResult();
            var db = new SqlHelper<object>().GetInstance();
            TN_Location startLoc_Old = new TN_Location();
            TN_Location startLoc_New = new TN_Location();
            try
            {
                var db = new SqlHelper<object>().GetInstance();
                var cG_Detail = db.Queryable<TN_CG_Detail>().First(a => a.S_CNTR_CODE == model.cntID);
                if (cG_Detail == null)
                {
@@ -1500,10 +1681,12 @@
            LogHelper.Info("触发API:人工拆盘入库" + JsonConvert.SerializeObject(model), "API");
            var result = new SimpleResult();
            var db = new SqlHelper<object>().GetInstance();
            string cntLog = $"旧的容器号{model.old_CntId}";
            try
            {
                var db = new SqlHelper<object>().GetInstance();
                if (model.new_IsOK == model.old_IsOK)
                {
                    result.resultCode = 19;
@@ -1840,9 +2023,10 @@
            LogHelper.Info("触发API:人工创建点到点任务" + JsonConvert.SerializeObject(model), "API");
            var result = new SimpleResult();
            var db = new SqlHelper<object>().GetInstance();
            try
            {
                var db = new SqlHelper<object>().GetInstance();
                var startLoc = db.Queryable<TN_Location>().First(a => a.S_CODE == model.startLoc);
                
                if(!(startLoc != null  && startLoc.N_LOCK_STATE == 0 && startLoc.S_LOCK_STATE == "无"))
api/ApiModel.cs
@@ -464,5 +464,10 @@
            public string staff { get; set; } = "None";//操作人
            public string shift { get; set; } = "None";//班次
        }
        public class EmptyLineToLineInfo
        {
            public string startLoc { get; set; }//起点
        }
    }
}
api/MoboxController.cs
@@ -224,5 +224,17 @@
        {
            return ApiHelper.CreateP2PTask(model);
        }
        /// <summary>
        /// 线边空托到原材料输送线
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        [HttpPost]
        [Route("EmptyLineToLine")]
        public SimpleResult EmptyLineToLine(EmptyLineToLineInfo model)
        {
            return ApiHelper.EmptyLineToLine(model);
        }
    }
}
config/config.json
@@ -4,7 +4,7 @@
  "SqlServer": "Data Source=127.0.0.1;Initial Catalog=DoubleCoinTest;User ID=sa;Password=123456;",
  "TCPServerIP": "127.0.0.1",
  "TCPServerPort": 8085,
  "Areas": [ "SQKQ1", "SQKQ2", "SQKQ3", "SQKQ4", "SQKQ5", "SQKQ6", "SQKQ7", "SQKQ8", "SQKQ9", "SQKQ10", "SQKQ11", "SQKQ12", "SQKQ13" ],
  "Areas": [ "SQKQ0", "SQKQ1", "SQKQ2", "SQKQ3", "SQKQ4", "SQKQ5", "SQKQ6", "SQKQ7", "SQKQ8", "SQKQ9", "SQKQ10", "SQKQ11", "SQKQ12", "线边空托区编码", "原材料产线空托区编码" ],
  "S7TestMoni": true,
  "IsOpenScanCode": true,
  "ProductionLine": [
@@ -14,7 +14,8 @@
      "ProductionLine_Rack": 0,
      "ProductionLine_Slot": 1,
      "PointIn": "SQKQ1-1",
      "PointOut": "SQKQ1-2"
      "PointOut": "SQKQ1-2",
      "Sorting": 0
    }
  ],
  "AgvScanDevice": [
config/configDesc.txt
@@ -4,10 +4,10 @@
"HostToAgvServerUrl": "http://127.0.0.1:9988/HostToAGV.cgi",//连接AGV管理系统的地址
"TCPServerIP": "127.0.0.1",//Socket服务端地址,用于连接AGV读卡器并通讯
"TCPServerPort": 8085,//Socket服务端端口,用于连接AGV读卡器并通讯
"Areas": [ "SQKQ1", "SQKQ2", "SQKQ3", "SQKQ4", "SQKQ5" , "SQKQ6", "SQKQ7", "SQKQ8", "SQKQ9", "SQKQ10" , "SQKQ11", "SQKQ12"  ],
// 原材料产线库区SQKQ1——》满托缓存库区SQKQ2——》加工线线边区SQKQ3——》空托堆叠区SQKQ4——》空托缓存库区SQKQ5——》
//人工拆盘区SQKQ6——》人工空托区SQKQ7——》人工抽检区SQKQ8——》拆盘不合格区SQKQ9——》称重区SQKQ10
//——》余料起点区SQKQ11——》次品回炉区SQKQ12 ——》过期暂存区SQKQ13
"Areas": [ "SQKQ0", "SQKQ1", "SQKQ2", "SQKQ3", "SQKQ4" , "SQKQ5", "SQKQ6", "SQKQ7", "SQKQ8", "SQKQ9" , "SQKQ10", "SQKQ11" , "SQKQ12", "SQKQ13", "SQKQ14" ],
// 原材料产线库区SQKQ0——》满托缓存库区SQKQ1——》加工线线边区SQKQ2——》空托堆叠区SQKQ3——》空托缓存库区SQKQ4——》
//人工拆盘区SQKQ5——》人工空托区SQKQ6——》人工抽检区SQKQ7——》拆盘不合格区SQKQ8——》称重区SQKQ9
//——》余料起点区SQKQ10——》次品回炉区SQKQ11 ——》过期暂存区SQKQ12 ——》线边空托区SQKQ13 ——》原材料产线空托库区SQKQ14
"S7TestMoni": true,//如果为true,跳过S7通讯测试,只能使用PDA
"IsOpenScanCode": true,//如果为true,开启读卡器扫码功能,如果为false,不开启
core/WCSCore.cs
@@ -103,6 +103,8 @@
                                    WCSHelper.UpdateStatus(tN_Task, "卸货完成");//任务状态改成卸货完成
                                    TaskProcess.OperateStatus(tN_Task, 6);//终点容器货位绑定,解锁终点
                                    SpecHelper.RestEndLoc(tN_Task);
                                    Task task2 = Task.Run(() =>
                                    {
                                        if (tN_Task.S_TYPE == "空托出库入线")
@@ -163,11 +165,6 @@
                                    break;
                                case 2:
                                    WCSHelper.End(tN_Task);//任务状态改成结束
                                    Task task16 = Task.Run(() =>
                                    {
                                        SpecHelper.RestEndLoc(tN_Task);
                                    });
                                    break;
                                case 7:
device/TcpServer.cs
@@ -142,7 +142,7 @@
                        {
                            saoMa.Add(remote_ip, 3);
                        }
                        if (messageBytes.Length <= 20 && messageBytes.Length > 0)
                        if (messageBytes.Length <= 20 && messageBytes.Length > 0)//长度不够时直接判断扫码失败
                        {
                            saoMa[remote_ip] = 3;//未扫到码
                        }
util/Settings.cs
@@ -28,6 +28,11 @@
        public static List<ProductionLine> ProductionLines { get; set; }
        /// <summary>
        /// 产线的序号索引
        /// </summary>
        public static int LineSorting { get; set; } = 0;
        /// <summary>
        /// 所有称重设备信息列表
        /// </summary>
        public static List<WeightDevice> WeightDevices { get; set; }
@@ -127,6 +132,7 @@
            public int ProductionLine_Slot { get; set; }//产线的插槽号
            public string PointIn { get; set; }//产线的空托上线位
            public string PointOut { get; set; }//产线的满托下线位
            public int Sorting { get; set; }//产线的排序
        }
        /// <summary>
wms/SpecHelper.cs
@@ -280,14 +280,18 @@
        }
        /// <summary>
        /// 重置终点货位,只针对去线边的货品
        /// 重置终点货位,只针对去线边的货品和去原材料产线的空托
        /// </summary>
        /// <param name="tN_Task"></param>
        internal static void RestEndLoc(TN_Task tN_Task)
        {
            try
            {
                if (tN_Task.S_END_AREA == Settings.Areas[2] || tN_Task.S_TYPE.Contains("满托出库上线"))
                if (
                    tN_Task.S_END_AREA == Settings.Areas[2] || tN_Task.S_TYPE.Contains("满托出库上线") ||
                    Settings.ProductionLines.Select(a=>a.PointIn).ToList().Contains(tN_Task.S_END_LOC) ||
                    tN_Task.S_TYPE.Contains("线边空托上线")
                    )
                {
                    var db = new SqlHelper<object>().GetInstance();