Example #1
0
        public void GetTradeInfo()
        {
            string appKey   = "3259943";
            string memberId = "b2b-2926677533915d6";
            long   orderId  = 300773518252256809;

            var result = tradeManager.GetTradeInfor(appKey, memberId, orderId);

            Assert.NotNull(result);
        }
        /// <summary>
        /// Background job will execute this method for process the event when order pay.
        /// </summary>
        /// <param name="args">Arguments.</param>
        public override void Execute(MessageDto args)
        {
            long   msgId       = args.Id;
            string memberId    = args.UserInfo;
            string serviceCode = "ALIBABA_ORDER_PAY";
            long   orderId     = long.Parse(args.Data.OrderId);

            var msgEntity = alibabaMessageRepository.Get(msgId);

            msgEntity.Status = (int)CallbackMessageStatus.Inprocess;
            alibabaMessageRepository.Update(msgEntity);

            try
            {
                DataSyncService dataSyncService;
                dataSyncService = dataSyncServiceRepository.GetDataServiceInforByCodeAndMemberId(serviceCode, memberId).Result;

                // Step 1: get the order from alibaba.
                AlibabaOpenplatformTradeModelTradeInfo tradeInfo;

                // Step 2: Save trade info to callback message business data field.
                if (msgEntity.Data == null)
                {
                    tradeInfo       = tradeManager.GetTradeInfor(dataSyncService.AccessTokenInfo.App_Key, memberId, orderId);
                    msgEntity.Data  = JsonConvert.SerializeObject(tradeInfo);           // Save as JSON
                    msgEntity.ErpId = tradeInfo.getBaseInfo().getIdOfStr();             // Save order id to ERP#
                    alibabaMessageRepository.Update(msgEntity);
                    Console.WriteLine("Got order from alibaba.");
                    Console.WriteLine(msgEntity.Data);
                }
                else
                {
                    // TODO: 这个转换可能不行
                    tradeInfo = JsonConvert.DeserializeObject <AlibabaOpenplatformTradeModelTradeInfo>(msgEntity.Data);
                }

                // Step 3: Check the product filter.
                bool isMatched = false;

                // Step 3.1: Get product filters
                // 没有详细去研究为什么下面这种写法会报错,只能用后面的写法先代替了。
                //var filters = alibabaProductCategoryRepository.GetAll()
                //.Where(t => t.IsActive)
                //.Where(t => t.TenantId == dataSyncService.TenantId)
                //.ToList();
                var filters = alibabaProductCategoryRepository.GetAllList(t => t.IsActive && t.TenantId == dataSyncService.TenantId);

                if (filters == null || filters.Count == 0)
                {
                    Console.WriteLine("Tenant's product category is empty.");
                    isMatched = true;   // None filter mean all data will be send to salesforce.
                }
                else
                {
                    // Get sku in query as List<string>
                    var sku_query = from f in filters
                                    select f.Code
                    ;
                    var sku = sku_query.ToList();

                    foreach (var prd in tradeInfo.getProductItems())
                    {
                        // the category# of product in this order was matched.
                        if (sku.Contains(prd.getProductCargoNumber()))
                        {
                            isMatched = true;
                            break;
                        }
                    }
                }

                // Step 4: If matched then send it to salesforce.
                if (isMatched)
                {
                    try
                    {
                        string salesforceUri = dataSyncService.GetData <string>("SalesforceUri");
                        if (string.IsNullOrEmpty(salesforceUri))
                        {
                            throw new ArgumentException("Data sync service config error. 'SalesforceUri' field not found.", "SalesforceUri");
                        }

                        // Step 5: Generate the JSON that will post to salesforce.
                        OrderDto order     = new OrderDto(tradeInfo);
                        string   orderJson = JsonConvert.SerializeObject(order);
                        Console.WriteLine("Generate salesforce order:");
                        Console.WriteLine(orderJson);

                        string resp = orderManager.Create(salesforceUri, order);    // Call API and cretae order in salesforce.

                        // 2019-06-03 Salesforce change it's interface.
                        // Response change to JSON. such as: { "status" : "200", "message" : "success" }
                        if (false == string.IsNullOrEmpty(resp))
                        {
                            JObject responseJson = JObject.Parse(resp);
                            var     status       = responseJson["status"].ToString();
                            var     message      = responseJson["message"].ToString();

                            Console.WriteLine("Salesforce response: " + resp);

                            // Save the http status code to entitie's code field.
                            msgEntity.Code = status;

                            if (status == "200")                                        // return success
                            {
                                msgEntity.Status  = (int)CallbackMessageStatus.Success; // Set status as success
                                msgEntity.Comment = orderJson;
                            }
                            else if (status == "201")
                            {
                                msgEntity.Status  = (int)CallbackMessageStatus.Reduplicative; // Set status as reduplicative.
                                msgEntity.Comment = orderJson;
                            }
                            else                                                                             // return failed
                            {
                                msgEntity.Comment = "Salesforce Interface: " + message + "\r\n" + orderJson; // Write response for error detail info.
                                msgEntity.Status  = (int)CallbackMessageStatus.InterfaceThrowError;          // Salesforce throw error
                            }
                        }
                        else
                        {
                            // Nothing return from salesforce.
                            msgEntity.Comment = "HTTP response body is none.";
                            msgEntity.Status  = (int)CallbackMessageStatus.InterfaceThrowError;
                        }
                    }
                    catch (Exception err)
                    {
                        msgEntity.Status = (int)CallbackMessageStatus.Failed;      // Set status as failed.
                        msgEntity.RetryCount++;

                        // Get error message
                        Console.WriteLine(err.ToString());
                        this.Logger.Error(err.Message, err);
                        msgEntity.Comment = err.ToString();
                    }
                }
                else
                {
                    Console.WriteLine("Ignored");
                    msgEntity.Comment = "None product were matched, so this order not need send to salesforce.";
                    msgEntity.Status  = (int)CallbackMessageStatus.Ignored;
                }
            }
            catch (Exception ex)
            {
                this.Logger.Error(ex.Message, ex);
                Console.WriteLine(ex.ToString());
                msgEntity.Status  = (int)CallbackMessageStatus.Failed;
                msgEntity.Comment = ex.ToString();
            }
            // Update message status as last.
            alibabaMessageRepository.Update(msgEntity);
        }