/*药房登录: 向数据库提交select查询,若成功则并更新LastLoginDate域,将结果转写为Entity*/
        public PharmacyInfoEntity Login(string pharmacyID, string password) {

            /*数据库访问实例*/
            DrPEDatabaseEntities DEntities = new DrPEDatabaseEntities();

            /*查询(pharmacyID,password)对是否匹配*/
            Pharmacy pharmacy = (from p in DEntities.Pharmacies
                                 where ((p.PharmacyID == pharmacyID) && (p.Password == password))
                                 select p).FirstOrDefault();

            /*将结果转写为Entity,仅转写必要登录信息*/
            PharmacyInfoEntity pharmacyInfoEntity = null;
            if (pharmacy != null) {
                pharmacyInfoEntity = new PharmacyInfoEntity() {
                    PharmacyID      = pharmacyID,
                    Name            = pharmacy.Name,
                    LastLoginDate   = pharmacy.LastLoginDate
                };

                /*更新该Pharmacy的LastLoginDate域*/
                pharmacy.LastLoginDate = DateTime.Now;
                DEntities.SaveChanges();
            }

            return pharmacyInfoEntity;
        }
        /*进行就医消去挂号 FinishAppointment(Guid gGuid)*/
        public string FinishAppointment(Guid gGuid) {
            /*数据库访问实例*/
            DrPEDatabaseEntities DEntities = new DrPEDatabaseEntities();

            /*查询符合要求的Appointment, 未做时间判断*/
            Appointment appointment = (from ap in DEntities.Appointments
                                       where (ap.AppointmentID == gGuid)
                                       select ap).FirstOrDefault();

            /*若该预约不存在*/
            if (appointment == null) {
                return "No Such Appointment! @Data";
            }
            else {
                appointment.Status = "[Finished]";
            }

            /*完成消号过程*/
            try {
                DEntities.SaveChanges();
            }
            catch {
                return "Saving Denied! @Data";
            }

            return null;
        }
        public string SetDailySchedule(string doctorID, DayOfWeek dayOfWeek, int am) {
            string setting = null;

            switch (dayOfWeek) {
                case DayOfWeek.Sunday:
                    setting = "Sun";
                    break;
                case DayOfWeek.Monday:
                    setting = "Mon";
                    break;
                case DayOfWeek.Tuesday:
                    setting = "Tue";
                    break;
                case DayOfWeek.Wednesday:
                    setting = "Wed";
                    break;
                case DayOfWeek.Thursday:
                    setting = "Thu";
                    break;
                case DayOfWeek.Friday:
                    setting = "Fri";
                    break;
                case DayOfWeek.Saturday:
                    setting = "Sat";
                    break;
                default:
                    return "Invalid Weekday! @Data";
            }

            if (am > 0) {
                setting += ":A";
            }
            else {
                setting += ":P";
            }

            DrPEDatabaseEntities DEntities = new DrPEDatabaseEntities();

            Doctor doctor = (from d in DEntities.Doctors
                             where d.DoctorID == doctorID
                             select d).FirstOrDefault();
            if (doctor == null) {
                return "Invalid DoctorID!";
            }

            Schedule schedule = (from s in DEntities.Schedules
                                 where s.DoctorID == doctorID
                                 select s).FirstOrDefault();

            if (schedule == null) {
                schedule = new Schedule();
                schedule.DoctorID = doctor.DoctorID;
                schedule.Weekday = setting;
                schedule.LastCheck = DateTime.Now;
                DEntities.Schedules.AddObject(schedule);
            }
            else {
                schedule.Weekday = setting;
                schedule.LastCheck = DateTime.Now;
            }

            try {
                DEntities.SaveChanges();
            }
            catch {
                return "Set Daily Schedule Failed! @Data";
            }

            return null;
        }
        /*医生撰写邮件Doctor to User*/
        public string MessageCompose(string senderID, string receiverID, string text) {
            Message message = new Message();
            DrPEDatabaseEntities DEntities = new DrPEDatabaseEntities();

            Doctor doctor = (from d in DEntities.Doctors
                             where d.DoctorID == senderID
                             select d).FirstOrDefault();
            if (doctor == null) {
                return "Invalid Sender DoctorID!";
            }

            User user = (from u in DEntities.Users
                         where u.UserID == receiverID
                         select u).FirstOrDefault();
            if (user == null) {
                return "Invalid Receiver UserID!";
            }

            message.MessageID = Guid.NewGuid();
            message.Sender = doctor.DoctorID;
            message.Receiver = user.UserID;
            message.Type = "D2U";
            message.Date = DateTime.Now;
            message.Text = text;

            try {
                DEntities.Messages.AddObject(message);
                DEntities.SaveChanges();
            }
            catch {
                return "Sending Failed! @Data";
            }

            return null;
        }
        /*医生登录:校验(ID,Password)是否与数据库记录匹配*/
        public DoctorInfoEntity Login(string doctorID, string password) {
            /*数据库访问实例*/
            DrPEDatabaseEntities DEntities = new DrPEDatabaseEntities();

            /*查询(DoctorID,password)对是否匹配*/
            Doctor doctor = (from d in DEntities.Doctors
                             where ((d.DoctorID == doctorID) && (d.Password == password))
                             select d).FirstOrDefault();

            /*将结果转写为Entity,仅转写必要登录信息*/
            DoctorInfoEntity doctorInfoEntity = null;
            if (doctor != null) {
                doctorInfoEntity = new DoctorInfoEntity() {
                    DoctorID = doctor.DoctorID,
                    LastName = doctor.LastName,
                    FirstName = doctor.FirstName,
                    SectionID = doctor.SectionID,
                    Designation = doctor.Designation,
                    LastLoginDate = doctor.LastLoginDate
                };

                /*更新该User的LastLoginDate域*/
                doctor.LastLoginDate = DateTime.Now;
                DEntities.SaveChanges();
            }

            return doctorInfoEntity;
        }
        public string CreatePrescription(PrescriptionInfoEntity prescriptionInfoEntity) {
            Prescription  newPrescription = new Prescription();
            DrPEDatabaseEntities DEntities = new DrPEDatabaseEntities();

            newPrescription.Detail = "";
            for (int i = 0; i < prescriptionInfoEntity.Count; i++) {
                string sPhysicID = prescriptionInfoEntity.physicID[i];
                Physic physic = (from p in DEntities.Physics
                                 where p.PhysicID == sPhysicID
                                 select p).FirstOrDefault();
                if (physic == null) {
                    return "Invalid PhysicID! @Data";
                }
                newPrescription.Detail += prescriptionInfoEntity.physicID[i] + ":" + prescriptionInfoEntity.number[i].ToString() + ";";
            }
            newPrescription.PrescriptionID = Guid.NewGuid();

            try {
                DEntities.Prescriptions.AddObject(newPrescription);
                DEntities.SaveChanges();
            }
            catch {
                return "Invalid Case! @Data";
            }

            return String.Format("EA{0}", newPrescription.PrescriptionID.ToString());
        }
        /*修改病历*/
        public CaseInfoEntity ModifyCase(CaseInfoEntity newCase) {
            CaseHistory oldCase = new CaseHistory();
            CaseInfoEntity modifiedCase = new CaseInfoEntity();

            if (newCase.CaseID == null) {
                modifiedCase.ErrorMessage = "Case GUID Missing! @Data";
                return modifiedCase;
            }

            DrPEDatabaseEntities DEntities = new DrPEDatabaseEntities();
            oldCase = (from c in DEntities.CaseHistories
                       where ((c.CaseID == newCase.CaseID) && (c.DoctorID == newCase.DoctorID))
                       select c).FirstOrDefault();
            if (newCase == null) {
                modifiedCase.ErrorMessage = "Invalid Case GUID! @Data";
                return modifiedCase;
            }
            if (oldCase.ModifiedDate != null) {
                modifiedCase.ErrorMessage = "Modification Denied! @Data";
                return modifiedCase;
            }

            if (oldCase.ExaminationID == null) {
                oldCase.ExaminationID = newCase.ExaminationID;
            }
            if (oldCase.PrescriptionID == null) {
                oldCase.PrescriptionID = newCase.PrescriptionID;
            }

            if (oldCase.ChiefComplaint == null) {
                oldCase.ChiefComplaint = newCase.ChiefComplaint;
            }
            if (oldCase.TentativeDiagnosis == null) {
                oldCase.TentativeDiagnosis = newCase.TentativeDiagnosis;
            }
            if (oldCase.DifferentialDiagnosis == null) {
                oldCase.DifferentialDiagnosis = newCase.DifferentialDiagnosis;
            }
            if (oldCase.TreatmentPlan == null) {
                oldCase.TreatmentPlan = newCase.TreatmentPlan;
            }

            bool IsSent = oldCase.CountercheckDate.HasValue;
            if (IsSent == false) {
                oldCase.CountercheckDate = newCase.CountercheckDate;
            }

            if (newCase.IsDraft == false) {
                oldCase.ModifiedDate = DateTime.Now;
            }

            try {
                DEntities.SaveChanges();
            }
            catch {
                modifiedCase.ErrorMessage = "Invalid Case! @Data";
                return modifiedCase;
            }

            if ((IsSent == false) && (oldCase.CountercheckDate.HasValue)) {
                Doctor doctor = (from d in DEntities.Doctors
                                 where d.DoctorID == oldCase.DoctorID
                                 select d).FirstOrDefault();
                Section section = (from s in DEntities.Sections
                                   where s.SectionID == doctor.SectionID
                                   select s).FirstOrDefault();
                User user = (from u in DEntities.Users
                             where u.UserID == oldCase.UserID
                             select u).FirstOrDefault();
                DateTime lastVisit = (DateTime)oldCase.CreatedDate;
                DateTime countercheckDate = (DateTime)oldCase.CountercheckDate;
                DateTime currentTime = DateTime.Now;

                Message message = new Message();
                message.MessageID = Guid.NewGuid();
                message.Sender = section.HospitalID;
                message.Receiver = newCase.UserID;
                message.Date = countercheckDate.AddDays(-3).AddMinutes(currentTime.Minute).AddSeconds(currentTime.Second).AddMilliseconds(currentTime.Millisecond);
                message.Type = "H2U";
                message.Text = String.Format(
                    "Dear {0}.{1} {2},\nDuring your visit on {3}, Dr.{4} {5} ({6}) suggested you pay another visit on {7}. It might be a good idea to make an appointment before it's too late.\nSincerely,\nDr.PE",
                    (user.Gender.ToLower() == "female") ? "Ms" : "Mr",
                    user.LastName, user.FirstName,
                    lastVisit.ToLongDateString(),
                    doctor.LastName, doctor.FirstName,
                    section.Name,
                    countercheckDate.ToLongDateString());

                try {
                    DEntities.Messages.AddObject(message);
                    DEntities.SaveChanges();
                }
                catch {
                    modifiedCase.ErrorMessage = "Can't Create Appointment Inform! @Data";
                    return modifiedCase;
                }
            }

            modifiedCase.CaseID = oldCase.CaseID;
            modifiedCase.ExaminationID = oldCase.ExaminationID;
            modifiedCase.PrescriptionID = oldCase.PrescriptionID;
            modifiedCase.UserID = oldCase.UserID;
            modifiedCase.DoctorID = oldCase.DoctorID;
            modifiedCase.SectionID = oldCase.SectionID;
            modifiedCase.Date = oldCase.CreatedDate;
            modifiedCase.ChiefComplaint = oldCase.ChiefComplaint;
            modifiedCase.TentativeDiagnosis = oldCase.TentativeDiagnosis;
            modifiedCase.DifferentialDiagnosis = oldCase.DifferentialDiagnosis;
            modifiedCase.TreatmentPlan = oldCase.TreatmentPlan;
            modifiedCase.CountercheckDate = oldCase.CountercheckDate;

            return modifiedCase;
        }
        public string SetExceptionSchedule(string doctorID, DateTime? date) {

            DrPEDatabaseEntities DEntities = new DrPEDatabaseEntities();

            Doctor doctor = (from d in DEntities.Doctors
                             where d.DoctorID == doctorID
                             select d).FirstOrDefault();
            if (doctor == null) {
                return "Invalid DoctorID! @Data";
            }

            if (date == null) {
                return "Paremeter Date is Null! @Data";
            }

            DateTime newDate = (DateTime)date;
            DateTime dDate = newDate.Date;
            if (newDate.CompareTo(dDate.AddHours(12)) >= 0) {
                dDate = dDate.AddHours(12);
            }

            Schedule schedule = (from s in DEntities.Schedules
                                 where s.DoctorID == doctorID
                                 select s).FirstOrDefault();

            if (schedule == null) {
                schedule = new Schedule();
                schedule.DoctorID = doctor.DoctorID;
                schedule.Exception = dDate;
                schedule.LastCheck = DateTime.Now;
                DEntities.Schedules.AddObject(schedule);
            }
            else {
                if (schedule.Addition != null) {
                    if (((DateTime)schedule.Addition) == dDate) {
                        return "Conflict with Additonal Date! @Data";
                    }
                }

                schedule.Exception = dDate;
                schedule.LastCheck = DateTime.Now;
            }

            try {
                DEntities.SaveChanges();
            }
            catch {
                return "Set Exceptional Schedule Failed! @Data";
            }

            return null;
        }
        /*创建病历并针对复查日期创建message*/
        public CaseInfoEntity CreateCase(CaseInfoEntity caseInfoEntity) {

            DrPEDatabaseEntities DEntities = new DrPEDatabaseEntities();
            CaseHistory newCase = new CaseHistory();
            CaseInfoEntity addedCase = new CaseInfoEntity();

            newCase.CaseID = Guid.NewGuid();
            newCase.ExaminationID = caseInfoEntity.ExaminationID;
            newCase.PrescriptionID = caseInfoEntity.PrescriptionID;
            newCase.UserID = caseInfoEntity.UserID;
            newCase.DoctorID = caseInfoEntity.DoctorID;

            Doctor doctor = (from d in DEntities.Doctors
                             where d.DoctorID == newCase.DoctorID
                             select d).FirstOrDefault();
            if (doctor == null) {
                addedCase.ErrorMessage = "Invalid DoctorID! @Data";
                return addedCase;
            }
            else {
                newCase.SectionID = doctor.SectionID;
            }

            newCase.CreatedDate = DateTime.Now;
            if (caseInfoEntity.IsDraft == false) {
                newCase.ModifiedDate = newCase.CreatedDate;
            }

            newCase.ChiefComplaint = caseInfoEntity.ChiefComplaint;
            newCase.TentativeDiagnosis = caseInfoEntity.TentativeDiagnosis;
            newCase.DifferentialDiagnosis = caseInfoEntity.DifferentialDiagnosis;
            newCase.TreatmentPlan = caseInfoEntity.TreatmentPlan;
            newCase.CountercheckDate = caseInfoEntity.CountercheckDate;

            try {
                DEntities.CaseHistories.AddObject(newCase);
                DEntities.SaveChanges();
            }
            catch {
                addedCase.ErrorMessage = "Invalid Case! @Data";
                return addedCase;
            }

            if (caseInfoEntity.CountercheckDate != null) {
                Section section = (from s in DEntities.Sections
                                   where s.SectionID == doctor.SectionID
                                   select s).FirstOrDefault();
                User user = (from u in DEntities.Users
                             where u.UserID == caseInfoEntity.UserID
                             select u).FirstOrDefault();
                DateTime lastVisit = (DateTime)newCase.CreatedDate;
                DateTime countercheckDate = (DateTime)newCase.CountercheckDate;
                DateTime currentTime = DateTime.Now;

                Message message = new Message();
                message.MessageID = Guid.NewGuid();
                message.Sender = section.HospitalID;
                message.Receiver = newCase.UserID;
                message.Date = countercheckDate.AddDays(-3).AddMinutes(currentTime.Minute).AddSeconds(currentTime.Second).AddMilliseconds(currentTime.Millisecond);
                message.Type = "H2U";
                message.Text = String.Format(
                    "Dear {0}.{1} {2},\nDuring your visit on {3}, Dr.{4} {5} ({6}) suggested you pay another visit on {7}. It might be a good idea to make an appointment before it's too late.\nSincerely,\nDr.PE",
                    (user.Gender.ToLower() == "female") ? "Ms" : "Mr",
                    user.LastName, user.FirstName,
                    lastVisit.ToLongDateString(),
                    doctor.LastName, doctor.FirstName,
                    section.Name,
                    countercheckDate.ToLongDateString());

                try {
                    DEntities.Messages.AddObject(message);
                    DEntities.SaveChanges();
                }
                catch {
                    addedCase.ErrorMessage = "Can't Create Appointment Inform! @Data";
                    return addedCase;
                }
            }

            addedCase.CaseID = newCase.CaseID;
            addedCase.ExaminationID = newCase.ExaminationID;
            addedCase.PrescriptionID = newCase.PrescriptionID;
            addedCase.UserID = newCase.UserID;
            addedCase.DoctorID = newCase.DoctorID;
            addedCase.SectionID = newCase.SectionID;
            addedCase.Date = newCase.CreatedDate;
            addedCase.ChiefComplaint = newCase.ChiefComplaint;
            addedCase.TentativeDiagnosis = newCase.TentativeDiagnosis;
            addedCase.DifferentialDiagnosis = newCase.DifferentialDiagnosis;
            addedCase.TreatmentPlan = newCase.TreatmentPlan;
            addedCase.CountercheckDate = newCase.CountercheckDate;
            if (newCase.ModifiedDate == null) {
                addedCase.IsDraft = true;
            }
            else {
                addedCase.IsDraft = false;
            }

            return addedCase;
        }
        /*为处方单付款*/
        public TransactionInfoEntity PayPrescription(string sPrescriptionID, string pharmacyID, string payPassword, string take) {

            DrPEDatabaseEntities DEntities = new DrPEDatabaseEntities();
            TransactionInfoEntity transactionInfoEntity = new TransactionInfoEntity();

            /*获取处方信息*/
            Guid gPrescriptionID = Guid.Empty;
            try {
                gPrescriptionID = new Guid(sPrescriptionID);
            }
            catch {
                transactionInfoEntity.ErrorMessage = "224 Wrong Prescription GUID! @Data";
                return transactionInfoEntity;
            }
            Prescription prescription = (from p in DEntities.Prescriptions
                                         where p.PrescriptionID == gPrescriptionID
                                         select p).FirstOrDefault();

            /*若处方不存在*/
            if (prescription == null) {
                transactionInfoEntity.ErrorMessage = "225 No Such Prescription! @Data";
                return transactionInfoEntity;
            }

            /*获取所属病历信息*/
            CaseHistory caseHistory = (from c in DEntities.CaseHistories
                                       where c.PrescriptionID == gPrescriptionID
                                       select c).FirstOrDefault();

            /*若处方不属于任何病历*/
            if (caseHistory == null) {
                transactionInfoEntity.ErrorMessage = "226 This Prescription Belongs to No Case! @Data";
                return transactionInfoEntity;
            }

            /*获取病历所属用户信息*/
            User user = (from u in DEntities.Users
                         where ((u.UserID == caseHistory.UserID) && (u.PayPassword == payPassword))
                         select u).FirstOrDefault();

            /*若支付密码错误*/
            if (user == null) {
                transactionInfoEntity.ErrorMessage = "227 Wrong PayPassword! @Data";
                return transactionInfoEntity;
            }

            /*判断是否已付款*/
            string sCheck = String.Format("P:{0}", gPrescriptionID.ToString());
            Transaction transaction = (from t in DEntities.Transactions
                                       where t.Status == sCheck
                                       select t).FirstOrDefault();
            if (transaction != null) {
                /*查询交易药房*/
                Pharmacy pharmacy = (from p in DEntities.Pharmacies
                                     where p.PharmacyID == transaction.PharmacyID
                                     select p).FirstOrDefault();

                /*是否与本药房交易*/
                if (pharmacy.PharmacyID == pharmacyID) {
                    /*药物是否已经领取*/
                    if (transaction.Detail == null) {
                        transactionInfoEntity.Amount = transaction.Amount;
                        transactionInfoEntity.ErrorMessage = String.Format("231 Already Paid at {0}, But Not Taken Yet! @Data", transaction.Date);

                        /*进行领取操作*/
                        transaction.Detail = "[Taken]";
                        DEntities.SaveChanges();
                    }
                    else {
                        transactionInfoEntity.Amount = transaction.Amount;
                        transactionInfoEntity.ErrorMessage = String.Format("232 Already Paid and Taken at {0}! @Data", transaction.Date);
                    }
                }
                else {
                    transactionInfoEntity.ErrorMessage = String.Format("233 Already Bought in {0}({1}) at {2}! @Data",
                                                                        pharmacy.Name, pharmacy.PharmacyID, transaction.Date);
                }
                return transactionInfoEntity;
            }

            /*获取处方费用*/
            PrescriptionCostEntity prescriptionCostEntity = GetPrescriptionCost(sPrescriptionID, pharmacyID, user.Password);
            if (prescriptionCostEntity.ErrorMessage != null) {
                transactionInfoEntity.ErrorMessage = prescriptionCostEntity.ErrorMessage;
                return transactionInfoEntity;
            }

            /*判断用户帐号是否允许支付*/
            if (user.Balance == null) {
                transactionInfoEntity.ErrorMessage = String.Format("228 User's Balance Not Available! @Data");
                return transactionInfoEntity;
            }

            /*判断用户是否有足够的余额支付*/
            if (user.Balance < prescriptionCostEntity.Amount) {
                transactionInfoEntity.ErrorMessage = String.Format("229 Needs RMB{0}, But Only RMB{1} Left! @Data", prescriptionCostEntity.Amount, user.Balance);
                return transactionInfoEntity;
            }

            /*支付密码正确,生成新交易*/
            Transaction newTransaction      = new Transaction();
            newTransaction.TransactionID    = Guid.NewGuid();
            newTransaction.UserID           = user.UserID;
            newTransaction.PharmacyID       = pharmacyID;
            newTransaction.Date             = DateTime.Now;
            newTransaction.Amount           = prescriptionCostEntity.Amount;
            newTransaction.Status           = sCheck;
            if (take != null) {
                newTransaction.Detail = "[Taken]";
            }

            /*提交修改至数据库*/
            try {
                DEntities.Transactions.AddObject(newTransaction);
                DEntities.SaveChanges();
            }
            catch {
                transactionInfoEntity.ErrorMessage = "241 GUID Conflicts! @Data";
                return transactionInfoEntity;
            }

            /*从用户帐号扣款*/
            user.Balance -= prescriptionCostEntity.Amount;
            DEntities.SaveChanges();

            /*将款项加入药房*/
            Pharmacy newPharmacy = (from ph in DEntities.Pharmacies
                                    where ph.PharmacyID == pharmacyID
                                    select ph).FirstOrDefault();
            if (newPharmacy.Balance == null) {
                newPharmacy.Balance = prescriptionCostEntity.Amount;
            }
            else {
                newPharmacy.Balance += prescriptionCostEntity.Amount;
            }
            DEntities.SaveChanges();


            /*返回交易详情*/
            transactionInfoEntity.TransactionID     = newTransaction.TransactionID;
            transactionInfoEntity.LastName          = user.LastName;
            transactionInfoEntity.FirstName         = user.FirstName;
            transactionInfoEntity.PharmacyID        = newTransaction.PharmacyID;
            transactionInfoEntity.Date              = newTransaction.Date;
            transactionInfoEntity.Amount            = newTransaction.Amount;
            transactionInfoEntity.UserBalanceThen   = user.Balance;
            if (newTransaction.Detail != null) {
                transactionInfoEntity.Action = newTransaction.Detail;
            }
            else {
                transactionInfoEntity.Action = "[Left]";
            }

            return transactionInfoEntity;
        }