ea04aef49691444ed8ac1e7e7b94feabcbb5326f..682eba0aaf922e69dfafe05fb6c1bbdbf3a0e04a
2025-09-29 schangxiang@126.com
优化
682eba 对比 | 目录
2025-09-29 schangxiang@126.com
222
f78224 对比 | 目录
已添加6个文件
已修改13个文件
已删除1个文件
717 ■■■■ 文件已修改
DBScript/01_DDL/02_DDL_TABLE_Edit_WGQ.sql 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DEmon/WebWIPAPI/Controllers/MesIntegrController.cs 90 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DEmon/iWareCc/App.config 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DEmon/iWareCc/FinishStackerTask/Chain/保存出入库明细信息.cs 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DEmon/iWareCc/Service1.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
DEmon/iWareCc/SystemInteraction/PushMesHandler.cs 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DEmon/iWareCc/SystemInteraction/mesDataTranfficForRealMes.cs 96 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DEmon/iWareCc/SystemInteraction/mesDataTranfficForRealMesThread.cs 110 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DEmon/iWareCc/iWareCc.csproj 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
DEmon/iWareCommon/Utils/ConfigHelper.cs 106 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DEmon/iWareCommon/Utils/DataCache.cs 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DEmon/iWareCommon/iWareCommon.csproj 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DEmon/iWareDataCore/BASE/Service/PlaceMaterialViewService.cs 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DEmon/iWareDataCore/TASK/EnumType/EIsSendToMes.cs 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DEmon/iWareDataCore/iWareDataCore.csproj 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DEmon/iWareLog/ORM/InOutStorageDetail.cs 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DEmon/iWareLog/Report/Helper/InOutStorageDetailResultForMes.cs 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DEmon/iWareLog/Report/Helper/R_InOutStorageDetailResultForMes.cs 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DEmon/iWareLog/Report/Service/InOutService.cs 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DEmon/iWareLog/iWareLog.csproj 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DBScript/01_DDL/02_DDL_TABLE_Edit_WGQ.sql
@@ -0,0 +1,6 @@
alter table InOutStorageDetail
add isSendToMes  int    NULL , -- æ˜¯å¦æŽ¨ç»™MES  ( 1:待推送  2:推送成功 3:推送失败 4:强制完成)
   SendToMesCount  int    NULL , -- æŽ¨ç»™MES次数
   SendToMesTime datetime    null, -- æŽ¨ç»™MES时间
   isSendToMesStr NVARCHAR(128)    null, -- æ˜¯å¦æŽ¨ç»™MES æ–‡æœ¬
   MesRet  NVARCHAR(128)    NULL  -- MES返回结果
DEmon/WebWIPAPI/Controllers/MesIntegrController.cs
@@ -178,8 +178,90 @@
        }
        ///// <summary>
        ///// å¯¼å…¥å‡ºåº“单-版本1
        ///// </summary>
        ///// <param name="inputmaterials"></param>
        ///// <returns></returns>
        //[HttpPost]
        //public ActionResult importOutOrder(List<InputMaterialEntity> inputmaterials)
        //{
        //    var responseMessage = new ApiResponse<string>();
        //    try
        //    {
        //        var msg = "";
        //        #region éªŒè¯
        //        if (inputmaterials?.Count() == 0)
        //        {
        //            responseMessage = new ApiResponse<string>()
        //            {
        //                Code = 500,
        //                Success = false,
        //                Message = "数据条数为0",
        //                Data = null,
        //            };
        //            return ApiResponseHelper.ReturnApiResponse(responseMessage, "importOutOrder", "");
        //        }
        //        if (inputmaterials.Select(x => x.ListNo).Distinct().Count() != 1)
        //        {
        //            responseMessage = new ApiResponse<string>()
        //            {
        //                Code = 500,
        //                Success = false,
        //                Message = "本次请求单号必须为同一值",
        //                Data = null,
        //            };
        //            return ApiResponseHelper.ReturnApiResponse(responseMessage, "importOutOrder", "");
        //        }
        //        #endregion
        //        #region ä¸šåŠ¡å¤„ç†
        //        string typeName = "出库";
        //        handler_importOutOrder(typeName, inputmaterials, out msg);
        //        #endregion
        //        if (!string.IsNullOrEmpty(msg))
        //        {
        //            responseMessage = new ApiResponse<string>()
        //            {
        //                Code = 500,
        //                Success = false,
        //                Message = "生成出库任务异常:" + msg,
        //                Data = null,
        //            };
        //        }
        //        else
        //        {
        //            responseMessage = new ApiResponse<string>()
        //            {
        //                Code = 200,
        //                Success = true,
        //                Message = "成功",
        //                Data = null,
        //            };
        //        }
        //    }
        //    catch (Exception ex)
        //    {
        //        responseMessage = new ApiResponse<string>()
        //        {
        //            Code = 500,
        //            Success = false,
        //            Message = "异常:" + ex.Message,
        //            Data = null,
        //        };
        //    }
        //    return ApiResponseHelper.ReturnApiResponse(responseMessage, "importOutOrder", "");
        //}
        /// <summary>
        /// å¯¼å…¥å‡ºåº“单
        /// å¯¼å…¥å‡ºåº“单-版本2
        /// </summary>
        /// <param name="inputmaterials"></param>
        /// <returns></returns>
@@ -259,7 +341,6 @@
            return ApiResponseHelper.ReturnApiResponse(responseMessage, "importOutOrder", "");
        }
        /// <summary>
        /// å…¬å…±å¯¼å…¥ å…¥åº“单或出库单
        /// </summary>
@@ -283,6 +364,11 @@
                    List<int> ids = new List<int>();
                    var materials = InputMaterialService.GetInstance().GetIds(codes);
                    List<InOutListDetailEntity> detail = new List<InOutListDetailEntity>();
                    if (materials?.Count == 0)
                    {
                        msg = ("物料明细查询为空!");
                        return;
                    }
                    for (int i = 0; i < materials.Count; i++)
                    {
                        if (typeName == "入库")
DEmon/iWareCc/App.config
@@ -68,5 +68,8 @@
    <add name="DbModelLog" connectionString="data source=192.168.1.200;initial catalog=WGQ_WB19011_LOG;user id=sa;password=123abc.com;MultipleActiveResultSets=True;App=EntityFramework" providerName="System.Data.SqlClient" />
    <add name="DbModelCore" connectionString="data source=192.168.1.200;initial catalog=WGQ_WB19011_CORE;user id=sa;password=123abc.com;MultipleActiveResultSets=True;App=EntityFramework" providerName="System.Data.SqlClient" />
  </connectionStrings>
  <appSettings>
    <!--MES地址 ã€EditBy shaocx,2025-09-25】-->
    <add key="MesUrl" value="http://169.24.7.88:9083/"/>
  </appSettings>
</configuration>
DEmon/iWareCc/FinishStackerTask/Chain/±£´æ³öÈë¿âÃ÷ϸÐÅÏ¢.cs
@@ -15,7 +15,7 @@
namespace iWareCc.FinishStackerTask.Chain
{
   public class ä¿å­˜å‡ºå…¥åº“明细信息 : IHandler
    public class ä¿å­˜å‡ºå…¥åº“明细信息 : IHandler
    {
        /// <summary>
        /// è¯¥èŠ‚ç‚¹çš„ä¸‹ä¸€ä¸ªèŠ‚ç‚¹
@@ -49,22 +49,26 @@
                {
                    var task = DecompositionTaskContainer.PartTask;
                    int materid = 0;
                    using(var dbModelcore = new DbModelCore())
                    using (var dbModelcore = new DbModelCore())
                    {
                        var mater = dbModelcore.BASEMaterials.FirstOrDefault(x=>x.code==task.MaterialCode);
                        if (mater!=null)
                        var mater = dbModelcore.BASEMaterials.FirstOrDefault(x => x.code == task.MaterialCode);
                        if (mater != null)
                        {
                            materid = mater.id;
                        }
                    };
                    int tp=0;
                    }
                    ;
                    int tp = 0;
                    int? _isSendToMes = null;//是否发送给MES ã€Editby shaocx,2025-09-25】
                    switch (task.MainTaskType)
                    {
                        case (int)EMainTaskType.入库任务:
                            tp = 0;
                            _isSendToMes = (int)EIsSendToMes.待推送;
                            break;
                        case (int)EMainTaskType.出库任务:
                            tp = 1;
                            _isSendToMes = (int)EIsSendToMes.待推送;
                            break;
                        case (int)EMainTaskType.移库任务:
                            tp = 2;
@@ -78,16 +82,17 @@
                    InOutStorageDetail iosd = new InOutStorageDetail()
                    {
                        fromplacecode = task.SourcePlace,
                        formplaceid=task.SourcePlaceId,
                        toplacecode=task.ToPlace,
                        toplaceid=task.ToPlaceId,
                        equipid=task.EquipId,
                        equipname=task.EquipName,
                        updatetime=DateTime.Now,
                        createtime=task.CreateTime,
                        materialcode=task.MaterialCode,
                        materialid=materid,
                        type = tp
                        formplaceid = task.SourcePlaceId,
                        toplacecode = task.ToPlace,
                        toplaceid = task.ToPlaceId,
                        equipid = task.EquipId,
                        equipname = task.EquipName,
                        updatetime = DateTime.Now,
                        createtime = task.CreateTime,
                        materialcode = task.MaterialCode,
                        materialid = materid,
                        type = tp,
                        isSendToMes = _isSendToMes //是否发送给MES ã€Editby shaocx,2025-09-25】
                    };
                    dbModel.InOutStorageDetails.Add(iosd);
                    dbModel.SaveChanges();
DEmon/iWareCc/Service1.cs
@@ -414,7 +414,7 @@
            //StartThread(ReSendThread);
            //开启推送给MES的出入库完成线程 ã€Editby shaocx,2025-09-17】
            new Thread(mesDataTranfficForRealMes.Handler).Start();
            new Thread(mesDataTranfficForRealMesThread.Handler).Start();
        }
DEmon/iWareCc/SystemInteraction/PushMesHandler.cs
@@ -1,4 +1,6 @@
using Newtonsoft.Json;
using iWareCommon.Utils;
using iWareLog.Report.Helper;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
@@ -10,7 +12,7 @@
    /// </summary>
    public class PushMesHandler
    {
        public static string mes_api_url = "";// ConfigHelper.GetConfigString("MesUrl");//修改为配置文件 ã€EditBy shaocx,2022-01-27】
        public static string mes_api_url = ConfigHelper.GetConfigString("MesUrl");//修改为配置文件 ã€EditBy shaocx,2022-01-27】
        static HTTPService mes_api = new HTTPService(mes_api_url);//mes基地址
        /// <summary>
@@ -18,35 +20,20 @@
        /// </summary>
        /// <param name="pushData"></param>
        /// <returns></returns>
        public static ApiResponse<string> Mes_InStockSend(List<InboundStockInfoToMes> pushData)
        public static ApiResponse<string> Mes_InStockSend(R_InOutStorageDetailResultForMes pushData)
        {
            ApiResponse<string> res = null;
            var funName = "Mes_InStockSend";
            try
            {
                MesRequest<List<InboundStockInfoToMes>> mesRequest = new MesRequest<List<InboundStockInfoToMes>>();
                mesRequest.Datas = pushData;
                mesRequest.TableName = "T_WMS_Inbound_Record";
                mesRequest.PrimaryKeys = "identifier";
                string paprm = JsonConvert.SerializeObject(mesRequest);
                string paprm = JsonConvert.SerializeObject(pushData);
                //Log4NetHelper.WriteInfoLog(_logType, $"{funName},准备参数:{paprm}");
                Guid guid = System.Guid.NewGuid();
                //模拟
                if (1 == 2)
                {//模拟环境
                    res = new ApiResponse<string>();
                    res.Code = 500;
                    res.Success = false;
                    res.Message = "系统模拟完成";
                }
                else
                {
                    var resStr = mes_api.postContentForString("", paprm, guid);
                    //Log4NetHelper.WriteInfoLog(_logType, $"{funName},结果返回:{resStr}");
                    res = JsonConvert.DeserializeObject<ApiResponse<string>>(resStr);
                }
                var resStr = mes_api.postContentForString("materialBack", paprm, guid);
                //Log4NetHelper.WriteInfoLog(_logType, $"{funName},结果返回:{resStr}");
                res = JsonConvert.DeserializeObject<ApiResponse<string>>(resStr);
                //Log4NetHelper.WriteInfoLog(_logType, $"{funName},参数:{paprm},返回:{JsonConvert.SerializeObject(res)}");
            }
DEmon/iWareCc/SystemInteraction/mesDataTranfficForRealMes.cs
ÎļþÒÑɾ³ý
DEmon/iWareCc/SystemInteraction/mesDataTranfficForRealMesThread.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,110 @@
using iWareCc.Properties;
using iWareCommon.Utils;
using iWareDataCore.ORM;
using iWareDataCore.TASK.EnumType;
using iWareLog.LOG.EnumType;
using iWareLog.ORM;
using iWareLog.Report.Helper;
using iWareLog.Report.Service;
using Newtonsoft.Json;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
namespace iWareCc
{
    /// <summary>
    /// MES出入库数据传输(真正的MES)-线程
    /// </summary>
    public class mesDataTranfficForRealMesThread
    {
        //public static LogType _logType = LogType.mesDataTranfficForRealMes;
        public static async void Handler()
        {
            while (true)
            {
                try
                {
                    Thread.Sleep(5000);
                    List<InOutStorageDetailResultForMes> sendMesData = InOutService.GetInstance().GetInOutStorageDetailListForMes();
                    if (sendMesData.Count > 0)
                    {
                        //SystemWarningMsg.msg_mesDataTranfficForRealMes = $"{MyExtend.MsgTimeStr()},要推送{sendMesData.Count()}条!";
                        foreach (var itemTask in sendMesData)
                        {
                            using (DbModelLog mod = new DbModelLog())
                            {
                                try
                                {
                                    ApiResponse<string> ret = null;
                                    itemTask.Timestamp = DateTime.Now;//发送时间戳实时
                                    //转换
                                    var str_OccurrenceTime = "";
                                    if (itemTask.OccurrenceTime != null)
                                    {
                                        str_OccurrenceTime = ((DateTime)itemTask.OccurrenceTime).ToString("yyyy-MM-dd HH:mm:ss");
                                    }
                                    R_InOutStorageDetailResultForMes r = new R_InOutStorageDetailResultForMes()
                                    {
                                        BusinessFlag = itemTask.BusinessFlag.ToString(),
                                        Code = itemTask.Code,
                                        IssueProjectNo = itemTask.IssueProjectNo,
                                        PlaceCode = itemTask.PlaceCode,
                                        SerialNo = itemTask.SerialNo,
                                        Timestamp = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
                                        OccurrenceTime = str_OccurrenceTime,
                                    };
                                    ret = PushMesHandler.Mes_InStockSend(r);
                                    //查找对象
                                    var db_itemTask = mod.InOutStorageDetails.Where(x => x.id == itemTask.Id).FirstOrDefault();
                                    //SystemWarningMsg.msg_mesDataTranfficForRealMes = $"{MyExtend.MsgTimeStr()},已推送结束,返回:{JsonConvert.SerializeObject(ret)}";
                                    if (ret.Success)
                                    {
                                        db_itemTask.isSendToMes = (int)EIsSendToMes.推送成功;//推送成功
                                        db_itemTask.isSendToMesStr = "成功";
                                    }
                                    else
                                    {
                                        db_itemTask.isSendToMes = (int)EIsSendToMes.待推送;//待推送
                                        db_itemTask.isSendToMesStr = "失败";
                                    }
                                    db_itemTask.SendToMesTime = DateTime.Now;
                                    db_itemTask.MesRet = ret.Message;
                                    db_itemTask.SendToMesCount = (db_itemTask.SendToMesCount ?? 0) + 1;
                                    if (db_itemTask.isSendToMes == (int)EIsSendToMes.待推送 && db_itemTask.SendToMesCount > 100)
                                    {
                                        db_itemTask.isSendToMes = (int)EIsSendToMes.强制完成;//表示强制推送成功
                                        db_itemTask.isSendToMesStr = "强制成功";
                                    }
                                    mod.SaveChanges();
                                }
                                catch (Exception ex)
                                {
                                    LogTextHelper.WriteLine(Resources.LogDir + @"/MES出入库数据传输/" + "mesDataTranfficForRealMesThread", "MES出入库数据传输异常:{0}", JsonConvert.SerializeObject(ex));
                                    //LogTextHelper.WriteLog(Resources.LogDir, this.ToString(), "Handle", ex.Message);
                                    //SystemWarningMsg.msg_mesDataTranfficForRealMes = $"{MyExtend.MsgTimeStr()},推送给MES数据异常:" + JsonConvert.SerializeObject(ex);
                                    //Log4NetHelper.WriteErrorLog(_logType, //SystemWarningMsg.msg_mesDataTranfficForRealMes, ex);
                                }
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    LogTextHelper.WriteLine(Resources.LogDir + @"/MES出入库数据传输/" + "mesDataTranfficForRealMesThread", "(外部)MES出入库数据传输异常:{0}", JsonConvert.SerializeObject(ex));
                    //SystemWarningMsg.msg_mesDataTranfficForRealMes = $"{MyExtend.MsgTimeStr()},数据要推送给MES出现异常:" + ex.Message;
                    //Log4NetHelper.WriteErrorLog(_logType, //SystemWarningMsg.msg_mesDataTranfficForRealMes, ex);
                }
            }
        }
    }
}
DEmon/iWareCc/iWareCc.csproj
@@ -200,7 +200,7 @@
    <Compile Include="SystemInteraction\dto\InboundStockInfoToMes.cs" />
    <Compile Include="SystemInteraction\dto\MesRequest.cs" />
    <Compile Include="SystemInteraction\HTTPService.cs" />
    <Compile Include="SystemInteraction\mesDataTranfficForRealMes.cs" />
    <Compile Include="SystemInteraction\mesDataTranfficForRealMesThread.cs" />
    <Compile Include="SystemInteraction\PushMesHandler.cs" />
    <Compile Include="Task\Service\TaskService.cs" />
    <Compile Include="Util\OPCHelper.cs" />
DEmon/iWareCommon/Utils/ConfigHelper.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,106 @@
using System;
using System.Configuration;
namespace iWareCommon.Utils
{
    /// <summary>
    /// web.config操作类
    /// Copyright (C) TBEA.WMS
    /// </summary>
    public sealed class ConfigHelper
    {
        /// <summary>
        /// å¾—到AppSettings中的配置字符串信息
        /// </summary>
        /// <param name="key"></param>
        /// <returns></returns>
        public static string GetConfigString(string key)
        {
            string CacheKey = "AppSettings-" + key;
            object objModel = DataCache.GetCache(CacheKey);
            if (objModel == null)
            {
                try
                {
                    objModel = ConfigurationManager.AppSettings[key];
                    if (objModel != null)
                    {
                        DataCache.SetCache(CacheKey, objModel, DateTime.Now.AddMinutes(180), TimeSpan.Zero);
                    }
                }
                catch
                { }
            }
            return objModel.ToString();
        }
        /// <summary>
        /// å¾—到AppSettings中的配置Bool信息
        /// </summary>
        /// <param name="key"></param>
        /// <returns></returns>
        public static bool GetConfigBool(string key)
        {
            bool result = false;
            string cfgVal = GetConfigString(key);
            if(null != cfgVal && string.Empty != cfgVal)
            {
                try
                {
                    result = bool.Parse(cfgVal);
                }
                catch(FormatException)
                {
                    // Ignore format exceptions.
                }
            }
            return result;
        }
        /// <summary>
        /// å¾—到AppSettings中的配置Decimal信息
        /// </summary>
        /// <param name="key"></param>
        /// <returns></returns>
        public static decimal GetConfigDecimal(string key)
        {
            decimal result = 0;
            string cfgVal = GetConfigString(key);
            if(null != cfgVal && string.Empty != cfgVal)
            {
                try
                {
                    result = decimal.Parse(cfgVal);
                }
                catch(FormatException)
                {
                    // Ignore format exceptions.
                }
            }
            return result;
        }
        /// <summary>
        /// å¾—到AppSettings中的配置int信息
        /// </summary>
        /// <param name="key"></param>
        /// <returns></returns>
        public static int GetConfigInt(string key)
        {
            int result = 0;
            string cfgVal = GetConfigString(key);
            if(null != cfgVal && string.Empty != cfgVal)
            {
                try
                {
                    result = int.Parse(cfgVal);
                }
                catch(FormatException)
                {
                    // Ignore format exceptions.
                }
            }
            return result;
        }
    }
}
DEmon/iWareCommon/Utils/DataCache.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,45 @@
using System;
using System.Web;
namespace iWareCommon.Utils
{
    /// <summary>
    /// ç¼“存相关的操作类
    /// Copyright (C) TBEA.WMS
    /// </summary>
    public class DataCache
    {
        /// <summary>
        /// èŽ·å–å½“å‰åº”ç”¨ç¨‹åºæŒ‡å®šCacheKey的Cache值
        /// </summary>
        /// <param name="CacheKey"></param>
        /// <returns></returns>
        public static object GetCache(string CacheKey)
        {
            System.Web.Caching.Cache objCache = HttpRuntime.Cache;
            return objCache[CacheKey];
        }
        /// <summary>
        /// è®¾ç½®å½“前应用程序指定CacheKey的Cache值
        /// </summary>
        /// <param name="CacheKey"></param>
        /// <param name="objObject"></param>
        public static void SetCache(string CacheKey, object objObject)
        {
            System.Web.Caching.Cache objCache = HttpRuntime.Cache;
            objCache.Insert(CacheKey, objObject);
        }
        /// <summary>
        /// è®¾ç½®å½“前应用程序指定CacheKey的Cache值
        /// </summary>
        /// <param name="CacheKey"></param>
        /// <param name="objObject"></param>
        public static void SetCache(string CacheKey, object objObject, DateTime absoluteExpiration,TimeSpan slidingExpiration )
        {
            System.Web.Caching.Cache objCache = HttpRuntime.Cache;
            objCache.Insert(CacheKey, objObject,null,absoluteExpiration,slidingExpiration);
        }
    }
}
DEmon/iWareCommon/iWareCommon.csproj
@@ -61,6 +61,7 @@
    </Reference>
    <Reference Include="System" />
    <Reference Include="System.ComponentModel.DataAnnotations" />
    <Reference Include="System.Configuration" />
    <Reference Include="System.Core" />
    <Reference Include="System.Drawing" />
    <Reference Include="System.Web" />
@@ -106,6 +107,8 @@
      <DependentUpon>Resources.resx</DependentUpon>
    </Compile>
    <Compile Include="Utils\Base64Helper.cs" />
    <Compile Include="Utils\ConfigHelper.cs" />
    <Compile Include="Utils\DataCache.cs" />
    <Compile Include="Utils\DESHelper.cs" />
    <Compile Include="Utils\EntityPropHelper.cs" />
    <Compile Include="Utils\FileHelper.cs" />
DEmon/iWareDataCore/BASE/Service/PlaceMaterialViewService.cs
@@ -87,7 +87,8 @@
                {
                    string sql = @"SELECT A.id, ISNULL(C.createtime,'1990-01-01') as createtime, ISNULL(C.updatetime,'1990-01-01') as updatetime, A.code AS placecode, A.status,
A.islock, A.isexecute, B.name as placetypename, B.remark as placetyperemark, D.name, D.code AS materialcode, D.description, D.typeremark, D.typename, 
ISNULL(D.status,0) AS materialstatus, A.id as placeid, ISNULL(C.materialid,0) as materialid, D.remark, A.layer, A.col, A.row, A.typeid as placetypeid
ISNULL(D.status,0) AS materialstatus, A.id as placeid, ISNULL(C.materialid,0) as materialid, D.remark, A.layer, A.col, A.row, A.typeid as placetypeid,
D.thick, D.wide, D.length,D.IssueProjectNo,D.ProcurementProjectNo,D.SerialNo,D.ClassificationSociety,D.CuttingType,D.Version
FROM   dbo.BASEPlace AS A LEFT OUTER JOIN
       dbo.BASEPlaceType AS B ON A.typeid = B.id LEFT OUTER JOIN
       dbo.BASEPlaceMaterial as C on A.id=C.placeid  LEFT OUTER JOIN
DEmon/iWareDataCore/TASK/EnumType/EIsSendToMes.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,16 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace iWareDataCore.TASK.EnumType
{
    public enum EIsSendToMes
    {
        å¾…推送 = 1,
        æŽ¨é€æˆåŠŸ = 2,
        æŽ¨é€å¤±è´¥ = 3,
        å¼ºåˆ¶å®Œæˆ = 4
    }
}
DEmon/iWareDataCore/iWareDataCore.csproj
@@ -248,6 +248,7 @@
    <Compile Include="TASK\EnumType\EMainTaskCheck.cs" />
    <Compile Include="TASK\EnumType\EMainTaskPriority.cs" />
    <Compile Include="TASK\EnumType\EMainTaskStatus.cs" />
    <Compile Include="TASK\EnumType\EIsSendToMes.cs" />
    <Compile Include="TASK\EnumType\EMainTaskType.cs" />
    <Compile Include="TASK\EnumType\EInstorgNextNode.cs" />
    <Compile Include="TASK\EnumType\EPartTaskStatus.cs" />
DEmon/iWareLog/ORM/InOutStorageDetail.cs
@@ -26,6 +26,9 @@
        public DateTime? updatetime { get; set; }
        /// <summary>
        /// ä»»åŠ¡ç±»åž‹ï¼Œæžšä¸¾  EMainTaskType
        /// </summary>
        public int type { get; set; }
        public int? equipid { get; set; }
@@ -37,5 +40,17 @@
        [StringLength(50)]
        public string materialcode { get; set; }
        public int? isSendToMes { get; set; }
        public string isSendToMesStr { get; set; }
        public int? SendToMesCount { get; set; }
        public DateTime? SendToMesTime { get; set; }
        public string MesRet { get; set; }
    }
}
DEmon/iWareLog/Report/Helper/InOutStorageDetailResultForMes.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,53 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace iWareLog.Report.Helper
{
    // å»ºè®®æ”¾åœ¨ Models æˆ– DTOs æ–‡ä»¶å¤¹ä¸‹
    public class InOutStorageDetailResultForMes
    {
        /// <summary>
        /// è¡¨InOutStorageDetail的ID
        /// </summary>
        public int Id { get; set; }
        /// <summary>
        /// åž‹æå”¯ä¸€ç¼–码
        /// </summary>
        public string Code { get; set; }
        /// <summary>
        /// èˆ¹å·/发放工程号
        /// </summary>
        public string IssueProjectNo { get; set; }
        /// <summary>
        /// åˆ†æ®µå·
        /// </summary>
        public string SerialNo { get; set; }
        /// <summary>
        /// ä¸šåŠ¡æ ‡è¯†ï¼ˆæš‚ä¸º A.type)
        /// </summary>
        public int? BusinessFlag { get; set; }
        /// <summary>
        /// åº“位编码(暂为 A.toplacecode,目标库位)
        /// </summary>
        public string PlaceCode { get; set; }
        /// <summary>
        /// å‘送时间戳(暂为 A.createtime)
        /// </summary>
        public DateTime? Timestamp { get; set; }
        /// <summary>
        /// å‘生时间(暂与 Timestamp ä¸€è‡´ï¼Œæˆ–可替换为其它字段)
        /// </summary>
        public DateTime? OccurrenceTime { get; set; }
    }
}
DEmon/iWareLog/Report/Helper/R_InOutStorageDetailResultForMes.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,48 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace iWareLog.Report.Helper
{
    // å»ºè®®æ”¾åœ¨ Models æˆ– DTOs æ–‡ä»¶å¤¹ä¸‹
    public class R_InOutStorageDetailResultForMes
    {
        /// <summary>
        /// åž‹æå”¯ä¸€ç¼–码
        /// </summary>
        public string Code { get; set; }
        /// <summary>
        /// èˆ¹å·/发放工程号
        /// </summary>
        public string IssueProjectNo { get; set; }
        /// <summary>
        /// åˆ†æ®µå·
        /// </summary>
        public string SerialNo { get; set; }
        /// <summary>
        /// ä¸šåŠ¡æ ‡è¯†ï¼ˆæš‚ä¸º A.type)
        /// </summary>
        public string BusinessFlag { get; set; }
        /// <summary>
        /// åº“位编码(暂为 A.toplacecode,目标库位)
        /// </summary>
        public string PlaceCode { get; set; }
        /// <summary>
        /// å‘送时间戳(暂为 A.createtime)
        /// </summary>
        public string Timestamp { get; set; }
        /// <summary>
        /// å‘生时间(暂与 Timestamp ä¸€è‡´ï¼Œæˆ–可替换为其它字段)
        /// </summary>
        public string OccurrenceTime { get; set; }
    }
}
DEmon/iWareLog/Report/Service/InOutService.cs
@@ -51,7 +51,7 @@
                {
                    string sql = @"select count(B.typename)quantity,B.typename materialcode from  InOutStorageDetail A left join WGQ_WB19011_CORE.[dbo].[BASEMaterialView] B on A.materialid=B.id
                                    where A.type=@p0 and A.updatetime>=@p1 and A.updatetime<@p2 group by B.typename";
                    List<InOutHelper> data = context.Database.SqlQuery<InOutHelper>(sql,type, start, end).ToList();
                    List<InOutHelper> data = context.Database.SqlQuery<InOutHelper>(sql, type, start, end).ToList();
                    return data;
                }
                catch (Exception ex)
@@ -62,6 +62,46 @@
            }
        }
        /// <summary>
        /// æŸ¥è¯¢å‡ºå…¥åº“明细及物料信息(联查 InOutStorageDetail å’Œ BASEMaterialView)
        /// </summary>
        /// <returns>返回包含型材编码、船号、分段号、业务标识、库位、时间等信息的列表</returns>
        public List<InOutStorageDetailResultForMes> GetInOutStorageDetailListForMes()
        {
            using (DbModelLog context = new DbModelLog())
            {
                try
                {
                    string sql = @"
                SELECT
                    A.id AS Id,
                    B.code AS Code,
                    B.issueprojectno AS IssueProjectNo,
                    B.serialno AS SerialNo,
                    A.type AS BusinessFlag,
                    A.toplacecode AS PlaceCode,
                    A.createtime AS Timestamp,
                    A.createtime AS OccurrenceTime
                FROM
                    InOutStorageDetail A
                INNER JOIN
                    WGQ_WB19011_CORE.[dbo].[BASEMaterialView] B
                    ON A.materialid = B.id And A.isSendToMes=1 ";
                    // æ‰§è¡Œ SQL æŸ¥è¯¢ï¼Œå¹¶æ˜ å°„到自定义类 InOutStorageDetailResult
                    var data = context.Database.SqlQuery<InOutStorageDetailResultForMes>(sql).ToList();
                    return data;
                }
                catch (Exception ex)
                {
                    // è®°å½•异常日志(和你原有方法保持一致)
                    LogTextHelper.WriteLine("InOutService", "GetInOutStorageDetailList", ex.ToString());
                    return null; // æˆ–者返回 new List<InOutStorageDetailResult>(),根据你的业务需求
                }
            }
        }
    }
}
DEmon/iWareLog/iWareLog.csproj
@@ -93,6 +93,8 @@
      <DependentUpon>Resources.resx</DependentUpon>
    </Compile>
    <Compile Include="Report\Helper\AlertHelper.cs" />
    <Compile Include="Report\Helper\R_InOutStorageDetailResultForMes.cs" />
    <Compile Include="Report\Helper\InOutStorageDetailResultForMes.cs" />
    <Compile Include="Report\Helper\InOutHelper.cs" />
    <Compile Include="Report\Service\AlertService.cs" />
    <Compile Include="Report\Service\InOutService.cs" />