package controllers

import (
	"XT_New/enums"
	"XT_New/models"
	"XT_New/service"
	"XT_New/utils"
	"encoding/json"
	"reflect"
	"strconv"
	"strings"
	"time"

	"fmt"

	"github.com/astaxie/beego"
)

type PatientApiController struct {
	BaseAuthAPIController
}

func PatientApiRegistRouters() {
	beego.Router("/api/patients", &PatientApiController{}, "get:GetPatientsList")
	beego.Router("/api/patients/all", &PatientApiController{}, "get:GetPatientsAllList")
	beego.Router("/api/patients/generatedialysisno", &PatientApiController{}, "get:GenerateDialysisNo")
	beego.Router("/api/patients/create", &PatientApiController{}, "Post:CreatePatient")
	beego.Router("/api/patients/total", &PatientApiController{}, "Get:GetPatientTotal")
	beego.Router("/api/patients/get", &PatientApiController{}, "Get:GetPatient")
	beego.Router("/api/patients/edit", &PatientApiController{}, "Put:EditPatient")
	beego.Router("/api/patients/dialysissolution/create", &PatientApiController{}, "Post:CreateDialysisSolution")
	beego.Router("/api/patients/dialysissolution/edit", &PatientApiController{}, "Put:UpdateDialysisSolution")
	beego.Router("/api/patients/dialysissolutions", &PatientApiController{}, "get:GetPatientDialysisSolutionList")
	beego.Router("/api/patients/dialysissolution/detail/edit", &PatientApiController{}, "Put:UpdateDialysisSolutionDetail")
	// beego.Router("/api/patients/dialysissolution/delete", &PatientApiController{}, "Delete:DeleteDialysisSolution")

	beego.Router("/api/patients/dryweight/get", &PatientApiController{}, "get:GetDryWeights")
	beego.Router("/api/patients/dryweight/create", &PatientApiController{}, "Post:CreateDryWeights")

	beego.Router("/api/patients/advice/create", &PatientApiController{}, "Post:CreateDoctorAdvice")
	beego.Router("/api/patients/advice/edit", &PatientApiController{}, "Put:UpdateDoctorAdvice")
	beego.Router("/api/patients/advice/exec", &PatientApiController{}, "Post:ExecDoctorAdvice")
	beego.Router("/api/patients/advice/check", &PatientApiController{}, "Post:CheckDoctorAdvice")
	beego.Router("/api/patients/advices", &PatientApiController{}, "Get:GetDoctorAdvices")
	beego.Router("/api/patients/advice/stop", &PatientApiController{}, "Post:StopDoctorAdvice")
	beego.Router("/api/patients/advice/delete", &PatientApiController{}, "Delete:DeleteDoctorAdvice")
	beego.Router("/api/patients/advice/creategroup", &PatientApiController{}, "Post:CreateGroupAdvice")
	beego.Router("/api/patients/advice/deletegroup", &PatientApiController{}, "Delete:DeleteGroupAdvice")
	beego.Router("/api/patients/advice/stopgroup", &PatientApiController{}, "Post:StopGroupAdvice")
	beego.Router("/api/patients/advice/execgroup", &PatientApiController{}, "Post:ExecGroupAdvice")
	beego.Router("/api/patients/advice/checkgroup", &PatientApiController{}, "Post:CheckGroupAdvice")

	beego.Router("/api/patients/schedules", &PatientApiController{}, "Get:GetPatientSchedules")
	beego.Router("/api/patients/dialysisrecords", &PatientApiController{}, "Get:GetPatientDialysisRecords")
	beego.Router("/api/patients/proeducation", &PatientApiController{}, "Get:ProEducation")
	beego.Router("/api/patients/lapseto/edit", &PatientApiController{}, "Post:EditLapseto")

	beego.Router("/api/patients/search", &PatientApiController{}, "Post:GetPatientsByKeyWord")

	beego.Router("/api/patients/querypatientbyId", &PatientApiController{}, "Get:QueryPatientById")

	beego.Router("/api/infectious/remind", &PatientApiController{}, "Get:GetRemindPatientList")

	beego.Router("/api/remind/is_open", &PatientApiController{}, "Post:PostIsOpenRemind")

}

//GetPatientsList 取患者列表
func (c *PatientApiController) GetPatientsList() {
	page, _ := c.GetInt64("page", 1)
	limit, _ := c.GetInt64("limit", 10)
	schedulType, _ := c.GetInt64("schedul_type", 0)
	bindingState, _ := c.GetInt64("binding_state", 0)
	lapseto, _ := c.GetInt64("lapseto", 0)
	source, _ := c.GetInt64("source", 0)
	startTime := c.GetString("start_time", "")
	endTime := c.GetString("end_time", "")
	keywords := c.GetString("keywords", "")
	contagion, _ := c.GetInt64("contagion", 0)
	reimbursement_way, _ := c.GetInt64("reimbursement_way", 0)
	isscheduling, _ := c.GetInt64("isscheduling", 0)
	isprescription, _ := c.GetInt64("isprescription", 0)

	if page <= 0 {
		page = 1
	}
	if limit <= 0 {
		limit = 10
	}

	adminUserInfo := c.GetAdminUserInfo()

	timeLayout := "2006-01-02"
	loc, _ := time.LoadLocation("Local")

	var isStartTime bool
	var theStartTIme int64
	if len(startTime) > 0 {
		theTime, err := time.ParseInLocation(timeLayout+" 15:04:05", startTime+" 00:00:00", loc)
		if err != nil {
			c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
			return
		}
		isStartTime = true
		theStartTIme = theTime.Unix()
	}
	var isEndTime bool
	var theEndtTIme int64
	if len(endTime) > 0 {
		theTime, err := time.ParseInLocation(timeLayout+" 15:04:05", endTime+" 23:59:59", loc)
		if err != nil {
			utils.ErrorLog(err.Error())
			c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
			return
		}
		isEndTime = true
		theEndtTIme = theTime.Unix()
	}

	patients, total, _ := service.GetPatientList(adminUserInfo.CurrentOrgId, keywords, page, limit, schedulType, bindingState, lapseto, source, theStartTIme, theEndtTIme, contagion, reimbursement_way, isscheduling, isprescription, isStartTime, isEndTime)

	c.ServeSuccessJSON(map[string]interface{}{
		"patients": patients,
		"total":    total,
	})
	return

}

//GetPatientTotal
func (c *PatientApiController) GetPatientTotal() {
	adminUserInfo := c.GetAdminUserInfo()

	total := service.GetPatientCount(adminUserInfo.CurrentOrgId)

	c.ServeSuccessJSON(map[string]interface{}{
		"total": total,
	})
	return
}

func (c *PatientApiController) GetPatientsAllList() {

	adminUserInfo := c.GetAdminUserInfo()

	patients, total, _ := service.GetAllPatientList(adminUserInfo.CurrentOrgId)

	c.ServeSuccessJSON(map[string]interface{}{
		"patients": patients,
		"total":    total,
	})
	return
}

//GenerateDialysisNo 生成透析号
func (c *PatientApiController) GenerateDialysisNo() {
	adminUserInfo := c.GetAdminUserInfo()

	dialysisNo := service.ChechLastDialysisNo(adminUserInfo.CurrentOrgId)
	if dialysisNo == 0 {
		dialysisNo = 1
	} else {
		dialysisNo++
	}
	no := strconv.FormatInt(dialysisNo, 10)

	rep := 3 - len(no)

	if rep > 0 {
		no = strings.Repeat("0", rep) + no
	}

	c.ServeSuccessJSON(map[string]interface{}{
		"no": no,
	})
	return
}

//CreatePatient 创建患者
func (c *PatientApiController) CreatePatient() {
	record_date := c.GetString("record_date")
	is_infectious, _ := c.GetInt64("is_infectious")
	remind_cycle, _ := c.GetInt64("remind_cycle")

	adminUserInfo := c.GetAdminUserInfo()
	//patientTotal := service.GetLapsetoPatientCount(adminUserInfo.CurrentOrgId, 1)

	//subscibes := adminUserInfo.Subscibes[adminUserInfo.CurrentOrgId]
	//if subscibes.State == 2 && patientTotal >= 20 { //免费试用版，不过期，限制患者数20
	//	c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodePatientReachLimit)
	//	return
	//} else if subscibes.State == 1 && patientTotal >= 60 { //标准版，不过期，限制患者数60
	//	c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodePatientReachLimit)
	//	return
	//}

	var patient models.Patients
	contagions, diseases, code, formItems := patientFormData(&patient, c.Ctx.Input.RequestBody, "create")
	fmt.Println(code)
	fmt.Println(patient)

	fmt.Println("contagions是什么", contagions)
	if code > 0 {
		c.ServeFailJSONWithSGJErrorCode(code)
		return
	}

	thisPatient, _ := service.FindPatientByDialysisNo(adminUserInfo.CurrentOrgId, patient.DialysisNo)
	if thisPatient.ID > 0 {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDialysisNoExist)
		return
	}

	thisPatient, _ = service.FindPatientByIdCardNo(adminUserInfo.CurrentOrgId, patient.IdCardNo)
	if thisPatient.ID > 0 {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeIdCardNoExist)
		return
	}

	thisPatient, _ = service.FindPatientByMobile(adminUserInfo.CurrentOrgId, patient.Phone)
	if thisPatient.ID > 0 {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodePatientPhoneUsed)
		return
	}

	patient.RemindCycle = remind_cycle
	patient.IsInfectious = is_infectious
	patient.RegistrarsId = adminUserInfo.AdminUser.Id
	patient.Status = 1
	patient.CreatedTime = time.Now().Unix()
	patient.UserOrgId = adminUserInfo.CurrentOrgId
	patient.UpdatedTime = time.Now().Unix()
	patient.BindingState = 2
	// patient.Lapseto = 1

	err := service.CreatePatient(&patient, contagions, diseases)
	fmt.Println("创建病人失败---------------------------------------------err")
	if err != nil {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeCreatePatient)
		return
	}

	//获取老表的最后一条数据
	patients, err := service.GetLastPatientData(adminUserInfo.CurrentOrgId)
	patientsNew := models.XtPatientsNew{
		UserOrgId:          adminUserInfo.CurrentOrgId,
		UserId:             0,
		Avatar:             patients.Avatar,
		PatientType:        patients.PatientType,
		DialysisNo:         patients.DialysisNo,
		AdmissionNumber:    patients.AdmissionNumber,
		Source:             patients.Source,
		Lapseto:            patients.Lapseto,
		PartitionId:        patients.PartitionId,
		BedId:              patients.BedId,
		Name:               patients.Name,
		Alias:              patients.Alias,
		Gender:             patients.Gender,
		MaritalStatus:      patients.MaritalStatus,
		IdCardNo:           patients.IdCardNo,
		Birthday:           patients.Birthday,
		ReimbursementWayId: patients.ReimbursementWayId,
		HealthCareType:     patients.HealthCareType,
		HealthCareNo:       patients.HealthCareNo,
		HealthCareDueDate:  patients.HealthCareDueDate,
		Height:             patients.Height,
		BloodType:          patients.BloodType,
		Rh:                 patients.Rh,
		HealthCareDueAlertDate:       patients.HealthCareDueAlertDate,
		EducationLevel:               patients.EducationLevel,
		Profession:                   patients.Profession,
		Phone:                        patients.Phone,
		HomeTelephone:                patients.HomeTelephone,
		RelativePhone:                patients.RelativePhone,
		RelativeRelations:            patients.RelativeRelations,
		HomeAddress:                  patients.HomeAddress,
		WorkUnit:                     patients.WorkUnit,
		UnitAddress:                  patients.UnitAddress,
		Children:                     patients.Children,
		ReceivingDate:                patients.ReceivingDate,
		IsHospitalFirstDialysis:      patients.IsHospitalFirstDialysis,
		FirstDialysisDate:            patients.FirstDialysisDate,
		FirstDialysisHospital:        patients.FirstDialysisHospital,
		PredialysisCondition:         patients.PredialysisCondition,
		PreHospitalDialysisFrequency: patients.PreHospitalDialysisFrequency,
		PreHospitalDialysisTimes:     patients.PreHospitalDialysisTimes,
		HospitalFirstDialysisDate:    patients.HospitalFirstDialysisDate,
		InductionPeriod:              patients.InductionPeriod,
		InitialDialysis:              patients.InitialDialysis,
		TotalDialysis:                patients.TotalDialysis,
		AttendingDoctorId:            patients.AttendingDoctorId,
		HeadNurseId:                  patients.HeadNurseId,
		Evaluate:                     patients.Evaluate,
		Diagnose:                     patients.Diagnose,
		Remark:                       patients.Remark,
		RegistrarsId:                 patients.RegistrarsId,
		Registrars:                   patients.Registrars,
		QrCode:                       patients.QrCode,
		BindingState:                 patients.BindingState,
		PatientComplains:             patients.PatientComplains,
		PresentHistory:               patients.PresentHistory,
		PastHistory:                  patients.PresentHistory,
		Temperature:                  patients.Temperature,
		Pulse:                        patients.Pulse,
		Respiratory:                  patients.Respiratory,
		Sbp:                          patients.SBP,
		Dbp:                          patients.DBP,
		Status:                       patients.Status,
		CreatedTime:                  patients.CreatedTime,
		UpdatedTime:                  patients.UpdatedTime,
		Nation:                       patients.Nation,
		NativePlace:                  patients.NativePlace,
		Age:                          patients.Age,
		InfectiousNextRecordTime: patients.InfectiousNextRecordTime,
		IsInfectious:             patients.IsInfectious,
		RemindCycle:              patients.RemindCycle,
		ResponseResult:           patients.ResponseResult,
		IsOpenRemind:             patients.IsOpenRemind,
		FirstTreatmentDate:       patients.FirstTreatmentDate,
		DialysisAge:              patients.DialysisAge,
		ExpenseKind:              patients.ExpenseKind,
		TellPhone:                patients.TellPhone,
		ContactName:              patients.ContactName,
		BloodPatients:            1,
		SlowPatients:             0,
		MemberPatients:           0,
		EcommerPatients:          "",
		BloodId:                  patients.ID,
		SlowId:                   0,
		MemberId:                 0,
		MemberFistdate:           0,
		MemberPatienttype:        0,
		MemberTreatement:         0,
		EquitmentId:              "",
	}

	err = service.CreatePatientsNew(&patientsNew)
	fmt.Print("创建失败", err)

	if len(record_date) > 0 {
		var recordTime int64
		timeLayout := "2006-01-02"
		loc, _ := time.LoadLocation("Local")
		theTime, err := time.ParseInLocation(timeLayout+" 15:04:05", record_date+" 00:00:00", loc)
		if err != nil {
			c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
			return
		}
		recordTime = theTime.Unix()
		inspections := make([]models.Inspection, 0)
		for _, item := range formItems {
			var inspection models.Inspection
			inspection.OrgId = adminUserInfo.CurrentOrgId
			inspection.PatientId = patient.ID
			inspection.ProjectId = item.ProjectId
			inspection.ItemId = item.ItemId
			inspection.ItemName = item.ItemName
			inspection.ProjectName = item.ProjectName
			inspection.InspectType = item.RangeType
			inspection.InspectValue = item.Value
			inspection.InspectDate = recordTime
			inspection.Status = 1
			inspection.CreatedTime = time.Now().Unix()
			inspection.UpdatedTime = time.Now().Unix()
			inspections = append(inspections, inspection)
		}
		err = service.CreatePatientInspection(inspections)

		infectiousRecord, _ := service.FindLastRecordDate(adminUserInfo.CurrentOrgId, patient.ID, 14)
		var record_time int64
		switch remind_cycle {
		case 1: //1个月
			ts := time.Unix(infectiousRecord.InspectDate, 0)
			record_time = ts.AddDate(0, 1, 0).Unix()

			break
		case 2: //2个月
			ts := time.Unix(infectiousRecord.InspectDate, 0)
			record_time = ts.AddDate(0, 2, 0).Unix()
			break
		case 3: //3个月
			ts := time.Unix(infectiousRecord.InspectDate, 0)
			record_time = ts.AddDate(0, 3, 0).Unix()
			break
		case 4: //6个月
			ts := time.Unix(infectiousRecord.InspectDate, 0)
			record_time = ts.AddDate(0, 6, 0).Unix()
			break
		case 5: //12个月
			ts := time.Unix(infectiousRecord.InspectDate, 0)
			record_time = ts.AddDate(0, 12, 0).Unix()
			break
		}

		errs := service.UpDateInfectiousRecordTime(adminUserInfo.CurrentOrgId, patient.ID, record_time, remind_cycle)
		if errs != nil {
			utils.ErrorLog("更新日期出错：%v", errs)
		}

	}

	redis := service.RedisClient()
	defer redis.Close()
	redis.SAdd("sgj_patient:new_user_set", patient.UserId)

	c.ServeSuccessJSON(map[string]interface{}{
		"msg": "ok",
	})
	return
}

//EditPatient 修改
func (c *PatientApiController) EditPatient() {
	id, _ := c.GetInt64("id", 0)

	record_date := c.GetString("record_date")
	is_infectious, _ := c.GetInt64("is_infectious")
	remind_cycle, _ := c.GetInt64("remind_cycle")

	if id <= 0 {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}

	adminUserInfo := c.GetAdminUserInfo()

	patient, _ := service.FindPatientById(adminUserInfo.CurrentOrgId, id)
	if patient.ID == 0 {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodePatientNoExist)
		return
	}

	contagions, diseases, code, formItems := patientFormData(&patient, c.Ctx.Input.RequestBody, "edit")
	if code > 0 {
		c.ServeFailJSONWithSGJErrorCode(code)
		return
	}

	thisPatientother, _ := service.FindPatientByDialysisNo(adminUserInfo.CurrentOrgId, patient.DialysisNo)
	if thisPatientother.ID > 0 && thisPatientother.ID != patient.ID {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDialysisNoExist)
		return
	}

	thisPatient, _ := service.FindPatientByIdCardNo(adminUserInfo.CurrentOrgId, patient.IdCardNo)
	if thisPatient.ID > 0 && thisPatient.ID != patient.ID {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeIdCardNoExist)
		return
	}

	patient.UpdatedTime = time.Now().Unix()
	patient.IsInfectious = is_infectious
	patient.RemindCycle = remind_cycle

	err := service.UpdatePatient(&patient, contagions, diseases)
	if err != nil {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeUpdatePatient)
		return
	}
	fmt.Println("病人--------------------------------------------------------------", patient.Name, patient.Age)
	patientsNew := models.XtPatientsNew{
		UserOrgId:          patient.UserOrgId,
		UserId:             patient.UserId,
		Avatar:             patient.Avatar,
		PatientType:        patient.PatientType,
		DialysisNo:         patient.DialysisNo,
		AdmissionNumber:    patient.AdmissionNumber,
		Source:             patient.Source,
		Lapseto:            patient.Lapseto,
		PartitionId:        patient.PartitionId,
		BedId:              patient.BedId,
		Name:               patient.Name,
		Alias:              patient.Alias,
		Gender:             patient.Gender,
		MaritalStatus:      patient.MaritalStatus,
		IdCardNo:           patient.IdCardNo,
		Birthday:           patient.Birthday,
		ReimbursementWayId: patient.ReimbursementWayId,
		HealthCareType:     patient.HealthCareType,
		HealthCareNo:       patient.HealthCareNo,
		HealthCareDueDate:  patient.HealthCareDueDate,
		Height:             patient.Height,
		BloodType:          patient.BloodType,
		Rh:                 patient.Rh,
		HealthCareDueAlertDate:    patient.HealthCareDueAlertDate,
		EducationLevel:            patient.EducationLevel,
		Profession:                patient.Profession,
		Phone:                     patient.Phone,
		HomeTelephone:             patient.HomeTelephone,
		RelativePhone:             patient.RelativePhone,
		RelativeRelations:         patient.RelativeRelations,
		HomeAddress:               patient.HomeAddress,
		WorkUnit:                  patient.WorkUnit,
		UnitAddress:               patient.UnitAddress,
		Children:                  patient.Children,
		ReceivingDate:             patient.ReceivingDate,
		IsHospitalFirstDialysis:   patient.IsHospitalFirstDialysis,
		FirstDialysisDate:         patient.FirstDialysisDate,
		FirstDialysisHospital:     patient.FirstDialysisHospital,
		PredialysisCondition:      patient.PredialysisCondition,
		PreHospitalDialysisTimes:  patient.PreHospitalDialysisTimes,
		HospitalFirstDialysisDate: patient.HospitalFirstDialysisDate,
		InductionPeriod:           patient.InductionPeriod,
		InitialDialysis:           patient.InitialDialysis,
		TotalDialysis:             patient.TotalDialysis,
		AttendingDoctorId:         patient.AttendingDoctorId,
		HeadNurseId:               patient.HeadNurseId,
		Evaluate:                  patient.Evaluate,
		Diagnose:                  patient.Diagnose,
		Remark:                    patient.Remark,
		RegistrarsId:              patient.RegistrarsId,
		Registrars:                patient.Registrars,
		QrCode:                    patient.QrCode,
		BindingState:              patient.BindingState,
		PatientComplains:          patient.PatientComplains,
		PresentHistory:            patient.PresentHistory,
		PastHistory:               patient.PastHistory,
		Temperature:               patient.Temperature,
		Pulse:                     patient.Pulse,
		Respiratory:               patient.Respiratory,
		Sbp:                       patient.SBP,
		Dbp:                       patient.DBP,
		Nation:                    patient.Nation,
		NativePlace:               patient.NativePlace,
		Age:                       patient.Age,
		InfectiousNextRecordTime: patient.InfectiousNextRecordTime,
		IsInfectious:             patient.IsInfectious,
		RemindCycle:              patient.RemindCycle,
		ResponseResult:           patient.ResponseResult,
		IsOpenRemind:             patient.IsOpenRemind,
		FirstTreatmentDate:       patient.FirstTreatmentDate,
		DialysisAge:              patient.DialysisAge,
		ExpenseKind:              patient.ExpenseKind,
		TellPhone:                patient.TellPhone,
		ContactName:              patient.ContactName,
		UpdatedTime:              time.Now().Unix(),
	}
	//	//更新病人ID获取新表病人ID
	err = service.UpdatepatientTwo(&patientsNew, id)
	fmt.Println("更新病人失败---------------------------------------", err)

	if len(record_date) > 0 {
		var recordTime int64
		timeLayout := "2006-01-02"
		loc, _ := time.LoadLocation("Local")
		theTime, err := time.ParseInLocation(timeLayout+" 15:04:05", record_date+" 00:00:00", loc)
		if err != nil {
			c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
			return
		}
		recordTime = theTime.Unix()
		inspections := make([]models.Inspection, 0)
		for _, item := range formItems {
			var inspection models.Inspection
			inspection.OrgId = adminUserInfo.CurrentOrgId
			inspection.PatientId = patient.ID
			inspection.ProjectId = item.ProjectId
			inspection.ItemId = item.ItemId
			inspection.ItemName = item.ItemName
			inspection.ProjectName = item.ProjectName
			inspection.InspectType = item.RangeType
			inspection.InspectValue = item.Value
			inspection.InspectDate = recordTime
			inspection.Status = 1
			inspection.CreatedTime = time.Now().Unix()
			inspection.UpdatedTime = time.Now().Unix()
			inspections = append(inspections, inspection)
		}
		err = service.CreatePatientInspection(inspections)

		infectiousRecord, _ := service.FindLastRecordDate(adminUserInfo.CurrentOrgId, patient.ID, 14)
		var record_time int64
		switch remind_cycle {
		case 1: //1个月
			ts := time.Unix(infectiousRecord.InspectDate, 0)
			record_time = ts.AddDate(0, 1, 0).Unix()

			break
		case 2: //2个月
			ts := time.Unix(infectiousRecord.InspectDate, 0)
			record_time = ts.AddDate(0, 2, 0).Unix()
			break
		case 3: //3个月
			ts := time.Unix(infectiousRecord.InspectDate, 0)
			record_time = ts.AddDate(0, 3, 0).Unix()
			break
		case 4: //6个月
			ts := time.Unix(infectiousRecord.InspectDate, 0)
			record_time = ts.AddDate(0, 6, 0).Unix()
			break
		case 5: //12个月
			ts := time.Unix(infectiousRecord.InspectDate, 0)
			record_time = ts.AddDate(0, 12, 0).Unix()
			break
		}

		errs := service.UpDateInfectiousRecordTime(adminUserInfo.CurrentOrgId, patient.ID, record_time, remind_cycle)
		if errs != nil {
			utils.ErrorLog("更新日期出错：%v", errs)
		}
	}

	c.ServeSuccessJSON(map[string]interface{}{
		"msg": "ok",
	})
	return

}

func (c *PatientApiController) EditLapseto() {
	id, _ := c.GetInt64("id", 0)
	if id <= 0 {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}
	adminUserInfo := c.GetAdminUserInfo()

	patient, _ := service.FindPatientById(adminUserInfo.CurrentOrgId, id)
	if patient.ID == 0 {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodePatientNoExist)
		return
	}

	patientBody := make(map[string]interface{}, 0)
	err := json.Unmarshal(c.Ctx.Input.RequestBody, &patientBody)
	if err != nil {
		utils.ErrorLog(err.Error())
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodePatientNoExist)
		return
	}
	var lapseto models.PatientLapseto
	lapseto.PatientId = patient.ID

	if patientBody["lapseto_type"] == nil || reflect.TypeOf(patientBody["lapseto_type"]).String() != "float64" {
		utils.ErrorLog("lapseto_type")
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}
	lapsetoType := int64(patientBody["lapseto_type"].(float64))
	if lapsetoType <= 0 || lapsetoType >= 3 {
		utils.ErrorLog("lapsetoType <= 0 || lapsetoType >= 3")
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}
	lapseto.LapsetoType = lapsetoType

	timeLayout := "2006-01-02 15:04:05"
	loc, _ := time.LoadLocation("Local")

	if patientBody["lapseto_time"] == nil || reflect.TypeOf(patientBody["lapseto_time"]).String() != "string" {
		utils.ErrorLog("lapseto_time")
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeNotSelectLapsetoType)
		return
	}
	lapsetoTime, _ := patientBody["lapseto_time"].(string)
	if len(lapsetoTime) == 0 {
		utils.ErrorLog("len(lapsetoTime) == 0")
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeNotSelectLapsetoTime)
		return
	}
	lapsetoTimeUnix, err := time.ParseInLocation(timeLayout, lapsetoTime, loc)
	if err != nil {
		utils.ErrorLog("lapsetoTimeUnix")
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeNotSelectLapsetoTime)
		return
	}
	lapseto.LapsetoTime = lapsetoTimeUnix.Unix()
	lapseto.UpdatedTime = time.Now().Unix()
	lapseto.CreatedTime = time.Now().Unix()
	lapseto.Status = 1
	patient.Lapseto = lapseto.LapsetoType

	//if patient.Lapseto == 1 {
	//	patientTotal := service.GetLapsetoPatientCount(adminUserInfo.CurrentOrgId, 1)
	//	subscibes := adminUserInfo.Subscibes[adminUserInfo.CurrentOrgId]
	//	if subscibes.State == 2 && patientTotal >= 100 { //免费试用版，不过期，限制患者数20
	//		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodePatientReachLimit)
	//		return
	//	} else if subscibes.State == 1 && patientTotal >= 200 { //标准版，不过期，限制患者数60
	//		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodePatientReachLimit)
	//		return
	//	}
	//}

	err = service.EditPatientLapseto(&patient, &lapseto)
	if err != nil {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeEditLapsetoFail)
		return
	}

	c.ServeSuccessJSON(map[string]interface{}{
		"msg": "ok",
	})
	return
}

func (c *PatientApiController) GetPatient() {
	id, _ := c.GetInt64("id", 0)
	if id <= 0 {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}

	adminUserInfo := c.GetAdminUserInfo()

	patient, _ := service.FindPatientById(adminUserInfo.CurrentOrgId, id)
	if patient.ID == 0 {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodePatientNoExist)
		return
	}

	infectiousRecord, _ := service.FindLastRecordDate(adminUserInfo.CurrentOrgId, patient.ID, 14)

	infections, _ := service.GetAllInfectionRecord(infectiousRecord.InspectDate, adminUserInfo.CurrentOrgId, patient.ID, infectiousRecord.ProjectId)
	diseases := service.GetPatientDiseases(patient.ID)
	contagions := service.GetPatientContagions(patient.ID)
	c.ServeSuccessJSON(map[string]interface{}{
		"patient":    patient,
		"diseases":   diseases,
		"contagions": contagions,
		"infections": infections,
	})
	return
}

func (c *PatientApiController) CreateDialysisSolution() {

	id, _ := c.GetInt64("patient", 0)
	if id <= 0 {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}

	adminUserInfo := c.GetAdminUserInfo()
	patient, _ := service.FindPatientById(adminUserInfo.CurrentOrgId, id)
	if patient.ID == 0 {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodePatientNoExist)
		return
	}

	var solution models.DialysisSolution

	code := defaultSolutionFormData(&solution, c.Ctx.Input.RequestBody, "create")
	if code > 0 {
		c.ServeFailJSONWithSGJErrorCode(code)
		return
	}

	//thisSolution, _ := service.FindPatientDialysisSolutionByMode(adminUserInfo.CurrentOrgId, id, solution.ModeId)
	//if thisSolution.ID > 0 {
	//	c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDialysisSolutionExist)
	//	return
	//}

	solution.RegistrarsId = adminUserInfo.AdminUser.Id
	solution.Doctor = adminUserInfo.AdminUser.Id
	solution.Status = 1
	solution.PatientId = id
	solution.CreatedTime = time.Now().Unix()
	solution.UserOrgId = adminUserInfo.CurrentOrgId
	solution.UpdatedTime = time.Now().Unix()
	solution.SubName = ""
	solution.ParentId = 0

	err := service.CreatePatientDialysisSolution(&solution)
	if err != nil {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDialysisSolutionCreate)
		return
	}

	c.ServeSuccessJSON(map[string]interface{}{
		"msg":      "ok",
		"solution": solution,
	})
	return
}

func (c *PatientApiController) UpdateDialysisSolution() {
	patient, _ := c.GetInt64("patient", 0)
	id, _ := c.GetInt64("id", 0)
	if id <= 0 || patient <= 0 {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}

	adminUserInfo := c.GetAdminUserInfo()

	solution, _ := service.FindPatientDialysisSolution(adminUserInfo.CurrentOrgId, id)
	if solution.ID == 0 || solution.PatientId != patient {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDialysisSolutionNotExist)
		return
	}

	code := defaultSolutionFormData(&solution, c.Ctx.Input.RequestBody, "edit")
	if code > 0 {
		c.ServeFailJSONWithSGJErrorCode(code)
		return
	}

	solution.UpdatedTime = time.Now().Unix()

	err := service.UpdatePatientDialysisSolution(&solution)
	if err != nil {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDialysisSolutionUpdate)
		return
	}

	c.ServeSuccessJSON(map[string]interface{}{
		"msg":      "ok",
		"solution": solution,
	})
	return
}

func (c *PatientApiController) UpdateDialysisSolutionDetail() {
	patient, _ := c.GetInt64("patient", 0)
	id, _ := c.GetInt64("id", 0)
	if id <= 0 || patient <= 0 {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}

	adminUserInfo := c.GetAdminUserInfo()

	solution, _ := service.FindPatientDialysisSolution(adminUserInfo.CurrentOrgId, id)
	if solution.ID == 0 || solution.PatientId != patient {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDialysisSolutionNotExist)
		return
	}

	code := solutionFormData(&solution, c.Ctx.Input.RequestBody)
	if code > 0 {
		c.ServeFailJSONWithSGJErrorCode(code)
		return
	}

	solution.UpdatedTime = time.Now().Unix()
	solution.AffirmState = 1

	err := service.UpdatePatientDialysisSolution(&solution)
	if err != nil {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDialysisSolutionUpdate)
		return
	}

	c.ServeSuccessJSON(map[string]interface{}{
		"msg":      "ok",
		"solution": solution,
	})
	return
}

func (c *PatientApiController) GetPatientDialysisSolutionList() {
	id, _ := c.GetInt64("id", 0)
	page, _ := c.GetInt64("page", 0)
	limit, _ := c.GetInt64("limit", 0)
	if id <= 0 {
		c.ServeSuccessJSON(map[string]interface{}{
			"solutions": nil,
		})
		return
	}
	if page <= 0 {
		page = 1
	}
	if limit <= 0 {
		limit = 10
	}

	adminUserInfo := c.GetAdminUserInfo()

	solutions, total, _ := service.GetPatientDialysisSolutionList(adminUserInfo.CurrentOrgId, id, page, limit)
	c.ServeSuccessJSON(map[string]interface{}{
		"solutions": solutions,
		"total":     total,
	})
	return
}
func (c *PatientApiController) DeleteDialysisSolution() {

	id, _ := c.GetInt64("id", 0)
	if id <= 0 {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}

	adminUserInfo := c.GetAdminUserInfo()

	solution, _ := service.FindPatientDialysisSolution(adminUserInfo.CurrentOrgId, id)
	if solution.ID == 0 {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDialysisSolutionNotExist)
		return
	}

	if solution.UseState == 1 {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDialysisSolutionUsed)
		return
	}

	solution.UpdatedTime = time.Now().Unix()
	solution.Status = 0

	err := service.DeleteSolution(&solution)
	if err != nil {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDialysisSolutionDelete)
		return
	}

	c.ServeSuccessJSON(map[string]interface{}{
		"msg": "ok",
	})
	return
}

//GetDryWeights 取患者干体重调整铺
func (c *PatientApiController) GetDryWeights() {
	page, _ := c.GetInt64("page", 1)
	limit, _ := c.GetInt64("limit", 10)
	id, _ := c.GetInt64("id", 0)
	if id <= 0 {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}

	adminUserInfo := c.GetAdminUserInfo()

	weights, total, _ := service.GetPatientDryWeightAdjustList(adminUserInfo.CurrentOrgId, id, page, limit)

	c.ServeSuccessJSON(map[string]interface{}{
		"weights": weights,
		"total":   total,
	})
	return

}

func (c *PatientApiController) CreateDryWeights() {
	patient, _ := c.GetInt64("id", 0)
	if patient <= 0 {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}

	adminUserInfo := c.GetAdminUserInfo()
	patientInfo, _ := service.FindPatientById(adminUserInfo.CurrentOrgId, patient)
	if patientInfo.ID == 0 {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodePatientNoExist)
		return
	}

	var theWeight models.DryWeightAdjust

	dataBody := make(map[string]interface{}, 0)
	err := json.Unmarshal(c.Ctx.Input.RequestBody, &dataBody)
	if err != nil {
		utils.ErrorLog(err.Error())
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}

	if dataBody["weight"] == nil || reflect.TypeOf(dataBody["weight"]).String() != "string" {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}
	weight, _ := strconv.ParseFloat(dataBody["weight"].(string), 64)
	theWeight.Weight = weight

	// if dataBody["doctor"] == nil || reflect.TypeOf(dataBody["doctor"]).String() != "float64" {
	// 	c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
	// 	return
	// }
	// doctor := int64(dataBody["doctor"].(float64))
	// theWeight.Doctor = doctor

	if dataBody["remark"] != nil && reflect.TypeOf(dataBody["remark"]).String() == "string" {
		remark, _ := dataBody["remark"].(string)
		theWeight.Remark = remark
	}

	theWeight.CreatedTime = time.Now().Unix()
	theWeight.UpdatedTime = time.Now().Unix()
	theWeight.Status = 1
	theWeight.RegistrarsId = adminUserInfo.AdminUser.Id
	theWeight.UserOrgId = adminUserInfo.CurrentOrgId
	theWeight.PatientId = patient
	theWeight.Doctor = adminUserInfo.AdminUser.Id

	old, _ := service.FindPatientLastDryWeightAdjust(adminUserInfo.CurrentOrgId, patient)
	if old.ID > 0 {
		theWeight.AdjustedValue = theWeight.Weight - old.Weight
	}

	err = service.CreateDryWeightAdjust(&theWeight)
	if err != nil {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeCreateDryWeightFail)
		return
	}

	c.ServeSuccessJSON(map[string]interface{}{
		"msg":    "ok",
		"weight": theWeight,
	})
	return
}

func (c *PatientApiController) CreateGroupAdvice() {
	patient, _ := c.GetInt64("id", 0)
	groupNo, _ := c.GetInt64("groupno", 0)

	if patient <= 0 {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}

	adminUserInfo := c.GetAdminUserInfo()
	patientInfo, _ := service.FindPatientById(adminUserInfo.CurrentOrgId, patient)
	if patientInfo.ID == 0 {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodePatientNoExist)
		return
	}

	dataBody := make(map[string]interface{}, 0)
	err := json.Unmarshal(c.Ctx.Input.RequestBody, &dataBody)
	if err != nil {
		utils.ErrorLog(err.Error())
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}
	utils.ErrorLog("%v", dataBody)

	appRole, _ := service.FindAdminRoleTypeById(adminUserInfo.CurrentOrgId, adminUserInfo.AdminUser.Id, adminUserInfo.CurrentAppId)
	if appRole.UserType == 3 {
		headNursePermission, getPermissionErr := service.GetAdminUserSpecialPermission(adminUserInfo.CurrentOrgId, adminUserInfo.CurrentAppId, adminUserInfo.AdminUser.Id, models.SpecialPermissionTypeHeadNurse)
		if getPermissionErr != nil {
			c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
			return
		} else if headNursePermission == nil {
			c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeCreateAdvice)
			return
		}
	}

	timeLayout := "2006-01-02"
	loc, _ := time.LoadLocation("Local")

	if dataBody["advice_type"] == nil || reflect.TypeOf(dataBody["advice_type"]).String() != "float64" {
		utils.ErrorLog("advice_type")
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}
	adviceType := int64(dataBody["advice_type"].(float64))
	if adviceType != 1 && adviceType != 2 && adviceType != 3 {
		utils.ErrorLog("advice_type != 1&&2")
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}

	if dataBody["advice_date"] == nil || reflect.TypeOf(dataBody["advice_date"]).String() != "string" {
		utils.ErrorLog("advice_date")
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}

	if dataBody["start_time"] == nil || reflect.TypeOf(dataBody["start_time"]).String() != "string" {
		utils.ErrorLog("start_time")
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}

	startTime2, _ := dataBody["start_time"].(string)

	time_arr := strings.Split(startTime2, " ")

	if len(time_arr) > 0 {
		startTime2 = time_arr[0]
	}

	if dataBody["advice_date"] == nil || reflect.TypeOf(dataBody["advice_date"]).String() != "string" {
		utils.ErrorLog("advice_date")
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}
	adviceDate := startTime2
	if len(adviceDate) == 0 {
		utils.ErrorLog("len(adviceDate) == 0")
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}
	theTime, err := time.ParseInLocation(timeLayout, adviceDate, loc)
	if err != nil {
		utils.ErrorLog(err.Error())
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}
	AdviceDate := theTime.Unix()
	RecordDate := theTime.Unix()

	if dataBody["start_time"] == nil || reflect.TypeOf(dataBody["start_time"]).String() != "string" {
		utils.ErrorLog("start_time")
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}
	startTime, _ := dataBody["start_time"].(string)
	if len(startTime) == 0 {
		utils.ErrorLog("len(start_time) == 0")
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}
	theTime, err = time.ParseInLocation(timeLayout+" 15:04", startTime, loc)
	if err != nil {
		utils.ErrorLog(err.Error())
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}
	StartTime := theTime.Unix()

	Remark := ""
	if dataBody["remark"] != nil && reflect.TypeOf(dataBody["remark"]).String() == "string" {
		remark, _ := dataBody["remark"].(string)
		Remark = remark
	}

	var advices []*models.GroupAdvice
	if dataBody["adviceNames"] == nil || reflect.TypeOf(dataBody["adviceNames"]).String() != "[]interface {}" {
		utils.ErrorLog("adviceNames")
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}
	adviceNames := dataBody["adviceNames"].([]interface{})
	for _, adviceNameMap := range adviceNames {
		adviceNameM := adviceNameMap.(map[string]interface{})
		var advice models.GroupAdvice
		advice.Remark = Remark
		advice.AdviceType = adviceType
		advice.StartTime = StartTime
		advice.AdviceDate = AdviceDate

		advice.RecordDate = RecordDate
		advice.Status = 1
		advice.CreatedTime = time.Now().Unix()
		advice.UpdatedTime = time.Now().Unix()
		advice.StopState = 2
		advice.ExecutionState = 2
		advice.UserOrgId = adminUserInfo.CurrentOrgId
		advice.PatientId = patientInfo.ID
		advice.AdviceDoctor = adminUserInfo.AdminUser.Id

		if adviceNameM["advice_name"] == nil || reflect.TypeOf(adviceNameM["advice_name"]).String() != "string" {
			utils.ErrorLog("advice_name")
			c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
			return
		}
		adviceName, _ := adviceNameM["advice_name"].(string)
		if len(adviceName) == 0 {
			utils.ErrorLog("len(advice_name) == 0")
			c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
			return
		}
		advice.AdviceName = adviceName

		if adviceNameM["drug_spec"] != nil && reflect.TypeOf(adviceNameM["drug_spec"]).String() == "string" {
			drugSpec, _ := strconv.ParseFloat(adviceNameM["drug_spec"].(string), 64)
			advice.DrugSpec = drugSpec
		}

		if adviceNameM["advice_desc"] != nil && reflect.TypeOf(adviceNameM["advice_desc"]).String() == "string" {
			adviceDesc, _ := adviceNameM["advice_desc"].(string)
			advice.AdviceDesc = adviceDesc
		}

		if adviceNameM["template_id"] != nil && reflect.TypeOf(adviceNameM["template_id"]).String() == "string" {
			template_id, _ := adviceNameM["template_id"].(string)
			advice.TemplateId = template_id
		}

		if adviceNameM["drug_spec_unit"] != nil && reflect.TypeOf(adviceNameM["drug_spec_unit"]).String() == "string" {
			drugSpecUnit, _ := adviceNameM["drug_spec_unit"].(string)
			advice.DrugSpecUnit = drugSpecUnit
		}

		if adviceNameM["single_dose"] != nil && reflect.TypeOf(adviceNameM["single_dose"]).String() == "string" {
			singleDose, _ := strconv.ParseFloat(adviceNameM["single_dose"].(string), 64)
			advice.SingleDose = singleDose
		}

		if adviceNameM["single_dose_unit"] != nil && reflect.TypeOf(adviceNameM["single_dose_unit"]).String() == "string" {
			singleDoseUnit, _ := adviceNameM["single_dose_unit"].(string)
			advice.SingleDoseUnit = singleDoseUnit
		}

		if adviceNameM["prescribing_number"] != nil && reflect.TypeOf(adviceNameM["prescribing_number"]).String() == "string" {
			prescribingNumber, _ := strconv.ParseFloat(adviceNameM["prescribing_number"].(string), 64)
			advice.PrescribingNumber = prescribingNumber
		}

		if adviceNameM["prescribing_number_unit"] != nil && reflect.TypeOf(adviceNameM["prescribing_number_unit"]).String() == "string" {
			prescribingNumberUnit, _ := adviceNameM["prescribing_number_unit"].(string)
			advice.PrescribingNumberUnit = prescribingNumberUnit
		}
		if adviceNameM["delivery_way"] != nil && reflect.TypeOf(adviceNameM["delivery_way"]).String() == "string" {
			deliveryWay, _ := adviceNameM["delivery_way"].(string)
			advice.DeliveryWay = deliveryWay
		}

		if adviceNameM["execution_frequency"] != nil && reflect.TypeOf(adviceNameM["execution_frequency"]).String() == "string" {
			executionFrequency, _ := adviceNameM["execution_frequency"].(string)
			advice.ExecutionFrequency = executionFrequency
		}

		if adviceType == 1 {

			if adviceNameM["frequency_type"] != nil || reflect.TypeOf(adviceNameM["frequency_type"]).String() == "float64" {
				frequency_type := int64(adviceNameM["frequency_type"].(float64))
				advice.FrequencyType = frequency_type
			}

			if adviceNameM["day_count"] != nil || reflect.TypeOf(adviceNameM["day_count"]).String() == "string" {
				day_count, _ := strconv.ParseInt(adviceNameM["day_count"].(string), 10, 64)
				advice.DayCount = day_count
			}

			if adviceNameM["week_days"] != nil && reflect.TypeOf(adviceNameM["week_days"]).String() == "string" {
				week_day, _ := adviceNameM["week_days"].(string)
				advice.WeekDay = week_day
			}
		}

		if adviceNameM["children"] != nil && reflect.TypeOf(adviceNameM["children"]).String() == "string" {
			executionFrequency, _ := adviceNameM["execution_frequency"].(string)
			advice.ExecutionFrequency = executionFrequency
		}

		if adviceNameM["children"] != nil && reflect.TypeOf(adviceNameM["children"]).String() == "[]interface {}" {
			children := adviceNameM["children"].([]interface{})
			if len(children) > 0 {
				for _, childrenMap := range children {
					childMap := childrenMap.(map[string]interface{})
					var child models.GroupAdvice
					child.Remark = Remark
					child.AdviceType = adviceType
					child.StartTime = StartTime
					child.AdviceDate = AdviceDate
					child.RecordDate = RecordDate
					child.Status = 1
					child.CreatedTime = time.Now().Unix()
					child.UpdatedTime = time.Now().Unix()
					child.StopState = 2
					child.ExecutionState = 2
					child.UserOrgId = adminUserInfo.CurrentOrgId
					child.PatientId = patientInfo.ID
					child.AdviceDoctor = adminUserInfo.AdminUser.Id

					if childMap["advice_name"] == nil || reflect.TypeOf(childMap["advice_name"]).String() != "string" {
						utils.ErrorLog("child advice_name")
						c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
						return
					}
					childAdviceName, _ := childMap["advice_name"].(string)
					if len(childAdviceName) == 0 {
						utils.ErrorLog("len(child advice_name) == 0")
						c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
						return
					}
					child.AdviceName = childAdviceName

					if childMap["advice_desc"] != nil && reflect.TypeOf(childMap["advice_desc"]).String() == "string" {
						childAdviceDesc, _ := childMap["advice_desc"].(string)
						child.AdviceDesc = childAdviceDesc
					}

					if childMap["drug_spec"] != nil && reflect.TypeOf(childMap["drug_spec"]).String() == "string" {
						childDrugSpec, _ := strconv.ParseFloat(childMap["drug_spec"].(string), 64)
						child.DrugSpec = childDrugSpec
					}

					if childMap["drug_spec_unit"] != nil && reflect.TypeOf(childMap["drug_spec_unit"]).String() == "string" {
						childDrugSpecUnit, _ := childMap["drug_spec_unit"].(string)
						child.DrugSpecUnit = childDrugSpecUnit
					}

					if childMap["single_dose"] != nil && reflect.TypeOf(childMap["single_dose"]).String() == "string" {
						childSingleDose, _ := strconv.ParseFloat(childMap["single_dose"].(string), 64)
						child.SingleDose = childSingleDose
					}

					if childMap["single_dose_unit"] != nil && reflect.TypeOf(childMap["single_dose_unit"]).String() == "string" {
						childSingleDoseUnit, _ := childMap["single_dose_unit"].(string)
						child.SingleDoseUnit = childSingleDoseUnit
					}

					if childMap["prescribing_number"] != nil && reflect.TypeOf(childMap["prescribing_number"]).String() == "string" {
						childPrescribingNumber, _ := strconv.ParseFloat(childMap["prescribing_number"].(string), 64)
						child.PrescribingNumber = childPrescribingNumber
					}

					if childMap["prescribing_number_unit"] != nil && reflect.TypeOf(childMap["prescribing_number_unit"]).String() == "string" {
						childPrescribingNumberUnit, _ := childMap["prescribing_number_unit"].(string)
						child.PrescribingNumberUnit = childPrescribingNumberUnit
					}

					child.DeliveryWay = advice.DeliveryWay
					child.ExecutionFrequency = advice.ExecutionFrequency
					advice.Children = append(advice.Children, &child)
				}
			}
		}

		advices = append(advices, &advice)
	}

	list, err := service.CreateMGroupAdvice(adminUserInfo.CurrentOrgId, advices, groupNo)

	if err != nil {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeCreateDoctorAdviceFail)
		return
	}

	c.ServeSuccessJSON(map[string]interface{}{
		"msg":     "ok",
		"advices": list,
	})

	return
}

func (c *PatientApiController) CreateDoctorAdvice() {
	patient, _ := c.GetInt64("id", 0)
	if patient <= 0 {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}

	adminUserInfo := c.GetAdminUserInfo()

	patientInfo, _ := service.FindPatientById(adminUserInfo.CurrentOrgId, patient)
	if patientInfo.ID == 0 {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodePatientNoExist)
		return
	}

	appRole, _ := service.FindAdminRoleTypeById(adminUserInfo.CurrentOrgId, adminUserInfo.AdminUser.Id, adminUserInfo.CurrentAppId)

	if appRole.UserType == 3 {
		headNursePermission, getPermissionErr := service.GetAdminUserSpecialPermission(adminUserInfo.CurrentOrgId, adminUserInfo.CurrentAppId, adminUserInfo.AdminUser.Id, models.SpecialPermissionTypeHeadNurse)
		if getPermissionErr != nil {
			c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
			return
		} else if headNursePermission == nil {
			c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeCreateAdvice)
			return
		}
	}

	var advice models.DoctorAdvice
	code := adviceFormData(&advice, c.Ctx.Input.RequestBody, "create")
	if code > 0 {
		c.ServeFailJSONWithSGJErrorCode(code)
		return
	}

	if advice.ParentId > 0 {
		old, _ := service.FindDoctorAdvice(adminUserInfo.CurrentOrgId, advice.ParentId)
		if old.ID == 0 || old.PatientId != patient {
			c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParentAdviceNotExist)
			return
		}

		if old.StopState == 1 || old.ExecutionState == 1 {
			c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeAdviceStoped)
			return
		}

		if old.ParentId > 0 {
			advice.ParentId = old.ParentId
		}
		advice.StartTime = old.StartTime
		advice.AdviceDoctor = old.AdviceDoctor
		advice.DeliveryWay = old.DeliveryWay
		advice.ExecutionFrequency = old.ExecutionFrequency
		advice.GroupNo = old.GroupNo
	}

	advice.Status = 1
	advice.CreatedTime = time.Now().Unix()
	advice.UpdatedTime = time.Now().Unix()
	advice.StopState = 2
	advice.ExecutionState = 2
	advice.UserOrgId = adminUserInfo.CurrentOrgId
	advice.PatientId = patient
	advice.AdviceDoctor = adminUserInfo.AdminUser.Id

	err := service.CreateDoctorAdvice(&advice)
	if err != nil {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeCreateDoctorAdviceFail)
		return
	}

	c.ServeSuccessJSON(map[string]interface{}{
		"msg":    "ok",
		"advice": advice,
	})
	return
}

func (c *PatientApiController) ExecGroupAdvice() {
	groupNo, _ := c.GetInt64("groupno", 0)
	executionTime := c.GetString("execution_time")

	if groupNo <= 0 {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}

	if len(executionTime) <= 0 {
		utils.ErrorLog("execution_time")
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}

	adminUserInfo := c.GetAdminUserInfo()

	advice, _ := service.FindDoctorAdviceByGroupNo(adminUserInfo.CurrentOrgId, groupNo)
	if advice.ID == 0 {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDoctorAdviceNotExist)
		return
	}

	if advice.ExecutionState == 1 {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeAdviceExced)
		return
	}

	executionStaff := adminUserInfo.AdminUser.Id
	// checker := adminUserInfo.AdminUser.Id

	timeLayout := "2006-01-02 15:04:05"
	loc, _ := time.LoadLocation("Local")

	theTime, err := time.ParseInLocation(timeLayout, executionTime, loc)
	if err != nil {
		utils.ErrorLog(err.Error())
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}

	if advice.StartTime > theTime.Unix() {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeAdviceExceBeforeStart)
		return
	}

	exceAdvice := models.DoctorAdvice{
		ExecutionStaff: executionStaff,
		ExecutionTime:  theTime.Unix(),
		// Checker:        checker,
		UpdatedTime: time.Now().Unix(),
	}
	err = service.ExceDoctorAdviceByGroupNo(&exceAdvice, groupNo, adminUserInfo.CurrentOrgId)
	if err != nil {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeUpdateDoctorAdviceFail)
		return
	}

	advice.ExecutionStaff = executionStaff
	advice.ExecutionTime = theTime.Unix()
	// advice.Checker = checker

	c.ServeSuccessJSON(map[string]interface{}{
		"msg":    "ok",
		"advice": advice,
	})
	return
}

func (c *PatientApiController) ExecDoctorAdvice() {
	patient, _ := c.GetInt64("patient", 0)
	id, _ := c.GetInt64("id", 0)
	executionTime := c.GetString("execution_time")

	if id <= 0 || patient <= 0 {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}

	if len(executionTime) <= 0 {
		utils.ErrorLog("execution_time")
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return

	}

	adminUserInfo := c.GetAdminUserInfo()

	advice, _ := service.FindDoctorAdvice(adminUserInfo.CurrentOrgId, id)
	if advice.ID == 0 || advice.PatientId != patient {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDoctorAdviceNotExist)
		return
	}

	if advice.ExecutionState == 1 {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeAdviceExced)
		return
	}

	executionStaff := adminUserInfo.AdminUser.Id
	// checker := adminUserInfo.AdminUser.Id

	timeLayout := "2006-01-02 15:04:05"
	loc, _ := time.LoadLocation("Local")

	theTime, err := time.ParseInLocation(timeLayout, executionTime, loc)
	if err != nil {
		utils.ErrorLog(err.Error())
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}
	if advice.StartTime > theTime.Unix() {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}

	exceAdvice := models.DoctorAdvice{
		ExecutionStaff: executionStaff,
		ExecutionTime:  theTime.Unix(),
		// Checker:        checker,
		UpdatedTime: time.Now().Unix(),
	}
	if advice.ParentId > 0 {
		err = service.ExceDoctorAdviceById(&exceAdvice, advice.ParentId, patient)
	} else {
		err = service.ExceDoctorAdviceById(&exceAdvice, id, patient)
	}

	if err != nil {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeUpdateDoctorAdviceFail)
		return
	}

	advice.ExecutionStaff = executionStaff
	advice.ExecutionTime = theTime.Unix()
	// advice.Checker = checker

	c.ServeSuccessJSON(map[string]interface{}{
		"msg":    "ok",
		"advice": advice,
	})
	return
}

func (c *PatientApiController) CheckGroupAdvice() {
	groupno, _ := c.GetInt64("groupno", 0)

	if groupno <= 0 {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}

	adminUserInfo := c.GetAdminUserInfo()

	advice, _ := service.FindDoctorAdviceByGroupNo(adminUserInfo.CurrentOrgId, groupno)
	if advice.ID == 0 {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDoctorAdviceNotExist)
		return
	}

	if advice.CheckState == 1 {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeAdviceChecked)
		return
	}

	if advice.ExecutionStaff >= 0 && advice.ExecutionStaff == adminUserInfo.AdminUser.Id {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeExceAndCheckNotOneUser)
		return
	}

	checker := adminUserInfo.AdminUser.Id

	theTime := time.Now()

	exceAdvice := models.DoctorAdvice{
		Checker:     checker,
		CheckTime:   theTime.Unix(),
		UpdatedTime: time.Now().Unix(),
	}
	var err error
	err = service.CheckDoctorAdviceByGroupNo(&exceAdvice, groupno, adminUserInfo.CurrentOrgId)

	if err != nil {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeUpdateDoctorAdviceFail)
		return
	}

	// advice.ExecutionStaff = executionStaff
	// advice.ExecutionTime = theTime.Unix()
	advice.Checker = checker
	advice.CheckTime = theTime.Unix()

	c.ServeSuccessJSON(map[string]interface{}{
		"msg":    "ok",
		"advice": advice,
	})
	return
}

func (c *PatientApiController) CheckDoctorAdvice() {
	patient, _ := c.GetInt64("patient", 0)
	id, _ := c.GetInt64("id", 0)
	// executionTime := c.GetString("execution_time")

	if id <= 0 || patient <= 0 {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}

	adminUserInfo := c.GetAdminUserInfo()

	advice, _ := service.FindDoctorAdvice(adminUserInfo.CurrentOrgId, id)
	if advice.ID == 0 || advice.PatientId != patient {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDoctorAdviceNotExist)
		return
	}

	if advice.CheckState == 1 {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeAdviceChecked)
		return
	}

	if advice.ExecutionStaff >= 0 && advice.ExecutionStaff == adminUserInfo.AdminUser.Id {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeExceAndCheckNotOneUser)
		return
	}

	// executionStaff := adminUserInfo.AdminUser.Id
	checker := adminUserInfo.AdminUser.Id

	// timeLayout := "2006-01-02 15:04:05"
	// loc, _ := time.LoadLocation("Local")

	// theTime, err := time.ParseInLocation(timeLayout, executionTime, loc)
	// if err != nil {
	// 	utils.ErrorLog(err.Error())
	// 	c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
	// 	return
	// }

	theTime := time.Now()

	if advice.ExecutionTime > theTime.Unix() {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeAdviceExceBeforeStart)
		return
	}
	exceAdvice := models.DoctorAdvice{
		Checker:     checker,
		CheckTime:   theTime.Unix(),
		UpdatedTime: time.Now().Unix(),
	}
	var err error
	if advice.ParentId > 0 {
		err = service.CheckDoctorAdviceById(&exceAdvice, advice.ParentId, patient)
	} else {
		err = service.CheckDoctorAdviceById(&exceAdvice, id, patient)
	}

	if err != nil {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeUpdateDoctorAdviceFail)
		return
	}

	// advice.ExecutionStaff = executionStaff
	// advice.ExecutionTime = theTime.Unix()
	advice.Checker = checker
	advice.CheckTime = theTime.Unix()

	c.ServeSuccessJSON(map[string]interface{}{
		"msg":    "ok",
		"advice": advice,
	})
	return
}

func (c *PatientApiController) UpdateDoctorAdvice() {
	patient, _ := c.GetInt64("patient", 0)
	id, _ := c.GetInt64("id", 0)
	if id <= 0 || patient <= 0 {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}

	adminUserInfo := c.GetAdminUserInfo()

	advice, _ := service.FindDoctorAdvice(adminUserInfo.CurrentOrgId, id)
	if advice.ID == 0 || advice.PatientId != patient {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDoctorAdviceNotExist)
		return
	}

	//if advice.AdviceType == 1 {
	//	c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeLongTimeAdviceNotCanntEdit)
	//	return
	//}
	if advice.StopState == 1 || advice.ExecutionState == 1 {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeAdviceStoped)
		return
	}

	//appRole, _ := service.FindAdminRoleTypeById(adminUserInfo.CurrentOrgId, adminUserInfo.AdminUser.Id, adminUserInfo.CurrentAppId)

	//if appRole.UserType == 3 {
	//	headNursePermission, getPermissionErr := service.GetAdminUserSpecialPermission(adminUserInfo.CurrentOrgId, adminUserInfo.CurrentAppId, adminUserInfo.AdminUser.Id, models.SpecialPermissionTypeHeadNurse)
	//	if getPermissionErr != nil {
	//		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
	//		return
	//	} else if headNursePermission == nil {
	//		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDialysisPermissionDeniedModify)
	//		return
	//	}
	//}

	//if advice.AdviceDoctor != adminUserInfo.AdminUser.Id {
	//	c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeCanotEditOtherAdvice)
	//	return
	//}

	code := adviceFormData(&advice, c.Ctx.Input.RequestBody, "update")
	if code > 0 {
		c.ServeFailJSONWithSGJErrorCode(code)
		return
	}

	advice.UpdatedTime = time.Now().Unix()
	advice.Modifier = adminUserInfo.AdminUser.Id

	err := service.UpdateDoctorAdvice(&advice)
	if err != nil {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeUpdateDoctorAdviceFail)
		return
	}

	c.ServeSuccessJSON(map[string]interface{}{
		"msg":    "ok",
		"advice": advice,
	})
	return
}

func (c *PatientApiController) StopGroupAdvice() {
	groupNo, _ := c.GetInt64("groupno", 0)
	if groupNo <= 0 {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}

	adminUserInfo := c.GetAdminUserInfo()

	advice, _ := service.FindDoctorAdviceByGoroupNo(adminUserInfo.CurrentOrgId, groupNo)
	if advice.ID == 0 {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDoctorAdviceNotExist)
		return
	}
	if advice.StopState == 1 || advice.ExecutionState == 1 {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeAdviceStoped)
		return
	}

	dataBody := make(map[string]interface{}, 0)
	err := json.Unmarshal(c.Ctx.Input.RequestBody, &dataBody)
	if err != nil {
		utils.ErrorLog(err.Error())
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}

	if dataBody["stop_time"] == nil || reflect.TypeOf(dataBody["stop_time"]).String() != "string" {
		utils.ErrorLog("stop_time")
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}
	stopTime, _ := dataBody["stop_time"].(string)
	if len(stopTime) == 0 {
		utils.ErrorLog("len(stop_time) == 0")
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}
	timeLayout := "2006-01-02"
	loc, _ := time.LoadLocation("Local")
	theTime, err := time.ParseInLocation(timeLayout+" 15:04:05", stopTime, loc)
	if err != nil {
		utils.ErrorLog(err.Error())
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}
	advice.StopTime = theTime.Unix()

	if dataBody["stop_reason"] != nil && reflect.TypeOf(dataBody["stop_reason"]).String() == "string" {
		stopReason, _ := dataBody["stop_reason"].(string)
		advice.StopReason = stopReason
	}

	advice.UpdatedTime = time.Now().Unix()
	advice.StopDoctor = adminUserInfo.AdminUser.Id
	advice.StopState = 1

	err = service.StopGroupAdvice(adminUserInfo.CurrentOrgId, groupNo, &advice)
	if err != nil {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeStopAdviceFail)
		return
	}

	c.ServeSuccessJSON(map[string]interface{}{
		"msg": "ok",
	})
	return
}

func (c *PatientApiController) StopDoctorAdvice() {
	id, _ := c.GetInt64("id", 0)
	if id <= 0 {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}

	adminUserInfo := c.GetAdminUserInfo()

	//appRole, _ := service.FindAdminRoleTypeById(adminUserInfo.CurrentOrgId, adminUserInfo.AdminUser.Id, adminUserInfo.CurrentAppId)
	//
	//if appRole.UserType == 3 {
	//	headNursePermission, getPermissionErr := service.GetAdminUserSpecialPermission(adminUserInfo.CurrentOrgId, adminUserInfo.CurrentAppId, adminUserInfo.AdminUser.Id, models.SpecialPermissionTypeHeadNurse)
	//	if getPermissionErr != nil {
	//		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
	//		return
	//	} else if headNursePermission == nil {
	//		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDialysisPermissionDeniedModify)
	//		return
	//	}
	//}

	advice, _ := service.FindDoctorAdvice(adminUserInfo.CurrentOrgId, id)
	if advice.ID == 0 {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDoctorAdviceNotExist)
		return
	}
	if advice.StopState == 1 || advice.ExecutionState == 1 {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeAdviceStoped)
		return
	}

	dataBody := make(map[string]interface{}, 0)
	err := json.Unmarshal(c.Ctx.Input.RequestBody, &dataBody)
	if err != nil {
		utils.ErrorLog(err.Error())
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}

	if dataBody["stop_time"] == nil || reflect.TypeOf(dataBody["stop_time"]).String() != "string" {
		utils.ErrorLog("stop_time")
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}
	stopTime, _ := dataBody["stop_time"].(string)
	if len(stopTime) == 0 {
		utils.ErrorLog("len(stop_time) == 0")
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}
	timeLayout := "2006-01-02"
	loc, _ := time.LoadLocation("Local")
	theTime, err := time.ParseInLocation(timeLayout+" 15:04:05", stopTime, loc)
	if err != nil {
		utils.ErrorLog(err.Error())
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}
	advice.StopTime = theTime.Unix()

	if dataBody["stop_reason"] != nil && reflect.TypeOf(dataBody["stop_reason"]).String() == "string" {
		stopReason, _ := dataBody["stop_reason"].(string)
		advice.StopReason = stopReason
	}

	advice.UpdatedTime = time.Now().Unix()
	advice.StopDoctor = adminUserInfo.AdminUser.Id
	advice.StopState = 1

	err = service.StopDoctorAdvice(&advice)
	if err != nil {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeStopAdviceFail)
		return
	}

	c.ServeSuccessJSON(map[string]interface{}{
		"msg":    "ok",
		"advice": advice,
	})
	return
}

func (c *PatientApiController) DeleteDoctorAdvice() {
	id, _ := c.GetInt64("id", 0)
	if id <= 0 {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}

	adminUserInfo := c.GetAdminUserInfo()

	advice, _ := service.FindDoctorAdvice(adminUserInfo.CurrentOrgId, id)
	if advice.ID == 0 {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDoctorAdviceNotExist)
		return
	}

	//if !adminUserInfo.AdminUser.IsSuperAdmin && advice.AdviceDoctor != adminUserInfo.AdminUser.Id {
	//	c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDialysisPermissionDeniedModify)
	//	return
	//}

	//appRole, _ := service.FindAdminRoleTypeById(adminUserInfo.CurrentOrgId, adminUserInfo.AdminUser.Id, adminUserInfo.CurrentAppId)
	//
	//if appRole.UserType == 3 {
	//	headNursePermission, getPermissionErr := service.GetAdminUserSpecialPermission(adminUserInfo.CurrentOrgId, adminUserInfo.CurrentAppId, adminUserInfo.AdminUser.Id, models.SpecialPermissionTypeHeadNurse)
	//	if getPermissionErr != nil {
	//		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
	//		return
	//	} else if headNursePermission == nil {
	//		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDialysisPermissionDeniedModify)
	//		return
	//	}
	//}

	advice.UpdatedTime = time.Now().Unix()
	advice.Status = 0
	advice.Modifier = adminUserInfo.AdminUser.Id

	err := service.DeleteDoctorAdvice(&advice)
	if err != nil {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDeleteAdviceFail)
		return
	}

	c.ServeSuccessJSON(map[string]interface{}{
		"msg": "ok",
	})
	return
}

func (c *PatientApiController) DeleteGroupAdvice() {
	groupNo, _ := c.GetInt64("groupno", 0)
	if groupNo <= 0 {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}

	adminUserInfo := c.GetAdminUserInfo()

	advice, _ := service.FindDoctorAdviceByGroupNo(adminUserInfo.CurrentOrgId, groupNo)
	if advice.ID == 0 {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDoctorAdviceNotExist)
		return
	}

	//appRole, _ := service.FindAdminRoleTypeById(adminUserInfo.CurrentOrgId, adminUserInfo.AdminUser.Id, adminUserInfo.CurrentAppId)
	//if appRole.UserType == 3 {
	//	headNursePermission, getPermissionErr := service.GetAdminUserSpecialPermission(adminUserInfo.CurrentOrgId, adminUserInfo.CurrentAppId, adminUserInfo.AdminUser.Id, models.SpecialPermissionTypeHeadNurse)
	//	if getPermissionErr != nil {
	//		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
	//		return
	//	} else if headNursePermission == nil {
	//		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDialysisPermissionDeniedModify)
	//		return
	//	}
	//}

	err := service.DeleteGroupAdvice(adminUserInfo.CurrentOrgId, groupNo, adminUserInfo.AdminUser.Id)
	if err != nil {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDeleteAdviceFail)
		return
	}

	c.ServeSuccessJSON(map[string]interface{}{
		"msg": "ok",
	})
	return
}

//GetDoctorAdvices 医嘱列表
func (c *PatientApiController) GetDoctorAdvices() {
	id, _ := c.GetInt64("id", 0)
	adviceType, _ := c.GetInt64("advice_type", 0)
	stopType, _ := c.GetInt64("stop_state", 0)
	startTime := c.GetString("start_time", "")
	endTime := c.GetString("end_time", "")
	keywords := c.GetString("keywords", "")

	adminUserInfo := c.GetAdminUserInfo()

	operatorIDs := make([]int64, 0)

	timeLayout := "2006-01-02"
	loc, _ := time.LoadLocation("Local")

	var theStartTIme int64
	if len(startTime) > 0 {
		theTime, err := time.ParseInLocation(timeLayout+" 15:04:05", startTime+" 00:00:00", loc)
		if err != nil {
			utils.ErrorLog(err.Error())
			c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
			return
		}
		theStartTIme = theTime.Unix()
	}
	var theEndtTIme int64
	if len(endTime) > 0 {
		theTime, err := time.ParseInLocation(timeLayout+" 15:04:05", endTime+" 23:59:59", loc)
		if err != nil {
			utils.ErrorLog(err.Error())
			c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
			return
		}
		theEndtTIme = theTime.Unix()
	}

	advices, total, _ := service.GetDoctorAdviceList(adminUserInfo.CurrentOrgId, id, adviceType, stopType, theStartTIme, theEndtTIme, keywords)
	if len(advices) > 0 {
		for _, item := range advices {
			if item.AdviceDoctor > 0 {
				operatorIDs = append(operatorIDs, item.AdviceDoctor)
			}
			if item.ExecutionStaff > 0 {
				operatorIDs = append(operatorIDs, item.ExecutionStaff)
			}
			if item.Checker > 0 {
				operatorIDs = append(operatorIDs, item.Checker)
			}
			if item.StopDoctor > 0 {
				operatorIDs = append(operatorIDs, item.StopDoctor)
			}
		}
	}

	//相关操作对应的操作人
	operators, _ := service.GetAdminUserES(adminUserInfo.CurrentOrgId, adminUserInfo.CurrentAppId, operatorIDs)

	c.ServeSuccessJSON(map[string]interface{}{
		"advices":   advices,
		"operators": operators,
		"total":     total,
	})
	return

}

func (c *PatientApiController) GetPatientSchedules() {
	id, _ := c.GetInt64("id", 0)
	if id <= 0 {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}

	adminUserInfo := c.GetAdminUserInfo()
	todayTime := time.Now().Format("2006-01-02")

	timeLayout := "2006-01-02 15:04:05"
	loc, _ := time.LoadLocation("Local")

	var theStartTime int64
	theTime, _ := time.ParseInLocation(timeLayout, todayTime+" 00:00:00", loc)
	theStartTime = theTime.Unix()

	schedules, _ := service.GetPatientScheduleFormToday(adminUserInfo.CurrentOrgId, id, theStartTime)
	if len(schedules) > 0 {
		for index, item := range schedules {
			_, week := time.Unix(item.ScheduleDate, 0).ISOWeek()
			schedules[index].Week = int64(week)
		}
	}

	c.ServeSuccessJSON(map[string]interface{}{
		"schedules": schedules,
	})
	return
}

func (c *PatientApiController) GetPatientDialysisRecords() {
	patientID, _ := c.GetInt64("patient_id", 0)
	page, _ := c.GetInt64("page", 0)
	limit, _ := c.GetInt64("limit", 0)
	startTime := c.GetString("start_time", "")
	endTime := c.GetString("end_time", "")
	mode_id, _ := c.GetInt64("mode_id", 0)

	if page <= 0 {
		page = 1
	}
	if limit <= 0 {
		limit = 10
	}
	if patientID <= 0 {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}

	timeLayout := "2006-01-02"
	loc, _ := time.LoadLocation("Local")

	var theStartTIme int64
	if len(startTime) > 0 {
		theTime, err := time.ParseInLocation(timeLayout+" 15:04:05", startTime+" 00:00:00", loc)
		if err != nil {
			theStartTIme = 0
		}
		theStartTIme = theTime.Unix()
	}
	var theEndtTIme int64
	if len(endTime) > 0 {
		theTime, err := time.ParseInLocation(timeLayout+" 15:04:05", endTime+" 23:59:59", loc)
		if err != nil {
			theEndtTIme = 0
		}
		theEndtTIme = theTime.Unix()
	}

	adminInfo := c.GetAdminUserInfo()
	records, total, _ := service.GetPatientDialysisRecord(adminInfo.CurrentOrgId, patientID, page, limit, theStartTIme, theEndtTIme, mode_id)

	c.ServeSuccessJSON(map[string]interface{}{
		"total":   total,
		"records": records,
	})
	return
}

func (c *PatientApiController) ProEducation() {
	patientID, _ := c.GetInt64("patient_id", 0)
	page, _ := c.GetInt64("page", 0)
	limit, _ := c.GetInt64("limit", 0)
	startTime := c.GetString("start_time", "")
	endTime := c.GetString("end_time", "")

	if page <= 0 {
		page = 1
	}
	if limit <= 0 {
		limit = 10
	}
	if patientID <= 0 {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}

	timeLayout := "2006-01-02"
	loc, _ := time.LoadLocation("Local")

	var theStartTIme int64
	if len(startTime) > 0 {
		theTime, err := time.ParseInLocation(timeLayout+" 15:04:05", startTime+" 00:00:00", loc)
		if err != nil {
			theStartTIme = 0
		}
		theStartTIme = theTime.Unix()
	}
	var theEndtTIme int64
	if len(endTime) > 0 {
		theTime, err := time.ParseInLocation(timeLayout+" 15:04:05", endTime+" 23:59:59", loc)
		if err != nil {
			theEndtTIme = 0
		}
		theEndtTIme = theTime.Unix()
	}

	adminInfo := c.GetAdminUserInfo()
	edus, total, _ := service.GetPatientTreatmentSummaryList(adminInfo.CurrentOrgId, patientID, page, limit, theStartTIme, theEndtTIme)

	c.ServeSuccessJSON(map[string]interface{}{
		"total": total,
		"edus":  edus,
	})
	return
}

func adviceFormData(advice *models.DoctorAdvice, data []byte, action string) (code int) {
	dataBody := make(map[string]interface{}, 0)
	err := json.Unmarshal(data, &dataBody)
	if err != nil {
		utils.ErrorLog(err.Error())
		code = enums.ErrorCodeParamWrong
		return
	}

	timeLayout := "2006-01-02"
	loc, _ := time.LoadLocation("Local")
	isChild := false

	if action == "create" {
		if dataBody["advice_type"] == nil || reflect.TypeOf(dataBody["advice_type"]).String() != "float64" {
			utils.ErrorLog("advice_type")
			code = enums.ErrorCodeParamWrong
			return
		}
		adviceType := int64(dataBody["advice_type"].(float64))
		if adviceType != 1 && adviceType != 2 && adviceType != 3 {
			utils.ErrorLog("advice_type != 1&&2")
			code = enums.ErrorCodeParamWrong
			return
		}
		advice.AdviceType = adviceType

		if dataBody["advice_date"] == nil || reflect.TypeOf(dataBody["advice_date"]).String() != "string" {
			utils.ErrorLog("advice_date")
			code = enums.ErrorCodeParamWrong
			return
		}
		adviceDate, _ := dataBody["advice_date"].(string)
		if len(adviceDate) == 0 {
			utils.ErrorLog("len(adviceDate) == 0")
			code = enums.ErrorCodeParamWrong
			return
		}
		theTime, err := time.ParseInLocation(timeLayout, adviceDate, loc)
		if err != nil {
			utils.ErrorLog(err.Error())
			code = enums.ErrorCodeParamWrong
			return
		}
		advice.AdviceDate = theTime.Unix()
		advice.RecordDate = theTime.Unix()

		if dataBody["parent_id"] != nil && reflect.TypeOf(dataBody["parent_id"]).String() == "float64" {
			parentId := int64(dataBody["parent_id"].(float64))
			advice.ParentId = parentId
			if parentId > 0 {
				isChild = true
			}
		}
	}

	if !isChild {
		if dataBody["start_time"] == nil || reflect.TypeOf(dataBody["start_time"]).String() != "string" {
			utils.ErrorLog("start_time")
			code = enums.ErrorCodeParamWrong
			return
		}
		startTime, _ := dataBody["start_time"].(string)
		if len(startTime) == 0 {
			utils.ErrorLog("len(start_time) == 0")
			code = enums.ErrorCodeParamWrong
			return
		}
		theTime, err := time.ParseInLocation(timeLayout+" 15:04", startTime, loc)
		if err != nil {
			utils.ErrorLog(err.Error())
			code = enums.ErrorCodeParamWrong
			return
		}
		advice.StartTime = theTime.Unix()

		// if dataBody["advice_doctor"] == nil || reflect.TypeOf(dataBody["advice_doctor"]).String() != "float64" {
		// 	utils.ErrorLog("advice_doctor")
		// 	code = enums.ErrorCodeParamWrong
		// 	return
		// }
		// adviceDoctor := int64(dataBody["advice_doctor"].(float64))
		// if adviceDoctor <= 0 {
		// 	utils.ErrorLog("advice_doctor <=0")
		// 	code = enums.ErrorCodeParamWrong
		// 	return
		// }
		// advice.AdviceDoctor = adviceDoctor

		if dataBody["delivery_way"] != nil && reflect.TypeOf(dataBody["delivery_way"]).String() == "string" {
			deliveryWay, _ := dataBody["delivery_way"].(string)
			advice.DeliveryWay = deliveryWay
		}

		if dataBody["execution_frequency"] != nil && reflect.TypeOf(dataBody["execution_frequency"]).String() == "string" {
			executionFrequency, _ := dataBody["execution_frequency"].(string)
			advice.ExecutionFrequency = executionFrequency
		}

		if advice.AdviceType == 1 && advice.ParentId == 0 {

			if dataBody["frequency_type"] != nil || reflect.TypeOf(dataBody["frequency_type"]).String() == "float64" {
				frequency_type := int64(dataBody["frequency_type"].(float64))
				advice.FrequencyType = frequency_type
			}

			if dataBody["day_count"] != nil || reflect.TypeOf(dataBody["day_count"]).String() == "string" {
				day_count, _ := strconv.ParseInt(dataBody["day_count"].(string), 10, 64)
				advice.DayCount = day_count
			}

			if dataBody["week_days"] != nil && reflect.TypeOf(dataBody["week_days"]).String() == "string" {
				week_day, _ := dataBody["week_days"].(string)
				advice.WeekDay = week_day
			}
		}

	}

	if dataBody["advice_name"] == nil || reflect.TypeOf(dataBody["advice_name"]).String() != "string" {
		utils.ErrorLog("advice_name")
		code = enums.ErrorCodeParamWrong
		return
	}
	adviceName, _ := dataBody["advice_name"].(string)
	if len(adviceName) == 0 {
		utils.ErrorLog("len(advice_name) == 0")
		code = enums.ErrorCodeParamWrong
		return
	}
	advice.AdviceName = adviceName

	if dataBody["advice_desc"] != nil && reflect.TypeOf(dataBody["advice_desc"]).String() == "string" {
		adviceDsc, _ := dataBody["advice_desc"].(string)
		advice.AdviceDesc = adviceDsc
	}

	if dataBody["dialysis_order_id"] != nil && reflect.TypeOf(dataBody["dialysis_order_id"]).String() == "float64" {
		dialysisOrderId, _ := dataBody["dialysis_order_id"].(float64)
		advice.DialysisOrderId = int64(dialysisOrderId)
	}

	if dataBody["single_dose"] != nil && reflect.TypeOf(dataBody["single_dose"]).String() == "string" {
		singleDose, _ := strconv.ParseFloat(dataBody["single_dose"].(string), 64)
		advice.SingleDose = singleDose
	}

	if dataBody["single_dose_unit"] != nil && reflect.TypeOf(dataBody["single_dose_unit"]).String() == "string" {
		singleDoseUnit, _ := dataBody["single_dose_unit"].(string)
		advice.SingleDoseUnit = singleDoseUnit
	}

	if dataBody["drug_spec"] != nil && reflect.TypeOf(dataBody["drug_spec"]).String() == "string" {
		drugSpec, _ := strconv.ParseFloat(dataBody["drug_spec"].(string), 64)
		advice.DrugSpec = drugSpec
	}

	if dataBody["drug_spec_unit"] != nil && reflect.TypeOf(dataBody["drug_spec_unit"]).String() == "string" {
		drugSpecUnit, _ := dataBody["drug_spec_unit"].(string)
		advice.DrugSpecUnit = drugSpecUnit
	}

	if dataBody["prescribing_number"] != nil && reflect.TypeOf(dataBody["prescribing_number"]).String() == "string" {
		prescribingNumber, _ := strconv.ParseFloat(dataBody["prescribing_number"].(string), 64)
		advice.PrescribingNumber = prescribingNumber
	}

	if dataBody["prescribing_number_unit"] != nil && reflect.TypeOf(dataBody["prescribing_number_unit"]).String() == "string" {
		prescribingNumberUnit, _ := dataBody["prescribing_number_unit"].(string)
		advice.PrescribingNumberUnit = prescribingNumberUnit
	}

	if dataBody["remark"] != nil && reflect.TypeOf(dataBody["remark"]).String() == "string" {
		remark, _ := dataBody["remark"].(string)
		advice.Remark = remark
	}

	return
}

func solutionFormData(solution *models.DialysisSolution, data []byte) (code int) {
	dataBody := make(map[string]interface{}, 0)
	err := json.Unmarshal(data, &dataBody)
	utils.InfoLog(string(data))
	if err != nil {
		utils.ErrorLog(err.Error())
		code = enums.ErrorCodeParamWrong
		return
	}

	if dataBody["dialysis_duration"] != nil && reflect.TypeOf(dataBody["dialysis_duration"]).String() == "string" {
		dialysisDuration, _ := strconv.ParseFloat(dataBody["dialysis_duration"].(string), 64)
		solution.DialysisDuration = dialysisDuration
	}

	if dataBody["replacement_way"] != nil && reflect.TypeOf(dataBody["replacement_way"]).String() == "float64" {
		replacementWay := int64(dataBody["replacement_way"].(float64))
		solution.ReplacementWay = replacementWay
	}

	if dataBody["blood_flow_volume"] != nil && reflect.TypeOf(dataBody["blood_flow_volume"]).String() == "string" {
		bloodFlowVolume, _ := strconv.ParseFloat(dataBody["blood_flow_volume"].(string), 64)
		solution.BloodFlowVolume = bloodFlowVolume
	}

	if dataBody["hemodialysis_machine"] != nil && reflect.TypeOf(dataBody["hemodialysis_machine"]).String() == "float64" {
		hemodialysisMachine := int64(dataBody["hemodialysis_machine"].(float64))
		solution.HemodialysisMachine = hemodialysisMachine
	}

	if dataBody["blood_filter"] != nil && reflect.TypeOf(dataBody["blood_filter"]).String() == "float64" {
		bloodFilter := int64(dataBody["blood_filter"].(float64))
		solution.BloodFilter = bloodFilter
	}

	if dataBody["perfusion_apparatus"] != nil && reflect.TypeOf(dataBody["perfusion_apparatus"]).String() == "float64" {
		perfusionApparatus := int64(dataBody["perfusion_apparatus"].(float64))
		solution.PerfusionApparatus = perfusionApparatus
	}

	if dataBody["dialysate_flow"] != nil && reflect.TypeOf(dataBody["dialysate_flow"]).String() == "string" {
		dialysateFlow, _ := strconv.ParseFloat(dataBody["dialysate_flow"].(string), 64)
		solution.DialysateFlow = dialysateFlow
	}

	if dataBody["kalium"] != nil && reflect.TypeOf(dataBody["kalium"]).String() == "string" {
		kalium, _ := strconv.ParseFloat(dataBody["kalium"].(string), 64)
		solution.Kalium = kalium
	}

	if dataBody["sodium"] != nil && reflect.TypeOf(dataBody["sodium"]).String() == "string" {
		sodium, _ := strconv.ParseFloat(dataBody["sodium"].(string), 64)
		solution.Sodium = sodium
	}

	if dataBody["calcium"] != nil && reflect.TypeOf(dataBody["calcium"]).String() == "string" {
		calcium, _ := strconv.ParseFloat(dataBody["calcium"].(string), 64)
		solution.Calcium = calcium
	}

	if dataBody["bicarbonate"] != nil && reflect.TypeOf(dataBody["bicarbonate"]).String() == "string" {
		bicarbonate, _ := strconv.ParseFloat(dataBody["bicarbonate"].(string), 64)
		solution.Bicarbonate = bicarbonate
	}

	if dataBody["anticoagulant"] != nil && reflect.TypeOf(dataBody["anticoagulant"]).String() == "float64" {
		anticoagulant := int64(dataBody["anticoagulant"].(float64))
		solution.Anticoagulant = anticoagulant
	}

	if dataBody["anticoagulant_shouji"] != nil && reflect.TypeOf(dataBody["anticoagulant_shouji"]).String() == "string" {
		anticoagulantShouji, _ := strconv.ParseFloat(dataBody["anticoagulant_shouji"].(string), 64)
		solution.AnticoagulantShouji = anticoagulantShouji
	}

	if dataBody["anticoagulant_weichi"] != nil && reflect.TypeOf(dataBody["anticoagulant_weichi"]).String() == "string" {
		anticoagulantWeichi, _ := strconv.ParseFloat(dataBody["anticoagulant_weichi"].(string), 64)
		solution.AnticoagulantWeichi = anticoagulantWeichi
	}

	if dataBody["anticoagulant_zongliang"] != nil && reflect.TypeOf(dataBody["anticoagulant_zongliang"]).String() == "string" {
		anticoagulantZongliang, _ := strconv.ParseFloat(dataBody["anticoagulant_zongliang"].(string), 64)
		solution.AnticoagulantZongliang = anticoagulantZongliang
	}

	if dataBody["anticoagulant_gaimingcheng"] != nil && reflect.TypeOf(dataBody["anticoagulant_gaimingcheng"]).String() == "string" {
		anticoagulantGaimingcheng, _ := dataBody["anticoagulant_gaimingcheng"].(string)
		solution.AnticoagulantGaimingcheng = anticoagulantGaimingcheng
	}

	if dataBody["anticoagulant_gaijiliang"] != nil && reflect.TypeOf(dataBody["anticoagulant_gaijiliang"]).String() == "string" {
		anticoagulantGaijiliang, _ := dataBody["anticoagulant_gaijiliang"].(string)
		solution.AnticoagulantGaijiliang = anticoagulantGaijiliang
	}

	return
}

func defaultSolutionFormData(solution *models.DialysisSolution, data []byte, method string) (code int) {
	dataBody := make(map[string]interface{}, 0)
	err := json.Unmarshal(data, &dataBody)
	utils.InfoLog(string(data))
	if err != nil {
		utils.ErrorLog(err.Error())
		code = enums.ErrorCodeParamWrong
		return
	}

	if method == "create" {
		if dataBody["mode"] == nil || reflect.TypeOf(dataBody["mode"]).String() != "float64" {
			utils.ErrorLog("mode")
			code = enums.ErrorCodeParamWrong
			return
		}
		mode := int64(dataBody["mode"].(float64))
		if mode <= 0 {
			utils.ErrorLog("mode <= 0")
			code = enums.ErrorCodeParamWrong
			return
		}
		solution.ModeId = mode

		if dataBody["mode_name"] == nil || reflect.TypeOf(dataBody["mode_name"]).String() != "string" {
			utils.ErrorLog("mode_name")
			code = enums.ErrorCodeParamWrong
			return
		}
		modeName, _ := dataBody["mode_name"].(string)
		if len(modeName) == 0 {
			utils.ErrorLog("len(mode_name) == 0")
			code = enums.ErrorCodeParamWrong
			return
		}
		solution.ModeName = modeName
		solution.Name = modeName

	}

	if dataBody["dialysis_duration"] != nil && reflect.TypeOf(dataBody["dialysis_duration"]).String() == "string" {
		dialysisDuration, _ := strconv.ParseFloat(dataBody["dialysis_duration"].(string), 64)
		solution.DialysisDuration = dialysisDuration
	}

	if dataBody["target_ultrafiltration"] != nil && reflect.TypeOf(dataBody["target_ultrafiltration"]).String() == "string" {
		targetUltrafiltration, _ := strconv.ParseFloat(dataBody["target_ultrafiltration"].(string), 64)
		solution.TargetUltrafiltration = targetUltrafiltration
	}

	if dataBody["dialysate_formulation"] != nil && reflect.TypeOf(dataBody["dialysate_formulation"]).String() == "float64" {
		dialysateFormulation := int64(dataBody["dialysate_formulation"].(float64))
		solution.DialysateFormulation = dialysateFormulation
	}

	if dataBody["dialysis_duration_hour"] != nil && reflect.TypeOf(dataBody["dialysis_duration_hour"]).String() == "string" {
		dialysisDurationHour, _ := strconv.ParseFloat(dataBody["dialysis_duration_hour"].(string), 64)
		solution.DialysisDurationHour = int64(dialysisDurationHour)
	}

	if dataBody["dialysis_duration_minute"] != nil && reflect.TypeOf(dataBody["dialysis_duration_minute"]).String() == "string" {
		dialysisDurationMinute, _ := strconv.ParseFloat(dataBody["dialysis_duration_minute"].(string), 64)
		solution.DialysisDurationMinute = int64(dialysisDurationMinute)
	}

	if dataBody["hemodialysis_machine"] != nil && reflect.TypeOf(dataBody["hemodialysis_machine"]).String() == "float64" {
		hemodialysisMachine := int64(dataBody["hemodialysis_machine"].(float64))
		solution.HemodialysisMachine = hemodialysisMachine
	}
	if dataBody["dialyzer"] != nil && reflect.TypeOf(dataBody["dialyzer"]).String() == "float64" {
		dialyzer := int64(dataBody["dialyzer"].(float64))
		solution.Dialyzer = dialyzer
	}

	if dataBody["perfusion_apparatus"] != nil && reflect.TypeOf(dataBody["perfusion_apparatus"]).String() == "float64" {
		perfusionApparatus := int64(dataBody["perfusion_apparatus"].(float64))
		solution.PerfusionApparatus = perfusionApparatus
	}

	if dataBody["blood_flow_volume"] != nil && reflect.TypeOf(dataBody["blood_flow_volume"]).String() == "string" {
		bloodFlowVolume, _ := strconv.ParseFloat(dataBody["blood_flow_volume"].(string), 64)
		solution.BloodFlowVolume = bloodFlowVolume
	}

	if dataBody["dewater"] != nil && reflect.TypeOf(dataBody["dewater"]).String() == "string" {
		dewater, _ := strconv.ParseFloat(dataBody["dewater"].(string), 64)
		solution.Dewater = dewater
	}

	if dataBody["displace_liqui"] != nil && reflect.TypeOf(dataBody["displace_liqui"]).String() == "string" {
		displaceLiqui, _ := strconv.ParseFloat(dataBody["displace_liqui"].(string), 64)
		solution.DisplaceLiqui = displaceLiqui
	}

	if dataBody["replacement_way"] != nil && reflect.TypeOf(dataBody["replacement_way"]).String() == "float64" {
		replacementWay := int64(dataBody["replacement_way"].(float64))
		solution.ReplacementWay = replacementWay
	}

	if dataBody["anticoagulant"] != nil && reflect.TypeOf(dataBody["anticoagulant"]).String() == "float64" {
		anticoagulant := int64(dataBody["anticoagulant"].(float64))
		solution.Anticoagulant = anticoagulant
	}

	if dataBody["anticoagulant_shouji"] != nil && reflect.TypeOf(dataBody["anticoagulant_shouji"]).String() == "string" {
		anticoagulantShouji, _ := strconv.ParseFloat(dataBody["anticoagulant_shouji"].(string), 64)
		solution.AnticoagulantShouji = anticoagulantShouji
	}

	if dataBody["anticoagulant_weichi"] != nil && reflect.TypeOf(dataBody["anticoagulant_weichi"]).String() == "string" {
		anticoagulantWeichi, _ := strconv.ParseFloat(dataBody["anticoagulant_weichi"].(string), 64)
		solution.AnticoagulantWeichi = anticoagulantWeichi
	}

	if dataBody["anticoagulant_zongliang"] != nil && reflect.TypeOf(dataBody["anticoagulant_zongliang"]).String() == "string" {
		anticoagulantZongliang, _ := strconv.ParseFloat(dataBody["anticoagulant_zongliang"].(string), 64)
		solution.AnticoagulantZongliang = anticoagulantZongliang
	}

	if dataBody["anticoagulant_gaimingcheng"] != nil && reflect.TypeOf(dataBody["anticoagulant_gaimingcheng"]).String() == "string" {
		anticoagulantGaimingcheng, _ := dataBody["anticoagulant_gaimingcheng"].(string)
		solution.AnticoagulantGaimingcheng = anticoagulantGaimingcheng
	}

	if dataBody["anticoagulant_gaijiliang"] != nil && reflect.TypeOf(dataBody["anticoagulant_gaijiliang"]).String() == "string" {
		anticoagulantGaijiliang, _ := dataBody["anticoagulant_gaijiliang"].(string)
		solution.AnticoagulantGaijiliang = anticoagulantGaijiliang
	}

	if dataBody["kalium"] != nil && reflect.TypeOf(dataBody["kalium"]).String() == "string" {
		kalium, _ := strconv.ParseFloat(dataBody["kalium"].(string), 64)
		solution.Kalium = kalium
	}

	if dataBody["sodium"] != nil && reflect.TypeOf(dataBody["sodium"]).String() == "string" {
		sodium, _ := strconv.ParseFloat(dataBody["sodium"].(string), 64)
		solution.Sodium = sodium
	}

	if dataBody["calcium"] != nil && reflect.TypeOf(dataBody["calcium"]).String() == "string" {
		calcium, _ := strconv.ParseFloat(dataBody["calcium"].(string), 64)
		solution.Calcium = calcium
	}

	if dataBody["bicarbonate"] != nil && reflect.TypeOf(dataBody["bicarbonate"]).String() == "string" {
		bicarbonate, _ := strconv.ParseFloat(dataBody["bicarbonate"].(string), 64)
		solution.Bicarbonate = bicarbonate
	}

	if dataBody["glucose"] != nil && reflect.TypeOf(dataBody["glucose"]).String() == "string" {
		glucose, _ := strconv.ParseFloat(dataBody["glucose"].(string), 64)
		solution.Glucose = glucose
	}

	// if dataBody["dry_weight"] != nil && reflect.TypeOf(dataBody["dry_weight"]).String() == "string" {
	// 	dryWeight, _ := strconv.ParseFloat(dataBody["dry_weight"].(string), 64)
	// 	solution.DryWeight = dryWeight
	// }

	if dataBody["dialysate_flow"] != nil && reflect.TypeOf(dataBody["dialysate_flow"]).String() == "string" {
		dialysateFlow, _ := strconv.ParseFloat(dataBody["dialysate_flow"].(string), 64)
		solution.DialysateFlow = dialysateFlow
	}

	if dataBody["dialysate_temperature"] != nil && reflect.TypeOf(dataBody["dialysate_temperature"]).String() == "string" {
		dialysateTemperature, _ := strconv.ParseFloat(dataBody["dialysate_temperature"].(string), 64)
		solution.DialysateTemperature = dialysateTemperature
	}

	if dataBody["conductivity"] != nil && reflect.TypeOf(dataBody["conductivity"]).String() == "string" {
		conductivity, _ := strconv.ParseFloat(dataBody["conductivity"].(string), 64)
		solution.Conductivity = conductivity
	}

	if dataBody["replacement_total"] != nil && reflect.TypeOf(dataBody["replacement_total"]).String() == "string" {
		replacementTotal, _ := strconv.ParseFloat(dataBody["replacement_total"].(string), 64)
		solution.ReplacementTotal = replacementTotal
	}

	if dataBody["dialyzer_perfusion_apparatus"] != nil && reflect.TypeOf(dataBody["dialyzer_perfusion_apparatus"]).String() == "string" {
		dialyzer_perfusion_apparatus := dataBody["dialyzer_perfusion_apparatus"].(string)
		solution.DialyzerPerfusionApparatus = dialyzer_perfusion_apparatus
	}

	if dataBody["body_fluid"] != nil && reflect.TypeOf(dataBody["body_fluid"]).String() == "float64" {
		body_fluid := int64(dataBody["body_fluid"].(float64))
		solution.BodyFluid = body_fluid
	}

	if dataBody["body_fluid_other"] != nil && reflect.TypeOf(dataBody["body_fluid_other"]).String() == "string" {
		body_fluid_other := dataBody["body_fluid_other"].(string)
		solution.BodyFluidOther = body_fluid_other
	}

	if dataBody["special_medicine"] != nil && reflect.TypeOf(dataBody["special_medicine"]).String() == "float64" {
		special_medicine := int64(dataBody["special_medicine"].(float64))
		solution.SpecialMedicine = special_medicine
	}

	if dataBody["special_medicine_other"] != nil && reflect.TypeOf(dataBody["special_medicine_other"]).String() == "string" {
		special_medicine_other := dataBody["special_medicine_other"].(string)
		solution.SpecialMedicineOther = special_medicine_other
	}

	if dataBody["displace_liqui_part"] != nil && reflect.TypeOf(dataBody["displace_liqui_part"]).String() == "float64" {
		displace_liqui_part := int64(dataBody["displace_liqui_part"].(float64))
		solution.DisplaceLiquiPart = displace_liqui_part
	}
	if dataBody["displace_liqui_value"] != nil && reflect.TypeOf(dataBody["displace_liqui_value"]).String() == "string" {
		displace_liqui_value, _ := strconv.ParseFloat(dataBody["displace_liqui_value"].(string), 64)
		solution.DisplaceLiquiValue = displace_liqui_value
	}
	if dataBody["blood_access"] != nil && reflect.TypeOf(dataBody["blood_access"]).String() == "float64" {
		blood_access := int64(dataBody["blood_access"].(float64))
		solution.BloodAccess = blood_access
	}

	if dataBody["ultrafiltration"] != nil && reflect.TypeOf(dataBody["ultrafiltration"]).String() == "string" {
		ultrafiltration, _ := strconv.ParseFloat(dataBody["ultrafiltration"].(string), 64)
		solution.Ultrafiltration = ultrafiltration
	}

	if dataBody["target_ktv"] != nil && reflect.TypeOf(dataBody["target_ktv"]).String() == "string" {
		target_ktv, _ := strconv.ParseFloat(dataBody["target_ktv"].(string), 64)
		solution.TargetKtv = target_ktv
	}

	if dataBody["remark"] != nil && reflect.TypeOf(dataBody["remark"]).String() == "string" {
		remark := dataBody["remark"].(string)
		solution.Remark = remark
	}

	return
}

func childSolutionFormData(solution *models.DialysisSolution, data []byte, method string) (code int) {
	dataBody := make(map[string]interface{}, 0)
	err := json.Unmarshal(data, &dataBody)
	utils.InfoLog(string(data))
	if err != nil {
		utils.ErrorLog(err.Error())
		code = enums.ErrorCodeParamWrong
		return
	}

	if method == "create" {

		if dataBody["parent_id"] == nil || reflect.TypeOf(dataBody["parent_id"]).String() != "float64" {
			utils.ErrorLog("parent_id")
			code = enums.ErrorCodeParamWrong
			return
		}
		parentID := int64(dataBody["parent_id"].(float64))
		if parentID <= 0 {
			utils.ErrorLog("parentID <= 0")
			code = enums.ErrorCodeParamWrong
			return
		}
		solution.ParentId = parentID

		if dataBody["sub_name"] == nil || reflect.TypeOf(dataBody["sub_name"]).String() != "string" {
			utils.ErrorLog("sub_name")
			code = enums.ErrorCodeParamWrong
			return
		}
		subName, _ := dataBody["sub_name"].(string)
		if len(subName) == 0 {
			utils.ErrorLog("len(sub_name) == 0")
			code = enums.ErrorCodeParamWrong
			return
		}
		solution.SubName = subName
	}

	if dataBody["initiate_mode"] == nil || reflect.TypeOf(dataBody["initiate_mode"]).String() != "float64" {
		utils.ErrorLog("initiate_mode")
		code = enums.ErrorCodeParamWrong
		return
	}
	initiateMode := int64(dataBody["initiate_mode"].(float64))
	if initiateMode != 1 && initiateMode != 2 {
		utils.ErrorLog("initiateMode != 1 && initiateMode != 2")
		code = enums.ErrorCodeParamWrong
		return
	}
	solution.InitiateMode = initiateMode

	if dataBody["doctor"] == nil || reflect.TypeOf(dataBody["doctor"]).String() != "float64" {
		utils.ErrorLog("doctor")
		code = enums.ErrorCodeParamWrong
		return
	}
	doctor := int64(dataBody["doctor"].(float64))
	if doctor <= 0 {
		utils.ErrorLog("doctor <= 0")
		code = enums.ErrorCodeParamWrong
		return
	}
	solution.Doctor = doctor

	return
}

func patientFormData(patient *models.Patients, data []byte, method string) (contagions []int64, diseases []int64, code int, formItems []*models.FormItem) {
	patientBody := make(map[string]interface{}, 0)
	err := json.Unmarshal(data, &patientBody)

	if err != nil {
		utils.ErrorLog(err.Error())
		code = enums.ErrorCodeParamWrong
		return
	}

	if patientBody["formItem"] != nil && reflect.TypeOf(patientBody["formItem"]).String() == "[]interface {}" {
		formItem, _ := patientBody["formItem"].([]interface{})

		if len(formItem) > 0 {
			for _, item := range formItem {
				items := item.(map[string]interface{})
				project_name, _ := items["project_name"].(string)
				fmt.Println(project_name)

				range_type := int64(items["range_type"].(float64))
				fmt.Println(range_type)

				project_id := int64(items["project_id"].(float64))
				fmt.Println(project_id)

				item_id := int64(items["item_id"].(float64))
				fmt.Println(item_id)

				item, _ := items["item"].(string)
				fmt.Println(items["item"].(string))

				item_name, _ := items["item_name"].(string)
				fmt.Println(item_name)

				value, _ := items["value"].(string)
				fmt.Println(items["value"].(string))

				var form models.FormItem
				form.ProjectName = project_name
				form.RangeType = range_type
				form.ProjectId = project_id
				form.ItemId = item_id
				form.Item = item
				form.ItemName = item_name
				form.Value = value
				formItems = append(formItems, &form)
			}
		}
	}
	if patientBody["avatar"] == nil || reflect.TypeOf(patientBody["avatar"]).String() != "string" {
		utils.ErrorLog("avatar")
		code = enums.ErrorCodeParamWrong
		return
	}
	avatar, _ := patientBody["avatar"].(string)

	if len(avatar) == 0 {
		utils.ErrorLog("len(avatar) == 0")
		code = enums.ErrorCodeParamWrong
		return
	}
	patient.Avatar = avatar

	if patientBody["name"] == nil || reflect.TypeOf(patientBody["name"]).String() != "string" {
		utils.ErrorLog("name")
		code = enums.ErrorCodeParamWrong
		return
	}
	name, _ := patientBody["name"].(string)
	if len(name) == 0 {
		utils.ErrorLog("len(name) == 0")
		code = enums.ErrorCodeParamWrong
		return
	}
	patient.Name = name

	if patientBody["alias"] != nil && reflect.TypeOf(patientBody["alias"]).String() == "string" {
		alias := patientBody["alias"].(string)
		patient.Alias = alias
	}

	if patientBody["nation"] != nil && reflect.TypeOf(patientBody["nation"]).String() == "string" {
		nation := patientBody["nation"].(string)
		patient.Nation = nation
	}
	if patientBody["native_place"] != nil && reflect.TypeOf(patientBody["native_place"]).String() == "string" {
		native_place := patientBody["native_place"].(string)
		patient.NativePlace = native_place
	}

	if patientBody["idCardNo"] == nil || reflect.TypeOf(patientBody["idCardNo"]).String() != "string" {
		utils.ErrorLog("idCardNo")
		code = enums.ErrorCodeParamWrong
		return
	}
	idCardNo, _ := patientBody["idCardNo"].(string)
	if len(idCardNo) == 0 {
		utils.ErrorLog("len(idCardNo) == 0")
		code = enums.ErrorCodeParamWrong
		return
	}
	patient.IdCardNo = idCardNo

	patient.PatientType = 1

	if patientBody["dialysisNo"] == nil || reflect.TypeOf(patientBody["dialysisNo"]).String() != "string" {
		utils.ErrorLog("dialysisNo")
		code = enums.ErrorCodeParamWrong
		return
	}
	dialysisNo, _ := patientBody["dialysisNo"].(string)
	if len(dialysisNo) == 0 {
		utils.ErrorLog("len(dialysisNo) == 0")
		code = enums.ErrorCodeParamWrong
		return
	}
	patient.DialysisNo = dialysisNo
	// }

	if patientBody["lapseto"] == nil || reflect.TypeOf(patientBody["lapseto"]).String() != "float64" {
		utils.ErrorLog("lapseto")
		code = enums.ErrorCodeParamWrong
		return
	}
	lapseto := int64(patientBody["lapseto"].(float64))
	if lapseto <= 0 {
		utils.ErrorLog("lapseto == 0")
		code = enums.ErrorCodeParamWrong
		return
	}
	patient.Lapseto = lapseto

	if patientBody["gender"] == nil || reflect.TypeOf(patientBody["gender"]).String() != "float64" {
		utils.ErrorLog("gender")
		code = enums.ErrorCodeParamWrong
		return
	}
	gender := int64(patientBody["gender"].(float64))
	if gender <= 0 {
		utils.ErrorLog("gender <= 0")
		code = enums.ErrorCodeParamWrong
		return
	}
	patient.Gender = gender

	if patientBody["response_result"] != nil && reflect.TypeOf(patientBody["response_result"]).String() == "string" {
		response_result := patientBody["response_result"].(string)
		patient.ResponseResult = response_result
	}

	if patientBody["age"] == nil || reflect.TypeOf(patientBody["age"]).String() != "float64" {
		utils.ErrorLog("age")
		code = enums.ErrorCodeParamWrong
		return
	}
	age := int64(patientBody["age"].(float64))
	patient.Age = age

	timeLayout := "2006-01-02"
	loc, _ := time.LoadLocation("Local")

	if patientBody["birth"] == nil || reflect.TypeOf(patientBody["birth"]).String() != "string" {
		utils.ErrorLog("birth")
		code = enums.ErrorCodeParamWrong
		return
	}
	birth, _ := patientBody["birth"].(string)
	if len(birth) == 0 {
		utils.ErrorLog("len(birth) == 0")
		code = enums.ErrorCodeParamWrong
		return
	}
	birthTime, err := time.ParseInLocation(timeLayout, birth, loc)
	if err != nil {
		utils.ErrorLog("birthTime")
		code = enums.ErrorCodeParamWrong
		return
	}
	patient.Birthday = birthTime.Unix()

	if patientBody["height"] != nil && reflect.TypeOf(patientBody["height"]).String() == "string" {
		height, _ := strconv.ParseInt(patientBody["height"].(string), 10, 64)
		patient.Height = height
	}

	if patientBody["maritalStatus"] != nil && reflect.TypeOf(patientBody["maritalStatus"]).String() == "float64" {
		maritalStatus := int64(patientBody["maritalStatus"].(float64))
		patient.MaritalStatus = maritalStatus
	}

	if patientBody["children"] != nil && reflect.TypeOf(patientBody["children"]).String() == "string" {
		children, _ := strconv.ParseInt(patientBody["children"].(string), 10, 64)
		patient.Children = children
	}

	if patientBody["admissionNumber"] != nil && reflect.TypeOf(patientBody["admissionNumber"]).String() == "string" {
		admissionNumber, _ := patientBody["admissionNumber"].(string)
		patient.AdmissionNumber = admissionNumber
	}

	if patientBody["reimbursementWayID"] != nil && reflect.TypeOf(patientBody["reimbursementWayID"]).String() == "float64" {
		reimbursementWayID := int64(patientBody["reimbursementWayID"].(float64))
		patient.ReimbursementWayId = reimbursementWayID
	}

	if patientBody["healthCareNo"] != nil && reflect.TypeOf(patientBody["healthCareNo"]).String() == "string" {
		healthCareNo := patientBody["healthCareNo"].(string)
		patient.HealthCareNo = healthCareNo
	}

	if patientBody["phone"] == nil || reflect.TypeOf(patientBody["phone"]).String() != "string" {
		utils.ErrorLog("phone")
		code = enums.ErrorCodeParamWrong
		return
	}
	phone := patientBody["phone"].(string)
	if len(phone) == 0 {
		utils.ErrorLog("len(phone) == 0")
		code = enums.ErrorCodeParamWrong
		return
	}
	if !utils.CheckMobile(phone) {
		utils.ErrorLog("!phone")
		code = enums.ErrorCodeMobileFormat
		return
	}
	patient.Phone = phone

	if patientBody["homeTelephone"] != nil && reflect.TypeOf(patientBody["homeTelephone"]).String() == "string" {
		homeTelephone := patientBody["homeTelephone"].(string)
		patient.HomeTelephone = homeTelephone
	}

	if patientBody["relative_phone"] != nil && reflect.TypeOf(patientBody["relative_phone"]).String() == "string" {
		relativePhone := patientBody["relative_phone"].(string)
		patient.RelativePhone = relativePhone
	}

	if patientBody["relative_relations"] != nil && reflect.TypeOf(patientBody["relative_relations"]).String() == "string" {
		relativeRelations := patientBody["relative_relations"].(string)
		patient.RelativeRelations = relativeRelations
	}

	if patientBody["homeAddress"] != nil && reflect.TypeOf(patientBody["homeAddress"]).String() == "string" {
		homeAddress := patientBody["homeAddress"].(string)
		patient.HomeAddress = homeAddress
	}

	if patientBody["work"] != nil && reflect.TypeOf(patientBody["work"]).String() == "string" {
		work := patientBody["work"].(string)
		patient.WorkUnit = work
	}

	if patientBody["unit_address"] != nil && reflect.TypeOf(patientBody["unit_address"]).String() == "string" {
		unitAddress := patientBody["unit_address"].(string)
		patient.UnitAddress = unitAddress
	}

	if patientBody["profession"] != nil && reflect.TypeOf(patientBody["profession"]).String() == "float64" {
		profession := int64(patientBody["profession"].(float64))
		patient.Profession = profession
	}

	if patientBody["education"] != nil && reflect.TypeOf(patientBody["education"]).String() == "float64" {
		education := int64(patientBody["education"].(float64))
		patient.EducationLevel = education
	}

	if patientBody["source"] == nil || reflect.TypeOf(patientBody["source"]).String() != "float64" {
		utils.ErrorLog("source")
		code = enums.ErrorCodeParamWrong
		return
	}
	source := int64(patientBody["source"].(float64))
	if source <= 0 {
		utils.ErrorLog("source <= 0")
		code = enums.ErrorCodeParamWrong
		return
	}
	patient.Source = source

	if patientBody["is_hospital_first_dialysis"] != nil && reflect.TypeOf(patientBody["is_hospital_first_dialysis"]).String() == "float64" {
		isHospitalFirstDialysis := int64(patientBody["is_hospital_first_dialysis"].(float64))
		patient.IsHospitalFirstDialysis = isHospitalFirstDialysis
	}

	if patientBody["firstDialysisDate"] != nil && reflect.TypeOf(patientBody["firstDialysisDate"]).String() == "string" {
		firstDialysisDate := patientBody["firstDialysisDate"].(string)
		firstDialysisDateTime, err := time.ParseInLocation(timeLayout, firstDialysisDate, loc)
		if err == nil {
			patient.FirstDialysisDate = firstDialysisDateTime.Unix()
		}
	}

	if patientBody["first_dialysis_hospital"] != nil && reflect.TypeOf(patientBody["first_dialysis_hospital"]).String() == "string" {
		firstDialysisHospital := patientBody["first_dialysis_hospital"].(string)
		patient.FirstDialysisHospital = firstDialysisHospital
	}

	if patientBody["predialysis_condition"] != nil && reflect.TypeOf(patientBody["predialysis_condition"]).String() == "[]interface {}" {
		thePredialysisCondition, _ := patientBody["predialysis_condition"].([]interface{})
		if len(thePredialysisCondition) > 0 {
			conditions := make([]string, 0)
			for _, item := range thePredialysisCondition {
				if reflect.TypeOf(item).String() != "string" {
					continue
				}
				condition := item.(string)
				if len(condition) > 0 {
					conditions = append(conditions, condition)
				}
			}
			patient.PredialysisCondition = strings.Join(conditions, ",")
		}
	}

	if patientBody["pre_hospital_dialysis_frequency"] != nil && reflect.TypeOf(patientBody["pre_hospital_dialysis_frequency"]).String() == "string" {
		preHospitalDialysisFrequency := patientBody["pre_hospital_dialysis_frequency"].(string)
		patient.PreHospitalDialysisFrequency = preHospitalDialysisFrequency
	}

	if patientBody["pre_hospital_dialysis_times"] != nil && reflect.TypeOf(patientBody["pre_hospital_dialysis_times"]).String() == "string" {
		preHospitalDialysisTimes, _ := strconv.ParseInt(patientBody["pre_hospital_dialysis_times"].(string), 10, 64)
		patient.PreHospitalDialysisTimes = preHospitalDialysisTimes
	}
	if patientBody["hospital_first_dialysis_date"] != nil && reflect.TypeOf(patientBody["hospital_first_dialysis_date"]).String() == "string" {
		hospitalFirstDialysisDate := patientBody["hospital_first_dialysis_date"].(string)
		hospitalFirstDialysisDateTime, err := time.ParseInLocation(timeLayout, hospitalFirstDialysisDate, loc)
		if err == nil {
			patient.HospitalFirstDialysisDate = hospitalFirstDialysisDateTime.Unix()
		}
	}

	if patientBody["partition"] != nil && reflect.TypeOf(patientBody["partition"]).String() == "float64" {
		partition := int64(patientBody["partition"].(float64))
		patient.PartitionId = partition
	}
	if patientBody["bed"] != nil && reflect.TypeOf(patientBody["bed"]).String() == "string" {
		bed, _ := strconv.ParseInt(patientBody["bed"].(string), 10, 64)
		patient.BedId = bed
	}

	if patientBody["healthCareDueDate"] != nil && reflect.TypeOf(patientBody["healthCareDueDate"]).String() == "string" {
		healthCareDueDate := patientBody["healthCareDueDate"].(string)
		healthCareDueDateTime, err := time.ParseInLocation(timeLayout, healthCareDueDate, loc)
		if err == nil {
			patient.HealthCareDueDate = healthCareDueDateTime.Unix()
		}
	}

	if patientBody["blood"] != nil && reflect.TypeOf(patientBody["blood"]).String() == "float64" {
		blood := int64(patientBody["blood"].(float64))
		patient.BloodType = blood
	}

	if patientBody["rh"] != nil && reflect.TypeOf(patientBody["rh"]).String() == "float64" {
		rh := int64(patientBody["rh"].(float64))
		patient.Rh = rh
	}

	if patientBody["healthCareDueAlertDate"] != nil && reflect.TypeOf(patientBody["healthCareDueAlertDate"]).String() == "string" {
		healthCareDueAlertDate := patientBody["healthCareDueAlertDate"].(string)
		healthCareDueAlertDateTime, err := time.ParseInLocation(timeLayout, healthCareDueAlertDate, loc)
		if err == nil {
			patient.HealthCareDueAlertDate = healthCareDueAlertDateTime.Unix()
		}
	}

	if patientBody["receivingDate"] != nil && reflect.TypeOf(patientBody["receivingDate"]).String() == "string" {
		receivingDate := patientBody["receivingDate"].(string)
		receivingDateTime, err := time.ParseInLocation(timeLayout, receivingDate, loc)
		if err == nil {
			patient.ReceivingDate = receivingDateTime.Unix()
		}
	}

	if patientBody["induction"] != nil && reflect.TypeOf(patientBody["induction"]).String() == "float64" {
		induction := int64(patientBody["induction"].(float64))
		patient.InductionPeriod = induction
	}

	if patientBody["initial"] != nil && reflect.TypeOf(patientBody["initial"]).String() == "string" {
		initial, _ := strconv.ParseInt(patientBody["initial"].(string), 10, 64)
		patient.InitialDialysis = initial
	}

	if patientBody["dialysisTotal"] != nil && reflect.TypeOf(patientBody["dialysisTotal"]).String() == "string" {
		dialysisTotal, _ := strconv.ParseInt(patientBody["dialysisTotal"].(string), 10, 64)
		patient.TotalDialysis = dialysisTotal
	}

	if patientBody["contagions"] != nil && reflect.TypeOf(patientBody["contagions"]).String() == "[]interface {}" {
		thisContagions, _ := patientBody["contagions"].([]interface{})
		if len(thisContagions) > 0 {
			for _, item := range thisContagions {
				if reflect.TypeOf(item).String() != "float64" {
					continue
				}
				contagion := int64(item.(float64))
				if contagion > 0 {
					contagions = append(contagions, contagion)
				}
			}
		}
	}

	if patientBody["doctor"] != nil && reflect.TypeOf(patientBody["doctor"]).String() == "float64" {
		doctor := int64(patientBody["doctor"].(float64))
		patient.AttendingDoctorId = doctor
	}

	if patientBody["nurse"] != nil && reflect.TypeOf(patientBody["nurse"]).String() == "float64" {
		nurse := int64(patientBody["nurse"].(float64))
		patient.HeadNurseId = nurse
	}

	if patientBody["assessment"] != nil && reflect.TypeOf(patientBody["assessment"]).String() == "string" {
		assessment := patientBody["assessment"].(string)
		patient.Evaluate = assessment
	}

	if patientBody["diseases"] != nil && reflect.TypeOf(patientBody["diseases"]).String() == "[]interface {}" {
		thisDiseases, _ := patientBody["diseases"].([]interface{})
		if len(thisDiseases) > 0 {
			for _, item := range thisDiseases {
				if reflect.TypeOf(item).String() != "float64" {
					continue
				}
				disease := int64(item.(float64))
				if disease > 0 {
					diseases = append(diseases, disease)
				}
			}
		}
	}

	if patientBody["diagnose"] != nil && reflect.TypeOf(patientBody["diagnose"]).String() == "string" {
		diagnose := patientBody["diagnose"].(string)
		patient.Diagnose = diagnose
	}

	if patientBody["remark"] != nil && reflect.TypeOf(patientBody["remark"]).String() == "string" {
		remark := patientBody["remark"].(string)
		patient.Remark = remark
	}

	if patientBody["patient_complains"] != nil && reflect.TypeOf(patientBody["patient_complains"]).String() == "string" {
		patient_complains := patientBody["patient_complains"].(string)
		patient.PatientComplains = patient_complains
	}

	if patientBody["present_history"] != nil && reflect.TypeOf(patientBody["present_history"]).String() == "string" {
		present_history := patientBody["present_history"].(string)
		patient.PresentHistory = present_history
	}

	if patientBody["past_history"] != nil && reflect.TypeOf(patientBody["past_history"]).String() == "string" {
		past_history := patientBody["past_history"].(string)
		patient.PastHistory = past_history
	}

	if patientBody["temperature"] != nil && reflect.TypeOf(patientBody["temperature"]).String() == "string" {
		temperature, _ := strconv.ParseFloat(patientBody["temperature"].(string), 64)
		patient.Temperature = temperature
	}

	if patientBody["pulse"] != nil && reflect.TypeOf(patientBody["pulse"]).String() == "string" {
		pulse, _ := strconv.ParseInt(patientBody["pulse"].(string), 10, 64)
		patient.Pulse = pulse
	}

	if patientBody["respiratory"] != nil && reflect.TypeOf(patientBody["respiratory"]).String() == "string" {
		respiratory, _ := strconv.ParseInt(patientBody["respiratory"].(string), 10, 64)
		patient.Respiratory = respiratory
	}

	if patientBody["sbp"] != nil && reflect.TypeOf(patientBody["sbp"]).String() == "string" {
		sbp, _ := strconv.ParseInt(patientBody["sbp"].(string), 10, 64)
		patient.SBP = sbp
	}

	if patientBody["dbp"] != nil && reflect.TypeOf(patientBody["dbp"]).String() == "string" {
		dbp, _ := strconv.ParseInt(patientBody["dbp"].(string), 10, 64)
		patient.DBP = dbp
	}

	if patientBody["dialysis_age"] != nil && reflect.TypeOf(patientBody["dialysis_age"]).String() == "string" {
		dialysis_age, _ := strconv.ParseInt(patientBody["dialysis_age"].(string), 10, 64)
		patient.DialysisAge = dialysis_age
	}
	fmt.Println(patient.DialysisAge)

	if patientBody["first_treatment_date"] != nil && reflect.TypeOf(patientBody["first_treatment_date"]).String() == "string" {
		first_treatment_date := patientBody["first_treatment_date"].(string)
		first_treatment_time, err := time.ParseInLocation(timeLayout, first_treatment_date, loc)
		if err == nil {
			patient.FirstTreatmentDate = first_treatment_time.Unix()
		}
	}

	if patientBody["expense_kind"] != nil && reflect.TypeOf(patientBody["expense_kind"]).String() == "float64" {
		expense_kind := int64(patientBody["expense_kind"].(float64))
		patient.ExpenseKind = expense_kind
	}

	fmt.Println(patient.ExpenseKind)

	if patientBody["tell_phone"] != nil && reflect.TypeOf(patientBody["tell_phone"]).String() == "string" {
		tell_phone := patientBody["tell_phone"].(string)
		patient.TellPhone = tell_phone
	}

	if patientBody["contact_name"] != nil && reflect.TypeOf(patientBody["contact_name"]).String() == "string" {
		contact_name := patientBody["contact_name"].(string)
		patient.ContactName = contact_name
	}

	return

}

func (c *PatientApiController) GetPatientsByKeyWord() {
	keyWord := c.GetString("keyword")
	adminUserInfo := c.GetAdminUserInfo()
	patient, err := service.GetPatientByKeyWord(adminUserInfo.CurrentOrgId, keyWord)
	if err != nil {
		utils.ErrorLog(err.Error())
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
		return
	}
	c.ServeSuccessJSON(map[string]interface{}{
		"patient": patient,
	})
}

func (c *PatientApiController) QueryPatientById() {
	id, _ := c.GetInt64("id")
	fmt.Println(id)
	patientInfo := service.QueryPatientById(id)
	c.ServeSuccessJSON(map[string]interface{}{
		"patient": patientInfo,
	})
	return
}

func (c *PatientApiController) GetRemindPatientList() {
	page, _ := c.GetInt64("page", 1)
	limit, _ := c.GetInt64("limit", 10)
	adminUserInfo := c.GetAdminUserInfo()
	total, patients, err := service.GetAllWaitRemindPatient(adminUserInfo.CurrentOrgId, page, limit)

	if err != nil {
		utils.ErrorLog(err.Error())
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
		return
	}
	c.ServeSuccessJSON(map[string]interface{}{
		"total":    total,
		"patients": patients,
	})

}

func (c *PatientApiController) PostIsOpenRemind() {
	patient_id, _ := c.GetInt64("id", 1)
	is_open_remind, _ := c.GetInt64("is_open_remind", 1)
	adminUserInfo := c.GetAdminUserInfo()

	err := service.UpdatePatientRemindStatus(patient_id, is_open_remind, adminUserInfo.CurrentOrgId)

	if err == nil {
		c.ServeSuccessJSON(map[string]interface{}{
			"msg":            "成功",
			"is_open_remind": is_open_remind,
		})
	} else if err != nil {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
	}
}
