Beispiel #1
0
        public void DoGoodsReject(AscmWmsBackInvoiceMain ascmWmsBackInvoiceMain, List<AscmWmsBackInvoiceLink> listWmsBackInvoiceLink, string userId, AscmMesInteractiveLog ascmMesInteractiveLog)
        {
            try
            {
                OracleParameter[] goodsRejectParams = GetGoodsRejectParams(ascmWmsBackInvoiceMain, listWmsBackInvoiceLink, userId);
                ISession session = YnDaoHelper.GetInstance().nHibernateHelper.GetCurrentSession();
                OracleCommand command = (OracleCommand)session.Connection.CreateCommand();
                command.CommandType = CommandType.StoredProcedure;
                command.CommandText = "cux_mes_ascm_interface_pkg.ascm_do_goods_reject";
                Array.ForEach<OracleParameter>(goodsRejectParams, P => command.Parameters.Add(P));
                command.ExecuteNonQuery();

                ascmMesInteractiveLog.returnCode = goodsRejectParams[goodsRejectParams.Length - 2].Value.ToString();
                ascmMesInteractiveLog.returnMessage = goodsRejectParams[goodsRejectParams.Length - 1].Value.ToString();

                if (ascmWmsBackInvoiceMain != null)
                {
                    ascmWmsBackInvoiceMain.returnCode = ascmMesInteractiveLog.returnCode;
                    ascmWmsBackInvoiceMain.returnMessage = ascmMesInteractiveLog.returnMessage;
                    ascmWmsBackInvoiceMain.uploadTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
Beispiel #2
0
        public void DoManualReceive(AscmWmsIncManAccMain ascmWmsIncManAccMain, List<AscmWmsIncManAccDetail> listAscmWmsIncManAccDetail, string userId, AscmMesInteractiveLog ascmMesInteractiveLog)
        {
            try
            {
                string pKey = "";
                OracleParameter[] manualReceiveParams = GetManualReceiveParams(ascmWmsIncManAccMain, listAscmWmsIncManAccDetail, userId, out pKey);
                lock (objLockKey)
                {
                    if (AscmKeys.ContainsKey(pKey))
                    {
                        return;
                    }

                    AscmKeys[pKey] = "";
                }

                ISession session = YnDaoHelper.GetInstance().nHibernateHelper.GetCurrentSession();
                OracleCommand command = (OracleCommand)session.Connection.CreateCommand();
                command.CommandType = CommandType.StoredProcedure;
                command.CommandText = "cux_mes_ascm_interface_pkg.ascm_do_manual_receive";
                Array.ForEach<OracleParameter>(manualReceiveParams, P => command.Parameters.Add(P));
                command.ExecuteNonQuery();

                ascmMesInteractiveLog.returnCode = manualReceiveParams[manualReceiveParams.Length - 2].Value.ToString();
                ascmMesInteractiveLog.returnMessage = manualReceiveParams[manualReceiveParams.Length - 1].Value.ToString();

                if (ascmWmsIncManAccMain != null)
                {
                    ascmWmsIncManAccMain.returnCode = ascmMesInteractiveLog.returnCode;
                    ascmWmsIncManAccMain.returnMessage = ascmMesInteractiveLog.returnMessage;
                    ascmWmsIncManAccMain.uploadTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                }

                if (AscmKeys.ContainsKey(pKey))
                {
                    AscmKeys.Remove(pKey);
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
 public void Save(AscmMesInteractiveLog ascmMesInteractiveLog)
 {
     try
     {
         using (ITransaction tx = YnDaoHelper.GetInstance().nHibernateHelper.GetCurrentSession().BeginTransaction())
         {
             try
             {
                 YnDaoHelper.GetInstance().nHibernateHelper.Save(ascmMesInteractiveLog);
                 tx.Commit();//正确执行提交
             }
             catch (Exception ex)
             {
                 tx.Rollback();//回滚
                 throw ex;
             }
         }
     }
     catch (Exception ex)
     {
         YnBaseClass2.Helper.LogHelper.GetLog().Error("保存失败(Save AscmMesInteractiveLog)", ex);
         throw ex;
     }
 }
Beispiel #4
0
        public void DoSysReceive(List<AscmDeliBatOrderLink> listDeliBatOrderLink, string userId, AscmMesInteractiveLog ascmMesInteractiveLog)
        {
            try
            {
                string pKey = "";
                AscmDeliBatOrderLink ascmDeliBatOrderLink = listDeliBatOrderLink.First();
                OracleParameter[] sysReceiveParams = GetSysReceiveParams(listDeliBatOrderLink, ascmDeliBatOrderLink, userId, out pKey);
                lock (objLockKey)
                {
                    if (AscmKeys.ContainsKey(pKey))
                    {
                        return;
                    }

                    AscmKeys[pKey] = "";
                }

                //不能放在事务中执行,否则调用的事务处理无法释放资源
                //ExecuteOraProcedure("cux_mes_ascm_interface_pkg.ascm_do_sys_receive", ref sysReceiveParams);
                ISession session = YnDaoHelper.GetInstance().nHibernateHelper.GetCurrentSession();
                OracleCommand command = (OracleCommand)session.Connection.CreateCommand();
                command.CommandType = CommandType.StoredProcedure;
                command.CommandText = "cux_mes_ascm_interface_pkg.ascm_do_sys_receive";
                Array.ForEach<OracleParameter>(sysReceiveParams, P => command.Parameters.Add(P));
                command.ExecuteNonQuery();

                ascmMesInteractiveLog.returnCode = sysReceiveParams[sysReceiveParams.Length - 2].Value.ToString();
                ascmMesInteractiveLog.returnMessage = sysReceiveParams[sysReceiveParams.Length - 1].Value.ToString();
                if (AscmKeys.ContainsKey(pKey))
                {
                    AscmKeys.Remove(pKey);
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        /// <summary>
        /// 领料确认
        /// </summary>
        /// <param name="listWmsAndLogistics">接口List</param>
        public void DoMaterialRequisition(List<WmsAndLogistics> listWmsAndLogistics)
        {
            try
            {

                if (listWmsAndLogistics == null || listWmsAndLogistics.Count == 0)
                    return;

                //记录领料确认日志
                AscmWmsLogisticsMainLog wmsLogisticsMainLog = AscmWmsLogisticsMainLogService.GetInstance().Create();
                AscmWmsLogisticsMainLogService.GetInstance().Save(wmsLogisticsMainLog, listWmsAndLogistics);

                //获取备料主表ID
                string preparationMainIds = string.Join(",", listWmsAndLogistics.Select(P => P.preparationString));

                //获取备料明细
                List<AscmWmsPreparationDetail> listPreparationDetail = AscmWmsPreparationDetailService.GetInstance().GetSetWipEntityNameList(preparationMainIds);
                if (listPreparationDetail == null || listPreparationDetail.Count == 0)
                {
                    wmsLogisticsMainLog.returnCode = AscmWmsLogisticsMainLog.ReturnCodeDefine.error;
                    wmsLogisticsMainLog.returnMessage = "获取备料明细失败";
                    AscmWmsLogisticsMainLogService.GetInstance().Update(wmsLogisticsMainLog);
                    return;
                }

                //获取作业、作业BOM
                string wipEntityIds = string.Join(",", listWmsAndLogistics.Select(P => P.wipEntityId).Distinct());
                List<AscmWipRequirementOperations> listBom = null;
                string whereWipEntityIds = AscmCommonHelperService.GetInstance().IsJudgeListCount(wipEntityIds, "wipEntityId");
                if (!string.IsNullOrEmpty(whereWipEntityIds))
                    listBom = AscmWipRequirementOperationsService.GetInstance().GetList("from AscmWipRequirementOperations where " + whereWipEntityIds);
                if (listBom == null || listBom.Count == 0)
                {
                    wmsLogisticsMainLog.returnCode = AscmWmsLogisticsMainLog.ReturnCodeDefine.error;
                    wmsLogisticsMainLog.returnMessage = "获取作业BOM失败";
                    AscmWmsLogisticsMainLogService.GetInstance().Update(wmsLogisticsMainLog);
                    return;
                }
                List<AscmWipRequirementOperations> listBomUpdate = new List<AscmWipRequirementOperations>();
                List<AscmWipDiscreteJobs> listWipDiscreteJobs = AscmWipDiscreteJobsService.GetInstance().GetList("from AscmWipDiscreteJobs where " + whereWipEntityIds);
                if (listWipDiscreteJobs == null || listWipDiscreteJobs.Count == 0)
                {
                    wmsLogisticsMainLog.returnCode = AscmWmsLogisticsMainLog.ReturnCodeDefine.error;
                    wmsLogisticsMainLog.returnMessage = "获取作业失败";
                    AscmWmsLogisticsMainLogService.GetInstance().Update(wmsLogisticsMainLog);
                    return;
                }

                //存储生成的领料单
                List<AscmWmsMtlRequisitionMain> listRequisitionMain = new List<AscmWmsMtlRequisitionMain>();
                //按作业分组生成领料单主表(MES限制只能上传单个作业)
                var result = listWmsAndLogistics.GroupBy(P => P.wipEntityId);

                string maxIdKey = YnFrame.Services.YnBillKeyService.GetInstance().GetBillKey("ascm_wms_mtl_req_main_id", "", "", 10, result.Count());
                int maxId = Convert.ToInt32(maxIdKey);
                int maxId_Detail = 0;
                foreach (IGrouping<int, WmsAndLogistics> ig in result)
                {
                    //生成领料单
                    AscmWmsMtlRequisitionMain requisitionMain = new AscmWmsMtlRequisitionMain();
                    requisitionMain.id = maxId++;
                    requisitionMain.organizationId = 775;
                    requisitionMain.docNumber = AscmMesService.GetInstance().GetMesRequisitionBillNo();  //获取MES领料单闭环单号
                    requisitionMain.createTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                    requisitionMain.modifyTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                    requisitionMain.status = AscmWmsMtlRequisitionMain.StatusDefine.failed;
                    requisitionMain.wipEntityId = ig.Key;
                    requisitionMain.workerId = ig.FirstOrDefault().workerId;
                    listRequisitionMain.Add(requisitionMain);

                    //存储更新了发料数量的备料明细
                    List<AscmWmsPreparationDetail> listPreparationDetailUpdate = new List<AscmWmsPreparationDetail>();
                    requisitionMain.listPreparationDetail = listPreparationDetailUpdate;

                    //按物料分组生成领料单明细
                    List<AscmWmsMtlRequisitionDetail> listRequisitionDetail = new List<AscmWmsMtlRequisitionDetail>();
                    requisitionMain.listDetail = listRequisitionDetail;

                    //领料明细与备料明细关联
                    List<AscmWmsMtlReqDetailLink> listReqDetailLink = new List<AscmWmsMtlReqDetailLink>();
                    requisitionMain.listReqDetailLink = listReqDetailLink;

                    var result2 = ig.GroupBy(P => P.materialId);
                    foreach (IGrouping<int, WmsAndLogistics> ig2 in result2)
                    {
                        //作业物料的领料数量
                        decimal requisitionQuantity = ig2.Sum(P => P.quantity);
                        if (requisitionQuantity > decimal.Zero)
                        {
                            //对应的备料单
                            var iePreparationMainId = string.Join(",", ig2.Select(P => P.preparationString)).Split(',').Distinct();
                            //对应的作业BOM
                            AscmWipRequirementOperations wipRequirementOperations = listBom.Find(P => P.wipEntityId == ig.Key && P.inventoryItemId == ig2.Key);
                            bool modify = false;
                            foreach (AscmWmsPreparationDetail preparationDetail in listPreparationDetail)
                            {
                                if (iePreparationMainId.Contains(preparationDetail.mainId.ToString())
                                    && preparationDetail.wipEntityId == ig.Key
                                    && preparationDetail.materialId == ig2.Key
                                    && preparationDetail.sendLogisticsQuantity > preparationDetail.issueQuantity)
                                {
                                    AscmWmsMtlRequisitionDetail requisitionDetail =
                                        listRequisitionDetail.Find(P => P.materialId == preparationDetail.materialId
                                            && P.warehouseId == preparationDetail.warehouseId
                                            && P.warelocationId == preparationDetail.warelocationId);
                                    if (requisitionDetail == null)
                                    {
                                        requisitionDetail = new AscmWmsMtlRequisitionDetail();
                                        requisitionDetail.id = ++maxId_Detail;
                                        requisitionDetail.mainId = requisitionMain.id;
                                        requisitionDetail.wipEntityName = preparationDetail.wipEntityName;
                                        requisitionDetail.materialId = preparationDetail.materialId;
                                        requisitionDetail.warehouseId = preparationDetail.warehouseId;
                                        requisitionDetail.warelocationId = preparationDetail.warelocationId;
                                        requisitionDetail.quantity = decimal.Zero;
                                        listRequisitionDetail.Add(requisitionDetail);
                                    }
                                    //发料数量=传递给物流领料模块数量-已发料数量
                                    decimal issueQuantity = preparationDetail.sendLogisticsQuantity - preparationDetail.issueQuantity;
                                    //实际发料数量
                                    decimal realIssueQuantity = requisitionQuantity > issueQuantity ? issueQuantity : requisitionQuantity;
                                    //领料明细领料数量
                                    requisitionDetail.quantity += realIssueQuantity;
                                    //更新备料明细发料数量
                                    preparationDetail.issueQuantity += realIssueQuantity;
                                    listPreparationDetailUpdate.Add(preparationDetail);

                                    AscmWmsMtlReqDetailLink reqDetailLink = new AscmWmsMtlReqDetailLink();
                                    reqDetailLink.reqDetailLinkPK = new AscmWmsMtlReqDetailLinkPK { reqDetailId = requisitionDetail.id, preDetailId = preparationDetail.id };
                                    reqDetailLink.quantity = realIssueQuantity;
                                    listReqDetailLink.Add(reqDetailLink);

                                    //更新BOM仓库发料数量
                                    if (wipRequirementOperations != null)
                                    {
                                        modify = true;
                                        wipRequirementOperations.ascmIssuedQuantity += realIssueQuantity;
                                    }

                                    requisitionQuantity -= realIssueQuantity;
                                    if (requisitionQuantity == decimal.Zero)
                                        break;
                                }
                            }
                            if (modify)
                                listBomUpdate.Add(wipRequirementOperations);
                        }
                    }
                }

                //设置领料明细ID
                string maxDetailIdKey = YnFrame.Services.YnBillKeyService.GetInstance().GetBillKey("ascm_wms_mtl_req_detail_id", "", "", 10, maxId_Detail);
                int maxDetailId = Convert.ToInt32(maxDetailIdKey);
                string warelocationIds = string.Empty;
                List<int> listPreparationMainId = new List<int>();
                foreach (AscmWmsMtlRequisitionMain requisitionMain in listRequisitionMain)
                {
                    foreach (AscmWmsMtlRequisitionDetail requisitionDetail in requisitionMain.listDetail)
                    {
                        int detailId = requisitionDetail.id;
                        requisitionDetail.id = maxDetailId++;
                        requisitionMain.listReqDetailLink.FindAll(P => P.reqDetailLinkPK.reqDetailId == detailId).ForEach(P => P.reqDetailLinkPK.reqDetailId = requisitionDetail.id);
                        if (requisitionDetail.warelocationId > 0)
                        {
                            if (!string.IsNullOrEmpty(warelocationIds))
                                warelocationIds += ",";
                            warelocationIds += requisitionDetail.warelocationId;
                        }
                    }
                    if (requisitionMain.listPreparationDetail != null && requisitionMain.listPreparationDetail.Count > 0)
                        listPreparationMainId.AddRange(requisitionMain.listPreparationDetail.Select(P => P.mainId));
                }

                //获取备料单
                List<AscmWmsPreparationMain> listPreparationMain = null;
                if (listPreparationMainId.Count > 0)
                {
                    string hql = "from AscmWmsPreparationMain where id in(" + string.Join(",", listPreparationMainId.Distinct()) + ")";
                    listPreparationMain = AscmWmsPreparationMainService.GetInstance().GetList(hql);
                }

                //货位物料库存
                List<AscmLocationMaterialLink> listLocationMaterialLink = AscmLocationMaterialLinkService.GetInstance().GetListByWarelocationIds(warelocationIds);

                //记录上传MES日志
                List<AscmMesInteractiveLog> listMesInteractiveLog = new List<AscmMesInteractiveLog>();
                string maxLogIdKey = YnFrame.Services.YnBillKeyService.GetInstance().GetBillKey("ascm_mes_interactive_log_id", "", "", 10, listRequisitionMain.Count);
                int maxLogId = Convert.ToInt32(maxLogIdKey);

                //上传MES
                foreach (AscmWmsMtlRequisitionMain requisitionMain in listRequisitionMain)
                {
                    //领料明细
                    List<AscmWmsMtlRequisitionDetail> listRequisitionDetail = requisitionMain.listDetail;
                    if (listRequisitionDetail.Count == 0)
                        continue;

                    //需要更新的备料明细
                    List<AscmWmsPreparationDetail> listPreparationDetailUpdate = requisitionMain.listPreparationDetail;

                    //领料单与备料单关联
                    List<AscmWmsMtlReqMainLink> listReqMainLink = new List<AscmWmsMtlReqMainLink>();
                    List<AscmWmsMtlReqDetailLink> listReqDetailLink = requisitionMain.listReqDetailLink;

                    //更新备料单状态
                    List<AscmWmsPreparationMain> listPreparationMainUpdate = null;
                    if (listPreparationMain != null && listPreparationMain.Count > 0 && listPreparationDetailUpdate != null && listPreparationDetailUpdate.Count > 0)
                    {
                        List<AscmWmsPreparationMain> _listPreparationMain = listPreparationMain.FindAll(P => listPreparationDetailUpdate.Select(T => T.mainId).Contains(P.id));
                        if (_listPreparationMain != null && _listPreparationMain.Count > 0)
                        {
                            //设置领料单创建人和手工单号
                            requisitionMain.createUser = _listPreparationMain.First().createUser;
                            requisitionMain.manualDocNumber = YnFrame.Services.YnBillKeyService.GetInstance().GetBillKey("AscmWmsMtlRequisitionMain", requisitionMain.createUser, "yyyyMMdd", 4);

                            listPreparationMainUpdate = new List<AscmWmsPreparationMain>();
                            foreach (AscmWmsPreparationMain preparationMain in _listPreparationMain)
                            {
                                string previousStatus = preparationMain.status;
                                if (previousStatus == AscmWmsPreparationMain.StatusDefine.preparedUnPick)
                                {
                                    preparationMain.status = AscmWmsPreparationMain.StatusDefine.picked;
                                    //2014-3-25 如果备料单中存在未领完的物料,则单据状态置为“已备齐_待领料”
                                    var details = listPreparationDetail.Where(P => P.mainId == preparationMain.id);
                                    if (details != null && details.Count() > 0)
                                    {
                                        foreach (AscmWmsPreparationDetail detail in details)
                                        {
                                            var bom = listBom.Find(P => P.wipEntityId == detail.wipEntityId && P.inventoryItemId == detail.materialId);
                                            if (bom != null && bom.ascmIssuedQuantity < bom.requiredQuantity)
                                            {
                                                preparationMain.status = AscmWmsPreparationMain.StatusDefine.preparedUnPick;
                                                break;
                                            }
                                        }
                                    }
                                }
                                else if (previousStatus == AscmWmsPreparationMain.StatusDefine.preparingUnPick)
                                {
                                    preparationMain.status = AscmWmsPreparationMain.StatusDefine.preparingUnConfirm;
                                }
                                if (previousStatus != preparationMain.status)
                                    listPreparationMainUpdate.Add(preparationMain);

                                AscmWmsMtlReqMainLink reqMainLink = new AscmWmsMtlReqMainLink();
                                reqMainLink.reqMainLinkPK = new AscmWmsMtlReqMainLinkPK { reqMainId = requisitionMain.id, preMainId = preparationMain.id };
                                listReqMainLink.Add(reqMainLink);
                            }
                        }
                    }

                    //创建上传MES日志
                    AscmMesInteractiveLog mesInteractiveLog = new AscmMesInteractiveLog();
                    mesInteractiveLog.id = maxLogId++;
                    mesInteractiveLog.billId = requisitionMain.id;
                    mesInteractiveLog.docNumber = requisitionMain.docNumber;
                    mesInteractiveLog.billType = AscmMesInteractiveLog.BillTypeDefine.mtlRequisition;
                    mesInteractiveLog.createUser = requisitionMain.createUser;
                    mesInteractiveLog.modifyUser = requisitionMain.createUser;
                    mesInteractiveLog.createTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm");
                    mesInteractiveLog.modifyTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm");
                    listMesInteractiveLog.Add(mesInteractiveLog);

                    //减少货位物料库存
                    List<AscmLocationMaterialLink> listLocationMaterialLinkUpdate = null;
                    if (listLocationMaterialLink != null && listLocationMaterialLink.Count > 0)
                    {
                        listLocationMaterialLinkUpdate = new List<AscmLocationMaterialLink>();
                        foreach (AscmWmsMtlRequisitionDetail requisitionDetail in listRequisitionDetail)
                        {
                            AscmLocationMaterialLink locationMaterialLink = listLocationMaterialLink.Find(P => P.pk.warelocationId == requisitionDetail.warelocationId && P.pk.materialId == requisitionDetail.materialId);
                            if (locationMaterialLink != null)
                            {
                                locationMaterialLink.modifyUser = requisitionMain.createUser;
                                locationMaterialLink.modifyTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                                locationMaterialLink.quantity -= requisitionDetail.quantity;
                                listLocationMaterialLinkUpdate.Add(locationMaterialLink);
                            }
                            else
                            {
                                requisitionDetail.returnCode = -1;
                                requisitionDetail.returnMessage = "获取货位失败";
                            }
                        }
                    }

                    //更新作业BOM发料数量
                    List<AscmWipRequirementOperations> _listBom = listBomUpdate.FindAll(P => P.wipEntityId == requisitionMain.wipEntityId);
                    //更新作业备料状态
                    AscmWipDiscreteJobs wipDiscreteJobs = listWipDiscreteJobs.Find(P => P.wipEntityId == requisitionMain.wipEntityId);
                    //List<AscmWipDiscreteJobsStatus> listStatus = null;
                    if (wipDiscreteJobs != null)
                    {
                        //2014-3-25 如果作业下的备料单状态存在“已备齐_待领料”,则作业状态置为“待领料”
                        bool isUnPick = false;
                        foreach (AscmWmsPreparationMain main in listPreparationMain)
                        {
                            if (main.status != AscmWmsPreparationMain.StatusDefine.preparedUnPick)
                                continue;

                            isUnPick = listPreparationDetail.Where(P => P.mainId == main.id).Select(P => P.wipEntityId).Contains(wipDiscreteJobs.wipEntityId);
                            break;
                        }

                        //旧的逻辑
                        if (isUnPick)
                            wipDiscreteJobs.ascmStatus = AscmWipDiscreteJobs.AscmStatusDefine.unPick;
                        else if (_listBom.Exists(P => P.ascmIssuedQuantity < P.requiredQuantity))
                            wipDiscreteJobs.ascmStatus = AscmWipDiscreteJobs.AscmStatusDefine.preparing;
                        else
                            wipDiscreteJobs.ascmStatus = AscmWipDiscreteJobs.AscmStatusDefine.picked;
                    }

                    //执行事务
                    ISession session = null;
                    session = YnDaoHelper.GetInstance().nHibernateHelper.GetCurrentSession();
                    session.Clear();
                    using (ITransaction tx = session.BeginTransaction())
                    {
                        try
                        {
                            AscmMesService.GetInstance().DoMtlRequisition(requisitionMain, listRequisitionDetail, requisitionMain.createUser, mesInteractiveLog);
                            if (mesInteractiveLog.returnCode == "0")
                            {
                                mesInteractiveLog.returnMessage = "领料成功";
                                requisitionMain.status = AscmWmsMtlRequisitionMain.StatusDefine.succeeded;
                            }

                            //添加领料单
                            YnDaoHelper.GetInstance().nHibernateHelper.Save(requisitionMain);
                            //添加领料单明细
                            YnDaoHelper.GetInstance().nHibernateHelper.SaveList(listRequisitionDetail);
                            //添加领料单与备料单关联
                            YnDaoHelper.GetInstance().nHibernateHelper.SaveList(listReqMainLink);
                            //添加领料明细与备料明细关联
                            YnDaoHelper.GetInstance().nHibernateHelper.SaveList(listReqDetailLink);
                            //更新货位物料库存
                            if (listLocationMaterialLinkUpdate != null)
                                YnDaoHelper.GetInstance().nHibernateHelper.UpdateList(listLocationMaterialLinkUpdate);
                            //更新备料单状态
                            if (listPreparationMainUpdate != null && listPreparationMainUpdate.Count > 0)
                                YnDaoHelper.GetInstance().nHibernateHelper.UpdateList(listPreparationMainUpdate);
                            //更新备料单明细发料数量
                            if (listPreparationDetailUpdate != null)
                                listPreparationDetailUpdate.ForEach(P => session.Merge(P));
                            //更新作业备料状态
                            if (wipDiscreteJobs != null)
                                YnDaoHelper.GetInstance().nHibernateHelper.Update(wipDiscreteJobs);
                            //更新作业备料状态--明细状态
                            //if (listStatus != null && listStatus.Count>0)
                            //    YnDaoHelper.GetInstance().nHibernateHelper.UpdateList(listStatus);
                            //更新作业BOM发料数量
                            if (_listBom != null)
                                YnDaoHelper.GetInstance().nHibernateHelper.UpdateList(_listBom);

                            tx.Commit();
                        }
                        catch (Exception ex)
                        {
                            tx.Rollback();
                            mesInteractiveLog.returnCode = "-1";
                            mesInteractiveLog.returnMessage = ex.Message;
                            YnBaseClass2.Helper.LogHelper.GetLog().Error("领料失败(Find AscmWmsMtlRequisitionMain)", ex);
                        }
                    }

                    //新的作业状态逻辑,保存到明细状态
                    List<AscmWipDiscreteJobsStatus> listStatus = AscmWipDiscreteJobsService.Instance.GetListByStrWhere(string.Format(" AND wipEntityId IN ({0}) ", wipEntityIds));
                    List<AscmWmsPreparationMain> mylistPreparationMain = AscmWmsPreparationMainService.GetInstance().GetList(string.Format(" from AscmWmsPreparationMain where wipEntityId in ({0}) ", wipEntityIds));
                    List<AscmWhTeamUser> listWhUser = AscmWhTeamUserService.Instance.GetList();

                    if (listStatus != null && listStatus.Count > 0 && listWhUser != null && listWhUser.Count > 0 && mylistPreparationMain != null)
                    {
                        foreach (var jobStatus in listStatus)
                        {
                            List<string> myTeamUserIds = null;
                            AscmWhTeamUser whTeamLeader = listWhUser.FirstOrDefault(p => p.M_UserId == jobStatus.leaderId);
                            if (whTeamLeader != null) myTeamUserIds = listWhUser.Where(p => p.M_TeamId == whTeamLeader.M_TeamId).Select(p => p.M_UserId).ToList();
                            if (myTeamUserIds == null) continue;

                            List<AscmWmsPreparationMain> subListPreparationMain
                                = mylistPreparationMain.Where(p => p.wipEntityId == jobStatus.wipEntityId && myTeamUserIds.Contains(p.createUser)).ToList();
                            if (subListPreparationMain == null || subListPreparationMain.Count == 0) continue;

                            int prepMainTotal = subListPreparationMain.Count;
                            int pickedCount = 0;
                            int un_pickedCount = 0;
                            foreach (var prepMain in subListPreparationMain)
                            {
                                if (prepMain.status == AscmWmsPreparationMain.StatusDefine.picked)
                                {
                                    pickedCount++;
                                }

                                if (prepMain.status == AscmWmsPreparationMain.StatusDefine.preparedUnPick ||
                                    prepMain.status == AscmWmsPreparationMain.StatusDefine.preparingUnPick)
                                {
                                    un_pickedCount++;
                                }
                            }

                            if (pickedCount == prepMainTotal)
                            {
                                jobStatus.subStatus = AscmWipDiscreteJobs.AscmStatusDefine.picked;
                            }
                            else if (un_pickedCount == prepMainTotal)
                            {
                                jobStatus.subStatus = AscmWipDiscreteJobs.AscmStatusDefine.unPick;
                            }
                            else
                            {
                                jobStatus.subStatus = AscmWipDiscreteJobs.AscmStatusDefine.preparing;
                            }
                        }
                    }

                    session = YnDaoHelper.GetInstance().nHibernateHelper.GetCurrentSession();
                    session.Clear();
                    using (ITransaction tx = session.BeginTransaction())
                    {
                        try
                        {
                            //更新作业备料状态--明细状态
                            if (listStatus != null && listStatus.Count > 0)
                            {
                                YnDaoHelper.GetInstance().nHibernateHelper.UpdateList(listStatus);
                            }
                            tx.Commit();
                        }
                        catch (Exception ex)
                        {
                            tx.Rollback();
                        }
                    }
                }

                //保存上传MES日志
                AscmMesInteractiveLogService.GetInstance().Save(listMesInteractiveLog);
            }
            catch (Exception ex)
            {
                var msg = ex.Message;
                throw ex;
            }
        }