public AscmWmsContainerDelivery(AscmWmsContainerDelivery containerDelivery, string compounder, string preparationStatus)
        {
            this.id = containerDelivery.id;
            this.organizationId = containerDelivery.organizationId;
            this.createUser = containerDelivery.createUser;
            this.createTime = containerDelivery.createTime;
            this.modifyUser = containerDelivery.modifyUser;
            this.modifyTime = containerDelivery.modifyTime;
            this.containerSn = containerDelivery.containerSn;
            this.preparationMainId = containerDelivery.preparationMainId;
            this.materialId = containerDelivery.materialId;
            this.quantity = containerDelivery.quantity;
            this.status = containerDelivery.status;
            this.wipEntityId = containerDelivery.wipEntityId;

            this.compounder = compounder;
            this.preparationStatus = preparationStatus;
        }
        public AscmWmsContainerDelivery(AscmWmsContainerDelivery containerDelivery, string compounder, string preparationStatus)
        {
            this.id                = containerDelivery.id;
            this.organizationId    = containerDelivery.organizationId;
            this.createUser        = containerDelivery.createUser;
            this.createTime        = containerDelivery.createTime;
            this.modifyUser        = containerDelivery.modifyUser;
            this.modifyTime        = containerDelivery.modifyTime;
            this.containerSn       = containerDelivery.containerSn;
            this.preparationMainId = containerDelivery.preparationMainId;
            this.materialId        = containerDelivery.materialId;
            this.quantity          = containerDelivery.quantity;
            this.status            = containerDelivery.status;
            this.wipEntityId       = containerDelivery.wipEntityId;

            this.compounder        = compounder;
            this.preparationStatus = preparationStatus;
        }
        public AscmWmsContainerDelivery Add(string containerSn, int preparationMainId, int materialId, int warelocationId, decimal quantity)
        {
            try
            {
                AscmWmsContainerDelivery ascmWmsContainerDelivery = new AscmWmsContainerDelivery();
                ascmWmsContainerDelivery.organizationId = 775;
                ascmWmsContainerDelivery.createUser = "";
                ascmWmsContainerDelivery.createTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm");
                ascmWmsContainerDelivery.modifyUser = "";
                ascmWmsContainerDelivery.modifyTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm");
                ascmWmsContainerDelivery.containerSn = containerSn;
                ascmWmsContainerDelivery.preparationMainId = preparationMainId;
                ascmWmsContainerDelivery.materialId = materialId;
                ascmWmsContainerDelivery.quantity = quantity;

                int maxId = YnDaoHelper.GetInstance().nHibernateHelper.GetMaxId("select max(id) from AscmWmsContainerDelivery");
                maxId++;
                ascmWmsContainerDelivery.id = maxId;
                using (ITransaction tx = YnDaoHelper.GetInstance().nHibernateHelper.GetCurrentSession().BeginTransaction())
                {
                    try
                    {
                        YnDaoHelper.GetInstance().nHibernateHelper.Save(ascmWmsContainerDelivery);
                        tx.Commit();//正确执行提交
                    }
                    catch (Exception ex)
                    {
                        tx.Rollback();//回滚
                        throw ex;
                    }
                }
                return ascmWmsContainerDelivery;
            }
            catch (Exception ex)
            {
                YnBaseClass2.Helper.LogHelper.GetLog().Error("保存失败(Save AscmWmsContainerDelivery)", ex);
                throw ex;
            }
        }
        /// <summary>PC端备料</summary>
        public bool DoWebPreparation(AscmWmsPreparationMain preparationMain, List<AscmWmsPreparationDetail> listPreparationDetail, ref string error, bool doMerge = false)
        {
            error = string.Empty;
            if (preparationMain == null || listPreparationDetail == null || listPreparationDetail.Count == 0)
                return false;
            //获取作业BOM
            string where = "";
            var wipEntityIds = listPreparationDetail.Select(P => P.wipEntityId).Distinct();
            where = YnBaseClass2.Helper.StringHelper.SqlWhereAndAdd(where, "wipEntityId in(" + string.Join(",", wipEntityIds) + ")");
            var materialIds = listPreparationDetail.Select(P => P.materialId).Distinct();
            where = YnBaseClass2.Helper.StringHelper.SqlWhereAndAdd(where, "inventoryItemId in(" + string.Join(",", materialIds) + ")");
            string hql = "from AscmWipRequirementOperations";
            if (!string.IsNullOrEmpty(where))
                hql += " where " + where;
            List<AscmWipRequirementOperations> listBom = AscmWipRequirementOperationsService.GetInstance().GetList(hql);
            if (listBom == null || listBom.Count == 0)
                return false;
            //获取备料单对应的容器备料表
            hql = "from AscmWmsContainerDelivery where preparationMainId=" + preparationMain.id;
            List<AscmWmsContainerDelivery> listContainerDelivery = AscmWmsContainerDeliveryService.GetInstance().GetList(hql);

            List<AscmWipRequirementOperations> listBomUpdate = new List<AscmWipRequirementOperations>();
            List<AscmWmsContainerDelivery> listContainerDeliverySaveOrUpdate = new List<AscmWmsContainerDelivery>();
            int containerDeliveryId = 0;
            foreach (AscmWmsPreparationDetail preparationDetail in listPreparationDetail)
            {
                if (preparationDetail.prepareQuantity == 0)
                    continue;
                //验证作业BOM备料数量
                var bom = listBom.Find(P => P.wipEntityId == preparationDetail.wipEntityId && P.inventoryItemId == preparationDetail.materialId);
                if (bom != null)
                {
                    //作业中物料备料总数=本次作业物料备料数量+作业中物料已备数量
                    decimal preparationTotal = preparationDetail.prepareQuantity + bom.ascmPreparedQuantity;
                    if (bom.requiredQuantity < preparationTotal)
                        error = "作业【" + preparationDetail.wipEntityName + "】物料【" + preparationDetail.materialDocNumber + "】的备料数量[" + preparationTotal + "]大于需求数量[" + bom.requiredQuantity + "]";
                }
                else
                    error = "作业【" + preparationDetail.wipEntityName + "】物料清单中找不到物料【" + preparationDetail.materialDocNumber + "】";
                if (!string.IsNullOrEmpty(error))
                    return false;
                bom.ascmPreparedQuantity += preparationDetail.prepareQuantity; //更新作业BOM备料数量
                listBomUpdate.Add(bom);
                //容器备料
                AscmWmsContainerDelivery containerDelivery = null;
                if (listContainerDelivery != null)
                    containerDelivery = listContainerDelivery.Find(P => P.wipEntityId == preparationDetail.wipEntityId && P.materialId == preparationDetail.materialId);
                if (containerDelivery == null)
                {
                    containerDelivery = new AscmWmsContainerDelivery();
                    containerDelivery.id = --containerDeliveryId;
                    containerDelivery.createUser = preparationDetail.modifyUser;
                    containerDelivery.createTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                    containerDelivery.wipEntityId = preparationDetail.wipEntityId;
                    containerDelivery.materialId = preparationDetail.materialId;
                    containerDelivery.preparationMainId = preparationMain.id;
                }
                containerDelivery.modifyUser = preparationDetail.modifyUser;
                containerDelivery.modifyTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                containerDelivery.quantity += preparationDetail.prepareQuantity;
                listContainerDeliverySaveOrUpdate.Add(containerDelivery);
            }
            if (containerDeliveryId < 0)
            {
                string maxIdKey = YnFrame.Services.YnBillKeyService.GetInstance().GetBillKey("ascm_wms_container_delivery_id", "", "", 10, Math.Abs(containerDeliveryId));
                int maxId = Convert.ToInt32(maxIdKey);
                listContainerDeliverySaveOrUpdate.Where(P => P.id < 0).ToList().ForEach(P => P.id = maxId++);
            }
            //作业备料时要对作业状态进行更新
            List<AscmWipDiscreteJobs> listWipDiscreteJobs = null;
            AscmWipDiscreteJobsStatus jobsStatus = null;
            if (preparationMain.pattern == AscmWmsPreparationMain.PatternDefine.wipJob)
            {
                //旧的逻辑
                listWipDiscreteJobs = AscmWipDiscreteJobsService.GetInstance().GetList(wipEntityIds.ToList(), "ascmStatus='" + AscmWipDiscreteJobs.AscmStatusDefine.unPrepare + "'");
                if (listWipDiscreteJobs != null)
                    listWipDiscreteJobs.ForEach(P => P.ascmStatus = AscmWipDiscreteJobs.AscmStatusDefine.preparing);

                //新的逻辑,保存到明细状态
                jobsStatus = AscmWipDiscreteJobsService.Instance.Get(preparationMain.wipEntityId, AscmWhTeamUserService.Instance.GetLeaderId(preparationMain.createUser));
                if (jobsStatus != null && jobsStatus.subStatus == AscmWipDiscreteJobs.AscmStatusDefine.unPrepare)
                {
                    jobsStatus.subStatus = AscmWipDiscreteJobs.AscmStatusDefine.preparing;
                }
                else if (jobsStatus != null && jobsStatus.subStatus == AscmWipDiscreteJobs.AscmStatusDefine.unPick)
                {
                    jobsStatus.subStatus = AscmWipDiscreteJobs.AscmStatusDefine.preparing;
                }
                else if (jobsStatus != null && jobsStatus.subStatus == AscmWipDiscreteJobs.AscmStatusDefine.picked)
                {
                    jobsStatus.subStatus = AscmWipDiscreteJobs.AscmStatusDefine.preparing;
                }
                else
                {
                    jobsStatus = null;
                }
            }
            //执行事务处理
            ISession session = YnDaoHelper.GetInstance().nHibernateHelper.GetCurrentSession();
            session.Clear();
            using (ITransaction tx = session.BeginTransaction())
            {
                try
                {
                    if (doMerge)
                        listPreparationDetail.ForEach(P => session.Merge(P));
                    else
                        YnDaoHelper.GetInstance().nHibernateHelper.UpdateList(listPreparationDetail);
                    if (listBomUpdate != null && listBomUpdate.Count > 0)
                        YnDaoHelper.GetInstance().nHibernateHelper.UpdateList(listBomUpdate);
                    if (listContainerDeliverySaveOrUpdate.Count > 0)
                        YnDaoHelper.GetInstance().nHibernateHelper.SaveOrUpdateList(listContainerDeliverySaveOrUpdate);
                    if (listWipDiscreteJobs != null && listWipDiscreteJobs.Count > 0)
                        YnDaoHelper.GetInstance().nHibernateHelper.UpdateList(listWipDiscreteJobs);
                    if (jobsStatus != null)
                        YnDaoHelper.GetInstance().nHibernateHelper.Update<AscmWipDiscreteJobsStatus>(jobsStatus);

                    tx.Commit();
                }
                catch (Exception ex)
                {
                    tx.Rollback();
                    error = ex.Message;
                }
            }
            if (!string.IsNullOrEmpty(error))
                return false;
            //更新备料单状态
            string previousStatus = preparationMain.status;
            PrepareChangeStatus(preparationMain);
            List<AscmWmsPreparationMain> listPreparationMainUpdate = new List<AscmWmsPreparationMain>();
            if (previousStatus != preparationMain.status)
                listPreparationMainUpdate.Add(preparationMain);
            //其他备料单
            string whereOther = "";
            whereOther = YnBaseClass2.Helper.StringHelper.SqlWhereAndAdd(whereOther, "id<>" + preparationMain.id);
            if (preparationMain.pattern == AscmWmsPreparationMain.PatternDefine.wipJob)
            {
                whereOther = YnBaseClass2.Helper.StringHelper.SqlWhereAndAdd(whereOther, "pattern='" + AscmWmsPreparationMain.PatternDefine.wipJob + "'");
                whereOther = YnBaseClass2.Helper.StringHelper.SqlWhereAndAdd(whereOther, "wipEntityId=" + preparationMain.wipEntityId);
            }
            else if (preparationMain.pattern == AscmWmsPreparationMain.PatternDefine.wipRequire)
            {
                whereOther = YnBaseClass2.Helper.StringHelper.SqlWhereAndAdd(whereOther, "id in(select mainId from AscmWmsPreparationDetail where wipEntityId in(" + string.Join(",", wipEntityIds) + "))");
            }
            hql = "from AscmWmsPreparationMain where " + whereOther;
            List<AscmWmsPreparationMain> listPreparationMain = GetList(hql);
            if (listPreparationMain != null && listPreparationMain.Count > 0)
            {
                foreach (AscmWmsPreparationMain _preparationMain in listPreparationMain)
                {
                    //只有当其它备料单状态更新为“已备齐”时,才更新
                    PrepareChangeStatus(_preparationMain);
                    if (_preparationMain.status == AscmWmsPreparationMain.StatusDefine.prepared)
                        listPreparationMainUpdate.Add(_preparationMain);
                }
            }
            if (listPreparationMainUpdate.Count > 0)
                Update(listPreparationMainUpdate, preparationMain.pattern == AscmWmsPreparationMain.PatternDefine.wipJob);
            return true;
        }
 public void Update(AscmWmsContainerDelivery ascmWmsContainerDelivery)
 {
     try
     {
         using (ITransaction tx = YnDaoHelper.GetInstance().nHibernateHelper.GetCurrentSession().BeginTransaction())
         {
             try
             {
                 YnDaoHelper.GetInstance().nHibernateHelper.Update<AscmWmsContainerDelivery>(ascmWmsContainerDelivery);
                 tx.Commit();//正确执行提交
             }
             catch (Exception ex)
             {
                 tx.Rollback();//回滚
                 YnBaseClass2.Helper.LogHelper.GetLog().Error("修改失败(Update AscmWmsContainerDelivery)", ex);
                 throw ex;
             }
         }
     }
     catch (Exception ex)
     {
         YnBaseClass2.Helper.LogHelper.GetLog().Error("修改失败(Save AscmWmsContainerDelivery)", ex);
         throw ex;
     }
 }
 public void Delete(AscmWmsContainerDelivery ascmWmsContainerDelivery)
 {
     try
     {
         YnDaoHelper.GetInstance().nHibernateHelper.Delete<AscmWmsContainerDelivery>(ascmWmsContainerDelivery);
     }
     catch (Exception ex)
     {
         YnBaseClass2.Helper.LogHelper.GetLog().Error("删除失败(Delete AscmWmsContainerDelivery)", ex);
         throw ex;
     }
 }