public static IList <ReceiveFormItemEntity> GetItems(int formNo, string hospitalID)
        {
            var sql = @"
select a.*
from receive_form_items a inner join receive_form b on a.receive_id = b.id
where b.order_form_no =@p_form_no and b.hospital_id=@p_hospital_id";

            var db  = DatabaseFactory.CreateDatabase();
            var cmd = db.GetSqlStringCommand(sql);

            db.AddInParameter(cmd, "p_form_no", DbType.Int32, formNo);
            db.AddInParameter(cmd, "p_hospital_id", DbType.String, hospitalID);

            var list = new List <ReceiveFormItemEntity>();

            using (var reader = db.ExecuteReader(cmd))
            {
                while (reader.Read())
                {
                    var entity = new ReceiveFormItemEntity();
                    entity.Init(reader);

                    list.Add(entity);
                }
            }

            return(list);
        }
        public static string PartPass(ReceiveFormEntity form, IList <string> barcodes, string userId)
        {
            var serialId    = form.SerialId;
            var passedCount = SumPassed(form.Id);

            if (form.ReceivedCount == passedCount)
            {
                return(serialId);
            }

            if (form.ReceivedCount == passedCount + barcodes.Count)
            {
                Pass(form);
                return(serialId);
            }

            var goodsSerial = GoodsSerialRepository.Get(form.SerialId);

            var db = DatabaseFactory.CreateDatabase();

            using (var conn = db.CreateConnection())
            {
                conn.Open();
                using (var trans = conn.BeginTransaction())
                {
                    try
                    {
                        var formItem = new ReceiveFormItemEntity
                        {
                            Id            = Guid.NewGuid().ToString(),
                            ReceiveId     = form.Id,
                            ReceivedCount = barcodes.Count,
                            ConfirmedId   = userId,
                            ConfirmedTime = DateTime.Now
                        };

                        formItem.SerialId = CreateGoodsSerial(goodsSerial, formItem, barcodes, db, trans);
                        CreateItem(formItem, db, trans);

                        //TODO: need to add inspection form
                        CreateIncomingForm(form, formItem, db, trans);

                        trans.Commit();
                        serialId = formItem.SerialId;
                    }
                    catch
                    {
                        trans.Rollback();
                        throw;
                    }
                }
            }
            return(serialId);
        }
        private static string CreateGoodsSerial(GoodsSerialEntity parent, ReceiveFormItemEntity formItem, IList <string> barcodes, Database db, DbTransaction trans)
        {
            var goodsSerial = GoodsSerialRepository.CreateSub(parent, barcodes, formItem.ConfirmedId, db, trans);

            GoodsSerialFormRepository.Create(new GoodsSerialFormEntity
            {
                SerialId    = goodsSerial.Id,
                FormId      = formItem.Id,
                FormKind    = FormKind.ReceiveItem,
                CreatedId   = formItem.ConfirmedId,
                CreatedTime = formItem.ConfirmedTime,
            }, db, trans);

            return(goodsSerial.Id);
        }
        private static void CreateItem(ReceiveFormItemEntity item, Database db, DbTransaction trans)
        {
            var sql = @"insert into receive_form_items(
id,receive_id,serial_id,received_count,confirmed_id,confirmed_time
)
values(
@p_id,@p_receive_id,@p_serial_id,@p_received_count,@p_confirmed_id,@p_confirmed_time
)";

            var cmd = db.GetSqlStringCommand(sql);

            db.AddInParameter(cmd, "p_id", DbType.String, item.Id);
            db.AddInParameter(cmd, "p_receive_id", DbType.String, item.ReceiveId);
            db.AddInParameter(cmd, "p_serial_id", DbType.String, item.SerialId);
            db.AddInParameter(cmd, "p_received_count", DbType.Int32, item.ReceivedCount);
            db.AddInParameter(cmd, "p_confirmed_id", DbType.String, item.ConfirmedId);
            db.AddInParameter(cmd, "p_confirmed_time", DbType.DateTime, item.ConfirmedTime);

            db.ExecuteNonQuery(cmd, trans);
        }
        private static string CreateIncomingForm(ReceiveFormEntity form, ReceiveFormItemEntity formItem, Database db, DbTransaction trans)
        {
            var incoming = new IncomingFormEntity
            {
                OrderId       = form.OrderId,
                OrderFormNo   = form.OrderFormNo,
                OrderDetailId = form.OrderDetailId,
                ApplyUnitId   = form.ApplyUnitId,
                SerialId      = formItem.SerialId,
                ProductId     = form.ProductId,
                IncomingCount = formItem.ReceivedCount,
                HospitalId    = form.HospitalId,
                VendorId      = form.VendorId,
                IsConfirmed   = false,
                CreatedId     = formItem.ConfirmedId,
                CreatedTime   = formItem.ConfirmedTime
            };

            IncomingFormRepository.Create(incoming, db, trans);

            return(incoming.Id);
        }
        public static string PartPass(ReceiveFormEntity form, IList <string> barcodes, string userId, Database db, DbTransaction trans)
        {
            var serialId    = form.SerialId;
            var passedCount = SumPassed(form.Id);

            if (form.ReceivedCount == passedCount)
            {
                return(serialId);
            }

            if (form.ReceivedCount == passedCount + barcodes.Count)
            {
                Pass(form);
                return(serialId);
            }

            var goodsSerial = GoodsSerialRepository.Get(form.SerialId);

            var formItem = new ReceiveFormItemEntity
            {
                Id            = Guid.NewGuid().ToString(),
                ReceiveId     = form.Id,
                ReceivedCount = barcodes.Count,
                ConfirmedId   = userId,
                ConfirmedTime = DateTime.Now
            };

            formItem.SerialId = CreateGoodsSerial(goodsSerial, formItem, barcodes, db, trans);
            CreateItem(formItem, db, trans);

            //TODO: need to add inspection form
            CreateIncomingForm(form, formItem, db, trans);

            serialId = formItem.SerialId;
            return(serialId);
        }