示例#1
0
        public Result StartManufactureTask([FromQuery] int tId)
        {
            var sql =
                "SELECT * FROM manufacture_plan_task WHERE Id = @tId AND MarkedDelete = 0;";
            var task = ServerConfig.ApiDb.Query <ManufacturePlanTask>(sql, new { tId }).FirstOrDefault();

            if (task == null)
            {
                return(Result.GenError <Result>(Error.ManufactureTaskItemNotExist));
            }
            if (task.State != ManufacturePlanTaskState.Stop)
            {
                return(Result.GenError <Result>(Error.ManufactureTaskStateError));
            }
            var plan =
                ServerConfig.ApiDb.Query <ManufacturePlan>("SELECT * FROM `manufacture_plan` WHERE `Id` = @PlanId;",
                                                           new { task.PlanId }).FirstOrDefault();

            //sql =
            //    "SELECT COUNT(1) FROM `manufacture_plan_task` WHERE PlanId = @PlanId AND Relation = @Order AND MarkedDelete = 0";
            //var cnt = ServerConfig.ApiDb.Query<int>(sql, new { task.PlanId, task.Order }).FirstOrDefault();
            //if (cnt > 0)
            //{
            //    return Result.GenError<Result>(Error.ManufacturePlaneTaskStopHaveRelation);
            //}

            var changes        = new List <ManufactureLog>();
            var createUserId   = Request.GetIdentityInformation();
            var markedDateTime = DateTime.Now;

            task.State = ManufacturePlanTaskState.Wait;
            if (task.IsCheck)
            {
                sql =
                    "SELECT * FROM manufacture_plan_task WHERE PlanId = @PlanId AND `Order` = @Relation";
                var preTask = ServerConfig.ApiDb.Query <ManufacturePlanTask>(sql, new { task.PlanId, task.Relation }).FirstOrDefault();
                if (preTask != null && preTask.State == ManufacturePlanTaskState.Done)
                {
                    task.State = ManufacturePlanTaskState.WaitCheck;
                }
            }
            var change = new ManufactureLog
            {
                Time     = markedDateTime,
                Account  = createUserId,
                PlanId   = task.PlanId,
                IsAssign = true,
                TaskId   = task.OldId != 0 ? plan?.TaskId ?? 0 : 0,
                ItemId   = task.Id,
                Type     = ManufactureLogType.StopTask,
            };

            changes.Add(change);
            ServerConfig.ApiDb.Execute("UPDATE manufacture_plan_task SET `MarkedDateTime`= NOW(), `State` = @State WHERE `Id` = @Id;", task);

            ManufactureLog.AddLog(changes);
            return(Result.GenError <Result>(Error.Success));
        }
示例#2
0
        public Result AddManufactureTask([FromBody] ManufacturePlanTask task)
        {
            var plan =
                ServerConfig.ApiDb.Query <ManufacturePlan>("SELECT * FROM `manufacture_plan` WHERE `Id` = @PlanId AND MarkedDelete = 0;",
                                                           new { task.PlanId }).FirstOrDefault();

            if (plan == null)
            {
                return(Result.GenError <Result>(Error.ManufacturePlanNotExist));
            }

            if (plan.State == ManufacturePlanState.Wait)
            {
                return(Result.GenError <Result>(Error.ManufacturePlaneNotAssign));
            }

            if (task.Item.IsNullOrEmpty())
            {
                return(Result.GenError <Result>(Error.ManufactureTaskItemNotEmpty));
            }
            //if (task.Order <= 0)
            //{
            //    return Result.GenError<Result>(Error.ManufactureTaskItemOrderError);
            //}
            var changes              = new List <ManufactureLog>();
            var createUserId         = Request.GetIdentityInformation();
            var markedDateTime       = DateTime.Now;
            var totalOrder           = task.TotalOrder;
            var manufacturePlanTasks =
                ServerConfig.ApiDb.Query <ManufacturePlanTask>("SELECT * FROM `manufacture_plan_task` WHERE PlanId = @PlanId AND MarkedDelete = 0 ORDER BY `Order`;", new { task.PlanId });

            var planChange = new ManufactureLog
            {
                Time       = markedDateTime,
                Account    = createUserId,
                PlanId     = plan.Id,
                IsAssign   = true,
                Type       = ManufactureLogType.PlanUpdateItem,
                ParsingWay = 1,
            };
            var now = DateTime.Now;

            task.CreateUserId = createUserId;
            task.Desc         = task.Desc ?? "";
            task.State        = ManufacturePlanTaskState.Wait;
            if (!manufacturePlanTasks.Any())
            {
                task.Order          = 1;
                task.MarkedDateTime = now;
                if (task.Relation != 0)
                {
                    return(Result.GenError <Result>(Error.ManufactureTaskItemRelationError));
                }
                if (task.IsCheck && task.Relation == 0)
                {
                    return(Result.GenError <Result>(Error.ManufactureCheckItemNoRelation));
                }
                ServerConfig.ApiDb.Execute(
                    "UPDATE manufacture_plan_task SET `MarkedDateTime`= NOW(), `TotalOrder` = `TotalOrder` + 1 WHERE `TotalOrder` > @totalOrder;",
                    new { totalOrder });
                task.TotalOrder++;
                task.Id = ServerConfig.ApiDb.Query <int>(
                    "INSERT INTO manufacture_plan_task(`CreateUserId`, `MarkedDateTime`, `TotalOrder`, `PlanId`, `Order`, `Person`, `ModuleId`, `IsCheck`, `CheckId`, `Item`, `EstimatedHour`, `EstimatedMin`, `Score`, `Relation`) " +
                    "VALUES (@CreateUserId, @MarkedDateTime, @TotalOrder, @PlanId, @Order, @Person, @ModuleId, @IsCheck, @CheckId, @Item, @EstimatedHour, @EstimatedMin, @Score, @Relation)" +
                    ";SELECT LAST_INSERT_ID();", task).FirstOrDefault();

                planChange.ParamList.Add(new ManufactureLogItem
                {
                    Type  = ManufactureLogType.AddPlanTaskFormat,
                    Field = task.Order.ToString()
                });
                changes.Add(planChange);
                changes.Add(new ManufactureLog
                {
                    Time     = markedDateTime,
                    Account  = createUserId,
                    PlanId   = plan.Id,
                    IsAssign = true,
                    ItemId   = task.Id,
                    Type     = ManufactureLogType.TaskCreate
                });
            }
            else
            {
                if (task.Relation != 0 && manufacturePlanTasks.All(x => x.Order != task.Relation))
                {
                    return(Result.GenError <Result>(Error.ManufactureTaskItemRelationError));
                }

                if (task.IsCheck && task.Relation == 0)
                {
                    return(Result.GenError <Result>(Error.ManufactureCheckItemNoRelation));
                }

                var pre         = manufacturePlanTasks.LastOrDefault(x => x.TotalOrder == totalOrder);
                var insertIndex = pre?.Order ?? 0;
                task.Order = insertIndex + 1;
                foreach (var manufacturePlanTask in manufacturePlanTasks.Where(x => x.TotalOrder > totalOrder))
                {
                    manufacturePlanTask.MarkedDateTime = now;
                    var oldManufacturePlanTask = (ManufacturePlanTask)manufacturePlanTask.Clone();
                    manufacturePlanTask.Order++;
                    if (manufacturePlanTask.Relation > insertIndex)
                    {
                        manufacturePlanTask.Relation++;
                    }

                    if (oldManufacturePlanTask.HaveChange(manufacturePlanTask, out var change))
                    {
                        change.Time    = markedDateTime;
                        change.Account = createUserId;
                        change.PlanId  = manufacturePlanTask.PlanId;
                        change.TaskId  = manufacturePlanTask.TaskId;
                        change.ItemId  = manufacturePlanTask.Id;
                        planChange.ParamList.Add(new ManufactureLogItem
                        {
                            Type  = ManufactureLogType.UpdatePlanTaskFormat,
                            Field = oldManufacturePlanTask.Order.ToString(),
                            Items = change.ParamList.Select(y =>
                            {
                                y.Type = ManufactureLogType.UpdatePlanTaskItemFormat;
                                return(y);
                            })
                        });
                        changes.Add(change);
                    }
                }

                planChange.ParamList.Add(new ManufactureLogItem
                {
                    Type  = ManufactureLogType.AddPlanTaskFormat,
                    Field = task.Order.ToString()
                });
                changes.Add(planChange);
                ServerConfig.ApiDb.Execute(
                    "UPDATE manufacture_plan_task SET `MarkedDateTime`= NOW(), `TotalOrder` = `TotalOrder` + 1 WHERE `TotalOrder` > @totalOrder AND MarkedDelete = 0;",
                    new { totalOrder });

                ServerConfig.ApiDb.Execute(
                    "UPDATE manufacture_plan_task SET `MarkedDateTime`= NOW(), `Order` = @Order, `Relation` = @Relation WHERE `Id` = @Id;", manufacturePlanTasks);

                var relationTask = manufacturePlanTasks.FirstOrDefault(x => x.Order == task.Relation);
                if (relationTask != null && relationTask.State == ManufacturePlanTaskState.Done && task.IsCheck)
                {
                    task.State = ManufacturePlanTaskState.WaitCheck;
                }
                task.TotalOrder++;
                task.MarkedDateTime = markedDateTime;
                task.Id             = ServerConfig.ApiDb.Query <int>("INSERT INTO manufacture_plan_task (`CreateUserId`, `MarkedDateTime`, `TotalOrder`, `PlanId`, `Order`, `Person`, `ModuleId`, `IsCheck`, `CheckId`, `Item`, `EstimatedHour`, `EstimatedMin`, `Score`, `Relation`, `State`) " +
                                                                     "VALUES (@CreateUserId, @MarkedDateTime, @TotalOrder, @PlanId, @Order, @Person, @ModuleId, @IsCheck, @CheckId, @Item, @EstimatedHour, @EstimatedMin, @Score, @Relation, @State);SELECT LAST_INSERT_ID();", task).FirstOrDefault();

                changes.Add(new ManufactureLog
                {
                    Time     = markedDateTime,
                    Account  = createUserId,
                    PlanId   = plan.Id,
                    IsAssign = true,
                    ItemId   = task.Id,
                    Type     = ManufactureLogType.TaskCreate
                });

                ServerConfig.ApiDb.Execute("UPDATE manufacture_plan_item SET `Order` = `Order` + 1 WHERE `PlanId` = @Id AND MarkedDelete = 0 AND `State` = @State;", new
                {
                    plan.Id,
                    State = ManufacturePlanItemState.WaitAssign
                });
            }

            ManufactureLog.AddLog(changes);
            return(Result.GenError <Result>(Error.Success));
        }
示例#3
0
        public Result DeleteManufacturePlan([FromQuery] int tId)
        {
            var sql =
                "SELECT * FROM manufacture_plan_task WHERE Id = @tId AND MarkedDelete = 0;";
            var task = ServerConfig.ApiDb.Query <ManufacturePlanTask>(sql, new { tId }).FirstOrDefault();

            if (task == null)
            {
                return(Result.GenError <Result>(Error.ManufactureTaskItemNotExist));
            }
            var plan =
                ServerConfig.ApiDb.Query <ManufacturePlan>("SELECT * FROM `manufacture_plan` WHERE `Id` = @PlanId;",
                                                           new { task.PlanId }).FirstOrDefault();

            sql =
                "SELECT COUNT(1) FROM `manufacture_plan_task` WHERE PlanId = @PlanId AND Relation = @Order AND MarkedDelete = 0";
            var cnt = ServerConfig.ApiDb.Query <int>(sql, new { task.PlanId, task.Order }).FirstOrDefault();

            if (cnt > 0)
            {
                return(Result.GenError <Result>(Error.ManufacturePlaneTaskDeleteHaveRelation));
            }

            var manufacturePlanTasks =
                ServerConfig.ApiDb.Query <ManufacturePlanTask>("SELECT * FROM `manufacture_plan_task` WHERE PlanId = @PlanId AND MarkedDelete = 0 ORDER BY `Order`;", new { task.PlanId });

            var changes        = new List <ManufactureLog>();
            var createUserId   = Request.GetIdentityInformation();
            var markedDateTime = DateTime.Now;

            task = manufacturePlanTasks.First(x => x.Id == tId);
            task.MarkedDelete = true;

            var planChange = new ManufactureLog
            {
                Time       = markedDateTime,
                Account    = createUserId,
                PlanId     = task.PlanId,
                IsAssign   = true,
                Type       = ManufactureLogType.PlanUpdateItem,
                ParsingWay = 1,
            };
            var pre         = manufacturePlanTasks.LastOrDefault(x => x.TotalOrder < task.TotalOrder);
            var insertIndex = task?.Order ?? 0;

            //task.Order = insertIndex + 1;
            foreach (var manufacturePlanTask in manufacturePlanTasks.Where(x => x.TotalOrder > task.TotalOrder))
            {
                var oldManufacturePlanTask = (ManufacturePlanTask)manufacturePlanTask.Clone();
                manufacturePlanTask.Order--;
                if (manufacturePlanTask.Relation > task.Order)
                {
                    manufacturePlanTask.Relation--;
                }

                if (oldManufacturePlanTask.HaveChange(manufacturePlanTask, out var change))
                {
                    planChange.ParamList.Add(new ManufactureLogItem
                    {
                        Type  = ManufactureLogType.UpdatePlanTaskFormat,
                        Field = task.Order.ToString(),
                        Items = change.ParamList.Select(y =>
                        {
                            y.Type = ManufactureLogType.UpdatePlanTaskItemFormat;
                            return(y);
                        })
                    });
                    changes.Add(change);
                }
            }

            planChange.ParamList.Add(new ManufactureLogItem
            {
                Type  = ManufactureLogType.DeletePlanTaskFormat,
                Field = task.Order.ToString()
            });
            changes.Add(planChange);

            ServerConfig.ApiDb.Execute(
                "UPDATE manufacture_plan_task SET `MarkedDelete` = @MarkedDelete, `MarkedDateTime`= NOW(), `Order` = @Order, `Relation` = @Relation WHERE `Id` = @Id;", manufacturePlanTasks);

            ServerConfig.ApiDb.Execute(
                "UPDATE manufacture_plan_task SET `MarkedDateTime`= NOW(), `TotalOrder` = `TotalOrder` - 1 WHERE `TotalOrder` > @totalOrder;",
                new { task.TotalOrder });
            changes.Add(new ManufactureLog
            {
                Time     = markedDateTime,
                Account  = createUserId,
                PlanId   = task.PlanId,
                TaskId   = task.OldId != 0 ? plan?.TaskId ?? 0 : 0,
                IsAssign = true,
                ItemId   = task.Id,
                Type     = ManufactureLogType.TaskDelete
            });

            if (plan != null)
            {
                ServerConfig.ApiDb.Execute(
                    "UPDATE manufacture_plan_item SET `Order` = `Order` - 1 WHERE `PlanId` = @Id AND MarkedDelete = 0 AND `State` = @State;",
                    new
                {
                    plan.Id,
                    State = ManufacturePlanItemState.WaitAssign
                });
            }

            ManufactureLog.AddLog(changes);
            return(Result.GenError <Result>(Error.Success));
        }
示例#4
0
        public Result PutManufacturePlanTask([FromBody] ManufacturePlanTask task)
        {
            if (task.Id == 0)
            {
                return(Result.GenError <Result>(Error.ManufactureTaskNotExist));
            }

            var oldTask =
                ServerConfig.ApiDb.Query <ManufacturePlanTask>(
                    "SELECT a.*, IFNULL(b.Name, '') Processor FROM `manufacture_plan_task` a " +
                    "LEFT JOIN (SELECT a.*, b.Name FROM `manufacture_processor` a JOIN `accounts` b ON a.ProcessorId = b.Id WHERE a.MarkedDelete = 0) b ON a.Person = b.Id WHERE a.Id = @Id AND a.MarkedDelete = 0;;",
                    new { task.PlanId, task.Id }).FirstOrDefault();

            if (oldTask == null)
            {
                return(Result.GenError <Result>(Error.ManufactureTaskItemNotExist));
            }

            var changes = new List <ManufactureLog>();

            task.TotalOrder      = oldTask.TotalOrder;
            task.PlanId          = oldTask.PlanId;
            task.TaskId          = oldTask.TaskId;
            task.Order           = oldTask.Order;
            task.OldId           = oldTask.OldId;
            task.Person          = task.Person == 0 ? oldTask.Person : task.Person;
            task.ModuleId        = oldTask.ModuleId;
            task.IsCheck         = oldTask.IsCheck;
            task.CheckId         = oldTask.CheckId;
            task.Relation        = oldTask.Relation;
            task.FirstStartTime  = oldTask.FirstStartTime;
            task.PauseTime       = oldTask.PauseTime;
            task.ActualStartTime = oldTask.ActualStartTime;
            task.ActualEndTime   = oldTask.ActualEndTime;
            var createUserId   = Request.GetIdentityInformation();
            var markedDateTime = DateTime.Now;
            var changeTask     = false;
            var keys           = new List <string> {
                "Person", "EstimatedHour", "EstimatedMin", "Score", "Desc", "ActualHour", "ActualMin", "ActualScore", "CheckResult"
            };

            if (oldTask.HaveChange(task, out var taskChange, keys))
            {
                changeTask          = true;
                taskChange.Time     = markedDateTime;
                taskChange.Account  = createUserId;
                taskChange.PlanId   = task.PlanId;
                taskChange.IsAssign = true;
                taskChange.TaskId   = task.TaskId;
                taskChange.ItemId   = task.Id;
                changes.Add(taskChange);
            }

            if (oldTask.IsCheck)
            {
                ManufacturePlanTask preTask;
                if (oldTask.CheckResult != ManufacturePlanCheckState.Redo &&
                    task.CheckResult == ManufacturePlanCheckState.Redo)
                {
                    var sql =
                        "SELECT * FROM `manufacture_plan_task` WHERE PlanId = @PlanId AND `Order` = @Relation;";
                    preTask = ServerConfig.ApiDb.Query <ManufacturePlanTask>(sql, new { oldTask.PlanId, oldTask.Relation })
                              .FirstOrDefault();
                    if (preTask != null)
                    {
                        if (preTask.State == ManufacturePlanTaskState.Done)
                        {
                            var oldPreTask = (ManufacturePlanTask)preTask.Clone();
                            preTask.State = preTask.IsCheck
                                ? ManufacturePlanTaskState.WaitCheck
                                : ManufacturePlanTaskState.WaitRedo;
                            preTask.RedoCount++;
                            preTask.IsRedo = true;
                            keys           = new List <string> {
                                "State"
                            };
                            if (oldPreTask.HaveChange(preTask, out var change, keys))
                            {
                                change.Time     = markedDateTime;
                                change.Account  = createUserId;
                                change.PlanId   = preTask.PlanId;
                                change.IsAssign = true;
                                change.TaskId   = preTask.TaskId;
                                change.ItemId   = preTask.Id;
                                changes.Add(change);
                            }

                            ServerConfig.ApiDb.Execute(
                                "UPDATE manufacture_plan_task SET `State` = @State, `RedoCount` = @RedoCount, `IsRedo` = @IsRedo WHERE `Id` = @Id;",
                                preTask);
                        }
                        else
                        {
                            return(Result.GenError <DataResult>(Error.ManufacturePlaneTaskNotDone));
                        }
                    }
                }

                if (oldTask.CheckResult == ManufacturePlanCheckState.Redo &&
                    task.CheckResult != ManufacturePlanCheckState.Redo)
                {
                    var sql =
                        "SELECT * FROM `manufacture_plan_task` WHERE PlanId = @PlanId AND `Order` = @Relation;";
                    preTask = ServerConfig.ApiDb.Query <ManufacturePlanTask>(sql, new { oldTask.PlanId, oldTask.Relation })
                              .FirstOrDefault();
                    if (preTask != null)
                    {
                        if (preTask.State == ManufacturePlanTaskState.WaitRedo ||
                            preTask.State == ManufacturePlanTaskState.WaitCheck)
                        {
                            var oldPreTask = (ManufacturePlanTask)preTask.Clone();
                            preTask.State = ManufacturePlanTaskState.Done;
                            preTask.RedoCount--;
                            preTask.IsRedo = preTask.RedoCount > 0;

                            keys = new List <string> {
                                "State"
                            };
                            if (oldPreTask.HaveChange(preTask, out var change, keys))
                            {
                                change.Time     = markedDateTime;
                                change.Account  = createUserId;
                                change.PlanId   = preTask.PlanId;
                                change.IsAssign = true;
                                change.TaskId   = preTask.TaskId;
                                change.ItemId   = preTask.Id;
                                changes.Add(change);
                            }

                            ServerConfig.ApiDb.Execute(
                                "UPDATE manufacture_plan_task SET `State` = @State, `RedoCount` = @RedoCount, `IsRedo` = @IsRedo WHERE `Id` = @Id;",
                                preTask);
                        }
                        else
                        {
                            return(Result.GenError <DataResult>(Error.ManufacturePlaneTaskNotWaitRedo));
                        }
                    }
                }

                var checkItemChange = new ManufactureLog
                {
                    Time     = markedDateTime,
                    Account  = createUserId,
                    PlanId   = task.PlanId,
                    IsAssign = true,
                    TaskId   = task.TaskId,
                    ItemId   = task.Id,
                    Type     = ManufactureLogType.UpdateCheckItem
                };

                var data =
                    ServerConfig.ApiDb.Query <ManufacturePlanCheckItem>(
                        "SELECT * FROM `manufacture_plan_check_item` WHERE PlanId = @PlanId AND ItemId = @Id AND MarkedDelete = 0;",
                        new { task.PlanId, task.Id });

                if (task.Items != null && task.Items.Any())
                {
                    var update = false;
                    foreach (var item in task.Items)
                    {
                        var d = data.FirstOrDefault(x => x.Id == item.Id);
                        if (d == null)
                        {
                            continue;
                        }

                        item.Desc   = item.Desc ?? d.Desc;
                        item.Images = item.Images ?? d.Images;
                        if (d.HaveChange(item, out var change))
                        {
                            update          = true;
                            change.Time     = markedDateTime;
                            change.Account  = createUserId;
                            change.PlanId   = task.PlanId;
                            change.IsAssign = true;
                            change.TaskId   = task.TaskId;
                            change.ItemId   = task.Id;
                            change.Type     = ManufactureLogType.UpdateCheckItem;
                            changes.Add(change);
                        }
                    }

                    if (update)
                    {
                        changes.Add(checkItemChange);
                        ServerConfig.ApiDb.Execute(
                            "UPDATE manufacture_plan_check_item SET `CheckTime` = @CheckTime, `Desc` = @Desc, `Result` = @Result, `Images` = @Images WHERE `Id` = @Id;",
                            task.Items);
                    }
                }
            }

            if (changeTask)
            {
                ServerConfig.ApiDb.Execute("UPDATE manufacture_plan_task SET `Person` = @Person, `EstimatedHour` = @EstimatedHour, `EstimatedMin` = @EstimatedMin, `Score` = @Score, `Desc` = @Desc, `ActualHour` = @ActualHour, `ActualMin` = @ActualMin, `ActualScore` = @ActualScore, `CheckResult` = @CheckResult WHERE `Id` = @Id;", task);
            }

            ManufactureLog.AddLog(changes);
            return(Result.GenError <Result>(Error.Success));
        }
示例#5
0
        public DataResult UpManufacturePlanTask([FromBody] ManufacturePlanTaskUp moveTask)
        {
            if (moveTask.FromOrder == 0 || moveTask.ToOrder == 0)
            {
                return(Result.GenError <DataResult>(Error.ManufactureTaskItemNotExist));
            }

            var tasks =
                ServerConfig.ApiDb.Query <ManufacturePlanTask>("SELECT * FROM `manufacture_plan_task` WHERE MarkedDelete = 0 AND TotalOrder <= @FromOrder AND TotalOrder >= @ToOrder Order By TotalOrder;", moveTask);

            if (tasks.Count() < 2)
            {
                return(Result.GenError <DataResult>(Error.ManufactureTaskItemNotExist));
            }

            if (tasks.Select(x => x.TotalOrder).All(y => y != moveTask.FromOrder && y != moveTask.ToOrder))
            {
                return(Result.GenError <DataResult>(Error.ManufactureTaskItemNotExist));
            }
            var fromTask = (ManufacturePlanTask)tasks.First(x => x.TotalOrder == moveTask.FromOrder).Clone();
            var toTask   = (ManufacturePlanTask)tasks.First(x => x.TotalOrder == moveTask.ToOrder).Clone();

            //无法上移非等待中/非待检验任务
            if ((fromTask.State != ManufacturePlanTaskState.Wait && fromTask.State != ManufacturePlanTaskState.WaitCheck && fromTask.State != ManufacturePlanTaskState.WaitRedo))
            {
                return(Result.GenError <DataResult>(Error.ManufacturePlaneTaskNotWait));
            }

            var count = tasks.Count();
            var state = fromTask.IsCheck ? ManufacturePlanTaskState.Checking : ManufacturePlanTaskState.Doing;
            var res   = fromTask.IsCheck ? Error.ManufacturePlaneTaskCheckAfterChecking : Error.ManufacturePlaneTaskAfterDoing;

            //不能上移到该操作工的进行中/检验中任务之前
            if (tasks.Take(count - 1).Any(x => x.Person == fromTask.Person && x.State == state))
            {
                return(Result.GenError <DataResult>(res));
            }

            //不能上移到关联任务之前
            if (tasks.Take(count - 1).Any(x => x.PlanId == fromTask.PlanId && x.Order == fromTask.Relation))
            {
                return(Result.GenError <DataResult>(Error.ManufacturePlaneTaskAfterDoing));
            }

            var changes  = new List <ManufactureLog>();
            var newTasks = new Dictionary <int, ManufacturePlanTask>();

            newTasks.AddRange(tasks.Take(count - 1).OrderByDescending(x => x.TotalOrder).ToDictionary(x => x.Id));
            var changeOrder = new List <Tuple <int, int> >();

            foreach (var task in newTasks.Values)
            {
                if (task.PlanId == fromTask.PlanId)
                {
                    //if (task.Relation != 0)
                    //{
                    //    task.Relation++;
                    //}
                    changeOrder.Add(new Tuple <int, int>(task.Order, task.Order + 1));
                    task.Order++;
                }
                task.TotalOrder++;
            }
            newTasks = newTasks.Values.OrderBy(x => x.TotalOrder).ToDictionary(x => x.Id);
            newTasks.Add(fromTask.Id, fromTask);
            newTasks.Values.Last().TotalOrder = newTasks.Values.First().TotalOrder - 1;
            var oldOrder = fromTask.Order;

            if (fromTask.PlanId == toTask.PlanId)
            {
                newTasks.Values.Last().Order = toTask.Order;
            }

            if (newTasks.Values.Last().Order <= 0)
            {
                newTasks.Values.Last().Order = 1;
            }
            changeOrder.Add(new Tuple <int, int>(oldOrder, newTasks.Values.Last().Order));
            if (changeOrder.Any())
            {
                var changeOrderTasks =
                    ServerConfig.ApiDb.Query <ManufacturePlanTask>("SELECT * FROM `manufacture_plan_task` WHERE MarkedDelete = 0 AND `PlanId` = @PlanId AND `Relation` IN @Relation;", new
                {
                    PlanId   = fromTask.PlanId,
                    Relation = changeOrder.Select(x => x.Item2)
                });
                var chOrderTasks = new List <Tuple <int, int> >();
                foreach (var chTuple in changeOrder)
                {
                    chOrderTasks.AddRange(changeOrderTasks.Where(x => x.Relation == chTuple.Item1).Select(y => new Tuple <int, int>(y.Id, chTuple.Item2)));
                }
                ServerConfig.ApiDb.Execute("UPDATE manufacture_plan_task SET `MarkedDateTime`= NOW(), `Relation` = @Item2 WHERE `Id` = @Item1;", chOrderTasks);
            }
            var createUserId   = Request.GetIdentityInformation();
            var markedDateTime = DateTime.Now;
            var planChange     = new ManufactureLog
            {
                Time       = markedDateTime,
                Account    = createUserId,
                PlanId     = fromTask.PlanId,
                IsAssign   = true,
                Type       = ManufactureLogType.PlanUpdateItem,
                ParsingWay = 1,
            };

            foreach (var oldTask in tasks.Where(x => x.PlanId == fromTask.PlanId))
            {
                if (newTasks.ContainsKey(oldTask.Id))
                {
                    var newTask = newTasks[oldTask.Id];
                    if (oldTask.HaveChange(newTask, out var change))
                    {
                        planChange.ParamList.Add(new ManufactureLogItem
                        {
                            Type  = ManufactureLogType.UpdatePlanTaskFormat,
                            Field = newTask.Order.ToString(),
                            Items = change.ParamList.Select(y =>
                            {
                                y.Type = ManufactureLogType.UpdatePlanTaskItemFormat;
                                return(y);
                            })
                        });
                        changes.Add(change);
                    }
                }
            }

            changes.Add(planChange);
            ServerConfig.ApiDb.Execute("UPDATE manufacture_plan_task SET `MarkedDateTime`= NOW(), `TotalOrder` = @TotalOrder, `Order` = @Order, `Relation` = @Relation WHERE `Id` = @Id;", newTasks.Values);
            ManufactureLog.AddLog(changes);
            var result = new DataResult();

            result.datas.AddRange(newTasks.Values.Where(x => x.Id == fromTask.Id || x.Id == toTask.Id));
            return(result);
        }
        public DataResult PostManufacturePlan([FromBody] ManufacturePlanTasks manufacturePlan)
        {
            if (manufacturePlan.Plan.IsNullOrEmpty())
            {
                return(Result.GenError <DataResult>(Error.ManufacturePlanNotEmpty));
            }
            var cnt =
                ServerConfig.ApiDb.Query <int>("SELECT COUNT(1) FROM `manufacture_plan` WHERE `Plan` = @Plan AND MarkedDelete = 0;",
                                               new { manufacturePlan.Plan }).FirstOrDefault();

            if (cnt > 0)
            {
                return(Result.GenError <DataResult>(Error.ManufacturePlanIsExist));
            }
            cnt =
                ServerConfig.ApiDb.Query <int>("SELECT COUNT(1) FROM `manufacture_task` WHERE Id = @Id AND MarkedDelete = 0;",
                                               new { Id = manufacturePlan.TaskId }).FirstOrDefault();
            if (cnt == 0)
            {
                return(Result.GenError <DataResult>(Error.ManufactureTaskNotExist));
            }

            var items          = manufacturePlan.Items;
            var createUserId   = Request.GetIdentityInformation();
            var markedDateTime = DateTime.Now;
            var result         = new DataResult();

            if (items != null && items.Any())
            {
                items = manufacturePlan.Items.OrderBy(x => x.Order);
                if (items.Any(x => x.Item.IsNullOrEmpty()))
                {
                    return(Result.GenError <DataResult>(Error.ManufactureTaskItemNotEmpty));
                }

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

                if (items.Any(x => x.IsCheck && x.Relation == 0))
                {
                    return(Result.GenError <DataResult>(Error.ManufactureCheckItemNoRelation));
                }
                var oldToNew = new Dictionary <int, int>();
                var i        = 0;
                foreach (var item in items)
                {
                    oldToNew.Add(item.Order, ++i);
                    item.Order = oldToNew[item.Order];
                    if (item.Relation != 0)
                    {
                        item.Relation = oldToNew[item.Relation];
                    }
                }

                foreach (var item in items)
                {
                    if (item.Order <= item.Relation ||
                        (item.Relation != 0 && items.All(x => x.Order != item.Relation)))
                    {
                        result.errno = Error.ManufactureTaskItemRelationError;
                        result.datas.Add(item.Item);
                        return(result);
                    }
                    item.CreateUserId   = createUserId;
                    item.MarkedDateTime = markedDateTime;
                    item.Desc           = item.Desc ?? "";
                }
            }
            manufacturePlan.CreateUserId   = createUserId;
            manufacturePlan.MarkedDateTime = markedDateTime;
            manufacturePlan.Id             = ServerConfig.ApiDb.Query <int>("INSERT INTO manufacture_plan (`CreateUserId`, `MarkedDateTime`, `State`, `Plan`, `PlannedStartTime`, `PlannedEndTime`, `EstimatedHour`, `EstimatedMin`, `TaskId`) " +
                                                                            "VALUES (@CreateUserId, @MarkedDateTime, @State, @Plan, @PlannedStartTime, @PlannedEndTime, @EstimatedHour, @EstimatedMin, @TaskId);SELECT LAST_INSERT_ID();", manufacturePlan).FirstOrDefault();
            var changes = new List <ManufactureLog>
            {
                new ManufactureLog
                {
                    Time    = markedDateTime,
                    Account = createUserId,
                    PlanId  = manufacturePlan.Id,
                    TaskId  = manufacturePlan.TaskId,
                    Type    = ManufactureLogType.PlanCreate
                }
            };

            if (items != null && items.Any())
            {
                foreach (var item in items)
                {
                    item.PlanId = manufacturePlan.Id;
                }
                ServerConfig.ApiDb.Execute(
                    "INSERT INTO manufacture_plan_item (`CreateUserId`, `MarkedDateTime`, `PlanId`, `Order`, `Person`, `ModuleId`, `IsCheck`, `CheckId`, `Item`, `EstimatedHour`, `EstimatedMin`, `Score`, `Desc`, `Relation`) " +
                    "VALUES (@CreateUserId, @MarkedDateTime, @PlanId, @Order, @Person, @ModuleId, @IsCheck, @CheckId, @Item, @EstimatedHour, @EstimatedMin, @Score, @Desc, @Relation);",
                    items);

                var data =
                    ServerConfig.ApiDb.Query <ManufacturePlanItem>("SELECT Id FROM `manufacture_plan_item` WHERE PlanId = @Id AND MarkedDelete = 0;", new { manufacturePlan.Id });

                changes.AddRange(data.Select(x => new ManufactureLog
                {
                    Time    = markedDateTime,
                    Account = createUserId,
                    PlanId  = manufacturePlan.Id,
                    TaskId  = manufacturePlan.TaskId,
                    ItemId  = x.Id,
                    Type    = ManufactureLogType.TaskCreate
                }));
            }
            ManufactureLog.AddLog(changes);
            return(Result.GenError <DataResult>(Error.Success));
        }
        public Result DeleteManufacturePlan([FromBody] BatchDelete batchDelete)
        {
            var changes        = new List <ManufactureLog>();
            var createUserId   = Request.GetIdentityInformation();
            var markedDateTime = DateTime.Now;
            var ids            = batchDelete.ids;
            var data           =
                ServerConfig.ApiDb.Query <ManufacturePlan>("SELECT Id, TaskId, State FROM `manufacture_plan` WHERE Id IN @id AND `MarkedDelete` = 0;", new { id = ids });

            if (!data.Any())
            {
                return(Result.GenError <Result>(Error.ManufacturePlanNotExist));
            }

            if (data.Any(x => x.State != ManufacturePlanState.Wait))
            {
                return(Result.GenError <Result>(Error.ManufacturePlaneAssignState));
            }

            changes.AddRange(data.Select(x => new ManufactureLog
            {
                Time    = markedDateTime,
                Account = createUserId,
                PlanId  = x.Id,
                TaskId  = x.TaskId,
                Type    = ManufactureLogType.PlanDelete
            }));

            var waitPlanIds  = data.Select(x => x.Id);
            var delPlanItems =
                ServerConfig.ApiDb.Query <ManufacturePlanItem>("SELECT Id FROM `manufacture_plan_item` WHERE PlanId IN @Id AND MarkedDelete = 0;", new { Id = waitPlanIds });

            changes.AddRange(delPlanItems.Select(x => new ManufactureLog
            {
                Time    = markedDateTime,
                Account = createUserId,
                PlanId  = x.PlanId,
                TaskId  = data.FirstOrDefault(y => y.Id == x.PlanId)?.TaskId ?? 0,
                ItemId  = x.Id,
                Type    = ManufactureLogType.TaskDelete
            }));
            //var otherIds = data.Select(x => x.Id);
            //if (otherIds.Any())
            //{
            //    delItems =
            //        ServerConfig.ApiDb.Query<ManufacturePlanItem>("SELECT Id FROM `manufacture_plan_task` WHERE PlanId IN @Id AND MarkedDelete = 0;", new { Id = otherIds });
            //    changes.AddRange(delItems.Select(x => new ManufactureLog
            //    {
            //        Time = markedDateTime,
            //        Account = createUserId,
            //        PlanId = x.PlanId,
            //        TaskId = data.FirstOrDefault(y => y.Id == x.PlanId)?.TaskId ?? 0,
            //        ItemId = x.Id,
            //        Type = ManufactureLogType.TaskDelete
            //    }));
            //}

            ManufactureLog.AddLog(changes);
            ServerConfig.ApiDb.Execute(
                "UPDATE `manufacture_plan` SET `MarkedDateTime`= @MarkedDateTime, `MarkedDelete`= @MarkedDelete WHERE `Id` IN @Id;", new
            {
                MarkedDateTime = DateTime.Now,
                MarkedDelete   = true,
                Id             = ids
            });
            ServerConfig.ApiDb.Execute(
                "UPDATE `manufacture_plan_item` SET `MarkedDateTime`= @MarkedDateTime, `MarkedDelete`= @MarkedDelete WHERE `PlanId` IN @Id;", new
            {
                MarkedDateTime = DateTime.Now,
                MarkedDelete   = true,
                Id             = ids
            });

            //ServerConfig.ApiDb.Execute(
            //    "UPDATE `manufacture_plan_task` SET `MarkedDateTime`= @MarkedDateTime, `MarkedDelete`= @MarkedDelete WHERE `PlanId` IN @Id;", new
            //    {
            //        MarkedDateTime = DateTime.Now,
            //        MarkedDelete = true,
            //        Id = ids
            //    });


            return(Result.GenError <Result>(Error.Success));
        }
        public DataResult PutManufacturePlan([FromBody] IEnumerable <ManufacturePlanTasks> manufacturePlans)
        {
            if (manufacturePlans == null || manufacturePlans.Any(x => x.Id == 0))
            {
                return(Result.GenError <DataResult>(Error.ManufacturePlanNotExist));
            }
            var manufacturePlanOlds =
                ServerConfig.ApiDb.Query <ManufacturePlan>("SELECT a.*, b.Task FROM `manufacture_plan` a JOIN `manufacture_task` b ON a.TaskId = b.Id WHERE a.Id IN @Id AND a.MarkedDelete = 0;",
                                                           new { Id = manufacturePlans.Select(x => x.Id) });

            if (manufacturePlanOlds == null || !manufacturePlanOlds.Any() || manufacturePlanOlds.Count() != manufacturePlans.Count())
            {
                return(Result.GenError <DataResult>(Error.ManufacturePlanNotExist));
            }

            //if (manufacturePlanOlds.Any(x => x.State != ManufacturePlanState.Wait))
            //{
            //    return Result.GenError<DataResult>(Error.ManufacturePlaneChangeState);
            //}

            var changes        = new List <ManufactureLog>();
            var createUserId   = Request.GetIdentityInformation();
            var markedDateTime = DateTime.Now;

            foreach (var manufacturePlan in manufacturePlans)
            {
                var manufacturePlanOld = manufacturePlanOlds.FirstOrDefault(x => x.Id == manufacturePlan.Id);
                if (manufacturePlanOld == null)
                {
                    return(Result.GenError <DataResult>(Error.ManufacturePlanNotExist));
                }
                var changeItems = new List <ManufactureLog>();
                var changePlan  = false;
                if (manufacturePlan.Plan != null)
                {
                    if (manufacturePlan.Plan == string.Empty)
                    {
                        return(Result.GenError <DataResult>(Error.ManufacturePlanNotEmpty));
                    }

                    if (manufacturePlan.Plan != manufacturePlanOld.Plan)
                    {
                        var cnt = ServerConfig.ApiDb.Query <int>("SELECT COUNT(1) FROM `manufacture_plan` WHERE `Plan` = @Plan AND MarkedDelete = 0;",
                                                                 new { manufacturePlan.Plan }).FirstOrDefault();
                        if (cnt > 0)
                        {
                            return(Result.GenError <DataResult>(Error.ManufacturePlanIsExist));
                        }
                    }
                }

                if (manufacturePlan.TaskId == 0)
                {
                    return(Result.GenError <DataResult>(Error.ManufactureTaskNotExist));
                }
                if (manufacturePlan.TaskId != manufacturePlanOld.TaskId)
                {
                    var task = ServerConfig.ApiDb.Query <ManufactureTask>("SELECT Id, Task FROM `manufacture_task` WHERE Id = @Id AND MarkedDelete = 0;",
                                                                          new { Id = manufacturePlan.TaskId }).FirstOrDefault();
                    if (task == null)
                    {
                        return(Result.GenError <DataResult>(Error.ManufactureTaskNotExist));
                    }

                    manufacturePlan.Task = task.Task;
                }
                manufacturePlan.Plan             = !manufacturePlan.Plan.IsNullOrEmpty() ? manufacturePlan.Plan : manufacturePlanOld.Plan;
                manufacturePlan.PlannedStartTime = manufacturePlan.PlannedStartTime != default(DateTime) ? manufacturePlan.PlannedStartTime : manufacturePlanOld.PlannedStartTime;
                manufacturePlan.PlannedEndTime   = manufacturePlan.PlannedEndTime != default(DateTime) ? manufacturePlan.PlannedEndTime : manufacturePlanOld.PlannedEndTime;
                if (manufacturePlanOld.HaveChange(manufacturePlan, out var planChange))
                {
                    changePlan = true;
                    manufacturePlan.MarkedDateTime = markedDateTime;
                    planChange.Time    = markedDateTime;
                    planChange.Account = createUserId;
                    planChange.PlanId  = manufacturePlan.Id;
                    planChange.TaskId  = manufacturePlan.TaskId;
                    changes.Add(planChange);
                }

                if (manufacturePlan.Items != null)
                {
                    var changeItem = false;
                    var items      = new List <ManufacturePlanTask>();
                    var add        = false;
                    foreach (var item in manufacturePlan.Items)
                    {
                        if (item.State == ManufacturePlanTaskState.WaitAssign)
                        {
                            add = true;
                        }
                        if (add)
                        {
                            items.Add(item);
                        }
                    }
                    var result = new DataResult();
                    if (items != null && items.Any())
                    {
                        if (items.Any(x => x.State != ManufacturePlanTaskState.WaitAssign))
                        {
                            return(Result.GenError <DataResult>(Error.ManufacturePlaneTaskAfterAssign));
                        }

                        var sql = $"SELECT a.*, IFNULL(b.Plan, '') Plan, IFNULL(c.Name, '') Processor, IFNULL(d.Module, '') Module, IFNULL(e.`Check`, '') `Check` FROM `manufacture_plan_item` a " +
                                  "LEFT JOIN `manufacture_plan` b ON a.PlanId = b.Id " +
                                  "LEFT JOIN (SELECT a.*, b.Name FROM `manufacture_processor` a JOIN `accounts` b ON a.ProcessorId = b.Id WHERE a.MarkedDelete = 0) c ON a.Person = c.Id " +
                                  "LEFT JOIN `manufacture_task_module` d ON a.ModuleId = d.Id " +
                                  "LEFT JOIN `manufacture_check` e ON a.CheckId = e.Id " +
                                  "WHERE a.PlanId = @Id AND a.`State` = @state AND a.MarkedDelete = 0 ORDER BY a.`Order`;";
                        var waitAssign =
                            ServerConfig.ApiDb.Query <ManufacturePlanTask>(sql, new { manufacturePlan.Id, state = ManufacturePlanItemState.WaitAssign });

                        //已下发的和额外添加的
                        var haveManufacturePlanItems = ServerConfig.ApiDb.Query <ManufacturePlanTask>("SELECT * FROM `manufacture_plan_task` WHERE PlanId = @PlanId AND MarkedDelete = 0 ORDER BY `Order`;",
                                                                                                      new { PlanId = manufacturePlan.Id });

                        var max   = haveManufacturePlanItems.Count();
                        var order = max;
                        foreach (var item in items)
                        {
                            item.Order = ++order;
                        }

                        //var oldToNew = new Dictionary<int, int>();
                        //var i = 0;
                        //foreach (var item in items)
                        //{
                        //    oldToNew.Add(item.Order, ++i);
                        //    item.Order = oldToNew[item.Order];
                        //    if (item.Relation != 0)
                        //    {
                        //        item.Relation = oldToNew[item.Relation];
                        //    }
                        //}
                        if (items.Any(x => x.Item.IsNullOrEmpty()))
                        {
                            return(Result.GenError <DataResult>(Error.ManufactureTaskItemNotEmpty));
                        }

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

                        var error = 0;
                        foreach (var item in items)
                        {
                            item.PlanId = manufacturePlan.Id;
                            if (error != 2 && item.Order <= item.Relation || (item.Relation != 0 && (items.All(x => x.Order != item.Relation) && item.Relation > max)))
                            {
                                error = 1;
                                result.datas.Add(item.Item);
                            }
                            else if (error != 1 && item.IsCheck && item.Relation == 0)
                            {
                                error = 2;
                                result.datas.Add(item.Item);
                            }
                            if (error != 0)
                            {
                                continue;
                            }

                            var d = waitAssign.FirstOrDefault(x => x.Id == item.Id);
                            if (d != null)
                            {
                                item.Item    = item.Item ?? d.Item;
                                item.Desc    = item.Desc ?? d.Desc;
                                item.CheckId = !item.IsCheck && d.IsCheck ? 0 : item.CheckId;
                                item.Check   = !item.IsCheck && d.IsCheck ? "" : !item.Check.IsNullOrEmpty() ? item.Check : "";
                                if (d.HaveChange(item, out var change))
                                {
                                    changeItem          = true;
                                    item.MarkedDateTime = markedDateTime;
                                    change.Time         = markedDateTime;
                                    change.Account      = createUserId;
                                    change.PlanId       = manufacturePlan.Id;
                                    change.TaskId       = manufacturePlan.TaskId;
                                    change.ItemId       = item.Id;
                                    change.Order        = d.Order;
                                    changeItems.Add(change);
                                }
                            }
                            else
                            {
                                item.CreateUserId   = createUserId;
                                item.MarkedDateTime = markedDateTime;
                                item.Desc           = item.Desc ?? "";
                            }
                        }

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

                        var itemChange = new ManufactureLog
                        {
                            Time       = markedDateTime,
                            Account    = createUserId,
                            PlanId     = manufacturePlan.Id,
                            TaskId     = manufacturePlan.TaskId,
                            Type       = ManufactureLogType.PlanUpdateItem,
                            ParsingWay = 1,
                        };
                        #region 更新
                        var updateItems = items.Where(x => x.Id != 0 && waitAssign.Any(y => y.Id == x.Id));
                        if (updateItems.Any() && changeItem)
                        {
                            ServerConfig.ApiDb.Execute("UPDATE manufacture_plan_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 = waitAssign.Where(x => items.All(y => y.Id != x.Id));
                        if (delItems.Any())
                        {
                            foreach (var delItem in delItems.OrderBy(x => x.Order))
                            {
                                delItem.MarkedDateTime = markedDateTime;
                                delItem.MarkedDelete   = true;
                                itemChange.ParamList.Add(new ManufactureLogItem
                                {
                                    Type  = ManufactureLogType.DeletePlanTaskFormat,
                                    Field = delItem.Order.ToString()
                                });
                            }

                            changes.AddRange(delItems.Select(x => new ManufactureLog
                            {
                                Time    = markedDateTime,
                                Account = createUserId,
                                PlanId  = manufacturePlan.Id,
                                TaskId  = manufacturePlan.TaskId,
                                ItemId  = x.Id,
                                Type    = ManufactureLogType.TaskDelete
                            }));
                            ServerConfig.ApiDb.Execute("UPDATE `manufacture_plan_item` SET `MarkedDateTime`= @MarkedDateTime, `MarkedDelete`= @MarkedDelete WHERE `Id` = @Id;", delItems);
                        }

                        #endregion
                        if (updateItems.Any() && changeItem)
                        {
                            itemChange.ParamList.AddRange(changeItems.Select(x => new ManufactureLogItem
                            {
                                Type  = ManufactureLogType.UpdatePlanTaskFormat,
                                Field = x.Order.ToString(),
                                Items = x.ParamList.Select(y =>
                                {
                                    y.Type = ManufactureLogType.UpdatePlanTaskItemFormat;
                                    return(y);
                                })
                            }));
                        }
                        #region 添加
                        var addItems = items.Where(x => x.Id == 0);
                        if (addItems.Any())
                        {
                            ServerConfig.ApiDb.Execute(
                                "INSERT INTO manufacture_plan_item (`CreateUserId`, `MarkedDateTime`, `PlanId`, `Order`, `Person`, `ModuleId`, `IsCheck`, `CheckId`, `Item`, `EstimatedHour`, `EstimatedMin`, `Score`, `Desc`, `Relation`) " +
                                "VALUES (@CreateUserId, @MarkedDateTime, @PlanId, @Order, @Person, @ModuleId, @IsCheck, @CheckId, @Item, @EstimatedHour, @EstimatedMin, @Score, @Desc, @Relation);",
                                addItems);
                            var ids     = updateItems.Select(x => x.Id);
                            var newData =
                                ServerConfig.ApiDb.Query <ManufacturePlanItem>($"SELECT Id, `Order` FROM `manufacture_plan_item` WHERE PlanId = @Id{(ids.Any() ? " AND Id NOT IN @Ids" : "")} AND MarkedDelete = 0;",
                                                                               new { manufacturePlan.Id, Ids = ids });

                            itemChange.ParamList.AddRange(newData.Select(x => new ManufactureLogItem
                            {
                                Type  = ManufactureLogType.AddPlanTaskFormat,
                                Field = x.Order.ToString()
                            }));
                            changes.AddRange(newData.Select(x => new ManufactureLog
                            {
                                Time    = markedDateTime,
                                Account = createUserId,
                                PlanId  = manufacturePlan.Id,
                                TaskId  = manufacturePlan.TaskId,
                                ItemId  = x.Id,
                                Type    = ManufactureLogType.TaskCreate
                            }));
                        }
                        #endregion
                        if (itemChange.ParamList.Any())
                        {
                            changes.Add(itemChange);
                        }
                        changes.AddRange(changeItems);
                    }
                    else
                    {
                        var itemChange = new ManufactureLog
                        {
                            Time       = markedDateTime,
                            Account    = createUserId,
                            PlanId     = manufacturePlan.Id,
                            TaskId     = manufacturePlan.TaskId,
                            Type       = ManufactureLogType.PlanUpdateItem,
                            ParsingWay = 1,
                        };
                        #region  除
                        var sql = $"SELECT a.*, IFNULL(b.Plan, '') Plan, IFNULL(c.Name, '') Processor, IFNULL(d.Module, '') Module, IFNULL(e.`Check`, '') `Check` FROM `manufacture_plan_item` a " +
                                  "LEFT JOIN `manufacture_plan` b ON a.PlanId = b.Id " +
                                  "LEFT JOIN (SELECT a.*, b.Name FROM `manufacture_processor` a JOIN `accounts` b ON a.ProcessorId = b.Id WHERE a.MarkedDelete = 0) c ON a.Person = c.Id " +
                                  "LEFT JOIN `manufacture_task_module` d ON a.ModuleId = d.Id " +
                                  "LEFT JOIN `manufacture_check` e ON a.CheckId = e.Id " +
                                  "WHERE a.PlanId = @Id AND a.`State` = @state AND a.MarkedDelete = 0 ORDER BY a.`Order`;";
                        var waitAssign =
                            ServerConfig.ApiDb.Query <ManufacturePlanTask>(sql, new { manufacturePlan.Id, state = ManufacturePlanItemState.WaitAssign });
                        var delItems = waitAssign.Where(x => items.All(y => y.Id != x.Id));
                        if (delItems.Any())
                        {
                            foreach (var delItem in delItems.OrderBy(x => x.Order))
                            {
                                delItem.MarkedDateTime = markedDateTime;
                                delItem.MarkedDelete   = true;
                                itemChange.ParamList.Add(new ManufactureLogItem
                                {
                                    Type  = ManufactureLogType.DeletePlanTaskFormat,
                                    Field = delItem.Order.ToString()
                                });
                            }

                            changes.AddRange(delItems.Select(x => new ManufactureLog
                            {
                                Time    = markedDateTime,
                                Account = createUserId,
                                PlanId  = manufacturePlan.Id,
                                TaskId  = manufacturePlan.TaskId,
                                ItemId  = x.Id,
                                Type    = ManufactureLogType.TaskDelete
                            }));
                            ServerConfig.ApiDb.Execute("UPDATE `manufacture_plan_item` SET `MarkedDateTime`= @MarkedDateTime, `MarkedDelete`= @MarkedDelete WHERE `Id` = @Id;", delItems);
                        }
                        #endregion
                    }
                }

                if (changePlan)
                {
                    ServerConfig.ApiDb.Execute(
                        "UPDATE manufacture_plan SET `MarkedDateTime` = @MarkedDateTime, `Plan` = @Plan, `PlannedStartTime` = @PlannedStartTime, `PlannedEndTime` = @PlannedEndTime, `EstimatedHour` = @EstimatedHour, `EstimatedMin` = @EstimatedMin, `TaskId` = @TaskId WHERE `Id` = @Id;", manufacturePlan);
                }
            }
            ManufactureLog.AddLog(changes);
            return(Result.GenError <DataResult>(Error.Success));
        }
        public Result AssignManufacturePlan([FromBody] ManufacturePlanAssign assignPlan)
        {
            var plan =
                ServerConfig.ApiDb.Query <ManufacturePlan>("SELECT * FROM `manufacture_plan` WHERE `Id` = @PlanId AND MarkedDelete = 0;",
                                                           new { assignPlan.PlanId }).FirstOrDefault();

            if (plan == null)
            {
                return(Result.GenError <Result>(Error.ManufacturePlanNotExist));
            }

            var manufacturePlanItems =
                ServerConfig.ApiDb.Query <ManufacturePlanTask>("SELECT * FROM `manufacture_plan_item` WHERE PlanId = @PlanId AND MarkedDelete = 0 ORDER BY `Order`;", new { assignPlan.PlanId });

            if (!manufacturePlanItems.Any())
            {
                return(Result.GenError <Result>(Error.ManufacturePlaneNoTask));
            }

            if (manufacturePlanItems.All(x => x.State != ManufacturePlanTaskState.WaitAssign))
            {
                return(Result.GenError <Result>(Error.ManufacturePlaneAssignState));
            }

            if (assignPlan.TaskIds.IsNullOrEmpty())
            {
                var changes        = new List <ManufactureLog>();
                var createUserId   = Request.GetIdentityInformation();
                var markedDateTime = DateTime.Now;
                var assigned       = plan.State == ManufacturePlanState.Assigned;
                if (!assigned)
                {
                    plan.State        = ManufacturePlanState.Assigned;
                    plan.AssignedTime = markedDateTime;
                    changes.Add(new ManufactureLog
                    {
                        Time     = markedDateTime,
                        Account  = createUserId,
                        PlanId   = plan.Id,
                        IsAssign = plan.State > ManufacturePlanState.Wait,
                        TaskId   = plan.TaskId,
                        Type     = ManufactureLogType.PlanAssigned
                    });
                }

                ServerConfig.ApiDb.Execute(
                    "UPDATE manufacture_plan SET `State` = @State, `AssignedTime` = @AssignedTime WHERE `Id` = @Id;", plan);

                if (manufacturePlanItems != null && manufacturePlanItems.Any())
                {
                    manufacturePlanItems = manufacturePlanItems.OrderBy(x => x.Order);
                    var i = 0;
                    foreach (var manufacturePlanItem in manufacturePlanItems)
                    {
                        manufacturePlanItem.CreateUserId   = createUserId;
                        manufacturePlanItem.MarkedDateTime = markedDateTime;
                        manufacturePlanItem.OldId          = manufacturePlanItem.Id;
                        manufacturePlanItem.Assignor       = createUserId;
                        manufacturePlanItem.Desc           = manufacturePlanItem.Desc ?? "";
                        manufacturePlanItem.Order          = ++i;
                        manufacturePlanItem.State          = ManufacturePlanTaskState.Wait;
                    }
                    ServerConfig.ApiDb.Execute(
                        "INSERT INTO manufacture_plan_task (`CreateUserId`, `MarkedDateTime`, `PlanId`, `Order`, `Person`, `ModuleId`, `IsCheck`, `CheckId`, `Item`, `EstimatedHour`, `EstimatedMin`, `Score`, `Desc`, `Relation`, `OldId`, `Assignor`) " +
                        "VALUES (@CreateUserId, @MarkedDateTime, @PlanId, @Order, @Person, @ModuleId, @IsCheck, @CheckId, @Item, @EstimatedHour, @EstimatedMin, @Score, @Desc, @Relation, @OldId, @Assignor);",
                        manufacturePlanItems);

                    ServerConfig.ApiDb.Execute(
                        "UPDATE manufacture_plan_item SET `MarkedDateTime` = @MarkedDateTime, `Order` = @Order, `State` = @State WHERE `Id` = @Id;",
                        manufacturePlanItems);

                    ServerConfig.ApiDb.Execute(
                        "UPDATE manufacture_plan_task SET `TotalOrder` = (SELECT a.TotalOrder FROM (SELECT MAX(TotalOrder) TotalOrder FROM `manufacture_plan_task` WHERE MarkedDelete = 0) a) + `Order` WHERE `TotalOrder` = 0 AND PlanId = @PlanId AND MarkedDelete = 0;", new { assignPlan.PlanId });

                    var newData =
                        ServerConfig.ApiDb.Query <ManufacturePlanItem>("SELECT Id FROM `manufacture_plan_task` WHERE PlanId = @PlanId AND MarkedDelete = 0;", new { assignPlan.PlanId });

                    changes.AddRange(newData.Select(x => new ManufactureLog
                    {
                        Time     = markedDateTime,
                        Account  = createUserId,
                        PlanId   = plan.Id,
                        IsAssign = plan.State > ManufacturePlanState.Wait,
                        TaskId   = plan.TaskId,
                        ItemId   = x.Id,
                        Type     = ManufactureLogType.TaskAssigned
                    }));
                }
                ManufactureLog.AddLog(changes);
            }
            else
            {
                var taskIds = assignPlan.TaskIds.Split(",").Select(int.Parse);
                if (!taskIds.Any())
                {
                    return(Result.GenError <DataResult>(Error.ParamError));
                }

                if (taskIds.Any(x => manufacturePlanItems.All(y => y.Id != x)))
                {
                    return(Result.GenError <DataResult>(Error.ManufactureTaskItemNotExist));
                }

                //待下发任务
                var assignManufacturePlanItems = manufacturePlanItems.Where(x => taskIds.Contains(x.Id));
                if (assignManufacturePlanItems.Any(x => x.State != ManufacturePlanTaskState.WaitAssign))
                {
                    return(Result.GenError <DataResult>(Error.ManufacturePlaneAssignState));
                }

                //已下发的和额外添加的
                var haveManufacturePlanItems = ServerConfig.ApiDb.Query <ManufacturePlanTask>("SELECT * FROM `manufacture_plan_task` WHERE PlanId = @PlanId AND MarkedDelete = 0 ORDER BY `Order`;",
                                                                                              new { assignPlan.PlanId });

                var notAssignManufacturePlanItems = manufacturePlanItems.Where(x => x.State == ManufacturePlanTaskState.WaitAssign && !taskIds.Contains(x.Id));
                var relationIds = assignManufacturePlanItems.Where(x => x.Relation != 0).Select(y => y.Relation);
                //if (relationIds.Any())
                //{
                if (relationIds.Any(x => x > haveManufacturePlanItems.Count()) && relationIds.Any(x => assignManufacturePlanItems.All(y => y.Order != x)))
                {
                    return(Result.GenError <DataResult>(Error.ManufactureTaskItemAssignAfterRelation));
                }
                ////关联任务
                //var relationManufacturePlanItems = manufacturePlanItems.Where(x => relationIds.Contains(x.Id));
                ////未下发的关联任务
                //var taskRelations = relationManufacturePlanItems.Where(x => x.State == ManufacturePlanTaskState.WaitAssign);
                //if (taskRelations.Any() && taskRelations.All(x => !taskIds.Contains(x.Id)))
                //{
                //    return Result.GenError<DataResult>(Error.ManufactureTaskItemAssignAfterRelation);
                //}
                //}

                var changes        = new List <ManufactureLog>();
                var createUserId   = Request.GetIdentityInformation();
                var markedDateTime = DateTime.Now;
                var assigned       = plan.State == ManufacturePlanState.Assigned;
                if (!assigned)
                {
                    plan.State        = ManufacturePlanState.Assigned;
                    plan.AssignedTime = markedDateTime;
                    changes.Add(new ManufactureLog
                    {
                        Time     = markedDateTime,
                        Account  = createUserId,
                        PlanId   = plan.Id,
                        IsAssign = true,
                        TaskId   = plan.TaskId,
                        Type     = ManufactureLogType.PlanAssigned
                    });
                }

                ServerConfig.ApiDb.Execute(
                    "UPDATE manufacture_plan SET `State` = @State, `AssignedTime` = @AssignedTime WHERE `Id` = @Id;", plan);

                if (assignManufacturePlanItems.Any())
                {
                    var order = haveManufacturePlanItems.Count();
                    foreach (var assignManufacturePlanItem in assignManufacturePlanItems)
                    {
                        assignManufacturePlanItem.CreateUserId   = createUserId;
                        assignManufacturePlanItem.MarkedDateTime = markedDateTime;
                        assignManufacturePlanItem.OldId          = assignManufacturePlanItem.Id;
                        assignManufacturePlanItem.Assignor       = createUserId;
                        assignManufacturePlanItem.Desc           = assignManufacturePlanItem.Desc ?? "";
                        assignManufacturePlanItem.Order          = ++order;
                        assignManufacturePlanItem.State          = ManufacturePlanTaskState.Wait;
                    }
                    foreach (var notAssignManufacturePlanItem in notAssignManufacturePlanItems)
                    {
                        notAssignManufacturePlanItem.CreateUserId   = createUserId;
                        notAssignManufacturePlanItem.MarkedDateTime = markedDateTime;
                        notAssignManufacturePlanItem.Assignor       = createUserId;
                        notAssignManufacturePlanItem.Desc           = notAssignManufacturePlanItem.Desc ?? "";
                        notAssignManufacturePlanItem.Order          = ++order;
                    }
                    assignManufacturePlanItems = assignManufacturePlanItems.OrderBy(x => x.Order);
                    ServerConfig.ApiDb.Execute(
                        "INSERT INTO manufacture_plan_task (`CreateUserId`, `MarkedDateTime`, `PlanId`, `Order`, `Person`, `ModuleId`, `IsCheck`, `CheckId`, `Item`, `EstimatedHour`, `EstimatedMin`, `Score`, `Desc`, `Relation`, `OldId`, `Assignor`) " +
                        "VALUES (@CreateUserId, @MarkedDateTime, @PlanId, @Order, @Person, @ModuleId, @IsCheck, @CheckId, @Item, @EstimatedHour, @EstimatedMin, @Score, @Desc, @Relation, @OldId, @Assignor);",
                        assignManufacturePlanItems);

                    ServerConfig.ApiDb.Execute(
                        "UPDATE manufacture_plan_item SET `MarkedDateTime` = @MarkedDateTime, `Order` = @Order, `State` = @State WHERE `Id` = @Id;",
                        manufacturePlanItems);

                    ServerConfig.ApiDb.Execute(
                        "UPDATE manufacture_plan_task SET `TotalOrder` = (SELECT a.TotalOrder FROM (SELECT MAX(TotalOrder) TotalOrder FROM `manufacture_plan_task` WHERE MarkedDelete = 0) a) + `Order` WHERE `TotalOrder` = 0 AND PlanId = @PlanId AND MarkedDelete = 0;", new { assignPlan.PlanId });

                    var newData =
                        ServerConfig.ApiDb.Query <ManufacturePlanItem>("SELECT Id FROM `manufacture_plan_task` WHERE PlanId = @PlanId AND MarkedDelete = 0;", new { assignPlan.PlanId });

                    changes.AddRange(newData.Select(x => new ManufactureLog
                    {
                        Time     = markedDateTime,
                        Account  = createUserId,
                        PlanId   = plan.Id,
                        IsAssign = plan.State > ManufacturePlanState.Wait,
                        TaskId   = plan.TaskId,
                        ItemId   = x.Id,
                        Type     = ManufactureLogType.TaskAssigned
                    }));
                }
                ManufactureLog.AddLog(changes);
            }

            return(Result.GenError <DataResult>(Error.Success));
        }
        public Result ManufactureCheck([FromBody] ManufacturePlanCheckItem item)
        {
            if (item.Id == 0)
            {
                return(Result.GenError <DataResult>(Error.ManufactureCheckItemNotExist));
            }
            var account = Request.GetIdentityInformation();
            var now     = DateTime.Now;

            var sql =
                "SELECT * FROM manufacture_plan_task WHERE Id = @ItemId AND MarkedDelete = 0 AND IsCheck = 1 ORDER BY `TotalOrder`;";
            var task = ServerConfig.ApiDb.Query <ManufacturePlanTask>(sql, new { item.ItemId })
                       .FirstOrDefault();

            if (task != null)
            {
                if (task.State != ManufacturePlanTaskState.Checking)
                {
                    return(Result.GenError <DataResult>(Error.ManufactureTaskStateError));
                }

                var changes = new List <ManufactureLog>();
                var oldItem =
                    ServerConfig.ApiDb.Query <ManufacturePlanCheckItem>("SELECT * FROM `manufacture_plan_check_item` WHERE Id = @Id AND MarkedDelete = 0;",
                                                                        new { item.Id }).FirstOrDefault();

                if (oldItem == null)
                {
                    return(Result.GenError <DataResult>(Error.ManufactureCheckItemNotExist));
                }

                item.CheckTime = item.CheckTime == default(DateTime) ? oldItem.CheckTime : item.CheckTime;
                item.Desc      = item.Desc ?? oldItem.Desc;
                item.Result    = item.Result == ManufacturePlanCheckItemState.Wait && oldItem.Result != ManufacturePlanCheckItemState.Wait ? oldItem.Result : item.Result;
                item.Images    = item.Images ?? oldItem.Images;
                //oldItem.CheckTime = now;
                if (oldItem.HaveChange(item, out var change))
                {
                    change.Time     = now;
                    change.Account  = account;
                    change.PlanId   = task.PlanId;
                    change.IsAssign = true;
                    change.TaskId   = task.TaskId;
                    change.ItemId   = task.Id;
                    change.Type     = ManufactureLogType.UpdateCheckItem;
                    changes.Add(change);
                }

                if (changes.Any())
                {
                    ServerConfig.ApiDb.Execute(
                        oldItem.Images == item.Images
                            ? "UPDATE manufacture_plan_check_item SET `CheckTime` = @CheckTime, `Result` = @Result, `Desc` = @Desc WHERE `Id` = @Id;"
                            : "UPDATE manufacture_plan_check_item SET `Images` = @Images WHERE `Id` = @Id;",
                        item);
                    ManufactureLog.AddLog(changes);
                }
                return(Result.GenError <DataResult>(Error.Success));
            }

            return(Result.GenError <DataResult>(Error.ManufactureNoTask));
        }
        public Result FinishManufactureCheck([FromBody] ManufactureOpCheckTask opTask)
        {
            var tId         = opTask.TaskId;
            var account     = opTask.Account;
            var gId         = opTask.GId;
            var checkResult = opTask.CheckResult;

            if (!EnumHelper.TryParseInt(checkResult, out ManufacturePlanCheckState result))
            {
                return(Result.GenError <Result>(Error.ParamError));
            }
            var processors = ServerConfig.ApiDb.Query <Processor>(
                "SELECT a.Id, b.Account FROM `manufacture_processor` a " +
                "JOIN `accounts` b ON a.ProcessorId = b.Id " +
                $"WHERE {(gId == 0 ? "" : "GroupId = @gId AND ")}b.Account = @account AND a.`MarkedDelete` = 0;", new { account, gId });

            if (!processors.Any())
            {
                return(Result.GenError <DataResult>(Error.ManufactureProcessorNotExist));
            }

            var sql =
                "SELECT b.*, a.* FROM manufacture_plan_task a " +
                "LEFT JOIN `manufacture_plan` b ON a.PlanId = b.Id " +
                "WHERE a.State IN @state AND a.Person IN @pId AND a.MarkedDelete = 0 AND a.IsCheck = 1 ORDER BY a.`TotalOrder` LIMIT 1;";
            ManufacturePlanTask task = null;

            foreach (var validState in ValidStates)
            {
                task = ServerConfig.ApiDb.Query <ManufacturePlanTask>(sql, new { state = validState.Value, pId = processors.Select(x => x.Id) })
                       .FirstOrDefault();
                if (task != null)
                {
                    break;
                }
            }

            if (task != null)
            {
                if (task.Id != tId)
                {
                    return(Result.GenError <DataResult>(Error.ManufactureTaskStateError));
                }
                if (task.State != ManufacturePlanTaskState.Checking)
                {
                    return(Result.GenError <DataResult>(Error.ManufactureTaskStateError));
                }

                var changes = new List <ManufactureLog>();
                var now     = DateTime.Now;
                var oldTask = (ManufacturePlanTask)task.Clone();
                task.State         = ManufacturePlanTaskState.Done;
                task.ActualEndTime = now.NoSecond();
                task.CheckResult   = result;
                if (task.PauseTime != default(DateTime))
                {
                    var totalSecond = (int)(task.PauseTime - task.ActualStartTime).TotalSeconds;
                    task.ActualHour += totalSecond / 3600;
                    task.ActualMin  += (totalSecond - task.ActualHour * 3600) / 60;
                    task.PauseTime   = default(DateTime);
                }
                else
                {
                    var totalSecond = (int)(task.ActualEndTime - task.ActualStartTime).TotalSeconds;
                    task.ActualHour += totalSecond / 3600;
                    task.ActualMin  += (totalSecond - task.ActualHour * 3600) / 60;
                }
                if (oldTask.HaveChange(task, out var change))
                {
                    change.Time     = now;
                    change.Account  = account;
                    change.PlanId   = task.PlanId;
                    change.IsAssign = true;
                    change.TaskId   = task.TaskId;
                    change.ItemId   = task.Id;
                    change.Type     = ManufactureLogType.UpdateCheckResult;
                    changes.Add(change);
                }

                if (result == ManufacturePlanCheckState.Redo)
                {
                    task.State = ManufacturePlanTaskState.Wait;
                    sql        =
                        "SELECT * FROM `manufacture_plan_task` WHERE PlanId = @PlanId AND `Order` = @Relation;";
                    var preTask = ServerConfig.ApiDb.Query <ManufacturePlanTask>(sql, new { task.PlanId, task.Relation }).FirstOrDefault();
                    if (preTask != null)
                    {
                        var oldPreTask = (ManufacturePlanTask)preTask.Clone();
                        preTask.State = !preTask.IsCheck ? ManufacturePlanTaskState.WaitRedo : ManufacturePlanTaskState.WaitCheck;
                        if (oldPreTask.HaveChange(preTask, out var changePre))
                        {
                            changePre.Time     = now;
                            changePre.Account  = account;
                            changePre.PlanId   = oldPreTask.PlanId;
                            changePre.IsAssign = true;
                            changePre.TaskId   = oldPreTask.TaskId;
                            changePre.ItemId   = oldPreTask.Id;
                            changes.Add(changePre);
                        }
                    }

                    ServerConfig.ApiDb.Execute("UPDATE manufacture_plan_task SET `State` = @State WHERE `Id` = @Id;", preTask);
                }

                ServerConfig.ApiDb.Execute("UPDATE manufacture_plan_task SET `State` = @State, `ActualEndTime` = @ActualEndTime, `PauseTime` = @PauseTime, " +
                                           "`ActualHour` = @ActualHour, `ActualMin` = @ActualMin, `CheckResult` = @CheckResult WHERE `Id` = @Id;", task);

                ManufactureLog.AddLog(changes);
                return(Result.GenError <DataResult>(Error.Success));
            }

            return(Result.GenError <DataResult>(Error.ManufactureNoTask));
        }
        public Result StartManufactureCheck([FromBody] ManufactureOpTask opTask)
        {
            var tId     = opTask.TaskId;
            var account = opTask.Account;
            var gId     = opTask.GId;

            var processors = ServerConfig.ApiDb.Query <Processor>(
                "SELECT a.Id, b.Account FROM `manufacture_processor` a " +
                "JOIN `accounts` b ON a.ProcessorId = b.Id " +
                $"WHERE {(gId == 0 ? "" : "GroupId = @gId AND ")}b.Account = @account AND a.`MarkedDelete` = 0;", new { account, gId });

            if (!processors.Any())
            {
                return(Result.GenError <DataResult>(Error.ManufactureProcessorNotExist));
            }

            var sql =
                "SELECT b.*, a.* FROM manufacture_plan_task a " +
                "LEFT JOIN `manufacture_plan` b ON a.PlanId = b.Id " +
                "WHERE a.State IN @state AND a.Person IN @pId AND a.MarkedDelete = 0 AND a.IsCheck = 1 ORDER BY a.`TotalOrder` LIMIT 1;";
            ManufacturePlanTask task = null;

            foreach (var validState in ValidStates)
            {
                task = ServerConfig.ApiDb.Query <ManufacturePlanTask>(sql, new { state = validState.Value, pId = processors.Select(x => x.Id) })
                       .FirstOrDefault();
                if (task != null)
                {
                    break;
                }
            }

            if (task != null)
            {
                if (task.Id != tId)
                {
                    return(Result.GenError <DataResult>(Error.ManufactureTaskStateError));
                }
                if (task.State != ManufacturePlanTaskState.WaitCheck && task.State != ManufacturePlanTaskState.Pause)
                {
                    return(Result.GenError <DataResult>(Error.ManufactureTaskStateError));
                }

                var changes = new List <ManufactureLog>();
                var now     = DateTime.Now;
                var oldTask = (ManufacturePlanTask)task.Clone();
                task.State = ManufacturePlanTaskState.Checking;

                if (task.FirstStartTime == default(DateTime))
                {
                    task.FirstStartTime = now;
                }

                if (task.IsRedo)
                {
                    task.RedoCount++;
                }
                task.ActualStartTime = now.NoSecond();
                if (oldTask.HaveChange(task, out var change))
                {
                    change.Time     = now;
                    change.Account  = account;
                    change.PlanId   = task.PlanId;
                    change.IsAssign = true;
                    change.TaskId   = task.TaskId;
                    change.ItemId   = task.Id;
                    change.Type     = ManufactureLogType.StartTask;
                    changes.Add(change);
                }
                if (!oldTask.IsCheckItem)
                {
                    task.IsCheckItem = true;
                    var manufacturePlanCheckItems =
                        ServerConfig.ApiDb.Query <ManufacturePlanCheckItem>("SELECT * FROM `manufacture_check_item` WHERE CheckId = @CheckId AND MarkedDelete = 0;", new { task.CheckId });

                    var createUserId   = Request.GetIdentityInformation();
                    var markedDateTime = DateTime.Now;
                    if (manufacturePlanCheckItems.Any())
                    {
                        foreach (var manufactureCheckItem in manufacturePlanCheckItems)
                        {
                            manufactureCheckItem.CreateUserId = createUserId;
                            manufactureCheckItem.PlanId       = oldTask.PlanId;
                            manufactureCheckItem.ItemId       = oldTask.Id;
                        }
                        ServerConfig.ApiDb.Execute(
                            "INSERT INTO manufacture_plan_check_item (`CreateUserId`, `PlanId`, `ItemId`, `Item`, `Method`) " +
                            "VALUES (@CreateUserId, @PlanId, @ItemId, @Item, @Method);",
                            manufacturePlanCheckItems);

                        changes.Add(new ManufactureLog
                        {
                            Time     = markedDateTime,
                            Account  = createUserId,
                            PlanId   = task.PlanId,
                            IsAssign = true,
                            TaskId   = task.TaskId,
                            ItemId   = task.Id,
                            Type     = ManufactureLogType.CheckAssigned
                        });
                    }
                }

                ServerConfig.ApiDb.Execute("UPDATE manufacture_plan_task SET `State` = @State, `IsCheckItem` = @IsCheckItem, `FirstStartTime` = @FirstStartTime, " +
                                           "`ActualStartTime` = @ActualStartTime, `RedoCount` = @RedoCount WHERE `Id` = @Id;", task);
                ManufactureLog.AddLog(changes);
                return(Result.GenError <DataResult>(Error.Success));
            }

            return(Result.GenError <DataResult>(Error.ManufactureNoTask));
        }
示例#13
0
        public Result FinishManufactureTask([FromBody] ManufactureOpTask opTask)
        {
            var tId        = opTask.TaskId;
            var account    = opTask.Account;
            var gId        = opTask.GId;
            var processors =
                ServerConfig.ApiDb.Query <Processor>("SELECT a.Id, b.Account FROM `manufacture_processor` a JOIN `accounts` b ON a.ProcessorId = b.Id " +
                                                     $"WHERE b.Account = @account AND a.`MarkedDelete` = 0 {(gId == 0 ? "" : " AND GroupId = @gId")};", new { account, gId });

            if (!processors.Any())
            {
                return(Result.GenError <DataResult>(Error.ManufactureProcessorNotExist));
            }

            var sql =
                "SELECT b.*, a.* FROM manufacture_plan_task a " +
                "LEFT JOIN `manufacture_plan` b ON a.PlanId = b.Id " +
                "WHERE a.State IN @state AND a.Person IN @pId AND a.MarkedDelete = 0 AND a.IsCheck = 0 ORDER BY a.`TotalOrder` LIMIT 1;";
            ManufacturePlanTask task = null;

            foreach (var validState in ValidStates)
            {
                task = ServerConfig.ApiDb.Query <ManufacturePlanTask>(sql, new { state = validState.Value, pId = processors.Select(x => x.Id) })
                       .FirstOrDefault();
                if (task != null)
                {
                    break;
                }
            }

            if (task != null)
            {
                if (task.Id != tId)
                {
                    return(Result.GenError <DataResult>(Error.ManufactureTaskStateError));
                }
                if (task.State != ManufacturePlanTaskState.Doing)
                {
                    return(Result.GenError <DataResult>(Error.ManufactureTaskStateError));
                }

                var now     = DateTime.Now;
                var changes = new List <ManufactureLog>();
                var oldTask = (ManufacturePlanTask)task.Clone();
                task.State         = ManufacturePlanTaskState.Done;
                task.ActualEndTime = now;

                var totalSecond = (int)(task.ActualEndTime - task.ActualStartTime).TotalSeconds;
                var totalHour   = totalSecond / 3600;
                task.ActualHour += totalHour;
                task.ActualMin  += (totalSecond - totalHour * 3600) / 60;

                //if (task.PauseTime != default(DateTime))
                //{
                //    var totalSecond = (int)(task.PauseTime - task.ActualStartTime).TotalSeconds;
                //    var totalHour = totalSecond / 3600;
                //    task.ActualHour += totalHour;
                //    task.ActualMin += (totalSecond - totalHour * 3600) / 60;
                //    task.PauseTime = default(DateTime);
                //}
                //else
                //{
                //    var totalSecond = (int)(task.ActualEndTime - task.ActualStartTime).TotalSeconds;
                //    task.ActualHour += totalSecond / 3600;
                //    task.ActualMin += (totalSecond - task.ActualHour * 3600) / 60;
                //}
                if (oldTask.HaveChange(task, out var change))
                {
                    change.Time     = now;
                    change.Account  = account;
                    change.PlanId   = task.PlanId;
                    change.IsAssign = true;
                    change.TaskId   = task.TaskId;
                    change.ItemId   = task.Id;
                    change.Type     = ManufactureLogType.FinishTask;
                    changes.Add(change);
                }
                var tasks = new List <ManufacturePlanTask> {
                    task
                };
                sql =
                    "SELECT * FROM `manufacture_plan_task` WHERE PlanId = @PlanId AND Relation = @Order AND IsCheck = 1 AND `State` = @state;";
                var checkTasks = ServerConfig.ApiDb.Query <ManufacturePlanTask>(sql, new { task.PlanId, task.Order, state = ManufacturePlanTaskState.Wait });

                if (checkTasks != null && checkTasks.Any())
                {
                    foreach (var checkTask in checkTasks)
                    {
                        var oldCheckTask = (ManufacturePlanTask)checkTask.Clone();
                        checkTask.State = ManufacturePlanTaskState.WaitCheck;
                        if (oldCheckTask.HaveChange(checkTask, out var changeCheck))
                        {
                            changeCheck.Time     = now;
                            changeCheck.Account  = account;
                            changeCheck.PlanId   = checkTask.PlanId;
                            changeCheck.IsAssign = true;
                            changeCheck.TaskId   = checkTask.TaskId;
                            changeCheck.ItemId   = checkTask.Id;
                            changeCheck.Type     = ManufactureLogType.TaskUpdate;
                            changes.Add(changeCheck);
                        }
                        tasks.Add(checkTask);
                    }
                }

                ServerConfig.ApiDb.Execute("UPDATE manufacture_plan_task SET `MarkedDateTime` = @MarkedDateTime, `State` = @State, `ActualEndTime` = @ActualEndTime, " +
                                           "`ActualHour` = @ActualHour, `ActualMin` = @ActualMin WHERE `Id` = @Id;", tasks);

                ManufactureLog.AddLog(changes);
                return(Result.GenError <DataResult>(Error.Success));
            }

            return(Result.GenError <DataResult>(Error.ManufactureNoTask));
        }
示例#14
0
        public Result StartManufactureTask([FromBody] ManufactureOpTask opTask)
        {
            var tId        = opTask.TaskId;
            var account    = opTask.Account;
            var gId        = opTask.GId;
            var processors =
                ServerConfig.ApiDb.Query <Processor>("SELECT a.Id, b.Account FROM `manufacture_processor` a JOIN `accounts` b ON a.ProcessorId = b.Id " +
                                                     $"WHERE b.Account = @account AND a.`MarkedDelete` = 0 {(gId == 0 ? "" : " AND GroupId = @gId")};", new { account, gId });

            if (!processors.Any())
            {
                return(Result.GenError <DataResult>(Error.ManufactureProcessorNotExist));
            }

            var sql =
                "SELECT b.*, a.* FROM manufacture_plan_task a " +
                "LEFT JOIN `manufacture_plan` b ON a.PlanId = b.Id " +
                "WHERE a.State IN @state AND a.Person IN @pId AND a.MarkedDelete = 0 AND a.IsCheck = 0 ORDER BY a.`TotalOrder` LIMIT 1;";
            ManufacturePlanTask task = null;

            foreach (var validState in ValidStates)
            {
                task = ServerConfig.ApiDb.Query <ManufacturePlanTask>(sql, new { state = validState.Value, pId = processors.Select(x => x.Id) })
                       .FirstOrDefault();
                if (task != null)
                {
                    break;
                }
            }

            if (task != null)
            {
                if (task.Id != tId)
                {
                    return(Result.GenError <DataResult>(Error.ManufactureTaskStateError));
                }
                if (task.State != ManufacturePlanTaskState.Wait && task.State != ManufacturePlanTaskState.WaitRedo && task.State != ManufacturePlanTaskState.Pause)
                {
                    return(Result.GenError <DataResult>(Error.ManufactureTaskStateError));
                }

                var now     = DateTime.Now;
                var oldTask = (ManufacturePlanTask)task.Clone();
                task.State = ManufacturePlanTaskState.Doing;

                if (task.FirstStartTime == default(DateTime))
                {
                    task.FirstStartTime = now;
                }

                if (task.IsRedo)
                {
                    task.RedoCount++;
                }

                task.ActualStartTime = now;
                if (oldTask.HaveChange(task, out var change))
                {
                    change.Time     = now;
                    change.Account  = account;
                    change.PlanId   = task.PlanId;
                    change.IsAssign = true;
                    change.TaskId   = task.TaskId;
                    change.ItemId   = task.Id;
                    change.Type     = ManufactureLogType.StartTask;
                }
                ServerConfig.ApiDb.Execute("UPDATE manufacture_plan_task SET `State` = @State, `FirstStartTime` = @FirstStartTime, `ActualStartTime` = @ActualStartTime, " +
                                           "`RedoCount` = @RedoCount WHERE `Id` = @Id;", task);
                ManufactureLog.AddLog(new List <ManufactureLog> {
                    change
                });
                return(Result.GenError <DataResult>(Error.Success));
            }

            return(Result.GenError <DataResult>(Error.ManufactureNoTask));
        }