public RequestDelivery Add(RequestDelivery item)
        {
            if (item == null)
            {
                throw new ArgumentNullException(nameof(item));
            }
            item.Id = _nextId++;

            var warehouse = repository.Warehouses.Find(w => w.Id == item.WarehouseId);

            if (warehouse == null)
            {
                item.WarehouseId = 0;
            }
            else
            {
                item.Warehouse = warehouse;
            }

            var shop = repository.Shops.Find(s => s.Id == item.ShopId);

            if (shop == null)
            {
                item.ShopId = 0;
            }
            else
            {
                item.Shop = shop;
            }

            repository.RequestDeliverys.Add(item);
            return(item);
        }
예제 #2
0
        /// <summary>
        /// 配信メッセージを作成する
        /// </summary>
        /// <param name="messageObject">配信メッセージオブジェクト</param>
        /// <param name="gatewayDevice">ゲートウェイ機器</param>
        /// <returns>配信メッセージ</returns>
        private string CreateDeliveryMessageJson(RequestDelivery messageObject, DtDevice gatewayDevice)
        {
            string deliveryMessage = null;

            try
            {
                Assert.IfNull(messageObject);

                deliveryMessage = JsonConvert.SerializeObject(messageObject);

                _logger.Debug("message: {0}", new object[] { deliveryMessage });
            }
            catch (Exception e)
            {
                // Sq1.4
                _logger.Error(e, nameof(Resources.CO_DLV_DLV_012), new object[] { gatewayDevice.EdgeId, gatewayDevice.EquipmentUid, e.Message });
            }

            return(deliveryMessage);
        }
        public bool Update(RequestDelivery item)
        {
            if (item == null)
            {
                throw new ArgumentNullException("item");
            }
            int index = repository.RequestDeliverys.FindIndex(r => r.Id == item.Id);

            if (index == -1)
            {
                return(false);
            }
            repository.RequestDeliverys.RemoveAt(index);

            var warehouse = repository.Warehouses.Find(w => w.Id == item.WarehouseId);

            if (warehouse == null)
            {
                item.WarehouseId = 0;
            }
            else
            {
                item.Warehouse = warehouse;
            }

            var shop = repository.Shops.Find(s => s.Id == item.ShopId);

            if (shop == null)
            {
                item.ShopId = 0;
            }
            else
            {
                item.Shop = shop;
            }

            repository.RequestDeliverys.Add(item);

            return(true);
        }
        public bool Update(int id, RequestDeliveryInputDTO inputEntity)
        {
            using IDbConnection connection = new SqlConnection(connectionString);
            connection.Open();
            using IDbTransaction transaction = connection.BeginTransaction();

            try {
                var             updateQuery = "Update RequestDeliverys SET Number = @Number, WarehouseId = @WarehouseId, ShopId = @ShopId WHERE Id = @Id";
                RequestDelivery entity      = mapper.Map <RequestDelivery>(inputEntity);
                entity.Id = id;
                var result = connection.Execute(updateQuery, entity, transaction) == 1;

                var deleteDeliveryItems = "DELETE FROM DeliveryItems WHERE RequestDeliveryId = @Id";
                connection.Execute(deleteDeliveryItems, entity, transaction);
                AddDeliveryItems(connection, transaction, id, inputEntity.ProductIds);

                transaction.Commit();

                return(result);
            } catch {
                transaction.Rollback();
                throw;
            }
        }
예제 #5
0
        /// <summary>
        /// 配信処理開始
        /// </summary>
        public void StartDelivery()
        {
            try
            {
                _logger.Enter();

                // Sq1.1: 開始可能な配信グループを取得する(現在時刻)
                // 配信結果・配信グループステータス・配信ファイルのデータを持って取得
                var groups = ReadStartableDtDeliveryGroupWrapper();

                foreach (var group in groups)
                {
                    try
                    {
                        // Sq1.2: 開始可能な配信グループの配信結果ステータスを更新する(started)
                        var updatedGroup = UpdateDtDeliveryGroupStatusStartedWrapper(group.Sid);
                        if (updatedGroup == null)
                        {
                            continue;
                        }

                        // Sq1.3: 配信グループに属し、オンラインとなっているゲートウェイ機器を取得する
                        var onlineGatewayDevices = ReadDtDeviceOnlineGatewayWrapper(group);
                        if (!onlineGatewayDevices.Any())
                        {
                            continue;
                        }

                        // 配信グループデータを基に、親子エンティティのデータをもった配信グループを取得する
                        var includedGroup = _deliveryGroupRepository.ReadDeliveryIncludedDtDeliveryGroup(group.Sid);
                        if (includedGroup == null)
                        {
                            continue;
                        }

                        // メッセージオブジェクトの生成(配信対象以外)
                        var messageObject = RequestDelivery.CreateDeliveryMessageObject(includedGroup);

                        foreach (var gatewayDevice in onlineGatewayDevices)
                        {
                            try
                            {
                                // 配信対象の設定
                                messageObject.Targets = includedGroup.DtDeliveryResult
                                                        ?.Where(x => x.GwDeviceSid == gatewayDevice.Sid)
                                                        .Select(x => new RequestDelivery.Target()
                                {
                                    DeliveryResultSID = x.Sid.ToString(), EquipmentUID = x.DtDevice1.EquipmentUid
                                })
                                                        .ToArray();

                                // Sq1.4: 配信メッセージを生成する
                                var deliveryMessage = CreateDeliveryMessageJson(messageObject, gatewayDevice);
                                if (deliveryMessage == null)
                                {
                                    continue;
                                }

                                // メッセージ送信
                                if (!SendMessageAsync(gatewayDevice, deliveryMessage).Result)
                                {
                                    // 送信失敗時は次のゲートウェイ機器の処理に移る
                                    continue;
                                }

                                // Sq1.7:ゲートウェイ機器を持つ配信機器の配信結果ステータスを更新する(messagesent)
                                var installResults = CreateDtInstallResultStatusSentWrapper(includedGroup, gatewayDevice);
                                if (!installResults.Any())
                                {
                                    continue;
                                }

                                // メッセージ送信処理の正常終了をログ出力
                                _logger.Info(nameof(Resources.CO_DLV_DLV_017), new object[] { gatewayDevice.EdgeId, gatewayDevice.EquipmentUid });
                            }
                            catch (Exception e)
                            {
                                // その他箇所でエラー
                                _logger.Error(e, nameof(Resources.CO_DLV_DLV_003), new object[] { gatewayDevice.EdgeId, gatewayDevice.EquipmentUid, e.Message });
                            }
                        }
                    }
                    catch (Exception e)
                    {
                        // その他箇所でエラー
                        _logger.Error(e, nameof(Resources.CO_DLV_DLV_002), new object[] { group.Sid, e.Message });
                    }
                }
            }
            finally
            {
                _logger.Leave();
            }
        }