package controllers

import (
	"XT_New/enums"
	"XT_New/models"
	"XT_New/service"
	"XT_New/utils"
	"encoding/json"
	"fmt"
	"github.com/astaxie/beego"
	"github.com/shopspring/decimal"
	"strconv"
	"strings"
	"time"
)

type HisDepositApiController struct {
	BaseAuthAPIController
}

func HisDepositApiRegistRouters() {
	//beego.Router("/api/his/ttt", &HisDepositApiController{}, "get:TTT")                         //测试接口
	beego.Router("/api/his/gethisusertoalive", &HisDepositApiController{}, "get:GetHisUserToAlive")  //获取病例中心，有效患者名称（去除了转出和死亡的）
	beego.Router("/api/his/gethisuser", &HisDepositApiController{}, "get:GetHisUser")                //获取病例中心，有效患者名称
	beego.Router("/api/his/adddeposit", &HisDepositApiController{}, "post:AddDeposit")               //新增押金
	beego.Router("/api/his/getdepositcode", &HisDepositApiController{}, "get:GetDepositCode")        //获取新增押金编号
	beego.Router("/api/his/getdeletecode", &HisDepositApiController{}, "get:GetDeleteCode")          //获取退款编号
	beego.Router("/api/his/rechargedetails", &HisDepositApiController{}, "get:RechargeDetails")      //充值明细列表
	beego.Router("/api/his/updeposit", &HisDepositApiController{}, "get:UpDeposit")                  //押金审核
	beego.Router("/api/his/deletehistory", &HisDepositApiController{}, "get:DeleteHistory")          //押金删除
	beego.Router("/api/his/rechargesummary", &HisDepositApiController{}, "get:RechargeSummary")      //充值汇总列表
	beego.Router("/api/his/getuserlist", &HisDepositApiController{}, "get:GetUserList")              //获取患者押金列表
	beego.Router("/api/his/depositflow", &HisDepositApiController{}, "get:DepositFlow")              //根据患者id获取押金流水
	beego.Router("/api/his/deductiondetails", &HisDepositApiController{}, "get:DeductionDetails")    //扣费明细查询
	beego.Router("/api/his/desummary", &HisDepositApiController{}, "get:DeSummary")                  //扣费汇总
	beego.Router("/api/his/idtobalance", &HisDepositApiController{}, "get:IdToBalance")              //根据患者id查询患者的余额
	beego.Router("/api/his/refundapplication", &HisDepositApiController{}, "post:RefundApplication") //新增一条退款申请
	beego.Router("/api/his/refundreview", &HisDepositApiController{}, "get:RefundReview")            //退款审核通过/拒绝
	beego.Router("/api/his/deleterefund", &HisDepositApiController{}, "get:DeleteRefund")            //退款删除
	beego.Router("/api/his/changerefund", &HisDepositApiController{}, "post:ChangeRefund")           //更改退款申请
	beego.Router("/api/his/refundlist", &HisDepositApiController{}, "get:RefundList")                //退款分页
	beego.Router("/api/his/getorgname", &HisDepositApiController{}, "get:GetorgName")                //获取供应商名字
	beego.Router("/api/his/getweektime", &HisDepositApiController{}, "get:GetWeekTime")              //获取本周时间
	beego.Router("/api/his/getmonthtime", &HisDepositApiController{}, "get:GetMonthTime")            //获取本月时间
}

//func (this *HisDepositApiController) TTT() {
//	orgid := this.GetAdminUserInfo().CurrentOrgId
//	id, _ := this.GetInt64("id")
//	code := this.GetString("code")
//	deposit,_ := this.GetInt64("depostit")
//	err := service.MoneyIncrease(orgid,id,code,deposit)
//	if err != nil {
//
//	}
//	this.ServeSuccessJSON(map[string]interface{}{
//		"list": "成功",
//	})
//	return
//}

//获取病例中心，有效患者名称（去除了转出和死亡的）
func (this *HisDepositApiController) GetHisUserToAlive() {
	orgid := this.GetAdminUserInfo().CurrentOrgId
	list, err := service.GetHisUserToAlive(orgid)
	if err != nil {
		this.ServeFailJsonSend(enums.ErrorCodeParamWrong, err.Error())
		return
	}
	this.ServeSuccessJSON(map[string]interface{}{
		"list": list,
	})
	return
}

//获取病例中心，有效患者名称
func (this *HisDepositApiController) GetHisUser() {
	orgid := this.GetAdminUserInfo().CurrentOrgId
	token := this.Ctx.Request.Header.Get("Cookie")
	fmt.Println(token)
	list, err := service.GetHisUser(orgid)
	if err != nil {
		this.ServeFailJsonSend(enums.ErrorCodeParamWrong, err.Error())
		return
	}
	this.ServeSuccessJSON(map[string]interface{}{
		"list": list,
	})
	return
}

//新增押金
func (this *HisDepositApiController) AddDeposit() {
	orgid := this.GetAdminUserInfo().CurrentOrgId
	dataBody := make(map[string]interface{}, 0)
	err := json.Unmarshal(this.Ctx.Input.RequestBody, &dataBody)
	if err != nil {
		utils.ErrorLog(err.Error())
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}
	switch {
	case dataBody["code"] == nil:
		this.ServeFailJsonSend(enums.ErrorCodeParamWrong, "押金编号不能为空")
		return
	case dataBody["his_patient_id"] == nil || dataBody["his_patient_id"] == "":
		this.ServeFailJsonSend(enums.ErrorCodeParamWrong, "患者名称不能为空")
		return
	case dataBody["deposit"] == nil || dataBody["deposit"] == "":
		this.ServeFailJsonSend(enums.ErrorCodeParamWrong, "押金金额不能为空")
		return
	case dataBody["trial_status"] == nil || dataBody["trial_status"] == "":
		this.ServeFailJsonSend(enums.ErrorCodeParamWrong, "审核状态不能为空")
		return
	}
	code := dataBody["code"].(string)                             //押金编号
	his_patient_id := int64(dataBody["his_patient_id"].(float64)) //患者编号
	var tmps float64
	switch dataBody["deposit"].(type) {
	case string:
		t_deposit := dataBody["deposit"].(string)
		if len(t_deposit) > 0 {
			if t_deposit[0] == 45 {
				this.ServeFailJsonSend(enums.ErrorCodeParamWrong, "押金金额错误")
				return
			}
		}
		tt, errs := strconv.ParseFloat(t_deposit, 64)
		if errs != nil {
			this.ServeFailJsonSend(enums.ErrorCodeParamWrong, "押金金额错误")
			return
		} else {
			tmps = tt
		}
	default:
		tmps = dataBody["deposit"].(float64)
	}
	if tmps == 0 {
		this.ServeFailJsonSend(enums.ErrorCodeParamWrong, "押金金额不能为0")
		return
	}
	deposit := decimal.NewFromFloat(tmps) //押金金额
	var remarks string
	if dataBody["remarks"] == nil {
		remarks = ""
	} else {
		remarks = dataBody["remarks"].(string) //备注
	}
	trial_status := int64(dataBody["trial_status"].(float64)) //审核状态
	createid := this.GetAdminUserInfo().AdminUser.Id
	pp := this.GetAdminUserInfo()
	fmt.Println(pp)
	err = service.UpDeposit(code, remarks, his_patient_id, orgid, trial_status, createid, deposit)
	if err != nil {
		utils.ErrorLog(err.Error())
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}
	this.ServeSuccessJSON(map[string]interface{}{
		"list": "添加成功",
	})
	return
}

//获取新增押金编号
func (this *HisDepositApiController) GetDepositCode() {
	orgid := this.GetAdminUserInfo().CurrentOrgId
	var code string
	for a := true; a == true; {
		code = service.CreateCPCode("CP")
		tmp := service.FindDecimalCode(orgid, code)
		if tmp == false {
			a = false
		}
	}
	this.ServeSuccessJSON(map[string]interface{}{
		"list": code,
	})
	return
}

//获取退款编号
func (this *HisDepositApiController) GetDeleteCode() {
	orgid := this.GetAdminUserInfo().CurrentOrgId
	var code string
	for a := true; a == true; {
		code = service.CreateCPCode("AF")
		tmp := service.FindDecimalCode(orgid, code)
		if tmp == false {
			a = false
		}
	}
	this.ServeSuccessJSON(map[string]interface{}{
		"list": code,
	})
	return
}

//充值明细列表
func (this *HisDepositApiController) RechargeDetails() {
	orgid := this.GetAdminUserInfo().CurrentOrgId
	timeLayout := "2006-01-02"
	loc, _ := time.LoadLocation("Local")
	keyword := this.GetString("keyword")
	start_time := this.GetString("start_time")
	end_time := this.GetString("end_time")
	var stime int64 //开始时间
	var etime int64 //结束时间

	namemap := make(map[int64]string)
	slicekey := make([]int64, 0)
	lists, _ := service.GetHisUser(orgid)
	for _, v := range lists {
		namemap[v.ID] = v.Name
	}
	if len(keyword) > 0 {
		for k, v := range namemap {
			res := strings.Contains(v, keyword)
			if res == true {
				slicekey = append(slicekey, k)
			}
		}
	}
	if start_time == "" && end_time == "" {
		//如果为空查询全部的
		_, etime = service.GetMondayOfWeek()
		stime = 0
	} else {
		stmp, _ := time.ParseInLocation(timeLayout+" 15:04:05", start_time+" 00:00:00", loc)
		etmp, _ := time.ParseInLocation(timeLayout+" 15:04:05", end_time+" 23:59:59", loc)
		stime = stmp.Unix()
		etime = etmp.Unix()
	}
	list, err := service.DetailsList(orgid, stime, etime, keyword, slicekey)
	if err != nil {
		utils.ErrorLog(err.Error())
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}
	var sum decimal.Decimal
	for i := 0; i < len(list); i++ {
		if list[i].TrialStatus == 1 {
			sum = sum.Add(list[i].Deposit)
		}
		list[i].Name = service.GetCreateidName(list[i].CreateId, orgid)
		list[i].HisName = namemap[list[i].HisPatientId]
		list[i].Starttime = fmt.Sprintf(time.Unix(list[i].Ctime, 0).Format("2006-01-02"))
	}
	this.ServeSuccessJSON(map[string]interface{}{
		"list": list,
		"sum":  sum,
	})
	return
}

//充值汇总列表
func (this *HisDepositApiController) RechargeSummary() {
	orgid := this.GetAdminUserInfo().CurrentOrgId
	timeLayout := "2006-01-02"
	loc, _ := time.LoadLocation("Local")
	keyword := this.GetString("keyword")
	start_time := this.GetString("start_time")
	end_time := this.GetString("end_time")
	var stime int64 //开始时间
	var etime int64 //结束时间
	namemap := make(map[int64]string)
	slicekey := make([]int64, 0)
	lists, _ := service.GetHisUser(orgid)
	for _, v := range lists {
		namemap[v.ID] = v.Name
	}
	if len(keyword) > 0 {
		for k, v := range namemap {
			res := strings.Contains(v, keyword)
			if res == true {
				slicekey = append(slicekey, k)
			}
		}
	}
	if start_time == "" && end_time == "" {
		_, etime = service.GetMondayOfWeek()
		stime = 0
	} else {
		stmp, _ := time.ParseInLocation(timeLayout+" 15:04:05", start_time+" 00:00:00", loc)
		etmp, _ := time.ParseInLocation(timeLayout+" 15:04:05", end_time+" 23:59:59", loc)
		stime = stmp.Unix()
		etime = etmp.Unix()
	}
	list, err := service.SummaryList(orgid, stime, etime, keyword, slicekey)
	if err != nil {
		utils.ErrorLog(err.Error())
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}
	//list为详细数据，把list整理合并为maplist输出
	maplist := make(map[int64]models.Summary)
	Finlist := []models.Summary{}
	tmpslice := make([]int64, 0)
	var sum decimal.Decimal
	for i := 0; i < len(list); i++ {
		if list[i].TrialStatus == 1 {
			if k, ok := maplist[list[i].HisPatientId]; ok {
				k.SumDecimal = k.SumDecimal.Add(list[i].Deposit)
				maplist[list[i].HisPatientId] = models.Summary{
					namemap[list[i].HisPatientId],
					k.SumDecimal,
					service.GetUserMoney(list[i].HisPatientId, orgid),
				}
			} else {
				maplist[list[i].HisPatientId] = models.Summary{
					namemap[list[i].HisPatientId],
					list[i].Deposit,
					service.GetUserMoney(list[i].HisPatientId, orgid),
				}
				tmpslice = append(tmpslice, list[i].HisPatientId)
			}
			sum = sum.Add(list[i].Deposit)
		}
	}
	//maplist虽然满足接口要求，但格式不行，整理为Finlist输出
	for i := 0; i < len(tmpslice); i++ {
		Finlist = append(Finlist, maplist[tmpslice[i]])
	}
	this.ServeSuccessJSON(map[string]interface{}{
		"list": Finlist,
		"sum":  sum,
	})
	return
}

//审核
func (this *HisDepositApiController) UpDeposit() {
	id, _ := this.GetInt64("id", 0)
	if id == 0 {
		this.ServeFailJsonSend(enums.ErrorCodeParamWrong, "id不能为空")
		return
	}
	tmp, err := service.GetDecimalHistoryOne(id)
	if err != nil {
		utils.ErrorLog("无法查询该记录信息", err.Error())
		this.ServeFailJsonSend(enums.ErrorCodeParamWrong, "无法查询该记录信息")
		return
	}
	if tmp.TrialStatus == 0 {
		err = service.UpDecimalHistory(id)
		if err != nil {
			utils.ErrorLog("更新押金历史表出错，原因为：", err.Error())
			this.ServeFailJsonSend(enums.ErrorCodeParamWrong, "系统错误")
			return
		}
	} else {
		this.ServeFailJsonSend(enums.ErrorCodeParamWrong, "当前状态不可审核")
		return
	}
	this.ServeSuccessJSON(map[string]interface{}{
		"list": "审核通过",
	})
	return
}
func (this *HisDepositApiController) DeleteHistory() {
	id, _ := this.GetInt64("id", 0)
	if id == 0 {
		this.ServeFailJsonSend(enums.ErrorCodeParamWrong, "id不能为空")
		return
	}
	tmp, err := service.GetDecimalHistoryOne(id)
	if err != nil {
		utils.ErrorLog("无法查询该记录信息", err.Error())
		this.ServeFailJsonSend(enums.ErrorCodeParamWrong, "无法查询该记录信息")
		return
	}
	if tmp.TrialStatus == 0 {
		err = service.DelDecimalHistory(id)
		if err != nil {
			utils.ErrorLog("删除历史记录出错，原因为：", err.Error())
			this.ServeFailJsonSend(enums.ErrorCodeParamWrong, "系统错误")
			return
		}
	} else {
		this.ServeFailJsonSend(enums.ErrorCodeParamWrong, "已审核的单据不能进行删除操作")
		return
	}
	this.ServeSuccessJSON(map[string]interface{}{
		"list": "删除成功",
	})
	return
}

//根据id获取押金流水
func (this *HisDepositApiController) DepositFlow() {
	orgid := this.GetAdminUserInfo().CurrentOrgId
	check := map[string][]string{
		"id":             {"must", "int", "id"},
		"deposit_status": {"must", "int", "deposit_status"},
		"page":           {"must", "string", "page"},
		"limit":          {"must", "string", "limit"},
	}
	_, err := checks(this, &check)
	if err != nil {
		this.ServeFailJsonSend(enums.ErrorCodeParamWrong, err.Error())
		return
	}
	id, _ := this.GetInt64("id") //患者id
	//获取当前患者的姓名
	tmp, _ := service.GetHisUserName(orgid, id)
	name := tmp.Name
	deposit_status, _ := this.GetInt64("deposit_status", 0) //押金类型
	if deposit_status > 4 {
		utils.ErrorLog("押金类型错误,deposit_status:", deposit_status)
		this.ServeFailJsonSend(enums.ErrorCodeParamWrong, "押金类型错误")
		return
	}
	start_time := this.GetString("start_time", "") //开始时间
	end_time := this.GetString("end_time", "")     //结束时间
	page, _ := this.GetInt64("page")               //页码
	limit, _ := this.GetInt64("limit")             //每一页查出来的条数
	timeLayout := "2006-01-02"
	loc, _ := time.LoadLocation("Local")
	var stime int64 //开始时间
	var etime int64 //结束时间
	if start_time == "" && end_time == "" {
		//如果为空则查全部的
		_, etime = service.GetMonth()
		stime = 0
	} else {
		stmp, _ := time.ParseInLocation(timeLayout+" 15:04:05", start_time+" 00:00:00", loc)
		etmp, _ := time.ParseInLocation(timeLayout+" 15:04:05", end_time+" 23:59:59", loc)
		stime = stmp.Unix()
		etime = etmp.Unix()
	}
	//获取该角色当前时间段的余额
	decimal := service.GetMoneyforTime(id, orgid, etime)
	//获取列表
	deposirhistory, total, errs := service.GetFlowList(page, limit, id, orgid, stime, etime, deposit_status)
	if errs != nil {
		utils.ErrorLog("获取列表失败，原因为:", errs.Error())
		this.ServeFailJsonSend(enums.ErrorCodeParamWrong, errs.Error())
		return
	}
	for i := 0; i < len(deposirhistory); i++ {
		//如果为扣费，或退费 则把订单id变为就诊号
		if deposirhistory[i].DepositStatus == 2 || deposirhistory[i].DepositStatus == 4 {
			tmpcode, _ := strconv.ParseInt(deposirhistory[i].DepositCode, 10, 64)
			deposirhistory[i].DepositCode = service.FindcodeToid(tmpcode)
		}
	}

	this.ServeSuccessJSON(map[string]interface{}{
		"list":    deposirhistory,
		"name":    name,
		"decimal": decimal,
		"total":   total,
	})
	return
}

//获取患者押金列表
func (this *HisDepositApiController) GetUserList() {
	orgid := this.GetAdminUserInfo().CurrentOrgId
	keyword := this.GetString("keyword")
	page, _ := this.GetInt64("page")   //页码
	limit, _ := this.GetInt64("limit") //每一页查出来的条数
	check := map[string][]string{
		"page":  {"must", "string", "page"},
		"limit": {"must", "string", "limit"},
	}
	_, err := checks(this, &check)
	if err != nil {
		this.ServeFailJsonSend(enums.ErrorCodeParamWrong, err.Error())
		return
	}
	namemap := make(map[int64]string)
	slicekey := make([]int64, 0)
	lists, _ := service.GetHisUser(orgid)
	for _, v := range lists {
		namemap[v.ID] = v.Name
	}
	if len(keyword) > 0 {
		for k, v := range namemap {
			res := strings.Contains(v, keyword)
			if res == true {
				slicekey = append(slicekey, k)
			}
		}
	}
	list, total, errs := service.GetUserList(page, limit, orgid, keyword, slicekey)
	if errs != nil {
		utils.ErrorLog(errs.Error())
		this.ServeFailJsonSend(enums.ErrorCodeParamWrong, err.Error())
		return
	}
	for i := 0; i < len(list); i++ {
		list[i].HisPatientName = namemap[list[i].HisPatientId]
	}
	this.ServeSuccessJSON(map[string]interface{}{
		"list":  list,
		"total": total,
	})
	return
}

//扣费明细查询
func (this *HisDepositApiController) DeductionDetails() {
	orgid := this.GetAdminUserInfo().CurrentOrgId
	timeLayout := "2006-01-02"
	loc, _ := time.LoadLocation("Local")
	keyword := this.GetString("keyword")
	start_time := this.GetString("start_time")
	end_time := this.GetString("end_time")
	var stime int64 //开始时间
	var etime int64 //结束时间

	namemap := make(map[int64]string)
	slicekey := make([]int64, 0)
	lists, _ := service.GetHisUser(orgid)
	for _, v := range lists {
		namemap[v.ID] = v.Name
	}
	if len(keyword) > 0 {
		for k, v := range namemap {
			res := strings.Contains(v, keyword)
			if res == true {
				slicekey = append(slicekey, k)
			}
		}
	}
	if start_time == "" && end_time == "" {
		_, etime = service.GetMondayOfWeek()
		stime = 0
	} else {
		stmp, _ := time.ParseInLocation(timeLayout+" 15:04:05", start_time+" 00:00:00", loc)
		etmp, _ := time.ParseInLocation(timeLayout+" 15:04:05", end_time+" 23:59:59", loc)
		stime = stmp.Unix()
		etime = etmp.Unix()
	}
	list, err := service.DeductionList(orgid, stime, etime, keyword, slicekey)
	if err != nil {
		utils.ErrorLog(err.Error())
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}

	var sum decimal.Decimal
	var detailslist []models.Details
	var details models.Details
	for i := 0; i < len(list); i++ {
		sum = sum.Add(list[i].Deposit)
		tmp_id, _ := strconv.ParseInt(list[i].DepositCode, 10, 64)
		details.ID = tmp_id
		details.Code = service.FindcodeToid(tmp_id)
		details.NameId = list[i].HisPatientId
		details.Name = namemap[list[i].HisPatientId]
		details.Number = service.FindnumberToid(tmp_id)
		details.Decimal = list[i].Deposit
		details.ChargeDate = fmt.Sprintf(time.Unix(list[i].Ctime, 0).Format("2006-01-02 15:04:05"))
		details.Chargetype = service.CodeToChargetype(orgid, details.Code)
		details.Total = service.MedicalTotal(orgid, tmp_id)
		details.ButtonShow = service.IsButtonShow(list[i].DepositCode, orgid, list[i].HisPatientId)
		detailslist = append(detailslist, details)
	}

	this.ServeSuccessJSON(map[string]interface{}{
		"list": detailslist,
		"sum":  sum,
	})
	return
}

//扣费汇总
func (this *HisDepositApiController) DeSummary() {
	orgid := this.GetAdminUserInfo().CurrentOrgId
	timeLayout := "2006-01-02"
	loc, _ := time.LoadLocation("Local")
	keyword := this.GetString("keyword")
	start_time := this.GetString("start_time")
	end_time := this.GetString("end_time")
	var stime int64 //开始时间
	var etime int64 //结束时间

	namemap := make(map[int64]string)
	slicekey := make([]int64, 0)
	lists, _ := service.GetHisUser(orgid)
	for _, v := range lists {
		namemap[v.ID] = v.Name
	}
	if len(keyword) > 0 {
		for k, v := range namemap {
			res := strings.Contains(v, keyword)
			if res == true {
				slicekey = append(slicekey, k)
			}
		}
	}
	if start_time == "" && end_time == "" {
		_, etime = service.GetMondayOfWeek()
		stime = 0
	} else {
		stmp, _ := time.ParseInLocation(timeLayout+" 15:04:05", start_time+" 00:00:00", loc)
		etmp, _ := time.ParseInLocation(timeLayout+" 15:04:05", end_time+" 23:59:59", loc)
		stime = stmp.Unix()
		etime = etmp.Unix()
	}
	list, err := service.DeductionList(orgid, stime, etime, keyword, slicekey)
	if err != nil {
		utils.ErrorLog(err.Error())
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}
	var sum decimal.Decimal
	var detailslist []models.DeductionSummary
	var details models.DeductionSummary
	for i := 0; i < len(list); i++ {
		sum = sum.Add(list[i].Deposit)
		details.Name = namemap[list[i].HisPatientId]
		details.Decimal = list[i].Deposit
		tmp_id, _ := strconv.ParseInt(list[i].DepositCode, 10, 64)
		details.Total = service.MedicalTotal(orgid, tmp_id)
		detailslist = append(detailslist, details)
	}
	maplist := make(map[string]models.DeductionSummary)
	Finlist := []models.DeductionSummary{}
	tmpslice := make([]string, 0)
	for i := 0; i < len(detailslist); i++ {
		if k, ok := maplist[detailslist[i].Name]; ok {
			k.Total = k.Total.Add(detailslist[i].Total)
			k.Decimal = k.Decimal.Add(detailslist[i].Decimal)
			maplist[detailslist[i].Name] = models.DeductionSummary{
				detailslist[i].Name,
				k.Total,
				k.Decimal,
			}
		} else {
			maplist[detailslist[i].Name] = models.DeductionSummary{
				detailslist[i].Name,
				detailslist[i].Total,
				detailslist[i].Decimal,
			}
			tmpslice = append(tmpslice, detailslist[i].Name)
		}
	}
	for i := 0; i < len(tmpslice); i++ {
		Finlist = append(Finlist, maplist[tmpslice[i]])
	}
	this.ServeSuccessJSON(map[string]interface{}{
		"list": Finlist,
		"sum":  sum,
	})
	return
}

//根据患者id查询患者的余额
func (this *HisDepositApiController) IdToBalance() {
	check := map[string][]string{
		"his_patient_id": {"must", "int", "his_patient_id"},
	}
	_, err := checks(this, &check)
	if err != nil {
		this.ServeFailJsonSend(enums.ErrorCodeParamWrong, err.Error())
		return
	}
	orgid := this.GetAdminUserInfo().CurrentOrgId
	his_patient_id, _ := this.GetInt64("his_patient_id")
	tmp := service.GetUserMoney(his_patient_id, orgid)
	this.ServeSuccessJSON(map[string]interface{}{
		"list": tmp,
	})
	return
}

//新增一条退款申请
func (this *HisDepositApiController) RefundApplication() {
	orgid := this.GetAdminUserInfo().CurrentOrgId
	createid := this.GetAdminUserInfo().AdminUser.Id
	dataBody := make(map[string]interface{}, 0)
	err := json.Unmarshal(this.Ctx.Input.RequestBody, &dataBody)
	if err != nil {
		utils.ErrorLog(err.Error())
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}
	switch {
	case dataBody["code"] == nil:
		this.ServeFailJsonSend(enums.ErrorCodeParamWrong, "申请编号不能为空")
		return
	case dataBody["his_patient_id"] == nil:
		this.ServeFailJsonSend(enums.ErrorCodeParamWrong, "患者名称不能为空")
		return
	case dataBody["deposit"] == nil || dataBody["deposit"] == "":
		this.ServeFailJsonSend(enums.ErrorCodeParamWrong, "退款金额不能为空")
		return
	case dataBody["trial_status"] == nil:
		this.ServeFailJsonSend(enums.ErrorCodeParamWrong, "审核状态不能为空")
		return
	}
	code := dataBody["code"].(string)                             //申请编号
	his_patient_id := int64(dataBody["his_patient_id"].(float64)) //患者编号
	//deposit := decimal.NewFromFloat(dataBody["deposit"].(float64)) //退款金额
	var tmps float64
	switch dataBody["deposit"].(type) {
	case string:
		t_deposit := dataBody["deposit"].(string)
		if len(t_deposit) > 0 {
			if t_deposit[0] == 45 {
				this.ServeFailJsonSend(enums.ErrorCodeParamWrong, "退款金额错误")
				return
			}
		}
		tt, errs := strconv.ParseFloat(t_deposit, 64)
		if errs != nil {
			this.ServeFailJsonSend(enums.ErrorCodeParamWrong, "退款金额错误")
			return
		} else {
			tmps = tt
		}
	default:
		tmps = dataBody["deposit"].(float64)
	}
	if tmps == 0 {
		this.ServeFailJsonSend(enums.ErrorCodeParamWrong, "退款金额不能为0")
		return
	}
	deposit := decimal.NewFromFloat(tmps)                     //押金金额
	trial_status := int64(dataBody["trial_status"].(float64)) //审核状态

	err = service.RefundApplication(orgid, his_patient_id, trial_status, createid, code, deposit)
	if err != nil {
		this.ServeFailJsonSend(enums.ErrorCodeParamWrong, err.Error())
		return
	}
	this.ServeSuccessJSON(map[string]interface{}{
		"list": "新增成功",
	})
	return

}

//退款审核通过/拒绝
func (this *HisDepositApiController) RefundReview() {
	check := map[string][]string{
		"ids":          {"must", "string", "ids"},
		"trial_status": {"must", "int", "trial_status"},
	}
	_, err := checks(this, &check)
	if err != nil {
		this.ServeFailJsonSend(enums.ErrorCodeParamWrong, err.Error())
		return
	}
	orgid := this.GetAdminUserInfo().CurrentOrgId
	ids := this.GetString("ids") //很多id

	trial_status, _ := this.GetInt64("trial_status")
	if trial_status != 1 && trial_status != 2 {
		this.ServeFailJsonSend(enums.ErrorCodeParamWrong, "参数trial_status值错误")
		return
	}
	err = service.RefundReviewMore(orgid, trial_status, ids)
	if err != nil {
		this.ServeFailJsonSend(enums.ErrorCodeParamWrong, err.Error())
		return
	}
	var tmplist string
	if trial_status == 1 {
		tmplist = "审核通过"
	} else {
		tmplist = "审核拒绝"
	}
	this.ServeSuccessJSON(map[string]interface{}{
		"list": tmplist,
	})
	return
}

//退款删除
func (this *HisDepositApiController) DeleteRefund() {
	check := map[string][]string{
		"id": {"must", "int", "id"},
	}
	_, err := checks(this, &check)
	if err != nil {
		this.ServeFailJsonSend(enums.ErrorCodeParamWrong, err.Error())
		return
	}
	orgid := this.GetAdminUserInfo().CurrentOrgId
	id, _ := this.GetInt64("id")
	err = service.DeleteRefund(orgid, id)
	if err != nil {
		this.ServeFailJsonSend(enums.ErrorCodeParamWrong, err.Error())
		return
	}
	this.ServeSuccessJSON(map[string]interface{}{
		"list": "删除成功",
	})
	return
}

//更改退款申请
func (this *HisDepositApiController) ChangeRefund() {
	orgid := this.GetAdminUserInfo().CurrentOrgId
	dataBody := make(map[string]interface{}, 0)
	err := json.Unmarshal(this.Ctx.Input.RequestBody, &dataBody)
	if err != nil {
		utils.ErrorLog(err.Error())
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}
	switch {
	case dataBody["id"] == nil:
		this.ServeFailJsonSend(enums.ErrorCodeParamWrong, "id不能为空")
		return
	case dataBody["code"] == nil:
		this.ServeFailJsonSend(enums.ErrorCodeParamWrong, "申请编号不能为空")
		return
	case dataBody["his_patient_id"] == nil:
		this.ServeFailJsonSend(enums.ErrorCodeParamWrong, "患者名称不能为空")
		return
	case dataBody["deposit"] == nil || dataBody["deposit"] == "":
		this.ServeFailJsonSend(enums.ErrorCodeParamWrong, "退款金额不能为空")
		return
	case dataBody["trial_status"] == nil:
		this.ServeFailJsonSend(enums.ErrorCodeParamWrong, "审核状态不能为空")
		return
	}
	id := int64(dataBody["id"].(float64))
	code := dataBody["code"].(string)                             //申请编号
	his_patient_id := int64(dataBody["his_patient_id"].(float64)) //患者编号
	//deposit := decimal.NewFromFloat(dataBody["deposit"].(float64)) //退款金额
	var tmps float64
	switch dataBody["deposit"].(type) {
	case string:
		t_deposit := dataBody["deposit"].(string)
		if len(t_deposit) > 0 {
			if t_deposit[0] == 45 {
				this.ServeFailJsonSend(enums.ErrorCodeParamWrong, "退款金额错误")
				return
			}
		}
		tt, errs := strconv.ParseFloat(t_deposit, 64)
		if errs != nil {
			this.ServeFailJsonSend(enums.ErrorCodeParamWrong, "退款金额错误")
			return
		} else {
			tmps = tt
		}
	default:
		tmps = dataBody["deposit"].(float64)
	}
	if tmps == 0 {
		this.ServeFailJsonSend(enums.ErrorCodeParamWrong, "退款金额不能为0")
		return
	}
	deposit := decimal.NewFromFloat(tmps)                     //押金金额
	trial_status := int64(dataBody["trial_status"].(float64)) //审核状态
	err = service.ChangeRefund(orgid, his_patient_id, trial_status, id, code, deposit)
	if err != nil {
		this.ServeFailJsonSend(enums.ErrorCodeParamWrong, err.Error())
		return
	}
	this.ServeSuccessJSON(map[string]interface{}{
		"list": "保存成功",
	})
	return
}

//退款分页
func (this *HisDepositApiController) RefundList() {
	check := map[string][]string{
		"refundtype":  {"must", "int", "refundtype"},
		"examinetype": {"must", "int", "examinetype"},
		"page":        {"must", "string", "page"},
		"limit":       {"must", "string", "limit"},
	}
	_, err := checks(this, &check)
	if err != nil {
		this.ServeFailJsonSend(enums.ErrorCodeParamWrong, err.Error())
		return
	}
	orgid := this.GetAdminUserInfo().CurrentOrgId
	timeLayout := "2006-01-02"
	loc, _ := time.LoadLocation("Local")
	keyword := this.GetString("keyword")           //获取搜索框
	refundtype, _ := this.GetInt64("refundtype")   //获取退款类型
	examinetype, _ := this.GetInt64("examinetype") //获取审核状态
	page, _ := this.GetInt64("page")               //页码
	limit, _ := this.GetInt64("limit")             //每一页查出来的条数
	start_time := this.GetString("start_time")
	end_time := this.GetString("end_time")
	var stime int64 //开始时间
	var etime int64 //结束时间

	namemap := make(map[int64]string)
	slicekey := make([]int64, 0)
	lists, _ := service.GetHisUser(orgid)
	for _, v := range lists {
		namemap[v.ID] = v.Name
	}
	if len(keyword) > 0 {
		for k, v := range namemap {
			res := strings.Contains(v, keyword)
			if res == true {
				slicekey = append(slicekey, k)
			}
		}
	}
	if start_time == "" && end_time == "" {
		stime, etime = service.GetMondayOfWeek()
		stime = 0
	} else {
		stmp, _ := time.ParseInLocation(timeLayout+" 15:04:05", start_time+" 00:00:00", loc)
		etmp, _ := time.ParseInLocation(timeLayout+" 15:04:05", end_time+" 23:59:59", loc)
		stime = stmp.Unix()
		etime = etmp.Unix()
	}
	depo := []models.RefundList{}
	var total int64
	depo, total, err = service.RefundList(page, limit, orgid, stime, etime, refundtype, examinetype, keyword, slicekey)
	if err != nil {
		utils.ErrorLog("查询失败，原因为：", err.Error())
		this.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
		return
	}
	for i := 0; i < len(depo); i++ {
		depo[i].Name = service.GetCreateidName(depo[i].CreateId, orgid)
		depo[i].HisName = namemap[depo[i].HisPatientId]
		if depo[i].Mtime > depo[i].Ctime {
			depo[i].Starttime = fmt.Sprintf(time.Unix(depo[i].Mtime, 0).Format("2006-01-02 15:04:05"))
		} else {
			depo[i].Starttime = fmt.Sprintf(time.Unix(depo[i].Ctime, 0).Format("2006-01-02 15:04:05"))
		}
		if depo[i].DepositStatus == 4 {
			depo[i].Name = "-"
			tmpcode, _ := strconv.ParseInt(depo[i].DepositCode, 10, 64)
			depo[i].DepositCode = service.FindcodeToid(tmpcode)
		}

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

func (this *HisDepositApiController) GetorgName() {
	orgid := this.GetAdminUserInfo().CurrentOrgId
	name := service.GetorgName(orgid)
	this.ServeSuccessJSON(map[string]interface{}{
		"list": name,
	})
	return
}

//获取本月时间
func (this *HisDepositApiController) GetMonthTime() {
	stime, etime := service.GetMonth()
	srart_time := fmt.Sprintf(time.Unix(stime, 0).Format("2006-01-02"))
	end_time := fmt.Sprintf(time.Unix(etime, 0).Format("2006-01-02"))

	this.ServeSuccessJSON(map[string]interface{}{
		"srart_time": srart_time,
		"end_time":   end_time,
	})
	return
}

//获取本周时间
func (this *HisDepositApiController) GetWeekTime() {
	stime, etime := service.GetMondayOfWeek()
	srart_time := fmt.Sprintf(time.Unix(stime, 0).Format("2006-01-02"))
	end_time := fmt.Sprintf(time.Unix(etime, 0).Format("2006-01-02"))

	this.ServeSuccessJSON(map[string]interface{}{
		"srart_time": srart_time,
		"end_time":   end_time,
	})
	return
}

//判断前端参数是否为空
func checks(this *HisDepositApiController, m *map[string][]string) (map[string]string, error) {
	tmp := make(map[string]string)
	for k, v := range *m {
		t := this.GetString(k)
		if v[0] == "must" && t == "" {
			return nil, fmt.Errorf(v[2] + "不能为空")
		}
		tmp[k] = t
	}
	return tmp, nil
}
