ApiSendWmsTaskAction.cs 17.6 KB
using System;
using System.Collections.Generic;
using System.Data;
using Infrastructure;
using Quartz;
using WebApp;
using WebRepository;
using System.Linq;
using OfficeOpenXml.FormulaParsing.Excel.Functions.DateTime;

namespace WebMvc
{
    /// <summary>
    /// 分解出库单
    /// </summary>
    [PersistJobDataAfterExecution]
    [DisallowConcurrentExecution]
    public class ApiSendWmsTaskAction
    {
        private string ConnString { set; get; }
        IJobExecutionContext Context { set; get; }

        public ApiSendWmsTaskAction(string _ConnString, IJobExecutionContext _Context)
        {
            ConnString = _ConnString;
            Context = _Context;
        }

        public void Execute(JobContainer jobContainer)
        {
            UnitWork _unitWork = new UnitWork(AppSettingsJson.JobContext(ConnString));
            string str = "";
            try
            {
                List<ApiShipmentDetail> ApishipmentDetails = _unitWork.Find<ApiShipmentDetail>(n => n.Status == ShipmentHeaderStatus.新建).OrderBy(n => n.CreateTime).ToList();
                foreach (ApiShipmentDetail ApishipmentDetail in ApishipmentDetails)
                {
                    ApiShipmentHeader ApishipmentHeader = _unitWork.Find<ApiShipmentHeader>(n => n.Code == ApishipmentDetail.ShipmentCode).FirstOrDefault();
                    if (ApishipmentHeader == null)
                    {
                        ApishipmentDetail.Error = "未找到主表数据";
                        _unitWork.Update(ApishipmentDetail);
                        continue;
                    }
                    
                    str = AddTBTaskInfo(ApishipmentDetail, ApishipmentHeader);

                    if (str == "")
                    {
                        if (_unitWork.IsExist<ApiShipmentDetail>(n => n.Id == ApishipmentDetail.Id))
                        {
                            if (ApishipmentDetail.Status != ShipmentHeaderStatus.回传)
                            {
                                ApishipmentDetail.Status = ShipmentHeaderStatus.分配完成;
                                _unitWork.Update(ApishipmentDetail);
                            }
                        }
                        List<ApiShipmentDetail> ApiStatusshipmentDetail = _unitWork.Find<ApiShipmentDetail>(n => n.SourceCode == ApishipmentDetail.SourceCode && n.ShipmentCode == ApishipmentDetail.ShipmentCode).OrderBy(a => a.Status).ToList();
                        ApishipmentHeader.FirstStatus = ApiStatusshipmentDetail.Last().Status;
                        ApishipmentHeader.LastStatus = ApiStatusshipmentDetail.First().Status;
                        _unitWork.Update(ApishipmentHeader);
                    }
                    //出库单未找到物料,已经结束单据,删除出库单
                    else if (str == "E")
                    {
                        List<ApiShipmentDetail> ApiStatusshipmentDetail = _unitWork.Find<ApiShipmentDetail>(n => n.SourceCode == ApishipmentDetail.SourceCode && n.ShipmentCode == ApishipmentDetail.ShipmentCode).OrderBy(a => a.Status).ToList();
                        ApishipmentHeader.FirstStatus = ApiStatusshipmentDetail.Last().Status;
                        ApishipmentHeader.LastStatus = ApiStatusshipmentDetail.First().Status;
                        _unitWork.Update(ApishipmentHeader);

                        //出库单据迁移至历史出库单据
                        ApiShipmentHeaderHistory ApishipmentHeaderHistory = new ApiShipmentHeaderHistory();
                        ApishipmentHeader.CopyTo(ApishipmentHeaderHistory);
                        ApishipmentHeaderHistory.Id = null;
                        ApishipmentHeaderHistory.UpdateBy = "ApiSendWmsTaskAction";
                        _unitWork.Add(ApishipmentHeaderHistory);

                        List<ApiShipmentDetail> Apishipdtls = _unitWork.Find<ApiShipmentDetail>(u => u.ShipmentCode == ApishipmentHeaderHistory.Code).ToList();
                        foreach (ApiShipmentDetail Apishipdtl in Apishipdtls)
                        {
                            ApiShipmentDetailHistory ApishipmentDetailHistory = new ApiShipmentDetailHistory();
                            Apishipdtl.CopyTo(ApishipmentDetailHistory);
                            ApishipmentDetailHistory.Id = null;
                            ApishipmentDetailHistory.ShipmentId = ApishipmentHeaderHistory.Id;
                            ApishipmentDetailHistory.UpdateBy = "InterfaceLogAction";
                            _unitWork.Add(ApishipmentDetailHistory);
                            _unitWork.Delete(Apishipdtl);
                        }
                        _unitWork.Delete(ApishipmentHeader);
                    }
                    else
                    {
                        ApishipmentDetail.Error = str;
                        _unitWork.Update(ApishipmentDetail);
                        continue;
                    }
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        //创建出库任务
        public string AddTBTaskInfo(ApiShipmentDetail ApishipmentDetail, ApiShipmentHeader ApishipmentHeader)
        {
            string strError = "";
            try
            {
                UnitWork _unitWork = new UnitWork(AppSettingsJson.JobContext(ConnString));
                Task task = _unitWork.Find<Task>(n => n.OrderCode == ApishipmentDetail.ShipmentCode).FirstOrDefault();
                var tno = "";
                if (task != null)
                {
                    tno = task.TaskNo;
                }
                else
                {
                    //创建分拣出库或整盘出库Task主任务
                    tno = _unitWork.GetTaskNo(TaskNo.出库自动分配);
                    task = new Task
                    {
                        OrderCode = ApishipmentDetail.ShipmentCode,
                        TaskNo = tno,
                        SourceCode = ApishipmentDetail.SourceCode,
                        FirstStatus = TaskStatus.待下发任务,
                        LastStatus = TaskStatus.待下发任务,
                        CreateTime = DateTime.Now
                    };
                }
                StationRoadway stationRoadway = _unitWork.Find<StationRoadway>(n => n.StationCode == ApishipmentHeader.Station).FirstOrDefault();
                var Roadway = 0;
                if (stationRoadway != null)
                {
                    Roadway = (int)stationRoadway.RoadWay;
                }
                Inventory inventory = new Inventory();
                //铜箔出库
                if (ApishipmentHeader.Type == "CallCopperFoil")
                {
                    //根据出库子表数据创建任务主表数据:物料编码加供应商,一个出库单据只出一个托盘
                    inventory = _unitWork.Find<Inventory>(n => n.MaterialCode == ApishipmentDetail.MaterialCode && n.TaskStatus == InventoryTaskType.无任务 && n.Supplier == ApishipmentHeader.ShipTo).FirstOrDefault();
                }
                //自用PP出库
                else if (ApishipmentHeader.Type == "CallPPForPrivateUse")
                {
                    //根据出库子表数据创建任务主表数据:工单号,一个出库单据只出一个托盘
                    inventory = _unitWork.Find<Inventory>(n => n.Lot == ApishipmentDetail.Lot && n.TaskStatus == InventoryTaskType.无任务).FirstOrDefault();
                }
                    
                if (inventory != null)
                {
                    if (_unitWork.IsExist<TaskDetail>(n => n.ContainerCode == inventory.ContainerCode))
                    {
                        ApishipmentDetail.Error = "库存ID:" + inventory.Id + "有任务执行!";
                        _unitWork.Update(ApishipmentDetail);
                        strError = "库存ID:" + inventory.Id + "有任务执行!";
                        return strError;
                    }
                    if (!_unitWork.IsExist<Task>(n => n.TaskNo == task.TaskNo))
                    {
                        _unitWork.Add(task);
                    }
                    //出库主表任务明细
                    //创建整盘出库类型任务子表数据
                    TaskDetail detail = new TaskDetail
                    {
                        TaskNo = tno,
                        TaskType = TaskType.整盘出库,
                        SourceCode = ApishipmentDetail.SourceCode,
                        ContainerCode = inventory.ContainerCode,
                        OrderCode = ApishipmentDetail.ShipmentCode,
                        Batch = inventory.OldBatch,
                        MaterialCode = inventory.MaterialCode,
                        Lot = inventory.Lot,
                        SourceLocation = inventory.LocationCode,
                        DestinationLocation = ApishipmentHeader.Station,
                        Roadway = Roadway,
                        Station = ApishipmentHeader.Station,
                        Status = TaskStatus.待下发任务,
                        Priority = ApishipmentHeader.Priority,
                        HadQty = 0,
                        OderQty = ApishipmentDetail.Qty,
                        ContainerQty = 0,
                        CreateTime = DateTime.Now,
                        CreateBy = ApishipmentHeader.CreateBy
                    };
                    _unitWork.Add(detail);
                    //查询当前容器是否已经创建
                    if (!_unitWork.IsExist<TaskDetail>(n => n.ContainerCode == inventory.ContainerCode && n.Status > TaskStatus.新建任务 && n.Status < TaskStatus.已经完成 && n.TaskType == TaskType.容器出库))
                    {
                        // 创建容器出库类型任务主表数据
                        var taskNo = _unitWork.GetTaskNo(TaskNo.容器出库);
                        var taskOut = new Task
                        {
                            OrderCode = ApishipmentDetail.ShipmentCode,
                            TaskNo = taskNo,
                            BusinessType = BusinessType.出库_其他出库单,
                            SourceCode = ApishipmentDetail.SourceCode,
                            FirstStatus = TaskStatus.待下发任务,
                            LastStatus = TaskStatus.待下发任务,
                            CreateTime = DateTime.Now
                        };
                        _unitWork.Add(taskOut);
                        //创建容器出库类型任务子表数据
                        TaskDetail taskDetail = new TaskDetail
                        {
                            TaskNo = taskNo,
                            TaskType = TaskType.容器出库,
                            SourceCode = ApishipmentDetail.SourceCode,
                            ContainerCode = inventory.ContainerCode,
                            OrderCode = ApishipmentDetail.ShipmentCode,
                            Batch = inventory.OldBatch,
                            MaterialCode = inventory.MaterialCode,
                            Lot = inventory.Lot,
                            ContainerQty = 0,
                            HadQty = 0,
                            OderQty = 0,
                            SourceLocation = inventory.LocationCode,
                            DestinationLocation = ApishipmentHeader.Station,
                            Roadway = Roadway,
                            Station = ApishipmentHeader.Station,
                            Status = TaskStatus.待下发任务,
                            Priority = ApishipmentHeader.Priority,
                            CreateTime = DateTime.Now,
                            CreateBy = ApishipmentHeader.CreateBy
                        };
                        _unitWork.Add(taskDetail);
                        List<Inventory> inventories = _unitWork.Find<Inventory>(n => n.ContainerCode == inventory.ContainerCode).ToList();
                        foreach (Inventory inv in inventories)
                        {
                            InventoryOut inventoryOut = new InventoryOut
                            {
                                SourceCode = ApishipmentDetail.SourceCode,
                                ReceiptCode = ApishipmentDetail.ShipmentCode,
                                ReceiptId = ApishipmentDetail.ShipmentId,
                                ReceiptDetailId = ApishipmentDetail.Id,
                                ContainerCode = inv.ContainerCode,
                                MaterialCode = inv.MaterialCode,
                                Batch = inv.Batch,
                                Lot = inv.Lot,
                                Qty = inv.Qty,
                                WarehouseType = inv.WarehouseType,
                                QrCode = inv.QrCode,
                                Supplier = inv.Supplier,
                                ResidualWeight = inv.ResidualWeight,
                                Retreat = inv.Retreat,
                                Specification = inv.Specification,
                                NameDescription = inv.NameDescription,
                                Unit = inv.Unit,
                                Size = inv.Size,
                                NumberofSheets = inv.NumberofSheets,
                                Groupnum = inv.Groupnum,
                                OldBatch = inv.OldBatch,
                                Combo = inv.Combo,
                                Status = inv.Status,
                                IsFold = inv.IsFold,
                                IsPack = inv.IsPack,
                                LocationCode = ApishipmentHeader.Station,
                                StackingNumber = inventory.StackingNumber,
                                ShipmentState = 0,
                                CreateTime = DateTime.Now,
                                CreateBy = "Api",
                                WH = inventory.WH,
                                LWH = inventory.LWH,
                                LWHSL = inventory.LWHSL
                            };
                            _unitWork.Add(inventoryOut);
                            inv.SourceCode = ApishipmentDetail.SourceCode;
                            inv.TaskStatus = InventoryTaskType.任务锁定中;
                            _unitWork.Update(inv);
                        }
                    }
                    else
                    {
                        detail.Status = TaskStatus.下达任务;
                        List<TaskDetail> list = new List<TaskDetail>();
                        list = _unitWork.Find<TaskDetail>(n => n.TaskNo == task.TaskNo && n.Id != detail.Id).ToList();

                        if (list.Count > 0)
                        {
                            foreach (TaskDetail td in list)
                            {
                                if (!_unitWork.IsExist<TaskDetail>(n => n.TaskNo == td.TaskNo && n.Status > detail.Status))
                                {
                                    task = _unitWork.Find<Task>(n => n.TaskNo == td.TaskNo).FirstOrDefault();
                                    if (task != null)
                                    {
                                        task.FirstStatus = td.Status;
                                    }
                                }

                                if (!_unitWork.IsExist<TaskDetail>(n => n.TaskNo == td.TaskNo && n.Status < detail.Status))
                                {
                                    task = _unitWork.Find<Task>(n => n.TaskNo == td.TaskNo).FirstOrDefault();
                                    if (task != null)
                                    {
                                        task.LastStatus = td.Status;
                                    }
                                }
                            }
                            _unitWork.Update(task);
                        }
                    }
                    //shipmentDetail.QtyCompleted = shipmentDetail.QtyDivided;
                    //_unitWork.Update(shipmentDetail);
                }
                else
                {
                    //未找到物料,回传并结束单据
                    strError = "E";
                    ApiInterfaceLog Apiinter = _unitWork.Find<ApiInterfaceLog>(n => n.TaskNo == ApishipmentDetail.SourceCode).FirstOrDefault();
                    if (Apiinter != null)
                    {
                        

                        //回传单头
                        InAndBackModel inAndBackModel = new InAndBackModel();
                        inAndBackModel.State = "E";
                        inAndBackModel.MO = ApishipmentDetail.Lot;
                        inAndBackModel.PN = ApishipmentDetail.MaterialCode;
                        inAndBackModel.TaskNumber = Apiinter.TaskNo;

                        ApiRequest apiRequest = new ApiRequest("MES");
                        MesResponse MESesponse = apiRequest.TokenPost<MesResponse>(JsonHelper.Instance.Serialize(inAndBackModel), "HhWms/ReportMaterialDistribution", "出库异常回传");
                        if (MESesponse.Status == "S")
                        {
                            Apiinter.Status = 4;
                            Apiinter.Message = "库内未找到符合条件的物料!";
                            _unitWork.Update(Apiinter);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                strError = ex.Message;
                return strError;
            }
            return strError;
        }
    }
}