public OrderDetailDTO GetById(Guid merchantAccountId, Guid orderId)
        {
            var order = new OrderDAC().GetById(orderId);

            var merchantAccount = new MerchantAccountDAC().GetById(merchantAccountId);

            var pos = new POSDAC().GetById(merchantAccount.POSId.Value);

            if (order == null)
            {
                throw new CommonException(10000, Resources.订单不存在);
            }

            if (order.MerchantAccountId != merchantAccountId)
            {
                throw new CommonException(10000, Resources.只能查看自己的订单);
            }

            var coin  = new CryptocurrencyDAC().GetById(order.CryptoId);
            var er    = order.ExchangeRate;
            var cer   = GetExchangeRate(merchantAccount.CountryId, order.FiatCurrency, coin);
            var iRate = ((cer - er) / er) * 100;

            var result = new OrderDetailDTO
            {
                Id                  = order.Id,
                OrderNo             = order.OrderNo,
                OrderStatus         = order.Status,
                Timestamp           = order.Timestamp.ToUnixTime(),
                CryptoStatus        = coin.Status,
                CryptoEnable        = coin.Enable,
                CryptoCode          = coin.Code,
                CryptoAmount        = order.CryptoAmount.ToString(coin.DecimalPlace),
                FiatCurrency        = order.FiatCurrency,
                FiatAmount          = order.FiatAmount.ToString(2),
                Markup              = order.Markup,
                ActualFiatAmount    = order.ActualFiatAmount.ToString(2),
                TransactionFee      = order.TransactionFee.ToString(coin.DecimalPlace),
                ActualCryptoAmount  = order.ActualCryptoAmount.ToString(coin.DecimalPlace),
                UserAccount         = order.UserAccountId.HasValue ? GetUserMastMaskedCellphone(order.UserAccountId.Value) : string.Empty,
                SN                  = pos.Sn,
                ExchangeRate        = er.ToString(4),
                CurrentExchangeRate = cer.ToString(4),
                IncreaseRate        = iRate > 0 ? $"+{iRate.ToString(2)}" : iRate.ToString(2)
            };

            if (result.OrderStatus == OrderStatus.Refunded)
            {
                var refund = new RefundDAC().GetByOrderId(result.Id);
                if (refund?.Timestamp != null)
                {
                    result.RefundTimestamp = refund.Timestamp.ToUnixTime();
                }
            }
            return(result);
        }
        public PrintOrderInfoDTO PrintOrder(Guid merchantAccountId, string orderNo)
        {
            var order = new OrderDAC().GetByOrderNo(orderNo);

            var merchantAccount = new MerchantAccountDAC().GetById(merchantAccountId);

            var pos = new POSDAC().GetById(merchantAccount.POSId.Value);

            if (order == null)
            {
                throw new CommonException(10000, Resources.订单不存在);
            }

            if (order.MerchantAccountId != merchantAccountId)
            {
                throw new CommonException(10000, Resources.只能查看自己的订单);
            }

            var coin   = new CryptocurrencyDAC().GetById(order.CryptoId);
            var result = new PrintOrderInfoDTO
            {
                Id                 = order.Id,
                OrderNo            = order.OrderNo,
                OrderStatus        = order.Status,
                Timestamp          = order.Timestamp.ToUnixTime(),
                CryptoCode         = coin.Code,
                CryptoAmount       = order.CryptoAmount.ToString(coin.DecimalPlace),
                FiatCurrency       = order.FiatCurrency,
                FiatAmount         = order.FiatAmount.ToString(2),
                Markup             = order.Markup,
                ActualFiatAmount   = order.ActualFiatAmount.ToString(2),
                ExchangeRate       = $"1 {coin.Code} = {order.ExchangeRate.ToString(4)} {order.FiatCurrency}",
                TransactionFee     = order.TransactionFee.ToString(coin.DecimalPlace),
                ActualCryptoAmount = order.ActualCryptoAmount.ToString(coin.DecimalPlace),
                UserAccount        = order.UserAccountId.HasValue ? GetUserMastMaskedCellphone(order.UserAccountId.Value) : string.Empty,
                SN                 = pos.Sn,
                AvatarId           = merchantAccount.Photo,
                MerchantName       = merchantAccount.MerchantName,
                CryptoImage        = coin.IconURL
            };

            if (result.OrderStatus == OrderStatus.Refunded)
            {
                var refund = new RefundDAC().GetByOrderId(result.Id);
                if (refund?.Timestamp != null)
                {
                    result.RefundTimestamp = refund.Timestamp.ToUnixTime();
                }
            }
            return(result);
        }