杨前锦
2025-07-07 c8f338feee0b6003d8f069b1d37fd9b90dd1b7f4
印尼佳通优化
23个文件已修改
911 ■■■■ 已修改文件
HH.WCS.Mobox3/HH.WCS.Mobox3.FJJT/api/ApiHelper.cs 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.Mobox3/HH.WCS.Mobox3.FJJT/wms/WMSHelper.cs 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.Mobox3/HH.WCS.Mobox3.HD/api/ApiHelper.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.Mobox3/HH.WCS.Mobox3.HD/core/Monitor.cs 81 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.Mobox3/HH.WCS.Mobox3.HD/dispatch/ShopFloorControl.cs 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.Mobox3/HH.WCS.Mobox3.HD/wms/WMSHelper.cs 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.Mobox3/HH.WCS.Mobox3.SXJK/api/ApiHelper.cs 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.Mobox3/HH.WCS.Mobox3.SXJK/api/MoboxController.cs 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.Mobox3/HH.WCS.Mobox3.SXJK/api/WmsController.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.Mobox3/HH.WCS.Mobox3.SXJK/core/WCSCore.cs 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.Mobox3/HH.WCS.Mobox3.TSSG/core/Monitor.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_BZP/HH.WCS.Mobox3.YNJT_BZP.csproj 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_BZP/api/ApiHelper.cs 211 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_BZP/api/WmsController.cs 116 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_BZP/core/Monitor.cs 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_BZP/core/WCSCore.cs 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_BZP/dispatch/GtDispatch.cs 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_BZP/models/CntrItemRel.cs 24 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_BZP/models/ItemBarcodeInfo.cs 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_BZP/models/MatlInformation.cs 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_BZP/wms/ContainerHelper.cs 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_BZP/wms/ItemHelper.cs 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_BZP/wms/WMSHelper.cs 199 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.Mobox3/HH.WCS.Mobox3.FJJT/api/ApiHelper.cs
@@ -541,7 +541,7 @@
                        {
                            WMSHelper.addAlarmRecord("流程异常", "高", $"设备号:{bufferLocConfig.deviceNo},查询设备状态失败,请联系工作人员查看设备是否正常");
                            throw new BusinessException($"设备号:{bufferLocConfig.deviceNo},查询设备状态失败,请联系工作人员查看设备是否正常");
                        }*/
                        }*/
                    }
                    else
                    {
@@ -753,7 +753,7 @@
                    return responseResult;
                }
                middleLoc = WMSHelper.GetMinTaskTransfeLoc(startLoc.S_AREA_CODE, 2 , 2);
                middleLoc = WMSHelper.GetMinTaskTransfeLoc(startLoc.S_AREA_CODE, 2 );
                if (middleLoc == null) {
                    WMSHelper.addAlarmRecord("流程异常", "高", $"MES叫料任务{mesTask.ID},立库接驳位可能处于锁定或禁用状态,请查看");
                    responseResult.code = 1;
@@ -1159,7 +1159,7 @@
                        wmsEndLoc = WMSHelper.getInStockEndLoc(null, container.N_DETAIL_COUNT == 0 ? 0 : 1, container.N_TYPE);
                        if (wmsEndLoc != null)
                        {
                            agvEndLoc = WMSHelper.GetMinTaskTransfeLoc(wmsEndLoc.S_AREA_CODE, 1, 2);  // 1.立库接驳位 1.入库 2.非直连
                            agvEndLoc = WMSHelper.GetMinTaskTransfeLoc(wmsEndLoc.S_AREA_CODE, 1);
                            if (agvEndLoc != null)
                            {
                                LogHelper.Info($"创建立库站台到立库的预创建任务,agv终点货位:{agvEndLoc.S_CODE},立库终点货位:{wmsEndLoc.S_CODE}", "AGV");
@@ -1235,7 +1235,7 @@
                        wmsEndLoc = WMSHelper.getInStockEndLoc(null, container.N_DETAIL_COUNT == 0 ? 0 : 1, container.N_TYPE);
                        if (wmsEndLoc != null)
                        {
                            agvEndLoc = WMSHelper.GetMinTaskTransfeLoc(wmsEndLoc.S_AREA_CODE, 1, 2);  // 1.立库接驳位 1.入库 2.非直连
                            agvEndLoc = WMSHelper.GetMinTaskTransfeLoc(wmsEndLoc.S_AREA_CODE, 1);
                            if (agvEndLoc != null)
                            {
                                LogHelper.Info($"创建立库站台到立库的预创建任务,agv终点货位:{agvEndLoc.S_CODE},立库终点货位:{wmsEndLoc.S_CODE}", "AGV");
@@ -1246,7 +1246,7 @@
                                    S_OP_CODE = mst.S_CODE,
                                    S_CODE = WCSHelper.GenerateTaskNo(),
                                    S_CNTR_CODE = cst.S_CNTR_CODE,
                                    S_TYPE = cst.S_TYPE + "【异常】",
                                    S_TYPE = "异常工装入库",
                                    S_START_LOC = agvEndLoc.S_CODE,
                                    S_START_AREA = agvEndLoc.S_AREA_CODE,
                                    S_END_LOC = wmsEndLoc.S_CODE,
@@ -1348,7 +1348,7 @@
                        if (locCntrRels.Count > 0)
                        {
                            cntrCode = locCntrRels[0].S_CNTR_CODE;
                            middleLoc = WMSHelper.GetTransfeRelevanceLoc(startLoc.S_AREA_CODE, 2, 2);
                            middleLoc = WMSHelper.GetMinTaskTransfeLoc(startLoc.S_AREA_CODE, 2);
                            if (middleLoc != null)
                            {
                                // 1.创建成新机叫料作业
@@ -1523,7 +1523,7 @@
                            Location endLoc = WMSHelper.getCallMaterialLocCode(mesTask.EQP);
                            if (endLoc != null)
                            {
                                middleLoc = WMSHelper.GetTransfeRelevanceLoc(startLoc.S_AREA_CODE, 2, 2);
                                middleLoc = WMSHelper.GetMinTaskTransfeLoc(startLoc.S_AREA_CODE, 2);
                                if (middleLoc != null)
                                {
                                    // 1.创建成新机叫料作业
@@ -1747,7 +1747,7 @@
                wmsEndLoc = WMSHelper.getInStockEndLoc(null, container.N_DETAIL_COUNT == 0 ? 0 : 1, container.N_TYPE);
                if (wmsEndLoc != null)
                {
                    agvEndLoc = WMSHelper.GetMinTaskTransfeLoc(wmsEndLoc.S_AREA_CODE, 1, 2);  // 1.立库接驳位 1.入库 2.非直连
                    agvEndLoc = WMSHelper.GetMinTaskTransfeLoc(wmsEndLoc.S_AREA_CODE, 1);
                    if (agvEndLoc != null)
                    {
                        // 预先生成入库站台-立库终点的搬运任务
@@ -2101,7 +2101,7 @@
            {
                var transfeRelevance = WMSHelper.GetTransfeRelevance(model.locCode);  // 接驳位属性
                LogHelper.Info($"原站台属性:{JsonConvert.SerializeObject(transfeRelevance)}", "WMS");
                if (transfeRelevance != null && transfeRelevance.N_PROPERTY == 2)
                if (transfeRelevance != null)
                {
                    if (model.signalType == "1")
                    {
HH.WCS.Mobox3/HH.WCS.Mobox3.FJJT/wms/WMSHelper.cs
@@ -519,26 +519,6 @@
        /// <summary>
        /// 查询接驳位关联属性
        /// 注:
        /// 1.查询异常区货位
        /// </summary>
        /// <param name="areaCode">库区</param>
        /// <param name="type">动作类型(0.人工接驳位 1.入库接驳位 2.出库接驳位)</param>
        /// <param name="property">货位属性(1.直连 2.非直连)</param>
        /// <returns></returns>
        public static Location GetTransfeRelevanceLoc(string areaCode  ,int type ,int property )
        {
            Location loc = null;
            var db = new SqlHelper<object>().GetInstance();
            loc = db.Queryable<Location>()
                .LeftJoin<TransfeRelevance>((a,b)=> a.S_CODE == b.S_LOC_CODE)
                .Where((a, b) => b.S_RELE_AREA.Trim() == areaCode && b.N_PROPERTY == property && b.N_TYPE == type && a.N_CURRENT_NUM == 0 && a.N_LOCK_STATE == 0 && a.C_ENABLE == "Y")
                .First();
            return loc;
        }
        /// <summary>
        /// 查询接驳位关联属性
        /// </summary>
        /// <param name="locCode"></param>
        /// <param name="isManual">货位属性 (0.非人工 1.人工)</param>
@@ -556,16 +536,15 @@
        /// 注:查询任务最少的接驳位
        /// </summary>
        /// <param name="areaCode">库区</param>
        /// <param name="property">货位属性 ( 1.直连 2.非直连)</param>
        /// <param name="type">动作类型 (1.入库接驳位  2.出库接驳位)</param>
        /// <returns></returns>
        public static Location GetMinTaskTransfeLoc(string areaCode ,int type, int property)
        public static Location GetMinTaskTransfeLoc(string areaCode ,int type)
        {
            var db = new SqlHelper<object>().GetInstance();
            var loc = db.Queryable<Location>()
                .LeftJoin<TransfeRelevance>((a,b) => a.S_CODE == b.S_LOC_CODE)
                .LeftJoin<WCSTask>((a,b,c) => a.S_CODE == c.S_END_LOC && c.N_B_STATE < 3)
                .Where((a, b, c) => b.S_RELE_AREA.Trim() == areaCode  && b.N_TYPE == type && b.N_PROPERTY == property  && a.N_LOCK_STATE < 3 && a.C_ENABLE == "Y")
                .Where((a, b, c) => b.S_RELE_AREA.Trim() == areaCode  && b.N_TYPE == type && a.N_LOCK_STATE < 3 && a.C_ENABLE == "Y")
                .GroupBy((a, b, c) => a.S_CODE)
                .Select((a, b, c) => new {
                    count = SqlFunc.AggregateCount(c.S_END_LOC),
HH.WCS.Mobox3/HH.WCS.Mobox3.HD/api/ApiHelper.cs
@@ -285,7 +285,7 @@
                    {
                        LogHelper.Info("接驳位:" + JsonConvert.SerializeObject(item), "Mobox");
                        var conLoc = LocationHelper.GetLoc(item);
                        endLoc = WMSHelper.GetEndLocation(areaCode, model.trayItemInfoList[0].itemCode, conLoc.N_ROADWAY, conLoc.N_ROW);
                        endLoc = WMSHelper.GetEndLocation(areaCode, model.trayItemInfoList[0].itemCode, conLoc.N_ROADWAY, conLoc.N_ROW,4);
                        if (endLoc != null)
                        {
                            firstTaskEnd = conLoc;
@@ -666,7 +666,7 @@
            else
            {
                responseResult.success = false;
                responseResult.message = "未获取到终点库位";
                responseResult.message = "未获取到终点库位,剩余货位不足";
            }
            return responseResult;
        }
HH.WCS.Mobox3/HH.WCS.Mobox3.HD/core/Monitor.cs
@@ -224,18 +224,28 @@
                        if (locCntrRel != null)
                        {
                            LogHelper.Info("1111111", "输送线");
                            if (lineSignalInfo.faultMessage == 1)
                            {
                                // 回报车间控制器
                                LogHelper.Info("输送线,线体【" + line.code + "】调整为手动状态", "输送线");
                                continue;
                            }
                            WMSTask wmsTask = WMSHelper.GetWmsTaskByCntr(locCntrRel.S_CNTR_CODE);
                            if (wmsTask == null)
                            {
                                LogHelper.Info("没有正在执行的任务,货位:" + locCntrRel.S_LOC_CODE + " 容器:" + locCntrRel.S_CNTR_CODE, "输送线");
                                continue;
                            }
                            if (lineSignalInfo.faultMessage != 0)
                            {
                                // 回报车间控制器
                                WMSStatusInfo statusInfo = new WMSStatusInfo()
                                {
                                    wmsId = wmsTask.S_CODE,
                                    errMsg = $"{line.code}输送线故障,故障编码:{lineSignalInfo.faultMessage}"
                                };
                                ShopFloorControl.wmsUpdateStatus(statusInfo);
                                if (lineSignalInfo.faultMessage == 1)
                                {
                                    LogHelper.Info("输送线,线体【" + line.code + "】调整为手动状态", "输送线");
                                    continue;
                                }
                            }
                            var date = DateTime.Now.ToString("yyMMdd");
@@ -337,33 +347,40 @@
                                        }
                                        LogHelper.Info("堆垛机入库任务终点", "输送线");
                                        Location endLoc = WMSHelper.GetEndLocation(wmsTask.S_END_AREA, itemCode, originLocation.N_ROADWAY, originLocation.N_ROW);
                                        LogHelper.Info($"堆垛机入库任务终点:{endLoc.S_CODE}", "输送线");
                                        wmsTask.S_END_LOC = endLoc.S_CODE;
                                        WMSHelper.UpdateTask(wmsTask);
                                        string eqNo = ApiHelper.getEqNo(endLoc.S_AREA_CODE, endLoc.N_ROADWAY);
                                        if (endLoc != null)
                                        {
                                            LogHelper.Info($"堆垛机入库任务终点:{endLoc.S_CODE}", "输送线");
                                            wmsTask.S_END_LOC = endLoc.S_CODE;
                                            WMSHelper.UpdateTask(wmsTask);
                                            string eqNo = ApiHelper.getEqNo(endLoc.S_AREA_CODE, endLoc.N_ROADWAY);
                                        List<string> areaCdoes = Settings.getStoreAreaCodes(2, 1);
                                        WCSTask twoWcsTask = new WCSTask
                                            List<string> areaCdoes = Settings.getStoreAreaCodes(2, 1);
                                            WCSTask twoWcsTask = new WCSTask
                                            {
                                                S_OP_NAME = wmsTask.S_OP_DEF_NAME,
                                                S_OP_CODE = wmsTask.S_CODE,
                                                S_CODE = WCSHelper.GenerateTaskNo(),
                                                S_CNTR_CODE = wmsTask.S_CNTR_CODE,
                                                S_TYPE = wmsTask.S_TYPE + "-2",
                                                S_START_LOC = originLocation.S_CODE,
                                                S_START_AREA = originLocation.S_AREA_CODE,
                                                S_END_LOC = wmsTask.S_END_LOC,
                                                S_END_AREA = wmsTask.S_END_AREA,
                                                S_EQ_NO = eqNo,
                                                S_SCHEDULE_TYPE = "RB",
                                                T_START_TIME = DateTime.Now,
                                            };
                                            if (WCSHelper.CreateTask(twoWcsTask))
                                            {
                                                // 接驳位加出库锁,终点货位加入库锁
                                                LocationHelper.LockLoc(twoWcsTask.S_START_LOC, 2);
                                                LocationHelper.LockLoc(twoWcsTask.S_END_LOC, 1);
                                                LogHelper.Info("堆垛机入库任务已下发,任务信息:" + JsonConvert.SerializeObject(twoWcsTask), "输送线");
                                            }
                                        }
                                        else
                                        {
                                            S_OP_NAME = wmsTask.S_OP_DEF_NAME,
                                            S_OP_CODE = wmsTask.S_CODE,
                                            S_CODE = WCSHelper.GenerateTaskNo(),
                                            S_CNTR_CODE = wmsTask.S_CNTR_CODE,
                                            S_TYPE = wmsTask.S_TYPE + "-2",
                                            S_START_LOC = originLocation.S_CODE,
                                            S_START_AREA = originLocation.S_AREA_CODE,
                                            S_END_LOC = wmsTask.S_END_LOC,
                                            S_END_AREA = wmsTask.S_END_AREA,
                                            S_EQ_NO = eqNo,
                                            S_SCHEDULE_TYPE = "RB",
                                            T_START_TIME = DateTime.Now,
                                        };
                                        if (WCSHelper.CreateTask(twoWcsTask))
                                        {
                                            // 接驳位加出库锁,终点货位加入库锁
                                            LocationHelper.LockLoc(twoWcsTask.S_START_LOC, 2);
                                            LocationHelper.LockLoc(twoWcsTask.S_END_LOC, 1);
                                            LogHelper.Info("堆垛机入库任务已下发,任务信息:" + JsonConvert.SerializeObject(twoWcsTask), "输送线");
                                            LogHelper.Info($"堆垛机入库任务终点:null", "输送线");
                                        }
                                    }
                                    else {
HH.WCS.Mobox3/HH.WCS.Mobox3.HD/dispatch/ShopFloorControl.cs
@@ -92,6 +92,45 @@
        }
        /// <summary>
        /// WMS物流调度状态反馈
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public static bool wmsUpdateStatus(WMSStatusInfo model)
        {
            var msg = "";
            var result = false;
            LogHelper.Info("WMS物流调度状态反馈, 入参:" + JsonConvert.SerializeObject(model), "车间控制器");
            var request = JsonConvert.SerializeObject(model);
            var response = apiHelper.Post(baseUrl + "/api/hecWms/logistics/wmsUpdateStatus", request);
            msg = $"[车间控制器-updateStatus] request={request} response={response}";
            Console.WriteLine(msg);
            LogHelper.Info("WMS物流调度状态反馈, 出参:" + JsonConvert.SerializeObject(response), "车间控制器");
            if (response != null && response != "")
            {
                try
                {
                    var dataResult = JsonConvert.DeserializeObject<ResponseData>(response);
                    if (dataResult.success)
                    {
                        result = dataResult.code.Equals("200");
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
            }
            else
            {
                msg = "[车间控制器-updateStatus]WMS物流调度状态反馈失败";
                Console.WriteLine(msg);
            }
            LogHelper.Info(msg, "车间控制器");
            return result;
        }
        /// <summary>
        /// 物流调度接口
        /// </summary>
        /// <param name="model"></param>
@@ -327,6 +366,12 @@
            public string reason { get; set; } // 失败原因
        }
        public class WMSStatusInfo
        {
            public string wmsId { get; set; } // wms任务ID
            public string errMsg { get; set; } // 错误信息
        }
        public class UnBindInfo { 
            public string processTaskId { get; set; }  // 工序任务ID
            public string trayCode{ get; set; } // 托盘编码
HH.WCS.Mobox3/HH.WCS.Mobox3.HD/wms/WMSHelper.cs
@@ -676,8 +676,9 @@
        /// <param name="itemCode"></param>
        /// <param name="roadway">接驳位所在巷道</param>
        /// <param name="row">接驳位所在排</param>
        /// <param name="thresholdValue">库容阈值</param>
        /// <returns></returns>
        public static Location GetEndLocation(string areaCode, string itemCode ,int roadway ,int row)
        public static Location GetEndLocation(string areaCode, string itemCode ,int roadway ,int row ,int thresholdValue = 1)
        {
            Location loc = null;
            try
@@ -718,7 +719,7 @@
                                .LeftJoin<WCSTask>((a,b) => a.S_CODE == b.S_OP_CODE)
                              .LeftJoin<Location>((a, b ,c) => b.S_END_LOC == c.S_CODE)
                              .Where((a, b, c) => b.S_END_AREA == storeAreaInfo.accessArea && c.N_ROADWAY == roadway && a.N_B_STATE < 2 && b.S_TYPE.Contains("入库")).Count();
                        if (locList.Count - 2 > taskNum)
                        if (locList.Count - thresholdValue > taskNum)
                        {
                            // 【1.2】查询深度 N_DEEP = 2 ,位置 N_POS = 1 且 物料相同 的货位
                            var sameItemLocList = db.Queryable<Location>()
@@ -764,7 +765,7 @@
                }
            }
            catch (Exception ex) {
                LogHelper.Error("GetEndLocation:" + ex.Message, ex);
                LogHelper.Info("获取入库终点报错,错误信息:" + ex.Message,"WMS");
            }
            return loc;
        }
HH.WCS.Mobox3/HH.WCS.Mobox3.SXJK/api/ApiHelper.cs
@@ -11,6 +11,7 @@
using System.Linq;
using System.Threading;
using static HH.WCS.Mobox3.SXJK.api.ApiModel;
using static HH.WCS.Mobox3.SXJK.api.MoboxController;
using static HH.WCS.Mobox3.SXJK.api.OtherModel;
using static HH.WCS.Mobox3.SXJK.api.WmsController;
using static HH.WCS.Mobox3.SXJK.api.WmsController.PutawayOrderIn;
@@ -563,6 +564,35 @@
        }
        /// <summary>
        /// 入库单重置
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public static SimpleResult inventoryReceiptReset(InventoryReceiptResetModel model)
        {
            SimpleResult simpleResult = new SimpleResult();
            var inStockList = WMSHelper.GetInStockList(model.asnNo);
            if (inStockList != null)
            {
                var inStockListChildren = WMSHelper.getInstockListChild(model.asnNo);
                if(inStockListChildren.Count > 0)
                {
                    foreach (var child in inStockListChildren)
                    {
                        var locCntrRel = LocationHelper.GetLocCntrRelByCntr(child.S_TRACE_ID);
                        if (locCntrRel != null)
                        {
                            LocationHelper.UnBindingLoc(locCntrRel.S_LOC_CODE, new List<string>() { locCntrRel.S_CNTR_CODE });
                        }
                        ContainerHelper.deleteCntrItem(child.S_TRACE_ID);
                    }
                }
            }
            return simpleResult;
        }
        /// <summary>
        /// 更新抽检信息
        /// </summary>
        /// <param name="model"></param>
HH.WCS.Mobox3/HH.WCS.Mobox3.SXJK/api/MoboxController.cs
@@ -20,6 +20,24 @@
    public class MoboxController : System.Web.Http.ApiController {
        /// <summary>
        /// 入库单重置
        /// </summary>
        /// <returns></returns>
        public SimpleResult inventoryReceiptReset(InventoryReceiptResetModel model)
        {
            LogHelper.Info("[入库单重置]inventoryReceiptReset 入参:" + JsonConvert.SerializeObject(model), "Mobox");
            SimpleResult simpleResult = new SimpleResult();
            ApiHelper.inventoryReceiptReset(model);
            LogHelper.Info("[入库单重置]inventoryReceiptReset 出参:" + JsonConvert.SerializeObject(simpleResult), "Mobox");
            return simpleResult;
        }
        public class InventoryReceiptResetModel
        {
            public string asnNo { get; set; }  // 入库单号
        }
        /// <summary>
        /// 远程启动输送线
        /// </summary>
        /// <returns></returns>
HH.WCS.Mobox3/HH.WCS.Mobox3.SXJK/api/WmsController.cs
@@ -145,7 +145,7 @@
                    if (!result)
                    {
                        es_bc_info.TYPE = "E";
                        es_bc_info.MSG = "移库单同步错误";
                        es_bc_info.MSG = "转移单同步错误";
                    }
                });
            }
@@ -184,7 +184,7 @@
            try
            {
                model.IT_DATA.ForEach(a =>
                model.IT_DATA.ForEach( a =>
                {
                   var result = ApiHelper.shiftingStockOrderSync(a);
                    if (!result) {
HH.WCS.Mobox3/HH.WCS.Mobox3.SXJK/core/WCSCore.cs
@@ -225,13 +225,22 @@
                                                var cntrItemRels = ContainerHelper.GetCntrItemRel(cntrCode);
                                                if (cntrItemRels != null && cntrItemRels.Count > 0)
                                                {
                                                    LogHelper.Info($"OperateGZTaskStatus: 2 ,cntrCode:{cntrCode},S_ASN_NO ={cntrItemRels[0].S_ASN_NO},", "WMS");
                                                    var inStockListChilds = WMSHelper.getInstockListChild(cntrCode, cntrItemRels[0].S_ASN_NO);
                                                    var cntrItemRel = cntrItemRels[0];
                                                    LogHelper.Info($"OperateGZTaskStatus: 2 ,cntrCode:{cntrCode},S_ASN_NO ={cntrItemRel.S_ASN_NO},", "WMS");
                                                    var inStockListChilds = WMSHelper.getInstockListChild(cntrCode, cntrItemRel.S_ASN_NO);
                                                    LogHelper.Info($"OperateGZTaskStatus: 2 ,inStockListChilds.count:{inStockListChilds.Count}", "WMS");
                                                    if (inStockListChilds != null && inStockListChilds.Count > 0) 
                                                    {
                                                        LogHelper.Info("OperateGZTaskStatus: 3", "WMS");
                                                        receiveGoodsFeedback(inStockListChilds, cntrItemRels[0].F_NET_WEIGHT.ToString(), cntrCode, TN_Task.S_END_LOC);
                                                        receiveGoodsFeedback(inStockListChilds, cntrItemRel.F_NET_WEIGHT.ToString(), cntrCode, TN_Task.S_END_LOC);
                                                        // 入库完成,回报WMS后,更新SPA批次号
                                                        var inStockListChildren = Monitor.getInStockTrayInfo(cntrCode);
                                                        if (inStockListChildren != null && inStockListChildren.Count > 0)
                                                        {
                                                            cntrItemRel.LOTATT04 = inStockListChildren[0].LOTATT04;
                                                            ContainerHelper.UpdateCntrItemRel(cntrItemRel);
                                                        }
                                                    }
                                                }
                                            }
HH.WCS.Mobox3/HH.WCS.Mobox3.TSSG/core/Monitor.cs
@@ -66,7 +66,7 @@
                LogHelper.Info($"缓存信号处理,缓存IP:{item.Key}", "TSSG");
                var instockInfo = item.Value;
                var end = WMSHelper.GetInstockEnd(instockInfo.item, instockInfo.endArea);
                LogHelper.Info("(缓存信号)终点货位:" + JsonConvert.SerializeObject(end), "TSSG");
                LogHelper.Info($"(缓存信号,目标库区:{instockInfo.endArea},物料编码:{instockInfo.item})终点货位:" + JsonConvert.SerializeObject(end), "TSSG");
                if (end != null)
                {
                    ApiHelper.Instock(instockInfo);
HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_BZP/HH.WCS.Mobox3.YNJT_BZP.csproj
@@ -257,6 +257,8 @@
    <Compile Include="models\Area.cs" />
    <Compile Include="models\EmptyTrayBuffer.cs" />
    <Compile Include="models\ItemBarcodeInfo.cs" />
    <Compile Include="models\iWMS_semi_bld_BCsample.cs" />
    <Compile Include="models\iWMS_semi_bld_BCstatus.cs" />
    <Compile Include="models\MatlInformation.cs" />
    <Compile Include="models\OI_WMS_OP_DEF.cs" />
    <Compile Include="models\OI_WMS_SCHEDULE_TYPE.cs" />
@@ -296,6 +298,7 @@
    <Compile Include="models\TN_OOS_Order.cs" />
    <Compile Include="models\TN_YiKuDetail.cs" />
    <Compile Include="models\TN_YiKuOrder.cs" />
    <Compile Include="models\Trfloc.cs" />
    <Compile Include="models\WHInventory.cs" />
    <Compile Include="models\TN_WMS_Const.cs" />
    <Compile Include="models\WorkOrder.cs" />
HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_BZP/api/ApiHelper.cs
@@ -28,6 +28,7 @@
        }
        /// <summary>
        /// 1.创建入库任务
        /// </summary>
@@ -44,39 +45,6 @@
                        result.ResultCode = 1;
                        result.ResultMsg = "物料信息不能为空";
                        return result;
                    }
                    else
                    {
                        foreach (var item in itemInfos)
                        {
                            // 将MES的物料状态转化成WMS可识别的物料状态
                            if (item.jdge == "" || item.jdge == null)
                            {
                                item.jdge = "OK";
                            }
                            else if(item.jdge != "OK")
                            {
                                item.jdge = "HOLD";
                            }
                            // 计算生效时间、失效时间
                            var overage = WMSHelper.getOverage(item.bc_entried);
                            LogHelper.Info($"计算生效时间、失效时间,返回值:{JsonConvert.SerializeObject(overage)}", "WMS");
                            if (overage != null)
                            {
                                DateTime txndate = DateTime.Parse(item.txndate);
                                DateTime minTime = txndate.AddHours(overage.MINHOUR);
                                DateTime maxTime = txndate.AddDays(overage.OVERAGE);
                                item.effective_time = minTime.ToString("yyyy-MM-dd HH:mm:ss");
                                item.expiration_time = maxTime.ToString("yyyy-MM-dd HH:mm:ss");
                            }
                            else
                            {
                                result.ResultCode = 1;
                                result.ResultMsg = $"未查询到物料存放时间配置信息,条形码:{item.bc_entried}";
                                return result;
                            }
                        }
                    }
                }
@@ -267,6 +235,13 @@
                        if (endLoc != null)
                        {
                            string taskType = "成型机叫料出库任务";
                            if (model.taskType == 2)
                            {
                                taskType = "抽检叫料出库任务";
                            }
                            var wmsTask = new WMSTask()
                            {
                                S_CNTR_CODE = descCntrCode,
@@ -275,9 +250,9 @@
                                S_START_AREA = startLoc.S_AREA_CODE,
                                S_END_LOC = endLoc.S_CODE,
                                S_END_AREA = endLoc.S_AREA_CODE,
                                S_TYPE = "成型机叫料出库任务",
                                S_TYPE = taskType,
                                S_OP_DEF_CODE = model.taskNo,
                                S_OP_DEF_NAME = "成型机叫料出库任务",
                                S_OP_DEF_NAME = "叫料出库任务",
                                N_PRIORITY = model.priority,
                                T_START_TIME = DateTime.Now,
                            };
@@ -347,40 +322,8 @@
            ReturnResult result = new ReturnResult();
            try
            {
                if(model.itemInfo != null && model.itemInfo.Count > 0)
                {
                    foreach (var item in model.itemInfo)
                    {
                        // 将MES的物料状态转化成WMS可识别的物料状态
                        if (item.jdge == "" || item.jdge == null)
                        {
                            item.jdge = "OK";
                        }
                        else if (item.jdge != "OK")
                        {
                            item.jdge = "HOLD";
                        }
                        var overage = WMSHelper.getOverage(item.bc_entried);
                        if (overage != null && overage.OVERAGE != 0)
                        {
                            DateTime txndate = DateTime.Parse(item.txndate);
                            DateTime minTime = txndate.AddHours(overage.MINHOUR);
                            DateTime maxTime = txndate.AddDays(overage.OVERAGE);
                            item.effective_time = minTime.ToString("yyyy-MM-dd HH:mm:ss");
                            item.expiration_time = maxTime.ToString("yyyy-MM-dd HH:mm:ss");
                        }
                        else
                        {
                            result.ResultCode = 1;
                            result.ResultMsg = $"未查询到物料存放时间配置信息,条形码:{item.bc_entried}";
                            return result;
                        }
                    }
                }
                var container = ContainerHelper.GetCntr(model.trayCode);
                if (container != null)
                if (container != null)
                {
                    Location startLoc = LocationHelper.GetLoc(model.startLoc);
                    Location endLoc = WMSHelper.GetInstockEndLoc(container.N_TYPE, model.startLoc, 2);
@@ -446,8 +389,13 @@
                    else
                    {
                        result.ResultCode = 1;
                        result.ResultMsg = "没有空余的货位";
                        result.ResultMsg = "立库没有空余的货位";
                    }
                }
                else
                {
                    result.ResultCode = 1;
                    result.ResultMsg = "WMS系统中没有该容器";
                }
            }
            catch (Exception ex)
@@ -1090,19 +1038,15 @@
                {
                    S_ITEM = matl.item,
                    S_BC_ENTRIED = matl.bc_entried,
                    S_TOOLING_CODE = matl.toolineCode,
                    S_MCN = matl.mcn,
                    S_OPR = matl.opr,
                    TXNDATE = DateTime.Parse(matl.txndate, enGB) ,
                    S_SHIFT = matl.shift,
                    N_QTY = matl.qty,
                    N_STOCK = matl.stock,
                    S_LOKASI = matl.lokasi,
                    S_SARANA = matl.sarana,
                    BOM1 = matl.bom1,
                    BOM2 = matl.bom2,
                    BOM3 = matl.bom3,
                    S_FOVRAGE = matl.fovrage,
                    S_JDGE = matl.jdge,
                    N_OVERAGE = matl.overagv,
                    N_MINHOUR = matl.minhour,
                    N_PRODUCT_TYPE_CODE = matl.productTypeCode,
                    LAST_MODIFY_TIME = matl.last_modify_time
                };
                itemBarcodeInfos.Add(itemBarcodeInfo);
@@ -1112,102 +1056,87 @@
            if (!bo) 
            {
                responseResult.ResultCode = 1;
                responseResult.ResultMsg = "同步物料条码信息失败";
                responseResult.ResultMsg = "同步GT条码物料信息失败";
            }
            return responseResult;
        }
        /// <summary>
        /// 同步物料状态信息
        /// 同步条码状态信息
        /// </summary>
        /// <param name="updateMatlStatuses"></param>
        /// <returns></returns>
        public static ReturnResult synUpdateMatlStatus(List<UpdateMatlStatus> updateMatlStatuses)
        public static ReturnResult synBarcodeStatus(List<UpdateMatlStatus> updateMatlStatuses)
        {
            ReturnResult responseResult = new ReturnResult();
            var bo = WMSHelper.batchUpdateItemStatus(updateMatlStatuses);
            if (!bo)
            List<iWMS_semi_bld_BCstatus> list = new List<iWMS_semi_bld_BCstatus> ();
            if (updateMatlStatuses.Count > 0)
            {
                responseResult.ResultCode = 1;
                responseResult.ResultMsg = "同步物料状态信息失败";
            }
            return responseResult;
        }
        /// <summary>
        /// 同步更新物料存放时间配置信息
        /// </summary>
        /// <param name="overages"></param>
        /// <returns></returns>
        public static ReturnResult synUpdateMatlTimeConfig(List<MatlOverage> overages)
        {
            ReturnResult responseResult = new ReturnResult();
            if (overages != null && overages.Count > 0)
            {
                List<Overage> overageList = new List<Overage>();
                foreach (var item in overages)
                foreach (var item in updateMatlStatuses)
                {
                    Overage overage = new Overage
                    iWMS_semi_bld_BCstatus bCstatus = new iWMS_semi_bld_BCstatus()
                    {
                        MCNGRP = item.mcngrp,
                        ITEMPATT = item.itempatt,
                        OVERAGE = item.overage,
                        MINHOUR = float.Parse(item.minhour.ToString()),
                        FLAG_STS = item.flag_sts,
                        RECID = item.recid,
                        S_BC_ENTRIED = item.bc_entried,
                        S_MCNGRP = item.mcngrp,
                        S_JDGE = item.jdge,
                        LAST_MODIFY_TIME = item.last_modify_time
                    };
                    overageList.Add(overage);
                    list.Add(bCstatus);
                }
                var bo = WMSHelper.batchUpdateMatlTimeConfig(overageList);
                var bo = WMSHelper.synBarcodeStatus(list);
                if (!bo)
                {
                    responseResult.ResultCode = 1;
                    responseResult.ResultMsg = "同步物料状态信息失败";
                    responseResult.ResultMsg = "同步条码状态信息失败";
                }
            }
            return responseResult;
        }
        /// <summary>
        /// 记录数据同步时间
        /// 同步条码状态信息
        /// </summary>
        /// <param name="model"></param>
        /// <param name="updateMatlStatuses"></param>
        /// <returns></returns>
        public static ReturnResult recordDataSynTime(RecordDataSynTimeModel model)
        public static ReturnResult synSamplingStatus(List<UpdateMatlStatus> updateMatlStatuses)
        {
            ReturnResult responseResult = new ReturnResult();
            SynDataTimeRecord record = new SynDataTimeRecord()
            List<iWMS_semi_bld_BCsample> list = new List<iWMS_semi_bld_BCsample>();
            if (updateMatlStatuses.Count > 0)
            {
                S_SYN_TIME = model.sysTime,
                N_SYN_NUM = model.synNum,
                RECORD_TABLE = model.recordTable
            };
            var bo = WMSHelper.addSynDataTimeReord(record);
            if (!bo)
            {
                responseResult.ResultCode = 1;
                responseResult.ResultMsg = "记录数据同步时间失败";
                foreach (var item in updateMatlStatuses)
                {
                    iWMS_semi_bld_BCsample bCstatus = new iWMS_semi_bld_BCsample()
                    {
                        S_BC_ENTRIED = item.bc_entried,
                        S_MCNGRP = item.mcngrp,
                        S_JDGE = item.jdge,
                        LAST_MODIFY_TIME = item.last_modify_time
                    };
                    list.Add(bCstatus);
                }
                var bo = WMSHelper.synSamplingStatus(list);
                if (!bo)
                {
                    responseResult.ResultCode = 1;
                    responseResult.ResultMsg = "同步条码状态信息失败";
                }
            }
            return responseResult;
        }
        /// <summary>
        /// 查询上一次的数据同步时间
        /// </summary>
        /// <param name="recordTable"></param>
        /// <param name="tableType"></param>
        /// <returns></returns>
        public static ReturnResult findLastDataSynTime(string recordTable)
        public static ReturnResult findDataLastSynTime(int tableType)
        {
            ReturnResult responseResult = new ReturnResult();
            var synDataTime = WMSHelper.getLastDataSynTime(recordTable);
            if (synDataTime != null)
            {
                Dictionary<string, string> map = new Dictionary<string, string>();
                map.Add("S_SYN_TIME", synDataTime.S_SYN_TIME);
                map.Add("RECORD_TABLE", synDataTime.RECORD_TABLE);
                responseResult.data = map;
            }
            var synDataTime = WMSHelper.getDataLastSynTime(tableType);
            responseResult.data = synDataTime;
            return responseResult;
        }
@@ -1272,10 +1201,11 @@
        public class CreateOutOrderModel
        {
            public string taskNo { get; set; } // 任务号
            public string trayCode { get; set; } // 任务号
            public string trayCode { get; set; } // 托盘号
            public string itemCode { get; set; } // 物料编码
            public string endLoc { get; set; } // 终点货位
            public int priority { get; set; } = 0; // 优先级 默认0
            public int taskType { get; set; } = 1; // 1.成型机叫料任务 2.抽检出库任务
        }
        public class EmptyTrayOutOrderModel
@@ -1300,16 +1230,15 @@
        {
            public string item { get; set; } // 物品代码
            public string bc_entried { get; set; } // 条形码编号
            public string toolineCode { get; set; } // 工装条码
            public string mcn { get; set; } // 机器代码编号
            public string opr { get; set; } // 操作员
            public string txndate { get; set; } // 生产时间
            public string shift { get; set; } // 工作班次
            public int qty { get; set; } // 产品数量
            public string sarana { get; set; } // 产品材料的托盘/盒/推车/货车ID
            public string fovrage { get; set; } // 是否过期的状态 Y=过期,N=未过期
            public string jdge { get; set; } // 质量状态 OK=产品合格,NG=产品不合格,HLM=产品待定
            public string effective_time { get; set; } // 生效时间 (yyyy-MM-dd HH:mm:ss)
            public string expiration_time { get; set; } // 失效时间 (yyyy-MM-dd HH:mm:ss)
            public string jdge { get; set; } // 质量状态 OK=产品合格,HOLD = 产品待定
            public int overage { get; set; } // 生效时间 (yyyy-MM-dd HH:mm:ss)
            public int minhour { get; set; } // 失效时间 (yyyy-MM-dd HH:mm:ss)
            public int productTypeCode { get; set; } // 失效时间 (yyyy-MM-dd HH:mm:ss)
        }
        
HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_BZP/api/WmsController.cs
@@ -55,18 +55,19 @@
        }
        /// <summary>
        /// 3.成型机叫料出库任务
        /// 3.叫料出库任务
        /// 业务场景:
        /// 1.成型机呼叫流程(带束/零度 、胎侧 、BEC、内衬、帘布、胎圈/三角胶)
        /// 2.抽检出库
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        [HttpPost]
        public ReturnResult createOutOrder(CreateOutOrderModel model)
        {
            LogHelper.Info("【3.成型机叫料出库任务】request:" + JsonConvert.SerializeObject(model), "WMS");
            LogHelper.Info("【3.叫料出库任务】request:" + JsonConvert.SerializeObject(model), "WMS");
            var result = ApiHelper.createOutOrder(model);
            LogHelper.Info("【3.成型机叫料出库任务】response:" + JsonConvert.SerializeObject(result), "WMS");
            LogHelper.Info("【3.叫料出库任务】response:" + JsonConvert.SerializeObject(result), "WMS");
            return result;
        }
@@ -126,7 +127,7 @@
            LogHelper.Info("【6.下发母拖出入库任务】response:" + JsonConvert.SerializeObject(result), "WMS");
            return result;
        }
        // ------------------- WCS ----------------
        /// <summary>
@@ -144,22 +145,6 @@
            LogHelper.Info("【7.WCS任务状态反馈】response:" + JsonConvert.SerializeObject(result), "WMS");
            return result;
        }
        /*/// <summary>
        /// 8.WCS入库读码反馈
        /// 业务场景:WCS在执行任务时,回报任务状态
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        [HttpPost]
        *//*[Route("notifyTaskStatus")]*//*
        public ReturnResult readCodeFeedback(ReadCodeFeedbackModel model)
        {
            LogHelper.Info("【8.WCS入库读码反馈】Request:" + JsonConvert.SerializeObject(model), "WMS");
            var result = ApiHelper.readCodeFeedback(model);
            LogHelper.Info("【8.WCS入库读码反馈】response:" + JsonConvert.SerializeObject(result), "WMS");
            return result;
        }*/
        /// <summary>
        /// 8.WCS反馈货位状态
@@ -181,14 +166,6 @@
            return result;
        }
        public class LocStateFeedBackModel
        {
            public string reqId { get; set; }
            public string reqTime { get; set; }
            public string loc_code { get; set; } // 站台编码
            public string type { get; set; } // 请求类型 1 允许取货 2 允许放货
            public string req_no { get; set; } // 任务号
        }
        // ----------------------------------- GT --------------------------------------------------------------
@@ -209,65 +186,48 @@
        }
        /// <summary>
        /// 10.同步更新物料状态
        /// 业务场景:GT的状态进行更新,wms也需要同步更新
        /// 10.同步条码状态信息
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        [HttpPost]
        /*[Route("notifyTaskStatus")]*/
        public ReturnResult synUpdateMatlStatus(SynUpdateMatlStatusModel model)
        public ReturnResult synBarcodeStatus(SynUpdateMatlStatusModel model)
        {
            LogHelper.Info("【10.同步更新物料状态】Request:" + JsonConvert.SerializeObject(model), "GT");
            var result = ApiHelper.synUpdateMatlStatus(model.updateMatlStatuses);
            LogHelper.Info("【10.同步更新物料状态】response:" + JsonConvert.SerializeObject(result), "GT");
            LogHelper.Info("【10.同步条码状态表信息】Request:" + JsonConvert.SerializeObject(model), "GT");
            var result = ApiHelper.synBarcodeStatus(model.updateMatlStatuses);
            LogHelper.Info("【10.同步条码状态表信息】response:" + JsonConvert.SerializeObject(result), "GT");
            return result;
        }
        /// <summary>
        /// 11.记录数据同步时间
        /// 11.同步抽检状态表信息
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        [HttpPost]
        /*[Route("notifyTaskStatus")]*/
        public ReturnResult synSamplingStatus(SynUpdateMatlStatusModel model)
        {
            LogHelper.Info("【11.同步抽检状态表信息】Request:" + JsonConvert.SerializeObject(model), "GT");
            var result = ApiHelper.synSamplingStatus(model.updateMatlStatuses);
            LogHelper.Info("【11.同步抽检状态表信息】response:" + JsonConvert.SerializeObject(result), "GT");
            return result;
        }
        /// <summary>
        /// 11.查询中间表最后的同步时间
        /// 业务场景:记录物料条码信息同步、物料状态信息同步时间
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        [HttpPost]
        /*[Route("notifyTaskStatus")]*/
        public ReturnResult recordDataSynTime(RecordDataSynTimeModel model)
        public ReturnResult findDataLastSynTime(SynTableModel model)
        {
            LogHelper.Info("【11.记录数据同步时间】Request:" + JsonConvert.SerializeObject(model), "GT");
            var result = ApiHelper.recordDataSynTime(model);
            LogHelper.Info("【11.记录数据同步时间】response:" + JsonConvert.SerializeObject(result), "GT");
            return result;
        }
        /// <summary>
        /// 12.查询上一次的数据同步时间
        /// 业务场景:记录物料条码信息同步、物料状态信息同步时间
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        [HttpPost]
        /*[Route("notifyTaskStatus")]*/
        public ReturnResult findLastDataSynTime(RecordDataSynTimeModel model)
        {
            LogHelper.Info("【12.查询上一次的数据同步时间】Request:" + JsonConvert.SerializeObject(model), "GT");
            var result = ApiHelper.findLastDataSynTime(model.recordTable);
            LogHelper.Info("【12.查询上一次的数据同步时间】response:" + JsonConvert.SerializeObject(result), "GT");
            return result;
        }
        /// <summary>
        /// 13.同步更新物料存放时间配置表
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        [HttpPost]
        /*[Route("notifyTaskStatus")]*/
        public ReturnResult synUpdateMatlTimeConfig(MatlTimeConfigModel model)
        {
            LogHelper.Info("【13.同步更新物料存放时间配置表】Request:" + JsonConvert.SerializeObject(model), "GT");
            var result = ApiHelper.synUpdateMatlTimeConfig(model.overages);
            LogHelper.Info("【13.同步更新物料存放时间配置表】response:" + JsonConvert.SerializeObject(result), "GT");
            LogHelper.Info("【11.查询上一次的数据同步时间】Request:" + JsonConvert.SerializeObject(model), "GT");
            var result = ApiHelper.findDataLastSynTime(model.tableType);
            LogHelper.Info("【11.查询上一次的数据同步时间】response:" + JsonConvert.SerializeObject(result), "GT");
            return result;
        }
@@ -287,12 +247,18 @@
            public string last_modify_time { get; set; }
        }
        public class RecordDataSynTimeModel
        public class LocStateFeedBackModel
        {
            public string sysTime { get; set; } // 同步时间
            public int synNum { get; set; }  // 同步数量
            public string recordTable { get; set; } // 1.物料条码记录表 2.胚胎条码状态表 3.物料存放时间配置表
            public string reqId { get; set; }
            public string reqTime { get; set; }
            public string loc_code { get; set; } // 站台编码
            public string type { get; set; } // 请求类型 1 允许取货 2 允许放货
            public string req_no { get; set; } // 任务号
        }
        public class SynTableModel
        {
            public int tableType { get; set; } // 1.半制品条码信息表 2.条码状态表 3.抽检状态表
        }
        public class SynUpdateMatlStatusModel
@@ -303,7 +269,9 @@
        public class UpdateMatlStatus
        {
            public string bc_entried { get; set; }
            public string mcngrp { get; set; }
            public string jdge { get; set; }
            public string last_modify_time { get; set; }
        }
        public class SynMatlInformationModel 
HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_BZP/core/Monitor.cs
@@ -138,5 +138,16 @@
                }
            }
        }
        /// <summary>
        /// 条码状态更新
        /// </summary>
        public static void BarcodeStatusUpdate()
        {
        }
    }
}
HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_BZP/core/WCSCore.cs
@@ -81,27 +81,30 @@
                                        {
                                            LogHelper.Info($"任务号:{TN_Task.S_CODE},AGV任务完成,任务信息回报GT", "AGV");
                                            string shift = ApiHelper.getShift(DateTime.Now.TimeOfDay);
                                            string ydate_shiftName = "";
                                            string ydate= "";
                                            if (shift == "III")
                                            {
                                                ydate_shiftName = DateTime.Now.AddDays(-1).ToString("yy/MM/dd") + "-" + shift;
                                                ydate = DateTime.Now.AddDays(-1).ToString("dd/MM/yy");
                                            }
                                            else
                                            {
                                                ydate_shiftName = DateTime.Now.ToString("yy/MM/dd") + "-" + shift;
                                                ydate = DateTime.Now.ToString("dd/MM/yy");
                                            }
                                            WmsToGtLokasiModel wmsToGtLokasiModel = new WmsToGtLokasiModel()
                                            Trfloc trfloc = new Trfloc()
                                            {
                                                ydate_shiftName = ydate_shiftName,
                                                recid = 1,
                                                ydate = ydate,
                                                shift = shift,
                                                bc_entried = cntrItemRels[0].S_CG_ID,
                                                loc_from = TN_Task.S_START_LOC,
                                                loc_to = TN_Task.S_END_LOC,
                                                qty = 1,
                                                qty = cntrItemRels[0].F_QTY,
                                                lot = 1,
                                                scantime = TN_Task.T_CREATE.ToString("yyyy-MM-dd HH:mm:ss"),
                                                pic = model.ForkliftNo
                                                pic = model.ForkliftNo,
                                                last_modify_time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")
                                            };
                                            GtDispatch.agvTaskFeedback(wmsToGtLokasiModel);
                                        }
                                        break;
                                    case 7:
@@ -347,6 +350,7 @@
                        {
                            // 满料托盘入库
                            itemCode = cntrItemRels[0].S_ITEM_CODE;
                            int itemType = cntrItemRels[0].N_PRODUCT_TYPE_CODE;
                            var endLoc = WMSHelper.GetInstockEndLoc(container.N_TYPE, null, 1, itemCode);
                            if (endLoc != null)
                            {
HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_BZP/dispatch/GtDispatch.cs
@@ -59,14 +59,17 @@
        public class WmsToGtLokasiModel
        {
            public string ydate_shiftName { get; set; } // 时间_班次
            public int recid { get; set; }
            public string ydate { get; set; }  // 班次日期
            public string shift { get; set; }  // 班次
            public string bc_entried { get; set; }  // 条码
            public string loc_from { get; set; } // 起点货位
            public string loc_to { get; set; } // 终点货位
            public int qty { get; set; } // 数量
            public int lot { get; set; } // 托数
            public float qty { get; set; } // 数量
            public int lot { get; set; } = 1; // 托数
            public string scantime { get; set; } // 扫码创建任务时间
            public string pic { get; set; }  // 小车号
            public string last_modify_time { get; set; } // 扫码创建任务时间
        }
    }
}
HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_BZP/models/CntrItemRel.cs
@@ -9,31 +9,19 @@
    [SugarTable("TN_CG_Detail")]
    public class CntrItemRel : BaseModel
    {
        public string S_CG_ID { get; set; } // 条形码编码
        public string S_SERIAL_NO { get; set; }
        public string S_ITEM_CODE { get; set; }   // 物品代码
        public string S_ITEM_NAME { get; set; } = "";
        public string S_ITEM_SPEC { get; set; }
        public string S_ITEM_STATE { get; set; } = "OK";  // OK=产品合格,NG=产品不合格,HLM=产品待定
        /// <summary>
        /// 1:合格 2:不合格
        /// </summary>
        public int N_ITEM_STATE { get; set; }
        public string S_BATCH_NO { get; set; } = "";
        public float F_QTY { get; set; }  // 产品数量
        [SugarColumn(IsPrimaryKey = true)]
        public string S_CNTR_CODE { get; set; }
        public string S_CNTR_CODE { get; set; }  // 容器编码
        public string S_CG_ID { get; set; } // 条形码编码
        public string S_ITEM_CODE { get; set; }   // 物品代码
        public string S_ITEM_STATE { get; set; } = "OK";  // OK=产品合格,HODE=产品待定
        public float F_QTY { get; set; }  // 产品数量
        // ------------------ 印尼半制品 -------------------
        public string S_MCN { get; set; }  // 机器代码编号
        public string S_OPR { get; set; }  // 操作员
        public string S_TXNDATE { get; set; }  // 生产时间
        public string S_SHIFT { get; set; }  // 工作班次 
        public string S_FOVRAGE { get; set; } = "N"; // 是否过期的状态  Y=过期,N=未过期
        public string S_EFFECTIVE_TIME { get; set; }  // 生效时间  
        public string S_EXPIRATION_TIME { get; set; }  // 失效时间    
        public string S_SARANA { get; set; } // 托盘ID
        public int N_PRODUCT_TYPE_CODE { get; set; } // 物料类别编码
    }
}
HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_BZP/models/ItemBarcodeInfo.cs
@@ -7,24 +7,23 @@
namespace HH.WCS.Mobox3.YNJT_BZP.models
{
    [SugarTable("TN_Item_Barcode_H")]
    /// <summary>
    /// 半制品条码信息表
    /// </summary>
    [SugarTable("TN_iWMS_semi_BCScan")]
    internal class ItemBarcodeInfo : BaseModel
    {
        public string S_ITEM { get; set; } // 产品材料的物品代码(从条形码数字左侧起截取前10位)
        public string S_BC_ENTRIED { get; set; } // 产品材料的条形码编号
        public string S_TOOLING_CODE { get; set; } // 工装条码
        public string S_MCN { get; set; } // 机器代码编号
        public string S_OPR { get; set; } // 操作员ID
        public DateTime TXNDATE { get; set; } // 产品材料的生产时间
        public string S_SHIFT { get; set; } // 工作班次代码(班次 I (07:00~14:59) - 班次 II (15:00~22:59) - 班次 III (23:00~06:59))
        public int N_QTY { get; set; } // 首次扫描的条码的产品数量
        public int N_STOCK { get; set; } // 在加工过程中的实时库存数量
        public string S_LOKASI { get; set; } // 产品材料的位置/位置ID
        public string S_SARANA { get; set; } // 产品材料的托盘/盒/推车/货车ID
        public string BOM1 { get; set; }
        public string BOM2 { get; set; }
        public string BOM3 { get; set; }
        public string S_FOVRAGE { get; set; } // 是否过期 是否过期(null 或 空 默认 否) Y/N
        public string S_JDGE { get; set; }    // 质检状态
        public int N_OVERAGE { get; set; }    // 有效期
        public int N_MINHOUR { get; set; }    // 最低放置期
        public int N_PRODUCT_TYPE_CODE { get; set; }    // 物料类别编码
        public string LAST_MODIFY_TIME { get; set; } // 最后修改时间
    }
}
HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_BZP/models/MatlInformation.cs
@@ -14,19 +14,15 @@
    {
        public string item { get; set; } // 产品材料的物品代码(从条形码数字左侧起截取前10位)
        public string bc_entried { get; set; } // 产品材料的条形码编号
        public string toolineCode { get; set; } // 工装条码
        public string mcn { get; set; } // 机器代码编号
        public string opr { get; set; } // 操作员ID
        public string txndate { get; set; } // 产品材料的生产时间
        public string shift { get; set; } // 工作班次代码(班次 I (07:00~14:59) - 班次 II (15:00~22:59) - 班次 III (23:00~06:59))
        public int qty { get; set; } // 首次扫描的条码的产品数量
        public int stock { get; set; } // 在加工过程中的实时库存数量
        public string lokasi { get; set; } // 产品材料的位置/位置ID
        public string sarana { get; set; } // 产品材料的托盘/盒/推车/货车ID
        public string bom1 { get; set; }
        public string bom2 { get; set; }
        public string bom3 { get; set; }
        public string fovrage { get; set; } // 是否过期 是否过期(null 或 空 默认 否) Y/N
        public string jdge { get; set; }    // 质检状态
        public string jdge { get; set; }    // 质检状态  OK / HOLD
        public int overagv { get; set; }    // 有效期
        public int minhour { get; set; }    // 最低放置时间(h)
        public int productTypeCode { get; set; }    // 物料类别编码
        public string last_modify_time { get; set; } // 最后修改时间
    }
}
HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_BZP/wms/ContainerHelper.cs
@@ -68,30 +68,6 @@
            var list = db.Queryable<CntrItemRel>().Where(a => a.S_CNTR_CODE == cntr).ToList();
            return list;
        }
        internal static bool BindNewCntrItem(string loc,string cntrCode, string itemCode) {
            var res = false;
            var itemName = ItemHelper.GetItemInfo(itemCode).S_ITEM_NAME;
            var db = new SqlHelper<object>().GetInstance();
            try {
                db.BeginTran();
                var cntr = new Container { S_CODE = cntrCode, N_DETAIL_COUNT = 1 };
                db.Insertable(cntr).ExecuteCommand();
                //获取物料信息,填充到容器货品明细,方便人工查看
                var cir = new CntrItemRel { S_CNTR_CODE = cntr.S_CODE.Trim(), F_QTY = 1, S_ITEM_CODE = itemCode, S_ITEM_NAME = itemName };
                db.Insertable<CntrItemRel>(cir).ExecuteCommand();
                var lcr = new LocCntrRel { S_CNTR_CODE = cntrCode, S_LOC_CODE = loc };
                db.Insertable<LocCntrRel>(lcr).ExecuteCommand();
                db.CommitTran();
                res = true;
            }
            catch (Exception ex) {
                db.RollbackTran();
                Console.WriteLine(ex.Message);
            }
            return res;
        }
        internal static bool addCntrItem(string cntrCode, CntrItemRel cntrItemRel)
        {
HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_BZP/wms/ItemHelper.cs
@@ -59,6 +59,12 @@
            {
                foreach (var itemInfo in itemInfos)
                {
                    DateTime txndate = DateTime.Parse(itemInfo.txndate);
                    DateTime minTime = txndate.AddHours(itemInfo.minhour);
                    DateTime maxTime = txndate.AddDays(itemInfo.overage);
                    var effective_time = minTime.ToString("yyyy-MM-dd HH:mm:ss");
                    var expiration_time = maxTime.ToString("yyyy-MM-dd HH:mm:ss");
                    CntrItemRel cntrItemRel = new CntrItemRel()
                    {
                        S_CNTR_CODE = cntrCode,
@@ -67,13 +73,11 @@
                        S_MCN = itemInfo.mcn,
                        S_ITEM_STATE = itemInfo.jdge,
                        F_QTY = itemInfo.qty,
                        S_OPR = itemInfo.opr,
                        S_TXNDATE = itemInfo.txndate,
                        S_SHIFT = itemInfo.shift,
                        S_FOVRAGE = itemInfo.fovrage,
                        S_EFFECTIVE_TIME = itemInfo.effective_time,
                        S_EXPIRATION_TIME = itemInfo.expiration_time,
                        S_SARANA = itemInfo.sarana,
                        S_EFFECTIVE_TIME = effective_time,
                        S_EXPIRATION_TIME = expiration_time,
                        N_PRODUCT_TYPE_CODE = itemInfo.productTypeCode
                    };
                    ContainerHelper.addCntrItem(cntrCode, cntrItemRel);
                }
HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_BZP/wms/WMSHelper.cs
@@ -561,6 +561,7 @@
        /// <param name="locCode"></param>
        /// <param name="trayType"></param>
        /// <param name="inWay">入库方式 1.自动入库 2.人工入库</param>
        /// <param name="itemCode">物料编码</param>
        /// <returns></returns>
        public static Location GetInstockEndLoc(int trayType , string locCode = null , int inWay = 1 ,string itemCode = null)
        {
@@ -817,26 +818,22 @@
            try
            {
                db.BeginTran();
                itemBarcodeInfos.ForEach(item => {
                    var itemBarcodeInfo = db.Queryable<ItemBarcodeInfo>().Where(a => a.S_BC_ENTRIED == item.S_BC_ENTRIED).First();
                    if (itemBarcodeInfo == null)
                    {
                        var bo = db.Insertable<ItemBarcodeInfo>(item).ExecuteCommand() > 0;
                        if (!bo)
                if (itemBarcodeInfos.Count > 0)
                {
                    itemBarcodeInfos.ForEach(item => {
                        var itemBarcodeInfo = db.Queryable<ItemBarcodeInfo>().Where(a => a.S_BC_ENTRIED == item.S_BC_ENTRIED).First();
                        if (itemBarcodeInfo == null)
                        {
                            result = false;
                            LogHelper.Info($"添加物料条码信息失败,物料条码信息:{JsonConvert.SerializeObject(item)}", "GT");
                            var bo = db.Insertable<ItemBarcodeInfo>(item).ExecuteCommand() == 0;
                            if (bo)
                            {
                                result = false;
                                LogHelper.Info($"添加物料条码信息失败,物料条码信息:{JsonConvert.SerializeObject(item)}", "GT");
                            }
                        }
                    }
                });
                if (result)
                {
                    db.CommitTran();
                    });
                }
                else
                {
                    db.RollbackTran();
                }
                db.CommitTran();
            }
            catch (Exception ex) 
            {
@@ -844,6 +841,62 @@
                db.RollbackTran();
            }
           return result;
        }
        /// <summary>
        /// 同步条码状态表
        /// </summary>
        /// <returns></returns>
        public static bool synBarcodeStatus(List<iWMS_semi_bld_BCstatus> model)
        {
            bool result = true;
            var db = new SqlHelper<object>().GetInstance();
            try
            {
                db.BeginTran();
                if (model.Count > 0)
                {
                    model.ForEach(update => {
                        db.Insertable(update).ExecuteCommand();
                    });
                }
                db.CommitTran();
            }
            catch (Exception ex)
            {
                LogHelper.Info($"同步条码状态表错误,错误信息:{ex.Message}", "GT");
                db.RollbackTran();
                result = false;
            }
            return result;
        }
        /// <summary>
        /// 同步抽检状态表
        /// </summary>
        /// <returns></returns>
        public static bool synSamplingStatus(List<iWMS_semi_bld_BCsample> model)
        {
            bool result = true;
            var db = new SqlHelper<object>().GetInstance();
            try
            {
                db.BeginTran();
                if (model.Count > 0)
                {
                    model.ForEach(update => {
                        db.Insertable(update).ExecuteCommand();
                    });
                }
                db.CommitTran();
            }
            catch (Exception ex)
            {
                LogHelper.Info($"同步抽检状态表错误,错误信息:{ex.Message}", "GT");
                db.RollbackTran();
                result = false;
            }
            return result;
        }
        /// <summary>
@@ -857,28 +910,22 @@
            try
            {
                db.BeginTran();
                updateMatlStatuses.ForEach(update => {
                    var itemBarcodeInfo = db.Queryable<ItemBarcodeInfo>().Where(a => a.S_BC_ENTRIED == update.bc_entried).First();
                    if (itemBarcodeInfo != null)
                    {
                        itemBarcodeInfo.S_JDGE = update.jdge;
                        db.Updateable(itemBarcodeInfo).ExecuteCommand();
                        var cntrItemRel = db.Queryable<CntrItemRel>().Where(a => a.S_CG_ID == update.bc_entried).First();
                        if (cntrItemRel != null)
                if (updateMatlStatuses.Count > 0)
                {
                    updateMatlStatuses.ForEach(update => {
                        var itemBarcodeInfo = db.Queryable<ItemBarcodeInfo>().Where(a => a.S_BC_ENTRIED == update.bc_entried).First();
                        if (itemBarcodeInfo != null)
                        {
                            // 将MES的物料状态转化成WMS可识别的物料状态
                            if (update.jdge == "" || update.jdge == null)
                            itemBarcodeInfo.S_JDGE = update.jdge;
                            db.Updateable(itemBarcodeInfo).ExecuteCommand();
                            var cntrItemRel = db.Queryable<CntrItemRel>().Where(a => a.S_CG_ID == update.bc_entried).First();
                            if (cntrItemRel != null)
                            {
                                update.jdge = "OK";
                                db.Updateable<CntrItemRel>().SetColumns(a => new CntrItemRel() { S_ITEM_STATE = update.jdge }).Where(a => a.S_CG_ID == update.bc_entried).ExecuteCommand();
                            }
                            else if (update.jdge != "OK")
                            {
                                update.jdge = "HOLD";
                            }
                            db.Updateable<CntrItemRel>().SetColumns(a => new CntrItemRel() { S_ITEM_STATE = update.jdge }).Where(a => a.S_CG_ID == update.bc_entried).ExecuteCommand();
                        }
                    }
                });
                    });
                }
                db.CommitTran();
            }
            catch (Exception ex)
@@ -888,69 +935,6 @@
                result = false;
            }
            return result;
        }
        /// <summary>
        /// 批量更新物料状态
        /// </summary>
        /// <returns></returns>
        public static bool batchUpdateMatlTimeConfig(List<Overage> overages)
        {
            bool result = true;
            var db = new SqlHelper<object>().GetInstance();
            try
            {
                db.BeginTran();
                foreach (Overage overage in overages)
                {
                    var overage1 = db.Queryable<Overage>().Where(a => a.RECID == overage.RECID).First();
                    if (overage1 != null)
                    {
                        overage1.MCNGRP = overage.MCNGRP;
                        overage1.ITEMPATT = overage.ITEMPATT;
                        overage1.OVERAGE = overage.OVERAGE;
                        overage1.MINHOUR = overage.MINHOUR;
                        overage1.FLAG_STS = overage.FLAG_STS;
                        db.Updateable(overage1).ExecuteCommand();
                    }
                    else
                    {
                        db.Insertable(overage).ExecuteCommand();
                    }
                }
                db.CommitTran();
            }
            catch (Exception ex)
            {
                LogHelper.Info($"批量更新物料存放时间配置信息错误,错误信息:{ex.Message}", "GT");
                db.RollbackTran();
                result = false;
            }
            return result;
        }
        /// <summary>
        /// 查询物料存放时间配置信息
        /// </summary>
        /// <param name="bc_entried"></param>
        /// <returns></returns>
        public static Overage getOverage(string bc_entried)
        {
            var db = new SqlHelper<object>().GetInstance();
            // 直接执行 SQL(参数化查询)
            var sql = "SELECT get_ovg_bar(@barcode, @mcngrp) AS overage_value";
            var sql1 = "SELECT get_minhour_bar(@barcode, @mcngrp) AS overage_value";
            // 使用匿名对象传递参数
            var ovg_bar = db.Ado.SqlQuery<int>(sql, new { barcode = bc_entried, mcngrp = "1"}).First();
            var minhour_bar = db.Ado.SqlQuery<float>(sql1, new { barcode = bc_entried, mcngrp = "1"}).First();
            Overage overage = new Overage()
            {
                MINHOUR = minhour_bar,
                OVERAGE = ovg_bar
            };
            return overage;
        }
        /// <summary>
@@ -997,12 +981,25 @@
        /// <summary>
        /// 查询上一次的同步时间
        /// </summary>
        /// <param name="recordTable"></param>
        /// <param name="tableType"></param>
        /// <returns></returns>
        public static SynDataTimeRecord getLastDataSynTime(string recordTable)
        public static string getDataLastSynTime(int tableType)
        {
            var db = new SqlHelper<object>().GetInstance();
            return db.Queryable<SynDataTimeRecord>().Where(a => a.RECORD_TABLE == recordTable).OrderByDescending(a => a.T_CREATE).First();
            string lastTime = null;
            if (tableType == 1)
            {
                lastTime = db.Queryable<ItemBarcodeInfo>().OrderByDescending(a => a.LAST_MODIFY_TIME).Select(a => a.LAST_MODIFY_TIME).First();
            }
            else if (tableType == 2)
            {
            }
            else if (tableType == 3)
            {
            }
            return lastTime;
        }
    }    
}