Пример #1
0
        public int AddTraOrder(TraAddOrderModel newOrder)
        {
            newOrder.Order.TrainPlace = "代售点";
            newOrder.Order.OrderRoot  = 0;
            newOrder.Order.CreateTime = DateTime.Now;
            if (newOrder.Order.PayAmount == 0)
            {
                newOrder.Order.PayAmount = newOrder.Order.TotalMoney;
            }
            newOrder.Order.OpeartorId = newOrder.Order.CreateOid;

            newOrder.Order.OrderSource = newOrder.OrderSource;

            if (newOrder.AddOrderType == 1)//手动
            {
                newOrder.Order.OrderType = 0;
            }
            else
            {
                newOrder.Order.OrderType = 1;
            }

            if (newOrder.Customer != null && !string.IsNullOrEmpty(newOrder.Customer.Category) &&
                newOrder.Customer.Category.ToUpper() == "D")
            {
                newOrder.Order.BalanceType = 1;
                newOrder.Order.TravelType  = 0;
            }
            else
            {
                newOrder.Order.BalanceType = 0;
                newOrder.Order.TravelType  = 1;
            }

            //如果存在项目名称
            if (newOrder.ProjectName != null && newOrder.ProjectName.ProjectId > 0)
            {
                newOrder.Order.ProjectId = newOrder.ProjectName.ProjectId;
            }

            if (newOrder.CostCenter != null && newOrder.CostCenter.Cid > 0)
            {
                newOrder.Order.CostCenter = newOrder.CostCenter.Depart;
            }
            if (string.IsNullOrEmpty(newOrder.Order.CostCenter))
            {
                newOrder.Order.CostCenter = "";
            }

            if (newOrder.AddOrderType == 0)
            {
                newOrder.Order.OrderFrom = TraOrderFromEnum.Interface.ToString();
            }
            else
            {
                newOrder.Order.OrderFrom = TraOrderFromEnum.Hand.ToString();
            }

            if (newOrder.Order.OrderSource == "O")
            {
                newOrder.Order.IsOnline = "F";
            }
            else
            {
                newOrder.Order.IsOnline = "T";
            }

            TraOrderEntity orderEntity = Mapper.Map <TraOrderModel, TraOrderEntity>(newOrder.Order);

            orderEntity.CorpPolicy   = string.Empty;
            orderEntity.ChoiceReason = string.Empty;

            foreach (var traOrderDetailModel in newOrder.OrderDetailList)
            {
                if (!string.IsNullOrEmpty(traOrderDetailModel.CorpPolicy))
                {
                    orderEntity.CorpPolicy += "|" + traOrderDetailModel.CorpPolicy;
                }
                if (!string.IsNullOrEmpty(traOrderDetailModel.ChoiceReason))
                {
                    orderEntity.ChoiceReason += "|" + traOrderDetailModel.ChoiceReason;
                }
            }


            orderEntity = _traOrderDal.Insert(orderEntity);


            if (newOrder.OrderStatus == null)
            {
                newOrder.OrderStatus = new TraOrderStatusModel();
            }
            newOrder.OrderStatus.OrderId = orderEntity.OrderId;
            if (newOrder.Order.CreateOid != "sys" && (newOrder.OrderStatus.ProccessStatus & 64) != 64)
            {
                newOrder.OrderStatus.ProccessStatus = newOrder.OrderStatus.ProccessStatus + 64;
            }
            TraOrderStatusEntity orderStatusEntity = Mapper.Map <TraOrderStatusModel, TraOrderStatusEntity>(newOrder.OrderStatus);

            orderStatusEntity = _traOrderStatusDal.Insert(orderStatusEntity);

            foreach (var detail in newOrder.OrderDetailList)
            {
                detail.OrderId   = orderEntity.OrderId;
                detail.TicketNum = detail.PassengerList.Count;



                detail.TotalPrice = detail.PassengerList.Sum(n => (n.FacePrice ?? 0)) +
                                    detail.PassengerList.Sum(n => (n.ServiceFee ?? 0));//乘客面价+乘客服务费

                detail.ServiceFee = (detail.PassengerList?[0].ServiceFee ?? 0);

                var childPerson = detail.PassengerList.Find(n => n.AgeType == AgeTypeEnum.E); //儿童
                var person      = detail.PassengerList.Find(n => n.AgeType == AgeTypeEnum.C); //成人

                detail.FacePrice         = (person?.FacePrice ?? 0);
                detail.TrainChdSalePrice = (childPerson?.FacePrice ?? 0);
                detail.PlaceGrade        = detail.PassengerList?[0].PlaceGrade;

                detail.PlaceType       = GetPlaceType(detail.PlaceGrade);
                detail.TrainNoRemark   = string.IsNullOrEmpty(detail.TrainNoRemark) ? "" : detail.TrainNoRemark;
                detail.TrainNoStatus   = string.IsNullOrEmpty(detail.TrainNoStatus) ? "" : detail.TrainNoStatus;
                detail.OnTrainTimeTemp = detail.StartTime;
                detail.OnTrainTime     = detail.StartTime;

                TraAddressEntity startAddressEntity =
                    _traAddressDal.Query <TraAddressEntity>(n => n.Addr_Name == detail.StartName).FirstOrDefault();
                if (startAddressEntity == null)
                {
                    startAddressEntity           = new TraAddressEntity();
                    startAddressEntity.Addr_Name = detail.StartName;
                    startAddressEntity.Addr_Type = 0;
                    startAddressEntity.Addr_S    = detail.StartCode;
                    startAddressEntity           = _traAddressDal.Insert <TraAddressEntity>(startAddressEntity);
                }
                detail.StartNameId = startAddressEntity.Aid;


                TraAddressEntity endAddressEntity =
                    _traAddressDal.Query <TraAddressEntity>(n => n.Addr_Name == detail.EndName)
                    .FirstOrDefault();
                if (endAddressEntity == null)
                {
                    endAddressEntity           = new TraAddressEntity();
                    endAddressEntity.Addr_Name = detail.EndName;
                    endAddressEntity.Addr_Type = 0;
                    endAddressEntity.Addr_S    = detail.EndCode;
                    endAddressEntity           = _traAddressDal.Insert <TraAddressEntity>(endAddressEntity);
                }

                detail.EndNameId = endAddressEntity.Aid;


                TraOrderDetailEntity traOrderDetailEntity = Mapper.Map <TraOrderDetailModel, TraOrderDetailEntity>(detail);
                traOrderDetailEntity = _traOrderDetailDal.Insert(traOrderDetailEntity);
                foreach (var p in detail.PassengerList)
                {
                    p.OdId = traOrderDetailEntity.OdId;
                    TraPassengerEntity traPassengerEntity = Mapper.Map <TraPassengerModel, TraPassengerEntity>(p);
                    traPassengerEntity.Name = traPassengerEntity.Name.Replace("/", " ");
                    _traPassengerDal.Insert(traPassengerEntity);
                }
            }
            string logContent = newOrder.Log?.LogContent;

            if (string.IsNullOrEmpty(logContent))
            {
                logContent =
                    $"{(newOrder.Order.IsOnline == "T" ? "线上" : "线下")}添加火车订单";
            }
            _traOrderLogDal.Insert <TraOrderLogEntity>(new TraOrderLogEntity()
            {
                OrderId    = orderEntity.OrderId,
                CreateOid  = orderEntity.CreateOid,
                CreateTime = DateTime.Now,
                LogType    = "OI",
                LogContent = logContent
            });

            return(orderEntity.OrderId);
        }
        /// <summary>
        ///  获取抢票异步成功通知,并做处理
        ///  则自动生成火车订单,通知抢票发起者
        /// </summary>
        public void GetGrabTicketSuccessNotice(GrabTicketSuccessedDataAsyncResponseModel successedData)
        {
            int orderid = Convert.ToInt32(successedData.orderid);

            #region 1.更新抢票信息状态

            TraGrabTicketEntity traGrabTicketEntity =
                _traGrabTicketDal.Query <TraGrabTicketEntity>(n => n.OrderId == orderid).FirstOrDefault();
            if (traGrabTicketEntity == null)
            {
                throw new Exception("未找到对应的系统订单");
            }
            traGrabTicketEntity.GrabStatus = TrainGrabStatusEnum.S.ToString();
            _traGrabTicketDal.Update(traGrabTicketEntity, new string[] { "GrabStatus" });

            #endregion


            #region 2.1 根据订单获取预设订单信息

            TraOrderEntity traOrderEntity = _traOrderDal.Find <TraOrderEntity>(orderid);
            if (traOrderEntity == null)
            {
                throw new Exception("订单信息异常");
            }
            if (traOrderEntity.OrderType == 0)
            {
                throw new Exception("该订单已经回调");
            }

            TraOrderDetailEntity traOrderDetailEntity =
                _traOrderDetailDal.Query <TraOrderDetailEntity>(n => n.OrderId == traOrderEntity.OrderId)
                .FirstOrDefault();
            if (traOrderDetailEntity == null)
            {
                throw new Exception("订单信息异常");
            }

            TraOrderStatusEntity traOrderStatusEntity =
                _traOrderStatusDal.Query <TraOrderStatusEntity>(n => n.OrderId == traOrderEntity.OrderId)
                .FirstOrDefault();
            if (traOrderStatusEntity == null)
            {
                throw new Exception("订单信息异常");
            }

            List <TraPassengerEntity> traPassengerEntities =
                _traPassengerDal.Query <TraPassengerEntity>(n => n.OdId == traOrderDetailEntity.OdId).ToList();
            if (traPassengerEntities.Count == 0)
            {
                throw new Exception("订单信息异常");
            }

            #endregion

            #region 2.2根据返回结果,更新预设订单信息

            traOrderEntity.TransactionId = successedData.transactionid;
            traOrderEntity.OrderType     = 0;
            if (successedData.refund_online == "1")
            {
                traOrderEntity.IsRefundBy12306 = false;
            }
            else
            {
                traOrderEntity.IsRefundBy12306 = true;
            }

            traOrderDetailEntity.OrderId12306 = successedData.ordernumber;
            traOrderDetailEntity.StartName    = successedData.from_station_name;
            traOrderDetailEntity.StartCode    = successedData.from_station_code;
            traOrderDetailEntity.StartTime    = Convert.ToDateTime(successedData.start_time);
            TraAddressEntity startAddressEntity =
                _traAddressDal.Query <TraAddressEntity>(n => n.Addr_Name == traOrderDetailEntity.StartName)
                .FirstOrDefault();
            if (startAddressEntity != null)
            {
                traOrderDetailEntity.StartNameId = startAddressEntity.Aid;
            }

            traOrderDetailEntity.EndName = successedData.to_station_name;
            traOrderDetailEntity.EndCode = successedData.to_station_code;
            traOrderDetailEntity.EndTime = Convert.ToDateTime(successedData.arrive_time);
            TraAddressEntity endAddressEntity =
                _traAddressDal.Query <TraAddressEntity>(n => n.Addr_Name == traOrderDetailEntity.EndName)
                .FirstOrDefault();
            if (endAddressEntity != null)
            {
                traOrderDetailEntity.EndNameId = endAddressEntity.Aid;
            }

            traOrderDetailEntity.TrainNo    = successedData.checi;
            traOrderDetailEntity.FacePrice  = Convert.ToDecimal(successedData.orderamount) / 2;
            traOrderDetailEntity.TotalPrice = traOrderDetailEntity.FacePrice + traOrderDetailEntity.ServiceFee;



            foreach (TraPassengerEntity traPassengerEntity in traPassengerEntities)
            {
                GrabTicketSuccessedPassengerAsyncResponseModel grabTicketPassenger = successedData.passengers.Find(
                    n => n.passengersename == traPassengerEntity.Name && n.passportseno == traPassengerEntity.CardNo);
                traPassengerEntity.FacePrice = Convert.ToDecimal(grabTicketPassenger.price);
                List <string> cxinList = grabTicketPassenger.cxin.Split(',').ToList();
                if (cxinList.Count == 2)
                {
                    traPassengerEntity.PlaceCar    = cxinList[0];
                    traPassengerEntity.PlaceSeatNo = cxinList[1];
                }
                traPassengerEntity.PlaceGrade = grabTicketPassenger.zwname;
                traPassengerEntity.TicketNo   = grabTicketPassenger.ticket_no;

                _traPassengerDal.Update(traPassengerEntity,
                                        new string[] { "FacePrice", "PlaceCar", "PlaceSeatNo", "PlaceGrade", "TicketNo" });
            }

            traOrderEntity.TotalMoney = traPassengerEntities.Sum(n => (n.ServiceFee ?? 0) + (n.FacePrice ?? 0));
            traOrderEntity.PayAmount  = traOrderEntity.TotalMoney;

            traOrderStatusEntity.IsBuy           = 1;
            traOrderStatusEntity.ProccessStatus  = traOrderStatusEntity.ProccessStatus + 1 + 8 + 64; //已付款,已预定
            traOrderStatusEntity.RealPayOid      = "sys";
            traOrderStatusEntity.RealPayDatetime = DateTime.Now;

            //更新订单
            _traOrderDal.Update(traOrderEntity,
                                new string[] { "TransactionId", "IsRefundBy12306", "TotalMoney", "PayAmount", "OrderType" });
            //更新行程
            _traOrderDetailDal.Update(traOrderDetailEntity,
                                      new string[]
            {
                "OrderId12306", "StartName", "StartCode", "StartTime", "EndName", "EndCode", "EndTime",
                "TrainNo",
                "FacePrice", "TotalPrice"
            });
            //更新订单状态
            _traOrderStatusDal.Update(traOrderStatusEntity,
                                      new[] { "IsBuy", "ProccessStatus", "RealPayOid", "RealPayDatetime" });

            #endregion

            #region 2.3 设置付款信息,并记录日志

            PaySupplierEvent?.Invoke(this, new CommonEventArgs <AccountDetailModel>(new AccountDetailModel()
            {
                Aid              = 81,
                Amount           = traPassengerEntities.Sum(n => (n.FacePrice ?? 0)) + 5, //抢票订单+5块
                Detailtype       = "火车票付票款",
                Oid              = "sys",
                CreateTime       = DateTime.Now,
                Source           = "火车票付票款",
                OrderId          = traOrderEntity.OrderId,
                OrderType        = "Tra",
                Provider         = 0,
                CollectionRemark = "",
                EstimateId       = 0
            }));

            _traOrderLogDal.Insert(new TraOrderLogEntity()
            {
                OrderId    = traOrderEntity.OrderId,
                CreateOid  = "sys",
                CreateTime = DateTime.Now,
                LogContent = "抢票出票回调,自动勾已预定、已付票款、已采购",
                LogType    = "修改"
            });

            #endregion

            #region 2.3插入Tra_InterFaceOrder表,以便退改签流程

            TraInterFaceOrderEntity traInterFaceOrderEntity =
                _traInterFaceOrderDal.Insert <TraInterFaceOrderEntity>(new TraInterFaceOrderEntity()
            {
                OrderId       = traOrderEntity.OrderId.ToString(),
                CreateTime    = DateTime.Now,
                Status        = (int)OrderTypeEnum.TicketSuccess,
                Transactionid = traOrderEntity.TransactionId,
                OrderNumber   = traOrderDetailEntity.OrderId12306
            });

            _traOrderOperateDal.Insert(new TraOrderOperateEntity()
            {
                InterfaceId        = traInterFaceOrderEntity.InterfaceId,
                AfterOperateStatus = (int)OrderTypeEnum.TicketSuccess,
                BeforOperateStatus = 0,
                OperateTime        = DateTime.Now
            });

            #endregion
        }