package controllers

import (
	"XT_New/enums"
	"XT_New/models"
	"XT_New/service"
	"XT_New/utils"
	"bytes"
	"encoding/json"
	"fmt"
	"github.com/astaxie/beego"
	"github.com/jinzhu/gorm"
	"io/ioutil"
	"math/rand"
	"net/http"
	"reflect"
	"strconv"
	"strings"
	"time"
)

type HisApiController struct {
	BaseAuthAPIController
}

func HisManagerApiRegistRouters() {

	beego.Router("/api/hispatient/list", &HisApiController{}, "get:GetHisPatientList")
	beego.Router("/api/hispatient/get", &HisApiController{}, "get:GetHisPatientInfo")
	beego.Router("/api/hisprescription/config", &HisApiController{}, "get:GetHisPrescriptionConfig")

	beego.Router("/api/hisprescription/delete", &HisApiController{}, "post:DeletePrescription")
	beego.Router("/api/advice/delete", &HisApiController{}, "post:DeleteDoctorAdvice")
	beego.Router("/api/project/delete", &HisApiController{}, "post:DeleteProject")
	beego.Router("/api/addition_charge/delete", &HisApiController{}, "post:DeleteAddition")

	beego.Router("/api/hisprescription/list", &HisApiController{}, "get:GetHisPrescriptionList")
	beego.Router("/api/hisprescription/info", &HisApiController{}, "get:GetHisPrescriptionInfo")

	beego.Router("/api/hisprescription/create", &HisApiController{}, "post:CreateHisPrescription")

	beego.Router("/api/doctorworkstation/casehistory/list", &HisApiController{}, "get:GetHisPatientCaseHistoryList")
	beego.Router("/api/doctorworkstation/casehistory/get", &HisApiController{}, "get:GetHisPatientCaseHistory")
	beego.Router("/api/doctorworkstation/casehistory/create", &HisApiController{}, "get:CreateHisPatientCaseHistory")
	beego.Router("/api/doctorworkstation/casehistorytemplate/create", &HisApiController{}, "get:CreateCaseHistoryTemplate")
	beego.Router("/api/doctorworkstation/casehistorytemplate/get", &HisApiController{}, "get:GetCaseHistoryTemplate")

	beego.Router("/api/hisorder/list", &HisApiController{}, "get:GetHisOrderList")
	beego.Router("/api/hisorder/get", &HisApiController{}, "get:GetHisOrder")

	beego.Router("/api/register/get", &HisApiController{}, "get:GetRegisterInfo")
	beego.Router("/api/upload/get", &HisApiController{}, "get:GetUploadInfo")

	beego.Router("/api/refund/post", &HisApiController{}, "post:Refund")

	beego.Router("/api/medicalinsurance/config", &HisApiController{}, "get:GetMedicalInsuranceConfig")

	beego.Router("/api/doctor/list", &HisApiController{}, "get:GetAdminUsers")

	//beego.Router("/api/medicalinsurance/config", &HisApiController{}, "get:GetMedicalInsuranceConfig")

	//新增附加费用
	//beego.Router("/api/his/additionalcharge", &HisApiController{}, "Post:AdditionalCharge")

	//beego.Router("/api/additionalcharge/get", &HisApiController{}, "Get:GetAdditionalcharge")

}

func (c *HisApiController) GetHisPatientList() {
	types, _ := c.GetInt64("type", 0)
	record_date := c.GetString("record_date")
	timeLayout := "2006-01-02"
	loc, _ := time.LoadLocation("Local")
	theTime, err := time.ParseInLocation(timeLayout+" 15:04:05", record_date+" 00:00:00", loc)
	if err != nil {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}
	recordDateTime := theTime.Unix()
	adminInfo := c.GetAdminUserInfo()
	patients, _ := service.GetHisPatientList(adminInfo.CurrentOrgId, "", recordDateTime)
	var total_one int64
	var total_two int64

	for _, item := range patients {

		if item.HisPrescription == nil || len(item.HisPrescription) <= 0 {
			total_one = total_one + 1
		}
		if item.HisPrescription != nil && len(item.HisPrescription) > 0 {
			total_two = total_two + 1
		}
	}

	if types == 0 {
		c.ServeSuccessJSON(map[string]interface{}{
			"list":      patients,
			"total_one": total_one,
			"total_two": total_two,
		})

	} else if types == 1 { //未就诊
		var patientsOne []*service.Schedule
		for _, item := range patients {
			if item.HisPrescription == nil || len(item.HisPrescription) <= 0 {
				patientsOne = append(patientsOne, item)
			}
		}
		c.ServeSuccessJSON(map[string]interface{}{
			"list":      patientsOne,
			"total_one": total_one,
			"total_two": total_two,
		})

	} else if types == 2 { //已就诊
		var patientsTwo []*service.Schedule
		for _, item := range patients {

			if item.HisPrescription != nil && len(item.HisPrescription) > 0 {
				patientsTwo = append(patientsTwo, item)
			}
		}
		c.ServeSuccessJSON(map[string]interface{}{
			"list":      patientsTwo,
			"total_one": total_one,
			"total_two": total_two,
		})
	}

}
func (c *HisApiController) GetHisPatientInfo() {
	patient_id, _ := c.GetInt64("patient_id")
	record_date := c.GetString("record_date")
	number := c.GetString("number")

	timeLayout := "2006-01-02"
	loc, _ := time.LoadLocation("Local")
	theTime, err := time.ParseInLocation(timeLayout+" 15:04:05", record_date+" 00:00:00", loc)
	if err != nil {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}
	recordDateTime := theTime.Unix()

	admin := c.GetAdminUserInfo()
	his_patient_info, _ := service.GetHisPatientInfo(admin.CurrentOrgId, patient_id, recordDateTime)
	xt_patient_info, _ := service.GetXTPatientInfo(admin.CurrentOrgId, patient_id)
	prescriptions, _ := service.GetHisPrescription(admin.CurrentOrgId, patient_id, recordDateTime)
	case_history, _ := service.GetHisPatientCaseHistoryInfo(admin.CurrentOrgId, patient_id, recordDateTime)
	patientPrescriptionInfo, _ := service.FindPatientPrescriptionInfo(admin.CurrentOrgId, patient_id, recordDateTime)
	lastPatientPrescriptionInfo, _ := service.FindLastPatientPrescriptionInfo(admin.CurrentOrgId, patient_id, recordDateTime)
	order, _ := service.GetHisOrder(admin.CurrentOrgId, number, patient_id)
	//addtions, _ := service.GetAllAdditionCharge(admin.CurrentOrgId, patient_id, recordDateTime)

	c.ServeSuccessJSON(map[string]interface{}{
		"his_info":     his_patient_info,
		"xt_info":      xt_patient_info,
		"prescription": prescriptions,
		"case_history": case_history,
		"info":         patientPrescriptionInfo,
		"last_info":    lastPatientPrescriptionInfo,
		"order":        order,
	})
	return

}
func (c *HisApiController) GetHisPrescriptionConfig() {
	adminInfo := c.GetAdminUserInfo()
	//获取医嘱模版
	advices, _ := service.FindAllHisAdviceTemplate(adminInfo.CurrentOrgId)
	//获取所有基础药
	drugs, _ := service.GetAllDrugLibList(adminInfo.CurrentOrgId)
	drugways, _, _ := service.GetDrugWayDics(adminInfo.CurrentOrgId)
	efs, _, _ := service.GetExecutionFrequencyDics(adminInfo.CurrentOrgId)
	doctors, _ := service.GetHisAdminUserDoctors(adminInfo.CurrentOrgId)
	//获取所有科室信息
	department, _ := service.GetAllDepartMent(adminInfo.CurrentOrgId)

	//获取诊断信息

	sick, _ := service.FindAllSick(adminInfo.CurrentOrgId)

	additions, _ := service.FindAllAddition(adminInfo.CurrentOrgId)

	//获取当前用户的信息
	adminUserInfo, _ := service.GetAdminUserInfoByID(adminInfo.CurrentOrgId, adminInfo.AdminUser.Id)

	c.ServeSuccessJSON(map[string]interface{}{
		"drugs":            drugs,
		"advices_template": advices,
		"drugways":         drugways,
		"efs":              efs,
		"doctors":          doctors,
		"department":       department,
		"sick":             sick,
		"info":             adminUserInfo,
		"additions":        additions,
	})
}
func (c *HisApiController) CreateHisPrescription() {
	record_date := c.GetString("record_date")
	patient_id, _ := c.GetInt64("patient_id")
	reg_type := c.GetString("reg_type")
	diagnose := c.GetString("diagnose")
	sick_history := c.GetString("sick_history")
	doctor_id, _ := c.GetInt64("doctor", 0)
	department, _ := c.GetInt64("department", 0)
	his_patient_id, _ := c.GetInt64("his_patient_id")
	dataBody := make(map[string]interface{}, 0)
	err := json.Unmarshal(c.Ctx.Input.RequestBody, &dataBody)
	if err != nil {
		utils.ErrorLog(err.Error())
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}

	timeLayout := "2006-01-02"
	loc, _ := time.LoadLocation("Local")
	theTime, err := time.ParseInLocation(timeLayout+" 15:04:05", record_date+" 00:00:00", loc)
	if err != nil {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}
	adminInfo := c.GetAdminUserInfo()
	recordDateTime := theTime.Unix()

	role, _ := service.GetAdminUserInfoByID(adminInfo.CurrentOrgId, doctor_id)

	info, _ := service.FindPatientPrescriptionInfo(adminInfo.CurrentOrgId, patient_id, recordDateTime)
	var hpInfo models.HisPrescriptionInfo
	if info.ID == 0 {
		var randNum int
		randNum = rand.Intn(10000) + 1000
		timestamp := time.Now().Unix()
		tempTime := time.Unix(timestamp, 0)
		timeFormat := tempTime.Format("20060102150405")
		p_number := timeFormat + strconv.FormatInt(int64(randNum), 10) + strconv.FormatInt(int64(adminInfo.CurrentOrgId), 10) + strconv.FormatInt(int64(patient_id), 10)

		hpInfo = models.HisPrescriptionInfo{
			UserOrgId:          adminInfo.CurrentOrgId,
			RecordDate:         theTime.Unix(),
			PatientId:          patient_id,
			Status:             1,
			Ctime:              time.Now().Unix(),
			Mtime:              time.Now().Unix(),
			Creator:            adminInfo.AdminUser.Id,
			Modifier:           adminInfo.AdminUser.Id,
			Diagnosis:          diagnose,
			SickHistory:        sick_history,
			Departments:        department,
			RegisterType:       reg_type,
			PrescriptionNumber: p_number,
			PrescriptionStatus: 1,
			Doctor:             role.UserName,
			DoctorId:           doctor_id,
		}
		service.SavePatientPrescriptionInfo(hpInfo)

	} else {
		hpInfo = models.HisPrescriptionInfo{
			ID:                 info.ID,
			UserOrgId:          adminInfo.CurrentOrgId,
			RecordDate:         info.RecordDate,
			PatientId:          info.PatientId,
			Status:             1,
			Ctime:              info.Ctime,
			Mtime:              time.Now().Unix(),
			Creator:            info.Creator,
			Modifier:           adminInfo.AdminUser.Id,
			Diagnosis:          diagnose,
			SickHistory:        sick_history,
			Departments:        department,
			RegisterType:       reg_type,
			PrescriptionNumber: info.PrescriptionNumber,
			Doctor:             role.UserName,
			PrescriptionStatus: info.PrescriptionStatus,
			DoctorId:           doctor_id,
		}
		service.SavePatientPrescriptionInfo(hpInfo)
	}

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

		if len(prescriptions) > 0 {
			for _, item := range prescriptions {
				items := item.(map[string]interface{})
				if items["id"] == nil || reflect.TypeOf(items["id"]).String() != "float64" {
					utils.ErrorLog("id")
					c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}
				id := int64(items["id"].(float64))

				if items["type"] == nil || reflect.TypeOf(items["type"]).String() != "float64" {
					utils.ErrorLog("type")
					c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}
				types := int64(items["type"].(float64))

				ctime := time.Now().Unix()
				prescription := &models.HisPrescription{
					ID:                 id,
					PatientId:          patient_id,
					UserOrgId:          adminInfo.CurrentOrgId,
					RecordDate:         recordDateTime,
					Ctime:              ctime,
					Mtime:              ctime,
					Type:               types,
					Modifier:           adminInfo.AdminUser.Id,
					Creator:            adminInfo.AdminUser.Id,
					Status:             1,
					Doctor:             role.UserName,
					HisPatientId:       his_patient_id,
					OrderStatus:        1,
					BatchNumber:        "",
					PrescriptionNumber: hpInfo.PrescriptionNumber,
				}
				service.SaveHisPrescription(prescription)

				if items["advices"] != nil && reflect.TypeOf(items["advices"]).String() == "[]interface {}" {
					advices := items["advices"].([]interface{})
					//group := service.GetMaxAdviceGroupID(adminInfo.CurrentOrgId)
					groupNo := int64(0)
					ctime := time.Now().Unix()
					mtime := ctime
					if len(advices) > 0 {
						for _, advice := range advices {
							var s models.HisDoctorAdviceInfo
							s.PrescriptionId = prescription.ID
							s.AdviceType = 2
							s.AdviceDoctor = adminInfo.AdminUser.Id
							s.StopState = 2
							s.ExecutionState = 2
							s.AdviceDate = recordDateTime
							s.Status = 1
							s.UserOrgId = adminInfo.CurrentOrgId
							s.RecordDate = recordDateTime
							s.StartTime = recordDateTime
							s.Groupno = groupNo
							s.CreatedTime = ctime
							s.UpdatedTime = mtime
							s.PatientId = patient_id
							s.HisPatientId = his_patient_id
							errcode := c.setAdviceWithJSON(&s, advice.(map[string]interface{}))
							if errcode > 0 {
								c.ServeFailJSONWithSGJErrorCode(errcode)
								return
							}
							service.CreateHisDoctorAdvice(&s)
							var randNum int
							randNum = rand.Intn(10000) + 1000
							timestamp := time.Now().Unix()
							tempTime := time.Unix(timestamp, 0)
							timeFormat := tempTime.Format("20060102150405")
							s.FeedetlSn = timeFormat + strconv.FormatInt(int64(randNum), 10) + "-" + "1" + "-" + strconv.FormatInt(s.ID, 10)
							service.CreateHisDoctorAdvice(&s)

						}
					}
				}
				if items["project"] != nil && reflect.TypeOf(items["project"]).String() == "[]interface {}" {
					projects := items["project"].([]interface{})
					if len(projects) > 0 {
						for _, project := range projects {
							var p models.HisPrescriptionProject
							p.PrescriptionId = prescription.ID
							p.Ctime = time.Now().Unix()
							p.Mtime = time.Now().Unix()
							p.PatientId = patient_id
							p.RecordDate = recordDateTime
							p.UserOrgId = adminInfo.CurrentOrgId
							p.HisPatientId = his_patient_id
							p.Status = 1
							errcode := c.setProjectWithJSON(&p, project.(map[string]interface{}))
							if errcode > 0 {
								c.ServeFailJSONWithSGJErrorCode(errcode)
								return
							}
							service.CreateHisProjectTwo(&p)
							var randNum int
							randNum = rand.Intn(10000) + 1000
							timestamp := time.Now().Unix()
							tempTime := time.Unix(timestamp, 0)
							timeFormat := tempTime.Format("20060102150405")
							p.FeedetlSn = timeFormat + strconv.FormatInt(int64(randNum), 10) + "-" + "2" + "-" + strconv.FormatInt(p.ID, 10)
							service.SaveHisProjectTwo(&p)

						}
					}
				}
				if items["addition"] != nil && reflect.TypeOf(items["addition"]).String() == "[]interface {}" {
					addition := items["addition"].([]interface{})
					//group := service.GetMaxAdviceGroupID(adminInfo.CurrentOrgId)
					ctime := time.Now().Unix()
					mtime := ctime
					if len(addition) > 0 {
						for _, item := range addition {
							var s models.HisAdditionalCharge
							s.PrescriptionId = prescription.ID
							s.Status = 1
							s.UserOrgId = adminInfo.CurrentOrgId
							s.RecordDate = recordDateTime
							s.CreatedTime = ctime
							s.UpdatedTime = mtime
							s.PatientId = patient_id
							s.HisPatientId = his_patient_id
							errcode := c.setAddtionWithJSON(&s, item.(map[string]interface{}))
							if errcode > 0 {
								c.ServeFailJSONWithSGJErrorCode(errcode)
								return
							}
							service.CreateAdditionalCharge(&s)
							var randNum int
							randNum = rand.Intn(10000) + 1000
							timestamp := time.Now().Unix()
							tempTime := time.Unix(timestamp, 0)
							timeFormat := tempTime.Format("20060102150405")
							s.FeedetlSn = timeFormat + strconv.FormatInt(int64(randNum), 10) + "-" + "3" + "-" + strconv.FormatInt(s.ID, 10)
							service.CreateAdditionalCharge(&s)

						}
					}
				}

			}
		}
	}
	if err == nil {
		c.ServeSuccessJSON(map[string]interface{}{
			"msg": "保存成功",
		})
		return

	} else {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeSystemError)
		return
	}
}

func (c *HisApiController) DeletePrescription() {
	prescription_id, _ := c.GetInt64("id")
	//TODO 需要判断是否已经结算
	err := service.DelelteHisPrescription(prescription_id, c.GetAdminUserInfo().CurrentOrgId)
	if err == nil {
		c.ServeSuccessJSON(map[string]interface{}{
			"msg": "删除成功",
		})
		return
	} else {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeSystemError)
		return
	}
}

func (c *HisApiController) DeleteDoctorAdvice() {
	id, _ := c.GetInt64("id")
	//TODO 需要判断是否已经结算
	err := service.DelelteDoctorAdvice(id, c.GetAdminUserInfo().CurrentOrgId)
	if err == nil {
		c.ServeSuccessJSON(map[string]interface{}{
			"msg": "删除成功",
		})
		return
	} else {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeSystemError)
		return
	}
}

func (c *HisApiController) DeleteProject() {
	id, _ := c.GetInt64("id")
	//TODO 需要判断是否已经结算
	err := service.DelelteProject(id, c.GetAdminUserInfo().CurrentOrgId)
	if err == nil {
		c.ServeSuccessJSON(map[string]interface{}{
			"msg": "删除成功",
		})
		return
	} else {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeSystemError)
		return
	}
}

func (c *HisApiController) CreateHisAdditionalCharge() {
	his_patient_id, _ := c.GetInt64("his_patient_id")
	patient_id, _ := c.GetInt64("patient_id")
	record_date := c.GetString("record_date")
	timeLayout := "2006-01-02"
	loc, _ := time.LoadLocation("Local")
	theTime, err := time.ParseInLocation(timeLayout+" 15:04:05", record_date+" 00:00:00", loc)
	if err != nil {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}
	adminInfo := c.GetAdminUserInfo()
	recordDateTime := theTime.Unix()
	dataBody := make(map[string]interface{}, 0)
	err = json.Unmarshal(c.Ctx.Input.RequestBody, &dataBody)
	if err != nil {
		utils.ErrorLog(err.Error())
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}

	var additions []*models.HisAdditionalCharge
	if dataBody["addition"] != nil && reflect.TypeOf(dataBody["addition"]).String() == "[]interface {}" {
		additions, _ := dataBody["addition"].([]interface{})
		if len(additions) > 0 {
			for _, item := range additions {
				items := item.(map[string]interface{})

				if items["item_id"] == nil || reflect.TypeOf(items["item_id"]).String() != "float64" {
					utils.ErrorLog("item_id")
					c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}
				item_id := int64(items["item_id"].(float64))

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

				if items["price"] == nil || reflect.TypeOf(items["price"]).String() != "string" {
					utils.ErrorLog("price")
					c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
					return
				}
				price, _ := strconv.ParseFloat(items["price"].(string), 64)

				ctime := time.Now().Unix()
				additional := &models.HisAdditionalCharge{
					PatientId:    patient_id,
					HisPatientId: his_patient_id,
					UserOrgId:    adminInfo.CurrentOrgId,
					RecordDate:   recordDateTime,
					CreatedTime:  ctime,
					UpdatedTime:  ctime,
					Modifier:     adminInfo.AdminUser.Id,
					Creator:      adminInfo.AdminUser.Id,
					Price:        price,
					ItemName:     item_name,
					ItemId:       item_id,
					Status:       1,
				}
				additions = append(additions, additional)
			}
		}
	}
	for _, item := range additions {
		service.CreateAddtionalCharge(item)
	}
	c.ServeSuccessJSON(map[string]interface{}{
		"msg": "创建成功",
	})
}

func (c *HisApiController) CreateHisPatientCaseHistory() {

	blood_fat := c.GetString("blood_fat")
	bloodfatfloat, _ := strconv.ParseFloat(blood_fat, 64)
	fmt.Println("33333333", bloodfatfloat)
	blood_sugar := c.GetString("blood_sugar")
	bloodsugarfloat, _ := strconv.ParseFloat(blood_sugar, 64)
	fmt.Println(bloodsugarfloat)
	chief_conplaint := c.GetString("chief_conplaint")

	dbp := c.GetString("dbp")
	dbpfloat, _ := strconv.ParseFloat(dbp, 64)
	delivery_way, _ := c.GetInt64("delivery_way")
	diagnostic := c.GetString("diagnostic")
	fmt.Println("diagnostic", diagnostic)
	family_history := c.GetString("family_history")
	fmt.Println(family_history)
	height := c.GetString("height")
	history_of_present_illness := c.GetString("history_of_present_illness")
	is_infect, _ := c.GetInt64("is_infect")
	fmt.Println("is", is_infect)
	past_history := c.GetString("past_history")
	patient_id, _ := c.GetInt64("patient_id")
	his_patient_id, _ := c.GetInt64("his_patient_id")
	fmt.Println("patient_id", patient_id)
	personal_history := c.GetString("personal_history")
	pulse := c.GetString("pulse")
	pulsefloat, _ := strconv.ParseFloat(pulse, 64)
	sbp := c.GetString("sbp")
	sbpfloat, _ := strconv.ParseFloat(sbp, 64)
	heightfloat, _ := strconv.ParseFloat(height, 64)
	sicktype := c.GetString("sick_type")
	fmt.Println("sicketype", sicktype)
	sick_type, _ := strconv.ParseInt(sicktype, 10, 64)
	symptom := c.GetString("symptom")
	sick_date := c.GetString("sick_date")
	temperatures := c.GetString("temperature")
	fmt.Println("temperatures", temperatures)
	temperature, _ := strconv.ParseFloat(temperatures, 64)
	record_date := c.GetString("record_date")
	breathing := c.GetString("breathing")
	doctor_advice := c.GetString("doctor_advice")
	remark := c.GetString("remark")
	breathingfloat, _ := strconv.ParseFloat(breathing, 64)
	fmt.Println("breathingfloat", breathingfloat)
	timeLayout := "2006-01-02"
	loc, _ := time.LoadLocation("Local")
	theTime, err := time.ParseInLocation(timeLayout+" 15:04:05", record_date+" 00:00:00", loc)
	if err != nil {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}
	recordDateTime := theTime.Unix()
	fmt.Println("recordDataTime", recordDateTime)
	sickTime, err := time.ParseInLocation(timeLayout+" 15:04:05", sick_date+" 00:00:00", loc)
	if err != nil {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}
	sickTimes := sickTime.Unix()
	ctime := time.Now().Unix()
	caseHistory := models.HisPatientCaseHistory{
		HisPatientId:            his_patient_id,
		PatientId:               patient_id,
		Temperature:             temperature,
		BloodSugar:              bloodsugarfloat,
		Pulse:                   pulsefloat,
		Sbp:                     sbpfloat,
		Dbp:                     dbpfloat,
		Height:                  heightfloat,
		BloodFat:                bloodfatfloat,
		SickType:                sick_type,
		Symptom:                 symptom,
		SickDate:                sickTimes,
		IsInfect:                is_infect,
		HistoryOfPresentIllness: history_of_present_illness,
		PastHistory:             past_history,
		Doctor:                  c.GetAdminUserInfo().AdminUser.Id,
		ChiefConplaint:          chief_conplaint,
		PersonalHistory:         personal_history,
		FamilyHistory:           family_history,
		Diagnostic:              diagnostic,
		UserOrgId:               c.GetAdminUserInfo().CurrentOrgId,
		Status:                  1,
		Ctime:                   ctime,
		Mtime:                   ctime,
		RecordDate:              recordDateTime,
		DeliveryWay:             delivery_way,
		Breathing:               breathingfloat,
		DoctorAdvice:            doctor_advice,
		Remark:                  remark,
	}

	err = service.SaveHisPatientCaseHistory(&caseHistory)
	if err != nil {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeUpdateConfig)
		return
	}
	c.ServeSuccessJSON(map[string]interface{}{
		"caseHistory": caseHistory,
	})
	return

	//查询该患者是否有病历
	//_, errcode := service.GetHisPatientCaseHistoryById(his_patient_id)
	//if errcode == gorm.ErrRecordNotFound {
	//	err = service.SaveHisPatientCaseHistory(caseHistory)
	//	if err != nil {
	//		c.ServeSuccessJSON(map[string]interface{}{
	//			"msg": "保存成功",
	//		})
	//	}
	//} else if errcode == nil {
	//	c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeUpdateConfig)
	//	return
	//}

}
func (c *HisApiController) GetHisPatientCaseHistoryList() {
	patient_id, _ := c.GetInt64("patient_id", 0)
	adminUser := c.GetAdminUserInfo()
	caseHistorys, _ := service.GetHisPatientCaseHistoryList(adminUser.CurrentOrgId, patient_id)
	c.ServeSuccessJSON(map[string]interface{}{
		"list": caseHistorys,
	})

}
func (c *HisApiController) GetHisPatientCaseHistory() {
	record_date, _ := c.GetInt64("record_date", 0)
	patient_id, _ := c.GetInt64("patient_id", 0)
	admin := c.GetAdminUserInfo()
	info, _ := service.GetHisPatientInfo(admin.CurrentOrgId, patient_id, record_date)
	case_history, _ := service.GetHisPatientCaseHistoryInfo(admin.CurrentOrgId, patient_id, record_date)
	c.ServeSuccessJSON(map[string]interface{}{
		"info":         info,
		"case_history": case_history,
	})

}
func (c *HisApiController) CreateCaseHistoryTemplate() {
	template_name := c.GetString("template_name")
	fmt.Println("template_name22222222222222", template_name)
	template_remark := c.GetString("template_remark")
	doctor := c.GetAdminUserInfo().AdminUser.Id
	diagnostic := c.GetString("diagnostic")
	chief_conplaint := c.GetString("chief_conplain")
	history_of_present_illness := c.GetString("history_of_present_illness")
	past_history := c.GetString("past_history")
	personal_history := c.GetString("personal_history")
	family_history := c.GetString("family_history")
	user_name := c.GetString("user_name")
	//record_date := c.GetString("record_date")
	//fmt.Println("record_date--------",record_date)
	//timeLayout := "2006-01-02"
	//loc, _ := time.LoadLocation("Local")
	//
	//theTime, err := time.ParseInLocation(timeLayout+" 15:04:05", record_date+" 00:00:00", loc)
	//if err != nil {
	//	c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
	//	return
	//}
	//recordDateTime := theTime.Unix()

	ctime := time.Now().Unix()

	template := models.HisCaseHistoryTemplate{
		HistoryOfPresentIllness: history_of_present_illness,
		PastHistory:             past_history,
		ChiefConplaint:          chief_conplaint,
		PersonalHistory:         personal_history,
		FamilyHistory:           family_history,
		Diagnostic:              diagnostic,
		UserOrgId:               c.GetAdminUserInfo().CurrentOrgId,
		Status:                  1,
		Ctime:                   ctime,
		Mtime:                   ctime,
		RecordDate:              time.Now().Unix(),
		TemplateName:            template_name,
		TemplateRemark:          template_remark,
		Creator:                 doctor,
		Modifier:                doctor,
		UserName:                user_name,
	}

	err := service.SaveHisPatientCaseHistoryTemplate(template)

	if err == nil {
		c.ServeSuccessJSON(map[string]interface{}{
			"msg": "保存成功",
		})

	} else {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeSystemError)
		return
	}

}
func (c *HisApiController) GetCaseHistoryTemplate() {
	timeLayout := "2006-01-02"
	loc, _ := time.LoadLocation("Local")
	keyword := c.GetString("keyword")
	start_time := c.GetString("start_time")
	end_time := c.GetString("end_time")
	startTime, _ := time.ParseInLocation(timeLayout+" 15:04:05", start_time+" 00:00:00", loc)
	endTime, _ := time.ParseInLocation(timeLayout+" 15:04:05", end_time+" 23:59:59", loc)
	admin := c.GetAdminUserInfo()
	template, _ := service.GetHisPatientCaseHistoryTemplate(admin.CurrentOrgId, startTime.Unix(), endTime.Unix(), keyword)
	//history, _ := service.GetHisPatientCaseHistory(admin.CurrentOrgId)
	c.ServeSuccessJSON(map[string]interface{}{
		"template": template,
		//"history":  history,
	})

}

func (c *HisApiController) setAdviceWithJSON(advice *models.HisDoctorAdviceInfo, json map[string]interface{}) int {

	if json["drug_name"] == nil || reflect.TypeOf(json["drug_name"]).String() != "string" {
		utils.ErrorLog("drug_name")
		return enums.ErrorCodeParamWrong
	}
	adviceName, _ := json["drug_name"].(string)
	if len(adviceName) == 0 {
		utils.ErrorLog("len(advice_name) == 0")
		return enums.ErrorCodeParamWrong
	}
	advice.AdviceName = adviceName
	adviceDesc, _ := json["advice_desc"].(string)
	advice.AdviceDesc = adviceDesc
	if json["drug_spec"] != nil && reflect.TypeOf(json["drug_spec"]).String() == "string" {
		drugSpec, _ := strconv.ParseFloat(json["drug_spec"].(string), 64)
		advice.DrugSpec = drugSpec
	}
	if json["remark"] != nil && reflect.TypeOf(json["remark"]).String() == "string" {
		remark, _ := json["remark"].(string)
		advice.Remark = remark
	}
	if json["id"] == nil {
		advice.DrugId = 0
	} else {
		if json["id"] != nil || reflect.TypeOf(json["id"]).String() == "float64" {
			drug_id := int64(json["id"].(float64))
			advice.DrugId = drug_id
		}
	}
	if json["advice_id"] != nil && reflect.TypeOf(json["advice_id"]).String() == "float64" {
		advice_id := int64(json["advice_id"].(float64))
		advice.ID = advice_id
	}

	if json["min_unit"] != nil && reflect.TypeOf(json["min_unit"]).String() == "string" {
		drugSpecUnit, _ := json["min_unit"].(string)
		advice.DrugSpecUnit = drugSpecUnit
	}
	if json["single_dose"] != nil && reflect.TypeOf(json["single_dose"]).String() == "string" {
		singleDose, _ := strconv.ParseFloat(json["single_dose"].(string), 64)
		advice.SingleDose = singleDose
	}
	if json["single_dose_unit"] != nil && reflect.TypeOf(json["single_dose_unit"]).String() == "string" {
		singleDoseUnit, _ := json["single_dose_unit"].(string)
		advice.SingleDoseUnit = singleDoseUnit
	}
	if json["prescribing_number"] != nil && reflect.TypeOf(json["prescribing_number"]).String() == "string" {
		prescribingNumber, _ := strconv.ParseFloat(json["prescribing_number"].(string), 64)
		advice.PrescribingNumber = prescribingNumber
	}
	if json["prescribing_number_unit"] != nil && reflect.TypeOf(json["prescribing_number_unit"]).String() == "string" {
		prescribingNumberUnit, _ := json["prescribing_number_unit"].(string)
		advice.PrescribingNumberUnit = prescribingNumberUnit
	}
	if json["delivery_way"] != nil && reflect.TypeOf(json["delivery_way"]).String() == "string" {
		deliveryWay, _ := json["delivery_way"].(string)
		advice.DeliveryWay = deliveryWay
	}
	if json["execution_frequency"] != nil && reflect.TypeOf(json["execution_frequency"]).String() == "string" {
		executionFrequency, _ := json["execution_frequency"].(string)
		advice.ExecutionFrequency = executionFrequency
	}

	if json["retail_price"] != nil || reflect.TypeOf(json["retail_price"]).String() == "string" {
		price, _ := strconv.ParseFloat(json["retail_price"].(string), 64)
		advice.Price = price
	}
	if json["medical_insurance_number"] != nil || reflect.TypeOf(json["medical_insurance_number"]).String() == "string" {
		med_list_codg, _ := json["medical_insurance_number"].(string)
		advice.MedListCodg = med_list_codg
	}
	if json["day"] != nil || reflect.TypeOf(json["day"]).String() == "float64" {
		day := int64(json["day"].(float64))
		advice.Day = day
	}
	return 0
}

func (c *HisApiController) setProjectWithJSON(project *models.HisPrescriptionProject, json map[string]interface{}) int {
	if json["id"] != nil || reflect.TypeOf(json["id"]).String() == "float64" {
		id := int64(json["id"].(float64))
		project.ID = id
	}
	if json["project_id"] != nil || reflect.TypeOf(json["project_id"]).String() == "float64" {
		project_id := int64(json["project_id"].(float64))
		project.ProjectId = project_id
		fmt.Println(project_id)
		fmt.Println(project.ProjectId)
	}
	if json["price"] != nil || reflect.TypeOf(json["price"]).String() == "float64" {
		price := int64(json["price"].(float64))
		formatInt_price := strconv.FormatInt(price, 10)
		float_price, _ := strconv.ParseFloat(formatInt_price, 64)
		project.Price = float_price
	}
	if json["total"] != nil && reflect.TypeOf(json["total"]).String() == "string" {
		total, _ := json["total"].(string)
		totals, _ := strconv.ParseInt(total, 10, 64)
		project.Count = totals
	}

	if json["medical_code"] != nil && reflect.TypeOf(json["medical_code"]).String() == "string" {
		medical_code, _ := json["medical_code"].(string)
		project.MedListCodg = medical_code
	}
	if json["single_dose"] != nil && reflect.TypeOf(json["single_dose"]).String() == "string" {
		single_dose, _ := json["single_dose"].(string)
		project.SingleDose = single_dose
	}

	if json["delivery_way"] != nil && reflect.TypeOf(json["delivery_way"]).String() == "string" {
		delivery_way, _ := json["delivery_way"].(string)
		project.DeliveryWay = delivery_way
	}
	if json["execution_frequency"] != nil && reflect.TypeOf(json["execution_frequency"]).String() == "string" {
		execution_frequency, _ := json["execution_frequency"].(string)
		project.ExecutionFrequency = execution_frequency
	}
	if json["remark"] != nil && reflect.TypeOf(json["remark"]).String() == "string" {
		remark, _ := json["remark"].(string)
		project.Remark = remark
	}
	if json["number_days"] != nil && reflect.TypeOf(json["number_days"]).String() == "string" {
		day, _ := json["number_days"].(string)
		project.Day = day
	}

	if json["unit"] != nil && reflect.TypeOf(json["unit"]).String() == "string" {
		unit, _ := json["unit"].(string)
		project.Unit = unit
	}
	return 0
}

func (c *HisApiController) setAddtionWithJSON(additionalCharge *models.HisAdditionalCharge, json map[string]interface{}) int {
	if json["id"] != nil || reflect.TypeOf(json["id"]).String() == "float64" {
		id := int64(json["id"].(float64))
		additionalCharge.ID = id
	}
	if json["item_id"] != nil || reflect.TypeOf(json["item_id"]).String() == "float64" {
		item_id := int64(json["item_id"].(float64))
		additionalCharge.ItemId = item_id
	}
	if json["price"] != nil || reflect.TypeOf(json["price"]).String() == "float64" {
		price := int64(json["price"].(float64))
		formatInt_price := strconv.FormatInt(price, 10)
		float_price, _ := strconv.ParseFloat(formatInt_price, 64)
		additionalCharge.Price = float_price
	}
	if json["count"] != nil && reflect.TypeOf(json["count"]).String() == "string" {
		count, _ := json["count"].(string)
		counts, _ := strconv.ParseInt(count, 10, 64)
		additionalCharge.Count = counts
	}
	if json["item_name"] != nil && reflect.TypeOf(json["item_name"]).String() == "string" {
		item_name, _ := json["item_name"].(string)
		additionalCharge.ItemName = item_name
	}

	return 0
}

func (c *HisApiController) GetHisOrderList() {
	page, _ := c.GetInt64("page", -1)
	limit, _ := c.GetInt64("limit", -1)
	start_time := c.GetString("start_time")
	end_time := c.GetString("end_time")
	types, _ := c.GetInt64("type", 0)
	keywords := c.GetString("keywords")

	timeLayout := "2006-01-02"
	loc, _ := time.LoadLocation("Local")
	var startTime int64
	if len(start_time) > 0 {
		theTime, err := time.ParseInLocation(timeLayout+" 15:04:05", start_time+" 00:00:00", loc)
		if err != nil {
			fmt.Println(err)
			c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
			return
		}
		startTime = theTime.Unix()
	}
	var endTime int64
	if len(end_time) > 0 {
		theTime, err := time.ParseInLocation(timeLayout+" 15:04:05", end_time+" 23:59:59", loc)
		if err != nil {
			utils.ErrorLog(err.Error())
			c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
			return
		}
		endTime = theTime.Unix()
	}

	adminUser := c.GetAdminUserInfo()
	org_id := adminUser.CurrentOrgId
	order, err, total := service.GetHisOrderList(org_id, page, limit, startTime, endTime, types, keywords)
	if err == nil {
		c.ServeSuccessJSON(map[string]interface{}{
			"order": order,
			"total": total,
		})
	} else {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
		return
	}
}

func (c *HisApiController) GetHisOrder() {
	patient_id, _ := c.GetInt64("patient_id", 0)
	number := c.GetString("number")
	adminInfo := c.GetAdminUserInfo()
	order, err := service.GetHisOrder(adminInfo.CurrentOrgId, number, patient_id)
	prescriptions, _ := service.GetHisPrescriptionThree(adminInfo.CurrentOrgId, patient_id, order.SettleAccountsDate, order.Number)

	if err == nil {
		c.ServeSuccessJSON(map[string]interface{}{
			"order":        order,
			"prescription": prescriptions,
		})
	} else {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
		return
	}

}

func (c *HisApiController) GetHisPrescriptionList() {
	record_date := c.GetString("record_date")
	keywords := c.GetString("keywords")
	page, _ := c.GetInt64("page")
	limit, _ := c.GetInt64("limit")

	timeLayout := "2006-01-02"
	loc, _ := time.LoadLocation("Local")
	theTime, err := time.ParseInLocation(timeLayout+" 15:04:05", record_date+" 00:00:00", loc)
	if err != nil {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}
	recordDateTime := theTime.Unix()
	adminInfo := c.GetAdminUserInfo()
	prescriptionOrder, err, total := service.GetHisPatientPrescriptionList(adminInfo.CurrentOrgId, keywords, recordDateTime, page, limit)

	//adminInfo := c.GetAdminUserInfo()
	//prescriptionOrder, err := service.GetHisPrescriptionOrderList(adminInfo.CurrentOrgId)
	//fmt.Println(prescriptionOrder)
	if err == nil {
		c.ServeSuccessJSON(map[string]interface{}{
			"order": prescriptionOrder,
			"total": total,
		})
	} else {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
		return
	}
}

func (c *HisApiController) GetHisPrescriptionInfo() {
	id, _ := c.GetInt64("id")
	adminInfo := c.GetAdminUserInfo()
	prescriptionOrder, err := service.GetHisPrescriptionOrderInfo(id, adminInfo.CurrentOrgId)
	prescription, err := service.GetHisPrescriptionFour(adminInfo.CurrentOrgId, prescriptionOrder.PatientId, prescriptionOrder.RecordDate, prescriptionOrder.PrescriptionNumber)
	if err == nil {
		c.ServeSuccessJSON(map[string]interface{}{
			"order":        prescriptionOrder,
			"prescription": prescription,
		})
	} else {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
		return
	}
}

func (c *HisApiController) GetMedicalInsuranceConfig() {
	adminUser := c.GetAdminUserInfo()
	config, _ := service.GetMedicalInsuranceConfig(adminUser.CurrentOrgId)
	c.ServeSuccessJSON(map[string]interface{}{
		"config": config,
	})

}

type ResultTwo struct {
	ErrMsg      interface{} `json:"err_msg"`
	InfRefmsgid string      `json:"inf_refmsgid"`
	Infcode     int64       `json:"infcode"`
	Output      struct {
		Baseinfo struct {
			Age         float64 `json:"age"`
			Brdy        string  `json:"brdy"`
			Certno      string  `json:"certno"`
			Gend        string  `json:"gend"`
			Naty        string  `json:"naty"`
			PsnCertType string  `json:"psn_cert_type"`
			PsnName     string  `json:"psn_name"`
			PsnNo       string  `json:"psn_no"`
		} `json:"baseinfo"`
		Idetinfo []interface{} `json:"idetinfo"`
		Iinfo    []struct {
			Balc                   int64       `json:"balc"`
			CvlservFlag            string      `json:"cvlserv_flag"`
			EmpName                string      `json:"emp_name"`
			InsuplcAdmdvs          string      `json:"insuplc_admdvs"`
			Insutype               string      `json:"insutype"`
			PausInsuDansuplcAdmdvs string      `json:"paus_insu_dansuplc_admdvs"`
			PausInsuDate           interface{} `json:"paus_insu_date"`
			PsnInsuDate            string      `json:"psn_insu_date"`
			PsnInsuStas            string      `json:"psn_insu_stas"`
			PsnType                string      `json:"psn_type"`
		} `json:"insuinfo"`
	} `json:"output"`
	RefmsgTime  string      `json:"refmsg_time"`
	RespondTime string      `json:"respond_time"`
	Signtype    interface{} `json:"signtype"`
	WarnInfo    interface{} `json:"warn_info"`
}
type ResultThree struct {
	Cainfo      interface{} `json:"cainfo"`
	ErrMsg      interface{} `json:"err_msg"`
	InfRefmsgid string      `json:"inf_refmsgid"`
	Infcode     int64       `json:"infcode"`
	Output      struct {
		Data struct {
			IptOtpNo string `json:"ipt_otp_no"`
			MdtrtID  string `json:"mdtrt_id"`
			PsnNo    string `json:"psn_no"`
		} `json:"data"`
	} `json:"output"`
	RefmsgTime  string      `json:"refmsg_time"`
	RespondTime string      `json:"respond_time"`
	Signtype    interface{} `json:"signtype"`
	WarnMsg     interface{} `json:"warn_msg"`
}
type ResultFour struct {
	Cainfo      string `json:"cainfo"`
	ErrMsg      string `json:"err_msg"`
	InfRefmsgid string `json:"inf_refmsgid"`
	Infcode     int64  `json:"infcode"`
	Output      struct {
		Result []struct {
			BasMednFlag      string  `json:"bas_medn_flag"`
			ChldMedcFlag     string  `json:"chld_medc_flag"`
			ChrgitmLv        string  `json:"chrgitm_lv"`
			Cnt              float64 `json:"cnt"`
			DetItemFeeSumamt float64 `json:"det_item_fee_sumamt"`
			DrtReimFlag      string  `json:"drt_reim_flag"`
			FeedetlSn        string  `json:"feedetl_sn"`
			FulamtOwnpayAmt  float64 `json:"fulamt_ownpay_amt"`
			HiNegoDrugFlag   string  `json:"hi_nego_drug_flag"`
			InscpScpAmt      float64 `json:"inscp_scp_amt"`
			ListSpItemFlag   string  `json:"list_sp_item_flag"`
			LmtUsedFlag      string  `json:"lmt_used_flag"`
			MedChrgitmType   string  `json:"med_chrgitm_type"`
			Memo             string  `json:"memo"`
			OverlmtAmt       float64 `json:"overlmt_amt"`
			PreselfpayAmt    float64 `json:"preselfpay_amt"`
			Pric             float64 `json:"pric"`
			PricUplmtAmt     float64 `json:"pric_uplmt_amt"`
			SelfpayProp      float64 `json:"selfpay_prop"`
		} `json:"result"`
	} `json:"output"`
	RefmsgTime  string `json:"refmsg_time"`
	RespondTime string `json:"respond_time"`
	Signtype    string `json:"signtype"`
	WarnMsg     string `json:"warn_msg"`
}
type ResultFive struct {
	Insutype string `json:"insutype"`
}
type ResultSix struct {
	Cainfo      interface{} `json:"cainfo"`
	ErrMsg      interface{} `json:"err_msg"`
	InfRefmsgid string      `json:"inf_refmsgid"`
	Infcode     int64       `json:"infcode"`
	Output      struct {
	} `json:"output"`
	RefmsgTime  string      `json:"refmsg_time"`
	RespondTime string      `json:"respond_time"`
	Signtype    interface{} `json:"signtype"`
	WarnMsg     interface{} `json:"warn_msg"`
}
type ResultSeven struct {
	Cainfo      string `json:"cainfo"`
	ErrMsg      string `json:"err_msg"`
	InfRefmsgid string `json:"inf_refmsgid"`
	Infcode     int64  `json:"infcode"`
	Output      struct {
		Setldetail []interface{} `json:"setldetail"`
		Setlinfo   struct {
			AcctMulaidPay   float64 `json:"acct_mulaid_pay"`
			AcctPay         float64 `json:"acct_pay"`
			ActPayDedc      float64 `json:"act_pay_dedc"`
			Age             float64 `json:"age"`
			Balc            float64 `json:"balc"`
			Brdy            string  `json:"brdy"`
			Certno          string  `json:"certno"`
			ClrOptins       string  `json:"clr_optins"`
			ClrType         string  `json:"clr_type"`
			ClrWay          string  `json:"clr_way"`
			CvlservFlag     string  `json:"cvlserv_flag"`
			CvlservPay      float64 `json:"cvlserv_pay"`
			FulamtOwnpayAmt float64 `json:"fulamt_ownpay_amt"`
			FundPaySumamt   float64 `json:"fund_pay_sumamt"`
			Gend            string  `json:"gend"`
			HifesPay        float64 `json:"hifes_pay"`
			HifmiPay        float64 `json:"hifmi_pay"`
			HifobPay        float64 `json:"hifob_pay"`
			HifpPay         float64 `json:"hifp_pay"`
			HospPartAmt     float64 `json:"hosp_part_amt"`
			InscpScpAmt     float64 `json:"inscp_scp_amt"`
			Insutype        string  `json:"insutype"`
			MafPay          float64 `json:"maf_pay"`
			MdtrtCertType   string  `json:"mdtrt_cert_type"`
			MdtrtID         string  `json:"mdtrt_id"`
			MedType         string  `json:"med_type"`
			MedfeeSumamt    float64 `json:"medfee_sumamt"`
			MedinsSetlID    string  `json:"medins_setl_id"`
			Naty            string  `json:"naty"`
			OthPay          float64 `json:"oth_pay"`
			OverlmtSelfpay  float64 `json:"overlmt_selfpay"`
			PoolPropSelfpay float64 `json:"pool_prop_selfpay"`
			PreselfpayAmt   float64 `json:"preselfpay_amt"`
			PsnCashPay      float64 `json:"psn_cash_pay"`
			PsnCertType     string  `json:"psn_cert_type"`
			PsnName         string  `json:"psn_name"`
			PsnNo           string  `json:"psn_no"`
			PsnPartAmt      float64 `json:"psn_part_amt"`
			PsnType         string  `json:"psn_type"`
			SetlID          string  `json:"setl_id"`
			SetlTime        string  `json:"setl_time"`
		} `json:"setlinfo"`
	} `json:"output"`
	RefmsgTime  string      `json:"refmsg_time"`
	RespondTime string      `json:"respond_time"`
	Signtype    interface{} `json:"signtype"`
	WarnMsg     interface{} `json:"warn_msg"`
}
type Custom struct {
	DetItemFeeSumamt string
	Cut              string
	FeedetlSn        string
	Price            string
	MedListCodg      string
	Type             int64
	AdviceId         int64
	ProjectId        int64
	ItemId           int64
}

//获取个人信息----挂号-----上传就诊信息
func (c *HisApiController) GetRegisterInfo() {
	id, _ := c.GetInt64("id")
	record_time := c.GetString("record_time")

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

	theTime, err := time.ParseInLocation(timeLayout+" 15:04:05", record_time+" 00:00:00", loc)
	if err != nil {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}
	recordDateTime := theTime.Unix()

	adminInfo := c.GetAdminUserInfo()
	patient, _ := service.GetPatientByID(adminInfo.CurrentOrgId, id)
	patientPrescription, _ := service.FindPatientPrescriptionInfo(adminInfo.CurrentOrgId, id, recordDateTime)

	miConfig, _ := service.FindMedicalInsuranceInfo(adminInfo.CurrentOrgId)

	if patient == nil {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodePatientNoExist)
		return
	}
	if len(patient.IdCardNo) == 0 {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeIDCartNo)
		return
	}

	//org, _ := service.GetOrgById(adminInfo.CurrentOrgId)
	config, _ := service.GetMedicalInsuranceConfig(adminInfo.CurrentOrgId)

	if config.IsOpen == 1 {

		api := "http://127.0.0.1:9531/" + "gdyb/one?cert_no=" + patient.IdCardNo + "&org_name=" + miConfig.OrgName + "&doctor=" + patientPrescription.Doctor + "&fixmedins_code=" + miConfig.Code
		resp, requestErr := http.Get(api)

		if requestErr != nil {
			c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
			return
		}
		defer resp.Body.Close()
		body, ioErr := ioutil.ReadAll(resp.Body)
		if ioErr != nil {
			utils.ErrorLog("接口返回数据读取失败: %v", ioErr)
			c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
			return
		}
		var respJSON map[string]interface{}

		if err := json.Unmarshal([]byte(string(body)), &respJSON); err != nil {
			utils.ErrorLog("接口返回数据解析JSON失败: %v", err)
			c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
			return
		}

		userJSON := respJSON["data"].(map[string]interface{})["pre"].(map[string]interface{})
		userJSONBytes, _ := json.Marshal(userJSON)
		var res ResultTwo
		if err := json.Unmarshal(userJSONBytes, &res); err != nil {
			utils.ErrorLog("解析失败：%v", err)
			c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
			return
		}
		Iinfos, _ := json.Marshal(res.Output.Iinfo)
		Idetinfos, _ := json.Marshal(res.Output.Idetinfo)
		infoStr := string(Iinfos)
		idetinfoStr := string(Idetinfos)

		his := models.VMHisPatient{
			PsnNo:       res.Output.Baseinfo.PsnNo,
			PsnCertType: res.Output.Baseinfo.PsnCertType,
			Certno:      res.Output.Baseinfo.Certno,
			PsnName:     res.Output.Baseinfo.PsnName,
			Gend:        res.Output.Baseinfo.Gend,
			Naty:        res.Output.Baseinfo.Naty,
			Brdy:        res.Output.Baseinfo.Brdy,
			Age:         res.Output.Baseinfo.Age,
			Iinfo:       infoStr,
			Idetinfo:    idetinfoStr,
			PatientId:   patient.ID,
			RecordDate:  theTime.Unix(),
		}
		fmt.Println(his)

		if res.Output.Iinfo == nil || len(res.Output.Iinfo) == 0 {
			c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeRegisterOneException)
			return
		}

		timestamp := time.Now().Unix()
		tempTime := time.Unix(timestamp, 0)
		timeFormat := tempTime.Format("20060102150405")
		chrgBchno := rand.Intn(100000) + 10000
		ipt_otp_no := timeFormat + strconv.FormatInt(int64(chrgBchno), 10) + strconv.FormatInt(his.PatientId, 10)

		count, _ := service.FindHisRegisterRecord(theTime.Unix(), patient.ID, adminInfo.CurrentOrgId)

		department, _ := service.GetDepartMentDetail(patientPrescription.Departments)

		if count <= 0 {
			api := "http://127.0.0.1:9531/" + "gdyb/two?cert_no=" + patient.IdCardNo + "&insutype=" +
				res.Output.Iinfo[0].Insutype + "&psn_no=" + res.Output.Baseinfo.PsnNo +
				"&org_name=" + miConfig.OrgName + "&doctor=" + patientPrescription.Doctor + "&ipt_otp_no=" + ipt_otp_no +
				"&dept=" + department.Name + "&fixmedins_code=" + miConfig.Code
			resp, requestErr := http.Get(api)
			if requestErr != nil {
				c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
				return
			}
			defer resp.Body.Close()
			body, ioErr := ioutil.ReadAll(resp.Body)
			if ioErr != nil {
				utils.ErrorLog("接口返回数据读取失败: %v", ioErr)
				c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
				return
			}
			var respJSON map[string]interface{}
			if err := json.Unmarshal([]byte(string(body)), &respJSON); err != nil {
				utils.ErrorLog("接口返回数据解析JSON失败: %v", err)
				c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
				return
			}

			respJSON = respJSON["data"].(map[string]interface{})["pre"].(map[string]interface{})
			userJSONBytes, _ := json.Marshal(respJSON)
			var res ResultThree
			if err := json.Unmarshal(userJSONBytes, &res); err != nil {
				utils.ErrorLog("解析失败：%v", err)
				c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
				return
			}
			if res.Infcode == -1 {
				c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeRegisterTwoException)
				return
			}
			fmt.Println("000!!!!!!")
			fmt.Println(res)
			fmt.Println(res.Output.Data.MdtrtID)
			fmt.Println(res.Output.Data.PsnNo)
			fmt.Println(res.Output.Data.IptOtpNo)

			his.Number = res.Output.Data.MdtrtID
			his.PsnNo = res.Output.Data.PsnNo
			his.IptOtpNo = res.Output.Data.IptOtpNo
			his.IdCardNo = patient.IdCardNo
			his.PhoneNumber = patient.Phone
			his.UserOrgId = adminInfo.CurrentOrgId
			his.Status = 1
			his.Ctime = time.Now().Unix()
			his.Mtime = time.Now().Unix()
			err := service.CreateHisPatientTwo(&his)
			if err == nil {
				api := "http://127.0.0.1:9531/" + "gdyb/four?psn_no=" + his.PsnNo +
					"&mdtrt_id=" + his.Number + "&doctor=" + patientPrescription.Doctor + "&department=" + department.Name +
					"&diag=" + patientPrescription.Diagnosis + "&org_name=" + miConfig.OrgName + "&med_type=" + "11" + "&doctor_id=" + strconv.FormatInt(patientPrescription.DoctorId, 10) + "&fixmedins_code=" + miConfig.Code
				resp, requestErr := http.Get(api)
				if requestErr != nil {
					c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
					return
				}

				body, ioErr := ioutil.ReadAll(resp.Body)
				if ioErr != nil {
					utils.ErrorLog("接口返回数据读取失败: %v", ioErr)
					c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
					return
				}
				var respJSON map[string]interface{}
				if err := json.Unmarshal([]byte(string(body)), &respJSON); err != nil {
					utils.ErrorLog("接口返回数据解析JSON失败: %v", err)
					c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
					return
				}

				respJSON = respJSON["data"].(map[string]interface{})["pre"].(map[string]interface{})
				userJSONBytes, _ := json.Marshal(respJSON)
				fmt.Println(respJSON)
				fmt.Println(userJSONBytes)

				var res ResultSix
				if err := json.Unmarshal(userJSONBytes, &res); err != nil {
					utils.ErrorLog("解析失败：%v", err)
					c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
					return
				}
				if res.Infcode == -1 {
					c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeRegisterTwoException)
					return
				}

				c.ServeSuccessJSON(map[string]interface{}{
					"his_info": his,
				})
			} else {
				c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
				return
			}
		}

	} else {
		his, err := service.GetHisPatientInfo(adminInfo.CurrentOrgId, patient.ID, recordDateTime)
		if err == gorm.ErrRecordNotFound || his.ID == 0 {
			patient := models.XtHisPatient{
				Age:         patient.Age,
				Birthday:    patient.Birthday,
				AdminUserId: adminInfo.AdminUser.Id,
				IdCardNo:    patient.IdCardNo,
				Name:        patient.Name,
				Gender:      patient.Gender,
				UserOrgId:   adminInfo.CurrentOrgId,
				Status:      1,
				RecordDate:  recordDateTime,
				IsReturn:    1,
				PatientId:   patient.ID,
				Ctime:       time.Now().Unix(),
				Mtime:       time.Now().Unix(),
			}
			service.CreateHisPatient(&patient)
		}
		c.ServeSuccessJSON(map[string]interface{}{
			"his_info": patient,
		})

	}

}

//上传明细----结算
func (c *HisApiController) GetUploadInfo() {
	id, _ := c.GetInt64("id")
	record_time := c.GetString("record_time")
	timeLayout := "2006-01-02"
	loc, _ := time.LoadLocation("Local")

	theTime, err := time.ParseInLocation(timeLayout+" 15:04:05", record_time+" 00:00:00", loc)
	if err != nil {
		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}
	recordDateTime := theTime.Unix()
	adminUser := c.GetAdminUserInfo()
	prescriptions, _ := service.GetHisPrescription(adminUser.CurrentOrgId, id, recordDateTime)

	his, _ := service.GetVMHisPatientInfo(adminUser.CurrentOrgId, id, recordDateTime)

	timestamp := time.Now().Unix()
	tempTime := time.Unix(timestamp, 0)
	timeFormat := tempTime.Format("20060102150405")
	chrgBchno := rand.Intn(100000) + 10000
	chrg_bchno := timeFormat + strconv.FormatInt(int64(chrgBchno), 10) + strconv.FormatInt(his.PatientId, 10)
	miConfig, _ := service.FindMedicalInsuranceInfo(adminUser.CurrentOrgId)

	//org, _ := service.GetOrgById(adminUser.CurrentOrgId)
	patientPrescription, _ := service.FindPatientPrescriptionInfo(adminUser.CurrentOrgId, id, recordDateTime)

	client := &http.Client{}
	data := make(map[string]interface{})
	data["psn_no"] = his.PsnNo
	data["mdtrt_id"] = his.Number
	data["pre"] = prescriptions
	data["chrg_bchno"] = chrg_bchno
	data["org_name"] = miConfig.OrgName
	data["doctor"] = patientPrescription.Doctor
	data["dept"] = patientPrescription.Departments

	data["fixmedins_code"] = miConfig.Code

	var ids []int64
	//var idsTwo []int64
	//
	for _, item := range prescriptions {
		ids = append(ids, item.ID)
	}

	config, _ := service.GetMedicalInsuranceConfig(adminUser.CurrentOrgId)

	if config.IsOpen == 1 { //对接了医保，走医保流程
		bytesData, _ := json.Marshal(data)
		req, _ := http.NewRequest("POST", "http://127.0.0.1:9531/"+"gdyb/five", bytes.NewReader(bytesData))
		resp, _ := client.Do(req)
		defer resp.Body.Close()
		body, ioErr := ioutil.ReadAll(resp.Body)
		if ioErr != nil {
			utils.ErrorLog("接口返回数据读取失败: %v", ioErr)
			c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
			return
		}
		var respJSON map[string]interface{}
		if err := json.Unmarshal([]byte(body), &respJSON); err != nil {
			utils.ErrorLog("接口返回数据解析JSON失败: %v", err)
			c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
			return
		}

		respJSON = respJSON["data"].(map[string]interface{})["pre"].(map[string]interface{})
		userJSONBytes, _ := json.Marshal(respJSON)
		var res ResultFour
		if err := json.Unmarshal(userJSONBytes, &res); err != nil {
			utils.ErrorLog("解析失败：%v", err)
			c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
			return
		}

		if res.Infcode == 0 {
			order := &models.HisOrder{
				UserOrgId:          adminUser.CurrentOrgId,
				HisPatientId:       his.ID,
				PatientId:          his.PatientId,
				SettleAccountsDate: recordDateTime,
				Ctime:              time.Now().Unix(),
				Mtime:              time.Now().Unix(),
				Status:             1,
				Number:             chrg_bchno,
				Infcode:            res.Infcode,
				WarnMsg:            res.WarnMsg,
				Cainfo:             res.Cainfo,
				ErrMsg:             res.ErrMsg,
				RespondTime:        res.RefmsgTime,
				InfRefmsgid:        res.InfRefmsgid,
				OrderStatus:        1,
			}
			err = service.CreateOrder(order)
			if err != nil {
				c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeCreateOrderException)
				return
			}

			for _, item := range res.Output.Result {
				temp := strings.Split(item.FeedetlSn, "-")
				var advice_id int64 = 0
				var project_id int64 = 0
				var types int64 = 0

				id, _ := strconv.ParseInt(temp[2], 10, 64)
				types, _ = strconv.ParseInt(temp[1], 10, 64)

				if temp[1] == "1" {
					advice_id = id
					project_id = 0
				} else if temp[1] == "2" {
					advice_id = 0
					project_id = id
				}

				info := &models.HisOrderInfo{
					OrderNumber:      order.Number,
					FeedetlSn:        item.FeedetlSn,
					UploadDate:       time.Now().Unix(),
					AdviceId:         advice_id,
					DetItemFeeSumamt: item.DetItemFeeSumamt,
					Cnt:              item.Cnt,
					Pric:             float64(item.Pric),
					PatientId:        his.PatientId,
					PricUplmtAmt:     item.PricUplmtAmt,
					SelfpayProp:      item.SelfpayProp,
					FulamtOwnpayAmt:  item.FulamtOwnpayAmt,
					OverlmtAmt:       item.OverlmtAmt,
					PreselfpayAmt:    item.PreselfpayAmt,
					BasMednFlag:      item.BasMednFlag,
					MedChrgitmType:   item.MedChrgitmType,
					HiNegoDrugFlag:   item.HiNegoDrugFlag,
					Status:           1,
					Memo:             item.Memo,
					Mtime:            time.Now().Unix(),
					InscpScpAmt:      item.InscpScpAmt,
					DrtReimFlag:      item.DrtReimFlag,
					Ctime:            time.Now().Unix(),
					ListSpItemFlag:   item.ListSpItemFlag,
					ChldMedcFlag:     item.ChldMedcFlag,
					LmtUsedFlag:      item.LmtUsedFlag,
					ChrgitmLv:        item.ChrgitmLv,
					UserOrgId:        adminUser.CurrentOrgId,
					HisPatientId:     his.ID,
					OrderId:          order.ID,
					ProjectId:        project_id,
					Type:             types,
				}
				service.CreateOrderInfo(info)
			}
			service.UpDatePrescriptionNumber(adminUser.CurrentOrgId, ids, chrg_bchno)
			service.UpDatePrescriptionInfoNumber(adminUser.CurrentOrgId, patientPrescription.PatientId, chrg_bchno, recordDateTime)
			var total float64
			for _, item := range prescriptions {
				if item.Type == 1 { //药品
					for _, subItem := range item.HisDoctorAdviceInfo {
						total = total + (subItem.Price * subItem.PrescribingNumber)
					}
				}
				if item.Type == 2 { //项目
					for _, subItem := range item.HisPrescriptionProject {
						total = total + (subItem.Price * float64(subItem.Count))
					}
				}
			}
			org, _ := service.GetOrgById(adminUser.CurrentOrgId)
			patientPrescription, _ := service.FindPatientPrescriptionInfo(adminUser.CurrentOrgId, id, recordDateTime)
			allTotal := fmt.Sprintf("%.2f", total)
			if res.Infcode == 0 {
				var rf []*ResultFive
				json.Unmarshal([]byte(his.Iinfo), &rf)
				psn_no := his.PsnNo
				mdtrt_id := his.Number
				chrg_bchno := chrg_bchno
				cert_no := his.Certno
				insutype := rf[0].Insutype
				api := "http://127.0.0.1:9531/" + "gdyb/eight?cert_no=" + cert_no + "&insutype=" +
					insutype + "&psn_no=" + psn_no + "&chrg_bchno=" + chrg_bchno + "&mdtrt_id=" + mdtrt_id +
					"&total=" + allTotal + "&org_name=" + org.OrgName + "&doctor=" + patientPrescription.Doctor + "&fixmedins_code=" + miConfig.Code
				resp, requestErr := http.Get(api)

				if requestErr != nil {
					c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
					return
				}
				defer resp.Body.Close()
				body, ioErr := ioutil.ReadAll(resp.Body)
				if ioErr != nil {
					utils.ErrorLog("接口返回数据读取失败: %v", ioErr)
					c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
					return
				}
				var respJSON map[string]interface{}
				if err := json.Unmarshal([]byte(string(body)), &respJSON); err != nil {
					utils.ErrorLog("接口返回数据解析JSON失败: %v", err)
					c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
					return
				}
				fmt.Println(respJSON)
				respJSON = respJSON["data"].(map[string]interface{})["pre"].(map[string]interface{})
				userJSONBytes, _ := json.Marshal(respJSON)
				var res ResultSeven
				if err := json.Unmarshal(userJSONBytes, &res); err != nil {
					utils.ErrorLog("解析失败：%v", err)
					c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
					return
				}
				if res.Infcode == -1 {
					errlog := &models.HisOrderError{
						UserOrgId:  adminUser.CurrentOrgId,
						Ctime:      time.Now().Unix(),
						Mtime:      time.Now().Unix(),
						Number:     chrg_bchno,
						ErrMsg:     res.ErrMsg,
						Status:     1,
						PatientId:  id,
						RecordTime: recordDateTime,
						Stage:      7,
					}

					service.CreateErrMsgLog(errlog)

				} else {
					order, _ := service.GetHisOrderTwo(adminUser.CurrentOrgId, chrg_bchno, id)
					order.OrderStatus = 2
					order.MdtrtId = res.Output.Setlinfo.MdtrtID
					order.SetlId = res.Output.Setlinfo.SetlID
					order.PsnNo = res.Output.Setlinfo.PsnNo
					order.PsnName = res.Output.Setlinfo.PsnName
					order.PsnCertType = res.Output.Setlinfo.PsnCertType
					order.Certno = res.Output.Setlinfo.Certno
					order.Gend = res.Output.Setlinfo.Gend
					order.Naty = res.Output.Setlinfo.Naty
					order.Age = res.Output.Setlinfo.Age
					order.Insutype = res.Output.Setlinfo.Insutype
					order.PsnType = res.Output.Setlinfo.PsnType
					order.CvlservFlag = res.Output.Setlinfo.CvlservFlag
					order.SetlTime = res.Output.Setlinfo.SetlTime
					order.MdtrtCertType = res.Output.Setlinfo.MdtrtCertType
					order.MedType = res.Output.Setlinfo.MedType
					order.MedfeeSumamt = res.Output.Setlinfo.MedfeeSumamt
					order.FulamtOwnpayAmt = res.Output.Setlinfo.FulamtOwnpayAmt
					order.OverlmtSelfPay = res.Output.Setlinfo.OverlmtSelfpay
					order.PreselfpayAmt = res.Output.Setlinfo.PreselfpayAmt
					order.InscpScpAmt = res.Output.Setlinfo.InscpScpAmt
					order.ActPayDedc = res.Output.Setlinfo.ActPayDedc
					order.HifpPay = res.Output.Setlinfo.HifpPay
					order.CvlservPay = res.Output.Setlinfo.CvlservPay
					order.PoolPropSelfpay = res.Output.Setlinfo.PoolPropSelfpay
					order.HifesPay = res.Output.Setlinfo.HifesPay
					order.HifobPay = res.Output.Setlinfo.HifobPay
					order.MafPay = res.Output.Setlinfo.MafPay
					order.OthPay = res.Output.Setlinfo.OthPay
					order.FundPaySumamt = res.Output.Setlinfo.FundPaySumamt
					order.PsnPartAmt = res.Output.Setlinfo.PsnPartAmt
					order.AcctPay = res.Output.Setlinfo.AcctPay
					order.PsnCashPay = res.Output.Setlinfo.PsnCashPay
					order.HospPartAmt = res.Output.Setlinfo.HospPartAmt
					order.Balc = res.Output.Setlinfo.Balc
					order.AcctMulaidPay = res.Output.Setlinfo.AcctMulaidPay
					order.MedinsSetlId = res.Output.Setlinfo.MedinsSetlID
					order.ClrOptins = res.Output.Setlinfo.ClrOptins
					order.ClrWay = res.Output.Setlinfo.ClrWay
					setlDetail, _ := json.Marshal(res.Output.Setldetail)
					detailStr := string(setlDetail)
					order.SetlDetail = detailStr
					err := service.UpdataOrderStatusTwo(chrg_bchno, adminUser.CurrentOrgId)
					err = service.UpDateOrder(order)
					if err == nil {
						c.ServeSuccessJSON(map[string]interface{}{
							"msg": "结算成功",
						})
					}
				}
			} else {

			}

		} else {

		}

	} else {
		var total float64
		for _, item := range prescriptions {
			if item.Type == 1 { //药品
				for _, subItem := range item.HisDoctorAdviceInfo {
					total = total + (subItem.Price * subItem.PrescribingNumber)
				}
			}
			if item.Type == 2 { //项目
				for _, subItem := range item.HisPrescriptionProject {
					total = total + (subItem.Price * float64(subItem.Count))
				}
			}

			for _, subItem := range item.HisAdditionalCharge {
				total = total + (subItem.Price * float64(subItem.Count))
			}
		}

		allTotal := fmt.Sprintf("%.2f", total)
		totals, _ := strconv.ParseFloat(allTotal, 64)
		order := &models.HisOrder{
			UserOrgId:          adminUser.CurrentOrgId,
			HisPatientId:       his.ID,
			PatientId:          id,
			SettleAccountsDate: recordDateTime,
			Ctime:              time.Now().Unix(),
			Mtime:              time.Now().Unix(),
			Status:             1,
			OrderStatus:        2,
			Number:             chrg_bchno,
			MedfeeSumamt:       totals,
		}
		err = service.CreateOrder(order)
		if err != nil {
			c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeCreateOrderException)
			return
		}

		var customs []*Custom
		for _, item := range prescriptions {

			if item.Type == 1 { //药品
				for _, subItem := range item.HisDoctorAdviceInfo {
					cus := &Custom{
						AdviceId:         subItem.ID,
						ProjectId:        0,
						DetItemFeeSumamt: fmt.Sprintf("%.2f", subItem.Price*subItem.PrescribingNumber),
						Cut:              fmt.Sprintf("%.2f", subItem.PrescribingNumber),
						FeedetlSn:        subItem.FeedetlSn,
						Price:            fmt.Sprintf("%.2f", subItem.Price),
						MedListCodg:      subItem.MedListCodg,
						Type:             1,
					}
					customs = append(customs, cus)
				}
			}

			if item.Type == 2 { //项目
				for _, subItem := range item.HisPrescriptionProject {

					cus := &Custom{
						AdviceId:         0,
						ProjectId:        subItem.ID,
						DetItemFeeSumamt: fmt.Sprintf("%.2f", subItem.Price*float64(subItem.Count)),
						Cut:              fmt.Sprintf("%.2f", float64(subItem.Count)),
						FeedetlSn:        subItem.FeedetlSn,
						Price:            fmt.Sprintf("%.2f", float64(subItem.Price)),
						MedListCodg:      subItem.MedListCodg,
						Type:             2,
					}

					customs = append(customs, cus)
				}
			}

			for _, item := range item.HisAdditionalCharge {
				cus := &Custom{
					ItemId:           item.ID,
					AdviceId:         0,
					ProjectId:        0,
					DetItemFeeSumamt: fmt.Sprintf("%.2f", item.Price),
					Cut:              fmt.Sprintf("%.2f", float64(item.Count)),
					FeedetlSn:        item.FeedetlSn,
					Price:            fmt.Sprintf("%.2f", float64(item.Price)),
					MedListCodg:      item.XtHisAddtionConfig.Code,
					Type:             3,
				}

				customs = append(customs, cus)
			}

		}

		for _, item := range customs {
			var advice_id int64 = 0
			var project_id int64 = 0
			var item_id int64 = 0

			var types int64 = 0

			if item.Type == 1 {
				advice_id = item.AdviceId
				project_id = 0
				item_id = 0
			} else if item.Type == 2 {
				advice_id = 0
				item_id = 0

				project_id = item.ProjectId
			} else if item.Type == 3 {
				advice_id = 0
				item_id = item.ItemId
				project_id = 0
			}

			detItemFeeSumamt, _ := strconv.ParseFloat(item.DetItemFeeSumamt, 32)
			cut, _ := strconv.ParseFloat(item.Cut, 32)
			pric, _ := strconv.ParseFloat(item.Price, 32)

			info := &models.HisOrderInfo{
				OrderNumber:      order.Number,
				UploadDate:       time.Now().Unix(),
				AdviceId:         advice_id,
				DetItemFeeSumamt: detItemFeeSumamt,
				Cnt:              cut,
				Pric:             pric,
				PatientId:        id,
				Status:           1,
				Mtime:            time.Now().Unix(),
				Ctime:            time.Now().Unix(),
				UserOrgId:        adminUser.CurrentOrgId,
				HisPatientId:     his.ID,
				OrderId:          order.ID,
				ProjectId:        project_id,
				Type:             types,
				ItemId:           item_id,
			}
			service.CreateOrderInfo(info)
		}
		//err := service.UpDateAddtionNumber(adminUser.CurrentOrgId, ids, chrg_bchno)
		err = service.UpDatePrescriptionNumber(adminUser.CurrentOrgId, ids, chrg_bchno)
		err = service.UpDatePrescriptionInfoNumber(adminUser.CurrentOrgId, id, chrg_bchno, recordDateTime)
		err = service.UpdataOrderStatusTwo(chrg_bchno, adminUser.CurrentOrgId)
		if err == nil {
			c.ServeSuccessJSON(map[string]interface{}{
				"msg": "结算成功",
			})
		}
	}
}

//退款
func (c *HisApiController) Refund() {
	order_id, _ := c.GetInt64("order_id")
	number := c.GetString("number")

	adminUser := c.GetAdminUserInfo()
	config, _ := service.GetMedicalInsuranceConfig(adminUser.CurrentOrgId)
	if config.IsOpen == 1 { //对接了医保，走医保流程

	} else {
		err := service.UpdataOrderStatus(order_id, number, adminUser.CurrentOrgId)
		if err == nil {
			c.ServeSuccessJSON(map[string]interface{}{
				"msg": "退费成功",
			})
		} else {
			c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
			return
		}

	}

}

func (this *HisApiController) AdditionalCharge() {

	dataBody := make(map[string]interface{}, 0)
	err := json.Unmarshal(this.Ctx.Input.RequestBody, &dataBody)
	fmt.Println(err)
	his_patient_id := int64(dataBody["his_patient_id"].(float64))
	patient_id := int64(dataBody["patient_id"].(float64))
	medicineData, _ := dataBody["medicineData"].([]interface{})
	adminUserInfo := this.GetAdminUserInfo()
	orgId := adminUserInfo.CurrentOrgId
	admin_user_id := adminUserInfo.AdminUser.Id
	timeStr := time.Now().Format("2006-01-02")
	timeLayout := "2006-01-02 15:04:05"
	timeStringToTime, _ := utils.ParseTimeStringToTime(timeLayout, timeStr+" 00:00:00")
	timenow := timeStringToTime.Unix()
	var additionalCharges []*models.HisAdditionalCharge
	for _, item := range medicineData {

		var randNum int
		randNum = rand.Intn(10000) + 1000
		timestamp := time.Now().Unix()
		tempTime := time.Unix(timestamp, 0)
		timeFormat := tempTime.Format("20060102150405")
		p_number := timeFormat + strconv.FormatInt(int64(randNum), 10) + strconv.FormatInt(int64(adminUserInfo.CurrentOrgId), 10) + strconv.FormatInt(int64(patient_id), 10)

		items := item.(map[string]interface{})
		money := items["price"].(string)
		item_id_str := items["item_id"].(string)
		name := items["name"].(string)
		id_str := items["id"].(string)
		moneys, _ := strconv.ParseInt(money, 10, 64)
		monStr := strconv.FormatInt(moneys, 10)
		monneyStr, _ := strconv.ParseFloat(monStr, 64)
		item_id, _ := strconv.ParseInt(item_id_str, 10, 64)
		id, _ := strconv.ParseInt(id_str, 10, 64)
		additionalCharge := &models.HisAdditionalCharge{
			ID:                 id,
			HisPatientId:       his_patient_id,
			UserOrgId:          orgId,
			PatientId:          patient_id,
			RecordDate:         timenow,
			Price:              monneyStr,
			Status:             1,
			ItemName:           name,
			ItemId:             item_id,
			AdminUserId:        admin_user_id,
			CreatedTime:        time.Now().Unix(),
			OrderStatus:        0,
			PrescriptionNumber: "",
			BatchNumber:        "",
			FeedetlSn:          p_number,
		}
		service.CreateAdditionalCharge(additionalCharge)

		additionalCharges = append(additionalCharges, additionalCharge)
	}

	this.ServeSuccessJSON(map[string]interface{}{
		"msg":                "添加成功",
		"additional_charges": additionalCharges,
	})
}

func (this *HisApiController) DeleteAddition() {
	id, _ := this.GetInt64("id")
	//TODO 需要判断是否已经结算
	err := service.DelelteAddition(id, this.GetAdminUserInfo().CurrentOrgId)
	if err == nil {
		this.ServeSuccessJSON(map[string]interface{}{
			"msg": "删除成功",
		})
		return
	} else {
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeSystemError)
		return
	}

}

func (this *HisApiController) GetAdminUsers() {
	adminUser := this.GetAdminUserInfo()
	doctors, _ := service.GetAllHisDoctor(adminUser.CurrentOrgId)
	this.ServeSuccessJSON(map[string]interface{}{
		"doctors": doctors,
	})
}
