package controllers import ( "FollowUp_Notice/conf" "FollowUp_Notice/http" "FollowUp_Notice/lib" "FollowUp_Notice/logs" "FollowUp_Notice/models/Account" "FollowUp_Notice/models/Illness" "FollowUp_Notice/models/Patient" "FollowUp_Notice/models/Surgical" "FollowUp_Notice/models/System" "FollowUp_Notice/models/Tag" "encoding/json" beego "github.com/beego/beego/v2/server/web" "github.com/robfig/cron/v3" "math" "strconv" "strings" "time" ) type PatientController struct { beego.Controller User Account.User } func (c *PatientController) Prepare() { if Account.User_r != nil { c.User = *Account.User_r } } // 添加患者信息 func (c *PatientController) Patient_List() { // 分页参数 初始化 page, _ := c.GetInt("page") if page < 1 { page = 1 } page_z, _ := c.GetInt("page_z") if page_z < 1 { page_z = conf.Page_size } // 病历号 T_number := c.GetString("T_number") // 姓名 T_name := c.GetString("T_name") // 标签 T_tag, _ := c.GetInt("T_tag") // 诊断 T_illness, _ := c.GetInt("T_illness") // 术式 T_surgical, _ := c.GetInt("T_surgical") // 通知状态 1待通知 2已通知 T_notice, _ := c.GetInt("T_notice") // 复诊状态 1正常 2超时 T_follow_up, _ := c.GetInt("T_follow_up") // 年龄排序 1-升序 2降序 T_age_sort, _ := c.GetInt("T_age_sort") // 下次复诊时间 1-升序 2降序 T_next_time_sort, _ := c.GetInt("T_next_time_sort") Tag.Read_Tag_All_Map() Illness.Read_Illness_All_Map() Surgical.Read_Surgical_All_Map() R_List, R_cnt := Patient.Read_Patient_List(c.User.Id, T_number, T_name, T_tag, T_illness, T_surgical, T_notice, T_follow_up, T_age_sort, T_next_time_sort, page, page_z) var r_jsons lib.R_JSONS r_jsons.Num = R_cnt r_jsons.Data = R_List r_jsons.Page = page r_jsons.Page_size = int(math.Ceil(float64(R_cnt) / float64(page_z))) c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: r_jsons} c.ServeJSON() return } // 添加患者信息 func (c *PatientController) Patient_Add() { T_number := c.GetString("T_number") T_name := c.GetString("T_name") T_age, _ := c.GetInt("T_age") T_tag := c.GetString("T_tag") T_illness, _ := c.GetInt("T_illness") T_surgical, _ := c.GetInt("T_surgical") T_phone := c.GetString("T_phone") T_notice_phone, _ := c.GetInt("T_notice_phone") T_notice_message, _ := c.GetInt("T_notice_message") T_notice_interval := c.GetString("T_notice_interval") T_record := c.GetString("T_record") var_ := Patient.Patient{ T_uid: c.User.Id, T_number: T_number, T_name: T_name, T_age: T_age, T_tag: T_tag, T_illness: T_illness, T_surgical: T_surgical, T_phone: T_phone, T_notice_phone: T_notice_phone, T_notice_message: T_notice_message, T_notice_interval: T_notice_interval, T_record: T_record, T_State: 1, } T_record_list := strings.Split(strings.Trim(T_record, "|"), "|") var T_time string // 复诊时间 var T_interval int // 复诊间隔 if len(T_record_list) > 0 { temp := T_record_list[len(T_record_list)-1] T_time = strings.Split(temp, ",")[0] T_interval, _ = strconv.Atoi(strings.Split(temp, ",")[1]) t, _ := lib.DateStrToTime(T_time) nextTime := t.AddDate(0, 0, T_interval) // 复诊状态 1正常 2超时 3结束 var_.T_follow_up = 1 if nextTime.Before(time.Now()) { var_.T_follow_up = 2 } if T_interval == 0 { var_.T_follow_up = 3 } var_.T_next_time = nextTime.Format("2006-01-02") var_.T_notice = 1 } _, err := Patient.Add_Patient(var_) if err != nil { c.Data["json"] = lib.JSONS{Code: 209, Msg: "添加失败!"} c.ServeJSON() return } System.Add_UserLogs_T(c.User.T_uuid, "患者", "新增", var_) c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"} c.ServeJSON() return } // 修改患者信息 func (c *PatientController) Patient_Edit() { T_uuid := c.GetString("T_uuid") T_number := c.GetString("T_number") T_name := c.GetString("T_name") T_age, _ := c.GetInt("T_age") T_tag := c.GetString("T_tag") T_illness, _ := c.GetInt("T_illness") T_surgical, _ := c.GetInt("T_surgical") T_phone := c.GetString("T_phone") T_notice_phone, _ := c.GetInt("T_notice_phone") T_notice_message, _ := c.GetInt("T_notice_message") T_notice_interval := c.GetString("T_notice_interval") T_record := c.GetString("T_record") var err error var patient Patient.Patient if len(T_uuid) == 0 { c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_uuid Err!"} c.ServeJSON() return } patient, err = Patient.Read_Patient_ByT_uuid(T_uuid) if err != nil { c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_uuid Err!"} c.ServeJSON() return } var cols []string if len(T_number) > 0 { patient.T_number = T_number cols = append(cols, "T_number") } if len(T_name) > 0 { patient.T_name = T_name cols = append(cols, "T_name") } if T_age > 0 { patient.T_age = T_age cols = append(cols, "T_age") } patient.T_tag = T_tag cols = append(cols, "T_tag") patient.T_illness = T_illness cols = append(cols, "T_illness") patient.T_surgical = T_surgical cols = append(cols, "T_surgical") if len(T_phone) > 0 { patient.T_phone = T_phone cols = append(cols, "T_phone") } patient.T_notice_phone = T_notice_phone cols = append(cols, "T_notice_phone") patient.T_notice_message = T_notice_message cols = append(cols, "T_notice_message") if len(T_notice_interval) > 0 { patient.T_notice_interval = T_notice_interval cols = append(cols, "T_notice_interval") } if len(T_record) > 0 { patient.T_record = T_record cols = append(cols, "T_record") } T_record_list := strings.Split(strings.Trim(T_record, "|"), "|") var T_time string // 复诊时间 var T_interval int // 复诊间隔 if len(T_record_list) > 0 { temp := T_record_list[len(T_record_list)-1] T_time = strings.Split(temp, ",")[0] T_interval, _ = strconv.Atoi(strings.Split(temp, ",")[1]) t, _ := lib.DateStrToTime(T_time) nextTime := t.AddDate(0, 0, T_interval) nextTimeStr := nextTime.Format("2006-01-02") if nextTimeStr != patient.T_next_time { patient.T_follow_up = 1 if nextTime.Before(time.Now()) { patient.T_follow_up = 2 } if T_interval == 0 { patient.T_follow_up = 3 } patient.T_next_time = nextTimeStr patient.T_notice = 1 } } cols = append(cols, "T_next_time", "T_notice", "T_follow_up") if err = Patient.Update_Patient(patient, cols...); err != nil { c.Data["json"] = lib.JSONS{Code: 208, Msg: "修改失败!"} c.ServeJSON() return } System.Add_UserLogs_T(c.User.T_uuid, "用户", "修改个人信息", patient) c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"} c.ServeJSON() return } // 删除患者信息 func (c *PatientController) Patient_Del() { T_uuid := c.GetString("T_uuid") if len(T_uuid) == 0 { c.Data["json"] = lib.JSONS{Code: 201, Msg: "T_uuid Err!"} c.ServeJSON() return } patient, err := Patient.Read_Patient_ByT_uuid(T_uuid) if err != nil { c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_uuid Err!"} c.ServeJSON() return } if c.User.Id != 1 || c.User.Id != patient.T_uid { c.Data["json"] = lib.JSONS{Code: 202, Msg: "无权删除!"} c.ServeJSON() return } if err = Patient.Delete_Patient(patient); err != nil { c.Data["json"] = lib.JSONS{Code: 202, Msg: "删除失败!"} c.ServeJSON() return } c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"} c.ServeJSON() return } func (c *PatientController) VoiceCall_Status() { // {"eventType":"callout","statusInfo":{"sessionId":"1201_14852_4294967295_20230529072219@callenabler245.huaweicaas.com","timestamp":"2023-05-29 07:22:19","caller":"+8651668971369","called":"+8618086869080"}} logs.Println("VoiceCall RequestBody-", string(c.Ctx.Input.RequestBody)) type RequestBody struct { EventType string `json:"eventType"` StatusInfo struct { SessionId string `json:"sessionId"` Timestamp string `json:"timestamp"` Caller string `json:"caller"` Called string `json:"called"` StateCode int `json:"stateCode"` StateDesc string `json:"stateDesc"` } `json:"statusInfo"` } var body RequestBody data := c.Ctx.Input.RequestBody err := json.Unmarshal(data, &body) if err != nil { c.Data["json"] = lib.JSONS{Code: 202, Msg: "json.Unmarshal is err:" + err.Error()} c.ServeJSON() } if body.EventType == "disconnect" { r, err := Patient.Read_PatientSend_ByT_id(body.StatusInfo.SessionId) if err != nil { c.Data["json"] = lib.JSONS{Code: 202, Msg: "SessionId Err!"} c.ServeJSON() return } if body.StatusInfo.StateCode == 0 { r.T_State = 1 } r.T_code = body.StatusInfo.StateCode r.T_remark = body.StatusInfo.StateDesc err = Patient.Update_PatientSend(r, "T_State", "T_remark", "T_code") if err != nil { c.Data["json"] = lib.JSONS{Code: 202, Msg: "修改发送状态失败!"} c.ServeJSON() return } } c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"} c.ServeJSON() return } func Cron_Patient() { //创建一个定时任务对象 c := cron.New(cron.WithSeconds()) //给对象增加定时任务 //c.AddFunc("0 */1 * * * ?", Cron_Patient_ChangeFollowUp) c.AddFunc("@daily", Cron_Patient_ChangeFollowUp) // 修改复诊状态 c.AddFunc("0 0 12 * * *", Cron_Patient_Notice) // 消息通知 //启动定时任务 c.Start() defer c.Stop() //查询语句,阻塞,让main函数不退出,保持程序运行 select {} } // 修改患者复诊状态 每晚0点统计 // 已通知并且下次复诊时间超过当期时间 已过期 func Cron_Patient_ChangeFollowUp() { T_date := time.Now().Format("2006-01-02") logs.Info("开始处理" + T_date + "患者通知状态") // T_notice 通知状态 1待通知 2已通知 // T_follow_up 复诊状态 1正常 2超时 list, _ := Patient.Read_Patient_List(0, "", "", 0, 0, 0, 2, 1, 0, 0, 0, 9999) for _, v := range list { nextTime, _ := lib.DateStrToTime(v.T_next_time) if nextTime.Before(time.Now()) { var_ := Patient.Patient{Id: v.Id, T_follow_up: 2} if err := Patient.Update_Patient(var_, "T_follow_up"); err != nil { System.Add_SysLogs_T("复诊状态", "修改失败", var_) } } } } // 给患者发送消息提醒 每天8点 // 发送成功将通知状态修改未已通知H func Cron_Patient_Notice() { T_date := time.Now().Format("2006-01-02") logs.Info("开始发送" + T_date + "患者通知") // T_notice 通知状态 1待通知 2已通知 // T_follow_up 复诊状态 1正常 2超时 3结束 now := time.Now() nowDate := time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, time.Local) userList, _ := Account.Read_User_List("", 0, 9999) for _, user := range userList { // T_arrears_notice 欠费通知 1继续通知 2终止通知 // T_State 0删除 1启用 2停用 // 欠费终止通知或者停用后,不再继续发送通知 if (user.T_money <= 0 && user.T_arrears_notice == 2) || user.T_State == 2 { continue } patientList, _ := Patient.Read_Patient_List(user.Id, "", "", 0, 0, 0, 0, 1, 0, 0, 0, 9999) for _, v := range patientList { nextTime, _ := lib.DateStrToTime(v.T_next_time) var success bool // 提前1天 if strings.Contains(v.T_notice_interval, "1") && nextTime.AddDate(0, 0, -1) == nowDate { success = Send_Notice(nextTime, user, v) } // 提前2天 if strings.Contains(v.T_notice_interval, "2") && nextTime.AddDate(0, 0, -2) == nowDate { success = Send_Notice(nextTime, user, v) } // 提前3天 if strings.Contains(v.T_notice_interval, "3") && nextTime.AddDate(0, 0, -3) == nowDate { success = Send_Notice(nextTime, user, v) } // 提前7天 if strings.Contains(v.T_notice_interval, "7") && nextTime.AddDate(0, 0, -7) == nowDate { success = Send_Notice(nextTime, user, v) } if success == true { // 通知状态 1待通知 2已通知 var_ := Patient.Patient{Id: v.Id, T_notice: 2} if err := Patient.Update_Patient(var_, "T_notice"); err != nil { System.Add_SysLogs_T("复诊通知", "修改失败", var_) } } } } } // 发送通知(短信、电话) func Send_Notice(nextTime time.Time, user Account.User_R, patient Patient.Patient_R) (Success bool) { //发送短信通知 if patient.T_notice_message == 1 { res, err := http.SmsXSend(user.T_template_id, patient.T_phone, patient.T_name, nextTime.Format("2006年01月02日")) if err != nil { System.Add_SysLogs_T("复诊通知", "短信通知失败", patient) } // 保存短信发送记录 smsSend := Patient.PatientSend{ T_uid: user.Id, T_pid: patient.Id, T_phone: patient.T_phone, T_type: 1, T_id: res.Send_id, T_remark: res.Status, T_code: res.Fee, T_State: 1, } if res.Status == "error" { smsSend.T_State = 0 } if res.Status == "success" { Success = true } _, err = Patient.Add_PatientSend(smsSend) if err != nil { System.Add_SysLogs_T("复诊通知", "添加发送记录失败", patient) } } if patient.T_notice_phone == 1 { playInfoList := http.GetPlayInfoList(conf.VoiceCall_Template, []string{user.T_user, patient.T_name, nextTime.Format("2006/01/02")}) res, err := http.VoiceNotifyAPI(conf.VoiceCall_Phone, "+86"+patient.T_phone, playInfoList) if err != nil { System.Add_SysLogs_T("复诊通知", "电话通知失败", patient) } // 保存短信发送记录 smsSend := Patient.PatientSend{ T_uid: user.Id, T_pid: patient.Id, T_phone: patient.T_phone, T_type: 2, T_id: res.SessionId, T_remark: res.Resultdesc, T_State: 0, } if res.Resultcode != "0" { smsSend.T_State = 0 } if res.Resultcode == "0" { Success = true } _, err = Patient.Add_PatientSend(smsSend) if err != nil { System.Add_SysLogs_T("复诊通知", "添加发送记录失败", patient) } } return Success }