package mobile_api_controllers

import (
	"XT_New/enums"
	"XT_New/models"
	"XT_New/service"
	_ "XT_New/utils"
	_ "encoding/json"
	"fmt"
	_ "github.com/astaxie/beego"
	"github.com/jinzhu/gorm"
	_ "strings"

	// "fmt"
	_ "reflect"
	_ "strconv"
	"time"
)

type CheckWeightApiController struct {
	MobileBaseAPIAuthController
}

func (c *CheckWeightApiController) SaveBloodPressure() {
	id, _ := c.GetInt64("patient", 0)
	dialysistype, _ := c.GetInt64("dialysistype", 0)
	systolic_blood_pressure, _ := c.GetFloat("systolic_blood_pressure", 0)   //收缩压
	diastolic_blood_pressure, _ := c.GetFloat("diastolic_blood_pressure", 0) //舒张压
	pulse_frequency, _ := c.GetFloat("pulse_frequency", 0)                   //脉率

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

	adminUserInfo := c.GetMobileAdminUserInfo()
	patient, _ := service.FindPatientByIdWithDiseases(adminUserInfo.Org.Id, id)
	if patient.ID == 0 {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodePatientNoExist)
		return
	}

	thisTime := time.Now()

	scheduleDateStart := thisTime.Format("2006-01-02") + " 00:00:00"
	timeLayout := "2006-01-02 15:04:05"
	loc, _ := time.LoadLocation("Local")
	theStartTime, _ := time.ParseInLocation(timeLayout, scheduleDateStart, loc)
	theAssessmentDateTime := theStartTime.Unix()

	if dialysistype == 1 {
		// 保存透前相关数据
		// 获取透析处方
		dialysisPrescribe, getDialysisPrescribeErr := service.MobileGetDialysisPrescribe(adminUserInfo.Org.Id, id, theAssessmentDateTime)
		if getDialysisPrescribeErr != nil {
			c.ErrorLog("获取透析处方失败:%v", getDialysisPrescribeErr)
			c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
			return
		}

		// 获取透析模版
		dialysisSolution, getDialysisSolutionErr := service.MobileGetDialysisSolution(adminUserInfo.Org.Id, id)
		if getDialysisSolutionErr != nil {
			c.ErrorLog("获取透析方案失败:%v", getDialysisSolutionErr)
			c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
			return
		}

		// 插入透析处方
		if dialysisPrescribe == nil && dialysisSolution != nil {
			var newprescribe models.DialysisPrescription
			newprescribe.UserOrgId = dialysisSolution.UserOrgId
			newprescribe.PatientId = dialysisSolution.PatientId
			newprescribe.Anticoagulant = dialysisSolution.Anticoagulant
			newprescribe.AnticoagulantShouji = dialysisSolution.AnticoagulantShouji
			newprescribe.AnticoagulantWeichi = dialysisSolution.AnticoagulantWeichi
			newprescribe.AnticoagulantZongliang = dialysisSolution.AnticoagulantZongliang
			newprescribe.AnticoagulantGaimingcheng = dialysisSolution.AnticoagulantGaimingcheng
			newprescribe.AnticoagulantGaijiliang = dialysisSolution.AnticoagulantGaijiliang
			newprescribe.ModeId = dialysisSolution.ModeId
			newprescribe.DialysisDuration = dialysisSolution.DialysisDuration
			newprescribe.ReplacementWay = dialysisSolution.ReplacementWay
			newprescribe.HemodialysisMachine = dialysisSolution.HemodialysisMachine
			newprescribe.BloodFilter = dialysisSolution.BloodFilter
			newprescribe.PerfusionApparatus = dialysisSolution.PerfusionApparatus
			newprescribe.BloodFlowVolume = dialysisSolution.BloodFlowVolume
			newprescribe.DisplaceLiqui = dialysisSolution.DisplaceLiqui
			newprescribe.Glucose = dialysisSolution.Glucose
			newprescribe.DialysateFlow = dialysisSolution.DialysateFlow
			newprescribe.Kalium = dialysisSolution.Kalium
			newprescribe.Sodium = dialysisSolution.Sodium
			newprescribe.Calcium = dialysisSolution.Calcium
			newprescribe.Bicarbonate = dialysisSolution.Bicarbonate
			newprescribe.DialysateTemperature = dialysisSolution.DialysateTemperature
			newprescribe.Conductivity = dialysisSolution.Conductivity
			newprescribe.BodyFluid = dialysisSolution.BodyFluid
			newprescribe.SpecialMedicine = dialysisSolution.SpecialMedicine
			newprescribe.SpecialMedicineOther = dialysisSolution.SpecialMedicineOther
			newprescribe.DisplaceLiquiPart = dialysisSolution.DisplaceLiquiPart
			newprescribe.DisplaceLiquiValue = dialysisSolution.DisplaceLiquiValue
			newprescribe.BloodAccess = dialysisSolution.BloodAccess
			newprescribe.Ultrafiltration = dialysisSolution.Ultrafiltration
			newprescribe.DialysisDurationHour = dialysisSolution.DialysisDurationHour
			newprescribe.DialysisDurationMinute = dialysisSolution.DialysisDurationMinute
			newprescribe.TargetUltrafiltration = dialysisSolution.TargetUltrafiltration
			newprescribe.DialysateFormulation = dialysisSolution.DialysateFormulation
			newprescribe.Dialyzer = dialysisSolution.Dialyzer
			newprescribe.ReplacementTotal = dialysisSolution.ReplacementTotal
			newprescribe.DialyzerPerfusionApparatus = dialysisSolution.DialyzerPerfusionApparatus
			newprescribe.BodyFluidOther = dialysisSolution.BodyFluidOther
			newprescribe.TargetKtv = dialysisSolution.TargetKtv

			newprescribe.CreatedTime = time.Now().Unix()
			newprescribe.UpdatedTime = time.Now().Unix()
			newprescribe.RecordDate = theAssessmentDateTime
			// newprescribe.DewaterAmount = dewater_amount
			// newprescribe.TargetUltrafiltration = dewater_amount
			newprescribe.Status = 1

			err := service.AddSigleRecord(&newprescribe)
			if err != nil {
				c.ServeFailJSONWithSGJErrorCode(enums.ErrorCommitFail)
			}
		}

		if dialysisPrescribe == nil && dialysisSolution == nil {
			var newprescribe models.DialysisPrescription
			newprescribe.UserOrgId = adminUserInfo.Org.Id
			newprescribe.PatientId = id
			newprescribe.CreatedTime = time.Now().Unix()
			newprescribe.UpdatedTime = time.Now().Unix()
			newprescribe.RecordDate = theAssessmentDateTime
			// newprescribe.DewaterAmount = dewater_amount
			// newprescribe.TargetUltrafiltration = dewater_amount
			newprescribe.Status = 1

			err := service.AddSigleRecord(&newprescribe)
			if err != nil {
				c.ServeFailJSONWithSGJErrorCode(enums.ErrorCommitFail)
			}
		}

		if dialysisPrescribe != nil {
			dialysisPrescribe.UpdatedTime = time.Now().Unix()
			dialysisPrescribe.RecordDate = theAssessmentDateTime
			// dialysisPrescribe.DewaterAmount = dewater_amount
			// dialysisPrescribe.TargetUltrafiltration = dewater_amount
			dialysisPrescribe.Status = 1
			updateErr := service.UpDateDialysisPrescription(dialysisPrescribe)
			if updateErr != nil {
				c.ServeFailJSONWithSGJErrorCode(enums.ErrorCommitFail)
			}
		}

		theEvaluation, getPEErr := service.MobileGetPredialysisEvaluation(adminUserInfo.Org.Id, id, theAssessmentDateTime)
		if getPEErr != nil {
			c.ErrorLog("获取透前评估失败:%v", getPEErr)
			c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
			return
		}

		var evaluation models.PredialysisEvaluation
		if theEvaluation != nil {
			evaluation = *theEvaluation
		}

		// 如果今天没有透前评估，则插入新的数据
		if theEvaluation == nil {
			evaluation.CreatedTime = time.Now().Unix()
			evaluation.Status = 1
			evaluation.AssessmentDate = theAssessmentDateTime
			evaluation.PatientId = id
			evaluation.UserOrgId = adminUserInfo.Org.Id
			// 获取上一次透前评估信息，部分数据是需要从上一次透前评估继承
			lastPredialysisEvaluation, _ := service.MobileGetLastTimePredialysisEvaluation(adminUserInfo.Org.Id, id, theAssessmentDateTime)
			// 获取上一次透后评估，插入本次透前评估的上次透后体重（weight_after_last_transparency）字段
			assessmentAfterDislysis, getAADErr := service.MobileGetLastTimeAssessmentAfterDislysis(adminUserInfo.Org.Id, id, theAssessmentDateTime)
			if getAADErr != nil {
				c.ErrorLog("获取透后评估失败:%v", getAADErr)
				c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
				return
			}

			// 获取干体重，先从干体重配置里去读，如果没有，则读取上一次透前评估的干体重
			weight, err := service.FindLastDryWeightAdjust(adminUserInfo.Org.Id, id)
			if err == gorm.ErrRecordNotFound {
				evaluation.DryWeight = lastPredialysisEvaluation.DryWeight
			} else {
				evaluation.DryWeight = weight.DryWeight
			}

			if assessmentAfterDislysis != nil {
				evaluation.WeightAfterLastTransparency = assessmentAfterDislysis.WeightAfter
			}

			if lastPredialysisEvaluation != nil {
				evaluation.BloodAccessPartId = lastPredialysisEvaluation.BloodAccessPartId
				evaluation.BloodAccessPartOperaId = lastPredialysisEvaluation.BloodAccessPartOperaId
				evaluation.AdditionalWeight = lastPredialysisEvaluation.AdditionalWeight // 衣物重
			}
		} else {
			evaluation.UpdatedTime = time.Now().Unix()
		}

		evaluation.SystolicBloodPressure = systolic_blood_pressure   // 收缩压
		evaluation.DiastolicBloodPressure = diastolic_blood_pressure // 舒张压
		evaluation.PulseFrequency = pulse_frequency                  // 脉率

		evaluation.AssessmentTime = time.Now().Unix()

		err := service.UpadatePredialysisEvaluation(&evaluation)
		if err != nil {
			c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDBUpdate)
			return
		}

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

	} else {

		// 保存透后相关数据
		assessmentAfterDislysis, getAADErr := service.MobileGetAssessmentAfterDislysis(adminUserInfo.Org.Id, id, theAssessmentDateTime)
		if getAADErr != nil {
			c.ErrorLog("获取透后评估失败:%v", getAADErr)
			c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
			return
		}

		var afterevaluation models.AssessmentAfterDislysis
		if assessmentAfterDislysis != nil {
			afterevaluation = *assessmentAfterDislysis
		}
		if assessmentAfterDislysis == nil {
			afterevaluation.CreatedTime = time.Now().Unix()
			afterevaluation.Status = 1
			afterevaluation.AssessmentDate = theAssessmentDateTime
			afterevaluation.PatientId = id
			afterevaluation.UserOrgId = adminUserInfo.Org.Id
		} else {

			afterevaluation.UpdatedTime = time.Now().Unix()
		}

		afterevaluation.SystolicBloodPressure = systolic_blood_pressure   // 收缩压
		afterevaluation.DiastolicBloodPressure = diastolic_blood_pressure // 舒张压
		afterevaluation.PulseFrequency = pulse_frequency                  // 脉率

		err := service.UpdateAssessmentAfterDislysisRecord(&afterevaluation)
		if err == nil {
			c.ServeSuccessJSON(map[string]interface{}{
				"assessmentAfterDislysis": afterevaluation,
			})
		}
	}

}

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

	adminUserInfo := c.GetMobileAdminUserInfo()
	patient, _ := service.FindPatientByIdWithDiseases(adminUserInfo.Org.Id, id)
	if patient.ID == 0 {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodePatientNoExist)
		return
	}

	thisTime := time.Now()

	scheduleDateStart := thisTime.Format("2006-01-02") + " 00:00:00"
	// scheduleDateEnd := thisTime.Format("2006-01-02") + " 23:59:59"
	timeLayout := "2006-01-02 15:04:05"
	loc, _ := time.LoadLocation("Local")
	theStartTime, _ := time.ParseInLocation(timeLayout, scheduleDateStart, loc)
	// theEndTime, _ := time.ParseInLocation(timeLayout, scheduleDateEnd, loc)
	theAssessmentDateTime := theStartTime.Unix()
	// endTime := theEndTime.Unix()
	// dry_weight,_ := c.GetFloat("dry_weight",0)  // 干体重
	weighing_before, _ := c.GetFloat("weighing_before", 0) // 透前体重
	dewater_amount, _ := c.GetFloat("dewater_amount", 0)   // 目标脱水量(L)

	weight_after, _ := c.GetFloat("weight_after", 0) // 透后体重
	weight_loss, _ := c.GetFloat("weight_loss", 0)   // 体重减少

	schedual, _ := service.MobileGetSchedualDetail(adminUserInfo.Org.Id, patient.ID, theStartTime.Unix())

	//dialysisSolution,_ := service.MobileGetDialysisSolutionByModeId(adminUserInfo.Org.Id,patient.ID,schedual.ModeId)

	//dialysisPrescribe, _ := service.MobileGetDialysisPrescribeByModeId(adminUserInfo.Org.Id, patient.ID, theStartTime.Unix(),schedual.ModeId)

	//dialysisPrescribe, _ := service.MobileGetDialysisPrescribeByModeId(adminUserInfo.Org.Id, patient.ID, theStartTime.Unix(),schedual.ModeId)

	//dialysisPrescribe, _ := service.MobileGetDialysisPrescribeByModeId(adminUserInfo.Org.Id, patient.ID, theStartTime.Unix(),schedual.ModeId)

	// 查询当前用户今天有没有排班，没有排班，则不处理
	// daySchedule, _ := service.GetPatientScheduleFormDay(adminUserInfo.Org.Id, theAssessmentDateTime, endTime, id)
	// if(len(daySchedule) <= 0) {
	// 	c.ServeSuccessJSON(map[string]interface{}{
	// 		"msg":        "ok",
	// 	})
	// 	return
	// }

	if dialysistype == 1 {
		// 保存透前相关数据
		// 获取透析处方

		var lastDialysisPrescribe *models.DialysisPrescription
		var dialysisSolution *models.DialysisSolution
		var dialysisPrescribe *models.DialysisPrescription
		var system_dialysisPrescribe *models.SystemPrescription

		var mode_id int64

		dialysisPrescribe, _ = service.MobileGetDialysisPrescribe(adminUserInfo.Org.Id, id, theAssessmentDateTime)
		if schedual != nil {
			// 获取透析模版
			dialysisSolution, _ = service.MobileGetDialysisSolutionByModeId(adminUserInfo.Org.Id, id, schedual.ModeId)
			system_dialysisPrescribe, _ = service.MobileGetSystemDialysisPrescribeByModeId(adminUserInfo.Org.Id, schedual.ModeId)
			lastDialysisPrescribe, _ = service.MobileGetLastDialysisPrescribeByModeId(adminUserInfo.Org.Id, id, schedual.ModeId)
			mode_id = schedual.ModeId
		} else {
			// 获取透析模版
			dialysisSolution, _ = service.MobileGetDialysisSolution(adminUserInfo.Org.Id, id)

			if dialysisPrescribe == nil && dialysisSolution != nil {
				mode_id = dialysisSolution.ModeId
			}

			if dialysisPrescribe == nil && dialysisSolution == nil {
				mode_id = 0
			}
		}

		// 插入透析处方
		if dialysisPrescribe == nil && dialysisSolution != nil {
			var newprescribe models.DialysisPrescription
			newprescribe.UserOrgId = dialysisSolution.UserOrgId
			newprescribe.PatientId = dialysisSolution.PatientId
			newprescribe.Anticoagulant = dialysisSolution.Anticoagulant
			newprescribe.AnticoagulantShouji = dialysisSolution.AnticoagulantShouji
			newprescribe.AnticoagulantWeichi = dialysisSolution.AnticoagulantWeichi
			newprescribe.AnticoagulantZongliang = dialysisSolution.AnticoagulantZongliang
			newprescribe.AnticoagulantGaimingcheng = dialysisSolution.AnticoagulantGaimingcheng
			newprescribe.AnticoagulantGaijiliang = dialysisSolution.AnticoagulantGaijiliang
			newprescribe.ModeId = dialysisSolution.ModeId
			newprescribe.DialysisDuration = dialysisSolution.DialysisDuration
			newprescribe.ReplacementWay = dialysisSolution.ReplacementWay
			newprescribe.HemodialysisMachine = dialysisSolution.HemodialysisMachine
			newprescribe.BloodFilter = dialysisSolution.BloodFilter
			newprescribe.PerfusionApparatus = dialysisSolution.PerfusionApparatus
			newprescribe.BloodFlowVolume = dialysisSolution.BloodFlowVolume
			newprescribe.DisplaceLiqui = dialysisSolution.DisplaceLiqui
			newprescribe.Glucose = dialysisSolution.Glucose
			newprescribe.DialysateFlow = dialysisSolution.DialysateFlow
			newprescribe.Kalium = dialysisSolution.Kalium
			newprescribe.Sodium = dialysisSolution.Sodium
			newprescribe.Calcium = dialysisSolution.Calcium
			newprescribe.Bicarbonate = dialysisSolution.Bicarbonate
			newprescribe.DialysateTemperature = dialysisSolution.DialysateTemperature
			newprescribe.Conductivity = dialysisSolution.Conductivity
			newprescribe.BodyFluid = dialysisSolution.BodyFluid
			newprescribe.SpecialMedicine = dialysisSolution.SpecialMedicine
			newprescribe.SpecialMedicineOther = dialysisSolution.SpecialMedicineOther
			newprescribe.DisplaceLiquiPart = dialysisSolution.DisplaceLiquiPart
			newprescribe.DisplaceLiquiValue = dialysisSolution.DisplaceLiquiValue
			newprescribe.BloodAccess = dialysisSolution.BloodAccess
			newprescribe.Ultrafiltration = dialysisSolution.Ultrafiltration
			newprescribe.DialysisDurationHour = dialysisSolution.DialysisDurationHour
			newprescribe.DialysisDurationMinute = dialysisSolution.DialysisDurationMinute
			newprescribe.TargetUltrafiltration = dialysisSolution.TargetUltrafiltration
			newprescribe.DialysateFormulation = dialysisSolution.DialysateFormulation
			newprescribe.Dialyzer = dialysisSolution.Dialyzer
			newprescribe.ReplacementTotal = dialysisSolution.ReplacementTotal
			newprescribe.DialyzerPerfusionApparatus = dialysisSolution.DialyzerPerfusionApparatus
			newprescribe.BodyFluidOther = dialysisSolution.BodyFluidOther
			newprescribe.TargetKtv = dialysisSolution.TargetKtv

			newprescribe.CreatedTime = time.Now().Unix()
			newprescribe.UpdatedTime = time.Now().Unix()
			newprescribe.RecordDate = theAssessmentDateTime
			newprescribe.DewaterAmount = dewater_amount
			newprescribe.TargetUltrafiltration = dewater_amount
			newprescribe.Status = 1

			err := service.AddSigleRecord(&newprescribe)
			if err != nil {
				c.ServeFailJSONWithSGJErrorCode(enums.ErrorCommitFail)
			}
		}

		if dialysisPrescribe == nil && dialysisSolution == nil {
			if lastDialysisPrescribe != nil {
				var newprescribe models.DialysisPrescription
				newprescribe.UserOrgId = lastDialysisPrescribe.UserOrgId
				newprescribe.PatientId = lastDialysisPrescribe.PatientId
				newprescribe.Anticoagulant = lastDialysisPrescribe.Anticoagulant
				newprescribe.AnticoagulantShouji = lastDialysisPrescribe.AnticoagulantShouji
				newprescribe.AnticoagulantWeichi = lastDialysisPrescribe.AnticoagulantWeichi
				newprescribe.AnticoagulantZongliang = lastDialysisPrescribe.AnticoagulantZongliang
				newprescribe.AnticoagulantGaimingcheng = lastDialysisPrescribe.AnticoagulantGaimingcheng
				newprescribe.AnticoagulantGaijiliang = lastDialysisPrescribe.AnticoagulantGaijiliang
				newprescribe.ModeId = lastDialysisPrescribe.ModeId
				newprescribe.DialysisDuration = lastDialysisPrescribe.DialysisDuration
				newprescribe.ReplacementWay = lastDialysisPrescribe.ReplacementWay
				newprescribe.HemodialysisMachine = lastDialysisPrescribe.HemodialysisMachine
				newprescribe.BloodFilter = lastDialysisPrescribe.BloodFilter
				newprescribe.PerfusionApparatus = lastDialysisPrescribe.PerfusionApparatus
				newprescribe.BloodFlowVolume = lastDialysisPrescribe.BloodFlowVolume
				newprescribe.DisplaceLiqui = lastDialysisPrescribe.DisplaceLiqui
				newprescribe.Glucose = lastDialysisPrescribe.Glucose
				newprescribe.DialysateFlow = lastDialysisPrescribe.DialysateFlow
				newprescribe.Kalium = lastDialysisPrescribe.Kalium
				newprescribe.Sodium = lastDialysisPrescribe.Sodium
				newprescribe.Calcium = lastDialysisPrescribe.Calcium
				newprescribe.Bicarbonate = lastDialysisPrescribe.Bicarbonate
				newprescribe.DialysateTemperature = lastDialysisPrescribe.DialysateTemperature
				newprescribe.Conductivity = lastDialysisPrescribe.Conductivity
				newprescribe.BodyFluid = lastDialysisPrescribe.BodyFluid
				newprescribe.SpecialMedicine = lastDialysisPrescribe.SpecialMedicine
				newprescribe.SpecialMedicineOther = lastDialysisPrescribe.SpecialMedicineOther
				newprescribe.DisplaceLiquiPart = lastDialysisPrescribe.DisplaceLiquiPart
				newprescribe.DisplaceLiquiValue = lastDialysisPrescribe.DisplaceLiquiValue
				newprescribe.BloodAccess = lastDialysisPrescribe.BloodAccess
				newprescribe.Ultrafiltration = lastDialysisPrescribe.Ultrafiltration
				newprescribe.DialysisDurationHour = lastDialysisPrescribe.DialysisDurationHour
				newprescribe.DialysisDurationMinute = lastDialysisPrescribe.DialysisDurationMinute
				newprescribe.DialysateFormulation = lastDialysisPrescribe.DialysateFormulation
				newprescribe.Dialyzer = lastDialysisPrescribe.Dialyzer
				newprescribe.ReplacementTotal = lastDialysisPrescribe.ReplacementTotal
				newprescribe.DialyzerPerfusionApparatus = lastDialysisPrescribe.DialyzerPerfusionApparatus
				newprescribe.BodyFluidOther = lastDialysisPrescribe.BodyFluidOther
				newprescribe.TargetKtv = lastDialysisPrescribe.TargetKtv
				newprescribe.CreatedTime = time.Now().Unix()
				newprescribe.UpdatedTime = time.Now().Unix()
				newprescribe.RecordDate = theAssessmentDateTime
				newprescribe.DewaterAmount = dewater_amount
				newprescribe.TargetUltrafiltration = dewater_amount
				newprescribe.Status = 1
				err := service.AddSigleRecord(&newprescribe)
				if err != nil {
					c.ServeFailJSONWithSGJErrorCode(enums.ErrorCommitFail)
				}
			} else if system_dialysisPrescribe != nil {
				var newprescribe models.DialysisPrescription
				newprescribe.UserOrgId = system_dialysisPrescribe.UserOrgId
				newprescribe.PatientId = id
				newprescribe.Anticoagulant = system_dialysisPrescribe.Anticoagulant
				newprescribe.AnticoagulantShouji = system_dialysisPrescribe.AnticoagulantShouji
				newprescribe.AnticoagulantWeichi = system_dialysisPrescribe.AnticoagulantWeichi
				newprescribe.AnticoagulantZongliang = system_dialysisPrescribe.AnticoagulantZongliang
				newprescribe.AnticoagulantGaimingcheng = system_dialysisPrescribe.AnticoagulantGaimingcheng
				newprescribe.AnticoagulantGaijiliang = system_dialysisPrescribe.AnticoagulantGaijiliang
				newprescribe.ModeId = system_dialysisPrescribe.ModeId
				newprescribe.DialysisDuration = system_dialysisPrescribe.DialysisDuration
				newprescribe.ReplacementWay = system_dialysisPrescribe.ReplacementWay
				newprescribe.HemodialysisMachine = system_dialysisPrescribe.HemodialysisMachine
				newprescribe.BloodFilter = system_dialysisPrescribe.BloodFilter
				newprescribe.PerfusionApparatus = system_dialysisPrescribe.PerfusionApparatus
				newprescribe.BloodFlowVolume = system_dialysisPrescribe.BloodFlowVolume
				newprescribe.DisplaceLiqui = system_dialysisPrescribe.DisplaceLiqui
				newprescribe.Glucose = system_dialysisPrescribe.Glucose
				newprescribe.DialysateFlow = system_dialysisPrescribe.DialysateFlow
				newprescribe.Kalium = system_dialysisPrescribe.Kalium
				newprescribe.Sodium = system_dialysisPrescribe.Sodium
				newprescribe.Calcium = system_dialysisPrescribe.Calcium
				newprescribe.Bicarbonate = system_dialysisPrescribe.Bicarbonate
				newprescribe.DialysateTemperature = system_dialysisPrescribe.DialysateTemperature
				newprescribe.Conductivity = system_dialysisPrescribe.Conductivity
				newprescribe.BodyFluid = system_dialysisPrescribe.BodyFluid
				newprescribe.SpecialMedicine = system_dialysisPrescribe.SpecialMedicine
				newprescribe.SpecialMedicineOther = system_dialysisPrescribe.SpecialMedicineOther
				newprescribe.DisplaceLiquiPart = system_dialysisPrescribe.DisplaceLiquiPart
				newprescribe.DisplaceLiquiValue = system_dialysisPrescribe.DisplaceLiquiValue
				newprescribe.BloodAccess = system_dialysisPrescribe.BloodAccess
				newprescribe.Ultrafiltration = system_dialysisPrescribe.Ultrafiltration
				newprescribe.DialysisDurationHour = system_dialysisPrescribe.DialysisDurationHour
				newprescribe.DialysisDurationMinute = system_dialysisPrescribe.DialysisDurationMinute
				newprescribe.DialysateFormulation = system_dialysisPrescribe.DialysateFormulation
				newprescribe.Dialyzer = system_dialysisPrescribe.Dialyzer
				newprescribe.ReplacementTotal = system_dialysisPrescribe.ReplacementTotal
				newprescribe.DialyzerPerfusionApparatus = system_dialysisPrescribe.DialyzerPerfusionApparatus
				newprescribe.BodyFluidOther = system_dialysisPrescribe.BodyFluidOther
				newprescribe.TargetKtv = system_dialysisPrescribe.TargetKtv
				newprescribe.CreatedTime = time.Now().Unix()
				newprescribe.UpdatedTime = time.Now().Unix()
				newprescribe.RecordDate = theAssessmentDateTime
				newprescribe.DewaterAmount = dewater_amount
				newprescribe.TargetUltrafiltration = dewater_amount
				newprescribe.Status = 1
				fmt.Println(newprescribe.DewaterAmount)
				fmt.Println(newprescribe.TargetUltrafiltration)

				err := service.AddSigleRecord(&newprescribe)
				if err != nil {
					c.ServeFailJSONWithSGJErrorCode(enums.ErrorCommitFail)
				}

			} else {
				var newprescribe models.DialysisPrescription
				newprescribe.UserOrgId = adminUserInfo.Org.Id
				newprescribe.PatientId = id
				newprescribe.ModeId = mode_id
				newprescribe.CreatedTime = time.Now().Unix()
				newprescribe.UpdatedTime = time.Now().Unix()
				newprescribe.RecordDate = theAssessmentDateTime
				newprescribe.DewaterAmount = dewater_amount
				newprescribe.TargetUltrafiltration = dewater_amount
				newprescribe.Status = 1

				err := service.AddSigleRecord(&newprescribe)
				if err != nil {
					c.ServeFailJSONWithSGJErrorCode(enums.ErrorCommitFail)
				}
			}
		}

		if dialysisPrescribe != nil {
			dialysisPrescribe.UpdatedTime = time.Now().Unix()
			dialysisPrescribe.RecordDate = theAssessmentDateTime
			dialysisPrescribe.DewaterAmount = dewater_amount
			dialysisPrescribe.TargetUltrafiltration = dewater_amount
			dialysisPrescribe.Status = 1
			updateErr := service.UpDateDialysisPrescription(dialysisPrescribe)
			if updateErr != nil {
				c.ServeFailJSONWithSGJErrorCode(enums.ErrorCommitFail)
			}
		}

		theEvaluation, getPEErr := service.MobileGetPredialysisEvaluation(adminUserInfo.Org.Id, id, theAssessmentDateTime)
		if getPEErr != nil {
			c.ErrorLog("获取透前评估失败:%v", getPEErr)
			c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
			return
		}

		var evaluation models.PredialysisEvaluation
		if theEvaluation != nil {
			evaluation = *theEvaluation
		}

		// 如果今天没有透前评估，则插入新的数据
		if theEvaluation == nil {
			evaluation.CreatedTime = time.Now().Unix()
			evaluation.Status = 1
			evaluation.AssessmentDate = theAssessmentDateTime
			evaluation.PatientId = id
			evaluation.UserOrgId = adminUserInfo.Org.Id
			// 获取上一次透前评估信息，部分数据是需要从上一次透前评估继承
			lastPredialysisEvaluation, _ := service.MobileGetLastTimePredialysisEvaluation(adminUserInfo.Org.Id, id, theAssessmentDateTime)
			// 获取上一次透后评估，插入本次透前评估的上次透后体重（weight_after_last_transparency）字段
			assessmentAfterDislysis, getAADErr := service.MobileGetLastTimeAssessmentAfterDislysis(adminUserInfo.Org.Id, id, theAssessmentDateTime)
			if getAADErr != nil {
				c.ErrorLog("获取透后评估失败:%v", getAADErr)
				c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
				return
			}

			// 获取干体重，先从干体重配置里去读，如果没有，则读取上一次透前评估的干体重
			weight, err := service.FindLastDryWeightAdjust(adminUserInfo.Org.Id, id)
			if err == gorm.ErrRecordNotFound {
				if lastPredialysisEvaluation != nil {
					evaluation.DryWeight = lastPredialysisEvaluation.DryWeight
				} else {
					evaluation.DryWeight = 0
				}
			} else {
				evaluation.DryWeight = weight.DryWeight
			}

			if assessmentAfterDislysis != nil {
				evaluation.WeightAfterLastTransparency = assessmentAfterDislysis.WeightAfter
			}

			if lastPredialysisEvaluation != nil {
				evaluation.BloodAccessPartId = lastPredialysisEvaluation.BloodAccessPartId
				evaluation.BloodAccessPartOperaId = lastPredialysisEvaluation.BloodAccessPartOperaId
				evaluation.AdditionalWeight = lastPredialysisEvaluation.AdditionalWeight
				evaluation.Temperature = lastPredialysisEvaluation.Temperature
				evaluation.BreathingRate = lastPredialysisEvaluation.BreathingRate
				evaluation.Catheter = lastPredialysisEvaluation.Catheter
				evaluation.InternalFistula = lastPredialysisEvaluation.InternalFistula
				evaluation.PulseFrequency = lastPredialysisEvaluation.PulseFrequency
				evaluation.Complication = lastPredialysisEvaluation.Complication
				evaluation.LastPostDialysis = lastPredialysisEvaluation.LastPostDialysis
				evaluation.DialysisInterphase = lastPredialysisEvaluation.DialysisInterphase
				evaluation.SymptomBeforeDialysis = lastPredialysisEvaluation.SymptomBeforeDialysis
				evaluation.PunctureNeedle = lastPredialysisEvaluation.PunctureNeedle
				evaluation.PunctureWay = lastPredialysisEvaluation.PunctureWay

			}
		} else {
			evaluation.UpdatedTime = time.Now().Unix()
		}

		evaluation.WeightBefore = weighing_before
		evaluation.AssessmentTime = time.Now().Unix()

		err := service.UpadatePredialysisEvaluation(&evaluation)
		if err != nil {
			c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDBUpdate)
			return
		}

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

	} else {

		// 保存透后相关数据
		assessmentAfterDislysis, getAADErr := service.MobileGetAssessmentAfterDislysis(adminUserInfo.Org.Id, id, theAssessmentDateTime)
		if getAADErr != nil {
			c.ErrorLog("获取透后评估失败:%v", getAADErr)
			c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
			return
		}

		var afterevaluation models.AssessmentAfterDislysis
		if assessmentAfterDislysis != nil {
			afterevaluation = *assessmentAfterDislysis
		}
		if assessmentAfterDislysis == nil {
			afterevaluation.CreatedTime = time.Now().Unix()
			afterevaluation.Status = 1
			afterevaluation.AssessmentDate = theAssessmentDateTime
			afterevaluation.PatientId = id
			afterevaluation.UserOrgId = adminUserInfo.Org.Id
		} else {

			afterevaluation.UpdatedTime = time.Now().Unix()
		}

		afterevaluation.WeightAfter = weight_after
		afterevaluation.WeightLoss = weight_loss
		// if (adminUserInfo.Org.Id == 9538){
		// 	afterevaluation.ActualUltrafiltration = weight_loss * 1000  //中能建的计量单位是毫升（ml）
		// } else {
		// 	afterevaluation.ActualUltrafiltration = weight_loss  // 计量单位是L
		// }

		err := service.UpdateAssessmentAfterDislysisRecord(&afterevaluation)
		if err == nil {
			c.ServeSuccessJSON(map[string]interface{}{
				"assessmentAfterDislysis": afterevaluation,
			})
		}
	}
}

func (c *CheckWeightApiController) GetPatientInfoDialysis() {
	id, _ := c.GetInt64("patient", 0)
	if id <= 0 {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}
	adminUserInfo := c.GetMobileAdminUserInfo()
	patient, _ := service.FindPatientByIdWithDiseases(adminUserInfo.Org.Id, id)
	if patient.ID <= 0 {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodePatientNoExist)
		return
	}

	var dialysisinfo map[string]interface{}
	dialysisinfo = make(map[string]interface{})

	dialysisinfo["id"] = patient.ID
	dialysisinfo["name"] = patient.Name
	dialysisinfo["dialysis_no"] = patient.DialysisNo

	thisTime := time.Now()

	scheduleDateStart := thisTime.Format("2006-01-02") + " 00:00:00"
	scheduleDateEnd := thisTime.Format("2006-01-02") + " 23:59:59"
	timeLayout := "2006-01-02 15:04:05"
	loc, _ := time.LoadLocation("Local")
	theStartTime, _ := time.ParseInLocation(timeLayout, scheduleDateStart, loc)
	theEndTime, _ := time.ParseInLocation(timeLayout, scheduleDateEnd, loc)
	startTime := theStartTime.Unix()
	endTime := theEndTime.Unix()

	// 判断当前用户是透析前还是透析后
	var dialysistype int

	_, dialysisOrder := service.FindDialysisRecordById(adminUserInfo.Org.Id, id, startTime)
	if dialysisOrder == nil {
		dialysistype = 1
	} else {
		dialysistype = 2
	}

	// 获取当前或者下次排班信息
	var sc map[string]interface{}
	sc = make(map[string]interface{})
	if dialysistype == 1 {
		daySchedule, _ := service.GetPatientScheduleFormDay(adminUserInfo.Org.Id, startTime, endTime, id)
		if len(daySchedule) <= 0 {
			sc["code"] = 1
			sc["msg"] = "抱歉，您今天没有排版！"
			sc["mode"] = 0
			sc["data"] = daySchedule
		} else {
			if daySchedule[0].Schedule.ID > 0 {
				sc["code"] = 0
				sc["msg"] = ""
				sc["mode"] = daySchedule[0].Schedule.ModeId
				sc["data"] = daySchedule
			} else {
				sc["code"] = 1
				sc["msg"] = "抱歉，您今天没有排版！"
				sc["mode"] = 0
				sc["data"] = daySchedule
			}
		}
	} else {
		nextSchedule, _ := service.GetNextSchedule(adminUserInfo.Org.Id, endTime, id)
		if len(nextSchedule) <= 0 {
			sc["code"] = 1
			sc["msg"] = "抱歉，您后续没有排版！"
			sc["mode"] = 0
			sc["data"] = nextSchedule
		} else {
			if nextSchedule[0].Schedule.ID > 0 {
				sc["code"] = 0
				sc["msg"] = ""
				sc["mode"] = nextSchedule[0].Schedule.ModeId
				sc["data"] = nextSchedule
			} else {
				sc["code"] = 1
				sc["msg"] = "抱歉，您后续没有排版！"
				sc["mode"] = 0
				sc["data"] = nextSchedule
			}
		}
	}

	switch sc["mode"] {
	case 1:
		sc["mode"] = "HD"
	case 2:
		sc["mode"] = "HDF"
	case 3:
		sc["mode"] = "HD+HP"
	case 4:
		sc["mode"] = "HP"
	case 5:
		sc["mode"] = "HF"
	case 6:
		sc["mode"] = "SCUF"
	case 7:
		sc["mode"] = "IUF"
	case 8:
		sc["mode"] = "HFHD"
	case 9:
		sc["mode"] = "HFHD+HP"
	case 10:
		sc["mode"] = "PHF"
	case 11:
		sc["mode"] = "HFR"
	case 12:
		sc["mode"] = "HDF+HP"
	case 13:
		sc["mode"] = "CRRT"
	case 14:
		sc["mode"] = "腹水回输"
	case 15:
		sc["mode"] = "HD前置换"
	case 16:
		sc["mode"] = "HD后置换"
	case 17:
		sc["mode"] = "HDF前置换"
	case 18:
		sc["mode"] = "HDF后置换"
	default:
		sc["mode"] = "HD"
	}

	// 获取患者透前干体重或者获取患者透前体重
	var dry_weight map[string]interface{}
	dry_weight = make(map[string]interface{})
	if dialysistype == 1 {

		lastPredialysisEvaluation, getLPEErr := service.MobileGetLastTimePredialysisEvaluation(adminUserInfo.Org.Id, id, endTime)
		weight, err := service.FindLastDryWeightAdjust(adminUserInfo.Org.Id, id)
		if err == gorm.ErrRecordNotFound {
			if getLPEErr != nil {
				dry_weight["code"] = 1
				dry_weight["dry_weight"] = nil
			} else {
				if lastPredialysisEvaluation == nil {
					dry_weight["code"] = 1
					dry_weight["dry_weight"] = nil
				} else {
					// 传输的干体重实际为干体重加上衣服重
					dry_weight["code"] = 0
					dry_weight["dry_weight"] = lastPredialysisEvaluation.DryWeight + lastPredialysisEvaluation.AdditionalWeight
				}
			}
		} else {
			if err != nil {
				dry_weight["code"] = 1
				dry_weight["dry_weight"] = nil
			} else {
				dry_weight["code"] = 0
				if getLPEErr != nil {
					dry_weight["code"] = 0
					dry_weight["dry_weight"] = weight.DryWeight
				} else {
					if lastPredialysisEvaluation == nil {
						dry_weight["code"] = 1
						dry_weight["dry_weight"] = weight.DryWeight
					} else {
						// 传输的干体重实际为干体重加上衣服重
						dry_weight["code"] = 0
						dry_weight["dry_weight"] = weight.DryWeight + lastPredialysisEvaluation.AdditionalWeight
					}
				}
			}
		}

	} else {
		predialysisEvaluation, getPEErr := service.MobileGetPredialysisEvaluation(adminUserInfo.Org.Id, id, startTime)
		if getPEErr != nil {
			dry_weight["code"] = 1
			dry_weight["dry_weight"] = nil
		} else {
			if predialysisEvaluation == nil {
				dry_weight["code"] = 1
				dry_weight["dry_weight"] = nil
			} else {
				dry_weight["code"] = 0
				dry_weight["dry_weight"] = predialysisEvaluation.WeightBefore
			}
		}
	}

	c.ServeSuccessJSON(map[string]interface{}{
		"dialysistype": dialysistype,
		"patient":      dialysisinfo,
		"schedule":     sc,
		"dryweight":    dry_weight,
	})
	return
}

func (c *CheckWeightApiController) GetPatientInfoBeforeDialysis() {
	id, _ := c.GetInt64("patient", 0)
	if id <= 0 {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}
	adminUserInfo := c.GetMobileAdminUserInfo()
	patient, _ := service.FindPatientByIdWithDiseases(adminUserInfo.Org.Id, id)
	if patient.ID == 0 {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodePatientNoExist)
		return
	}

	var dialysisinfo map[string]interface{}
	dialysisinfo = make(map[string]interface{})

	dialysisinfo["id"] = patient.ID
	dialysisinfo["name"] = patient.Name
	dialysisinfo["dialysis_no"] = patient.DialysisNo

	thisTime := time.Now()

	scheduleDateStart := thisTime.Format("2006-01-02") + " 00:00:00"
	scheduleDateEnd := thisTime.Format("2006-01-02") + " 23:59:59"
	fmt.Println(scheduleDateStart, scheduleDateEnd)
	timeLayout := "2006-01-02 15:04:05"
	loc, _ := time.LoadLocation("Local")
	theStartTime, _ := time.ParseInLocation(timeLayout, scheduleDateStart, loc)
	theEndTime, _ := time.ParseInLocation(timeLayout, scheduleDateEnd, loc)
	fmt.Println(theStartTime, theEndTime)
	startTime := theStartTime.Unix()
	endTime := theEndTime.Unix()

	var sc map[string]interface{}
	sc = make(map[string]interface{})
	//一天只有排班一次
	daySchedule, _ := service.GetDaySchedule(adminUserInfo.Org.Id, startTime, endTime, id)
	if daySchedule.ID > 0 {
		switch daySchedule.ModeId {
		case 1:
			sc["mode"] = "HD"
		case 2:
			sc["mode"] = "HDF"
		case 3:
			sc["mode"] = "HD+HP"
		case 4:
			sc["mode"] = "HP"
		case 5:
			sc["mode"] = "HF"
		case 6:
			sc["mode"] = "SCUF"
		case 7:
			sc["mode"] = "IUF"
		case 8:
			sc["mode"] = "HFHD"
		case 9:
			sc["mode"] = "HFHD+HP"
		case 10:
			sc["mode"] = "PHF"
		case 11:
			sc["mode"] = "HFR"
		case 12:
			sc["mode"] = "HDF+HP"
		case 13:
			sc["mode"] = "CRRT"
		case 14:
			sc["mode"] = "腹水回输"
		case 15:
			sc["mode"] = "HD前置换"
		case 16:
			sc["mode"] = "HD后置换"
		case 17:
			sc["mode"] = "HDF前置换"
		case 18:
			sc["mode"] = "HDF后置换"
		default:
			sc["mode"] = "HD"
		}
		sc["code"] = 0
		sc["msg"] = ""
		sc["data"] = daySchedule
	} else {
		sc["code"] = 1
		sc["msg"] = "抱歉，您今天没有排版！"
		sc["mode"] = ""
		sc["data"] = daySchedule
	}

	fmt.Println(sc)

	type dryWeight struct {
		code       int
		dry_weight float64
	}

	var dry_weight map[string]interface{}
	dry_weight = make(map[string]interface{})

	lastPredialysisEvaluation, getLPEErr := service.MobileGetLastTimePredialysisEvaluation(adminUserInfo.Org.Id, id, startTime)
	if getLPEErr != nil {
		dry_weight["code"] = 1
		dry_weight["dry_weight"] = nil
	} else {
		if lastPredialysisEvaluation == nil {
			dry_weight["code"] = 1
			dry_weight["dry_weight"] = nil
		} else {
			dry_weight["code"] = 0
			dry_weight["dry_weight"] = lastPredialysisEvaluation.DryWeight
		}
	}

	c.ServeSuccessJSON(map[string]interface{}{
		"patient":   dialysisinfo,
		"schedule":  sc,
		"dryweight": dry_weight,
	})
	return
}
