分支自 SuZhouGuanHong/TaiYuanTaiZhong

dengjunjie
2024-06-25 6e39b92ddec5b5b9f8e2b0d49e70313f8cadc1aa
´úÂë¹ÜÀí/WMS/WMS_Server/WIDESEA_WMS/Services/system/Partial/dt_stationinfoService.cs
@@ -17,9 +17,26 @@
using Microsoft.Extensions.DependencyInjection;
using Microsoft.AspNetCore.Http;
using WIDESEA_WMS.IRepositories;
using Newtonsoft.Json;
using WIDESEA_Comm.LogInfo;
using WIDESEA_Core.FreeDB;
using WIDESEA_Core.ManageUser;
using OfficeOpenXml.FormulaParsing.Excel.Functions.Text;
using static System.Collections.Specialized.BitVector32;
using WIDESEA_Core.EFDbContext;
using WIDESEA_WMS.Repositories;
using WIDESEA_Comm;
using WIDESEA_Comm.TaskNo;
using WIDESEA_Common;
using static FreeSql.Internal.GlobalFilter;
namespace WIDESEA_WMS.Services
{
    public class Parm
    {
        public List<string> data { get; set; }
        public int type { get; set; }
    }
    public partial class dt_stationinfoService
    {
        private readonly IHttpContextAccessor _httpContextAccessor;
@@ -37,5 +54,317 @@
            //多租户会用到这init代码,其他情况可以不用
            //base.Init(dbRepository);
        }
  }
        FreeDB freeDB = new FreeDB();
        /// <summary>
        /// è®¾ç½®ç¼“存架禁用启用
        /// </summary>
        /// <param name="json"></param>
        /// <returns></returns>
        public WebResponseContent SetStationEnable(object json)
        {
            WebResponseContent webResponse = new WebResponseContent();
            try
            {
                var Tel = UserContext.Current.UserInfo.Tel;
                var data = JsonConvert.DeserializeObject<Parm>(json.ToString());
                //var updateList = FreeDB.DB.Select<dt_stationinfo>().Where(t => data.data.Contains(t.id.ToString())).ToList();
                var updateList = _repository.Find(x => data.data.Contains(x.id.ToString())).ToList();
                if (!string.IsNullOrEmpty(Tel))
                {
                    var types = Tel.Split(',');
                    foreach (var update in updateList)
                    {
                        var OK = false;
                        foreach (var type in types)
                        {
                            if (update.stationCode.Contains(type))
                                OK = true;
                        }
                        if (!OK) throw new Exception("当前账号无禁用权限!");
                    }
                }
                var res = freeDB.Update<dt_stationinfo>()
                     .Set(t => t.enable, data.type == 1)
                     .Where(t => data.data.Contains(t.id.ToString()))
                     .ExecuteAffrows();
                var msg = data.type == 1 ? "启用" : "禁用";
                WriteDBLog.Write($"手动{msg}站点 ", $"{string.Join('、', updateList.Select(t => t.stationCode).ToArray())}", LogState.Sucess, "WMS", UserContext.Current.UserName);
                webResponse.OK();
            }
            catch (Exception ex)
            {
                WriteDBLog.Write($"手动启用或禁用站点 ", new { é”™è¯¯ä¿¡æ¯ = ex.Message, æ•°æ® = json }, LogState.Error, "WMS", UserContext.Current.UserName);
                webResponse.Error(ex.Message);
            }
            return webResponse;
        }
        /// <summary>
        /// åˆ‡æ¢æ‰˜ç›˜
        /// </summary>
        /// <param name="saveModel"></param>
        /// <returns></returns>
        public WebResponseContent Trayswitching(SaveModel saveModel)
        {
            WebResponseContent webResponse = new WebResponseContent();
            VOLContext context = new VOLContext();
            Idt_agvtaskRepository agvtaskRepository = new dt_agvtaskRepository(context);
            IVV_Mes_WorkinfoRepository workinfoRepository = new VV_Mes_WorkinfoRepository(context);
            foreach (var Key in saveModel.DelKeys)
            {
                try
                {
                    var station = repository.Find(x => x.id.ToString() == Key.ToString()).FirstOrDefault();
                    if (!station.stationCode.Contains("X") && !station.stationCode.Contains("W01001004") && !station.stationCode.Contains("W01001005")) throw new Exception($"无{station.stationCode}使用权限!");
                    if (!station.enable) throw new Exception($"{station.stationCode}未启用!");
                    if (station.location_state == LocationStateEnum.Abnormal.ToString()) throw new Exception($"{station.stationCode}状态异常!");
                    if (station.location_state == LocationStateEnum.Empty.ToString()) throw new Exception($"{station.stationCode}状态为空!");
                    if (station.remark == "桁架下料") throw new Exception($"{station.stationCode}桁架正在下料!");
                    var task = agvtaskRepository.Find(x => x.agv_toaddress == station.stationCode).FirstOrDefault();
                    if (task != null)
                    {
                        if (task.agv_taskstate != AGVTaskStateEnum.Queue.ToString()) throw new Exception($"{station.stationCode}存在任务!");
                        task.agv_Traytype = station.tray_type == TrayTypeEnum.SmallTray.ToString() ? TrayTypeEnum.LargeTray.ToString() : TrayTypeEnum.SmallTray.ToString();
                        agvtaskRepository.Update(task, x => new { x.agv_Traytype }, true);
                    }
                    else if (!agvtaskRepository.Find(x => x.agv_fromaddress == station.stationCode).Any())
                    {
                        #region ä¸ºç©ºæ‰˜å¹¶ä¸”数量为0,创建取空托任务
                        if (station.tray_status == TrayStateEnum.EmptyTray.ToString() && station.quantity == 0)
                        {
                            dt_agvtask agvtask = new dt_agvtask()
                            {
                                agv_fromaddress = station.stationCode,
                                agv_id = Guid.NewGuid(),
                                agv_tasknum = IdenxManager.GetTaskNo("KH-", "WMS"),
                                agv_grade = 1,
                                agv_createtime = DateTime.Now,
                                agv_taskstate = AGVTaskStateEnum.Queue.ToString(),
                                agv_qty = 1,
                                StarQuantity = 0,
                                EndQuantity = 0,//EmptyStation.quantity,
                                agv_tasktype = AGVTaskTypeEnum.TaskType_EmptyPallet.ToString(),
                                agv_toaddress = "",
                                agv_userid = UserContext.Current.UserName,
                                agv_TrayStatus = station.tray_status,
                                agv_Traytype = station.tray_type
                            };
                            agvtaskRepository.Add(agvtask, true);
                            station.location_state = LocationStateEnum.Busy.ToString();
                        }
                        #endregion
                        #region åˆ›å»ºå…¥åº“任务
                        else if (station.location_state == LocationStateEnum.Stroge.ToString() && station.quantity > 0)
                        {
                            var Work = workinfoRepository.Find(x => x.workOrder == station.Number && x.processCode == "17").FirstOrDefault();
                            if (Work == null) throw new Exception($"未找到货位{station.stationCode}的机加工工单信息!");
                            dt_agvtask agvtask = new dt_agvtask()
                            {
                                agv_fromaddress = station.stationCode,
                                agv_id = Guid.NewGuid(),
                                agv_tasknum = IdenxManager.GetTaskNo("KH-", "WMS"),
                                agv_grade = 1,
                                agv_createtime = DateTime.Now,
                                agv_taskstate = AGVTaskStateEnum.Queue.ToString(),
                                agv_materielid = station.stationType,
                                agv_qty = station.quantity,
                                agv_tasktype = station.stationCode.Contains("3") ? AGVTaskTypeEnum.TaskType_OutsourceInbound.ToString() : AGVTaskTypeEnum.TaskType_Inbound.ToString(),
                                agv_toaddress = "",
                                agv_userid = UserContext.Current.UserName,
                                bindSN = station.bindSN,
                                agv_worktype = Convert.ToInt32(Work.processCode),
                                agv_materbarcode = Work.materialCode,
                                agv_Traytype = station.tray_type,
                                jobID = station.Number,
                                agv_TrayStatus = station.tray_status
                            };
                            agvtaskRepository.Add(agvtask, true);
                            station.location_state = LocationStateEnum.InBusy.ToString();
                        }
                        #endregion
                    }
                    station.tray_type = station.tray_type == TrayTypeEnum.SmallTray.ToString() ? TrayTypeEnum.LargeTray.ToString() : TrayTypeEnum.SmallTray.ToString();
                    repository.Update(station, x => new { x.location_state, x.tray_type }, true);
                    webResponse.OK(webResponse.Message += $"{station.stationCode}切换成功!");
                }
                catch (Exception ex)
                {
                    webResponse.Error(webResponse.Message += ex.Message);
                }
            }
            WriteDBLog.Write($"手动切换托盘 ", new { ä¿¡æ¯ = webResponse.Message }, LogState.Sucess, "WMS", UserContext.Current.UserName);
            return webResponse;
        }
        /// <summary>
        /// ä¸‹æ–™ä»»åŠ¡
        /// </summary>
        /// <param name="saveModel"></param>
        /// <returns></returns>
        public WebResponseContent SendAGVTask(SaveModel saveModel)
        {
            WebResponseContent webResponse = new WebResponseContent();
            VOLContext context = new VOLContext();
            Idt_agvtaskRepository agvtaskRepository = new dt_agvtaskRepository(context);
            IVV_Mes_WorkinfoRepository workinfoRepository = new VV_Mes_WorkinfoRepository(context);
            string completor = UserContext.Current.UserName;
            //List<object> jsons = null;
            foreach (var Key in saveModel.DelKeys)
            {
                try
                {
                    var station = repository.Find(x => x.id.ToString() == Key.ToString()).FirstOrDefault();
                    if (!station.stationCode.Contains("X")) throw new Exception($"无{station.stationCode}使用权限!");
                    if (!station.enable) throw new Exception($"{station.stationCode}未启用!");
                    if (station.location_state == LocationStateEnum.Abnormal.ToString()) throw new Exception($"{station.stationCode}状态异常!");
                    if (station.location_state == LocationStateEnum.Empty.ToString()) throw new Exception($"{station.stationCode}状态为空!");
                    if (station.tray_status == TrayStateEnum.EmptyTray.ToString()) throw new Exception($"{station.stationCode}为空托盘!");
                    if (station.quantity < 1) throw new Exception($"{station.stationCode}数量少于1!");
                    if (station.remark == "桁架下料") throw new Exception($"{station.stationCode}桁架正在下料!");
                    //if (station.location_state.Contains("Busy")) throw new Exception($"{station.stationCode}占用!");
                    if (agvtaskRepository.Find(x => x.agv_fromaddress == station.stationCode || x.agv_fromaddress == station.stationCode).Any()) throw new Exception($"{station.stationCode}存在任务!");
                    var Work = workinfoRepository.Find(x => x.workOrder == station.Number && x.processCode == "17").FirstOrDefault();
                    if (Work == null) throw new Exception($"未找到货位{station.stationCode}的机加工工单信息!");
                    string tasktype = AGVTaskTypeEnum.TaskType_Inbound.ToString();
                    if (!string.IsNullOrEmpty(Work.area) || station.stationCode.Contains("3"))
                        tasktype = AGVTaskTypeEnum.TaskType_OutsourceInbound.ToString();
                    dt_agvtask agvtask = new dt_agvtask()
                    {
                        agv_fromaddress = station.stationCode,
                        agv_id = Guid.NewGuid(),
                        agv_tasknum = IdenxManager.GetTaskNo("KH-", "WMS"),
                        agv_grade = 1,
                        agv_createtime = DateTime.Now,
                        agv_taskstate = AGVTaskStateEnum.Queue.ToString(),
                        agv_materielid = station.stationType,
                        agv_qty = station.quantity,
                        agv_tasktype = tasktype,
                        agv_toaddress = "",
                        agv_userid = completor,
                        bindSN = station.bindSN,
                        agv_worktype = Convert.ToInt32(Work.processCode),
                        agv_materbarcode = Work.materialCode,
                        agv_Traytype = station.tray_type,
                        jobID = station.Number,
                        agv_TrayStatus = station.tray_status
                    };
                    //jsons.Add(agvtask);
                    agvtaskRepository.Add(agvtask, true);
                    station.location_state = LocationStateEnum.InBusy.ToString();
                    repository.Update(station, x => new { x.location_state }, true);
                    webResponse.OK(webResponse.Message += $"{station.stationCode}任务添加成功!");
                }
                catch (Exception ex)
                {
                    webResponse.Error(webResponse.Message += ex.Message);
                }
            }
            WriteDBLog.Write($"手动下料任务 ", new { ä¿¡æ¯ = webResponse.Message }, LogState.Sucess, "WMS", completor);
            return webResponse;
        }
        public override WebResponseContent Add(SaveModel saveDataModel)
        {
            return base.Add(saveDataModel);
        }
        public override WebResponseContent Update(SaveModel saveModel)
        {
            WebResponseContent webResponse = new WebResponseContent();
            var station = _repository.FindFirst(x => x.id.ToString() == saveModel.MainData["id"].ToString());
            station.location_state = saveModel.MainData["location_state"].ToString();
            //station.bindSN = saveModel.MainData["bindSN"].ToString();
            var SNS = saveModel.MainData["bindSN"].ToString().Split(",");
            List<string> list = new List<string>();
            foreach (var SN in SNS)
            {
                if (!string.IsNullOrEmpty(SN))
                    list.Add(SN);
            }
            station.bindSN = string.Join(",", list);
            station.quantity = list.Count;
            station.stationType = saveModel.MainData["stationType"].ToString();
            station.heatNumber = saveModel.MainData["heatNumber"].ToString();
            station.Number = saveModel.MainData["Number"].ToString();
            station.billetID = saveModel.MainData["billetID"].ToString();
            station.remark = saveModel.MainData["remark"].ToString();
            station.tray_type = saveModel.MainData["tray_type"].ToString();
            if (list.Count == 0)
            {
                //station.tray_status = "EmptyTray";
                station.stationType = string.Empty;
                station.heatNumber = string.Empty;
                station.Number = string.Empty;
            }
            station.tray_status = string.IsNullOrEmpty(station.stationType) ? "EmptyTray" : "StrogeTray";
            if (station.location_state == "Empty" && !string.IsNullOrEmpty(station.stationType))
            {
                webResponse.Error("图号不为空,货位状态不能设置为空货位!");
            }
            //station.tray_status = list.Count == 0 ? "EmptyTray" : "StrogeTray";
            if (station.location_state == "Empty")
            {
                station.stationType = string.Empty;
                station.heatNumber = string.Empty;
                station.Number = string.Empty;
                station.billetID = string.Empty;
                station.tray_status = string.Empty;
                station.bindSN = string.Empty;
                station.quantity = 0;
                //if (!station.stationCode.Contains("S") && !station.stationCode.Contains("X") && !station.stationCode.Contains("W01001004") && !station.stationCode.Contains("W01001005"))
                //    station.tray_type = string.Empty;
            }
            var count = _repository.Update(station, true);
            if (count > 0)
                webResponse.OK();
            else
                webResponse.Error();
            return webResponse;
        }
        public WebResponseContent dt_stationinfolist()
        {
            WebResponseContent content = new WebResponseContent();
            VOLContext volContext = new VOLContext();
            Idt_stationinfoRepository dsta = new dt_stationinfoRepository(volContext);
            string[] stationCodes = { "W", "A", "B", "C", "D01" };
            List<Tuple<List<dt_stationinfo>, int>> responseData = new List<Tuple<List<dt_stationinfo>, int>>();
            foreach (string code in stationCodes)
            {
                var data = dsta.Find(_ => true).Where(a => a.stationCode.Contains(code)).OrderBy(a => a.stationCode).ToList();
                int inst = dsta.Find(_ => true).Where(a => a.stationCode.Contains(code)).GroupBy(a => a.line).Count();
                responseData.Add(Tuple.Create(data, inst));
            }
            content.Data = responseData;
            return content;
        }
        public WebResponseContent pcs_dt_stationinfolist()
        {
            WebResponseContent content = new WebResponseContent();
            VOLContext volContext = new VOLContext();
            Idt_stationinfoRepository dsta = new dt_stationinfoRepository(volContext);
            string[] stationCodes = { "X01", "X02", "X03", "S", "DD001" };
            List<Tuple<List<dt_stationinfo>>> responseData = new List<Tuple<List<dt_stationinfo>>>();
            foreach (string code in stationCodes)
            {
                var data = dsta.Find(_ => true).Where(a => a.stationCode.Contains(code)).OrderBy(a => a.stationCode).ToList();
                responseData.Add(Tuple.Create(data));
            }
            content.Data = responseData;
            return content;
        }
    }
}