package controllers

import (
	"XT_New/models"
	"encoding/json"
	"github.com/jinzhu/gorm"
	"math"
	"strconv"
	"strings"
	"time"

	"XT_New/enums"
	"XT_New/service"
	"XT_New/utils"

	"fmt"
	"github.com/astaxie/beego"
)

func DialysisRecordAPIControllerRegistRouter() {
	beego.Router("/api/dialysis/initdata", &DialysisRecordAPIController{}, "get:RecordInitData")
	beego.Router("/api/dialysis/schedules", &DialysisRecordAPIController{}, "get:GetSchedules")
	beego.Router("/api/dislysis/schedule", &DialysisRecordAPIController{}, "get:DialysisSchedule")
	beego.Router("/api/dislysis/monitor/edit", &DialysisRecordAPIController{}, "post:EditMonitor")
	beego.Router("/api/dialysis/start_record", &DialysisRecordAPIController{}, "post:StartDialysis")
	beego.Router("/api/dialysis/finish", &DialysisRecordAPIController{}, "post:FinishDialysis")
	beego.Router("/api/start_dialysis/modify", &DialysisRecordAPIController{}, "post:ModifyStartDialysis")
	beego.Router("/api/finish_dialysis/modify", &DialysisRecordAPIController{}, "post:ModifyFinishDialysis")

}

type DialysisRecordAPIController struct {
	BaseAuthAPIController
}

// /api/dialysis/initdata [get]
func (this *DialysisRecordAPIController) RecordInitData() {
	adminInfo := this.GetAdminUserInfo()
	orgID := adminInfo.CurrentOrgId

	now := time.Now()
	ymdDate, _ := utils.ParseTimeStringToTime("2006-01-02", now.Format("2006-01-02"))
	schedules, getSchedulesErr := service.GetDialysisScheduals(orgID, ymdDate.Unix())
	if getSchedulesErr != nil {
		this.ErrorLog("获取排班信息失败:%v", getSchedulesErr)
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
		return
	}

	zones, getZonesErr := service.GetAllValidDeviceZones(orgID)
	if getZonesErr != nil {
		this.ErrorLog("获取全部分区失败:%v", getZonesErr)
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
		return
	}

	this.ServeSuccessJSON(map[string]interface{}{
		"schedules": schedules,
		"zones":     zones,
	})
}

// /api/dialysis/schedules [get]
// @param date:string (yyyy-mm-dd)
func (this *DialysisRecordAPIController) GetSchedules() {
	schedualDate := this.GetString("date")

	date, parseDateErr := utils.ParseTimeStringToTime("2006-01-02", schedualDate)
	if parseDateErr != nil {
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}

	adminInfo := this.GetAdminUserInfo()
	orgID := adminInfo.CurrentOrgId

	schedules, err := service.GetDialysisScheduals(orgID, date.Unix())
	if err != nil {
		this.ErrorLog("获取排班信息失败:%v", err)
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
	} else {
		this.ServeSuccessJSON(map[string]interface{}{
			"schedules": schedules,
		})
	}
}

// /api/dislysis/schedule [get]
// @param patient_id:int
// @param date:string (yyyy-MM-dd)
func (this *DialysisRecordAPIController) DialysisSchedule() {
	patientID, _ := this.GetInt64("patient_id")
	recordDateStr := this.GetString("date")
	if patientID <= 0 {
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}
	if len(recordDateStr) == 0 {
		recordDateStr = time.Now().Format("2006-01-02")
	}
	date, parseDateErr := utils.ParseTimeStringToTime("2006-01-02", recordDateStr)
	if parseDateErr != nil {
		this.ErrorLog("日期(%v)解析错误：%v", recordDateStr, parseDateErr)
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}

	adminInfo := this.GetAdminUserInfo()
	patient, getPatientErr := service.MobileGetPatientDetail(adminInfo.CurrentOrgId, patientID)
	if getPatientErr != nil {
		this.ErrorLog("获取患者信息失败：%v", getPatientErr)
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
		return
	} else if patient == nil {
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodePatientNoExist)
		return
	}

	schedual, getSchedualErr := service.MobileGetSchedualDetail(adminInfo.CurrentOrgId, patientID, date.Unix())
	if getSchedualErr != nil {
		this.ErrorLog("获取患者排班信息失败:%v", getSchedualErr)
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
		return
	}

	receiverTreatmentAccess, getRTARErr := service.MobileGetReceiverTreatmentAccessRecord(adminInfo.CurrentOrgId, patientID, date.Unix())
	if getRTARErr != nil {
		this.ErrorLog("获取接诊评估失败:%v", getRTARErr)
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
		return
	}

	predialysisEvaluation, getPEErr := service.MobileGetPredialysisEvaluation(adminInfo.CurrentOrgId, patientID, date.Unix())
	fmt.Println("predialysisEvaluatiotion", predialysisEvaluation)
	if getPEErr != nil {
		this.ErrorLog("获取透前评估失败:%v", getPEErr)
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
		return
	}

	doctorAdvices, getDoctorAdvicesErr := service.MobileGetDoctorAdvices(adminInfo.CurrentOrgId, patientID, date.Unix())
	if getDoctorAdvicesErr != nil {
		this.ErrorLog("获取临时医嘱失败:%v", getDoctorAdvicesErr)
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
		return
	}

	dialysisOrder, getDialysisOrderErr := service.MobileGetSchedualDialysisRecord(adminInfo.CurrentOrgId, patientID, date.Unix())
	if getDialysisOrderErr != nil {
		this.ErrorLog("获取透析记录失败:%v", getDialysisOrderErr)
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
		return
	}

	doubleCheck, getDoubleCheckErr := service.MobileGetDoubleCheck(adminInfo.CurrentOrgId, patientID, date.Unix())
	if getDoubleCheckErr != nil {
		this.ErrorLog("获取双人核对记录失败:%v", getDoubleCheckErr)
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
		return
	}

	monitorRecords, getMonitorRecordsErr := service.MobileGetMonitorRecords(adminInfo.CurrentOrgId, patientID, date.Unix())
	if getMonitorRecordsErr != nil {
		this.ErrorLog("获取透析监测记录失败:%v", getMonitorRecordsErr)
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
		return
	}

	assessmentAfterDislysis, getAADErr := service.MobileGetAssessmentAfterDislysis(adminInfo.CurrentOrgId, patientID, date.Unix())
	if getAADErr != nil {
		this.ErrorLog("获取透后评估失败:%v", getAADErr)
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
		return
	}

	treatmentSummary, getTreatmentSummaryErr := service.MobileGetTreatmentSummary(adminInfo.CurrentOrgId, patientID, date.Unix())
	if getTreatmentSummaryErr != nil {
		this.ErrorLog("获取治疗小结失败:%v", getTreatmentSummaryErr)
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
		return
	}

	admins, getAdminsErr := service.GetAllAdminUsers(adminInfo.CurrentOrgId, adminInfo.CurrentAppId)
	if getAdminsErr != nil {
		this.ErrorLog("获取医护列表失败：%v", getAdminsErr)
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
		return
	}
	devices, getDevicesErr := service.GetValidDevicesBy(adminInfo.CurrentOrgId, 0, 0)
	if getDevicesErr != nil {
		this.ErrorLog("获取设备列表失败：%v", getDevicesErr)
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
		return
	}
	deviceNumbers, getDeviceNumbersErr := service.GetAllValidDeviceNumbers(adminInfo.CurrentOrgId)
	if getDeviceNumbersErr != nil {
		this.ErrorLog("获取床位号列表失败:%v", getDeviceNumbersErr)
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
		return
	}

	lastPredialysisEvaluation, getLPEErr := service.GetLastTimePredialysisEvaluation(adminInfo.CurrentOrgId, patientID, date.Unix())
	if getLPEErr != nil {
		this.ErrorLog("获取上一次透前评估失败:%v", getLPEErr)
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
		return
	}

	var lastMonitorRecord *models.MonitoringRecord

	lastMonitorRecord, getLastErr := service.GetLastMonitorRecord(adminInfo.CurrentOrgId, patientID, date.Unix())
	if getLastErr != nil {
		this.ErrorLog("获取上一次透析的监测记录失败:%v", getLastErr)
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
		return
	}

	lastAssessmentAfterDislysis, getLAADErr := service.GetLastTimeAssessmentAfterDislysis(adminInfo.CurrentOrgId, patientID, date.Unix())
	if getLAADErr != nil {
		this.ErrorLog("获取上一次透后评估失败:%v", getLAADErr)
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
		return
	}

	dialysisPrescribe, getDialysisPrescribeErr := service.GetDialysisPrescribe(adminInfo.CurrentOrgId, patientID, date.Unix())
	if getDialysisPrescribeErr != nil {
		this.ErrorLog("获取透析处方失败:%v", getDialysisPrescribeErr)
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
		return
	}
	dialysisSolution, getDialysisSolutionErr := service.GetDialysisSolution(adminInfo.CurrentOrgId, patientID, schedual.ModeId)
	if getDialysisSolutionErr != nil {
		this.ErrorLog("获取透析方案失败:%v", getDialysisSolutionErr)
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
		return
	}

	lastDialysisPrescribe, getDialysisPrescribeErr := service.GetLastDialysisPrescribeByModeId(adminInfo.CurrentOrgId, patientID, schedual.ModeId)
	if getDialysisPrescribeErr != nil {
		this.ErrorLog("获取透析处方失败:%v", getDialysisPrescribeErr)
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
		return
	}

	systemDialysisPrescribe, getSystemDialysisPrescribeErr := service.GetSystemDialysisPrescribeByModeId(adminInfo.CurrentOrgId, schedual.ModeId)
	if getSystemDialysisPrescribeErr != nil {
		this.ErrorLog("获取系统透析处方失败:%v", getSystemDialysisPrescribeErr)
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
		return
	}

	if getLPEErr != nil {
		this.ErrorLog("获取上一次透前评估失败:%v", getLPEErr)
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
		return
	}

	lastDryWeightDislysis, getDryErr := service.GetLastDryWeight(adminInfo.CurrentOrgId, patientID)
	if getDryErr != nil {
		this.ErrorLog("获取最后一条干体重失败:%v", getDryErr)
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
		return
	}

	headNurses, _ := service.GetAllSpecialPermissionAdminUsersWithoutStatus(adminInfo.CurrentOrgId, adminInfo.CurrentAppId, models.SpecialPermissionTypeHeadNurse)

	_, record := service.FindAutomaticReduceRecordByOrgId(adminInfo.CurrentOrgId)
	if record.IsOpen == 1 {
		niprocart_good_type_id, _ := beego.AppConfig.Int64("niprocart")
		jms_good_type_id, _ := beego.AppConfig.Int64("jms")
		fistula_needle_set_good_type_id, _ := beego.AppConfig.Int64("fistula_needle_set")
		fistula_needle_set_16_good_type_id, _ := beego.AppConfig.Int64("fistula_needle_set_16")
		hemoperfusion_good_type_id, _ := beego.AppConfig.Int64("hemoperfusion")
		dialyser_sterilised_good_type_id, _ := beego.AppConfig.Int64("dialyser_sterilised")
		filtryzer_good_type_id, _ := beego.AppConfig.Int64("filtryzer")
		dialyzers_good_type_id, _ := beego.AppConfig.Int64("dialyzers")
		injector_good_type_id, _ := beego.AppConfig.Int64("injector")
		bloodlines_good_type_id, _ := beego.AppConfig.Int64("bloodlines")
		tubingHemodialysis_good_type_id, _ := beego.AppConfig.Int64("tubingHemodialysis")
		safe_package_good_type_id, _ := beego.AppConfig.Int64("package")
		aliquid_good_type_id, _ := beego.AppConfig.Int64("aliquid")

		niprocart_info, _ := service.FindWarehouseInfoByGoodType(niprocart_good_type_id, adminInfo.CurrentOrgId)
		jms_info, _ := service.FindWarehouseInfoByGoodType(jms_good_type_id, adminInfo.CurrentOrgId)
		fistula_needle_set_info, _ := service.FindWarehouseInfoByGoodType(fistula_needle_set_good_type_id, adminInfo.CurrentOrgId)
		fistula_needle_set_16_info, _ := service.FindWarehouseInfoByGoodType(fistula_needle_set_16_good_type_id, adminInfo.CurrentOrgId)
		hemoperfusion_info, _ := service.FindWarehouseInfoByGoodType(hemoperfusion_good_type_id, adminInfo.CurrentOrgId)
		dialyser_sterilised_info, _ := service.FindWarehouseInfoByGoodType(dialyser_sterilised_good_type_id, adminInfo.CurrentOrgId)
		filtryzer_info, _ := service.FindWarehouseInfoByGoodType(filtryzer_good_type_id, adminInfo.CurrentOrgId)
		dialyzers_info, _ := service.FindWarehouseInfoByGoodType(dialyzers_good_type_id, adminInfo.CurrentOrgId)
		injector_info, _ := service.FindWarehouseInfoByGoodType(injector_good_type_id, adminInfo.CurrentOrgId)
		bloodlines_info, _ := service.FindWarehouseInfoByGoodType(bloodlines_good_type_id, adminInfo.CurrentOrgId)
		tubingHemodialysis_info, _ := service.FindWarehouseInfoByGoodType(tubingHemodialysis_good_type_id, adminInfo.CurrentOrgId)
		safe_package_info, _ := service.FindWarehouseInfoByGoodType(safe_package_good_type_id, adminInfo.CurrentOrgId)
		aliquid_info, _ := service.FindWarehouseInfoByGoodType(aliquid_good_type_id, adminInfo.CurrentOrgId)

		returnData := map[string]interface{}{
			"patient":                     patient,
			"schedual":                    schedual,
			"prescription":                dialysisPrescribe,
			"solution":                    dialysisSolution,
			"receiver_treatment_access":   receiverTreatmentAccess,
			"predialysis_evaluation":      predialysisEvaluation,
			"doctor_advices":              doctorAdvices,
			"double_check":                doubleCheck,
			"assessment_after_dislysis":   assessmentAfterDislysis,
			"treatment_summary":           treatmentSummary,
			"monitor_records":             monitorRecords,
			"dialysis_order":              dialysisOrder,
			"doctors":                     admins,
			"devices":                     devices,
			"device_numbers":              deviceNumbers,
			"niprocart_info":              niprocart_info,
			"jms_info":                    jms_info,
			"fistula_needle_set_info":     fistula_needle_set_info,
			"fistula_needle_set_16_info":  fistula_needle_set_16_info,
			"hemoperfusion_info":          hemoperfusion_info,
			"dialyser_sterilised_info":    dialyser_sterilised_info,
			"filtryzer_info":              filtryzer_info,
			"dialyzers_info":              dialyzers_info,
			"injector_info":               injector_info,
			"bloodlines_info":             bloodlines_info,
			"tubingHemodialysis_info":     tubingHemodialysis_info,
			"safe_package_info":           safe_package_info,
			"aliquid_info":                aliquid_info,
			"config":                      record,
			"lastPredialysisEvaluation":   lastPredialysisEvaluation,
			"lastMonitorRecord":           lastMonitorRecord,
			"lastAssessmentAfterDislysis": lastAssessmentAfterDislysis,
			"lastDialysisPrescribe":       lastDialysisPrescribe,
			"lastDryWeightDislysis":       lastDryWeightDislysis,
			"headNurses":                  headNurses,
			"system_prescribe":            systemDialysisPrescribe,
		}
		this.ServeSuccessJSON(returnData)

	} else {
		returnData := map[string]interface{}{
			"patient":                     patient,
			"schedual":                    schedual,
			"prescription":                dialysisPrescribe,
			"solution":                    dialysisSolution,
			"receiver_treatment_access":   receiverTreatmentAccess,
			"predialysis_evaluation":      predialysisEvaluation,
			"doctor_advices":              doctorAdvices,
			"double_check":                doubleCheck,
			"assessment_after_dislysis":   assessmentAfterDislysis,
			"treatment_summary":           treatmentSummary,
			"monitor_records":             monitorRecords,
			"dialysis_order":              dialysisOrder,
			"doctors":                     admins,
			"devices":                     devices,
			"device_numbers":              deviceNumbers,
			"lastPredialysisEvaluation":   lastPredialysisEvaluation,
			"lastMonitorRecord":           lastMonitorRecord,
			"lastAssessmentAfterDislysis": lastAssessmentAfterDislysis,
			"lastDialysisPrescribe":       lastDialysisPrescribe,
			"lastDryWeightDislysis":       lastDryWeightDislysis,
			"headNurses":                  headNurses,
			"system_prescribe":            systemDialysisPrescribe,
		}
		this.ServeSuccessJSON(returnData)
	}

}

type EditMonitorParamObject struct {
	ID             int64 `json:"id"`
	MonitoringDate int64 `json:"monitoring_date"`
	OperateTime    int64 `json:"operate_time"`
	// MonitoringTime        string  `json:"monitoring_time"`
	SystolicBP               float64 `json:"systolic_bp"`
	DiastolicBP              float64 `json:"diastolic_bp"`
	PulseFrequency           float64 `json:"pulse_frequency"`
	BreathingRated           float64 `json:"breathing_rated"`
	BloodFlowVolume          float64 `json:"blood_flow_volume"`
	VenousPressure           float64 `json:"venous_pressure"`
	TransmembranePressure    float64 `json:"transmembrane_pressure"`
	UltrafiltrationVolume    float64 `json:"ultrafiltration_volume"`
	UltrafiltrationRate      float64 `json:"ultrafiltration_rate"`
	ArterialPressure         float64 `json:"arterial_pressure"`
	SodiumConcentration      float64 `json:"sodium_concentration"`
	DialysateTemperature     float64 `json:"dialysate_temperature"`
	Temperature              float64 `json:"temperature"`
	ReplacementRate          float64 `json:"replacement_rate"`
	DisplacementQuantity     float64 `json:"displacement_quantity"`
	KTV                      float64 `json:"ktv"`
	Symptom                  string  `json:"symptom"`
	Dispose                  string  `json:"dispose"`
	Result                   string  `json:"result"`
	Conductivity             float64 `json:"conductivity"`
	DisplacementFlowQuantity float64 `json:"displacement_flow_quantity"`
	BloodOxygenSaturation    string  `gorm:"column:blood_oxygen_saturation" json:"blood_oxygen_saturation" form:"blood_oxygen_saturation"`
}

// /api/dislysis/monitor/edit [post]
// @param patient_id:int 患者id
// @param schedule_date:int 排班日期
// 下面的参数放到 body
// @param id?:int 监测记录ID（id为0时为创建记录，不为0时为修改记录）
// @param monitoring_date:int 排班日期
// @param operate_time:int 实际测量日期
// @param monitoring_time:string (HH:mm) 监测时间 废弃
// @param systolic_bp?:float 收缩压
// @param diastolic_bp?:float 舒张压
// @param pulse_frequency?:float 心率
// @param breathing_rated?:float 呼吸频率
// @param blood_flow_volume?:float 血流量
// @param venous_pressure?:float 静脉压
// @param transmembrane_pressure?:float 跨膜压
// @param ultrafiltration_volume?:float 超滤量
// @param ultrafiltration_rate?:float 超滤率
// @param arterial_pressure?:float 动脉压
// @param sodium_concentration?:float 钠浓度
// @param dialysate_temperature?:float 透析液温度
// @param replacement_rate?:float 置换率
// @param displacement_quantity?:float 置换量
// @param ktv?:float KT/V
// @param symptom?:string 病情变化
// @param dispose?:string 处理
// @param result?:string 结果
func (this *DialysisRecordAPIController) EditMonitor() {
	patientID, _ := this.GetInt64("patient_id")
	scheduleDate, _ := this.GetInt64("schedule_date")
	if patientID <= 0 || scheduleDate <= 0 {
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}
	var monitorParam EditMonitorParamObject
	if parseErr := json.Unmarshal(this.Ctx.Input.RequestBody, &monitorParam); parseErr != nil {
		this.ErrorLog("参数解析失败:%v", parseErr)
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamFormatWrong)
		return
	}
	if monitorParam.MonitoringDate != scheduleDate {
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}

	adminUserInfo := this.GetAdminUserInfo()
	schedule, getScheduleErr := service.MobileGetSchedualDetail(adminUserInfo.CurrentOrgId, patientID, scheduleDate)
	if getScheduleErr != nil {
		this.ErrorLog("获取排班信息失败：%v", getScheduleErr)
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
		return
	} else if schedule == nil {
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeScheduleNotExist)
		return
	}
	// TODO 其实这里合理的逻辑是“透析记录存在的情况下才能添加监测记录的”
	dialysisOrder, getDialysisOrderErr := service.MobileGetDialysisRecord(adminUserInfo.CurrentOrgId, patientID, scheduleDate)
	if getDialysisOrderErr != nil {
		this.ErrorLog("获取透析记录失败：%v", getDialysisOrderErr)
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
		return
	}
	orderID := int64(0)
	if dialysisOrder != nil {
		orderID = dialysisOrder.ID
	}

	if monitorParam.ID <= 0 { // 新建记录
		monitor := models.MonitoringRecord{
			UserOrgId:       adminUserInfo.CurrentOrgId,
			PatientId:       patientID,
			DialysisOrderId: orderID,
			MonitoringDate:  monitorParam.MonitoringDate,
			OperateTime:     monitorParam.OperateTime,
			// MonitoringTime:         monitorParam.MonitoringTime,
			PulseFrequency:           monitorParam.PulseFrequency,
			BreathingRate:            monitorParam.BreathingRated,
			SystolicBloodPressure:    monitorParam.SystolicBP,
			DiastolicBloodPressure:   monitorParam.DiastolicBP,
			BloodFlowVolume:          monitorParam.BloodFlowVolume,
			VenousPressure:           monitorParam.VenousPressure,
			ArterialPressure:         monitorParam.ArterialPressure,
			TransmembranePressure:    monitorParam.TransmembranePressure,
			UltrafiltrationRate:      monitorParam.UltrafiltrationRate,
			UltrafiltrationVolume:    monitorParam.UltrafiltrationVolume,
			SodiumConcentration:      monitorParam.SodiumConcentration,
			DialysateTemperature:     monitorParam.DialysateTemperature,
			Temperature:              monitorParam.Temperature,
			ReplacementRate:          monitorParam.ReplacementRate,
			DisplacementQuantity:     monitorParam.DisplacementQuantity,
			Ktv:                      monitorParam.KTV,
			Symptom:                  monitorParam.Symptom,
			Dispose:                  monitorParam.Dispose,
			Result:                   monitorParam.Result,
			MonitoringNurse:          adminUserInfo.AdminUser.Id,
			Conductivity:             monitorParam.Conductivity,
			DisplacementFlowQuantity: monitorParam.DisplacementFlowQuantity,
			Status:                1,
			CreatedTime:           time.Now().Unix(),
			UpdatedTime:           time.Now().Unix(),
			BloodOxygenSaturation: monitorParam.BloodOxygenSaturation,
			Creator:               adminUserInfo.AdminUser.Id,
		}
		createErr := service.CreateMonitor(&monitor)
		if createErr != nil {
			this.ErrorLog("创建监测记录失败：%v", createErr)
			this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
			return
		}
		this.ServeSuccessJSON(map[string]interface{}{
			"monitor": monitor,
		})

	} else { // 修改记录
		monitor, getMonitorErr := service.GetMonitor(adminUserInfo.CurrentOrgId, patientID, monitorParam.ID)
		if getMonitorErr != nil {
			this.ErrorLog("获取透析监测记录失败：%v", getMonitorErr)
			this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
			return
		} else if monitor == nil {
			this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeMonitorNotExist)
			return
		}

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

		monitor.OperateTime = monitorParam.OperateTime
		monitor.PulseFrequency = monitorParam.PulseFrequency
		monitor.BreathingRate = monitorParam.BreathingRated
		monitor.SystolicBloodPressure = monitorParam.SystolicBP
		monitor.DiastolicBloodPressure = monitorParam.DiastolicBP
		monitor.BloodFlowVolume = monitorParam.BloodFlowVolume
		monitor.VenousPressure = monitorParam.VenousPressure
		monitor.ArterialPressure = monitorParam.ArterialPressure
		monitor.TransmembranePressure = monitorParam.TransmembranePressure
		monitor.UltrafiltrationRate = monitorParam.UltrafiltrationRate
		monitor.UltrafiltrationVolume = monitorParam.UltrafiltrationVolume
		monitor.SodiumConcentration = monitorParam.SodiumConcentration
		monitor.DialysateTemperature = monitorParam.DialysateTemperature
		monitor.Temperature = monitorParam.Temperature
		monitor.ReplacementRate = monitorParam.ReplacementRate
		monitor.DisplacementQuantity = monitorParam.DisplacementQuantity
		monitor.Conductivity = monitorParam.Conductivity
		monitor.DisplacementFlowQuantity = monitorParam.DisplacementFlowQuantity
		monitor.Ktv = monitorParam.KTV
		monitor.Symptom = monitorParam.Symptom
		monitor.Dispose = monitorParam.Dispose
		monitor.Result = monitorParam.Result
		monitor.MonitoringNurse = adminUserInfo.AdminUser.Id
		monitor.UpdatedTime = time.Now().Unix()
		monitor.Modify = adminUserInfo.AdminUser.Id
		monitor.BloodOxygenSaturation = monitorParam.BloodOxygenSaturation
		updateErr := service.UpdateMonitor(monitor)
		if updateErr != nil {
			this.ErrorLog("修改透析监测记录失败:%v", updateErr)
			this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
			return
		}
		this.ServeSuccessJSON(map[string]interface{}{
			"monitor": monitor,
		})
	}
}

// /api/dialysis/start_record [post]
// @param patient_id:int
// @param date:string 排班时间 (yyyy-mm-dd)
// @param nurse:int 上机护士
// @param bed:int 上机床位号
func (this *DialysisRecordAPIController) StartDialysis() {
	patientID, _ := this.GetInt64("patient_id")
	recordDateStr := this.GetString("date")
	nurseID, _ := this.GetInt64("nurse")
	punctureNurseId, _ := this.GetInt64("puncture_nurse")
	startDateStr := this.GetString("start_time")
	blood_drawing, _ := this.GetInt64("blood_drawing")
	schedual_type, _ := this.GetInt64("schedual_type")

	bedID, _ := this.GetInt64("bed")
	if patientID <= 0 || len(recordDateStr) == 0 || nurseID <= 0 || bedID <= 0 {
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}

	recordDate, parseErr := utils.ParseTimeStringToTime("2006-01-02", recordDateStr)
	if parseErr != nil {
		this.ErrorLog("时间解析失败:%v", parseErr)
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}

	startDate, parseErr := utils.ParseTimeStringToTime("2006-01-02 15:04", startDateStr)
	if parseErr != nil {
		this.ErrorLog("时间解析失败:%v", parseErr)
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}

	adminUserInfo := this.GetAdminUserInfo()
	patient, getPatientErr := service.MobileGetPatientById(adminUserInfo.CurrentOrgId, patientID)
	if getPatientErr != nil {
		this.ErrorLog("获取患者信息失败：%v", getPatientErr)
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
		return
	} else if patient == nil {
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodePatientNoExist)
		return
	}

	nurse, getNurseErr := service.GetAdminUserByUserID(nurseID)
	if getNurseErr != nil {
		this.ErrorLog("获取护士失败:%v", getNurseErr)
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
		return
	} else if nurse == nil {
		this.ErrorLog("护士不存在")
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}

	nurse, getNurseErr = service.GetAdminUserByUserID(punctureNurseId)
	if getNurseErr != nil {
		this.ErrorLog("获取护士失败:%v", getNurseErr)
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
		return
	} else if nurse == nil {
		this.ErrorLog("护士不存在")
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}

	deviceNumber, getDeviceNumberErr := service.GetDeviceNumberByID(adminUserInfo.CurrentOrgId, bedID)
	if getDeviceNumberErr != nil {
		this.ErrorLog("获取床位号失败:%v", getDeviceNumberErr)
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
		return
	} else if deviceNumber == nil {
		this.ErrorLog("床位号不存在")
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}

	dialysisRecord, getRecordErr := service.MobileGetDialysisRecord(adminUserInfo.CurrentOrgId, patientID, recordDate.Unix())
	if getRecordErr != nil {
		this.ErrorLog("获取透析记录失败:%v", getRecordErr)
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
		return
	} else if dialysisRecord != nil {
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorDialysisOrderRepeatStart)
		return
	}

	template, _ := service.GetOrgInfoTemplate(adminUserInfo.CurrentOrgId)

	//是否启动自动扣减功能
	_, config := service.FindAutomaticReduceRecordByOrgId(adminUserInfo.CurrentOrgId)

	//启动的话
	if config.IsOpen == 1 {
		niprocart, _ := beego.AppConfig.Int64("niprocart")
		jms, _ := beego.AppConfig.Int64("jms")
		fistula_needle_set, _ := beego.AppConfig.Int64("fistula_needle_set")
		fistula_needle_set_16, _ := beego.AppConfig.Int64("fistula_needle_set_16")
		hemoperfusion, _ := beego.AppConfig.Int64("hemoperfusion")
		dialyser_sterilised, _ := beego.AppConfig.Int64("dialyser_sterilised")
		filtryzer, _ := beego.AppConfig.Int64("filtryzer")

		dialyzers, _ := beego.AppConfig.Int64("dialyzers")
		injector, _ := beego.AppConfig.Int64("injector")
		bloodlines, _ := beego.AppConfig.Int64("bloodlines")
		tubingHemodialysis, _ := beego.AppConfig.Int64("tubingHemodialysis")
		safe_package, _ := beego.AppConfig.Int64("package")
		aliquid, _ := beego.AppConfig.Int64("aliquid")

		//库存自动扣减功能
		_, prescription := service.FindDialysisPrescriptionByReordDate(patientID, recordDate.Unix(), adminUserInfo.CurrentOrgId)
		if prescription.ID > 0 {
			out, err := service.FindStockOutByIsSys(adminUserInfo.CurrentOrgId, 1, recordDate.Unix())
			if err == gorm.ErrRecordNotFound {
				//没有记录，则创建出库单
				timeStr := time.Now().Format("2006-01-02")
				timeArr := strings.Split(timeStr, "-")
				total, _ := service.FindAllWarehouseOut(adminUserInfo.CurrentOrgId)
				total = total + 1
				warehousing_out_order := strconv.FormatInt(adminUserInfo.CurrentOrgId, 10) + timeArr[0] + timeArr[1] + timeArr[2] + "000"
				number, _ := strconv.ParseInt(warehousing_out_order, 10, 64)
				number = number + total
				warehousing_out_order = "CKD" + strconv.FormatInt(number, 10)
				creater := adminUserInfo.AdminUser.Id
				warehouseOut := models.WarehouseOut{
					WarehouseOutOrderNumber: warehousing_out_order,
					OperationTime:           time.Now().Unix(),
					OrgId:                   adminUserInfo.CurrentOrgId,
					Creater:                 creater,
					Ctime:                   time.Now().Unix(),
					Status:                  1,
					WarehouseOutTime:        recordDate.Unix(),
					Dealer:                  0,
					Manufacturer:            0,
					Type:                    1,
					IsSys:                   1,
				}
				err := service.AddSigleWarehouseOut(&warehouseOut)
				if err != nil {
					utils.TraceLog("创建出库单失败 err = %v", err)
				} else {

					if prescription.Niprocart > 0 {

						warehouseOutInfo := &models.WarehouseOutInfo{
							WarehouseOutOrderNumber: warehouseOut.WarehouseOutOrderNumber,
							WarehouseOutId:          warehouseOut.ID,
							Count:                   1,
							Status:                  1,
							Ctime:                   time.Now().Unix(),
							Remark:                  "",
							OrgId:                   adminUserInfo.CurrentOrgId,
							Type:                    1,
							Manufacturer:            0,
							Dealer:                  0,
							IsSys:                   1,
							SysRecordTime:           startDate.Unix(),
						}
						//查出入库记录中最后一条记录
						stockInInfo, _ := service.FindLastStockInInfoRecord(prescription.Niprocart, adminUserInfo.CurrentOrgId)
						warehouseOutInfo.Price = stockInInfo.Price
						warehouseOutInfo.GoodId = prescription.Niprocart
						warehouseOutInfo.GoodTypeId = niprocart
						err := service.AddSigleWarehouseOutInfo(warehouseOutInfo)

						if err == nil {
							details := &models.AutomaticReduceDetail{
								WarehouseOutId:          warehouseOutInfo.ID,
								WarehouseOutOrderNumber: warehouseOutInfo.WarehouseOutOrderNumber,
								PatientId:               patientID,
								Ctime:                   time.Now().Unix(),
								Mtime:                   time.Now().Unix(),
								Status:                  1,
								RecordTime:              startDate.Unix(),
								OrgId:                   adminUserInfo.CurrentOrgId,
								GoodId:                  prescription.Niprocart,
								GoodTypeId:              niprocart,
							}
							service.AddSigleAutoReduceRecordInfo(details)
						}
					}
					if prescription.Jms > 0 {
						warehouseOutInfo := &models.WarehouseOutInfo{
							WarehouseOutOrderNumber: warehouseOut.WarehouseOutOrderNumber,
							WarehouseOutId:          warehouseOut.ID,
							Count:                   1,
							Status:                  1,
							Ctime:                   time.Now().Unix(),
							Remark:                  "",
							OrgId:                   adminUserInfo.CurrentOrgId,
							Type:                    1,
							Manufacturer:            0,
							Dealer:                  0,
							IsSys:                   1,
							SysRecordTime:           startDate.Unix(),
						}
						stockInInfo, _ := service.FindLastStockInInfoRecord(prescription.Jms, adminUserInfo.CurrentOrgId)
						warehouseOutInfo.Price = stockInInfo.Price
						warehouseOutInfo.GoodId = prescription.Jms
						warehouseOutInfo.GoodTypeId = jms
						err := service.AddSigleWarehouseOutInfo(warehouseOutInfo)
						if err == nil {
							details := &models.AutomaticReduceDetail{
								WarehouseOutId:          warehouseOutInfo.ID,
								WarehouseOutOrderNumber: warehouseOutInfo.WarehouseOutOrderNumber,
								PatientId:               patientID,
								Ctime:                   time.Now().Unix(),
								Mtime:                   time.Now().Unix(),
								Status:                  1,
								RecordTime:              startDate.Unix(),
								OrgId:                   adminUserInfo.CurrentOrgId,
								GoodId:                  prescription.Jms,
								GoodTypeId:              jms,
							}
							service.AddSigleAutoReduceRecordInfo(details)
						}
					}
					if prescription.FistulaNeedleSet > 0 {
						warehouseOutInfo := &models.WarehouseOutInfo{
							WarehouseOutOrderNumber: warehouseOut.WarehouseOutOrderNumber,
							WarehouseOutId:          warehouseOut.ID,
							Count:                   1,
							Status:                  1,
							Ctime:                   time.Now().Unix(),
							Remark:                  "",
							OrgId:                   adminUserInfo.CurrentOrgId,
							Type:                    1,
							Manufacturer:            0,
							Dealer:                  0,
							IsSys:                   1,
							SysRecordTime:           startDate.Unix(),
						}
						stockInInfo, _ := service.FindLastStockInInfoRecord(prescription.FistulaNeedleSet, adminUserInfo.CurrentOrgId)
						warehouseOutInfo.Price = stockInInfo.Price
						warehouseOutInfo.GoodId = prescription.FistulaNeedleSet
						warehouseOutInfo.GoodTypeId = fistula_needle_set

						err := service.AddSigleWarehouseOutInfo(warehouseOutInfo)

						if err == nil {
							details := &models.AutomaticReduceDetail{
								WarehouseOutId:          warehouseOutInfo.ID,
								WarehouseOutOrderNumber: warehouseOutInfo.WarehouseOutOrderNumber,
								PatientId:               patientID,
								Ctime:                   time.Now().Unix(),
								Mtime:                   time.Now().Unix(),
								Status:                  1,
								RecordTime:              startDate.Unix(),
								OrgId:                   adminUserInfo.CurrentOrgId,
								GoodId:                  prescription.FistulaNeedleSet,
								GoodTypeId:              fistula_needle_set,
							}
							service.AddSigleAutoReduceRecordInfo(details)
						}
					}
					if prescription.FistulaNeedleSet16 > 0 {
						warehouseOutInfo := &models.WarehouseOutInfo{
							WarehouseOutOrderNumber: warehouseOut.WarehouseOutOrderNumber,
							WarehouseOutId:          warehouseOut.ID,
							Count:                   1,
							Status:                  1,
							Ctime:                   time.Now().Unix(),
							Remark:                  "",
							OrgId:                   adminUserInfo.CurrentOrgId,
							Type:                    1,
							Manufacturer:            0,
							Dealer:                  0,
							IsSys:                   1,
							SysRecordTime:           startDate.Unix(),
						}
						stockInInfo, _ := service.FindLastStockInInfoRecord(prescription.FistulaNeedleSet16, adminUserInfo.CurrentOrgId)
						warehouseOutInfo.Price = stockInInfo.Price
						warehouseOutInfo.GoodId = prescription.FistulaNeedleSet16
						warehouseOutInfo.GoodTypeId = fistula_needle_set_16

						err := service.AddSigleWarehouseOutInfo(warehouseOutInfo)

						if err == nil {
							details := &models.AutomaticReduceDetail{
								WarehouseOutId:          warehouseOutInfo.ID,
								WarehouseOutOrderNumber: warehouseOutInfo.WarehouseOutOrderNumber,
								PatientId:               patientID,
								Ctime:                   time.Now().Unix(),
								Mtime:                   time.Now().Unix(),
								Status:                  1,
								RecordTime:              startDate.Unix(),
								OrgId:                   adminUserInfo.CurrentOrgId,
								GoodId:                  prescription.FistulaNeedleSet16,
								GoodTypeId:              fistula_needle_set_16,
							}
							service.AddSigleAutoReduceRecordInfo(details)

						}

					}
					if prescription.Hemoperfusion > 0 {
						warehouseOutInfo := &models.WarehouseOutInfo{
							WarehouseOutOrderNumber: warehouseOut.WarehouseOutOrderNumber,
							WarehouseOutId:          warehouseOut.ID,
							Count:                   1,
							Status:                  1,
							Ctime:                   time.Now().Unix(),
							Remark:                  "",
							OrgId:                   adminUserInfo.CurrentOrgId,
							Type:                    1,
							Manufacturer:            0,
							Dealer:                  0,
							IsSys:                   1,
							SysRecordTime:           startDate.Unix(),
						}
						stockInInfo, _ := service.FindLastStockInInfoRecord(prescription.Hemoperfusion, adminUserInfo.CurrentOrgId)
						warehouseOutInfo.Price = stockInInfo.Price
						warehouseOutInfo.GoodId = prescription.Hemoperfusion
						warehouseOutInfo.GoodTypeId = hemoperfusion

						err := service.AddSigleWarehouseOutInfo(warehouseOutInfo)

						if err == nil {
							details := &models.AutomaticReduceDetail{
								WarehouseOutId:          warehouseOutInfo.ID,
								WarehouseOutOrderNumber: warehouseOutInfo.WarehouseOutOrderNumber,
								PatientId:               patientID,
								Ctime:                   time.Now().Unix(),
								Mtime:                   time.Now().Unix(),
								Status:                  1,
								RecordTime:              startDate.Unix(),
								OrgId:                   adminUserInfo.CurrentOrgId,
								GoodId:                  prescription.Hemoperfusion,
								GoodTypeId:              hemoperfusion,
							}
							service.AddSigleAutoReduceRecordInfo(details)

						}

					}
					if prescription.DialyserSterilised > 0 {
						warehouseOutInfo := &models.WarehouseOutInfo{
							WarehouseOutOrderNumber: warehouseOut.WarehouseOutOrderNumber,
							WarehouseOutId:          warehouseOut.ID,
							Count:                   1,
							Status:                  1,
							Ctime:                   time.Now().Unix(),
							Remark:                  "",
							OrgId:                   adminUserInfo.CurrentOrgId,
							Type:                    1,
							Manufacturer:            0,
							Dealer:                  0,
							IsSys:                   1,
							SysRecordTime:           startDate.Unix(),
						}
						stockInInfo, _ := service.FindLastStockInInfoRecord(prescription.DialyserSterilised, adminUserInfo.CurrentOrgId)
						warehouseOutInfo.Price = stockInInfo.Price
						warehouseOutInfo.GoodId = prescription.DialyserSterilised
						warehouseOutInfo.GoodTypeId = dialyser_sterilised
						err := service.AddSigleWarehouseOutInfo(warehouseOutInfo)
						if err == nil {
							details := &models.AutomaticReduceDetail{
								WarehouseOutId:          warehouseOutInfo.ID,
								WarehouseOutOrderNumber: warehouseOutInfo.WarehouseOutOrderNumber,
								PatientId:               patientID,
								Ctime:                   time.Now().Unix(),
								Mtime:                   time.Now().Unix(),
								Status:                  1,
								RecordTime:              startDate.Unix(),
								OrgId:                   adminUserInfo.CurrentOrgId,
								GoodId:                  prescription.DialyserSterilised,
								GoodTypeId:              dialyser_sterilised,
							}
							service.AddSigleAutoReduceRecordInfo(details)

						}

					}
					if prescription.Filtryzer > 0 {

						warehouseOutInfo := &models.WarehouseOutInfo{
							WarehouseOutOrderNumber: warehouseOut.WarehouseOutOrderNumber,
							WarehouseOutId:          warehouseOut.ID,
							Count:                   1,
							Status:                  1,
							Ctime:                   time.Now().Unix(),
							Remark:                  "",
							OrgId:                   adminUserInfo.CurrentOrgId,
							Type:                    1,
							Manufacturer:            0,
							Dealer:                  0,
							IsSys:                   1,
							SysRecordTime:           startDate.Unix(),
						}
						stockInInfo, _ := service.FindLastStockInInfoRecord(prescription.Filtryzer, adminUserInfo.CurrentOrgId)
						warehouseOutInfo.Price = stockInInfo.Price
						warehouseOutInfo.GoodId = prescription.Filtryzer
						warehouseOutInfo.GoodTypeId = filtryzer
						err := service.AddSigleWarehouseOutInfo(warehouseOutInfo)

						if err == nil {
							details := &models.AutomaticReduceDetail{
								WarehouseOutId:          warehouseOutInfo.ID,
								WarehouseOutOrderNumber: warehouseOutInfo.WarehouseOutOrderNumber,
								PatientId:               patientID,
								Ctime:                   time.Now().Unix(),
								Mtime:                   time.Now().Unix(),
								Status:                  1,
								RecordTime:              startDate.Unix(),
								OrgId:                   adminUserInfo.CurrentOrgId,
								GoodId:                  prescription.Filtryzer,
								GoodTypeId:              filtryzer,
							}
							service.AddSigleAutoReduceRecordInfo(details)
						}

					}
					if prescription.Dialyzers > 0 {
						warehouseOutInfo := &models.WarehouseOutInfo{
							WarehouseOutOrderNumber: warehouseOut.WarehouseOutOrderNumber,
							WarehouseOutId:          warehouseOut.ID,
							Count:                   1,
							Status:                  1,
							Ctime:                   time.Now().Unix(),
							Remark:                  "",
							OrgId:                   adminUserInfo.CurrentOrgId,
							Type:                    1,
							Manufacturer:            0,
							Dealer:                  0,
							IsSys:                   1,
							SysRecordTime:           startDate.Unix(),
						}
						stockInInfo, _ := service.FindLastStockInInfoRecord(prescription.Dialyzers, adminUserInfo.CurrentOrgId)
						warehouseOutInfo.Price = stockInInfo.Price
						warehouseOutInfo.GoodId = prescription.Dialyzers
						warehouseOutInfo.GoodTypeId = dialyzers
						err := service.AddSigleWarehouseOutInfo(warehouseOutInfo)

						if err == nil {
							details := &models.AutomaticReduceDetail{
								WarehouseOutId:          warehouseOutInfo.ID,
								WarehouseOutOrderNumber: warehouseOutInfo.WarehouseOutOrderNumber,
								PatientId:               patientID,
								Ctime:                   time.Now().Unix(),
								Mtime:                   time.Now().Unix(),
								Status:                  1,
								RecordTime:              startDate.Unix(),
								OrgId:                   adminUserInfo.CurrentOrgId,
								GoodId:                  prescription.Dialyzers,
								GoodTypeId:              dialyzers,
							}
							service.AddSigleAutoReduceRecordInfo(details)
						}

					}
					if prescription.Injector > 0 {
						warehouseOutInfo := &models.WarehouseOutInfo{
							WarehouseOutOrderNumber: warehouseOut.WarehouseOutOrderNumber,
							WarehouseOutId:          warehouseOut.ID,
							Count:                   1,
							Status:                  1,
							Ctime:                   time.Now().Unix(),
							Remark:                  "",
							OrgId:                   adminUserInfo.CurrentOrgId,
							Type:                    1,
							Manufacturer:            0,
							Dealer:                  0,
							IsSys:                   1,
							SysRecordTime:           startDate.Unix(),
						}
						stockInInfo, _ := service.FindLastStockInInfoRecord(prescription.Injector, adminUserInfo.CurrentOrgId)
						warehouseOutInfo.Price = stockInInfo.Price
						warehouseOutInfo.GoodId = prescription.Injector
						warehouseOutInfo.GoodTypeId = injector
						err := service.AddSigleWarehouseOutInfo(warehouseOutInfo)

						if err == nil {
							details := &models.AutomaticReduceDetail{
								WarehouseOutId:          warehouseOutInfo.ID,
								WarehouseOutOrderNumber: warehouseOutInfo.WarehouseOutOrderNumber,
								PatientId:               patientID,
								Ctime:                   time.Now().Unix(),
								Mtime:                   time.Now().Unix(),
								Status:                  1,
								RecordTime:              startDate.Unix(),
								OrgId:                   adminUserInfo.CurrentOrgId,
								GoodId:                  prescription.Injector,
								GoodTypeId:              injector,
							}
							service.AddSigleAutoReduceRecordInfo(details)
						}

					}
					if prescription.Bloodlines > 0 {
						warehouseOutInfo := &models.WarehouseOutInfo{
							WarehouseOutOrderNumber: warehouseOut.WarehouseOutOrderNumber,
							WarehouseOutId:          warehouseOut.ID,
							Count:                   1,
							Status:                  1,
							Ctime:                   time.Now().Unix(),
							Remark:                  "",
							OrgId:                   adminUserInfo.CurrentOrgId,
							Type:                    1,
							Manufacturer:            0,
							Dealer:                  0,
							IsSys:                   1,
							SysRecordTime:           startDate.Unix(),
						}
						stockInInfo, _ := service.FindLastStockInInfoRecord(prescription.Bloodlines, adminUserInfo.CurrentOrgId)
						warehouseOutInfo.Price = stockInInfo.Price
						warehouseOutInfo.GoodId = prescription.Bloodlines
						warehouseOutInfo.GoodTypeId = bloodlines
						err := service.AddSigleWarehouseOutInfo(warehouseOutInfo)

						if err == nil {
							details := &models.AutomaticReduceDetail{
								WarehouseOutId:          warehouseOutInfo.ID,
								WarehouseOutOrderNumber: warehouseOutInfo.WarehouseOutOrderNumber,
								PatientId:               patientID,
								Ctime:                   time.Now().Unix(),
								Mtime:                   time.Now().Unix(),
								Status:                  1,
								RecordTime:              startDate.Unix(),
								OrgId:                   adminUserInfo.CurrentOrgId,
								GoodId:                  prescription.Bloodlines,
								GoodTypeId:              bloodlines,
							}
							service.AddSigleAutoReduceRecordInfo(details)
						}

					}
					if prescription.TubingHemodialysis > 0 {
						warehouseOutInfo := &models.WarehouseOutInfo{
							WarehouseOutOrderNumber: warehouseOut.WarehouseOutOrderNumber,
							WarehouseOutId:          warehouseOut.ID,
							Count:                   1,
							Status:                  1,
							Ctime:                   time.Now().Unix(),
							Remark:                  "",
							OrgId:                   adminUserInfo.CurrentOrgId,
							Type:                    1,
							Manufacturer:            0,
							Dealer:                  0,
							IsSys:                   1,
							SysRecordTime:           startDate.Unix(),
						}
						stockInInfo, _ := service.FindLastStockInInfoRecord(prescription.TubingHemodialysis, adminUserInfo.CurrentOrgId)
						warehouseOutInfo.Price = stockInInfo.Price
						warehouseOutInfo.GoodId = prescription.TubingHemodialysis
						warehouseOutInfo.GoodTypeId = tubingHemodialysis
						err := service.AddSigleWarehouseOutInfo(warehouseOutInfo)

						if err == nil {
							details := &models.AutomaticReduceDetail{
								WarehouseOutId:          warehouseOutInfo.ID,
								WarehouseOutOrderNumber: warehouseOutInfo.WarehouseOutOrderNumber,
								PatientId:               patientID,
								Ctime:                   time.Now().Unix(),
								Mtime:                   time.Now().Unix(),
								Status:                  1,
								RecordTime:              startDate.Unix(),
								OrgId:                   adminUserInfo.CurrentOrgId,
								GoodId:                  prescription.TubingHemodialysis,
								GoodTypeId:              tubingHemodialysis,
							}
							service.AddSigleAutoReduceRecordInfo(details)
						}

					}
					if prescription.Package > 0 {
						warehouseOutInfo := &models.WarehouseOutInfo{
							WarehouseOutOrderNumber: warehouseOut.WarehouseOutOrderNumber,
							WarehouseOutId:          warehouseOut.ID,
							Count:                   1,
							Status:                  1,
							Ctime:                   time.Now().Unix(),
							Remark:                  "",
							OrgId:                   adminUserInfo.CurrentOrgId,
							Type:                    1,
							Manufacturer:            0,
							Dealer:                  0,
							IsSys:                   1,
							SysRecordTime:           startDate.Unix(),
						}
						stockInInfo, _ := service.FindLastStockInInfoRecord(prescription.Package, adminUserInfo.CurrentOrgId)
						warehouseOutInfo.Price = stockInInfo.Price
						warehouseOutInfo.GoodId = prescription.Package
						warehouseOutInfo.GoodTypeId = safe_package
						err := service.AddSigleWarehouseOutInfo(warehouseOutInfo)

						if err == nil {
							details := &models.AutomaticReduceDetail{
								WarehouseOutId:          warehouseOutInfo.ID,
								WarehouseOutOrderNumber: warehouseOutInfo.WarehouseOutOrderNumber,
								PatientId:               patientID,
								Ctime:                   time.Now().Unix(),
								Mtime:                   time.Now().Unix(),
								Status:                  1,
								RecordTime:              startDate.Unix(),
								OrgId:                   adminUserInfo.CurrentOrgId,
								GoodId:                  prescription.Package,
								GoodTypeId:              safe_package,
							}
							service.AddSigleAutoReduceRecordInfo(details)
						}

					}

					if prescription.ALiquid > 0 {
						warehouseOutInfo := &models.WarehouseOutInfo{
							WarehouseOutOrderNumber: warehouseOut.WarehouseOutOrderNumber,
							WarehouseOutId:          warehouseOut.ID,
							Count:                   1,
							Status:                  1,
							Ctime:                   time.Now().Unix(),
							Remark:                  "",
							OrgId:                   adminUserInfo.CurrentOrgId,
							Type:                    1,
							Manufacturer:            0,
							Dealer:                  0,
							IsSys:                   1,
							SysRecordTime:           startDate.Unix(),
						}
						stockInInfo, _ := service.FindLastStockInInfoRecord(prescription.ALiquid, adminUserInfo.CurrentOrgId)
						warehouseOutInfo.Price = stockInInfo.Price
						warehouseOutInfo.GoodId = prescription.ALiquid
						warehouseOutInfo.GoodTypeId = aliquid
						err := service.AddSigleWarehouseOutInfo(warehouseOutInfo)

						if err == nil {
							details := &models.AutomaticReduceDetail{
								WarehouseOutId:          warehouseOutInfo.ID,
								WarehouseOutOrderNumber: warehouseOutInfo.WarehouseOutOrderNumber,
								PatientId:               patientID,
								Ctime:                   time.Now().Unix(),
								Mtime:                   time.Now().Unix(),
								Status:                  1,
								RecordTime:              startDate.Unix(),
								OrgId:                   adminUserInfo.CurrentOrgId,
								GoodId:                  prescription.ALiquid,
								GoodTypeId:              aliquid,
							}
							service.AddSigleAutoReduceRecordInfo(details)
						}

					}

				}
			} else if err == nil {
				if out.ID > 0 {

					if prescription.Niprocart > 0 {
						outInfo, err := service.FindStockOutInfoByTypeId(adminUserInfo.CurrentOrgId, niprocart, prescription.Niprocart, out.WarehouseOutOrderNumber)

						if err == gorm.ErrRecordNotFound {
							warehouseOutInfo := &models.WarehouseOutInfo{
								WarehouseOutOrderNumber: out.WarehouseOutOrderNumber,
								WarehouseOutId:          out.ID,
								Status:                  1,
								Ctime:                   time.Now().Unix(),
								Remark:                  "",
								OrgId:                   adminUserInfo.CurrentOrgId,
								Type:                    1,
								Manufacturer:            0,
								Dealer:                  0,
								IsSys:                   1,
								SysRecordTime:           startDate.Unix(),
							}

							stockInInfo, _ := service.FindLastStockInInfoRecord(prescription.Niprocart, adminUserInfo.CurrentOrgId)
							warehouseOutInfo.Price = stockInInfo.Price
							warehouseOutInfo.GoodId = prescription.Niprocart
							warehouseOutInfo.GoodTypeId = niprocart
							warehouseOutInfo.Count = 1
							err := service.AddSigleWarehouseOutInfo(warehouseOutInfo)
							if err == nil {
								details := &models.AutomaticReduceDetail{
									WarehouseOutId:          warehouseOutInfo.ID,
									WarehouseOutOrderNumber: warehouseOutInfo.WarehouseOutOrderNumber,
									PatientId:               patientID,
									Ctime:                   time.Now().Unix(),
									Mtime:                   time.Now().Unix(),
									Status:                  1,
									RecordTime:              startDate.Unix(),
									OrgId:                   adminUserInfo.CurrentOrgId,
									GoodId:                  prescription.Niprocart,
									GoodTypeId:              niprocart,
								}
								service.AddSigleAutoReduceRecordInfo(details)
							}

						} else if err == nil { //记录存在，则将数量加1
							if outInfo.ID > 0 {
								service.UpdateStockOutInfoCount(adminUserInfo.CurrentOrgId, outInfo.ID)
							}
							details := &models.AutomaticReduceDetail{
								WarehouseOutId:          outInfo.ID,
								WarehouseOutOrderNumber: outInfo.WarehouseOutOrderNumber,
								PatientId:               patientID,
								Ctime:                   time.Now().Unix(),
								Mtime:                   time.Now().Unix(),
								Status:                  1,
								RecordTime:              startDate.Unix(),
								OrgId:                   adminUserInfo.CurrentOrgId,
								GoodId:                  prescription.Niprocart,
								GoodTypeId:              niprocart,
							}
							service.AddSigleAutoReduceRecordInfo(details)
						}
					}

					if prescription.Jms > 0 {
						outInfo, err := service.FindStockOutInfoByTypeId(adminUserInfo.CurrentOrgId, jms, prescription.Jms, out.WarehouseOutOrderNumber)

						if err == gorm.ErrRecordNotFound {
							warehouseOutInfo := &models.WarehouseOutInfo{
								WarehouseOutOrderNumber: out.WarehouseOutOrderNumber,
								WarehouseOutId:          out.ID,
								Status:                  1,
								Ctime:                   time.Now().Unix(),
								Remark:                  "",
								OrgId:                   adminUserInfo.CurrentOrgId,
								Type:                    1,
								Manufacturer:            0,
								Dealer:                  0,
								IsSys:                   1,
								SysRecordTime:           startDate.Unix(),
							}
							stockInInfo, _ := service.FindLastStockInInfoRecord(prescription.Jms, adminUserInfo.CurrentOrgId)
							warehouseOutInfo.Price = stockInInfo.Price
							warehouseOutInfo.GoodId = prescription.Jms
							warehouseOutInfo.GoodTypeId = jms
							warehouseOutInfo.Count = 1

							err := service.AddSigleWarehouseOutInfo(warehouseOutInfo)
							if err == nil {
								details := &models.AutomaticReduceDetail{
									WarehouseOutId:          warehouseOutInfo.ID,
									WarehouseOutOrderNumber: warehouseOutInfo.WarehouseOutOrderNumber,
									PatientId:               patientID,
									Ctime:                   time.Now().Unix(),
									Mtime:                   time.Now().Unix(),
									Status:                  1,
									RecordTime:              startDate.Unix(),
									OrgId:                   adminUserInfo.CurrentOrgId,
									GoodId:                  prescription.Jms,
									GoodTypeId:              jms,
								}
								service.AddSigleAutoReduceRecordInfo(details)
							}

						} else if err == nil { //记录存在，则将数量加1
							if outInfo.ID > 0 {
								service.UpdateStockOutInfoCount(adminUserInfo.CurrentOrgId, outInfo.ID)
							}

							details := &models.AutomaticReduceDetail{
								WarehouseOutId:          outInfo.ID,
								WarehouseOutOrderNumber: outInfo.WarehouseOutOrderNumber,
								PatientId:               patientID,
								Ctime:                   time.Now().Unix(),
								Mtime:                   time.Now().Unix(),
								Status:                  1,
								RecordTime:              startDate.Unix(),
								OrgId:                   adminUserInfo.CurrentOrgId,
								GoodId:                  prescription.Jms,
								GoodTypeId:              jms,
							}
							service.AddSigleAutoReduceRecordInfo(details)
						}

					}

					if prescription.FistulaNeedleSet > 0 {
						outInfo, err := service.FindStockOutInfoByTypeId(adminUserInfo.CurrentOrgId, fistula_needle_set, prescription.FistulaNeedleSet, out.WarehouseOutOrderNumber)

						if err == gorm.ErrRecordNotFound {
							warehouseOutInfo := &models.WarehouseOutInfo{
								WarehouseOutOrderNumber: out.WarehouseOutOrderNumber,
								WarehouseOutId:          out.ID,
								Status:                  1,
								Ctime:                   time.Now().Unix(),
								Remark:                  "",
								OrgId:                   adminUserInfo.CurrentOrgId,
								Type:                    1,
								Manufacturer:            0,
								Dealer:                  0,
								IsSys:                   1,
								SysRecordTime:           startDate.Unix(),
							}

							stockInInfo, _ := service.FindLastStockInInfoRecord(prescription.FistulaNeedleSet, adminUserInfo.CurrentOrgId)
							warehouseOutInfo.Price = stockInInfo.Price
							warehouseOutInfo.GoodId = prescription.FistulaNeedleSet
							warehouseOutInfo.GoodTypeId = fistula_needle_set
							warehouseOutInfo.Count = 1
							err := service.AddSigleWarehouseOutInfo(warehouseOutInfo)
							if err == nil {
								details := &models.AutomaticReduceDetail{
									WarehouseOutId:          warehouseOutInfo.ID,
									WarehouseOutOrderNumber: warehouseOutInfo.WarehouseOutOrderNumber,
									PatientId:               patientID,
									Ctime:                   time.Now().Unix(),
									Mtime:                   time.Now().Unix(),
									Status:                  1,
									RecordTime:              startDate.Unix(),
									OrgId:                   adminUserInfo.CurrentOrgId,
									GoodId:                  prescription.FistulaNeedleSet,
									GoodTypeId:              fistula_needle_set,
								}
								service.AddSigleAutoReduceRecordInfo(details)
							}

						} else if err == nil { //记录存在，则将数量加1
							if outInfo.ID > 0 {
								service.UpdateStockOutInfoCount(adminUserInfo.CurrentOrgId, outInfo.ID)
							}

							details := &models.AutomaticReduceDetail{
								WarehouseOutId:          outInfo.ID,
								WarehouseOutOrderNumber: outInfo.WarehouseOutOrderNumber,
								PatientId:               patientID,
								Ctime:                   time.Now().Unix(),
								Mtime:                   time.Now().Unix(),
								Status:                  1,
								RecordTime:              startDate.Unix(),
								OrgId:                   adminUserInfo.CurrentOrgId,
								GoodId:                  prescription.FistulaNeedleSet,
								GoodTypeId:              fistula_needle_set,
							}
							service.AddSigleAutoReduceRecordInfo(details)
						}

					}

					if prescription.FistulaNeedleSet16 > 0 {
						outInfo, err := service.FindStockOutInfoByTypeId(adminUserInfo.CurrentOrgId, fistula_needle_set_16, prescription.FistulaNeedleSet16, out.WarehouseOutOrderNumber)

						if err == gorm.ErrRecordNotFound {
							warehouseOutInfo := &models.WarehouseOutInfo{
								WarehouseOutOrderNumber: out.WarehouseOutOrderNumber,
								WarehouseOutId:          out.ID,
								Status:                  1,
								Ctime:                   time.Now().Unix(),
								Remark:                  "",
								OrgId:                   adminUserInfo.CurrentOrgId,
								Type:                    1,
								Manufacturer:            0,
								Dealer:                  0,
								IsSys:                   1,
								SysRecordTime:           startDate.Unix(),
							}

							stockInInfo, _ := service.FindLastStockInInfoRecord(prescription.FistulaNeedleSet16, adminUserInfo.CurrentOrgId)
							warehouseOutInfo.Price = stockInInfo.Price
							warehouseOutInfo.GoodId = prescription.FistulaNeedleSet16
							warehouseOutInfo.GoodTypeId = fistula_needle_set_16
							warehouseOutInfo.Count = 1
							err := service.AddSigleWarehouseOutInfo(warehouseOutInfo)
							if err == nil {
								details := &models.AutomaticReduceDetail{
									WarehouseOutId:          warehouseOutInfo.ID,
									WarehouseOutOrderNumber: warehouseOutInfo.WarehouseOutOrderNumber,
									PatientId:               patientID,
									Ctime:                   time.Now().Unix(),
									Mtime:                   time.Now().Unix(),
									Status:                  1,
									RecordTime:              startDate.Unix(),
									OrgId:                   adminUserInfo.CurrentOrgId,
									GoodId:                  prescription.FistulaNeedleSet16,
									GoodTypeId:              fistula_needle_set_16,
								}
								service.AddSigleAutoReduceRecordInfo(details)
							}

						} else if err == nil { //记录存在，则将数量加1
							if outInfo.ID > 0 {
								service.UpdateStockOutInfoCount(adminUserInfo.CurrentOrgId, outInfo.ID)
							}

							details := &models.AutomaticReduceDetail{
								WarehouseOutId:          outInfo.ID,
								WarehouseOutOrderNumber: outInfo.WarehouseOutOrderNumber,
								PatientId:               patientID,
								Ctime:                   time.Now().Unix(),
								Mtime:                   time.Now().Unix(),
								Status:                  1,
								RecordTime:              startDate.Unix(),
								OrgId:                   adminUserInfo.CurrentOrgId,
								GoodId:                  prescription.FistulaNeedleSet16,
								GoodTypeId:              fistula_needle_set_16,
							}
							service.AddSigleAutoReduceRecordInfo(details)
						}
					}

					if prescription.Hemoperfusion > 0 {
						outInfo, err := service.FindStockOutInfoByTypeId(adminUserInfo.CurrentOrgId, hemoperfusion, prescription.Hemoperfusion, out.WarehouseOutOrderNumber)

						if err == gorm.ErrRecordNotFound {
							warehouseOutInfo := &models.WarehouseOutInfo{
								WarehouseOutOrderNumber: out.WarehouseOutOrderNumber,
								WarehouseOutId:          out.ID,
								Status:                  1,
								Ctime:                   time.Now().Unix(),
								Remark:                  "",
								OrgId:                   adminUserInfo.CurrentOrgId,
								Type:                    1,
								Manufacturer:            0,
								Dealer:                  0,
								IsSys:                   1,
								SysRecordTime:           startDate.Unix(),
							}

							stockInInfo, _ := service.FindLastStockInInfoRecord(prescription.Hemoperfusion, adminUserInfo.CurrentOrgId)
							warehouseOutInfo.Price = stockInInfo.Price
							warehouseOutInfo.GoodId = prescription.Hemoperfusion
							warehouseOutInfo.GoodTypeId = hemoperfusion
							warehouseOutInfo.Count = 1
							err := service.AddSigleWarehouseOutInfo(warehouseOutInfo)
							if err == nil {
								details := &models.AutomaticReduceDetail{
									WarehouseOutId:          warehouseOutInfo.ID,
									WarehouseOutOrderNumber: warehouseOutInfo.WarehouseOutOrderNumber,
									PatientId:               patientID,
									Ctime:                   time.Now().Unix(),
									Mtime:                   time.Now().Unix(),
									Status:                  1,
									RecordTime:              startDate.Unix(),
									OrgId:                   adminUserInfo.CurrentOrgId,
									GoodId:                  prescription.Hemoperfusion,
									GoodTypeId:              hemoperfusion,
								}
								service.AddSigleAutoReduceRecordInfo(details)
							}

						} else if err == nil { //记录存在，则将数量加1
							if outInfo.ID > 0 {
								service.UpdateStockOutInfoCount(adminUserInfo.CurrentOrgId, outInfo.ID)
							}

							details := &models.AutomaticReduceDetail{
								WarehouseOutId:          outInfo.ID,
								WarehouseOutOrderNumber: outInfo.WarehouseOutOrderNumber,
								PatientId:               patientID,
								Ctime:                   time.Now().Unix(),
								Mtime:                   time.Now().Unix(),
								Status:                  1,
								RecordTime:              startDate.Unix(),
								OrgId:                   adminUserInfo.CurrentOrgId,
								GoodId:                  prescription.Hemoperfusion,
								GoodTypeId:              hemoperfusion,
							}
							service.AddSigleAutoReduceRecordInfo(details)
						}
					}

					if prescription.DialyserSterilised > 0 {
						outInfo, err := service.FindStockOutInfoByTypeId(adminUserInfo.CurrentOrgId, dialyser_sterilised, prescription.DialyserSterilised, out.WarehouseOutOrderNumber)

						if err == gorm.ErrRecordNotFound {
							warehouseOutInfo := &models.WarehouseOutInfo{
								WarehouseOutOrderNumber: out.WarehouseOutOrderNumber,
								WarehouseOutId:          out.ID,
								Status:                  1,
								Ctime:                   time.Now().Unix(),
								Remark:                  "",
								OrgId:                   adminUserInfo.CurrentOrgId,
								Type:                    1,
								Manufacturer:            0,
								Dealer:                  0,
								IsSys:                   1,
								SysRecordTime:           startDate.Unix(),
							}

							stockInInfo, _ := service.FindLastStockInInfoRecord(prescription.DialyserSterilised, adminUserInfo.CurrentOrgId)
							warehouseOutInfo.Price = stockInInfo.Price
							warehouseOutInfo.GoodId = prescription.DialyserSterilised
							warehouseOutInfo.GoodTypeId = dialyser_sterilised
							warehouseOutInfo.Count = 1
							err := service.AddSigleWarehouseOutInfo(warehouseOutInfo)
							if err == nil {
								details := &models.AutomaticReduceDetail{
									WarehouseOutId:          warehouseOutInfo.ID,
									WarehouseOutOrderNumber: warehouseOutInfo.WarehouseOutOrderNumber,
									PatientId:               patientID,
									Ctime:                   time.Now().Unix(),
									Mtime:                   time.Now().Unix(),
									Status:                  1,
									RecordTime:              startDate.Unix(),
									OrgId:                   adminUserInfo.CurrentOrgId,
									GoodId:                  prescription.DialyserSterilised,
									GoodTypeId:              dialyser_sterilised,
								}
								service.AddSigleAutoReduceRecordInfo(details)
							}

						} else if err == nil { //记录存在，则将数量加1
							if outInfo.ID > 0 {
								service.UpdateStockOutInfoCount(adminUserInfo.CurrentOrgId, outInfo.ID)
							}

							details := &models.AutomaticReduceDetail{
								WarehouseOutId:          outInfo.ID,
								WarehouseOutOrderNumber: outInfo.WarehouseOutOrderNumber,
								PatientId:               patientID,
								Ctime:                   time.Now().Unix(),
								Mtime:                   time.Now().Unix(),
								Status:                  1,
								RecordTime:              startDate.Unix(),
								OrgId:                   adminUserInfo.CurrentOrgId,
								GoodId:                  prescription.DialyserSterilised,
								GoodTypeId:              dialyser_sterilised,
							}
							service.AddSigleAutoReduceRecordInfo(details)
						}

					}

					if prescription.Filtryzer > 0 {
						outInfo, err := service.FindStockOutInfoByTypeId(adminUserInfo.CurrentOrgId, filtryzer, prescription.Filtryzer, out.WarehouseOutOrderNumber)

						if err == gorm.ErrRecordNotFound {
							warehouseOutInfo := &models.WarehouseOutInfo{
								WarehouseOutOrderNumber: out.WarehouseOutOrderNumber,
								WarehouseOutId:          out.ID,
								Status:                  1,
								Ctime:                   time.Now().Unix(),
								Remark:                  "",
								OrgId:                   adminUserInfo.CurrentOrgId,
								Type:                    1,
								Manufacturer:            0,
								Dealer:                  0,
								IsSys:                   1,
								SysRecordTime:           startDate.Unix(),
							}

							stockInInfo, _ := service.FindLastStockInInfoRecord(prescription.Filtryzer, adminUserInfo.CurrentOrgId)
							warehouseOutInfo.Price = stockInInfo.Price
							warehouseOutInfo.GoodId = prescription.Filtryzer
							warehouseOutInfo.GoodTypeId = filtryzer
							warehouseOutInfo.Count = 1
							err := service.AddSigleWarehouseOutInfo(warehouseOutInfo)
							if err == nil {
								details := &models.AutomaticReduceDetail{
									WarehouseOutId:          warehouseOutInfo.ID,
									WarehouseOutOrderNumber: warehouseOutInfo.WarehouseOutOrderNumber,
									PatientId:               patientID,
									Ctime:                   time.Now().Unix(),
									Mtime:                   time.Now().Unix(),
									Status:                  1,
									RecordTime:              startDate.Unix(),
									OrgId:                   adminUserInfo.CurrentOrgId,
									GoodId:                  prescription.Filtryzer,
									GoodTypeId:              filtryzer,
								}
								service.AddSigleAutoReduceRecordInfo(details)
							}

						} else if err == nil { //记录存在，则将耗材使用数量加1
							if outInfo.ID > 0 {
								service.UpdateStockOutInfoCount(adminUserInfo.CurrentOrgId, outInfo.ID)
							}
							//插入病人耗材使用记录
							details := &models.AutomaticReduceDetail{
								WarehouseOutId:          outInfo.ID,
								WarehouseOutOrderNumber: outInfo.WarehouseOutOrderNumber,
								PatientId:               patientID,
								Ctime:                   time.Now().Unix(),
								Mtime:                   time.Now().Unix(),
								Status:                  1,
								RecordTime:              startDate.Unix(),
								OrgId:                   adminUserInfo.CurrentOrgId,
								GoodId:                  prescription.Filtryzer,
								GoodTypeId:              filtryzer,
							}
							service.AddSigleAutoReduceRecordInfo(details)
						}

					}

					if prescription.Dialyzers > 0 {
						outInfo, err := service.FindStockOutInfoByTypeId(adminUserInfo.CurrentOrgId, dialyzers, prescription.Dialyzers, out.WarehouseOutOrderNumber)

						if err == gorm.ErrRecordNotFound {
							warehouseOutInfo := &models.WarehouseOutInfo{
								WarehouseOutOrderNumber: out.WarehouseOutOrderNumber,
								WarehouseOutId:          out.ID,
								Status:                  1,
								Ctime:                   time.Now().Unix(),
								Remark:                  "",
								OrgId:                   adminUserInfo.CurrentOrgId,
								Type:                    1,
								Manufacturer:            0,
								Dealer:                  0,
								IsSys:                   1,
								SysRecordTime:           startDate.Unix(),
							}

							stockInInfo, _ := service.FindLastStockInInfoRecord(prescription.Dialyzers, adminUserInfo.CurrentOrgId)
							warehouseOutInfo.Price = stockInInfo.Price
							warehouseOutInfo.GoodId = prescription.Dialyzers
							warehouseOutInfo.GoodTypeId = dialyzers
							warehouseOutInfo.Count = 1
							err := service.AddSigleWarehouseOutInfo(warehouseOutInfo)
							if err == nil {
								details := &models.AutomaticReduceDetail{
									WarehouseOutId:          warehouseOutInfo.ID,
									WarehouseOutOrderNumber: warehouseOutInfo.WarehouseOutOrderNumber,
									PatientId:               patientID,
									Ctime:                   time.Now().Unix(),
									Mtime:                   time.Now().Unix(),
									Status:                  1,
									RecordTime:              startDate.Unix(),
									OrgId:                   adminUserInfo.CurrentOrgId,
									GoodId:                  prescription.Dialyzers,
									GoodTypeId:              dialyzers,
								}
								service.AddSigleAutoReduceRecordInfo(details)
							}

						} else if err == nil { //记录存在，则将耗材使用数量加1
							if outInfo.ID > 0 {
								service.UpdateStockOutInfoCount(adminUserInfo.CurrentOrgId, outInfo.ID)
							}
							//插入病人耗材使用记录
							details := &models.AutomaticReduceDetail{
								WarehouseOutId:          outInfo.ID,
								WarehouseOutOrderNumber: outInfo.WarehouseOutOrderNumber,
								PatientId:               patientID,
								Ctime:                   time.Now().Unix(),
								Mtime:                   time.Now().Unix(),
								Status:                  1,
								RecordTime:              startDate.Unix(),
								OrgId:                   adminUserInfo.CurrentOrgId,
								GoodId:                  prescription.Dialyzer,
								GoodTypeId:              dialyzers,
							}
							service.AddSigleAutoReduceRecordInfo(details)
						}

					}

					if prescription.Injector > 0 {
						outInfo, err := service.FindStockOutInfoByTypeId(adminUserInfo.CurrentOrgId, injector, prescription.Injector, out.WarehouseOutOrderNumber)

						if err == gorm.ErrRecordNotFound {
							warehouseOutInfo := &models.WarehouseOutInfo{
								WarehouseOutOrderNumber: out.WarehouseOutOrderNumber,
								WarehouseOutId:          out.ID,
								Status:                  1,
								Ctime:                   time.Now().Unix(),
								Remark:                  "",
								OrgId:                   adminUserInfo.CurrentOrgId,
								Type:                    1,
								Manufacturer:            0,
								Dealer:                  0,
								IsSys:                   1,
								SysRecordTime:           startDate.Unix(),
							}

							stockInInfo, _ := service.FindLastStockInInfoRecord(prescription.Injector, adminUserInfo.CurrentOrgId)
							warehouseOutInfo.Price = stockInInfo.Price
							warehouseOutInfo.GoodId = prescription.Injector
							warehouseOutInfo.GoodTypeId = injector
							warehouseOutInfo.Count = 1
							err := service.AddSigleWarehouseOutInfo(warehouseOutInfo)
							if err == nil {
								details := &models.AutomaticReduceDetail{
									WarehouseOutId:          warehouseOutInfo.ID,
									WarehouseOutOrderNumber: warehouseOutInfo.WarehouseOutOrderNumber,
									PatientId:               patientID,
									Ctime:                   time.Now().Unix(),
									Mtime:                   time.Now().Unix(),
									Status:                  1,
									RecordTime:              startDate.Unix(),
									OrgId:                   adminUserInfo.CurrentOrgId,
									GoodId:                  prescription.Injector,
									GoodTypeId:              injector,
								}
								service.AddSigleAutoReduceRecordInfo(details)
							}

						} else if err == nil { //记录存在，则将耗材使用数量加1
							if outInfo.ID > 0 {
								service.UpdateStockOutInfoCount(adminUserInfo.CurrentOrgId, outInfo.ID)
							}
							//插入病人耗材使用记录
							details := &models.AutomaticReduceDetail{
								WarehouseOutId:          outInfo.ID,
								WarehouseOutOrderNumber: outInfo.WarehouseOutOrderNumber,
								PatientId:               patientID,
								Ctime:                   time.Now().Unix(),
								Mtime:                   time.Now().Unix(),
								Status:                  1,
								RecordTime:              startDate.Unix(),
								OrgId:                   adminUserInfo.CurrentOrgId,
								GoodId:                  prescription.Injector,
								GoodTypeId:              injector,
							}
							service.AddSigleAutoReduceRecordInfo(details)
						}

					}

					if prescription.Bloodlines > 0 {
						outInfo, err := service.FindStockOutInfoByTypeId(adminUserInfo.CurrentOrgId, bloodlines, prescription.Bloodlines, out.WarehouseOutOrderNumber)

						if err == gorm.ErrRecordNotFound {
							warehouseOutInfo := &models.WarehouseOutInfo{
								WarehouseOutOrderNumber: out.WarehouseOutOrderNumber,
								WarehouseOutId:          out.ID,
								Status:                  1,
								Ctime:                   time.Now().Unix(),
								Remark:                  "",
								OrgId:                   adminUserInfo.CurrentOrgId,
								Type:                    1,
								Manufacturer:            0,
								Dealer:                  0,
								IsSys:                   1,
								SysRecordTime:           startDate.Unix(),
							}

							stockInInfo, _ := service.FindLastStockInInfoRecord(prescription.Bloodlines, adminUserInfo.CurrentOrgId)
							warehouseOutInfo.Price = stockInInfo.Price
							warehouseOutInfo.GoodId = prescription.Bloodlines
							warehouseOutInfo.GoodTypeId = bloodlines
							warehouseOutInfo.Count = 1
							err := service.AddSigleWarehouseOutInfo(warehouseOutInfo)
							if err == nil {
								details := &models.AutomaticReduceDetail{
									WarehouseOutId:          warehouseOutInfo.ID,
									WarehouseOutOrderNumber: warehouseOutInfo.WarehouseOutOrderNumber,
									PatientId:               patientID,
									Ctime:                   time.Now().Unix(),
									Mtime:                   time.Now().Unix(),
									Status:                  1,
									RecordTime:              startDate.Unix(),
									OrgId:                   adminUserInfo.CurrentOrgId,
									GoodId:                  prescription.Bloodlines,
									GoodTypeId:              bloodlines,
								}
								service.AddSigleAutoReduceRecordInfo(details)
							}

						} else if err == nil { //记录存在，则将耗材使用数量加1
							if outInfo.ID > 0 {
								service.UpdateStockOutInfoCount(adminUserInfo.CurrentOrgId, outInfo.ID)
							}
							//插入病人耗材使用记录
							details := &models.AutomaticReduceDetail{
								WarehouseOutId:          outInfo.ID,
								WarehouseOutOrderNumber: outInfo.WarehouseOutOrderNumber,
								PatientId:               patientID,
								Ctime:                   time.Now().Unix(),
								Mtime:                   time.Now().Unix(),
								Status:                  1,
								RecordTime:              startDate.Unix(),
								OrgId:                   adminUserInfo.CurrentOrgId,
								GoodId:                  prescription.Bloodlines,
								GoodTypeId:              bloodlines,
							}
							service.AddSigleAutoReduceRecordInfo(details)
						}

					}

					if prescription.TubingHemodialysis > 0 {
						outInfo, err := service.FindStockOutInfoByTypeId(adminUserInfo.CurrentOrgId, tubingHemodialysis, prescription.TubingHemodialysis, out.WarehouseOutOrderNumber)

						if err == gorm.ErrRecordNotFound {
							warehouseOutInfo := &models.WarehouseOutInfo{
								WarehouseOutOrderNumber: out.WarehouseOutOrderNumber,
								WarehouseOutId:          out.ID,
								Status:                  1,
								Ctime:                   time.Now().Unix(),
								Remark:                  "",
								OrgId:                   adminUserInfo.CurrentOrgId,
								Type:                    1,
								Manufacturer:            0,
								Dealer:                  0,
								IsSys:                   1,
								SysRecordTime:           startDate.Unix(),
							}

							stockInInfo, _ := service.FindLastStockInInfoRecord(prescription.TubingHemodialysis, adminUserInfo.CurrentOrgId)
							warehouseOutInfo.Price = stockInInfo.Price
							warehouseOutInfo.GoodId = prescription.TubingHemodialysis
							warehouseOutInfo.GoodTypeId = tubingHemodialysis
							warehouseOutInfo.Count = 1
							err := service.AddSigleWarehouseOutInfo(warehouseOutInfo)
							if err == nil {
								details := &models.AutomaticReduceDetail{
									WarehouseOutId:          warehouseOutInfo.ID,
									WarehouseOutOrderNumber: warehouseOutInfo.WarehouseOutOrderNumber,
									PatientId:               patientID,
									Ctime:                   time.Now().Unix(),
									Mtime:                   time.Now().Unix(),
									Status:                  1,
									RecordTime:              startDate.Unix(),
									OrgId:                   adminUserInfo.CurrentOrgId,
									GoodId:                  prescription.TubingHemodialysis,
									GoodTypeId:              tubingHemodialysis,
								}
								service.AddSigleAutoReduceRecordInfo(details)
							}

						} else if err == nil { //记录存在，则将耗材使用数量加1
							if outInfo.ID > 0 {
								service.UpdateStockOutInfoCount(adminUserInfo.CurrentOrgId, outInfo.ID)
							}
							//插入病人耗材使用记录
							details := &models.AutomaticReduceDetail{
								WarehouseOutId:          outInfo.ID,
								WarehouseOutOrderNumber: outInfo.WarehouseOutOrderNumber,
								PatientId:               patientID,
								Ctime:                   time.Now().Unix(),
								Mtime:                   time.Now().Unix(),
								Status:                  1,
								RecordTime:              startDate.Unix(),
								OrgId:                   adminUserInfo.CurrentOrgId,
								GoodId:                  prescription.TubingHemodialysis,
								GoodTypeId:              tubingHemodialysis,
							}
							service.AddSigleAutoReduceRecordInfo(details)
						}

					}

					if prescription.Package > 0 {
						outInfo, err := service.FindStockOutInfoByTypeId(adminUserInfo.CurrentOrgId, safe_package, prescription.Package, out.WarehouseOutOrderNumber)

						if err == gorm.ErrRecordNotFound {
							warehouseOutInfo := &models.WarehouseOutInfo{
								WarehouseOutOrderNumber: out.WarehouseOutOrderNumber,
								WarehouseOutId:          out.ID,
								Status:                  1,
								Ctime:                   time.Now().Unix(),
								Remark:                  "",
								OrgId:                   adminUserInfo.CurrentOrgId,
								Type:                    1,
								Manufacturer:            0,
								Dealer:                  0,
								IsSys:                   1,
								SysRecordTime:           startDate.Unix(),
							}

							stockInInfo, _ := service.FindLastStockInInfoRecord(prescription.Package, adminUserInfo.CurrentOrgId)
							warehouseOutInfo.Price = stockInInfo.Price
							warehouseOutInfo.GoodId = prescription.Package
							warehouseOutInfo.GoodTypeId = safe_package
							warehouseOutInfo.Count = 1
							err := service.AddSigleWarehouseOutInfo(warehouseOutInfo)
							if err == nil {
								details := &models.AutomaticReduceDetail{
									WarehouseOutId:          warehouseOutInfo.ID,
									WarehouseOutOrderNumber: warehouseOutInfo.WarehouseOutOrderNumber,
									PatientId:               patientID,
									Ctime:                   time.Now().Unix(),
									Mtime:                   time.Now().Unix(),
									Status:                  1,
									RecordTime:              startDate.Unix(),
									OrgId:                   adminUserInfo.CurrentOrgId,
									GoodId:                  prescription.Package,
									GoodTypeId:              safe_package,
								}
								service.AddSigleAutoReduceRecordInfo(details)
							}

						} else if err == nil { //记录存在，则将耗材使用数量加1
							if outInfo.ID > 0 {
								service.UpdateStockOutInfoCount(adminUserInfo.CurrentOrgId, outInfo.ID)
							}
							//插入病人耗材使用记录
							details := &models.AutomaticReduceDetail{
								WarehouseOutId:          outInfo.ID,
								WarehouseOutOrderNumber: outInfo.WarehouseOutOrderNumber,
								PatientId:               patientID,
								Ctime:                   time.Now().Unix(),
								Mtime:                   time.Now().Unix(),
								Status:                  1,
								RecordTime:              startDate.Unix(),
								OrgId:                   adminUserInfo.CurrentOrgId,
								GoodId:                  prescription.Package,
								GoodTypeId:              safe_package,
							}
							service.AddSigleAutoReduceRecordInfo(details)
						}

					}

					if prescription.ALiquid > 0 {
						outInfo, err := service.FindStockOutInfoByTypeId(adminUserInfo.CurrentOrgId, aliquid, prescription.ALiquid, out.WarehouseOutOrderNumber)

						if err == gorm.ErrRecordNotFound {
							warehouseOutInfo := &models.WarehouseOutInfo{
								WarehouseOutOrderNumber: out.WarehouseOutOrderNumber,
								WarehouseOutId:          out.ID,
								Status:                  1,
								Ctime:                   time.Now().Unix(),
								Remark:                  "",
								OrgId:                   adminUserInfo.CurrentOrgId,
								Type:                    1,
								Manufacturer:            0,
								Dealer:                  0,
								IsSys:                   1,
								SysRecordTime:           startDate.Unix(),
							}

							stockInInfo, _ := service.FindLastStockInInfoRecord(prescription.ALiquid, adminUserInfo.CurrentOrgId)
							warehouseOutInfo.Price = stockInInfo.Price
							warehouseOutInfo.GoodId = prescription.ALiquid
							warehouseOutInfo.GoodTypeId = aliquid
							warehouseOutInfo.Count = 1
							err := service.AddSigleWarehouseOutInfo(warehouseOutInfo)
							if err == nil {
								details := &models.AutomaticReduceDetail{
									WarehouseOutId:          warehouseOutInfo.ID,
									WarehouseOutOrderNumber: warehouseOutInfo.WarehouseOutOrderNumber,
									PatientId:               patientID,
									Ctime:                   time.Now().Unix(),
									Mtime:                   time.Now().Unix(),
									Status:                  1,
									RecordTime:              startDate.Unix(),
									OrgId:                   adminUserInfo.CurrentOrgId,
									GoodId:                  prescription.ALiquid,
									GoodTypeId:              aliquid,
								}
								service.AddSigleAutoReduceRecordInfo(details)
							}

						} else if err == nil { //记录存在，则将耗材使用数量加1
							if outInfo.ID > 0 {
								service.UpdateStockOutInfoCount(adminUserInfo.CurrentOrgId, outInfo.ID)
							}
							//插入病人耗材使用记录
							details := &models.AutomaticReduceDetail{
								WarehouseOutId:          outInfo.ID,
								WarehouseOutOrderNumber: outInfo.WarehouseOutOrderNumber,
								PatientId:               patientID,
								Ctime:                   time.Now().Unix(),
								Mtime:                   time.Now().Unix(),
								Status:                  1,
								RecordTime:              startDate.Unix(),
								OrgId:                   adminUserInfo.CurrentOrgId,
								GoodId:                  prescription.ALiquid,
								GoodTypeId:              aliquid,
							}
							service.AddSigleAutoReduceRecordInfo(details)
						}

					}

				}
			}
		} else {
			this.ErrorLog("上机失败,还没开处方")
			this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodePrescriptionException)
			return
		}
	}

	scheduleDateStart := startDate.Format("2006-01-02") + " 00:00:00"
	scheduleDateEnd := startDate.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)
	schedulestartTime := theStartTime.Unix()
	scheduleendTime := theEndTime.Unix()

	//查询更改的机号，是否有人用了,如果只是排班了，但是没上机，直接替换，如果排班且上机了，就提示他无法上机

	schedule, err := service.GetDayScheduleByBedid(adminUserInfo.CurrentOrgId, schedulestartTime, bedID, schedual_type)

	if err == gorm.ErrRecordNotFound { //空床位
		// 修改了床位逻辑
		daySchedule, _ := service.GetDaySchedule(adminUserInfo.CurrentOrgId, schedulestartTime, scheduleendTime, patientID)
		if daySchedule.ID > 0 {
			daySchedule.PartitionId = deviceNumber.ZoneID
			daySchedule.BedId = bedID
			daySchedule.ScheduleType = schedual_type
			daySchedule.UpdatedTime = time.Now().Unix()
			err := service.UpdateSchedule(&daySchedule)
			if err != nil {
				this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
				return
			}
		}

	} else if err == nil {
		if schedule.ID > 0 && schedule.DialysisOrder.ID == 0 { //有排班没上机记录
			daySchedule, _ := service.GetDaySchedule(adminUserInfo.CurrentOrgId, schedulestartTime, scheduleendTime, patientID)
			if daySchedule.ID > 0 {
				daySchedule.PartitionId = deviceNumber.ZoneID
				daySchedule.BedId = bedID
				daySchedule.ScheduleType = schedual_type
				daySchedule.UpdatedTime = time.Now().Unix()
				err := service.UpdateSchedule(&daySchedule)
				if err != nil {
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
					return
				}
			}
		} else if schedule.ID > 0 && schedule.DialysisOrder.ID > 0 { //有排班且有上机记录
			this.ServeFailJSONWithSGJErrorCode(enums.ErrorDialysisOrderRepeatBed)
			return
		}
	} else if err != nil {
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
		return
	}

	dialysisRecord = &models.DialysisOrder{
		DialysisDate:  recordDate.Unix(),
		UserOrgId:     adminUserInfo.CurrentOrgId,
		PatientId:     patientID,
		Stage:         1,
		BedID:         bedID,
		StartNurse:    nurseID,
		Status:        1,
		StartTime:     startDate.Unix(),
		CreatedTime:   time.Now().Unix(),
		UpdatedTime:   time.Now().Unix(),
		PunctureNurse: punctureNurseId,
		Creator:       adminUserInfo.AdminUser.Id,
		Modifier:      adminUserInfo.AdminUser.Id,
		SchedualType:  schedual_type,
	}

	createErr := service.MobileCreateDialysisOrder(adminUserInfo.CurrentOrgId, patientID, dialysisRecord)
	newdialysisRecord, getRecordErr := service.MobileGetDialysisRecord(adminUserInfo.CurrentOrgId, patientID, recordDate.Unix())

	if createErr != nil {
		this.ErrorLog("上机失败：%v", createErr)
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
		return
	} else if createErr == nil {

		var tempdispose string
		// 只针对中能建
		if blood_drawing > 0 && adminUserInfo.CurrentOrgId == 9538 { //adminUserInfo.CurrentOrgId == 9538
			tempdispose = "引血" + strconv.FormatInt(blood_drawing, 10) + "ml/min"
		}

		var ultrafiltration_rate float64
		_, prescription := service.FindDialysisPrescriptionByReordDate(patientID, schedulestartTime, adminUserInfo.CurrentOrgId)
		if prescription.ID > 0 {
			if prescription.TargetUltrafiltration > 0 && prescription.DialysisDurationHour > 0 {

				totalMin := prescription.DialysisDurationHour*60 + prescription.DialysisDurationMinute
				if template.TemplateId == 6 {
					ultrafiltration_rate = math.Floor(prescription.TargetUltrafiltration / float64(totalMin) * 60 * 1000)
				}
				// 只针对方济医院
				if template.TemplateId == 1 {
					value, _ := strconv.ParseFloat(fmt.Sprintf("%.3f", prescription.TargetUltrafiltration/float64(totalMin)*60), 6)
					ultrafiltration_rate = value
				}
			}
		}

		record := models.MonitoringRecord{
			UserOrgId:       adminUserInfo.CurrentOrgId,
			PatientId:       patientID,
			DialysisOrderId: dialysisRecord.ID,
			MonitoringDate:  schedulestartTime,
			OperateTime:     startDate.Unix(),
			// MonitoringTime:            recordTime,
			MonitoringNurse:       nurseID,
			Dispose:               tempdispose,
			UltrafiltrationRate:   ultrafiltration_rate,
			UltrafiltrationVolume: 0,
			Status:                1,
			CreatedTime:           time.Now().Unix(),
			UpdatedTime:           time.Now().Unix(),
		}

		// 如果当天有插入数据，则不再往透析纪录里插入数据
		if newdialysisRecord.ID > 0 {
			err := service.CreateMonitor(&record)
			if err != nil {
				this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeMonitorCreate)
				return
			}
		}
		this.ServeSuccessJSON(map[string]interface{}{
			"dialysis_order": dialysisRecord,
			"monitor":        record,
		})

	}

}

// /api/dialysis/finish [post]
// @param patient_id:int
// @param date:string 排班时间 (yyyy-mm-dd)
// @param nurse:int 下机护士
func (this *DialysisRecordAPIController) FinishDialysis() {
	patientID, _ := this.GetInt64("patient_id")
	recordDateStr := this.GetString("date")
	nurseID, _ := this.GetInt64("nurse")
	end_time := this.GetString("end_time")

	if patientID <= 0 || len(recordDateStr) == 0 || nurseID <= 0 {
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}

	recordDate, parseErr := utils.ParseTimeStringToTime("2006-01-02", recordDateStr)
	if parseErr != nil {
		this.ErrorLog("时间解析失败:%v", parseErr)
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}

	//if parseEndDateErr != nil {
	//	this.ErrorLog("时间解析失败:%v", parseEndDateErr)
	//	this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
	//	return
	//}

	adminUserInfo := this.GetAdminUserInfo()
	patient, getPatientErr := service.MobileGetPatientById(adminUserInfo.CurrentOrgId, patientID)
	if getPatientErr != nil {
		this.ErrorLog("获取患者信息失败：%v", getPatientErr)
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
		return
	} else if patient == nil {
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodePatientNoExist)
		return
	}

	nurse, getNurseErr := service.GetAdminUserByUserID(nurseID)
	if getNurseErr != nil {
		this.ErrorLog("获取护士失败:%v", getNurseErr)
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
		return
	} else if nurse == nil {
		this.ErrorLog("护士不存在")
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}

	dialysisRecord, getRecordErr := service.MobileGetDialysisRecord(adminUserInfo.CurrentOrgId, patientID, recordDate.Unix())
	if getRecordErr != nil {
		this.ErrorLog("获取透析记录失败:%v", getRecordErr)
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
		return
	}
	if dialysisRecord.Stage == 2 {
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorDialysisOrderNoEND)
		return
	}

	endDate, parseEndDateErr := utils.ParseTimeStringToTime("2006-01-02 15:04", end_time)
	if parseEndDateErr != nil {
		this.ErrorLog("日期(%v)解析错误：%v", end_time, parseEndDateErr)
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}

	// 获取当天的第一条透析纪录
	fmonitorRecords, getMonitorRecordsErr := service.MobileGetMonitorRecordFirst(adminUserInfo.CurrentOrgId, patientID, recordDate.Unix())
	if getMonitorRecordsErr != nil {
		this.ErrorLog("获取透析监测记录失败:%v", getMonitorRecordsErr)
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
		return
	}

	// 获取当前的最后一条透析纪录
	endmonitorRecords, getMonitorRecordsErr := service.MobileGetLastMonitorRecord(adminUserInfo.CurrentOrgId, patientID, recordDate.Unix())
	if getMonitorRecordsErr != nil {
		this.ErrorLog("获取透析监测记录失败:%v", getMonitorRecordsErr)
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
		return
	}

	assessmentAfterDislysis, getAADErr := service.MobileGetAssessmentAfterDislysis(adminUserInfo.CurrentOrgId, patientID, recordDate.Unix())
	if getAADErr != nil {
		this.ErrorLog("获取透后评估失败:%v", getAADErr)
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
		return
	}

	var tempassessmentAfterDislysis models.AssessmentAfterDislysis

	if assessmentAfterDislysis != nil {
		tempassessmentAfterDislysis = *assessmentAfterDislysis
		tempassessmentAfterDislysis.UpdatedTime = time.Now().Unix()
	} else {
		tempassessmentAfterDislysis.CreatedTime = time.Now().Unix()
		tempassessmentAfterDislysis.AssessmentDate = recordDate.Unix()
		tempassessmentAfterDislysis.Status = 1
		tempassessmentAfterDislysis.PatientId = patientID
		tempassessmentAfterDislysis.UserOrgId = adminUserInfo.CurrentOrgId
	}

	if dialysisRecord.Stage == 1 {
		temp_time := (float64(endDate.Unix()) - float64(dialysisRecord.StartTime)) / 3600
		value, _ := strconv.ParseFloat(fmt.Sprintf("%.2f", temp_time), 64)
		fmt.Println(value)
		a, b := math.Modf(value)
		c, _ := strconv.ParseFloat(fmt.Sprintf("%.2f", b), 64)
		hour, _ := strconv.ParseInt(fmt.Sprintf("%.0f", a), 10, 64)
		minute, _ := strconv.ParseInt(fmt.Sprintf("%.0f", c*60), 10, 64)
		fmt.Println(hour)
		fmt.Println(minute)
		tempassessmentAfterDislysis.ActualTreatmentHour = hour
		tempassessmentAfterDislysis.ActualTreatmentMinute = minute
	}

	if fmonitorRecords.ID > 0 && endmonitorRecords.ID > 0 {
		tempassessmentAfterDislysis.Temperature = endmonitorRecords.Temperature
		tempassessmentAfterDislysis.PulseFrequency = endmonitorRecords.PulseFrequency
		tempassessmentAfterDislysis.BreathingRate = endmonitorRecords.BreathingRate
		tempassessmentAfterDislysis.SystolicBloodPressure = endmonitorRecords.SystolicBloodPressure
		tempassessmentAfterDislysis.DiastolicBloodPressure = endmonitorRecords.DiastolicBloodPressure
		tempassessmentAfterDislysis.ActualUltrafiltration = endmonitorRecords.UltrafiltrationVolume
		tempassessmentAfterDislysis.ActualDisplacement = endmonitorRecords.DisplacementQuantity
	}

	err := service.UpdateAssessmentAfterDislysisRecord(&tempassessmentAfterDislysis)
	if err != nil {
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
		return
	}

	updateErr := service.ModifyDialysisRecord(dialysisRecord.ID, nurseID, endDate.Unix(), adminUserInfo.AdminUser.Id)
	if updateErr != nil {
		this.ErrorLog("下机失败:%v", updateErr)
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
		return
	} else {
		dialysisRecord.Stage = 2
		dialysisRecord.FinishNurse = nurseID
		dialysisRecord.FinishCreator = adminUserInfo.AdminUser.Id
		dialysisRecord.FinishModifier = adminUserInfo.AdminUser.Id
		dialysisRecord.EndTime = endDate.Unix()
		// 结束时候透析次数加1
		service.UpdateSolutionByPatientId(patientID)
		this.ServeSuccessJSON(map[string]interface{}{
			"dialysis_order":          dialysisRecord,
			"assessmentAfterDislysis": tempassessmentAfterDislysis,
		})
	}
}

func (this *DialysisRecordAPIController) ModifyStartDialysis() {
	record_id, _ := this.GetInt64("id")
	nurseID, _ := this.GetInt64("nurse")
	puncture_nurse, _ := this.GetInt64("puncture_nurse")
	bedID, _ := this.GetInt64("bed")
	start_time := this.GetString("start_time")
	schedual_type, _ := this.GetInt64("schedual_type")

	if record_id == 0 {
		this.ErrorLog("id:%v", record_id)
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}

	startDate, parseStartDateErr := utils.ParseTimeStringToTime("2006-01-02 15:04", start_time)
	if parseStartDateErr != nil {
		this.ErrorLog("时间解析失败:%v", parseStartDateErr)
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}

	adminUserInfo := this.GetAdminUserInfo()

	nurse, getNurseErr := service.GetAdminUserByUserID(nurseID)
	if getNurseErr != nil {
		this.ErrorLog("获取护士失败:%v", getNurseErr)
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
		return
	} else if nurse == nil {
		this.ErrorLog("护士不存在")
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}

	nurse, getNurseErr = service.GetAdminUserByUserID(puncture_nurse)
	if getNurseErr != nil {
		this.ErrorLog("获取护士失败:%v", getNurseErr)
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
		return
	} else if nurse == nil {
		this.ErrorLog("护士不存在")
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}

	deviceNumber, getDeviceNumberErr := service.GetDeviceNumberByID(adminUserInfo.CurrentOrgId, bedID)
	if getDeviceNumberErr != nil {
		this.ErrorLog("获取床位号失败:%v", getDeviceNumberErr)
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
		return
	} else if deviceNumber == nil {
		this.ErrorLog("床位号不存在")
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}

	_, tempDialysisRecord := service.FindDialysisOrderById(record_id)

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

	scheduleDateStart := startDate.Format("2006-01-02") + " 00:00:00"
	scheduleDateEnd := startDate.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)
	schedulestartTime := theStartTime.Unix()
	scheduleendTime := theEndTime.Unix()

	//查询更改的机号，是否有人用了,如果只是排班了，但是没上机，直接替换，如果排班且上机了，就提示他无法上机

	schedule, err := service.GetDayScheduleByBedid(adminUserInfo.CurrentOrgId, schedulestartTime, bedID, schedual_type)
	daySchedule, _ := service.GetDaySchedule(adminUserInfo.CurrentOrgId, schedulestartTime, scheduleendTime, tempDialysisRecord.PatientId)

	if daySchedule.BedId != bedID || daySchedule.ScheduleType != schedual_type {

		if err == gorm.ErrRecordNotFound { //空床位
			// 修改了床位逻辑
			daySchedule, _ := service.GetDaySchedule(adminUserInfo.CurrentOrgId, schedulestartTime, scheduleendTime, tempDialysisRecord.PatientId)
			if daySchedule.ID > 0 {
				daySchedule.BedId = bedID
				daySchedule.PartitionId = deviceNumber.ZoneID
				daySchedule.ScheduleType = schedual_type
				daySchedule.UpdatedTime = time.Now().Unix()
				err := service.UpdateSchedule(&daySchedule)
				if err != nil {
					this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
					return
				}
			}

		} else if err == nil {
			if schedule.ID > 0 && schedule.DialysisOrder.ID == 0 { //有排班没上机记录
				daySchedule, _ := service.GetDaySchedule(adminUserInfo.CurrentOrgId, schedulestartTime, scheduleendTime, tempDialysisRecord.PatientId)
				if daySchedule.ID > 0 {
					daySchedule.BedId = bedID
					daySchedule.PartitionId = deviceNumber.ZoneID

					daySchedule.ScheduleType = schedual_type
					daySchedule.UpdatedTime = time.Now().Unix()
					err := service.UpdateSchedule(&daySchedule)
					if err != nil {
						this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
						return
					}
				}
			} else if schedule.ID > 0 && schedule.DialysisOrder.ID > 0 { //有排班且有上机记录
				this.ServeFailJSONWithSGJErrorCode(enums.ErrorDialysisOrderRepeatBed)
				return
			}
		} else if err != nil {
			this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
			return
		}

	}
	dialysisRecord := &models.DialysisOrder{
		ID:            record_id,
		UserOrgId:     adminUserInfo.CurrentOrgId,
		BedID:         bedID,
		StartNurse:    nurseID,
		StartTime:     startDate.Unix(),
		PunctureNurse: puncture_nurse,
		Creator:       adminUserInfo.AdminUser.Id,
		Modifier:      adminUserInfo.AdminUser.Id,
		SchedualType:  schedual_type,
	}

	updateErr := service.ModifyStartDialysisOrder(dialysisRecord)
	if updateErr != nil {
		this.ErrorLog("修改上机失败：%v", updateErr)
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
		return
	}

	if updateErr == nil {
		if tempDialysisRecord.Stage == 2 {
			temp_time := (float64(tempDialysisRecord.EndTime) - float64(startDate.Unix())) / 3600
			value, _ := strconv.ParseFloat(fmt.Sprintf("%.2f", temp_time), 64)
			fmt.Println(value)
			a, b := math.Modf(value)
			tempMinute, _ := strconv.ParseFloat(fmt.Sprintf("%.2f", b), 64)
			hour, _ := strconv.ParseInt(fmt.Sprintf("%.0f", a), 10, 64)
			minute, _ := strconv.ParseInt(fmt.Sprintf("%.0f", tempMinute*60), 10, 64)
			updateAssessmentErr := service.UpdateAssessmentAfterDate(tempDialysisRecord.PatientId, tempDialysisRecord.UserOrgId, tempDialysisRecord.DialysisDate, hour, minute)
			if updateAssessmentErr != nil {
				utils.ErrorLog("%v", updateAssessmentErr)
			}
			after, _ := service.FindAssessmentAfterDislysisById(tempDialysisRecord.UserOrgId, tempDialysisRecord.PatientId, tempDialysisRecord.DialysisDate)
			_, dialysisRecords := service.FindDialysisOrderById(record_id)
			this.ServeSuccessJSON(map[string]interface{}{
				"dialysis_order": dialysisRecords,
				"after":          after,
			})
		} else {
			_, dialysisRecords := service.FindDialysisOrderById(record_id)
			this.ServeSuccessJSON(map[string]interface{}{
				"dialysis_order": dialysisRecords,
			})
		}
	}

}

func (c *DialysisRecordAPIController) ModifyFinishDialysis() {
	record_id, _ := c.GetInt64("id")
	nurseID, _ := c.GetInt64("nurse")
	end_time := c.GetString("end_time")

	if record_id <= 0 || nurseID <= 0 {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}

	adminUserInfo := c.GetAdminUserInfo()
	nurse, getNurseErr := service.GetAdminUserByUserID(nurseID)
	if getNurseErr != nil {
		c.ErrorLog("获取护士失败:%v", getNurseErr)
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
		return
	} else if nurse == nil {
		c.ErrorLog("护士不存在")
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}

	endDate, parseEndDateErr := utils.ParseTimeStringToTime("2006-01-02 15:04", end_time)
	if parseEndDateErr != nil {
		c.ErrorLog("日期(%v)解析错误：%v", end_time, parseEndDateErr)
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}
	_, tempDialysisRecords := service.FindDialysisOrderById(record_id)

	//if tempDialysisRecords.FinishCreator != adminUserInfo.AdminUser.Id {
	//	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
	//	}
	//}

	dialysisRecord := &models.DialysisOrder{
		ID:             record_id,
		UserOrgId:      adminUserInfo.CurrentOrgId,
		EndTime:        endDate.Unix(),
		FinishNurse:    nurseID,
		FinishModifier: adminUserInfo.AdminUser.Id,
	}

	updateErr := service.ModifyFinishDialysisOrder(dialysisRecord)
	if updateErr != nil {
		c.ErrorLog("修改下机失败：%v", updateErr)
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
		return
	}

	if updateErr == nil {
		temp_time := (float64(endDate.Unix()) - float64(tempDialysisRecords.StartTime)) / 3600
		value, _ := strconv.ParseFloat(fmt.Sprintf("%.2f", temp_time), 64)
		fmt.Println(value)
		a, b := math.Modf(value)
		tempMinute, _ := strconv.ParseFloat(fmt.Sprintf("%.2f", b), 64)
		hour, _ := strconv.ParseInt(fmt.Sprintf("%.0f", a), 10, 64)
		minute, _ := strconv.ParseInt(fmt.Sprintf("%.0f", tempMinute*60), 10, 64)
		updateAssessmentErr := service.UpdateAssessmentAfterDate(tempDialysisRecords.PatientId, tempDialysisRecords.UserOrgId, tempDialysisRecords.DialysisDate, hour, minute)
		if updateAssessmentErr != nil {
			utils.ErrorLog("%v", updateAssessmentErr)
		}

	}

	after, _ := service.FindAssessmentAfterDislysisById(tempDialysisRecords.UserOrgId, tempDialysisRecords.PatientId, tempDialysisRecords.DialysisDate)
	_, dialysisRecords := service.FindDialysisOrderById(record_id)
	c.ServeSuccessJSON(map[string]interface{}{
		"dialysis_order": dialysisRecords,
		"after":          after,
	})

}
