コード例 #1
0
        public DataResult GetCurrentWarning([FromQuery] int wId, int sId, WarningType type, WarningDataType dataType)
        {
            wId = wId == 0 ? 1 : wId;
            var result = new DataResult();

            if (HWarningHelper.CurrentData != null && HWarningHelper.CurrentData.Any())
            {
                var r = sId == 0 ? HWarningHelper.CurrentData.Where(x => x.Key.Item3 == dataType && x.Key.Item4 == type).Select(y => y.Value)
                    : HWarningHelper.CurrentData.Where(x => x.Key.Item3 == dataType && x.Key.Item4 == type).Where(y => y.Value.SetId == sId).Select(z => z.Value);
                if (r.Any())
                {
                    var sets       = WarningSetHelper.GetMenus(wId, r.Select(x => x.SetId));
                    var devices    = DeviceHelper.GetMenus(wId, r.Select(x => x.DeviceId));
                    var categories = DeviceCategoryHelper.GetMenus(wId, r.Select(x => x.CategoryId));
                    //var classes = ServerConfig.ApiDb.Query<DeviceClass>("SELECT `Id`, `Class` FROM `device_class` WHERE `MarkedDelete` = 0 AND Id IN @Id;", new
                    //{
                    //    Id = data.Select(x => x.ClassId)
                    //});
                    foreach (var current in r.OrderBy(x => x.ItemId).ThenBy(x => x.DeviceId))
                    {
                        var d = ClassExtension.ParentCopyToChild <WarningCurrent, WarningCurrentDetail>(current);
                        d.SetName = sets.FirstOrDefault(x => x.Id == d.SetId)?.Name ?? "";
                        d.Code    = devices.FirstOrDefault(x => x.Id == d.DeviceId)?.Code ?? "";
                        //d.Class = classes.FirstOrDefault(x => x.Id == d.ClassId)?.Class ?? "";
                        d.CategoryName = categories.FirstOrDefault(x => x.Id == d.CategoryId)?.Name ?? "";
                        result.datas.Add(d);
                    }
                }
            }
            return(result);
        }
        public Result CancelDeviceOperateSchedule([FromBody] DeviceOperateSchedule schedule)
        {
            var qId = schedule.Id;
            var old = DeviceOperateScheduleHelper.GetOpDetail(qId);

            if (old == null)
            {
                return(Result.GenError <Result>(Error.DeviceOperateScheduleNotExist));
            }
            //if (old.OperatorId != schedule.OperatorId)
            //{
            //    return Result.GenError<Result>(Error.DeviceOperateScheduleOperatorError);
            //}
            if (old.State != DeviceOperateScheduleState.未开始)
            {
                return(Result.GenError <Result>(Error.DeviceOperateScheduleNotWait));
            }

            var optor = schedule.OperatorId != 0 ? DeviceOperateOperatorHelper.GetDetail(schedule.OpId, schedule.OperatorId) : null;

            schedule.OperatorId = optor?.Id ?? 0;
            var userId         = Request.GetIdentityInformation();
            var markedDateTime = DateTime.Now;

            old.MarkedDateTime = markedDateTime;
            var log = ClassExtension.CopyTo <DeviceOperateScheduleDetail, DeviceOperateLog>(old);

            log.Type         = DeviceOperateLogType.延后;
            log.CreateUserId = userId;
            log.EndTime      = markedDateTime;
            DeviceOperateScheduleHelper.BackSchedule(old);
            DeviceOperateLogHelper.Instance.Add(log);
            return(Result.GenError <Result>(Error.Success));
        }
コード例 #3
0
 static void PrintAll <T>() where T : ClassExtension
 {
     foreach (var elem in ClassExtension.GetAll <T>())
     {
         Console.WriteLine(elem);
     }
 }
        public Result CompleteDeviceOperateSchedule([FromBody] DeviceOperateSchedule schedule)
        {
            var qId = schedule.Id;
            var old = DeviceOperateScheduleHelper.GetOpDetail(qId);

            if (old == null)
            {
                return(Result.GenError <Result>(Error.DeviceOperateScheduleNotExist));
            }
            var opr = DeviceOperateOperatorHelper.GetDetail(schedule.OpId, schedule.OperatorId);

            if (opr == null)
            {
                return(Result.GenError <Result>(Error.DeviceOperateOperatorNotExist));
            }
            schedule.OperatorId = opr.Id;
            if (old.OperatorId != schedule.OperatorId)
            {
                return(Result.GenError <Result>(Error.DeviceOperateScheduleOperatorError));
            }
            if (old.State == DeviceOperateScheduleState.未开始)
            {
                return(Result.GenError <Result>(Error.DeviceOperateScheduleNotStart));
            }

            var optor = DeviceOperateOperatorHelper.Instance.Get <DeviceOperateOperator>(schedule.OperatorId);

            if (optor == null)
            {
                return(Result.GenError <Result>(Error.DeviceOperateOperatorIsExist));
            }
            var userId         = Request.GetIdentityInformation();
            var markedDateTime = DateTime.Now;

            if (old.State == DeviceOperateScheduleState.进行中)
            {
                var total = (int)(markedDateTime - old.StartTime).TotalSeconds;
                old.OpCost += total;
            }
            else if (old.State == DeviceOperateScheduleState.已暂停)
            {
                var total = (int)(markedDateTime - old.StartTime).TotalSeconds;
                old.OpCost += total;
            }
            old.MarkedDateTime = markedDateTime;
            old.EndTime        = markedDateTime;
            old.EndCount++;
            var log = ClassExtension.CopyTo <DeviceOperateScheduleDetail, DeviceOperateLog>(old);

            log.CreateUserId = userId;
            log.Type         = DeviceOperateLogType.完成;
            old.LastLogId    = DeviceOperateLogHelper.Instance.AddBackId(log);
            DeviceOperateScheduleHelper.CompleteSchedule(old);
            return(Result.GenError <Result>(Error.Success));
        }
        public Result StartDeviceOperateSchedule([FromBody] DeviceOperateSchedule schedule)
        {
            var qId = schedule.Id;
            var old = DeviceOperateScheduleHelper.GetOpDetail(qId);

            if (old == null)
            {
                return(Result.GenError <Result>(Error.DeviceOperateScheduleNotExist));
            }
            var opr = DeviceOperateOperatorHelper.GetDetail(schedule.OpId, schedule.OperatorId);

            if (opr == null)
            {
                return(Result.GenError <Result>(Error.DeviceOperateOperatorNotExist));
            }
            schedule.OperatorId = opr.Id;
            if (old.OperatorId != schedule.OperatorId)
            {
                return(Result.GenError <Result>(Error.DeviceOperateScheduleOperatorError));
            }
            if (old.State == DeviceOperateScheduleState.进行中)
            {
                return(Result.GenError <Result>(Error.DeviceOperateScheduleDoing));
            }

            var userId         = Request.GetIdentityInformation();
            var markedDateTime = DateTime.Now;

            if (old.State == DeviceOperateScheduleState.已暂停)
            {
                var total = (int)(markedDateTime - old.PauseTime).TotalSeconds;
                old.PauseCost += total;
            }
            old.MarkedDateTime = markedDateTime;
            old.FirstStartTime = old.FirstStartTime == default(DateTime) ? markedDateTime : old.FirstStartTime;
            old.StartTime      = markedDateTime;
            old.StartCount++;
            old.Remark = schedule.Remark ?? old.Remark;
            var log = ClassExtension.CopyTo <DeviceOperateScheduleDetail, DeviceOperateLog>(old);

            log.CreateUserId = userId;
            log.Type         = DeviceOperateLogType.开始;
            DeviceOperateScheduleHelper.StartSchedule(old);
            DeviceOperateLogHelper.Instance.Add(log);
            return(Result.GenError <Result>(Error.Success));
        }
        public Result ConfirmDeviceOperateSchedule([FromBody] DeviceOperateSchedule schedule)
        {
            var qId = schedule.Id;
            var old = DeviceOperateScheduleHelper.GetOpDetail(qId);

            if (old == null)
            {
                return(Result.GenError <Result>(Error.DeviceOperateScheduleNotExist));
            }

            //if (old.OperatorId != schedule.OperatorId)
            //{
            //    return Result.GenError<Result>(Error.DeviceOperateScheduleOperatorError);
            //}
            if (old.State != DeviceOperateScheduleState.待检验)
            {
                return(Result.GenError <Result>(Error.DeviceOperateScheduleNotComplete));
            }

            var userId         = Request.GetIdentityInformation();
            var account        = AccountInfoHelper.GetAccountInfoByAccount(userId);
            var markedDateTime = DateTime.Now;

            old.MarkedDateTime = markedDateTime;
            old.Remark         = schedule.Remark ?? old.Remark;
            old.ConfirmId      = account?.Id ?? 0;
            old.ConfirmTime    = markedDateTime;
            old.IsPass         = schedule.IsPass;
            if (old.IsPass)
            {
                old.PassCount++;
            }
            else
            {
                old.FailCount++;
            }

            var log = ClassExtension.CopyTo <DeviceOperateScheduleDetail, DeviceOperateLog>(old);

            log.CreateUserId = userId;
            log.Type         = DeviceOperateLogType.检验;
            log.Id           = old.LastLogId;
            DeviceOperateScheduleHelper.ConfirmSchedule(old, log);
            return(Result.GenError <Result>(Error.Success));
        }
コード例 #7
0
        /// <summary>
        /// 获取常用脚本
        /// </summary>
        /// <param name="scriptIds"></param>
        /// <param name="variableNameIds"></param>
        /// <param name="variableTypeIds">类型</param>
        /// <returns></returns>
        public static IEnumerable <UsuallyDictionary> GetUsuallyDictionaries(IEnumerable <int> scriptIds
                                                                             , IEnumerable <int> variableNameIds = null, IEnumerable <int> variableTypeIds = null)
        {
            var sIds = new List <int> {
                0
            };

            sIds.AddRange(scriptIds);
            var args = new List <Tuple <string, string, dynamic> >
            {
                new Tuple <string, string, dynamic>("ScriptId", "IN", sIds.Distinct())
            };

            if (variableNameIds != null && variableNameIds.Any())
            {
                args.Add(new Tuple <string, string, dynamic>("VariableNameId", "IN", variableNameIds.Distinct()));
            }
            if (variableTypeIds != null && variableTypeIds.Any())
            {
                args.Add(new Tuple <string, string, dynamic>("VariableTypeId", "IN", variableTypeIds.Distinct()));
            }
            var data  = Instance.CommonGet <UsuallyDictionary>(args);
            var tData = new List <UsuallyDictionary>();

            foreach (var scriptId in scriptIds)
            {
                var tmp  = data.Where(x => x.ScriptId == 0 || x.ScriptId == scriptId);
                var tTmp = tmp.OrderByDescending(x => x.ScriptId).GroupBy(y => new { y.VariableNameId }).Select(z => z.First());
                tData.AddRange(tTmp.Select(x =>
                {
                    var y      = ClassExtension.CopyTo <UsuallyDictionary, UsuallyDictionary>(x);
                    y.ScriptId = scriptId;
                    return(y);
                }));
            }
            return(tData);
        }
コード例 #8
0
        public Result PutRawMaterial([FromBody] RawMaterial rawMaterial)
        {
            if (rawMaterial == null)
            {
                return(Result.GenError <Result>(Error.ParamError));
            }
            if (rawMaterial.RawMaterialName.IsNullOrEmpty())
            {
                return(Result.GenError <Result>(Error.RawMaterialNotExist));
            }

            var sames = new List <string> {
                rawMaterial.RawMaterialName
            };
            var ids = new List <int> {
                rawMaterial.Id
            };

            if (RawMaterialHelper.GetHaveSame(sames, ids))
            {
                return(Result.GenError <Result>(Error.RawMaterialIsExist));
            }

            var data = RawMaterialHelper.Instance.Get <RawMaterial>(rawMaterial.Id);

            if (data == null)
            {
                return(Result.GenError <Result>(Error.RawMaterialNotExist));
            }

            var createUserId = Request.GetIdentityInformation();
            var time         = DateTime.Now;
            var change       = false;

            //if (rawMaterial.RawMaterialSpecifications.Any())
            {
                var specifications = rawMaterial.Specifications;
                foreach (var specification in specifications)
                {
                    specification.RawMaterialId  = rawMaterial.Id;
                    specification.CreateUserId   = createUserId;
                    specification.MarkedDateTime = time;
                }
                if (specifications.Any(x => x.Id == 0))
                {
                    change = true;
                    RawMaterialSpecificationHelper.Instance.Add(specifications.Where(x => x.Id == 0));
                }

                var existSpecifications =
                    RawMaterialSpecificationHelper.Instance.GetFromParent <RawMaterialSpecification>(rawMaterial.Id);
                var updateSpecifications = specifications.Where(x => x.Id != 0 &&
                                                                existSpecifications.Any(y => y.Id == x.Id && (y.SpecificationName != x.SpecificationName || y.SpecificationValue != x.SpecificationValue))).ToList();
                updateSpecifications.AddRange(existSpecifications.Where(x => specifications.All(y => x.Id != y.Id)).Select(x =>
                {
                    x.MarkedDateTime = DateTime.Now;
                    x.MarkedDelete   = true;
                    return(x);
                }));

                if (updateSpecifications.Any())
                {
                    change = true;
                    RawMaterialSpecificationHelper.Instance.Update <RawMaterialSpecification>(updateSpecifications);
                }
            }

            if (change || ClassExtension.HaveChange(rawMaterial, data))
            {
                rawMaterial.MarkedDateTime = time;
                RawMaterialHelper.Instance.Update(rawMaterial);
            }
            return(Result.GenError <Result>(Error.Success));
        }
コード例 #9
0
        public object GetSet([FromQuery] bool init = false, int wId = 1, int qId = 0, int page = 0)
        {
            var workshop = WorkshopHelper.Instance.Get <Workshop>(wId);

            if (init)
            {
                var data = MonitoringKanBanSetHelper.GetDetail(wId).ToList();
                data.Insert(0, new MonitoringKanBanSet
                {
                    Id     = 0,
                    Name   = "所有设备",
                    Type   = KanBanEnum.设备详情看板,
                    Order  = -1,
                    IsShow = true
                });
                var item = MonitoringKanBanSetHelper.Instance.Configs.ToDictionary(c => (int)c.Key, c =>
                {
                    foreach (var v in c.Value)
                    {
                        v.FieldList = v.FieldList.Select((x, i) => MonitoringKanBanSetHelper.ConvertFieldConfig(x, i, v.Display != KanBanItemDisplayEnum.Chart)).ToList();
                    }
                    return(c.Value);
                });
                foreach (var d in data)
                {
                    if (d.Type != KanBanEnum.生产相关看板)
                    {
                        continue;
                    }

                    var t = new List <KanBanItemSet>();
                    foreach (var list in d.ItemList)
                    {
                        var configs = MonitoringKanBanSetHelper.Instance.Configs[d.Type];
                        var config  = configs.FirstOrDefault(x => x.Item == list.Item);
                        if (config == null)
                        {
                            continue;
                        }
                        if ((list.FieldList == null || !list.FieldList.Any()) && MonitoringKanBanSetHelper.Instance.Configs.ContainsKey(d.Type))
                        {
                            list.FieldList = (config.FieldList.Select((x, i) => MonitoringKanBanSetHelper.ConvertFieldSet(x, i, config.Display != KanBanItemDisplayEnum.Chart)).ToList());
                        }
                        else if (list.FieldList.Count != config.FieldList.Count && config.FieldList.Any(x => list.FieldList.All(y => y.Field != x.Field)))
                        {
                            var fieldList = new List <KanBanTableFieldSet>();
                            for (var i = 0; i < config.FieldList.Count; i++)
                            {
                                var order  = i + 1;
                                var field  = config.FieldList[i];
                                var sField = list.FieldList.FirstOrDefault(x => x.Field == field.Field);
                                if (sField != null)
                                {
                                    //sField.Order = order;
                                    fieldList.Add(sField);
                                }
                                else
                                {
                                    fieldList.Add(MonitoringKanBanSetHelper.ConvertFieldSet(field, order,
                                                                                            config.Display != KanBanItemDisplayEnum.Chart));
                                }
                            }
                            list.FieldList = fieldList;
                        }
                        t.Add(list);
                    }

                    d.Items = t.ToJSON();
                }

                return(new
                {
                    errno = 0,
                    errmsg = "成功",
                    menu = EnumHelper.EnumToList <KanBanEnum>().Select(x => new { Id = x.EnumValue, Type = x.EnumName }),
                    item,
                    shift = EnumHelper.EnumToList <KanBanShiftsEnum>(true).Select(x => new { Id = x.EnumValue, Type = x.EnumName }),
                    //data
                    data = data.Select(x =>
                    {
                        var t = ClassExtension.CopyTo <MonitoringKanBanSet, MonitoringKanBanSetWeb>(x);
                        t.DeviceIdList = x.DeviceIdList;
                        t.VariableList = x.VariableList;
                        t.ItemList = x.ItemList.Select(y =>
                        {
                            var ty = ClassExtension.CopyTo <KanBanItemSet, KanBanItemSetWeb>(y);
                            ty.FieldList = y.FieldList;
                            ty.ConfigList = y.ConfigList;
                            return ty;
                        }).ToList();
                        return t;
                    })
                });
            }

            var set = qId != 0 ? MonitoringKanBanSetHelper.Instance.Get <MonitoringKanBanSet>(qId) : new MonitoringKanBanSet
            {
                Type = KanBanEnum.设备详情看板
            };

            if (set != null)
            {
                MonitoringKanBan kanBan;
                var key = new Tuple <int, int>(set.Id, set.WorkshopId);
                switch (set.Type)
                {
                case KanBanEnum.设备详情看板:
                    kanBan = HKanBanHelper.MonitoringKanBanDic.ContainsKey(key)
                            ? HKanBanHelper.MonitoringKanBanDic[key]
                            : new MonitoringKanBan();
                    return(new
                    {
                        errno = 0,
                        errmsg = "成功",
                        type = set.Type,
                        time = kanBan?.Time ?? DateTime.Now,
                        data = kanBan
                    });

                case KanBanEnum.设备状态看板:
                    #region 设备状态看板
                {
                    var ret = new MonitoringKanBan();
                    page = page < 0 ? 0 : page;
                    var idList = set.DeviceIdList;
                    var deviceLibraryDetails = ServerConfig.ApiDb.Query <DeviceDetail>(
                        "SELECT a.*, b.ModelName, b.CategoryId, b.CategoryName, c.FirmwareName, d.ApplicationName, e.HardwareName, f.SiteName, f.Region, " +
                        "g.ScriptName, IFNULL(h.`Name`, '')  AdministratorName, i.`Class`, j.FlowCardId, j.FlowCard, j.LastFlowCardId, j.LastFlowCard, j.StartTime FROM device_library a " +
                        $"JOIN device_model_all b ON a.ModelId = b.Id " +
                        "JOIN firmware c ON a.FirmwareId = c.Id " +
                        "JOIN application d ON a.ApplicationId = d.Id " +
                        "JOIN hardware e ON a.HardwareId = e.Id " +
                        "JOIN site f ON a.SiteId = f.Id " +
                        "JOIN script_version g ON a.ScriptId = g.Id " +
                        "LEFT JOIN (SELECT * FROM(SELECT * FROM maintainer ORDER BY MarkedDelete)a GROUP BY a.Account) h ON a.Administrator = h.Account " +
                        "JOIN device_class i ON a.ClassId = i.Id " +
                        "JOIN `npc_proxy_link` j ON a.Id = j.DeviceId " +
                        $"WHERE a.`MarkedDelete` = 0" +
                        $"{(idList.Any() ? " AND a.Id IN @idList" : "")}" +
                        $" ORDER BY a.Id;", new { idList }).ToDictionary(x => x.Id);

                    var faultDevices = ServerConfig.ApiDb.Query <dynamic>(
                        $"SELECT * FROM (SELECT a.* FROM `fault_device_repair` a " +
                        $"JOIN `device` b ON a.DeviceId = b.Id " +
                        $"WHERE a.`State` != @state" +
                        $"{(idList.Any() ? " AND a.DeviceId IN @idList" : "")}" +
                        $" AND a.MarkedDelete = 0 ORDER BY a.DeviceId, a.State DESC ) a GROUP BY DeviceCode;",
                        new { state = RepairStateEnum.Complete, idList });
                    foreach (var faultDevice in faultDevices)
                    {
                        var device = deviceLibraryDetails.Values.FirstOrDefault(x => x.Id == faultDevice.DeviceId);
                        if (device != null)
                        {
                            device.RepairState = faultDevice.State;
                        }
                    }

                    var url = ServerConfig.GateUrl + UrlMappings.Urls[UrlMappings.deviceListGate];
                    //向GateProxyLink请求数据
                    var resp = !idList.Any() ? HttpServer.Get(url) :
                               HttpServer.Get(url, new Dictionary <string, string>
                        {
                            { "ids", idList.Join() }
                        });
                    DeviceResult dataResult = null;
                    if (resp != "fail")
                    {
                        try
                        {
                            dataResult = JsonConvert.DeserializeObject <DeviceResult>(resp);
                            if (dataResult.errno == Error.Success)
                            {
                                foreach (var deviceInfo in dataResult.datas)
                                {
                                    var deviceId = deviceInfo.DeviceId;
                                    if (deviceLibraryDetails.ContainsKey(deviceId))
                                    {
                                        deviceLibraryDetails[deviceId].State       = deviceInfo.State;
                                        deviceLibraryDetails[deviceId].DeviceState = deviceInfo.DeviceState;
                                        if (deviceLibraryDetails[deviceId].DeviceState == DeviceState.Waiting &&
                                            deviceLibraryDetails[deviceId].StartTime != default(DateTime) &&
                                            deviceLibraryDetails[deviceId].TotalTime <= HKanBanHelper.IdleSecond)
                                        {
                                            deviceLibraryDetails[deviceId].DeviceState = DeviceState.Readying;
                                        }
                                    }
                                }
                            }
                        }
                        catch (Exception e)
                        {
                            Log.Error($"{UrlMappings.Urls[UrlMappings.deviceListGate]},信息:{e}");
                        }
                    }

                    //var data = deviceLibraryDetails.Values.All(x => int.TryParse(x.Code, out _))
                    //    ? deviceLibraryDetails.Values.OrderByDescending(x => x.DeviceState).ThenByDescending(x => x.DeviceStateStr).ThenBy(x => int.Parse(x.Code))
                    //    : deviceLibraryDetails.Values.OrderByDescending(x => x.DeviceState).ThenByDescending(x => x.DeviceStateStr).ThenBy(x => x.Code);

                    var allDevices = deviceLibraryDetails.Values.OrderBy(x => int.TryParse(x.Code, out var a) ? a : 9999999).ThenBy(x => x.Code).ToList();

                    var sum   = allDevices.Count;
                    var gz    = allDevices.Count(x => x.RepairState != -1);
                    var other = allDevices.Where(x => x.RepairState == -1);
                    var zc    = other.Count(x => x.DeviceState == DeviceState.Processing)
                                + other.Count(x => x.DeviceState == DeviceState.Restart)
                                + other.Count(x => x.DeviceState == DeviceState.UpgradeFirmware)
                                + other.Count(x => x.DeviceState == DeviceState.UpgradeScript)
                                + other.Count(x => x.DeviceState == DeviceState.Readying)
                                + other.Count(x => x.DeviceState == DeviceState.Waiting);
                    var jg  = other.Count(x => x.DeviceState == DeviceState.Processing);
                    var zb  = other.Count(x => x.DeviceState == DeviceState.Readying);
                    var xz  = other.Count(x => x.DeviceState == DeviceState.Waiting);
                    var wlj = sum - zc;
                    var tp  = (int)Math.Ceiling((decimal)sum / (set.Length <= 0 ? 30 : set.Length));
                    if (page >= tp)
                    {
                        page = 0;
                    }
                    var devices              = allDevices.Skip(set.Length * page).Take(set.Length);
                    var scriptIds            = devices.Select(y => y.ScriptId);
                    var dataNameDictionaries = scriptIds.Any() ? DataNameDictionaryHelper.GetDataNameDictionaryDetails(scriptIds) : new List <DataNameDictionaryDetail>();
                    ret.Id = qId;

                    foreach (var device in devices)
                    {
                        var t  = ClassExtension.ParentCopyToChild <DeviceDetail, MonitoringSetData>(device);
                        var vs = set.VariableList.OrderBy(x => x.Order);

                        DeviceData deviceData = null;
                        if (dataResult != null &&
                            dataResult.datas.Any(d => d.Id == device.Id) &&
                            dataResult.datas.First(d => d.Id == device.Id).DeviceData != null)
                        {
                            deviceData = dataResult.datas.First(d => d.Id == device.Id).DeviceData;
                        }

                        //if (device.RepairState != -1 && device.State != SocketState.Connected)
                        //{
                        //    deviceLibraryDetails[deviceId].in
                        //}
                        //else
                        //{
                        //    FlowCard fc = null;
                        //    if (int.TryParse(device.FlowCard, out var id))
                        //    {
                        //        fc = flowCards.FirstOrDefault(x => x.Id == id);
                        //    }
                        //    deviceLibraryDetails[deviceId].FlowCard = fc?.Card ?? "";
                        //}

                        foreach (var x in vs)
                        {
                            var dn = dataNameDictionaries.FirstOrDefault(d =>
                                                                         d.VariableTypeId == x.VariableTypeId && d.PointerAddress == x.PointerAddress);

                            ////设备状态
                            //var stateDId = 1;
                            ////总加工次数
                            //var processCountDId = 63;
                            ////总加工时间
                            //var processTimeDId = 64;
                            ////当前加工流程卡号
                            //var currentFlowCardDId = 6;
                            ////累积运行总时间
                            //var runTimeDId = 5;

                            if (dn == null)
                            {
                                continue;
                            }

                            var r = new MonitoringSetSingleDataDetail
                            {
                                Order     = x.Order,
                                SubOrder  = x.SubOrder,
                                Delimiter = x.Delimiter,
                                Sid       = x.ScriptId,
                                Type      = x.VariableTypeId,
                                Add       = x.PointerAddress,
                                VName     = x.VariableName.IsNullOrEmpty() ? dn.VariableName ?? "" : x.VariableName,
                            };

                            if (dn.VariableTypeId == 1 && dn.VariableNameId == AnalysisHelper.stateDId)
                            {
                                r.V = device.DeviceStateStr;
                            }
                            else if (deviceData != null)
                            {
                                List <int> bl = null;
                                switch (x.VariableTypeId)
                                {
                                case 1: bl = deviceData.vals; break;

                                case 2: bl = deviceData.ins; break;

                                case 3: bl = deviceData.outs; break;

                                default: break;
                                }

                                if (bl != null)
                                {
                                    if (bl.Count > x.PointerAddress - 1)
                                    {
                                        var chu = Math.Pow(10, dn.Precision);
                                        var v   = (decimal)(bl.ElementAt(x.PointerAddress - 1) / chu);
                                        if (dn.VariableTypeId == 1 && (dn.VariableNameId == AnalysisHelper.flowCardDId || dn.VariableNameId == AnalysisHelper.nextFlowCardDId))
                                        {
                                            //var flowCard = FlowCardHelper.Instance.Get<FlowCard>((int)v);
                                            //r.V = flowCard?.Card ?? "";
                                            r.V = device.LastFlowCard;
                                        }
                                        else if (dn.VariableTypeId == 1 && dn.VariableNameId == AnalysisHelper.currentProductDId)
                                        {
                                            //var production = ProductionHelper.Instance.Get<Production>((int)v);
                                            //r.V = production?.ProductionName ?? "";

                                            var production = ProductionHelper.GetProduction(device.LastFlowCardId);
                                            r.V = production?.Name ?? "";
                                        }
                                        else
                                        {
                                            r.V = v.ToString();
                                        }
                                    }
                                }
                            }
                            t.Data.Add(r);
                        }
                        ret.MSetData.Add(t);
                    }
                    var monitoringProcesses = new List <MonitoringProcess>();
                    //monitoringProcesses.AddRange(AnalysisHelper.GetMonitoringProcesses(idList));
                    //if (!monitoringProcesses.Any())
                    //{
                    //    monitoringProcesses.AddRange(ServerConfig.ApiDb.Query<MonitoringProcess>(
                    //        "SELECT b.*, c.CategoryId, c.CategoryName, a.`Code`, a.`ScriptId` FROM `device` a " +
                    //        "JOIN `npc_proxy_link` b ON a.Id = b.DeviceId " +
                    //        "JOIN (SELECT a.*, b.CategoryName FROM `device_model` a " +
                    //        "JOIN `device_category` b ON a.CategoryId = b.Id) c ON a.ModelId = c.Id WHERE a.Id in @idList AND a.MarkedDelete = 0;", new { idList }));
                    //}
                    monitoringProcesses.AddRange(AnalysisHelper.GetMonitoringProcesses(wId, idList));
                    if (!monitoringProcesses.Any())
                    {
                        monitoringProcesses.AddRange(ServerConfig.ApiDb.Query <MonitoringProcess>(
                                                         "SELECT b.*, c.CategoryId, c.CategoryName, a.`Code`, a.`ScriptId` FROM `device` a " +
                                                         "JOIN `npc_proxy_link` b ON a.Id = b.DeviceId " +
                                                         "JOIN device_model_all c ON a.ModelId = c.Id WHERE a.Id in @idList AND a.MarkedDelete = 0;"));
                    }
                    var timeRate    = new List <decimal>();
                    var processTime = monitoringProcesses.Sum(x => x.ProcessTime);
                    var runTime     = monitoringProcesses.Sum(x => x.RunTime);
                    var rate        = runTime > 0 ? (processTime * 100m / (runTime)).ToRound() : 0;
                    timeRate.Add(rate);
                    timeRate.AddRange(workshop.StatisticTimeList.Select((_, i) =>
                        {
                            var p = monitoringProcesses.Where(x => x.ExtraData.Parts.Count > i).Sum(y => y.ExtraData.Parts.FirstOrDefault(x => x.Shift == i)?.ProcessTime ?? 0);
                            var r = monitoringProcesses.Where(x => x.ExtraData.Parts.Count > i).Sum(y => y.ExtraData.Parts.FirstOrDefault(x => x.Shift == i)?.RunTime ?? 0);
                            return(r > 0 ? (p * 100m / (r)).ToRound() : 0);
                        }));

                    //var now = DateTime.Now;
                    //var currentWorkTime = DateTimeExtend.GetDayWorkTimeRanges(workshop.Shifts, workshop.StatisticTimeList, now);
                    //var workTime = DateTimeExtend.GetDayWorkDay(workshop.ShiftTimeList, now);
                    //var reports = FlowCardReportGetHelper.GetReport(wId, workTime.Item1, workTime.Item2, 18).ToList();
                    var qualifiedRate = new List <decimal>();
                    //var qualified = reports.Sum(x => x.HeGe);
                    //var total = reports.Sum(x => x.Total);
                    var qualified = monitoringProcesses.Sum(y => y.DayQualified);
                    var total     = monitoringProcesses.Sum(x => x.DayTotal);
                    rate = total > 0 ? (qualified * 100m / (total)).ToRound() : 0;
                    qualifiedRate.Add(rate);
                    qualifiedRate.AddRange(workshop.StatisticTimeList.Select((range, i) =>
                        {
                            //var p = reports.Where(x => x.Time.InSameRange(range)).Sum(y => y.HeGe);
                            //var r = reports.Where(x => x.Time.InSameRange(range)).Sum(y => y.Total);
                            var p = monitoringProcesses.Where(x => x.ExtraData.Parts.Count > i).Sum(y => y.ExtraData.Parts.FirstOrDefault(x => x.Shift == i)?.DayQualified ?? 0);
                            var r = monitoringProcesses.Where(x => x.ExtraData.Parts.Count > i).Sum(y => y.ExtraData.Parts.FirstOrDefault(x => x.Shift == i)?.DayTotal ?? 0);
                            return(r > 0 ? (p * 100m / (r)).ToRound() : 0);
                        }));

                    return(new
                        {
                            errno = 0,
                            errmsg = "成功",
                            type = set.Type,
                            time = DateTime.Now,
                            jg,
                            zc,
                            zb,
                            xz,
                            gz,
                            wlj,
                            sum,
                            timeRate,
                            qualifiedRate,
                            row = set.Row,
                            col = set.Col,
                            cCol = set.ContentCol,
                            cName = set.ColNameList,
                            len = set.Length,
                            cp = page,
                            tp,
                            data = ret.MSetData
                        });
                }

                    #endregion
                case KanBanEnum.生产相关看板:
                    #region 生产相关看板
                    kanBan = HKanBanHelper.MonitoringKanBanDic.ContainsKey(key)
                            ? HKanBanHelper.MonitoringKanBanDic[key]
                            : new MonitoringKanBan();
                    return(new
                    {
                        errno = 0,
                        errmsg = "成功",
                        type = set.Type,
                        time = kanBan?.Time ?? DateTime.Now,
                        items = set.ItemList.Select(y =>
                        {
                            var ty = ClassExtension.CopyTo <KanBanItemSet, KanBanItemSetWeb>(y);
                            ty.FieldList = y.FieldList;
                            return ty;
                        }).ToList(),
                        colSet = set.ColSet,
                        data = kanBan?.ItemData ?? new Dictionary <string, List <dynamic> >()
                    });

                    #endregion
                }
            }

            return(new
            {
                errno = 0,
                type = 0,
                errmsg = "成功",
                time = DateTime.Now,
            });
        }
コード例 #10
0
 public void Visit(ClassExtension n)
 {
     Helpers.WriteLine($"{_tab}{n.Text} ({n.Name}) [{n.Location.StartLine}, {n.Location.StartColumn}]");
 }
コード例 #11
0
        public object IncreaseMaterial([FromBody] IncreaseMaterial materialManagement)
        {
            if (materialManagement.Bill == null)
            {
                return(Result.GenError <Result>(Error.ParamError));
            }

            foreach (var bill in materialManagement.Bill)
            {
                bill.Type = bill.HaveBatch ? MaterialOp.退库 : MaterialOp.入库;
                bill.CorrectNumber();
            }
            var mBills = materialManagement.Bill.Where(x => x.Number > 0);

            if (!mBills.Any())
            {
                return(Result.GenError <Result>(Error.MaterialNotEmpty));
            }
            //退库时物料必须存在
            if (mBills.Any(x => x.Type == MaterialOp.退库 && x.BillId == 0))
            {
                return(Result.GenError <Result>(Error.MaterialBackNoBillError));
            }
            //退库必须指定批次
            if (mBills.Any(x => x.Type == MaterialOp.退库 && !x.HaveBatch))
            {
                return(Result.GenError <Result>(Error.MaterialBackNoBatchError));
            }
            var result   = new DataResult();
            var billIds  = mBills.Select(x => x.BillId).Where(x => x != 0).Distinct();
            var allBills = new Dictionary <int, Material>();

            if (billIds.Any())
            {
                allBills.AddRange(MaterialHelper.GetDetails(billIds).ToDictionary(x => x.BillId));
                if (allBills.Count() != billIds.Count())
                {
                    return(Result.GenError <Result>(Error.MaterialBillNotExist));
                }
            }

            var createUserId   = Request.GetIdentityInformation();
            var markedDateTime = DateTime.Now;

            #region 新货品
            var bills = mBills.Where(x => x.CategoryId == 0 || x.NameId == 0 || x.SpecificationId == 0 || x.BillId == 0);
            if (bills.Any())
            {
                if (bills.Any(x => x.CategoryId == 0 && x.Category.IsNullOrEmpty()) ||
                    bills.Any(x => x.NameId == 0 && x.Name.IsNullOrEmpty()) ||
                    bills.Any(x => x.SpecificationId == 0 && x.Specification.IsNullOrEmpty()))
                {
                    return(Result.GenError <DataResult>(Error.ParamError));
                }
                var sameCodes = bills.GroupBy(x => new { x.Category, x.Name, x.Specification })
                                .Where(x => x.Count() > 1)
                                .Select(x => bills.FirstOrDefault(y => x.Key.Category == y.Category && x.Key.Name == y.Name && x.Key.Specification == y.Specification)?.Code ?? "");
                if (sameCodes.Any())
                {
                    result.errno = Error.MaterialBillCategoryNameSpecificationDuplicate;
                    result.datas.AddRange(sameCodes);
                    return(result);
                }

                sameCodes = bills.GroupBy(x => x.Code).Where(y => y.Count() > 1).Select(z => z.Key);
                if (sameCodes.Any())
                {
                    result.errno = Error.MaterialBillDuplicate;
                    result.datas.AddRange(sameCodes);
                    return(result);
                }

                var codes = bills.Select(y => y.Code).Distinct();
                sameCodes = MaterialBillHelper.GetBills(codes).Select(x => x.Code);
                if (sameCodes.Any())
                {
                    result.errno = Error.MaterialBillIsExist;
                    result.datas.AddRange(sameCodes);
                    return(result);
                }

                foreach (var bill in bills)
                {
                    bill.BillId = 0;
                }

                var categoryIds = bills.Select(x => x.CategoryId).Where(x => x != 0).Distinct();
                var cnt         = MaterialCategoryHelper.Instance.GetCountByIds(categoryIds);
                if (cnt != categoryIds.Count())
                {
                    return(Result.GenError <DataResult>(Error.MaterialCategoryNotExist));
                }
                var nameIds = bills.Select(x => x.NameId).Where(x => x != 0).Distinct();
                cnt = MaterialNameHelper.Instance.GetCountByIds(nameIds);
                if (cnt != nameIds.Count())
                {
                    return(Result.GenError <DataResult>(Error.MaterialNameNotExist));
                }
                var specificationIds = bills.Select(x => x.SpecificationId).Where(x => x != 0).Distinct();
                cnt = MaterialSpecificationHelper.Instance.GetCountByIds(specificationIds);
                if (cnt != specificationIds.Count())
                {
                    return(Result.GenError <DataResult>(Error.MaterialSpecificationNotExist));
                }

                var siteIds = bills.Select(x => x.SiteId).Where(x => x != 0).Distinct();
                cnt = MaterialSiteHelper.Instance.GetCountByIds(siteIds);
                if (cnt != siteIds.Count())
                {
                    return(Result.GenError <DataResult>(Error.MaterialSiteNotExist));
                }

                if (categoryIds.Any() && nameIds.Any() && specificationIds.Any())
                {
                    sameCodes = MaterialBillHelper.GetBills(categoryIds, nameIds, specificationIds).Select(x => x.Code);
                    if (sameCodes.Any())
                    {
                        result.errno = Error.MaterialBillCategoryNameSpecificationDuplicate;
                        result.datas.AddRange(sameCodes);
                        return(result);
                    }
                }

                #region 新位置
                var notExistSite = bills.Where(x => x.SiteId == 0 && !x.Site.IsNullOrEmpty());
                var newSites     = notExistSite.Select(x => x.Site).Distinct();
                if (newSites.Any())
                {
                    var sameStr = MaterialSiteHelper.GetDetails(newSites);
                    if (sameStr.Any())
                    {
                        result.errno = Error.MaterialSiteIsExist;
                        result.datas.AddRange(sameStr);
                        return(result);
                    }
                }
                #endregion

                #region 新类别
                var notExistCategories = bills.Where(x => x.CategoryId == 0);
                var newCategories      = notExistCategories.Select(x => x.Category).Distinct();
                if (newCategories.Any())
                {
                    var sameStr = MaterialCategoryHelper.GetDetails(newCategories);
                    if (sameStr.Any())
                    {
                        result.errno = Error.MaterialCategoryIsExist;
                        result.datas.AddRange(sameStr);
                        return(result);
                    }
                }
                #endregion

                #region 新名称
                var notExistNames = bills.Where(x => x.NameId == 0);
                var newNames      = notExistNames.Select(x => x.Name).Distinct();
                if (newNames.Any())
                {
                    var sameStr = MaterialNameHelper.GetDetails(newNames);
                    if (sameStr.Any())
                    {
                        result.errno = Error.MaterialNameIsExist;
                        result.datas.AddRange(sameStr);
                        return(result);
                    }
                }
                #endregion

                #region 新规格
                var notExistSpecifications = bills.Where(x => x.SpecificationId == 0);
                var newSpecifications      = notExistSpecifications.Select(x => x.Specification).Distinct();
                if (newSpecifications.Any())
                {
                    var sameStr = MaterialSpecificationHelper.GetDetails(newSpecifications);
                    if (sameStr.Any())
                    {
                        result.errno = Error.MaterialSpecificationIsExist;
                        result.datas.AddRange(sameStr);
                        return(result);
                    }
                }
                #endregion

                #region 新
                if (newSites.Any())
                {
                    MaterialSiteHelper.Instance.Add(newSites.Select(x => new MaterialSite
                    {
                        CreateUserId   = createUserId,
                        MarkedDateTime = markedDateTime,
                        Site           = x
                    }));
                    var data = MaterialSiteHelper.GetDetails(newSites).ToDictionary(x => x.Site);
                    foreach (var bill in notExistSite)
                    {
                        var key = bill.Site;
                        if (data.ContainsKey(key))
                        {
                            bill.SiteId = data[key].Id;
                        }
                    }
                }

                if (newCategories.Any())
                {
                    MaterialCategoryHelper.Instance.Add(newCategories.Select(x => new MaterialCategory
                    {
                        CreateUserId   = createUserId,
                        MarkedDateTime = markedDateTime,
                        Category       = x
                    }));
                    var data = MaterialCategoryHelper.GetDetails(newCategories).ToDictionary(x => x.Category);
                    foreach (var bill in notExistCategories)
                    {
                        var key = bill.Category;
                        if (data.ContainsKey(key))
                        {
                            bill.CategoryId = data[key].Id;
                        }
                    }
                }

                if (newNames.Any())
                {
                    MaterialNameHelper.Instance.Add(newNames.Select(x => new MaterialName
                    {
                        CreateUserId   = createUserId,
                        MarkedDateTime = markedDateTime,
                        Name           = x
                    }));
                    var data = MaterialNameHelper.GetDetails(newNames).ToDictionary(x => x.Name);
                    foreach (var bill in notExistNames)
                    {
                        var key = bill.Name;
                        if (data.ContainsKey(key))
                        {
                            bill.NameId = data[key].Id;
                        }
                    }
                }

                if (newSpecifications.Any())
                {
                    MaterialSpecificationHelper.Instance.Add(newSpecifications.Select(x => new MaterialSpecification
                    {
                        CreateUserId   = createUserId,
                        MarkedDateTime = markedDateTime,
                        Specification  = x
                    }));
                    var data = MaterialSpecificationHelper.GetDetails(newSpecifications).ToDictionary(x => x.Specification);
                    foreach (var bill in notExistSpecifications)
                    {
                        var key = bill.Specification;
                        if (data.ContainsKey(key))
                        {
                            bill.SpecificationId = data[key].Id;
                        }
                    }
                }
                #endregion
            }

            bills = mBills.Where(x => x.BillId == 0);
            if (bills.Any())
            {
                foreach (var bill in bills)
                {
                    bill.CreateUserId   = createUserId;
                    bill.MarkedDateTime = markedDateTime;
                    bill.Remark         = bill.Remark ?? "";
                    bill.Images         = bill.Images ?? "[]";
                }
                MaterialBillHelper.Instance.Add(bills);
            }

            var billId_0 = mBills.Where(x => x.BillId == 0);
            if (billId_0.Any())
            {
                var billIds_0 = MaterialBillHelper.GetBills(billId_0.Select(x => x.Code)).ToDictionary(x => x.Code);
                foreach (var bill in billId_0)
                {
                    if (billIds_0.ContainsKey(bill.Code))
                    {
                        var exist = billIds_0[bill.Code];
                        bill.BillId = exist.Id;
                    }
                }
                allBills.AddRange(billIds_0.Values.ToDictionary(x => x.Id, x => (Material)x));
            }
            #endregion

            var oldBatches = new Dictionary <int, MaterialBatch>();
            var batchBills = mBills.Where(x => x.HaveBatch);
            //退库的批次
            if (batchBills.Any())
            {
                var bIds = batchBills.SelectMany(x => x.Batches.Select(y => y.Id)).Distinct();
                oldBatches.AddRange(MaterialBatchHelper.GetDetails(bIds).ToDictionary(x => x.Id));
                if (bIds.Count() != oldBatches.Count())
                {
                    return(Result.GenError <DataResult>(Error.MaterialBatchNotExist));
                }
                if (!batchBills.All(x => x.Batches.All(y => oldBatches.ContainsKey(y.Id) && oldBatches[y.Id].BillId == x.BillId)))
                {
                    return(Result.GenError <DataResult>(Error.MaterialBatchNotContain));
                }
                var mergeBatch = bIds.Select(x =>
                {
                    var oldBatch = oldBatches[x];
                    var batches  = batchBills.Where(y => y.BillId == oldBatch.BillId).SelectMany(y => y.Batches.Where(z => z.Id == oldBatch.Id));
                    return(new MaterialBatch
                    {
                        Id = oldBatch.Id,
                        BatchId = oldBatch.BatchId,
                        Batch = oldBatch.Batch,
                        BillId = oldBatch.BillId,
                        SupplierId = oldBatch.SupplierId,
                        Number = batches.Sum(y => y.Number),
                    });
                });

                var much = mergeBatch.Where(x => oldBatches[x.Id].Number - oldBatches[x.Id].Left < x.Number);
                if (much.Any())
                {
                    result = new DataResult {
                        errno = Error.ProductionPlanBillActualConsumeLess
                    };
                    result.datas.AddRange(much.Select(x => $"{x.Batch} {allBills[x.BillId].Code} {x.Supplier}"));
                    return(result);
                }
            }

            //计划退库
            var pBills    = mBills.Where(x => x.PlanId != 0);
            var plans     = new Dictionary <int, ProductPlan>();
            var planBills = new Dictionary <Tuple <int, int>, ProductPlanBill>();
            if (pBills.Any())
            {
                var actualPlanBill = pBills.Select(x => new OpMaterial
                {
                    PlanId        = x.PlanId,
                    BillId        = x.BillId,
                    Number        = pBills.Where(y => y.PlanId == x.PlanId && y.BillId == x.BillId).Sum(y => y.Number),
                    Purpose       = pBills.FirstOrDefault(y => y.PlanId == x.PlanId && y.BillId == x.BillId)?.Purpose ?? "",
                    RelatedPerson = pBills.FirstOrDefault(y => y.PlanId == x.PlanId && y.BillId == x.BillId)?.RelatedPerson ?? "",
                });
                var planIds = pBills.Select(x => x.PlanId).Distinct();
                plans.AddRange(ProductPlanHelper.Instance.GetAllByIds <ProductPlan>(planIds).ToDictionary(x => x.Id));
                var planBillIds = pBills.Select(x => x.BillId).Distinct();
                planBills.AddRange(ProductPlanBillHelper.GetPlanBills(planIds, planBillIds).ToDictionary(x => new Tuple <int, int>(x.PlanId, x.BillId)));
                var notExist = pBills.Where(x => !planBills.ContainsKey(new Tuple <int, int>(x.PlanId, x.BillId)));
                if (notExist.Any())
                {
                    result = new DataResult {
                        errno = Error.ProductionPlanBillNotExist
                    };
                    result.datas.AddRange(notExist.Where(x => plans.ContainsKey(x.PlanId) && allBills.ContainsKey(x.BillId)).Select(y => new { plans[y.PlanId].Plan, allBills[y.BillId].Code }));
                    return(result);
                }

                var notEnough = actualPlanBill.Where(x => planBills.ContainsKey(new Tuple <int, int>(x.PlanId, x.BillId)) &&
                                                     planBills[new Tuple <int, int>(x.PlanId, x.BillId)].ActualConsumption < x.Number);
                if (notEnough.Any())
                {
                    result = new DataResult {
                        errno = Error.ProductionPlanBillActualConsumeLess
                    };
                    result.datas.AddRange(notEnough.Where(x => plans.ContainsKey(x.PlanId) && allBills.ContainsKey(x.BillId)).Select(y => new { plans[y.PlanId].Plan, allBills[y.BillId].Code }));
                    return(result);
                }

                foreach (var bill in actualPlanBill)
                {
                    var key = new Tuple <int, int>(bill.PlanId, bill.BillId);
                    planBills[key].MarkedDateTime     = markedDateTime;
                    planBills[key].ActualConsumption -= bill.Number;
                }
            }

            var           noBatchBills = mBills.Where(x => !x.HaveBatch);
            var           newBatches   = new Dictionary <Tuple <int, int, int>, MaterialBatch>();
            MaterialBatch originBatch  = null;
            if (noBatchBills.Any())
            {
                var suppliers = noBatchBills.Select(x => x.Supplier).Distinct();
                var data      = MaterialSupplierHelper.GetDetails(suppliers).ToDictionary(x => x.Supplier);
                foreach (var bill in noBatchBills)
                {
                    var key = bill.Supplier;
                    if (data.ContainsKey(key))
                    {
                        bill.SupplierId = data[key].Id;
                    }
                }

                var newSuppliers = noBatchBills.Where(x => x.SupplierId == 0).Select(x => x.Supplier).Distinct();
                if (newSuppliers.Any())
                {
                    MaterialSupplierHelper.Instance.Add(newSuppliers.Select(x => new MaterialSupplier
                    {
                        CreateUserId   = createUserId,
                        MarkedDateTime = markedDateTime,
                        Supplier       = x
                    }));
                    data = MaterialSupplierHelper.GetDetails(newSuppliers).ToDictionary(x => x.Supplier);
                    foreach (var bill in noBatchBills)
                    {
                        var key = bill.Supplier;
                        if (data.ContainsKey(key))
                        {
                            bill.SupplierId = data[key].Id;
                        }
                    }
                }

                originBatch = MaterialBatchHelper.GetBatch(createUserId, markedDateTime);
                var addBatches = noBatchBills.GroupBy(x => new { x.BillId, x.SupplierId }).Select(x =>
                {
                    originBatch.BillId     = x.Key.BillId;
                    originBatch.SupplierId = x.Key.SupplierId;
                    var manage             = noBatchBills.First(y => x.Key.BillId == y.BillId && x.Key.SupplierId == y.SupplierId);
                    manage.Number          = noBatchBills.Where(y => x.Key.BillId == y.BillId && x.Key.SupplierId == y.SupplierId).Sum(a => a.Number);
                    return(new MaterialBatch(originBatch, manage));
                });

                MaterialBatchHelper.Instance.Add(addBatches);
                var bIds = addBatches.Select(x => x.BillId).Distinct();
                var sIds = addBatches.Select(x => x.SupplierId).Distinct();
                newBatches.AddRange(MaterialBatchHelper.GetDetails(originBatch.BatchId, bIds, sIds)
                                    .ToDictionary(x => new Tuple <int, int, int>(x.BatchId, x.BillId, x.SupplierId)));
            }

            #region 更新
            var existBills = MaterialHelper.GetDetails(billIds);
            foreach (var bill in existBills)
            {
                bill.Number += mBills.Where(x => x.BillId == bill.BillId).Sum(y => y.Number);
                bill.InTime  = markedDateTime;
            }

            MaterialHelper.Increase(existBills);
            #endregion

            #region 添加
            var addBill = mBills.Where(x => existBills.All(y => y.BillId != x.BillId));
            if (addBill.Any())
            {
                MaterialHelper.Instance.Add(addBill.GroupBy(y => y.BillId).Select(
                                                x => new
                {
                    BillId = x.Key,
                    InTime = markedDateTime,
                    Number = addBill.Where(z => z.BillId == x.Key).Sum(a => a.Number)
                }));
            }
            #endregion

            var logs = mBills.Select(x =>
            {
                var batches = new List <MaterialBatch>();
                //退库
                if (x.Type == MaterialOp.退库)
                {
                    batches.AddRange(x.Batches.Select(y =>
                    {
                        var batch            = oldBatches[y.Id];
                        batch.MarkedDateTime = markedDateTime;
                        batch.InTime         = markedDateTime;
                        batch.Left          += y.Number;
                        var z   = ClassExtension.CopyTo <MaterialBatchSimple, MaterialBatch>(y);
                        z.Batch = batch.Batch;
                        z.Price = batch.Price;
                        return(z);
                    }));
                }
                //入库
                else
                {
                    var batch = newBatches[new Tuple <int, int, int>(originBatch.BatchId, x.BillId, x.SupplierId)];
                    batches.Add(batch);
                }

                var plan = x.PlanId != 0 ? plans[x.PlanId] : null;
                var log  = new MaterialLog(createUserId, markedDateTime, x.Type, x.Purpose, x.Number,
                                           allBills[x.BillId].Number, x.RelatedPerson, createUserId, allBills[x.BillId], batches, plan);
                return(log);
            }).ToList();
            if (oldBatches.Any())
            {
                MaterialBatchHelper.UpdateIncreaseLeft(oldBatches.Values);
            }

            Task.Run(() =>
            {
                if (planBills.Any())
                {
                    ProductPlanBillHelper.UpdateActualConsumptions(planBills.Values);
                }

                if (logs.Any())
                {
                    MaterialLogHelper.Instance.Add(logs);
                }
                if (allBills.Keys.Any())
                {
                    HMaterialHelper.UpdateBillPrice(allBills.Keys);
                }
            });

            return(Result.GenError <Result>(Error.Success));
        }
コード例 #12
0
        public object ConsumeMaterial([FromBody] ConsumeMaterial materialManagement)
        {
            if (materialManagement.Bill == null)
            {
                return(Result.GenError <Result>(Error.ParamError));
            }

            foreach (var bill in materialManagement.Bill)
            {
                bill.Type = MaterialOp.出库;
                bill.CorrectNumber();
            }
            var mBills = materialManagement.Bill.Where(x => x.Number > 0);

            if (!mBills.Any())
            {
                return(Result.GenError <Result>(Error.MaterialNotEmpty));
            }

            //出库时物料必须存在
            if (mBills.Any(x => x.Type == MaterialOp.出库 && x.BillId == 0))
            {
                return(Result.GenError <Result>(Error.MaterialBillNotExist));
            }

            var billIds = mBills.Select(x => x.BillId).Distinct();

            if (!billIds.Any())
            {
                return(Result.GenError <Result>(Error.MaterialNotEmpty));
            }

            var allBills = MaterialHelper.GetDetails(billIds).ToDictionary(x => x.BillId);

            if (allBills.Count() != billIds.Count())
            {
                return(Result.GenError <Result>(Error.MaterialBillNotExist));
            }

            var         createUserId   = Request.GetIdentityInformation();
            var         markedDateTime = DateTime.Now;
            ProductPlan plan           = null;

            if (materialManagement.PlanId != 0)
            {
                plan = ProductPlanHelper.Instance.Get <ProductPlan>(materialManagement.PlanId);
                if (plan == null)
                {
                    return(Result.GenError <Result>(Error.ProductionPlanNotExist));
                }
            }

            var result = new DataResult();

            #region 检验库存
            var consumeBills = billIds.Select(x => new OpMaterial
            {
                BillId = x,
                Number = mBills.Where(y => y.BillId == x).Sum(z => z.Number)
            }).ToList();
            var less = consumeBills.Where(x => x.Number > allBills[x.BillId].Number).Select(x => allBills[x.BillId].Code);
            if (less.Any())
            {
                result.errno = Error.MaterialLess;
                result.datas.AddRange(less);
                return(result);
            }
            var oldBatches = new Dictionary <int, MaterialBatch>();
            var upIds      = new Dictionary <int, int>();
            //出库指定的批次
            var batchBills = mBills.Where(x => x.HaveBatch);
            if (batchBills.Any())
            {
                var bIds = batchBills.SelectMany(x => x.Batches.Select(y => y.Id)).Distinct();
                oldBatches.AddRange(MaterialBatchHelper.GetDetails(bIds).ToDictionary(x => x.Id));
                if (bIds.Count() != oldBatches.Count())
                {
                    return(Result.GenError <DataResult>(Error.MaterialBatchNotExist));
                }
                var mergeBatch = bIds.Select(x =>
                {
                    var oldBatch = oldBatches[x];
                    var batches  = batchBills.Where(y => y.BillId == oldBatch.BillId).SelectMany((Func <OpMaterial, IEnumerable <MaterialBatchSimple> >)(y => y.Batches.Where((Func <MaterialBatchSimple, bool>)(z => z.Id == oldBatch.Id))));
                    return(new MaterialBatch
                    {
                        Id = oldBatch.Id,
                        BatchId = oldBatch.BatchId,
                        Batch = oldBatch.Batch,
                        BillId = oldBatch.BillId,
                        SupplierId = oldBatch.SupplierId,
                        Number = batches.Sum(y => y.Number),
                    });
                });
                var much = mergeBatch.Where(x => oldBatches[x.Id].Left < x.Number);
                if (much.Any())
                {
                    result = new DataResult {
                        errno = Error.MaterialBatchLeftLess
                    };
                    result.datas.AddRange(much.Select(x => $"{x.Batch} {allBills[x.BillId].Code} {x.Supplier}"));
                    return(result);
                }
            }

            var noBatchBills = mBills.Where(x => !x.HaveBatch);
            if (noBatchBills.Any())
            {
                var noBillIds     = noBatchBills.Select(x => x.BillId).Distinct();
                var noZeroBatches = MaterialBatchHelper.GetDetailsNoZero(noBillIds)
                                    .GroupBy(x => x.BillId).ToDictionary(x => x.Key);
                //.GroupBy(x => x.BillId).ToDictionary(x => x.Key, x => x.Select(y => y));

                var mergeBatch = noBillIds.Select(billId =>
                {
                    var batches = noBatchBills.Where(y => y.BillId == billId);
                    var number  = batches.Sum(y => y.Number);
                    return(new MaterialBatch
                    {
                        BillId = billId,
                        Number = number,
                    });
                });
                var noZeroMergeBatch = noBillIds.Select(billId =>
                {
                    var left = noZeroBatches.ContainsKey(billId) ? noZeroBatches[billId].Sum(y => y.Left) : 0;
                    return(new MaterialBatch
                    {
                        BillId = billId,
                        Left = left,
                    });
                }).ToDictionary(x => x.BillId);
                var much = mergeBatch.Where(x => noZeroMergeBatch[x.BillId].Left < x.Number);
                if (much.Any())
                {
                    result = new DataResult {
                        errno = Error.MaterialBatchLeftLess
                    };
                    result.datas.AddRange(much.Select(x => $"{x.Batch} {allBills[x.BillId].Code} {x.Supplier}"));
                    return(result);
                }

                foreach (var bill in noBatchBills)
                {
                    var number = bill.Number;
                    foreach (var batch in noZeroBatches[bill.BillId].OrderBy(x => x.Time))
                    {
                        if (number <= 0)
                        {
                            break;
                        }
                        if (!upIds.ContainsKey(batch.Id))
                        {
                            upIds.Add(batch.Id, 0);
                        }

                        var n = 0m;
                        if (number > batch.Left)
                        {
                            number -= batch.Left;
                            n       = batch.Left;
                        }
                        else
                        {
                            n      = number;
                            number = 0;
                        }
                        var z = ClassExtension.CopyTo <MaterialBatch, MaterialBatchSimple>(batch);
                        z.Number = n;
                        bill.Batches.Add(z);
                    }
                }
                oldBatches.AddRange(noZeroBatches.Values.SelectMany(x => x.Where(y => upIds.ContainsKey(y.Id))).ToDictionary(x => x.Id));
            }

            #endregion

            #region 计划领料
            var planChangeBill = new List <ProductPlanBill>();
            var planAddBill    = new List <ProductPlanBill>();
            if (materialManagement.PlanId != 0)
            {
                var planBill = ProductPlanBillHelper.GetPlanBills(materialManagement.PlanId, billIds).ToDictionary(x => x.BillId);
                #region 更新
                var existBill = consumeBills.Where(x => planBill.ContainsKey(x.BillId));
                if (existBill.Any())
                {
                    foreach (var bill in existBill)
                    {
                        planBill[bill.BillId].MarkedDateTime     = markedDateTime;
                        planBill[bill.BillId].ActualConsumption += bill.Number;
                        planChangeBill.Add(planBill[bill.BillId]);
                    }
                }
                #endregion

                #region 添加额外领用的物料
                var extraBill = consumeBills.Where(x => !planBill.ContainsKey(x.BillId));
                if (extraBill.Any())
                {
                    planAddBill.AddRange(extraBill.Select(x => new ProductPlanBill
                    {
                        CreateUserId      = createUserId,
                        MarkedDateTime    = markedDateTime,
                        PlanId            = materialManagement.PlanId,
                        BillId            = x.BillId,
                        ActualConsumption = x.Number,
                        Extra             = true,
                    }));
                }
                #endregion
            }
            #endregion

            var logs = mBills.Select(x =>
            {
                var batches = new List <MaterialBatch>();
                batches.AddRange(x.Batches.Select(y =>
                {
                    var batch            = oldBatches[y.Id];
                    batch.MarkedDateTime = markedDateTime;
                    batch.OutTime        = markedDateTime;
                    batch.Left          -= y.Number;
                    var z   = ClassExtension.CopyTo <MaterialBatchSimple, MaterialBatch>(y);
                    z.Batch = batch.Batch;
                    z.Price = batch.Price;
                    return(z);
                }));
                var log = new MaterialLog(createUserId, markedDateTime, x.Type, x.Purpose, x.Number,
                                          allBills[x.BillId].Number, x.RelatedPerson, createUserId, allBills[x.BillId], batches, plan);
                return(log);
            }).ToList();
            if (oldBatches.Any())
            {
                MaterialBatchHelper.UpdateConsumeLeft(oldBatches.Values);
            }

            Task.Run(() =>
            {
                if (planChangeBill.Any())
                {
                    ProductPlanBillHelper.UpdateActualConsumptions(planChangeBill);
                }

                if (planAddBill.Any())
                {
                    ProductPlanBillHelper.Instance.Add(planAddBill);
                }
                if (logs.Any())
                {
                    MaterialLogHelper.Instance.Add(logs);
                }
                if (allBills.Keys.Any())
                {
                    HMaterialHelper.UpdateBillPrice(allBills.Keys);
                }
            });
            try
            {
                #region 消耗
                foreach (var bill in consumeBills)
                {
                    allBills[bill.BillId].OutTime = markedDateTime;
                    allBills[bill.BillId].Number -= bill.Number;
                }
                MaterialHelper.Consume(allBills.Values);
                #endregion
            }
            catch (Exception e)
            {
                Log.Error(allBills.Values.ToJSON());
                Log.Error(e);
            }

            return(result);
        }
コード例 #13
0
        public Result PutSet([FromBody] WarningSetWithItems set)
        {
            var oldSet = WarningSetHelper.Instance.Get <WarningSet>(set.Id);

            if (oldSet == null)
            {
                return(Result.GenError <Result>(Error.WarningSetNotExist));
            }

            if (set.Name.IsNullOrEmpty())
            {
                return(Result.GenError <Result>(Error.WarningSetNotEmpty));
            }

            if (set.DataType == WarningDataType.生产数据 && set.StepId == set.BindId)
            {
                return(Result.GenError <Result>(Error.WarningSetStepBindDuplicate));
            }
            var names = new List <string> {
                set.Name
            };
            var ids = new List <int> {
                set.Id
            };

            if (WarningSetHelper.GetHaveSame(1, names, ids))
            {
                return(Result.GenError <Result>(Error.WarningSetIsExist));
            }
            var createUserId   = Request.GetIdentityInformation();
            var markedDateTime = DateTime.Now;

            if (set.Items != null)
            {
                if (set.Items.Any())
                {
                    switch (set.DataType)
                    {
                    case WarningDataType.设备数据:
                        set.Items = set.Items.Where(x => x.DictionaryId != 0).ToList();
                        foreach (var item in set.Items)
                        {
                            item.Item = "";
                        }
                        break;

                    case WarningDataType.生产数据:
                        set.Items = set.Items.Where(x => x.ItemType != WarningItemType.Default).ToList();
                        foreach (var item in set.Items)
                        {
                            if (HWarningHelper.生产数据单设备加工信息字段.All(x => x.Item2 != item.ItemType))
                            {
                                item.DeviceIds = set.DeviceIds;
                            }
                        }
                        break;

                    case WarningDataType.故障数据:
                        set.Items = set.Items; break;

                    case WarningDataType.流程卡数据:
                        set.Items = set.Items.Where(x => x.ItemType != WarningItemType.Default).ToList();
                        break;

                    default:
                        set.Items.Clear(); break;
                    }

                    //if (set.Items.Any(x => !x.ValidDataType()))
                    //{
                    //    return Result.GenError<Result>(Error.WarningSetItemDataTypeError);
                    //}
                    foreach (var item in set.Items)
                    {
                        item.MarkedDateTime = markedDateTime;
                        item.SetId          = set.Id;
                    }
                    if (set.Items.Any(x => x.ItemType == WarningItemType.SpecifyStepTimeOut && x.StepId == 0))
                    {
                        return(Result.GenError <Result>(Error.WarningSetItemFlowCardStepError));
                    }
                    if (set.Items.Any(x => !x.ValidFrequency()))
                    {
                        return(Result.GenError <Result>(Error.WarningSetItemFrequencyError));
                    }
                    if (set.Items.Any(x => !x.ValidCondition()))
                    {
                        return(Result.GenError <Result>(Error.WarningSetItemConditionError));
                    }

                    var oldWarningSetItems = WarningSetItemHelper.GetWarningSetItemsBySetId(set.Id);

                    var delItems = oldWarningSetItems.Where(x => set.Items.All(y => y.Id != x.Id));
                    if (delItems.Any())
                    {
                        WarningSetItemHelper.Instance.Delete(delItems.Select(x => x.Id));
                    }

                    var updateItems = set.Items.Where(x => x.Id != 0);
                    if (updateItems.Any())
                    {
                        var uIds = new List <int>();
                        foreach (var item in updateItems)
                        {
                            var oldItem = oldWarningSetItems.FirstOrDefault(x => x.Id == item.Id);
                            if (oldItem != null && ClassExtension.HaveChange(oldItem, item))
                            {
                                if (HWarningHelper.生产数据单设备加工信息字段.All(x => x.Item2 != item.ItemType))
                                {
                                    item.DeviceIds = set.DeviceIds;
                                }
                                uIds.Add(item.Id);
                            }
                        }
                        WarningSetItemHelper.Instance.Update(updateItems.Where(x => uIds.Contains(x.Id)));
                    }
                    var newItems = set.Items.Where(x => x.Id == 0);
                    if (newItems.Any())
                    {
                        foreach (var item in newItems)
                        {
                            item.CreateUserId = createUserId;
                        }
                        WarningSetItemHelper.Instance.Add(newItems);
                    }
                }
                else
                {
                    WarningSetItemHelper.Instance.DeleteFromParent(set.Id);
                }
            }

            if (ClassExtension.HaveChange(oldSet, set))
            {
                set.MarkedDateTime = markedDateTime;
                WarningSetHelper.Instance.Update(set);
            }

            HWarningHelper.UpdateConfig();
            return(Result.GenError <Result>(Error.Success));
        }
コード例 #14
0
        public SemanticAtom Visit(ClassExtension n)
        {
            var t = new UtilizedType(n.Name, n.Location);

            return(t);
        }
コード例 #15
0
        public Result PutProcessManagement([FromBody] Models.ProcessManagement.ProcessManagement processManagement)
        {
            var pms = ProcessManagementHelper.Instance.GetAll <Models.ProcessManagement.ProcessManagement>();

            if (pms.All(x => x.Id != processManagement.Id))
            {
                return(Result.GenError <DataResult>(Error.ProcessManagementNotExist));
            }

            if (pms.Any(x => x.Id != processManagement.Id && x.ProcessNumber == processManagement.ProcessNumber))
            {
                return(Result.GenError <DataResult>(Error.ProcessManagementIsExist));
            }

            var old    = pms.First(x => x.Id == processManagement.Id);
            var change = ClassExtension.HaveChange(old, processManagement);

            if (!change)
            {
                return(Result.GenError <Result>(Error.Success));
            }
            pms = pms.Where(x => x.Id != processManagement.Id);
            try
            {
                var workshopId      = 1;
                var deviceModelList = processManagement.DeviceModelList;
                if (deviceModelList.Any())
                {
                    var cnt = DeviceModelHelper.Instance.GetCountByIds(deviceModelList);
                    if (deviceModelList.Count() != cnt)
                    {
                        return(Result.GenError <Result>(Error.DeviceModelNotExist));
                    }
                }
                else
                {
                    return(Result.GenError <Result>(Error.DeviceModelNotExist));
                }

                var deviceIdList = processManagement.DeviceIdList;
                if (deviceIdList.Any())
                {
                    var deviceLibraries = DeviceHelper.GetDetailsByModelIds(workshopId, processManagement.DeviceModelList).ToDictionary(x => x.Id);
                    if (deviceIdList.Any(x => !deviceLibraries.ContainsKey(x)))
                    {
                        return(Result.GenError <Result>(Error.DeviceNotExist));
                    }

                    var rawMaterial = processManagement.RawMaterial;
                    if (rawMaterial.IsNullOrEmpty())
                    {
                        var productionList = processManagement.ProductionList;
                        pms = pms.Where(x => x.RawMaterial.IsNullOrEmpty());
                        if (productionList.Any())
                        {
                            var cnt = ProductionHelper.Instance.GetCountByIds(processManagement.ProductionList);
                            if (productionList.Count() != cnt)
                            {
                                return(Result.GenError <Result>(Error.ProductionNotExist));
                            }
                            var pManagements = pms.Where(x => x.ProductionList.Any(y => productionList.Contains(y)));
                            if (pManagements.Any(x => x.DeviceIdList.Any(y => deviceIdList.Contains(y))))
                            {
                                return(Result.GenError <Result>(Error.ProcessManagementAddError));
                            }
                        }
                        else
                        {
                            return(Result.GenError <Result>(Error.ProductionNotExist));
                        }
                    }
                    else
                    {
                        pms = pms.Where(x => !x.RawMaterial.IsNullOrEmpty());
                        var pManagements = pms.Where(x => x.RawMaterial == rawMaterial);
                        if (pManagements.Any(x => x.DeviceIdList.Any(y => deviceIdList.Contains(y))))
                        {
                            return(Result.GenError <Result>(Error.ProcessManagementAddRawMaterialError));
                        }
                    }
                }
                else
                {
                    processManagement.DeviceIds = "";
                }
            }
            catch (Exception)
            {
                return(Result.GenError <Result>(Error.Fail));
            }

            var createUserId = Request.GetIdentityInformation();
            var time         = DateTime.Now;

            processManagement.CreateUserId   = createUserId;
            processManagement.MarkedDateTime = time;
            ProcessManagementHelper.Instance.Update(processManagement);

            var processData = processManagement.ProcessData;
            var i           = 1;

            foreach (var pd in processData)
            {
                pd.ProcessOrder        = i++;
                pd.ProcessManagementId = processManagement.Id;
                pd.CreateUserId        = createUserId;
                pd.MarkedDateTime      = time;
            }

            var exist = ProcessDataHelper.Instance.GetFromParent <ProcessData>(processManagement.Id);
            var add   = processData.Where(x => x.Id == 0);

            if (add.Any())
            {
                ProcessDataHelper.Instance.Add(add);
            }
            var update = processData.Where(x => x.Id != 0 && exist.Any(y => y.Id == x.Id && ClassExtension.HaveChange(x, y)));

            if (update.Any())
            {
                ProcessDataHelper.Instance.Update(update);
            }
            var del = exist.Where(x => processData.All(y => y.Id != x.Id)).Select(x => x.Id);

            if (del.Any())
            {
                ProcessDataHelper.Instance.Delete(del);
            }
            return(Result.GenError <Result>(Error.Success));
        }
コード例 #16
0
ファイル: Damage.cs プロジェクト: 47110572/CN
 public ClassExtension AddClass(string @class)
 {
     var generatedClass = new ClassExtension(@class);
     this.Class.Add(generatedClass);
     return generatedClass;
 }
コード例 #17
0
        public object IncreaseMaterialPurchaseItem([FromBody] IEnumerable <MaterialPurchaseItem> purchaseItems)
        {
            if (purchaseItems == null)
            {
                return(Result.GenError <Result>(Error.ParamError));
            }

            purchaseItems = purchaseItems.Where(x => x.Count > 0);
            if (!purchaseItems.Any())
            {
                return(Result.GenError <Result>(Error.MaterialPurchaseItemNotExist));
            }

            if (purchaseItems.Any(x => x.Id == 0))
            {
                return(Result.GenError <Result>(Error.MaterialPurchaseItemNotExist));
            }

            if (purchaseItems.Count() != purchaseItems.GroupBy(x => x.Id).Count())
            {
                return(Result.GenError <Result>(Error.MaterialPurchaseItemDuplicate));
            }

            var purchaseItemIds  = purchaseItems.Select(x => x.Id).Distinct();
            var oldPurchaseItems = MaterialPurchaseItemHelper.Instance.GetByIds <MaterialPurchaseItem>(purchaseItemIds);

            if (oldPurchaseItems.Count() != purchaseItemIds.Count())
            {
                return(Result.GenError <Result>(Error.MaterialPurchaseItemNotExist));
            }
            if (oldPurchaseItems.Any(x => x.ErpId == 0))
            {
                return(Result.GenError <Result>(Error.MaterialPurchaseItemNotBuy));
            }

            var purchaseIds    = oldPurchaseItems.Select(x => x.PurchaseId).Distinct();
            var purchases      = MaterialPurchaseHelper.Instance.GetByIds <MaterialPurchase>(purchaseIds).ToDictionary(x => x.Id);
            var createUserId   = Request.GetIdentityInformation();
            var markedDateTime = DateTime.Now;
            var result         = new DataResult();

            #region 新编号
            var unknow = "无";
            foreach (var purchaseItem in oldPurchaseItems)
            {
                if ((purchaseItem.Class + purchaseItem.Category).IsNullOrEmpty())
                {
                    purchaseItem.Category = unknow;
                }
                if (purchaseItem.Name.IsNullOrEmpty())
                {
                    return(Result.GenError <Result>(Error.MaterialNameNotEmpty));
                }
                if (purchaseItem.Specification.IsNullOrEmpty())
                {
                    purchaseItem.Specification = unknow;
                }
                if (purchaseItem.Supplier.IsNullOrEmpty())
                {
                    purchaseItem.Supplier = unknow;
                }
            }

            var erpBills = oldPurchaseItems.Select(x =>
            {
                var purchase = purchases.ContainsKey(x.PurchaseId) ? purchases[x.PurchaseId] : null;
                return(new OpMaterial
                {
                    Id = x.Id,
                    ////借用,透传物料单id
                    BillId = x.BillId,
                    Code = x.Code,
                    Category = x.Category.IsNullOrEmpty() ? x.Class : x.Category,
                    Name = x.Name,
                    Supplier = x.Supplier,
                    Specification = x.Specification,
                    Site = "",
                    Price = x.Price,
                    Number = purchaseItems.FirstOrDefault(y => x.Id == y.Id)?.Count ?? 0,
                    Unit = x.Unit,
                    Remark = x.Remark,
                    File = x.File,
                    FileUrl = x.FileUrl,
                    RelatedPerson = purchase?.Name ?? "",
                    Purpose = $"Erp采购-{x.Order ?? ""}-{purchase?.ErpId.ToString() ?? ""}",
                });
            }).ToList();

            if (erpBills.Any(x => x.Code.IsNullOrEmpty()))
            {
                return(Result.GenError <Result>(Error.MaterialBillNotEmpty));
            }
            var codes    = erpBills.Select(x => x.Code).Distinct();
            var allBills = new Dictionary <int, Material>();
            allBills.AddRange(MaterialHelper.GetDetails(codes).ToDictionary(x => x.BillId));
            foreach (var bill in erpBills)
            {
                //var b = allBills.Values.FirstOrDefault(x => x.Code == bill.Code
                //                                    && x.Category == bill.Category
                //                                    && x.Name == bill.Name
                //                                    && x.Specification == bill.Specification);
                var b = allBills.Values.FirstOrDefault(x => x.Category == bill.Category &&
                                                       x.Name == bill.Name &&
                                                       x.Specification == bill.Specification);
                if (b == null)
                {
                    if (allBills.Values.Any(x => x.Code == bill.Code))
                    {
                        var bb     = allBills.Values.FirstOrDefault(x => x.Code == bill.Code);
                        var errmsg = $"货品编号异常,{bill.Code}";
                        if (bb.Category != bill.Category)
                        {
                            errmsg += $",类别:(100${bill.Category}$:222,${bb.Category}$)";
                        }
                        if (bb.Name != bill.Name)
                        {
                            errmsg += $",名称:(100,${bill.Name}$:222,${bb.Name}$)";
                        }
                        if (bb.Specification != bill.Specification)
                        {
                            errmsg += $",规格:(100,${bill.Specification}$:222,${bb.Specification}$)";
                        }
                        return(new
                        {
                            errno = 1,
                            errmsg,
                        });
                        //return Result.GenError<Result>(Error.MaterialCodeError);
                    }
                    bill.BillId = 0;
                    continue;
                }

                if (b.Code != bill.Code)
                {
                    result.datas.Add($"data:{b.BillId}, {b.Code}, erp: {bill.Code}");
                }
                if (b.BillId == 0)
                {
                    return(Result.GenError <Result>(Error.ParamError));
                }
                bill.BillId          = b.BillId;
                bill.Code            = b.Code;
                bill.CategoryId      = b.CategoryId;
                bill.NameId          = b.NameId;
                bill.SpecificationId = b.SpecificationId;
                bill.SiteId          = b.SiteId;
                bill.Site            = b.Site;
            }

            if (result.datas.Any())
            {
                result.errno = Error.MaterialCodeError;
                return(result);
            }
            #region 新货品
            var bills = erpBills.Where(x => x.CategoryId == 0 || x.NameId == 0 || x.SpecificationId == 0 || x.SupplierId == 0 || (x.SiteId == 0 && !x.Site.IsNullOrEmpty()) || x.BillId == 0);
            if (bills.Any())
            {
                #region 新位置
                var notExistSite = bills.Where(x => x.SiteId == 0 && !x.Site.IsNullOrEmpty());
                var newSites     = notExistSite.Select(x => x.Site).Distinct();
                if (newSites.Any())
                {
                    var data = MaterialSiteHelper.GetDetails(newSites).ToDictionary(x => x.Site);
                    if (data.Count() != newSites.Count())
                    {
                        MaterialSiteHelper.Instance.Add(newSites.Where(x => !data.ContainsKey(x)).Select(x => new MaterialSite
                        {
                            CreateUserId   = createUserId,
                            MarkedDateTime = markedDateTime,
                            Site           = x
                        }));
                        data = MaterialSiteHelper.GetDetails(newSites).ToDictionary(x => x.Site);
                    }
                    foreach (var bill in notExistSite)
                    {
                        var key = bill.Site;
                        if (data.ContainsKey(key))
                        {
                            bill.SiteId = data[key].Id;
                        }
                        else
                        {
                            return(Result.GenError <Result>(Error.MaterialSiteNotEmpty));
                        }
                    }
                }
                #endregion

                #region 新类别
                var notExistCategories = bills.Where(x => x.CategoryId == 0);
                var newCategories      = notExistCategories.GroupBy(x => x.Category).Select(y => y.Key);
                if (newCategories.Any())
                {
                    var data = MaterialCategoryHelper.GetDetails(newCategories).ToDictionary(x => x.Category);
                    if (data.Count() != newCategories.Count())
                    {
                        MaterialCategoryHelper.Instance.Add(newCategories.Where(x => !data.ContainsKey(x)).Select(x => new MaterialCategory
                        {
                            CreateUserId   = createUserId,
                            MarkedDateTime = markedDateTime,
                            Category       = x
                        }));
                        data = MaterialCategoryHelper.GetDetails(newCategories).ToDictionary(x => x.Category);
                    }
                    foreach (var bill in notExistCategories)
                    {
                        var key = bill.Category;
                        if (data.ContainsKey(key))
                        {
                            bill.CategoryId = data[key].Id;
                        }
                        else
                        {
                            return(Result.GenError <Result>(Error.MaterialCategoryNotEmpty));
                        }
                    }
                }
                #endregion

                #region 新名称
                var notExistNames = bills.Where(x => x.NameId == 0);
                var newNames      = notExistNames.Select(x => x.Name).Distinct();
                if (newNames.Any())
                {
                    var data = MaterialNameHelper.GetDetails(newNames).ToDictionary(x => x.Name);
                    if (data.Count() != newNames.Count())
                    {
                        MaterialNameHelper.Instance.Add(newNames.Where(x => !data.ContainsKey(x)).Select(x => new MaterialName
                        {
                            CreateUserId   = createUserId,
                            MarkedDateTime = markedDateTime,
                            Name           = x
                        }));
                        data = MaterialNameHelper.GetDetails(newNames).ToDictionary(x => x.Name);
                    }
                    foreach (var bill in notExistNames)
                    {
                        var key = bill.Name;
                        if (data.ContainsKey(key))
                        {
                            bill.NameId = data[key].Id;
                        }
                        else
                        {
                            return(Result.GenError <Result>(Error.MaterialNameNotEmpty));
                        }
                    }
                }

                #endregion

                #region 新规格
                var notExistSpecifications = bills.Where(x => x.SpecificationId == 0);
                var newSpecifications      = notExistSpecifications.Select(x => x.Specification).Distinct();
                if (newSpecifications.Any())
                {
                    var data = MaterialSpecificationHelper.GetDetails(newSpecifications).ToDictionary(x => x.Specification);
                    if (data.Count() != newSpecifications.Count())
                    {
                        MaterialSpecificationHelper.Instance.Add(newSpecifications.Where(x => !data.ContainsKey(x)).Select(x => new MaterialSpecification
                        {
                            CreateUserId   = createUserId,
                            MarkedDateTime = markedDateTime,
                            Specification  = x
                        }));
                        data = MaterialSpecificationHelper.GetDetails(newSpecifications).ToDictionary(x => x.Specification);
                    }
                    foreach (var bill in notExistSpecifications)
                    {
                        var key = bill.Specification;
                        if (data.ContainsKey(key))
                        {
                            bill.SpecificationId = data[key].Id;
                        }
                        else
                        {
                            return(Result.GenError <Result>(Error.MaterialSpecificationNotEmpty));
                        }
                    }
                }

                #endregion

                #region 供应商
                var notExistSuppliers = bills.Where(x => x.SupplierId == 0);
                var newSuppliers      = notExistSuppliers.Select(x => x.Supplier).Distinct();
                if (newSuppliers.Any())
                {
                    var data = MaterialSupplierHelper.GetDetails(newSuppliers).ToDictionary(x => x.Supplier);
                    if (data.Count() != newSuppliers.Count())
                    {
                        MaterialSupplierHelper.Instance.Add(newSuppliers.Where(x => !data.ContainsKey(x)).Select(x => new MaterialSupplier
                        {
                            CreateUserId   = createUserId,
                            MarkedDateTime = markedDateTime,
                            Supplier       = x
                        }));
                        data = MaterialSupplierHelper.GetDetails(newSuppliers).ToDictionary(x => x.Supplier);
                    }
                    foreach (var bill in notExistSuppliers)
                    {
                        var key = bill.Supplier;
                        if (data.ContainsKey(key))
                        {
                            bill.SupplierId = data[key].Id;
                        }
                        else
                        {
                            return(Result.GenError <Result>(Error.MaterialSupplierNotEmpty));
                        }
                    }
                }

                #endregion

                #region 新编号
                var billI_0s = bills.Where(x => x.BillId == 0);
                if (billI_0s.Any())
                {
                    var errCodes = bills.GroupBy(x => new { x.CategoryId, x.NameId, x.SpecificationId }).Where(x => x.Count() > 1);
                    if (errCodes.Any())
                    {
                        return(Result.GenError <Result>(Error.MaterialCodeError));
                    }
                    MaterialBillHelper.Instance.Add(billI_0s.Select(x => new MaterialBill
                    {
                        CreateUserId    = createUserId,
                        MarkedDateTime  = markedDateTime,
                        Code            = x.Code,
                        CategoryId      = x.CategoryId,
                        NameId          = x.NameId,
                        SpecificationId = x.SpecificationId,
                        Unit            = x.Unit,
                        Stock           = x.Stock,
                        Remark          = x.Remark ?? "",
                        Images          = x.Images ?? "[]",
                        File            = x.File ?? "",
                        FileUrl         = x.FileUrl ?? "",
                    }));

                    var code_0s = billI_0s.Select(x => x.Code).Distinct();
                    var bill_0s = MaterialBillHelper.GetDetails(code_0s).ToDictionary(x => x.Code);
                    foreach (var bill in billI_0s)
                    {
                        var key = bill.Code;
                        if (bill_0s.ContainsKey(key))
                        {
                            bill.BillId = bill_0s[key].Id;
                        }
                    }

                    allBills.AddRange(bill_0s.Values.ToDictionary(x => x.Id, x =>
                    {
                        var y    = ClassExtension.CopyTo <MaterialBillDetail, Material>(x);
                        y.BillId = x.Id;
                        y.Exist  = false;
                        return(y);
                    }));
                }
                #endregion
            }
            #endregion

            #endregion

            var originBatch = MaterialBatchHelper.GetBatch(createUserId, markedDateTime);
            var addBatches  = erpBills.GroupBy(x => new { x.BillId, x.SupplierId }).Select(x =>
            {
                var bill               = x.First();
                var price              = bill.Price;
                originBatch.BillId     = x.Key.BillId;
                originBatch.Price      = price;
                originBatch.SupplierId = x.Key.SupplierId;
                bill.Number            = x.Sum(a => a.Number);
                return(new MaterialBatch(originBatch, bill));
            });

            MaterialBatchHelper.Instance.Add(addBatches);

            var bIds       = addBatches.Select(x => x.BillId).Distinct();
            var sIds       = addBatches.Select(x => x.SupplierId).Distinct();
            var newBatches = MaterialBatchHelper.GetDetails(originBatch.BatchId, bIds, sIds)
                             .ToDictionary(x => new Tuple <int, int, int>(x.BatchId, x.BillId, x.SupplierId));

            #region 更新
            var existBill = allBills.Where(x => erpBills.Any(y => y.BillId == x.Key) && x.Value.Exist).ToDictionary(x => x.Key, x => x.Value);
            if (existBill.Any())
            {
                foreach (var(key, bill) in existBill)
                {
                    bill.OldNumber = bill.Number;
                    bill.Number   += erpBills.Where(x => x.BillId == bill.Id).Sum(y => y.Number);
                    bill.InTime    = markedDateTime;
                }
                MaterialHelper.Increase(existBill.Values);
            }
            #endregion

            #region 添加
            var addBill = erpBills.Where(x => !existBill.ContainsKey(x.BillId));
            if (addBill.Any())
            {
                var billIds = addBill.GroupBy(y => y.BillId);
                MaterialHelper.Instance.Add(billIds.Select(
                                                x => new
                {
                    BillId = x.Key,
                    InTime = markedDateTime,
                    Number = addBill.Where(z => z.BillId == x.Key).Sum(a => a.Number)
                }));
            }
            #endregion

            foreach (var erpBill in erpBills)
            {
                var oldMaterialPurchaseItem = oldPurchaseItems.FirstOrDefault(x => x.Id == erpBill.Id);
                if (oldMaterialPurchaseItem != null)
                {
                    oldMaterialPurchaseItem.BillId   = erpBill.BillId;
                    oldMaterialPurchaseItem.ThisCode = erpBill.Code;
                }
            }
            var logs = erpBills.Select(x =>
            {
                x.Type      = MaterialOp.入库;
                var batches = new List <MaterialBatch>();
                var batch   = newBatches[new Tuple <int, int, int>(originBatch.BatchId, x.BillId, x.SupplierId)];
                batches.Add(batch);
                var log = new MaterialLog(createUserId, markedDateTime, x.Type, x.Purpose ?? $"Erp采购", x.Number,
                                          allBills[x.BillId].Number, x.RelatedPerson, createUserId, allBills[x.BillId], batches);
                log.ItemId = x.Id;
                return(log);
            }).ToList();

            foreach (var item in oldPurchaseItems)
            {
                var purchaseItem = purchaseItems.FirstOrDefault(x => x.Id == item.Id);
                if (purchaseItem != null)
                {
                    if (item.Stock == 0)
                    {
                        item.IncreaseTime = markedDateTime;
                    }

                    item.MarkedDateTime = markedDateTime;
                    item.Stock         += purchaseItem.Count;
                    item.Count          = purchaseItem.Count;
                }
            }
            MaterialPurchaseItemHelper.Increase(oldPurchaseItems);
            if (allBills.Keys.Any())
            {
                HMaterialHelper.UpdateBillPrice(allBills.Keys);
            }
            Task.Run(() =>
            {
                if (logs.Any())
                {
                    MaterialLogHelper.Instance.Add(logs);
                }
            });
            //TimerHelper.MaterialRecovery(true);
            result.datas.AddRange(newBatches.Values.Select(x => new
            {
                x.Time,
                x.Id,
                x.BillId,
                x.Batch,
                x.Supplier,
                x.Price,
                allBills[x.BillId].Code,
                allBills[x.BillId].Name,
                allBills[x.BillId].Specification,
                allBills[x.BillId].Category,
                allBills[x.BillId].Site
            }));

            return(result);
        }
コード例 #18
0
        /// <summary>
        ///
        /// </summary>
        /// <returns></returns>
        public static void AddOrUpdate(IEnumerable <MonitoringProcess> devices)
        {
            if (devices != null && devices.Any())
            {
                var dates = devices.Select(x => x.Date).Distinct();
                var dIds  = devices.Select(x => x.DeviceId).Distinct();
                var data  = GetDetails(dates, dIds);
                var add   = devices.Where(x => !data.Any(y => y.Date == x.Date && y.DeviceId == x.DeviceId));
                if (add.Any())
                {
                    //ServerConfig.ApiDb.Execute(
                    //    "INSERT INTO kanban_device_state (`Date`, `Time`, `DeviceId`, `NormalDevice`, `ProcessDevice`, `IdleDevice`, `FaultDevice`, `UsedDevice`, `ProcessCount`, `ProcessTime`, `IdleTime`, `RunTime`, " +
                    //    "`ProcessTimeRate`, `TotalProcessCount`, `TotalProcessTime`, `TotalIdleTime`, `TotalRunTime`, `StartTime`, `EndTime`, `Data`, `DayTotal`, `DayQualified`, `DayUnqualified`, " +
                    //    "`DayQualifiedRate`, `DayUnqualifiedRate`, `LastTotal`, `LastQualified`, `LastUnqualified`, `LastQualifiedRate`, `LastUnqualifiedRate`, `DeviceWarnings`, `ProductWarnings`) " +
                    //    "VALUES (@Date, @Time, @DeviceId, @NormalDevice, @ProcessDevice, @IdleDevice, @FaultDevice, @UsedDevice, @ProcessCount, @ProcessTime, @IdleTime, @RunTime, @ProcessTimeRate, " +
                    //    "@TotalProcessCount, @TotalProcessTime, @TotalIdleTime, @TotalRunTime, @StartTime, @EndTime, @Data, @DayTotal, @DayQualified, @DayUnqualified, @DayQualifiedRate, " +
                    //    "@DayUnqualifiedRate, @LastTotal, @LastQualified, @LastUnqualified, @LastQualifiedRate, @LastUnqualifiedRate, @DeviceWarnings, @ProductWarnings);"
                    //    , add, 1000);

                    ServerConfig.ApiDb.Execute(
                        "INSERT INTO kanban_device_state (`Date`, `Time`, `DeviceId`, `NormalDevice`, `ProcessDevice`, `IdleDevice`, `FaultDevice`, `UsedDevice`, `ProcessCount`, `ProcessTime`, `IdleTime`, `RunTime`, " +
                        "`ProcessTimeRate`, `TotalProcessCount`, `TotalProcessTime`, `TotalIdleTime`, `TotalRunTime`, `StartTime`, `EndTime`, `Data`, `DayTotal`, `DayQualified`, `DayUnqualified`, " +
                        "`DayQualifiedRate`, `DayUnqualifiedRate`, `LastTotal`, `LastQualified`, `LastUnqualified`, `LastQualifiedRate`, `LastUnqualifiedRate`, `DeviceWarnings`, `ProductWarnings`) " +
                        "VALUES (@Date, @Time, @DeviceId, @NormalDevice, @ProcessDevice, @IdleDevice, @FaultDevice, @UsedDevice, @ProcessCount, @ProcessTime, @IdleTime, @RunTime, @ProcessTimeRate, " +
                        "@TotalProcessCount, @TotalProcessTime, @TotalIdleTime, @TotalRunTime, @StartTime, @EndTime, @Data, @DayTotal, @DayQualified, @DayUnqualified, @DayQualifiedRate, " +
                        "@DayUnqualifiedRate, @LastTotal, @LastQualified, @LastUnqualified, @LastQualifiedRate, @LastUnqualifiedRate, @DeviceWarnings, @ProductWarnings) " +

                        "ON DUPLICATE KEY UPDATE `Time` = @Time, `DeviceId` = @DeviceId, `NormalDevice` = @NormalDevice, `ProcessDevice` = @ProcessDevice, `IdleDevice` = @IdleDevice, " +
                        "`FaultDevice` = @FaultDevice, `UsedDevice` = @UsedDevice, `ProcessCount` = @ProcessCount, `ProcessTime` = @ProcessTime, `IdleTime` = @IdleTime, `RunTime` = @RunTime, " +
                        "`ProcessTimeRate` = @ProcessTimeRate, `TotalProcessCount` = @TotalProcessCount, `TotalProcessTime` = @TotalProcessTime, `TotalIdleTime` = @TotalIdleTime, " +
                        "`TotalRunTime` = @TotalRunTime, `StartTime` = @StartTime, `EndTime` = @EndTime, `Data` = @Data, `DayTotal` = @DayTotal, `DayQualified` = @DayQualified, " +
                        "`DayUnqualified` = @DayUnqualified, `DayQualifiedRate` = @DayQualifiedRate, `DayUnqualifiedRate` = @DayUnqualifiedRate, `LastTotal` = @LastTotal, " +
                        "`LastQualified` = @LastQualified, `LastUnqualified` = @LastUnqualified, `LastQualifiedRate` = @LastQualifiedRate, `LastUnqualifiedRate` = @LastUnqualifiedRate, " +
                        "`DeviceWarnings` = @DeviceWarnings, `ProductWarnings` = @ProductWarnings;", add, 1000);
                }
                var update = devices.Where(x => data.Any(y => y.Date == x.Date && y.DeviceId == x.DeviceId && ClassExtension.HaveChange(x, y)));
                if (update.Any())
                {
                    ServerConfig.ApiDb.Execute(
                        "UPDATE kanban_device_state SET `Time` = @Time, `DeviceId` = @DeviceId, `NormalDevice` = @NormalDevice, `ProcessDevice` = @ProcessDevice, `IdleDevice` = @IdleDevice, " +
                        "`FaultDevice` = @FaultDevice, `UsedDevice` = @UsedDevice, `ProcessCount` = @ProcessCount, `ProcessTime` = @ProcessTime, `IdleTime` = @IdleTime, `RunTime` = @RunTime, " +
                        "`ProcessTimeRate` = @ProcessTimeRate, `TotalProcessCount` = @TotalProcessCount, `TotalProcessTime` = @TotalProcessTime, `TotalIdleTime` = @TotalIdleTime, " +
                        "`TotalRunTime` = @TotalRunTime, `StartTime` = @StartTime, `EndTime` = @EndTime, `Data` = @Data, `DayTotal` = @DayTotal, `DayQualified` = @DayQualified, " +
                        "`DayUnqualified` = @DayUnqualified, `DayQualifiedRate` = @DayQualifiedRate, `DayUnqualifiedRate` = @DayUnqualifiedRate, `LastTotal` = @LastTotal, " +
                        "`LastQualified` = @LastQualified, `LastUnqualified` = @LastUnqualified, `LastQualifiedRate` = @LastQualifiedRate, `LastUnqualifiedRate` = @LastUnqualifiedRate, " +
                        "`DeviceWarnings` = @DeviceWarnings, `ProductWarnings` = @ProductWarnings WHERE Date = @Date AND DeviceId = @DeviceId;"
                        , update, 1000);
                }
                //ServerConfig.ApiDb.Execute(
                //    "INSERT INTO kanban_device_state (`Date`, `Time`, `DeviceId`, `NormalDevice`, `ProcessDevice`, `IdleDevice`, `FaultDevice`, `UsedDevice`, `ProcessCount`, `ProcessTime`, `IdleTime`, `RunTime`, " +
                //    "`ProcessTimeRate`, `TotalProcessCount`, `TotalProcessTime`, `TotalIdleTime`, `TotalRunTime`, `StartTime`, `EndTime`, `Data`, `DayTotal`, `DayQualified`, `DayUnqualified`, " +
                //    "`DayQualifiedRate`, `DayUnqualifiedRate`, `LastTotal`, `LastQualified`, `LastUnqualified`, `LastQualifiedRate`, `LastUnqualifiedRate`, `DeviceWarnings`, `ProductWarnings`) " +
                //    "VALUES (@Date, @Time, @DeviceId, @NormalDevice, @ProcessDevice, @IdleDevice, @FaultDevice, @UsedDevice, @ProcessCount, @ProcessTime, @IdleTime, @RunTime, @ProcessTimeRate, " +
                //    "@TotalProcessCount, @TotalProcessTime, @TotalIdleTime, @TotalRunTime, @StartTime, @EndTime, @Data, @DayTotal, @DayQualified, @DayUnqualified, @DayQualifiedRate, " +
                //    "@DayUnqualifiedRate, @LastTotal, @LastQualified, @LastUnqualified, @LastQualifiedRate, @LastUnqualifiedRate, @DeviceWarnings, @ProductWarnings) " +

                //    "ON DUPLICATE KEY UPDATE `Time` = @Time, `DeviceId` = @DeviceId, `NormalDevice` = @NormalDevice, `ProcessDevice` = @ProcessDevice, `IdleDevice` = @IdleDevice, " +
                //    "`FaultDevice` = @FaultDevice, `UsedDevice` = @UsedDevice, `ProcessCount` = @ProcessCount, `ProcessTime` = @ProcessTime, `IdleTime` = @IdleTime, `RunTime` = @RunTime, " +
                //    "`ProcessTimeRate` = @ProcessTimeRate, `TotalProcessCount` = @TotalProcessCount, `TotalProcessTime` = @TotalProcessTime, `TotalIdleTime` = @TotalIdleTime, " +
                //    "`TotalRunTime` = @TotalRunTime, `StartTime` = @StartTime, `EndTime` = @EndTime, `Data` = @Data, `DayTotal` = @DayTotal, `DayQualified` = @DayQualified, " +
                //    "`DayUnqualified` = @DayUnqualified, `DayQualifiedRate` = @DayQualifiedRate, `DayUnqualifiedRate` = @DayUnqualifiedRate, `LastTotal` = @LastTotal, " +
                //    "`LastQualified` = @LastQualified, `LastUnqualified` = @LastUnqualified, `LastQualifiedRate` = @LastQualifiedRate, `LastUnqualifiedRate` = @LastUnqualifiedRate, " +
                //    "`DeviceWarnings` = @DeviceWarnings, `ProductWarnings` = @ProductWarnings;", devices, 60);
            }
        }
コード例 #19
0
        public DataResult GetMaterialBatch([FromQuery] bool log, int pId, string pIds,
                                           bool menu, int qId, string qIds, int batchId, string batchIds, int bId, string bIds, int sId, string sIds, bool zero, int itemId, int logId, bool con)
        {
            var result    = new DataResult();
            var pIdList   = !pIds.IsNullOrEmpty() ? pIds.Split(",").Select(int.Parse) : null;
            var qIdList   = !qIds.IsNullOrEmpty() ? qIds.Split(",").Select(int.Parse) : null;
            var batchList = !batchIds.IsNullOrEmpty() ? batchIds.Split(",").Select(int.Parse) : null;
            var bIdList   = !bIds.IsNullOrEmpty() ? bIds.Split(",").Select(int.Parse) : null;
            var sIdList   = !sIds.IsNullOrEmpty() ? sIds.Split(",").Select(int.Parse) : null;

            if (itemId != 0)
            {
                var data = ServerConfig.ApiDb.Query <MaterialBatch>(
                    "SELECT b.* FROM `material_log` a JOIN `material_batch` b ON a.BIds = b.Id WHERE Type = @type AND ItemId = @itemId;",
                    new
                {
                    type = MaterialOp.入库,
                    itemId
                });
                var supplierIds = data.Select(x => x.SupplierId).Distinct();
                if (supplierIds.Any())
                {
                    var suppliers = MaterialSupplierHelper.Instance.GetByIds <MaterialSupplier>(supplierIds).ToDictionary(x => x.Id);
                    foreach (var d in data)
                    {
                        if (suppliers.ContainsKey(d.SupplierId))
                        {
                            d.Supplier = suppliers[d.SupplierId].Supplier;
                        }
                    }
                }

                result.datas.AddRange(data);
            }
            else if (log)
            {
                IEnumerable <MaterialBatch> data;
                if (logId != 0)
                {
                    var lg = MaterialLogHelper.Instance.Get <MaterialLog>(logId);
                    if (!lg.BIdList.Any())
                    {
                        result.errno = Error.MaterialBatchNotExist;
                        return(result);
                    }

                    var batches = lg.BatchesList.ToDictionary(x => x.Id);
                    data = MaterialBatchHelper.GetDetails(lg.BIdList);
                    foreach (var d in data)
                    {
                        d.Number = batches.ContainsKey(d.Id) ? batches[d.Id].Number : 0;
                    }
                }
                else if (pId != 0)
                {
                    data = ServerConfig.ApiDb.Query <MaterialBatch>(
                        "SELECT b.*, a.Number `Left` FROM `material_log` a JOIN `material_batch` b ON a.BIds = b.Id WHERE Type = @type AND PlanId = @pId AND a.BillId = @bId;",
                        new
                    {
                        type = MaterialOp.出库,
                        pId,
                        bId
                    });
                }
                else
                {
                    data = ServerConfig.ApiDb.Query <MaterialBatch>(
                        "SELECT b.*, a.Number `Left` FROM `material_log` a JOIN `material_batch` b ON a.BIds = b.Id WHERE Type = @type AND PlanId = 0 AND a.BillId = @bId;",
                        new
                    {
                        type = MaterialOp.出库,
                        bId
                    });
                }
                var supplierIds = data.Select(x => x.SupplierId).Distinct();
                if (supplierIds.Any())
                {
                    var suppliers = MaterialSupplierHelper.Instance.GetByIds <MaterialSupplier>(supplierIds).ToDictionary(x => x.Id);
                    foreach (var d in data)
                    {
                        if (suppliers.ContainsKey(d.SupplierId))
                        {
                            d.Supplier = suppliers[d.SupplierId].Supplier;
                        }
                    }
                }
                result.datas.AddRange(data);
            }
            else if (zero)
            {
                result.datas.AddRange(MaterialBatchHelper.GetDetailsNoZero(new List <int> {
                    bId
                }));
            }
            //物料扫码 批次
            else if (con)
            {
                var batch = MaterialBatchHelper.GetDetail(qId);
                if (batch == null)
                {
                    result.errno = Error.MaterialBatchNotExist;
                    return(result);
                }

                var bill = MaterialHelper.GetDetail(batch.BillId);
                if (bill == null)
                {
                    result.errno = Error.MaterialBillNotExist;
                    return(result);
                }

                var res = ClassExtension.CopyTo <Material, MaterialManagementBatch>(bill);
                res.Supplier = batch.Supplier;
                res.Left     = batch.Left;
                res.Batch    = batch.Batch;
                result.datas.Add(res);
            }
            else
            {
                result.datas.AddRange(menu
                    ? MaterialBatchHelper.GetMenus(qId, qIdList, batchId, batchList, bId, bIdList, sId, sIdList, zero)
                    : MaterialBatchHelper.GetDetails(qId, qIdList, batchId, batchList, bId, bIdList, sId, sIdList, zero));
                if (qId != 0 && !result.datas.Any())
                {
                    result.errno = Error.MaterialBatchNotExist;
                    return(result);
                }
            }
            return(result);
        }
コード例 #20
0
        public object PutOrder([FromBody] IEnumerable <OrderDetail> details)
        {
            if (details == null || !details.Any())
            {
                return(Result.GenError <Result>(Error.ParamError));
            }
            if (details.Any(x => x.Id == 0))
            {
                return(Result.GenError <Result>(Error.OrderNotExist));
            }
            if (details.Any(x => x.ExNumber.IsNullOrEmpty()))
            {
                return(Result.GenError <Result>(Error.OrderNotEmpty));
            }
            if (details.GroupBy(x => x.ExNumber).Any(y => y.Count() > 1))
            {
                return(Result.GenError <Result>(Error.OrderDuplicate));
            }
            if (details.Count(detail => detail.Pros.GroupBy(x => x.DeliveryTime).Any(y => y.Count() > 1)) > 0)
            {
                return(Result.GenError <Result>(Error.OrderProductionDuplicate));
            }

            var userId         = Request.GetIdentityInformation();
            var markedDateTime = DateTime.Now;

            foreach (var detail in details)
            {
                detail.CreateUserId   = userId;
                detail.MarkedDateTime = markedDateTime;
                detail.CreateTime     = markedDateTime;
                detail.List           = detail.Pros?.Select(x => x.ProductionId).Distinct().Join() ?? "";
                detail.DeliveryTime   = detail.Pros?.Max(x => x.DeliveryTime) ?? default(DateTime);
                detail.Count          = detail.Pros?.Sum(x => x.Count) ?? 0;
                detail.Pros           = detail.Pros ?? new List <OrderProductionDetail>();
                foreach (var d in detail.Pros)
                {
                    d.OrderId = detail.Id;
                }
                detail.Remark = detail.Remark ?? "";
            }
            if (details.Count(detail => detail.Pros.GroupBy(x => x.DeliveryTime).Any(y => y.Count() > 1)) > 0)
            {
                return(Result.GenError <Result>(Error.OrderProductionDuplicate));
            }
            var sames = details.Select(x => x.ExNumber);
            var ids   = details.Select(x => x.Id);

            if (OrderHelper.GetHaveSame(sames, ids))
            {
                return(Result.GenError <Result>(Error.OrderIsExist));
            }
            var oIds   = details.Select(x => x.Id);
            var pIds   = details.SelectMany(x => x.PIds);
            var sameDs = details.SelectMany(x => x.Pros.Select(y => y.DeliveryTime));
            var opIds  = details.SelectMany(x => x.Pros.Select(y => y.Id));

            if (OrderProductionHelper.GetHaveSame(oIds, pIds, sameDs, opIds))
            {
                return(Result.GenError <Result>(Error.OrderProductionIsExist));
            }
            var oldOrders = OrderHelper.GetDetails(oIds).ToDictionary(x => x.Id);

            if (oldOrders.Count != oIds.Count())
            {
                return(Result.GenError <Result>(Error.OrderNotExist));
            }

            var upOrders = details.Where(x => ClassExtension.HaveChange(x, oldOrders[x.Id], true));

            if (upOrders.Any())
            {
                OrderHelper.Instance.Update(upOrders);
            }

            var oldOrderProductions = OrderProductionHelper.GetDetails(oIds, pIds);
            var add = new List <OrderProduction>();
            var up  = new List <OrderProduction>();
            var del = new List <OrderProduction>();

            foreach (var detail in details)
            {
                var oldOPs = oldOrderProductions.Where(x => x.OrderId == detail.Id).ToDictionary(x => x.Id);
                del.AddRange(oldOPs.Where(x => detail.Pros.All(y => y.Id != x.Key)).Select(x => x.Value));
                foreach (var pro in detail.Pros)
                {
                    if (oldOPs.ContainsKey(pro.Id))
                    {
                        if (ClassExtension.HaveChange(pro, oldOPs[pro.Id], true))
                        {
                            pro.MarkedDateTime = markedDateTime;
                            pro.Remark         = pro.Remark ?? "";
                            up.Add(pro);
                        }
                    }
                    else
                    {
                        add.Add(pro);
                    }
                }
            }
            if (add.Any())
            {
                OrderProductionHelper.Instance.Add(add);
            }

            if (up.Any())
            {
                OrderProductionHelper.Instance.Update <OrderProduction>(up);
            }

            if (del.Any())
            {
                OrderProductionHelper.Instance.Delete(del.Select(x => x.Id));
            }

            return(Result.GenError <Result>(Error.Success));
        }
コード例 #21
0
 public void Visit(ClassExtension n)
 {
     Helpers.WriteColor(" extends ", ConsoleColor.DarkCyan, ConsoleColor.Black);
     Helpers.WriteColor(n.Name, ConsoleColor.Green, ConsoleColor.Black);
 }
コード例 #22
0
 public SemanticAtom Visit(ClassExtension n)
 {
     throw new NotImplementedException();
 }
コード例 #23
0
 /// <summary>
 ///
 /// </summary>
 /// <returns></returns>
 public static void AddOrUpdate(IEnumerable <MonitoringKanBan> kanBans)
 {
     if (kanBans != null && kanBans.Any())
     {
         var workshopIds = kanBans.Select(x => x.WorkshopId).Distinct();
         var dates       = kanBans.Select(x => x.Date).Distinct();
         var ids         = kanBans.Select(x => x.Id).Distinct();
         var data        = GetDetails(dates, workshopIds, ids);
         var add         = kanBans.Where(x => !data.Any(y => y.Date == x.Date && y.Id == x.Id && y.WorkshopId == x.WorkshopId));
         if (add.Any())
         {
             ServerConfig.ApiDb.Execute(
                 "INSERT INTO kanban_log (`Date`, `Time`, `Id`, `WorkshopId`, `AllDevice`, `NormalDevice`, `ProcessDevice`, `IdleDevice`, `FaultDevice`, `ConnectErrorDevice`, `MaxUse`, `UseListStr`, " +
                 "`MaxUseListStr`, `MaxUseRate`, `MinUse`, `MinUseRate`, `MaxSimultaneousUseRate`, `MinSimultaneousUseRate`, `SingleProcessRateStr`, `AllProcessRate`, `RunTime`, `ProcessTime`, `IdleTime`, " +
                 "`DayTotal`, `DayQualified`, `DayUnqualified`, `DayQualifiedRate`, `DayUnqualifiedRate`, " +
                 "`ProductionData`) " +
                 "VALUES (@Date, @Time, @Id, @WorkshopId, @AllDevice, @NormalDevice, @ProcessDevice, @IdleDevice, @FaultDevice, @ConnectErrorDevice, @MaxUse, @UseListStr, " +
                 "@MaxUseListStr ,@MaxUseRate, @MinUse, @MinUseRate, @MaxSimultaneousUseRate, @MinSimultaneousUseRate, @SingleProcessRateStr, @AllProcessRate, @RunTime, @ProcessTime, @IdleTime, " +
                 "@DayTotal, @DayQualified, @DayUnqualified, @DayQualifiedRate, @DayUnqualifiedRate, " +
                 "@ProductionData) " +
                 "ON DUPLICATE KEY UPDATE `Time` = @Time, `AllDevice` = @AllDevice, `NormalDevice` = @NormalDevice, `ProcessDevice` = @ProcessDevice, `IdleDevice` = @IdleDevice, " +
                 "`FaultDevice` = @FaultDevice, `ConnectErrorDevice` = @ConnectErrorDevice, `MaxUse` = @MaxUse, `MaxUseListStr` = @MaxUseListStr, `UseListStr` = @UseListStr, " +
                 "`MaxUseRate` = @MaxUseRate, `MinUse` = @MinUse, `MinUseRate` = @MinUseRate, `MaxSimultaneousUseRate` = @MaxSimultaneousUseRate, `MinSimultaneousUseRate` = @MinSimultaneousUseRate, " +
                 "`SingleProcessRateStr` = @SingleProcessRateStr, `AllProcessRate` = @AllProcessRate, `RunTime` = @RunTime, `ProcessTime` = @ProcessTime, `IdleTime` = @IdleTime, " +
                 "`DayTotal` = @DayTotal, `DayQualified` = @DayQualified, `DayUnqualified` = @DayUnqualified, `DayQualifiedRate` = @DayQualifiedRate, `DayUnqualifiedRate` = @DayUnqualifiedRate, " +
                 "`ProductionData` = @ProductionData, `VariableData` = @VariableData;"
                 , add, 1000);
         }
         var update = kanBans.Where(x => data.Any(y => y.Date == x.Date && y.Id == x.Id && y.WorkshopId == x.WorkshopId && ClassExtension.HaveChange(x, y)));
         if (update.Any())
         {
             ServerConfig.ApiDb.Execute(
                 "UPDATE kanban_log SET `Time` = @Time, `AllDevice` = @AllDevice, `NormalDevice` = @NormalDevice, `ProcessDevice` = @ProcessDevice, `IdleDevice` = @IdleDevice, " +
                 "`FaultDevice` = @FaultDevice, `ConnectErrorDevice` = @ConnectErrorDevice, `MaxUse` = @MaxUse, `MaxUseListStr` = @MaxUseListStr, `UseListStr` = @UseListStr, " +
                 "`MaxUseRate` = @MaxUseRate, `MinUse` = @MinUse, `MinUseRate` = @MinUseRate, `MaxSimultaneousUseRate` = @MaxSimultaneousUseRate, `MinSimultaneousUseRate` = @MinSimultaneousUseRate, " +
                 "`SingleProcessRateStr` = @SingleProcessRateStr, `AllProcessRate` = @AllProcessRate, `RunTime` = @RunTime, `ProcessTime` = @ProcessTime, `IdleTime` = @IdleTime, " +
                 "`DayTotal` = @DayTotal, `DayQualified` = @DayQualified, `DayUnqualified` = @DayUnqualified, `DayQualifiedRate` = @DayQualifiedRate, `DayUnqualifiedRate` = @DayUnqualifiedRate, " +
                 "`ProductionData` = @ProductionData, `VariableData` = @VariableData WHERE Date = @Date AND Id = @Id AND WorkshopId = @WorkshopId;"
                 , update, 1000);
         }
     }
 }
コード例 #24
0
 public void Visit(ClassExtension n)
 {
     // Unneeded.
     throw new NotImplementedException();
 }
コード例 #25
0
        // przesłonięcie metody w klasie na przykład EditionCardList - public override void AddCard(int index, Card card, int quantity)

        static void Main(string[] args)
        {
            ClassExtension.LoadData();  // Ekstensja klas - plus trwałość

            User.MinPasswordLength = 4; // Atrybut klasowy

            // Odkomentować jeśli jest potrzeba wygenerować dane od nowa!!

            /*
             * var cardfight = new Game("Cardfight!! Vanguard", 2012);
             * var edition = new Edition(cardfight, "BT01", "Descent of the King of Knights");
             * edition.CardList.AddCard(new Card("King of Knights, Alfred", "[CONT](VC):Your units cannot boost this unit."));
             * edition.CardList.AddCard(new Card("Blaster Blade", "Blablabla"));
             * cardfight.AddEdition(edition); // przeciążenie metod
             *
             * var magic = new Game("Magic the gathering", 1995);
             * edition = magic.AddEdition("KTK", "Khanks of Tarkir", 2014); // przeciążenie metod
             * var card1 = new Card("Abomination of Gudul",
             *  "Whenever Abomination of Gudul deals combat damage to a player, you may draw a card. If you do, discard a card.");
             * var card2 = new Card("Alabaster Kirin", "Flying, Vigilance");
             * edition.CardList.AddCard(card1);
             * edition.CardList.AddCard(card2);
             *
             * var testUser = new User("kelu", "123qwe", "*****@*****.**", "12345678");
             *
             * var deck = testUser.CreateDeck("ABC");
             * deck.AddCard(1, card1, 2);
             * deck.AddCard(1, card2, 3);
             *
             * var commentId = deck.AddComment("What a nice deck!", testUser);
             */

            Console.WriteLine("Enter login:"******"Enter password:"******"Login failed.");
                return;
            }

            Console.WriteLine("User {0} logged in. Phone: {1}, Email: {2}", user.Login, user.ContactData.Phone, user.ContactData.Email); // Atrybut złożony (user.ContactData)
            Console.WriteLine("User logged in for {0} time", ToOrdinal(user.LoginHistory.Count));                                        // atrybut powtarzalny
            Console.WriteLine("Last login: {0}", user.LastLogin);                                                                        // atrybut pochodny

            Console.WriteLine("--------------------------------------------");

            Console.WriteLine("User decks: ");

            foreach (var d in user.Decks)
            {
                Console.WriteLine(d.Name);
                foreach (var c in d.Cards)
                {
                    Console.WriteLine("{0}x {1}", c.Quantity, c.Card.Name);
                }
                Console.WriteLine("=====================");
                Console.WriteLine("Comments:");
                foreach (var c in d.Comments)
                {
                    Console.WriteLine("Author: {0}, Message: {1}", c.Author.Login, c.Description);
                }
                var comment = d.GetComment(1); // Kompozycja - przykład użycia metody która wykorzystuje pole Deck._comments odpowiedzialne za realizację faktycznej kompozycji
            }

            Console.WriteLine("--------------------------------------------");

            Console.WriteLine("User Messages:");

            foreach (var message in user.Messages)
            {
                Console.WriteLine(message.HtmlContent);
            }

            Console.WriteLine("--------------------------------------------");

            Console.WriteLine("Games:");
            PrintAll <Game>();

            Console.WriteLine("--------------------------------------------");

            Console.WriteLine("Edition in game Magic the Gathering by name:");
            var name = Console.ReadLine();
            var game = ClassExtension.GetAll <Game>().First(g => g.Name == "Magic the gathering");
            var ed   = game.GetEdition(name); // Asocjacja kwalifikowana - przykład użycia metody która wykorzystuje pole Game.Editions obsługującego faktyczną asocjację kwalifikowaną

            if (ed == null)
            {
                Console.WriteLine("No edition by name {0}", name);
            }
            else
            {
                Console.WriteLine(ed);
                if (ed.YearOfRelease == null) // Atrybut opcjonalny
                {
                    Console.WriteLine("Edition has no year of release set.");
                }

                Console.WriteLine("Cards amount: " + ed.CardList.Cards.Count); // Asocjacja binarna
                var quantity = ed.CardList.Cards.FirstOrDefault()?.Quantity;   // Asocjacja z atrybutem
            }

            Console.WriteLine("--------------------------------------------");

            Console.WriteLine("\nCards:");
            foreach (var card in ClassExtension.GetAll <Card>())
            {
                if (card.IsPublished == null)
                {
                    Console.WriteLine("Card {0} publish status is not set. Please chose if the card should be published? Y/N/I(gnore)", card.Name);
                    var line = Console.ReadLine();
                    line = line?.ToUpper() ?? "";
                    while (line != "Y" && line != "N" && line != "I")
                    {
                        line = Console.ReadLine();
                    }
                    switch (line)
                    {
                    case "Y":
                        card.Publish();
                        break;

                    case "N":
                        card.Hide();
                        break;
                    }
                }
                Console.WriteLine(card);
                Console.WriteLine("-------------------------------");
            }

            ClassExtension.SaveData();
        }
コード例 #26
0
        public object ReturnMaterialPurchaseItem([FromBody] ReturnMaterial materialManagement)
        {
            if (materialManagement.Bill == null)
            {
                return(Result.GenError <Result>(Error.ParamError));
            }
            foreach (var bill in materialManagement.Bill)
            {
                bill.CorrectNumber();
            }
            var purchaseItems = materialManagement.Bill.Where(x => x.Number > 0);

            if (!purchaseItems.Any())
            {
                return(Result.GenError <Result>(Error.MaterialPurchaseItemNotExist));
            }

            if (purchaseItems.Any(x => x.Id == 0))
            {
                return(Result.GenError <Result>(Error.MaterialPurchaseItemNotExist));
            }

            if (purchaseItems.Count() != purchaseItems.GroupBy(x => x.Id).Count())
            {
                return(Result.GenError <Result>(Error.MaterialPurchaseItemDuplicate));
            }

            ////退货时物料必须存在
            //if (purchaseItems.Any(x => x.BillId == 0))
            //{
            //    return Result.GenError<Result>(Error.MaterialBackNoBillError);
            //}
            //退货必须指定批次
            if (purchaseItems.Any(x => !x.HaveBatch))
            {
                return(Result.GenError <Result>(Error.MaterialBackNoBatchError));
            }

            var purchaseItemIds  = purchaseItems.Select(x => x.Id).Distinct();
            var oldPurchaseItems = MaterialPurchaseItemHelper.Instance.GetByIds <MaterialPurchaseItem>(purchaseItemIds);

            if (oldPurchaseItems.Count() != purchaseItems.Count())
            {
                return(Result.GenError <Result>(Error.MaterialPurchaseItemNotExist));
            }
            if (oldPurchaseItems.Any(x => x.ErpId == 0))
            {
                return(Result.GenError <Result>(Error.MaterialPurchaseItemNotBuy));
            }
            var billIds  = oldPurchaseItems.Select(x => x.BillId).Distinct();
            var allBills = MaterialHelper.GetDetails(billIds).Select(x =>
            {
                x.OldNumber = x.Number;
                x.Number    = x.Number;
                return(x);
            }).ToDictionary(x => x.BillId);

            if (oldPurchaseItems.Any(x => x.Stock <= 0 || !allBills.ContainsKey(x.BillId)))
            {
                return(Result.GenError <Result>(Error.MaterialPurchaseItemNotIncrease));
            }
            if (purchaseItems.Any(x => allBills[x.BillId].Number < x.Number))
            {
                return(Result.GenError <Result>(Error.MaterialPurchaseItemCountError));
            }

            var purchaseIds = oldPurchaseItems.Select(x => x.PurchaseId).Distinct();
            var purchases   = MaterialPurchaseHelper.Instance.GetByIds <MaterialPurchase>(purchaseIds).ToDictionary(x => x.Id);

            var oldBatches = new Dictionary <int, MaterialBatch>();
            //退货的批次
            var bIds = purchaseItems.SelectMany(x => x.Batches.Select(y => y.Id)).Distinct();

            oldBatches.AddRange(MaterialBatchHelper.GetDetails(bIds).ToDictionary(x => x.Id));
            if (bIds.Count() != oldBatches.Count())
            {
                return(Result.GenError <DataResult>(Error.MaterialBatchNotExist));
            }
            if (!purchaseItems.All(x => x.Batches.All(y => oldBatches.ContainsKey(y.Id) && oldBatches[y.Id].BillId == x.BillId)))
            {
                return(Result.GenError <DataResult>(Error.MaterialBatchNotContain));
            }
            var mergeBatch = bIds.Select((Func <int, MaterialBatch>)(x =>
            {
                var oldBatch = oldBatches[x];
                var batches  = purchaseItems.Where(y => y.BillId == oldBatch.BillId).SelectMany((Func <OpMaterial, IEnumerable <MaterialBatchSimple> >)(y => y.Batches.Where((Func <MaterialBatchSimple, bool>)(z => z.Id == oldBatch.Id))));
                return(new MaterialBatch
                {
                    Id = oldBatch.Id,
                    BatchId = oldBatch.BatchId,
                    Batch = oldBatch.Batch,
                    BillId = oldBatch.BillId,
                    SupplierId = oldBatch.SupplierId,
                    Number = batches.Sum(y => y.Number),
                });
            }));

            var result = new DataResult();
            var much   = mergeBatch.Where(x => oldBatches[x.Id].Left < x.Number);

            if (much.Any())
            {
                result = new DataResult {
                    errno = Error.MaterialBatchReturnLeftLess
                };
                result.datas.AddRange(much.Select(x => $"{x.Batch} {allBills[x.BillId].Code} {x.Supplier}"));
                return(result);
            }

            var markedDateTime = DateTime.Now;
            var createUserId   = Request.GetIdentityInformation();

            foreach (var item in oldPurchaseItems)
            {
                var purchaseItem = purchaseItems.FirstOrDefault(x => x.Id == item.Id);
                if (purchaseItem != null)
                {
                    item.MarkedDateTime = markedDateTime;
                    item.Stock         -= purchaseItem.Number;
                    item.Count          = purchaseItem.Number;
                }
            }

            #region 更新
            foreach (var(billId, bill) in allBills)
            {
                bill.Number -= oldPurchaseItems.Where(x => x.BillId == billId).Sum(y => y.Count);
            }
            MaterialHelper.Return(allBills.Values);
            #endregion

            var logs = purchaseItems.Select(x =>
            {
                x.Type           = MaterialOp.退货;
                var purchaseItem = oldPurchaseItems.FirstOrDefault(y => y.Id == x.Id);
                var purchase     = purchases.ContainsKey(purchaseItem.PurchaseId) ? purchases[purchaseItem.PurchaseId] : null;
                var batches      = new List <MaterialBatch>();
                batches.AddRange(x.Batches.Select(y =>
                {
                    var batch            = oldBatches[y.Id];
                    batch.MarkedDateTime = markedDateTime;
                    batch.InTime         = markedDateTime;
                    batch.Number        -= y.Number;
                    batch.Left          -= y.Number;
                    batch.Return        += y.Number;
                    var z   = ClassExtension.CopyTo <MaterialBatchSimple, MaterialBatch>(y);
                    z.Batch = batch.Batch;
                    return(z);
                }));

                x.Purpose = $"Erp退货-{purchaseItem?.Order ?? ""}-{purchase?.ErpId.ToString() ?? ""}";
                var log   = new MaterialLog(createUserId, markedDateTime, x.Type, x.Purpose, x.Number,
                                            allBills[x.BillId].Number, purchase?.Name ?? "", createUserId, allBills[x.BillId], batches);
                log.ItemId = x.Id;
                return(log);
            }).ToList();
            if (oldBatches.Any())
            {
                MaterialBatchHelper.UpdateReturnLeft(oldBatches.Values);
            }
            MaterialPurchaseItemHelper.Return(oldPurchaseItems);
            Task.Run(() =>
            {
                if (logs.Any())
                {
                    MaterialLogHelper.Instance.Add(logs);
                }
            });
            return(Result.GenError <Result>(Error.Success));
        }
コード例 #27
0
        public object PostSmartSchedulePreview([FromBody] SmartTaskOrderArrangeParam arrange)
        {
            var taskOrders = arrange.Previews;
            var wId        = arrange.WorkshopId;

            if (taskOrders == null)
            {
                return(Result.GenError <Result>(Error.ParamError));
            }
            var taskIds = taskOrders.GroupBy(x => x.Id).Select(y => y.Key);

            if (taskIds.Count() != taskOrders.Count())
            {
                return(Result.GenError <Result>(Error.SmartTaskOrderDuplicate));
            }
            var result   = new DataResult();
            var allTasks = new List <SmartTaskOrderPreview>();

            if (taskOrders.Any())
            {
                var tOrders = SmartTaskOrderHelper.Instance.GetByIds <SmartTaskOrderPreview>(taskIds);
                if (taskIds.Count() != tOrders.Count())
                {
                    result.errno = Error.SmartTaskOrderNotExist;
                    result.datas.AddRange(taskOrders.Where(x => tOrders.All(y => y.Id != x.Id)).Select(x => x.TaskOrder.IsNullOrEmpty() ? x.Id.ToString() : x.TaskOrder));
                    return(result);
                }

                //var arranged = tOrders.Where(x => x.Arranged);
                //if (arranged.Any())
                //{
                //    result.errno = Error.SmartTaskOrderArranged;
                //    result.datas.AddRange(arranged.Select(x => x.TaskOrder));
                //    return result;
                //}

                foreach (var task in tOrders)
                {
                    var t = taskOrders.FirstOrDefault(x => x.Id == task.Id);
                    if (t == null)
                    {
                        result.errno = Error.SmartTaskOrderNotExist;
                        result.datas.Add(task.TaskOrder);
                    }
                    else
                    {
                        //页面选择顺序
                        task.Order     = !t.Arranged && t.Order == 0 ? int.MaxValue : t.Order;
                        task.StartTime = t.StartTime;
                        task.EndTime   = t.EndTime;
                        task.Needs     = t.Needs;
                    }
                }
                allTasks.AddRange(tOrders);
            }
            if (result.errno != Error.Success)
            {
                return(result);
            }
            var otherTasks = SmartTaskOrderHelper.GetArrangedButNotDoneSmartTaskOrders(wId);

            if (otherTasks.Any())
            {
                taskIds = otherTasks.Select(x => x.Id);
                var taskNeeds = SmartTaskOrderNeedHelper.GetSmartTaskOrderNeedsByTaskOrderIds(wId, taskIds);
                foreach (var otherTask in otherTasks)
                {
                    var aTask = allTasks.FirstOrDefault(x => x.Id == otherTask.Id);
                    var needs = taskNeeds.Where(need => need.TaskOrderId == otherTask.Id);
                    if (aTask != null)
                    {
                        aTask.Arranged = true;
                        if (!aTask.Needs.Any())
                        {
                            aTask.Needs.AddRange(needs);
                        }
                        else
                        {
                            aTask.Needs = aTask.Needs.Select(x =>
                            {
                                var need = needs.FirstOrDefault(y => y.TaskOrderId == x.TaskOrderId && y.PId == x.PId);
                                if (need != null)
                                {
                                    x.DoneTarget = need.DoneTarget;
                                    x.HavePut    = need.HavePut;
                                }
                                return(x);
                            }).ToList();
                        }
                    }
                    else
                    {
                        var t = ClassExtension.ParentCopyToChild <SmartTaskOrder, SmartTaskOrderPreview>(otherTask);
                        t.Arranged = true;
                        t.Needs.AddRange(needs);
                        allTasks.Add(t);
                    }
                }
            }

            if (result.errno != Error.Success)
            {
                return(result);
            }
            var productIds = allTasks.GroupBy(x => x.ProductId).Select(y => y.Key);

            if (!productIds.Any())
            {
                return(Result.GenError <Result>(Error.SmartProductNotExist));
            }

            var products = SmartProductHelper.Instance.GetByIds <SmartProduct>(productIds);

            if (products.Count() != productIds.Count())
            {
                return(Result.GenError <Result>(Error.SmartProductNotExist));
            }

            var productCapacities = SmartProductCapacityHelper.GetSmartProductCapacities(productIds);

            if (!productCapacities.Any())
            {
                return(Result.GenError <Result>(Error.SmartProductCapacityNotExist));
            }

            var capacityIds = products.GroupBy(x => x.CapacityId).Select(y => y.Key);

            if (!capacityIds.Any())
            {
                return(Result.GenError <Result>(Error.SmartCapacityNotExist));
            }
            var capacityLists = SmartCapacityListHelper.GetSmartCapacityListsWithOrder(capacityIds);

            foreach (var productId in productIds)
            {
                var tasks       = allTasks.Where(x => x.ProductId == productId);
                var product     = products.FirstOrDefault(x => x.Id == productId);
                var pCapacities = productCapacities.Where(x => x.ProductId == productId);
                var cLists      = capacityLists.Where(x => x.CapacityId == product.CapacityId);
                if (cLists.Count() != pCapacities.Count())
                {
                    result.errno = Error.SmartProductCapacityNotExist;
                    result.datas.AddRange(tasks.Select(x => x.TaskOrder));
                }
            }

            if (result.errno != Error.Success)
            {
                return(result);
            }

            var data = allTasks.ToDictionary(x => x.Id, x =>
            {
                var t     = ClassExtension.ParentCopyToChild <SmartTaskOrder, SmartTaskOrderPreview>(x);
                t.Product = products.FirstOrDefault(y => y.Id == x.ProductId)?.Product ?? "";
                return(t);
            });

            foreach (var task in allTasks)
            {
                var productId   = task.ProductId;
                var product     = products.FirstOrDefault(x => x.Id == productId);
                var pCapacities = productCapacities.Where(x => x.ProductId == productId);
                var cLists      = capacityLists.Where(x => x.CapacityId == product.CapacityId);
                var target      = task.Target;
                foreach (var list in cLists.Reverse())
                {
                    var need       = task.Needs.FirstOrDefault(x => x.Order == list.Order && x.ProcessId == list.ProcessId);
                    var stock      = need?.Stock ?? 0;
                    var doneTarget = need?.DoneTarget ?? 0;
                    var havePut    = need?.HavePut ?? 0;

                    if (target < stock)
                    {
                        stock  = target;
                        target = 0;
                    }
                    else
                    {
                        target -= stock;
                    }

                    var pCapacity = pCapacities.FirstOrDefault(x => x.ProcessId == list.ProcessId);
                    var rate      = 0m;
                    var y         = pCapacity;
                    if (y.DeviceList.Any())
                    {
                        rate = y.DeviceList.First().Rate;
                    }
                    else if (y.OperatorList.Any())
                    {
                        rate = y.OperatorList.First().Rate;
                    }

                    var put = rate != 0 ? (int)Math.Ceiling((target) * 100 / rate) : 0;
                    data[task.Id].Needs.Insert(0, new SmartTaskOrderNeedDetail
                    {
                        TaskOrderId = task.Id,
                        ProductId   = productId,
                        ProcessId   = list.ProcessId,
                        PId         = list.PId,
                        Target      = target,
                        DoneTarget  = doneTarget,
                        Stock       = stock,
                        Rate        = rate,
                        Put         = put,
                        HavePut     = havePut,
                        Process     = list.Process,
                        Order       = list.Order
                    });
                    target = put;
                }
            }
            var r = new SmartTaskOrderNeedWithOrderResult();

            r.datas.AddRange(data.Values.OrderBy(x => x.Arranged).ThenBy(x => x.ModifyId));
            var orders = data.Values.SelectMany(x => x.Needs).GroupBy(y => new { y.PId, y.Order, y.Process }).Select(z => new SmartTaskOrderNeedWithOrder
            {
                Id      = z.Key.PId,
                Process = z.Key.Process,
                Order   = z.Key.Order
            });

            r.Orders.AddRange(orders.OrderBy(z => z.Order));
            return(r);
        }
コード例 #28
0
        public DataResult PutManufactureTaskItem([FromBody] IEnumerable <ManufactureTaskItem> manufactureTaskItems)
        {
            if (manufactureTaskItems == null)
            {
                return(Result.GenError <DataResult>(Error.ManufactureTaskItemNotExist));
            }

            if (manufactureTaskItems.Any(x => x.TaskId == 0) || manufactureTaskItems.GroupBy(x => x.TaskId).Count() != 1)
            {
                return(Result.GenError <DataResult>(Error.ManufactureTaskNotExist));
            }

            var taskId = manufactureTaskItems.First(x => x.TaskId != 0).TaskId;
            var cnt    =
                ServerConfig.ApiDb.Query <int>("SELECT COUNT(1) FROM `manufacture_task` WHERE Id = @Id AND `MarkedDelete` = 0;", new { Id = taskId }).FirstOrDefault();

            if (cnt == 0)
            {
                return(Result.GenError <DataResult>(Error.ManufactureTaskNotExist));
            }

            if (manufactureTaskItems.Any(x => x.Item.IsNullOrEmpty()))
            {
                return(Result.GenError <DataResult>(Error.ManufactureTaskItemNotEmpty));
            }

            var data =
                ServerConfig.ApiDb.Query <ManufactureTaskItem>("SELECT * FROM `manufacture_task_item` WHERE TaskId = @taskId AND MarkedDelete = 0;", new { taskId });

            var update         = false;
            var createUserId   = Request.GetIdentityInformation();
            var markedDateTime = DateTime.Now;

            if (manufactureTaskItems.GroupBy(x => x.Order).Any(y => y.Count() > 1))
            {
                return(Result.GenError <DataResult>(Error.ManufactureTaskItemOrderDuplicate));
            }

            var result = new DataResult();

            manufactureTaskItems = manufactureTaskItems.OrderBy(x => x.Order);
            var error = 0;

            foreach (var manufactureTaskItem in manufactureTaskItems)
            {
                manufactureTaskItem.TaskId = taskId;
                if (error != 2 && manufactureTaskItem.Order <= manufactureTaskItem.Relation ||
                    (manufactureTaskItem.Relation != 0 && manufactureTaskItems.All(x => x.Order != manufactureTaskItem.Relation)))
                {
                    error = 1;
                    result.datas.Add(manufactureTaskItem.Item);
                }
                else if (error != 1 && manufactureTaskItem.IsCheck && manufactureTaskItem.Relation == 0)
                {
                    error = 2;
                    result.datas.Add(manufactureTaskItem.Item);
                }
                if (error != 0)
                {
                    continue;
                }

                var item = data.FirstOrDefault(x => x.Id == manufactureTaskItem.Id);
                if (item != null)
                {
                    manufactureTaskItem.Item = manufactureTaskItem.Item ?? item.Item;
                    manufactureTaskItem.Desc = manufactureTaskItem.Desc ?? item.Desc;
                    if (manufactureTaskItem.Item != item.Item || manufactureTaskItem.Desc != item.Desc || manufactureTaskItem.Order != item.Order ||
                        manufactureTaskItem.Person != item.Person || manufactureTaskItem.ModuleId != item.ModuleId || manufactureTaskItem.EstimatedHour != item.EstimatedHour ||
                        manufactureTaskItem.EstimatedMin != item.EstimatedMin || manufactureTaskItem.Score != item.Score || manufactureTaskItem.Relation != item.Relation)
                    {
                        update = true;
                        manufactureTaskItem.MarkedDateTime = markedDateTime;
                    }

                    if (manufactureTaskItem.IsCheck != item.IsCheck)
                    {
                        update = true;
                        manufactureTaskItem.MarkedDateTime = markedDateTime;
                    }

                    if (manufactureTaskItem.IsCheck && manufactureTaskItem.CheckId != item.CheckId)
                    {
                        update = true;
                        manufactureTaskItem.MarkedDateTime = markedDateTime;
                    }
                }
                else
                {
                    manufactureTaskItem.CreateUserId   = createUserId;
                    manufactureTaskItem.MarkedDateTime = markedDateTime;
                    manufactureTaskItem.Desc           = manufactureTaskItem.Desc ?? "";
                }
            }

            if (result.datas.Any())
            {
                result.errno = error == 1 ? Error.ManufactureTaskItemRelationError : Error.ManufactureCheckItemNoRelation;
                return(result);
            }

            #region 更新
            var updateItems = manufactureTaskItems.Where(x => x.Id != 0 && data.Any(y => y.Id == x.Id) && ClassExtension.HaveChange(data.First(y => y.Id == x.Id), x));
            if (updateItems.Any() && update)
            {
                ServerConfig.ApiDb.Execute("UPDATE manufacture_task_item SET `MarkedDateTime` = @MarkedDateTime, `Order` = @Order, `Person` = @Person, `ModuleId` = @ModuleId, `IsCheck` = @IsCheck, " +
                                           "`CheckId` = @CheckId, `Item` = @Item, `EstimatedHour` = @EstimatedHour, `EstimatedMin` = @EstimatedMin, `Score` = @Score, `Desc` = @Desc, `Relation` = @Relation WHERE `Id` = @Id;", updateItems);
            }
            #endregion

            #region  除
            var delItems = data.Where(x => manufactureTaskItems.All(y => y.Id != x.Id));
            if (delItems.Any())
            {
                foreach (var delItem in delItems)
                {
                    delItem.MarkedDateTime = markedDateTime;
                    delItem.MarkedDelete   = true;
                }

                ServerConfig.ApiDb.Execute("UPDATE `manufacture_task_item` SET `MarkedDateTime`= @MarkedDateTime, `MarkedDelete`= @MarkedDelete WHERE `Id` = @Id;", delItems);
            }

            #endregion

            #region 添加
            var addItems = manufactureTaskItems.Where(x => x.Id == 0);
            if (addItems.Any())
            {
                ServerConfig.ApiDb.Execute(
                    "INSERT INTO manufacture_task_item (`CreateUserId`, `MarkedDateTime`, `TaskId`, `Order`, `Person`, `ModuleId`, `IsCheck`, `CheckId`, `Item`, `EstimatedHour`, `EstimatedMin`, `Score`, `Desc`, `Relation`) " +
                    "VALUES (@CreateUserId, @MarkedDateTime, @TaskId, @Order, @Person, @ModuleId, @IsCheck, @CheckId, @Item, @EstimatedHour, @EstimatedMin, @Score, @Desc, @Relation);",
                    addItems);
            }
            #endregion
            return(Result.GenError <DataResult>(Error.Success));
        }
コード例 #29
0
        public DataResult PutMaterialLog([FromBody] IEnumerable <MaterialLog> materialLogs)
        {
            return(Result.GenError <DataResult>(Error.Fail));

            if (materialLogs == null || !materialLogs.Any())
            {
                return(Result.GenError <DataResult>(Error.MaterialLogNotExist));
            }

            if (materialLogs.Any(x => x.Number < 0))
            {
                return(Result.GenError <DataResult>(Error.NumberCannotBeNegative));
            }
            if (materialLogs.GroupBy(x => x.Type).Count() > 1)
            {
                return(Result.GenError <DataResult>(Error.MaterialLogTypeDifferent));
            }

            var logIds  = materialLogs.Where(x => x.Number == 0).Select(y => y.Id);
            var billIds = materialLogs.Select(x => x.BillId);
            var timeLog = ServerConfig.ApiDb.Query <MaterialLog>("SELECT * FROM (SELECT * FROM `material_log` " +
                                                                 $"WHERE BillId IN @billIds{(logIds.Any() ? " AND Id NOT IN @logIds" : "")} AND Number > 0 Order By Time DESC) a GROUP BY Type;",
                                                                 new { billIds, logIds });
            var oldLogs =
                ServerConfig.ApiDb.Query <MaterialLog>("SELECT * FROM `material_log` WHERE Id IN @id;",
                                                       new { id = materialLogs.Select(x => x.Id) });

            if (oldLogs.Count() != materialLogs.Count())
            {
                return(Result.GenError <DataResult>(Error.MaterialLogNotExist));
            }

            var result         = new DataResult();
            var markedDateTime = DateTime.Now;
            var newLogs        = new List <MaterialLog>();
            var newLogChanges  = new List <MaterialLogChange>();
            var materials      = billIds.ToDictionary(x => x, x =>
            {
                var change = new MaterialChange
                {
                    BillId = x,
                    Number = 0
                };
                // 1 入库; 2 出库;3 冲正;
                var inLog = timeLog.FirstOrDefault(y => y.BillId == x && y.Type == MaterialOp.入库);
                if (inLog != null)
                {
                    change.InTime = inLog.Time;
                }

                var outLog = timeLog.FirstOrDefault(y => y.BillId == x && y.Type == MaterialOp.出库);
                if (outLog != null)
                {
                    change.OutTime = outLog.Time;
                }

                return(change);
            });

            foreach (var billId in billIds)
            {
                var minId    = materialLogs.Where(x => x.BillId == billId).Min().Id;
                var billLogs = ServerConfig.ApiDb.Query <MaterialLog>("SELECT * FROM `material_log` WHERE Id >= @Id AND BillId = @BillId Order By Time;", new { Id = minId, BillId = billId });
                foreach (var billLog in billLogs)
                {
                    var changeBillLog = ClassExtension.ParentCopyToChild <MaterialLog, MaterialLogChange>(billLog);
                    if (!materials.ContainsKey(billId))
                    {
                        continue;
                    }
                    var material = materials[billId];
                    if (!material.Init)
                    {
                        material.Init   = true;
                        material.Number = billLog.OldNumber;
                    }
                    var update = materialLogs.FirstOrDefault(x => x.Id == billLog.Id);
                    if (update == null)
                    {
                        billLog.OldNumber = material.Number;
                    }
                    var num = update?.Number ?? billLog.Number;
                    // 1 入库; 2 出库;3 冲正;
                    switch (billLog.Type)
                    {
                    case MaterialOp.入库:
                        billLog.Number    = num;
                        billLog.OldNumber = material.Number;
                        material.Number  += num;
                        break;

                    case MaterialOp.出库:
                        billLog.Number = num;
                        if (billLog.Number > material.Number)
                        {
                            result.datas.Add(billLog.Name);
                            result.errno = Error.MaterialLogConsumeLaterError;
                            return(result);
                        }
                        billLog.OldNumber = material.Number;
                        material.Number  -= num;
                        break;

                    case MaterialOp.冲正:
                        billLog.Number    = num;
                        billLog.OldNumber = material.Number;
                        material.Number   = num;
                        break;
                    }
                    changeBillLog.ChangeNumber    = billLog.Number;
                    changeBillLog.ChangeOldNumber = billLog.OldNumber;
                    newLogs.Add(billLog);
                    newLogChanges.Add(changeBillLog);
                }
            }

            if (newLogChanges.All(x => x.ChangeNumber == x.Number))
            {
                return(Result.GenError <DataResult>(Error.Success));
            }
            var planLogs = newLogChanges.Where(x => x.PlanId != 0 && x.ChangeNumber != x.Number);

            if (planLogs.Any())
            {
                var existProductionPlanBills = ServerConfig.ApiDb.Query <ProductPlanBill>(
                    "SELECT * FROM `production_plan_bill` WHERE MarkedDelete = 0 AND PlanId IN @PlanId AND BillId IN @BillId;",
                    new
                {
                    PlanId = planLogs.Select(x => x.PlanId),
                    BillId = planLogs.Select(x => x.BillId),
                });
                foreach (var billLog in newLogChanges.OrderByDescending(x => x.Id))
                {
                    if (billLog.PlanId != 0)
                    {
                        var planBill = existProductionPlanBills.FirstOrDefault(x =>
                                                                               x.PlanId == billLog.PlanId && x.BillId == billLog.BillId);
                        if (planBill != null)
                        {
                            // 1 退回; 2 领用;
                            switch (billLog.Type)
                            {
                            case MaterialOp.入库:
                                planBill.ActualConsumption += billLog.Number;
                                break;

                            case MaterialOp.出库:
                                planBill.ActualConsumption -= billLog.Number;
                                break;

                            case MaterialOp.冲正:
                                break;
                            }
                        }
                    }
                }

                //var productionPlanBills = new List<ProductionPlanBill>();
                foreach (var billLog in newLogChanges)
                {
                    if (billLog.PlanId != 0)
                    {
                        var planBill = existProductionPlanBills.FirstOrDefault(x =>
                                                                               x.PlanId == billLog.PlanId && x.BillId == billLog.BillId);
                        if (planBill != null)
                        {
                            // 1 退回; 2 领用;
                            switch (billLog.Type)
                            {
                            case MaterialOp.入库:
                                if (planBill.ActualConsumption < billLog.ChangeNumber)
                                {
                                    result.datas.Add(billLog.Name);
                                    result.errno = Error.ProductionPlanBillActualConsumeLess;
                                    return(result);
                                }
                                planBill.ActualConsumption -= billLog.ChangeNumber;
                                break;

                            case MaterialOp.出库:
                                planBill.ActualConsumption += billLog.ChangeNumber;
                                break;

                            case MaterialOp.冲正:
                                break;
                            }
                        }
                    }
                }

                ServerConfig.ApiDb.Execute(
                    "UPDATE `production_plan_bill` SET `ActualConsumption` = @ActualConsumption WHERE `Id` = @Id;",
                    existProductionPlanBills);
            }

            var purchases = newLogChanges.Where(x => x.ItemId != 0);

            if (purchases.Any())
            {
                //var erpIds = purchases.Select(x => int.TryParse(x.Purpose.Replace("Erp采购-", ""), out var erpId) ? erpId : 0).Where(y => y != 0);
                //var pBillIds = purchases.Select(x => x.BillId);
                var purchaseItemIds = purchases.Select(x => x.ItemId).Where(x => x != 0);
                var purchaseItems   = ServerConfig.ApiDb.Query <MaterialPurchaseItem>(
                    "SELECT a.*, b.ErpId FROM `material_purchase_item` a " +
                    "JOIN `material_purchase` b ON a.PurchaseId = b.Id " +
                    "WHERE a.Id IN @purchaseItemIds AND a.MarkedDelete = 0 AND b.MarkedDelete = 0;", new
                {
                    purchaseItemIds
                });

                foreach (var purchase in purchases)
                {
                    var pItem = purchaseItems.FirstOrDefault(x => x.Id == purchase.ItemId);
                    //if (purchase.ChangeNumber < purchase.Number)
                    if (pItem != null)
                    {
                        pItem.Stock += purchase.ChangeNumber - purchase.Number;
                    }
                }

                ServerConfig.ApiDb.Execute("UPDATE `material_purchase_item` SET `Stock` = @Stock WHERE `Id` = @Id;",
                                           purchaseItems);
            }
            if (newLogs.Any())
            {
                ServerConfig.ApiDb.Execute(
                    "UPDATE `material_log` SET `Number` = @Number, `OldNumber` = @OldNumber WHERE `Id` = @Id;",
                    newLogs);

                ServerConfig.ApiDb.Execute(
                    "UPDATE `material_management` SET " +
                    "`InTime` = IF(ISNULL(`InTime`) OR `InTime` != @InTime, @InTime, `InTime`), " +
                    "`OutTime` = IF(ISNULL(`OutTime`) OR `OutTime` != @OutTime, @OutTime, `OutTime`), " +
                    "`Number` = @Number WHERE `BillId` = @BillId;",
                    materials.Values.Where(x => x.Init));

                ServerConfig.ApiDb.Execute(
                    "INSERT INTO `material_log_change` (`NewTime`, `Id`, `Time`, `BillId`, `Code`, `NameId`, `Name`, `SpecificationId`, `Specification`, `Type`, `Mode`, `Purpose`, `PlanId`, `Plan`, `Number`, `OldNumber`, `RelatedPerson`, `Manager`, `ChangeNumber`, `ChangeOldNumber`) " +
                    "VALUES ( @NewTime, @Id, @Time, @BillId, @Code, @NameId, @Name, @SpecificationId, @Specification, @Type, @Mode, @Purpose, @PlanId, @Plan, @Number, @OldNumber, @RelatedPerson, @Manager, @ChangeNumber, @ChangeOldNumber);",
                    newLogChanges.OrderBy(x => x.BillId).ThenBy(y => y.Time).Select(z =>
                {
                    z.NewTime = markedDateTime;
                    return(z);
                }));

                //TimerHelper.DayBalance(newLogs.GroupBy(x => x.Time).Where(y => !y.Key.InSameDay(markedDateTime)).Select(z => z.Key));
                //TimerHelper.DayBalance(newLogs);
            }


            return(Result.GenError <DataResult>(Error.Success));
        }
        public Result PutSmartProcessCodeCategory([FromBody] IEnumerable <SmartProcessCodeCategoryDetail> processCodeCategories)
        {
            if (processCodeCategories == null || !processCodeCategories.Any())
            {
                return(Result.GenError <Result>(Error.ParamError));
            }
            if (processCodeCategories.Any(x => x.Category.IsNullOrEmpty()))
            {
                return(Result.GenError <Result>(Error.SmartProcessCodeCategoryNotEmpty));
            }
            if (processCodeCategories.GroupBy(x => x.Category).Any(y => y.Count() > 1))
            {
                return(Result.GenError <Result>(Error.SmartProcessCodeCategoryDuplicate));
            }

            var wId   = processCodeCategories.FirstOrDefault()?.WorkshopId ?? 0;
            var sames = processCodeCategories.Select(x => x.Category);
            var ids   = processCodeCategories.Select(x => x.Id);

            if (SmartProcessCodeCategoryHelper.GetHaveSame(wId, sames, ids))
            {
                return(Result.GenError <Result>(Error.SmartProcessCodeCategoryIsExist));
            }

            var cnt = SmartProcessCodeCategoryHelper.Instance.GetCountByIds(ids);

            if (cnt != processCodeCategories.Count())
            {
                return(Result.GenError <Result>(Error.SmartProcessCodeCategoryNotExist));
            }
            var processCodeCategoryIds = processCodeCategories.Select(x => x.Id);
            var data = SmartProcessCodeCategoryHelper.Instance.GetByIds <SmartProcessCodeCategory>(processCodeCategoryIds);

            if (data.Count() != processCodeCategories.Count())
            {
                return(Result.GenError <Result>(Error.SmartProcessCodeCategoryNotExist));
            }

            var userId         = Request.GetIdentityInformation();
            var markedDateTime = DateTime.Now;
            var add            = new List <SmartProcessCodeCategoryProcess>();
            var update         = new List <SmartProcessCodeCategoryProcess>();
            var exist          = SmartProcessCodeCategoryProcessHelper.GetDetailByCategoryId(processCodeCategories.Select(x => x.Id));

            foreach (var processCodeCategory in processCodeCategories)
            {
                processCodeCategory.CreateUserId   = userId;
                processCodeCategory.MarkedDateTime = markedDateTime;
                processCodeCategory.Remark         = processCodeCategory.Remark ?? "";
                processCodeCategory.Processes      = processCodeCategory.Processes.Select(x =>
                {
                    x.ProcessCodeCategoryId = processCodeCategory.Id;
                    return(x);
                });
                var categoryProcesses = exist.Where(x => x.ProcessCodeCategoryId == processCodeCategory.Id);
                if (processCodeCategory.Processes != null && processCodeCategory.Processes.Any())
                {
                    add.AddRange(processCodeCategory.Processes.Where(x => x.Id == 0 && categoryProcesses.FirstOrDefault(a => a.Order == x.Order && a.ProcessId == x.ProcessId) == null)
                                 .Select(y =>
                    {
                        y.CreateUserId          = userId;
                        y.MarkedDateTime        = markedDateTime;
                        y.ProcessCodeCategoryId = processCodeCategory.Id;
                        return(y);
                    }));

                    update.AddRange(processCodeCategory.Processes
                                    .Where(x => categoryProcesses.Any(y => y.Id == x.Id) &&
                                           (ClassExtension.HaveChange(categoryProcesses.First(y => y.Id == x.Id), x))).Select(z =>
                                                                                                                              //|| (x.Id == 0 && categoryProcesses.FirstOrDefault(a => a.Order == x.Order && a.ProcessId == x.ProcessId) != null)).Select(z =>
                    {
                        var first        = categoryProcesses.First(a => a.Id == z.Id);
                        z.Id             = first.Id;
                        z.MarkedDateTime = markedDateTime;
                        return(z);
                    }));

                    update.AddRange(categoryProcesses.Where(x => processCodeCategory.Processes.All(y => y.Id != x.Id)).Select(z =>
                    {
                        z.MarkedDateTime = markedDateTime;
                        z.MarkedDelete   = true;
                        return(z);
                    }));
                }
                else
                {
                    update.AddRange(categoryProcesses.Select(x =>
                    {
                        x.MarkedDateTime = markedDateTime;
                        x.MarkedDelete   = true;
                        return(x);
                    }));
                }
            }
            if (add.Any())
            {
                SmartProcessCodeCategoryProcessHelper.Instance.Add <SmartProcessCodeCategoryProcess>(add);
            }

            if (update.Any())
            {
                SmartProcessCodeCategoryProcessHelper.Instance.Update <SmartProcessCodeCategoryProcess>(update);
            }

            SmartProcessCodeCategoryHelper.Instance.Update(processCodeCategories);
            return(Result.GenError <Result>(Error.Success));
        }
コード例 #31
0
        public object PutProduction([FromBody] IEnumerable <ProductionDetail> details)
        {
            if (details == null || !details.Any())
            {
                return(Result.GenError <Result>(Error.ParamError));
            }
            if (details.Any(x => x.Id == 0))
            {
                return(Result.GenError <Result>(Error.ProductionNotExist));
            }
            if (details.Any(x => x.Name.IsNullOrEmpty()))
            {
                var ids = details.Select(x => x.Id);
                var cnt = ProductionHelper.Instance.GetCountByIds(ids);
                if (cnt != details.Count())
                {
                    return(Result.GenError <Result>(Error.ProductionNotExist));
                }
                var markedDateTime = DateTime.Now;
                foreach (var detail in details)
                {
                    detail.MarkedDateTime = markedDateTime;
                }
                ProductionHelper.Enable(details);
            }
            else
            {
                if (details.GroupBy(x => x.Name).Any(y => y.Count() > 1))
                {
                    return(Result.GenError <Result>(Error.ProductionDuplicate));
                }
                if (details.Any(x => x.StepIds.Count != x.Rates.Count ||
                                x.StepIds.Count != x.Costs.Count))
                {
                    return(Result.GenError <Result>(Error.ProductionCapacityListError));
                }
                var ids  = details.Select(x => x.Id);
                var data = ProductionHelper.Instance.GetByIds <Production>(ids);
                if (data.Count() != details.Count())
                {
                    return(Result.GenError <Result>(Error.ProductionNotExist));
                }

                var wId            = details.FirstOrDefault()?.WorkshopId ?? 0;
                var userId         = Request.GetIdentityInformation();
                var markedDateTime = DateTime.Now;
                foreach (var detail in details)
                {
                    detail.CreateUserId   = userId;
                    detail.MarkedDateTime = markedDateTime;
                    detail.Remark         = detail.Remark ?? "";
                    detail.FlowList       = detail.Args?.Select(x => x.FlowId).Distinct().Join() ?? "";
                    foreach (var arg in detail.Args)
                    {
                        arg.WorkshopId     = wId;
                        arg.CreateUserId   = userId;
                        arg.MarkedDateTime = markedDateTime;
                        arg.ProductionId   = detail.Id;
                        arg.Para           = arg.Para ?? "";
                        arg.Other          = arg.Other ?? "";
                    }
                }
                var newDetails = details.Where(x => ClassExtension.HaveChange(x, data.First(y => y.Id == x.Id)));
                if (newDetails.Any())
                {
                    var tIds      = newDetails.Select(x => x.TypeId).Distinct();
                    var flowTypes = FlowTypeHelper.Instance.GetByIds <FlowType>(tIds).ToDictionary(x => x.Id);
                    if (tIds.Count() != flowTypes.Count)
                    {
                        return(Result.GenError <Result>(Error.FlowTypeNotExist));
                    }

                    var cIds = newDetails.Select(x => x.CapacityId).Distinct();
                    var cnt  = CapacityHelper.Instance.GetCountByIds(cIds);
                    if (cIds.Count() != cnt)
                    {
                        return(Result.GenError <Result>(Error.CapacityNotExist));
                    }

                    var aTypeFlows = FlowCodeHelper.GetDetails(wId, null, tIds);
                    var flowIds    = newDetails.SelectMany(x => x.FlowIds).Distinct();
                    if (flowIds.Any(x => aTypeFlows.All(y => y.Id != x)))
                    {
                        return(Result.GenError <Result>(Error.FlowCodeNotExist));
                    }

                    var typeFlows = aTypeFlows.Where(x => flowIds.Contains(x.Id));
                    var flowCodes = typeFlows.ToDictionary(x => x.Id);
                    if (flowIds.Count() != flowCodes.Count)
                    {
                        return(Result.GenError <Result>(Error.FlowCodeNotExist));
                    }

                    if (newDetails.Count(detail =>
                    {
                        var fIds = detail.Args.Select(arg => arg.FlowId).Distinct();
                        return(fIds.Any(fId =>
                        {
                            var mFcDic = detail.Args.Where(x => x.FlowId == fId).GroupBy(x => x.StepId).ToDictionary(y => y.Key, y => y.Count());
                            var fcDic = flowCodes[fId].StepIds.GroupBy(y => y).ToDictionary(y => y.Key, y => y.Count());
                            return detail.Args.Count(x => x.FlowId == fId) != flowCodes[fId].StepIds.Count ||
                            mFcDic.Any(x => x.Value != fcDic[x.Key]);
                        }));
                    }) > 0)
                    {
                        return(Result.GenError <Result>(Error.ProductionFlowCodeStepCountError));
                    }

                    var sames = newDetails.Select(x => x.Name);
                    if (ProductionHelper.GetHaveSame(wId, sames, ids))
                    {
                        return(Result.GenError <Result>(Error.ProductionIsExist));
                    }

                    var stepIds = newDetails.SelectMany(x => x.StepIds).Distinct();
                    if (stepIds.Any())
                    {
                        var steps     = FlowStepHelper.Instance.GetByIds <FlowStep>(stepIds).ToDictionary(x => x.Id);
                        var formatIds = steps.Values.Select(x => x.FormatId).Distinct();
                        if (formatIds.Any())
                        {
                            var formats = ArgsFormatHelper.Instance.GetByIds <ArgsFormat>(formatIds).ToDictionary(x => x.Id);
                            if (newDetails.Any(x => x.Args.Any(arg =>
                            {
                                if (steps.ContainsKey(arg.StepId) && steps[arg.StepId].FormatId != 0 && formats.ContainsKey(steps[arg.StepId].FormatId))
                                {
                                    var format = formats[steps[arg.StepId].FormatId];
                                    return(ArgsFormatHelper.CheckPara(format, arg.Para));
                                }
                                return(false);
                            })))
                            {
                                return(Result.GenError <Result>(Error.ProductionFlowCodeStepFormatError));
                            }
                        }
                    }
                    ProductionHelper.Instance.Update(newDetails);
                }

                var args    = ProductionArgHelper.GetMenus(ids, null);
                var argTmps = details.SelectMany(x => x.Args);
                var add     = new List <ProductionArg>();
                var up      = new List <ProductionArg>();
                var del     = new List <int>();
                add.AddRange(argTmps.Where(x => x.Id == 0));
                up.AddRange(argTmps.Where(x => x.Id != 0).Where(x => argTmps.Any(y => ClassExtension.HaveChange(y, x))));
                del.AddRange(args.Where(x => !argTmps.Any(y => y.Id == x.Id)).Select(x => x.Id));
                if (add.Any())
                {
                    ProductionArgHelper.Instance.Add(add);
                }
                if (up.Any())
                {
                    ProductionArgHelper.Instance.Update <ProductionArg>(up);
                }
                if (del.Any())
                {
                    ProductionArgHelper.Instance.Delete(del);
                }
            }
            return(Result.GenError <Result>(Error.Success));
        }