package service import ( "Xcx_New/models" "fmt" "strconv" "strings" "time" "github.com/jinzhu/gorm" ) //GetSchedulePartitionPanel 取出排班面板,分区-机号 func GetSchedulePartitionPanel(orgID int64) (partitions []*models.Partition, err error) { err = readDb.Model(&models.DeviceZone{}).Preload("Jihaos", "org_id=? and status=1", orgID).Where("org_id=? and status=1", orgID).Find(&partitions).Error return } func GetPatientWithScheduleAndSolution(orgID int64, keywords string, weekStart, weekEnd, schedule, contagion int64) (patients []*models.Patients, err error) { db := readDb.Table("xt_patients as p"). Preload("DialysisSolutions", "user_org_id=? and initiate_mode=1 and affirm_state=1 and parent_id=0 and status=1", orgID). Preload("Schedules", "user_org_id=? and schedule_date>=? and schedule_date<= ? and status=1", orgID, weekStart, weekEnd). Preload("Contagions", "status=1"). Where("p.user_org_id=? and p.lapseto=1 and p.status=1", orgID) if len(keywords) > 0 { likeKey := "%" + keywords + "%" db = db.Where("p.name LIKE ?", likeKey) } if schedule == 1 { db = db.Where("EXISTS (?)", readDb.Table("xt_schedule as iss").Where("iss.patient_id=p.id and iss.schedule_date>=? and iss.schedule_date<= ? and iss.status=1", weekStart, weekEnd).QueryExpr()) } else if schedule == 2 { db = db.Where("NOT EXISTS (?)", readDb.Table("xt_schedule as iss").Where("iss.patient_id=p.id and iss.schedule_date>=? and iss.schedule_date<= ? and iss.status=1", weekStart, weekEnd).QueryExpr()) } if contagion > 0 { db = db.Where("EXISTS (?)", readDb.Table("xt_patients_infectious_diseases as pid").Where("pid.patient_id=p.id and pid.disease_id=? and pid.status=1", contagion).QueryExpr()) } err = db.Find(&patients).Error return } func GetWeekSchedule(orgID int64, start, end int64) (schedules []*models.Schedule, err error) { err = readDb. Table("xt_schedule as s"). Preload("PatientInfectiousDiseases", "status = 1 "). Joins("JOIN xt_patients as p ON p.id = s.patient_id"). Where("s.user_org_id=? and s.schedule_date>=? and s.schedule_date<=? and s.status=1", orgID, start, end). Select("s.id, s.user_org_id, s.partition_id, s.bed_id, s.patient_id, s.schedule_date, s.schedule_type, s.schedule_week, s.mode_id, s.status, s.created_time, s.updated_time, p.name as patient"). Order("updated_time asc"). Find(&schedules).Error return } func GetDaySchedule(orgID, start, end, patientID int64) (schedule models.Schedule, err error) { err = readDb.Model(&models.Schedule{}).Where("user_org_id=? and patient_id=? and schedule_date>=? and schedule_date<=? and status=1", orgID, patientID, start, end).First(&schedule).Error return } func GetDayScheduleTwo(orgID, start, patientID int64) (schedule models.Schedule, err error) { err = readDb.Model(&models.Schedule{}).Where("user_org_id=? and patient_id=? and schedule_date = ? and status=1", orgID, patientID, start).Preload("DialysisOrder", "status = 1").First(&schedule).Error return } func GetDayScheduleByBedid(orgID, start, bed_id int64, schedule_type int64) (schedule models.Schedule, err error) { err = readDb.Model(&models.Schedule{}).Where("user_org_id=? and schedule_date=? and bed_id=? and status=1 AND schedule_type = ?", orgID, start, bed_id, schedule_type).Preload("DialysisOrder", "status = 1").First(&schedule).Error return } func GetPatientScheduleFormDay(orgID, start, end, patientID int64) (schedules []*models.PatientSchedule, err error) { err = readDb.Table("xt_schedule as s"). Preload("DeviceZone", "org_id=? and status=1", orgID). Preload("DeviceNumber", "org_id=? and status=1", orgID). Where("s.patient_id =? and s.user_org_id=? and s.schedule_date>=? and s.schedule_date < ? and s.status=1", patientID, orgID, start, end). Find(&schedules).Error return } func GetNextSchedule(orgID, end, patientID int64) (schedules []*models.PatientSchedule, err error) { err = readDb.Table("xt_schedule as s"). Preload("DeviceZone", "org_id=? and status=1", orgID). Preload("DeviceNumber", "org_id=? and status=1", orgID). Where("s.patient_id =? and s.user_org_id=? and s.schedule_date>=? and s.status=1", patientID, orgID, end). Find(&schedules).Error return } func GetPointSchedule(orgID, scheduleDate, scheduleWeek, scheduleType, bedId int64) (schedule models.Schedule, err error) { err = readDb.Model(&models.Schedule{}).Where("user_org_id=? and schedule_date=? and bed_id=? and schedule_week=? AND schedule_type=? and status=1", orgID, scheduleDate, bedId, scheduleWeek, scheduleType).First(&schedule).Error if err == gorm.ErrRecordNotFound { err = nil return } return } func CreateSchedule(m *models.Schedule) error { return writeDb.Model(&models.Schedule{}).Create(&m).Error } func GetSchedule(orgID, id int64) (*models.Schedule, error) { var schedule models.Schedule var err error err = readDb.Model(&models.Schedule{}).Where("id = ? and user_org_id=? and status=1", id, orgID).First(&schedule).Error if err != nil { return nil, err } return &schedule, nil } func UpdateSchedule(m *models.Schedule) error { return writeDb.Model(&models.Schedule{}).Save(&m).Error } func GetPatientScheduleFormToday(orgId, id, start int64) (schedules []*models.PatientSchedule, err error) { err = readDb.Table("xt_schedule as s"). Preload("DeviceZone", "org_id=? and status=1", orgId). Preload("DeviceNumber", "org_id=? and status=1", orgId). Where("s.patient_id =? and s.user_org_id=? and s.schedule_date>=? and s.status=1", id, orgId, start). Find(&schedules).Error return } type WeekSchedulePrintVM struct { ID int64 `gorm:"column:id" json:"id"` ZoneID int64 `gorm:"column:partition_id" json:"zone_id"` DeviceNumberID int64 `gorm:"column:bed_id" json:"device_number_id"` PatientID int64 `gorm:"column:patient_id" json:"patient_id"` ScheduleDate int64 `gorm:"column:schedule_date" json:"schedule_date"` ScheduleType int64 `gorm:"column:schedule_type" json:"schedule_type"` ScheduleWeek int64 `gorm:"column:schedule_week" json:"schedule_week"` ModeID int64 `gorm:"column:mode_id" json:"mode_id"` Patient *models.Patients `gorm:"ForeignKey:PatientID" json:"patient"` DeviceNumber *models.DeviceNumber `gorm:"ForeignKey:DeviceNumberID" json:"device_number"` Zone *models.DeviceZone `gorm:"ForeignKey:ZoneID" json:"zone"` Mode *models.TreatmentMode `gorm:"ForeignKey:ModeID" json:"mode"` } type PrintCount struct { ScheduleType int64 `gorm:"column:schedule_type" json:"schedule_type"` ScheduleWeek int64 `gorm:"column:schedule_week" json:"schedule_week"` Count int64 } func GetPrinitWeekSchedules(orgID int64, start, end int64) ([]*WeekSchedulePrintVM, error) { var schedules []*WeekSchedulePrintVM err := readDb.Table("xt_schedule as s"). Preload("Patient", "status = 1 and user_org_id = ?", orgID). Preload("DeviceNumber", "status = 1 and org_id = ?", orgID). Preload("Zone", "status = 1 and org_id = ?", orgID). Preload("Mode", "status = 1"). // Joins("JOIN xt_patients as p ON p.id = s.patient_id"). Where("s.user_org_id = ? and s.schedule_date >= ? and s.schedule_date <= ? and s.status = 1", orgID, start, end). // Select("s.id, s.user_org_id, s.partition_id, s.bed_id, s.patient_id, s.schedule_date, s.schedule_type, s.schedule_week, s.mode_id"). Find(&schedules).Error return schedules, err } func GetPrinitWeekTotal(orgid int64, startime int64, endtime int64) (print []*PrintCount, err error) { db := XTReadDB().Table("xt_schedule as x").Where("x.status = 1") if orgid > 0 { db = db.Where("x.user_org_id = ?", orgid) } if startime > 0 { db = db.Where("x.schedule_date >=?", startime) } if endtime > 0 { db = db.Where("x.schedule_date <=?", endtime) } err = db.Select("x.schedule_type,x.schedule_week,count(x.patient_id) as count").Group("x.schedule_date,x.schedule_type").Scan(&print).Error return print, err } func GetBloodPrintWeekTotal(orgid int64, startime int64, endtime int64) (print []*PrintCount, err error) { db := XTReadDB().Table("xt_schedule as x").Where("x.status = 1") if orgid > 0 { db = db.Where("x.user_org_id = ?", orgid) } if startime > 0 { db = db.Where("x.schedule_date >=?", startime) } if endtime > 0 { db = db.Where("x.schedule_date <=?", endtime) } db = db.Where("x.mode_id = 2") err = db.Select("x.schedule_type,x.schedule_week,count(x.patient_id) as count").Group("x.schedule_date,x.schedule_type").Scan(&print).Error return print, err } func GetPerfusionWeekTotal(orgid int64, startime int64, endtime int64) (print []*PrintCount, err error) { db := XTReadDB().Table("xt_schedule as x").Where("x.status = 1") if orgid > 0 { db = db.Where("x.user_org_id = ?", orgid) } if startime > 0 { db = db.Where("x.schedule_date >=?", startime) } if endtime > 0 { db = db.Where("x.schedule_date <=?", endtime) } db = db.Where("x.mode_id = 3") err = db.Select("x.schedule_type,x.schedule_week,count(x.patient_id) as count").Group("x.schedule_date,x.schedule_type").Scan(&print).Error return print, err } // func ExchangeScheduleTimeWithWeekSchedules(orgID int64, nextWeekSchs []*models.Schedule, nextTwoWeekSchs []*models.Schedule) error { // templateMode, getTemplateModeErr := GetOrgPatientScheduleTemplateMode(orgID) // if getTemplateModeErr != nil { // return getTemplateModeErr // } // if templateMode == nil { // return errors.New("模板模式不存在") // } // tx := writeDb.Begin() // updateTime := time.Now().Unix() // for _, sch := range nextWeekSchs { // sch.PatientInfectiousDiseases = nil // date := time.Unix(sch.ScheduleDate, 0) // sch.ScheduleDate = date.AddDate(0, 0, 7).Unix() // sch.UpdatedTime = updateTime // updateSchErr := tx.Save(sch).Error // if updateSchErr != nil { // tx.Rollback() // return updateSchErr // } // } // for _, sch := range nextTwoWeekSchs { // sch.PatientInfectiousDiseases = nil // date := time.Unix(sch.ScheduleDate, 0) // sch.ScheduleDate = date.AddDate(0, 0, -7).Unix() // sch.UpdatedTime = updateTime // updateSchErr := tx.Save(sch).Error // if updateSchErr != nil { // tx.Rollback() // return updateSchErr // } // } // templateMode.ModifyTime = updateTime // templateMode.ExecuteTimes += 1 // updateModeErr := tx.Save(templateMode).Error // if updateModeErr != nil { // tx.Rollback() // return updateModeErr // } // tx.Commit() // return nil // } func GetSchedualPatientsByKeywordsAndWeek(keywords string, org_id int64, start_time int64, end_time int64) (schedule []*models.Schedule, err error) { likeKey := "%" + keywords + "%" err = readDb. Table("xt_schedule as s"). Preload("PatientInfectiousDiseases", "status = 1 "). Preload("DeviceZone", "status = 1 "). Preload("DeviceNumber", "status = 1 "). Preload("TreatmentMode", "status = 1 "). Joins("JOIN xt_patients as p ON p.id = s.patient_id AND (p.name LIKE ? OR p.dialysis_no LIKE ?)", likeKey, likeKey). Where("s.user_org_id=? and s.schedule_date >= ? and s.schedule_date <= ? and s.status=1", org_id, start_time, end_time). Select("s.id, s.user_org_id, s.partition_id, s.bed_id, s.patient_id, s.schedule_date, s.schedule_type, s.schedule_week, s.mode_id, s.status, s.created_time, s.updated_time, p.name as patient"). Order("schedule_date asc"). Find(&schedule).Error return } func GetSchedualPatientsByKeywords(keywords string, org_id int64) (schedule []*models.Schedule, err error) { likeKey := "%" + keywords + "%" err = readDb. Table("xt_schedule as s"). Preload("PatientInfectiousDiseases", "status = 1 "). Preload("DeviceZone", "status = 1 "). Preload("DeviceNumber", "status = 1 "). Preload("TreatmentMode", "status = 1 "). Joins("JOIN xt_patients as p ON p.id = s.patient_id AND (p.name LIKE ? OR p.dialysis_no LIKE ?)", likeKey, likeKey). Where("s.user_org_id=? and s.schedule_date >= UNIX_TIMESTAMP(DATE_FORMAT(NOW(),'%Y-%m-%d 00:00:00')) and s.schedule_date <= UNIX_TIMESTAMP(DATE_FORMAT( SUBDATE(CURDATE(),DATE_FORMAT(CURDATE(),'%w')-7), '%Y-%m-%d 23:59:59')) and s.status=1", org_id). Select("s.id, s.user_org_id, s.partition_id, s.bed_id, s.patient_id, s.schedule_date, s.schedule_type, s.schedule_week, s.mode_id, s.status, s.created_time, s.updated_time, p.name as patient"). Order("schedule_date asc"). Find(&schedule).Error return } func GetWeekDaySchedule(orgID int64, scheduleDate int64, scheduleDates *time.Time) (schedules []*models.WeekSchedule, err error) { err = readDb. Table("xt_schedule as s"). Preload("DeviceZone", "status = 1 "). Preload("DeviceNumber", "status = 1 "). Preload("DialysisPrescription", func(db *gorm.DB) *gorm.DB { return db.Where("status = 1").Order("id asc") }). Joins("JOIN xt_patients as p ON p.id = s.patient_id"). Where("s.user_org_id=? and s.schedule_date = ? and s.status=1", orgID, scheduleDate). Select("s.id, s.user_org_id, s.partition_id, s.bed_id, s.patient_id, s.schedule_date, s.schedule_type, s.schedule_week, s.mode_id, s.status, s.created_time, s.updated_time, p.name as patient"). Order("schedule_type"). Find(&schedules).Error for _, item := range schedules { _, config := FindDoctorAdviceRecordByOrgId(item.UserOrgId) if config.IsOpenRemind > 0 { //开启推送提醒逻辑 提交长期处方的时候,弹起长期医嘱推送 var advice_three []*models.DoctorAdvice advices, _ := GetLastLongAdviceByGroupNoOther(item.UserOrgId, item.PatientId) advices_two, _ := GetLastLongAdviceByGroupNoThreeOther(item.UserOrgId, item.PatientId) for _, advice := range advices { advice.IsCheck = 1 if advice.FrequencyType == 3 { week := int(scheduleDates.Weekday()) fmt.Println(advice.WeekDay) switch week { case 1: if strings.Index(advice.WeekDay, "周一") > -1 { advice_three = append(advice_three, advice) } break case 2: if strings.Index(advice.WeekDay, "周二") > -1 { advice_three = append(advice_three, advice) } break case 3: if strings.Index(advice.WeekDay, "周三") > -1 { advice_three = append(advice_three, advice) } break case 4: if strings.Index(advice.WeekDay, "周四") > -1 { advice_three = append(advice_three, advice) } break case 5: if strings.Index(advice.WeekDay, "周五") > -1 { advice_three = append(advice_three, advice) } break case 6: if strings.Index(advice.WeekDay, "周六") > -1 { advice_three = append(advice_three, advice) } break case 0: if strings.Index(advice.WeekDay, "周日") > -1 { advice_three = append(advice_three, advice) } break } } else if advice.FrequencyType == 1 { advice_three = append(advice_three, advice) } } for _, advice := range advices_two { now := scheduleDates.Unix() dayStr := strconv.FormatInt(advice.DayCount, 10) dayStr2 := "-" + dayStr count, _ := strconv.ParseInt(dayStr2, 10, 64) oldTime := scheduleDates.AddDate(0, 0, int(count)).Unix() advices, _ := FindAllDoctorAdviceByTimeOther(now, oldTime, item.PatientId, item.UserOrgId, advice.TemplateId) if len(advices) == 0 { advice_three = append(advice_three, advice) } } item.DoctorAdvice = append(item.DoctorAdvice, advice_three...) } } return } func RemoveRepeatedElement(arr []*models.DoctorAdvice) (newArr []*models.DoctorAdvice) { newArr = make([]*models.DoctorAdvice, 0) for i := 0; i < len(arr); i++ { repeat := false for j := i + 1; j < len(arr); j++ { if arr[i].ID == arr[j].ID { repeat = true break } } if !repeat { newArr = append(newArr, arr[i]) } } return } func GetLastLongAdviceByGroupNoOther(orgId int64, patient_id int64) (advice []*models.DoctorAdvice, err error) { err = readDb.Model(&models.DoctorAdvice{}).Where("status = 1 AND user_org_id = ? AND patient_id = ? AND advice_type = 1 AND stop_state = 2 AND parent_id = 0", orgId, patient_id).Preload("ChildDoctorAdvice", "status = 1").Find(&advice).Error return } func GetLastLongAdviceByGroupNoThreeOther(orgId int64, patient_id int64) (advice []*models.DoctorAdvice, err error) { err = readDb.Model(&models.DoctorAdvice{}).Where("status = 1 AND user_org_id = ? AND patient_id = ? AND advice_type = 1 AND frequency_type = 2 AND stop_state = 2 AND parent_id = 0 ", orgId, patient_id).Preload("ChildDoctorAdvice", "status = 1").Find(&advice).Error return } func FindAllDoctorAdviceByTimeOther(now int64, end int64, patient_id int64, orgId int64, temp_id string) (advice []*models.DoctorAdvice, err error) { err = readDb.Model(&models.DoctorAdvice{}).Where("status = 1 AND user_org_id = ? AND patient_id = ? AND advice_type = 2 AND frequency_type = 2 AND advice_date > ? AND advice_date < ? AND template_id = ? ", orgId, patient_id, end, now, temp_id).Preload("ChildDoctorAdvice", "status = 1").Find(&advice).Error return } func FindSchPatientNameByName(name string, user_org_id int64) (patient []*models.Patients, err error) { err = readDb.Model(&models.Patients{}).Where("user_org_id = ? AND name = ? AND status = 1", user_org_id, name).Find(&patient).Error return } func UpdateScheduleStatus(date int64, org_id int64) (err error) { err = readDb.Model(&models.Schedule{}).Where("user_org_id = ? AND schedule_date > ? AND status = 1", org_id, date).Updates(map[string]interface{}{"status": 0, "mtime": time.Now().Unix()}).Error return } func FindDeviceZoneByName(name string, org_id int64) (zone models.DeviceZone, err error) { err = readDb.Model(&models.DeviceZone{}).Where("org_id = ? AND name = ? AND status = 1", org_id, name).First(&zone).Error return } func FindDeviceByName(device_name string, org_id int64, zone_id int64) (devices []*models.DeviceNumber, err error) { err = readDb.Model(&models.DeviceNumber{}).Where("org_id = ? AND number = ? AND zone_id = ? AND status = 1", org_id, device_name, zone_id).Find(&devices).Error return } func FindSchedualExportLog(org_id int64, export_time int64) (errLogs []*models.ExportErrLog, err error) { err = readDb.Model(&models.ExportErrLog{}).Where("user_org_id = ? AND export_time = ? AND log_type = 2", org_id, export_time).Find(&errLogs).Error return } func FindDeviceByNameTwo(device_name string, org_id int64, zone_id int64) (devices []*models.DeviceNumber, err error) { err = readDb.Model(&models.DeviceNumber{}).Where("org_id = ? AND number = ? AND status = 1 AND zone_id = ?", org_id, device_name, zone_id).Find(&devices).Error return } func UpdateScheduleTemplateStatus(org_id int64) (err error) { err = readDb.Model(&models.PatientScheduleTemplateItem{}).Where("org_id = ? AND status = 1", org_id).Updates(map[string]interface{}{"status": 0, "mtime": time.Now().Unix()}).Error return } func CreateScheduleTemplate(m *models.PatientScheduleTemplateItem) error { return writeDb.Model(&models.PatientScheduleTemplateItem{}).Create(&m).Error } func FindSchedualTemplateExportLog(org_id int64, export_time int64) (errLogs []*models.ExportErrLog, err error) { err = readDb.Model(&models.ExportErrLog{}).Where("user_org_id = ? AND export_time = ? AND log_type = 3", org_id, export_time).Find(&errLogs).Error return } func GetDialysisOrderByBedId(orgID, start, bed_id int64, schedule_type int64) (schedule models.DialysisOrder, err error) { err = readDb.Model(&models.DialysisOrder{}).Where("user_org_id=? and dialysis_date=? and bed_id=? and status=1 AND schedual_type = ?", orgID, start, bed_id, schedule_type).First(&schedule).Error return } type VMDeviceNumber struct { ID int64 `gorm:"column:id" json:"id"` OrgID int64 `gorm:"column:org_id" json:"-"` Number string `gorm:"column:number" json:"number"` GroupID int64 `gorm:"column:group_id" json:"group_id"` ZoneID int64 `gorm:"column:zone_id" json:"zone_id"` Status int8 `json:"-"` CreateTime int64 `gorm:"column:ctime" json:"-"` ModifyTime int64 `gorm:"column:mtime" json:"-"` DeviceZone models.DeviceZone `json:"zone" gorm:"foreignkey:ID;AssociationForeignKey:ZoneID;"` } func (VMDeviceNumber) TableName() string { return "xt_device_number" } type VMPatientScheduleTemplateItem struct { ID int64 `gorm:"column:id" json:"id" form:"id"` OrgID int64 `gorm:"column:org_id" json:"-" form:"org_id"` TemplateID int64 `gorm:"column:template_id" json:"template_id" form:"template_id"` DeviceNumberID int64 `gorm:"column:device_number_id" json:"device_number_id" form:"device_number_id"` PatientID int64 `gorm:"column:patient_id" json:"patient_id" form:"patient_id"` TreatMode int64 `gorm:"column:treat_mode" json:"treat_mode" form:"treat_mode"` // 治疗模式 Weekday int8 `gorm:"column :weekday" json:"weekday" form:"weekday"` // 周一-周日 1-7 TimeType int8 `gorm:"column:time_type" json:"time_type" form:"time_type"` // 上下晚 123 Status int8 `gorm:"column:status" json:"status" form:"status"` CreateTime int64 `gorm:"column:ctime" json:"-" form:"ctime"` ModifyTime int64 `gorm:"column:mtime" json:"-" form:"mtime"` IsExport int64 `gorm:"column:is_export" json:"is_export" form:"is_export"` Patient string `gorm:"-" json:"patient" form:"patient"` DeviceNumber VMDeviceNumber `json:"number" gorm:"foreignkey:ID;AssociationForeignKey:DeviceNumberID;"` PatientInfectiousDiseases []*models.InfectiousDiseases `json:"patient_contagions" gorm:"foreignkey:PatientId;AssociationForeignKey:PatientId;"` } func (VMPatientScheduleTemplateItem) TableName() string { return "xt_patient_schedule_template_item" } func GetTemplateSchedualPatientsByKeywords(keywords string, org_id int64, template_id int64) (schedule []*VMPatientScheduleTemplateItem, err error) { likeKey := "%" + keywords + "%" err = readDb. Table("xt_patient_schedule_template_item as s"). Preload("PatientInfectiousDiseases", "status = 1 "). Preload("DeviceNumber", func(db *gorm.DB) *gorm.DB { return db.Where("org_id = ? AND status = 1", org_id).Preload("DeviceZone", "org_id = ? AND status = 1", org_id) }). Joins("JOIN xt_patients as p ON p.id = s.patient_id AND (p.name LIKE ? OR p.dialysis_no LIKE ?)", likeKey, likeKey). Where("s.template_id = ? AND s.org_id=? and s.status=1", template_id, org_id). Select("s.id, s.org_id, s.template_id, s.device_number_id, s.patient_id, s.treat_mode, s.weekday, s.time_type, s.status, s.ctime, s.mtime, p.name as patient"). Order("weekday asc"). Find(&schedule).Error return } func UpdateNewScheduleTemplateStatus(id int64, org_id int64) (err error) { err = readDb.Model(&models.PatientScheduleTemplateItem{}).Where("org_id = ? AND id = ?", org_id, id).Updates(map[string]interface{}{"status": 0, "mtime": time.Now().Unix()}).Error return }