dengjunjie
9 天以前 e579c8d3ab3accb26258f0c615101e3d86093730
添加库存临期提醒,优化前端弹窗提醒
已修改14个文件
248 ■■■■ 文件已修改
新建文件夹/WIDESEA_WMSServer/ClassLibrary1/IInventoryInfoService.cs 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
新建文件夹/WIDESEA_WMSServer/ClassLibrary1/IInventory_BatchServices.cs 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
新建文件夹/WIDESEA_WMSServer/ClassLibrary1/IMessageInfoService.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
新建文件夹/WIDESEA_WMSServer/ClassLibrary2/InventoryInfoService.cs 76 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
新建文件夹/WIDESEA_WMSServer/ClassLibrary2/Inventory_BatchServices.cs.cs 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
新建文件夹/WIDESEA_WMSServer/ClassLibrary2/MessageInfoService.cs 30 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
新建文件夹/WIDESEA_WMSServer/WIDESEA_Common/MessageEnum.cs 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
新建文件夹/WIDESEA_WMSServer/WIDESEA_Model/Models/WMSInfo/Dt_Inventory_Batch.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
新建文件夹/WIDESEA_WMSServer/WIDESEA_SquareCabinServices/CabinOrderServices.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
新建文件夹/WIDESEA_WMSServer/WIDESEA_SquareCabinServices/InventoryServices.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
新建文件夹/WIDESEA_WMSServer/WIDESEA_WMSServer/AlarmJob.cs 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
新建文件夹/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/WMSInfo/MessageInfoController.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
新建文件夹/WMS/src/views/Alarm/MessageInfo.vue 76 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
新建文件夹/WMS/src/views/index/Message.vue 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
н¨Îļþ¼Ð/WIDESEA_WMSServer/ClassLibrary1/IInventoryInfoService.cs
@@ -20,11 +20,5 @@
        /// </summary>
        /// <returns></returns>
        WebResponseContent GetInventory();
        /// <summary>
        /// èŽ·å–ä¸´æœŸçš„å’Œç«‹åº“åº“å­˜ä½ŽæŠ¥è­¦
        /// </summary>
        /// <returns></returns>
        WebResponseContent GetExpiredAndlow();
    }
}
н¨Îļþ¼Ð/WIDESEA_WMSServer/ClassLibrary1/IInventory_BatchServices.cs
@@ -13,5 +13,7 @@
    public interface IInventory_BatchServices : IService<Dt_Inventory_Batch>
    {
        IRepository<Dt_Inventory_Batch> Repository { get; }
        WebResponseContent GetExpiredAndlow();
    }
}
н¨Îļþ¼Ð/WIDESEA_WMSServer/ClassLibrary1/IMessageInfoService.cs
@@ -24,7 +24,7 @@
        /// <param name="messageRemark"></param>
        /// <returns></returns>
        WebResponseContent AddMessageInfo(MessageGroupByEnum groupByEnum, string messageName, string messageInfo, MessageStatusEnum statusEnum = MessageStatusEnum.Undisposed, string messageRemark = "");
        WebResponseContent DeleteAndIntoHty(int[] keys);
        WebResponseContent DeleteAndIntoHty(object[] keys);
        void GetMessageInfo();
    }
}
н¨Îļþ¼Ð/WIDESEA_WMSServer/ClassLibrary2/InventoryInfoService.cs
@@ -25,82 +25,6 @@
        }
        public IRepository<Dt_InventoryInfo> Repository => BaseDal;
        public WebResponseContent GetExpiredAndlow()
        {
            try
            {
                // èŽ·å–å½“å‰æ—¶é—´ï¼ˆåªå–æ—¥æœŸéƒ¨åˆ†ï¼Œå¿½ç•¥æ—¶é—´ï¼‰
                DateTime currentDate = DateTime.Today;
                // è®¡ç®—30天后的日期
                DateTime thresholdDate = currentDate.AddDays(30);
                // æŸ¥æ‰¾åº“存中所有商品
                var inventoryList = BaseDal.QueryData();
                var expiredSoonList = new List<object>();
                foreach (var item in inventoryList)
                {
                    // æ£€æŸ¥ValidityPeriod是否为空
                    if (string.IsNullOrEmpty(item.ValidityPeriod))
                        continue;
                    // ä½¿ç”¨ç²¾ç¡®æ ¼å¼è§£æž "2037-10-02"
                    if (DateTime.TryParseExact(item.ValidityPeriod.Trim(), "yyyy-MM-dd",
                        System.Globalization.CultureInfo.InvariantCulture,
                        System.Globalization.DateTimeStyles.None, out DateTime expiryDate))
                    {
                        // è®¡ç®—剩余天数(只比较日期部分)
                        double daysRemaining = (expiryDate - currentDate).TotalDays;
                        // æ£€æŸ¥æ˜¯å¦åœ¨30天内(包括已过期的)
                        if (daysRemaining <= 30)
                        {
                            expiredSoonList.Add(new
                            {
                                MaterielCode = item.MaterielCode ?? "",
                                BatchNo = item.BatchNo ?? "",
                                ValidityPeriod = item.ValidityPeriod,
                                ExpiryDate = expiryDate.ToString("yyyy-MM-dd"),
                            });
                        }
                    }
                    else
                    {
                        // è®°å½•解析失败的记录(用于调试)
                        Console.WriteLine($"无法解析效期: {item.ValidityPeriod}");
                    }
                }
                // æŒ‰å‰©ä½™å¤©æ•°å‡åºæŽ’列(即将过期的排前面)
                var sortedList = expiredSoonList.OrderBy(x =>
                {
                    var days = (int)((dynamic)x).DaysRemaining;
                    return days;
                }).ToList();
                return new WebResponseContent
                {
                    Status = true,
                    Message = $"发现 {sortedList.Count} ä¸ªå•†å“å°†åœ¨30天内过期",
                    Data = new
                    {
                        TotalCount = sortedList.Count,
                        ExpiredCount = sortedList.Count(x => ((dynamic)x).DaysRemaining < 0),
                        WarningCount = sortedList.Count(x => ((dynamic)x).DaysRemaining >= 0),
                        CheckDate = currentDate.ToString("yyyy-MM-dd"),
                        Items = sortedList
                    }
                };
            }
            catch (Exception ex)
            {
                return new WebResponseContent
                {
                    Status = false,
                    Message = $"获取效期数据失败: {ex.Message}"
                };
            }
        }
        /// <summary>
        /// èŽ·å–åº“å­˜
н¨Îļþ¼Ð/WIDESEA_WMSServer/ClassLibrary2/Inventory_BatchServices.cs.cs
@@ -3,6 +3,8 @@
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Common;
using WIDESEA_Core;
using WIDESEA_Core.BaseRepository;
using WIDESEA_Core.BaseServices;
using WIDESEA_IWMsInfoServices;
@@ -13,10 +15,34 @@
{
    public class Inventory_BatchServices : ServiceBase<Dt_Inventory_Batch, IRepository<Dt_Inventory_Batch>>, IInventory_BatchServices
    {
        public Inventory_BatchServices(IRepository<Dt_Inventory_Batch> BaseDal) : base(BaseDal)
        private IMessageInfoService _messageInfoService;
        public Inventory_BatchServices(IRepository<Dt_Inventory_Batch> BaseDal, IMessageInfoService messageInfoService) : base(BaseDal)
        {
            _messageInfoService = messageInfoService;
        }
        public IRepository<Dt_Inventory_Batch> Repository => BaseDal;
        public WebResponseContent GetExpiredAndlow()
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                DateTime dateTime = DateTime.Now.AddDays(30).Date;
                List<Dt_Inventory_Batch> inventory_Batches = BaseDal.QueryData(x => x.ValidityPeriod < dateTime);
                foreach (var item in inventory_Batches)
                {
                    var day = (item.ValidityPeriod - DateTime.Now).Days;
                    string d = $"还有{day}天过期";
                    if (day < 0) d = $"已过期{Math.Abs(day)}天";
                    _messageInfoService.AddMessageInfo(MessageGroupByEnum.InventoryExceedAlarm, "物料名称:" + item.MaterielName, $"物料编号【{item.MaterielCode}】物料批次【{item.BatchNo}】{d}");
                }
            }
            catch (Exception ex)
            {
                content.Error(ex.Message);
            }
            return content;
        }
    }
}
н¨Îļþ¼Ð/WIDESEA_WMSServer/ClassLibrary2/MessageInfoService.cs
@@ -51,6 +51,8 @@
                    dt_MessageInfo = BaseDal.QueryFirst(x => x.MessageName == messageName && x.MessageRemark == messageRemark);
                else
                    dt_MessageInfo = BaseDal.QueryFirst(x => x.MessageName == messageName && x.MessageInfo == messageInfo);
                if (groupByEnum != MessageGroupByEnum.InventoryExceedAlarm && dt_MessageInfo != null) return content;
                if (dt_MessageInfo == null)
                {
                    dt_MessageInfo = new Dt_MessageInfo();
@@ -65,6 +67,7 @@
                {
                    if (dt_MessageInfo.MessageGroupBy == MessageGroupByEnum.InventoryExceedAlarm.ObjToInt())
                    {
                        if (dt_MessageInfo.MessageInfo == messageInfo) return content;
                        dt_MessageInfo.MessageStatus = statusEnum.ObjToInt();
                        dt_MessageInfo.MessageName = messageName;
                        dt_MessageInfo.MessageInfo = messageInfo;
@@ -79,18 +82,36 @@
            }
            return content;
        }
        public WebResponseContent DeleteAndIntoHty(int[] keys)
        public override WebResponseContent DeleteData(object[] keys)
        {
            return DeleteAndIntoHty(keys);
            //return base.DeleteData(keys);
        }
        public WebResponseContent DeleteAndIntoHty(object[] keys)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                List<Dt_MessageInfo> messageInfos = BaseDal.QueryData(x => keys.Contains(x.Id));
                List<int> ints = new List<int>();
                foreach (var item in messageInfos)
                {
                    item.MessageStatus = MessageStatusEnum.Processed.ObjToInt();
                    item.Modifier = App.User.UserName;
                    ints.Add(item.Id);
                }
                BaseDal.DeleteAndMoveIntoHty(messageInfos, OperateTypeEnum.人工完成);
                string MessageInfo = _cacheService.Get("MessageInfo");
                if (!string.IsNullOrEmpty(MessageInfo))
                {
                    List<Message>? messages = JsonConvert.DeserializeObject<List<Message>>(MessageInfo);
                    if (messages != null)
                    {
                        messages = messages.Where(x => !ints.Contains(x.Id)).ToList();
                        _cacheService.AddOrUpdate("MessageInfo", JsonConvert.SerializeObject(messages));
                    }
                }
                content.OK("处理成功");
            }
            catch (Exception ex)
            {
@@ -103,7 +124,6 @@
        {
            try
            {
                List<int> keys = new List<int>();
                List<Message> messagesinfo = new List<Message>();
                string MessageInfo = _cacheService.Get("MessageInfo");
                if (!string.IsNullOrEmpty(MessageInfo))
@@ -112,10 +132,9 @@
                    if (messages != null)
                    {
                        messagesinfo = messages;
                        keys = messages.Select(x => x.Id).ToList();
                    }
                }
                var messinfo = BaseDal.QueryData(x => !keys.Contains(x.Id));
                var messinfo = BaseDal.QueryData(x => x.MessageStatus < MessageStatusEnum.Wait.ObjToInt());
                foreach (var item in messinfo)
                {
                    Message message = new Message()
@@ -136,8 +155,11 @@
                    };
                    if (_webSocketServer.OnlineCount > 0)
                        _webSocketServer.PublishAllClientPayload(JsonConvert.SerializeObject(obj));
                    item.MessageStatus = MessageStatusEnum.Wait.ObjToInt();
                }
                if (messagesinfo.Count > 0)
                _cacheService.AddOrUpdate("MessageInfo", JsonConvert.SerializeObject(messagesinfo));
                BaseDal.UpdateData(messinfo);
            }
            catch (Exception ex)
            {
н¨Îļþ¼Ð/WIDESEA_WMSServer/WIDESEA_Common/MessageEnum.cs
@@ -47,9 +47,9 @@
    public enum MessageStatusEnum
    {
        /// <summary>
        /// å¾…处理
        /// æœªå¤„理
        /// </summary>
        [Description("待处理")]
        [Description("未处理")]
        Undisposed,
        /// <summary>
        /// æ€¥å¤„理
@@ -57,6 +57,11 @@
        [Description("急处理")]
        Emergency,
        /// <summary>
        /// å¾…处理
        /// </summary>
        [Description("待处理")]
        Wait,
        /// <summary>
        /// å·²å¤„理
        /// </summary>
        [Description("已处理")]
н¨Îļþ¼Ð/WIDESEA_WMSServer/WIDESEA_Model/Models/WMSInfo/Dt_Inventory_Batch.cs
@@ -115,7 +115,7 @@
        [ImporterHeader(Name = "有效期至")]
        [ExporterHeader(DisplayName = "有效期至")]
        [SugarColumn(IsNullable = true, ColumnDescription = "有效期至")]
        public string ValidityPeriod { get; set; }
        public DateTime ValidityPeriod { get; set; }
        /// <summary>
        /// å¤‡æ³¨
н¨Îļþ¼Ð/WIDESEA_WMSServer/WIDESEA_SquareCabinServices/CabinOrderServices.cs
@@ -270,7 +270,7 @@
                        Status = false,
                        StockQuantity = inventoryInfo.StockQuantity,
                        AvailableQuantity = inventoryInfo.StockQuantity,
                        ValidityPeriod = inventoryInfo.ValidityPeriod,
                        ValidityPeriod = inventoryInfo.ValidityPeriod.ObjToDate(),
                        SupplyQuantity = inventoryInfo.SupplyQuantity,
                    };
                    _inventory_BatchServices.AddData(inventory_Batch);
н¨Îļþ¼Ð/WIDESEA_WMSServer/WIDESEA_SquareCabinServices/InventoryServices.cs
@@ -260,7 +260,7 @@
                                            ERPStockQuantity = 0,
                                            Status = false,
                                            ProductionDate = detail.finishDate.ToString("yyyy-MM-dd"),
                                            ValidityPeriod = inventoryInfo.ValidityPeriod,
                                            ValidityPeriod = inventoryInfo.ValidityPeriod.ObjToDate(),
                                            Remark = "自动创建"
                                        };
                                        BaseDal.Db.Insertable(inventory_Batch).ExecuteCommand();
н¨Îļþ¼Ð/WIDESEA_WMSServer/WIDESEA_WMSServer/AlarmJob.cs
@@ -10,11 +10,13 @@
        private readonly IContainerService _containerService;
        private readonly IEquipmentAlarmInforService _equipmentAlarmInforService;
        private readonly IMessageInfoService _messageInfoService;
        public AlarmJob(IContainerService containerService, IEquipmentAlarmInforService equipmentAlarmInforService, IMessageInfoService messageInfoService)
        private readonly IInventory_BatchServices _inventoryInfoService;
        public AlarmJob(IContainerService containerService, IEquipmentAlarmInforService equipmentAlarmInforService, IMessageInfoService messageInfoService, IInventory_BatchServices inventoryInfoService)
        {
            _containerService = containerService;
            _equipmentAlarmInforService = equipmentAlarmInforService;
            _messageInfoService = messageInfoService;
            _inventoryInfoService = inventoryInfoService;
        }
        //每隔1秒执行一次
        [Invoke(Begin = "2025-09-01", Interval = 1000 * 5, IsEnabled = true, SkipWhileExecuting = true)]
@@ -23,6 +25,7 @@
            //冷库
            _containerService.Sensor();
            _equipmentAlarmInforService.getDeviceStatus();
            _inventoryInfoService.GetExpiredAndlow();
            _messageInfoService.GetMessageInfo();
        }
    }
н¨Îļþ¼Ð/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/WMSInfo/MessageInfoController.cs
@@ -15,7 +15,7 @@
        {
        }
        [HttpPost, HttpGet, Route("DeleteAndIntoHty")]
        public WebResponseContent DeleteAndIntoHty([FromBody] int[] keys)
        public WebResponseContent DeleteAndIntoHty([FromBody] object[] keys)
        {
            return Service.DeleteAndIntoHty(keys);
        }
н¨Îļþ¼Ð/WMS/src/views/Alarm/MessageInfo.vue
@@ -149,22 +149,22 @@
        bind: { key: "MessageGroupByEnum", data: [] },
        require: true,
      },
      {
        field: "messageStatus",
        title: "状态",
        type: "string",
        width: 100,
        align: "center",
        bind: { key: "MessageStatusEnum", data: [] },
        require: true,
      },
      // {
      //   field: "messageStatus",
      //   title: "状态",
      //   type: "string",
      //   width: 100,
      //   align: "center",
      //   bind: { key: "MessageStatusEnum", data: [] },
      //   require: true,
      // },
      {
        field: "messageName",
        title: "异常信息名称",
        type: "string",
        width: 200,
        align: "left",
        link: true,
        // link: true,
        require: true,
      },
      {
@@ -175,20 +175,20 @@
        align: "left",
        require: true,
      },
      {
        field: "messageRemark",
        title: "备注",
        type: "string",
        width: 200,
        align: "left",
      },
      {
        field: "creater",
        title: "创建人",
        type: "string",
        width: 100,
        align: "center",
      },
      // {
      //   field: "messageRemark",
      //   title: "备注",
      //   type: "string",
      //   width: 200,
      //   align: "left",
      // },
      // {
      //   field: "creater",
      //   title: "创建人",
      //   type: "string",
      //   width: 100,
      //   align: "center",
      // },
      {
        field: "createDate",
        title: "创建时间",
@@ -196,20 +196,20 @@
        width: 160,
        align: "center",
      },
      {
        field: "modifier",
        title: "修改人",
        type: "string",
        width: 100,
        align: "center",
      },
      {
        field: "modifyDate",
        title: "修改时间",
        type: "datetime",
        width: 160,
        align: "center",
      },
      // {
      //   field: "modifier",
      //   title: "修改人",
      //   type: "string",
      //   width: 100,
      //   align: "center",
      // },
      // {
      //   field: "modifyDate",
      //   title: "修改时间",
      //   type: "datetime",
      //   width: 160,
      //   align: "center",
      // },
    ]);
    const detail = ref({
н¨Îļþ¼Ð/WMS/src/views/index/Message.vue
@@ -48,10 +48,10 @@
          </el-col>
        </el-row> -->
      </div>
      <div style="margin-top: 20px">
      <!-- <div style="margin-top: 20px">
        <el-button type="primary">已处理</el-button>
        <!-- <el-button type="danger">驳回</el-button> -->
      </div>
        <el-button type="danger">驳回</el-button>
      </div> -->
    </div>
  </div>
</template>