123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980 |
- package service
-
- import (
- "XT_New/models"
- "XT_New/utils"
- "fmt"
- "github.com/jinzhu/gorm"
- "github.com/shopspring/decimal"
- "math/rand"
- "strconv"
- "strings"
- "time"
- )
-
- // 生成编号?+yymmdd+随机数(4位)
- // 新增参数为CP
- // 退款参数为AF
- func CreateCPCode(str string) string {
- s := fmt.Sprintf("%04v", rand.New(rand.NewSource(time.Now().UnixNano())).Int63n(10000))
- t := time.Now().Format("20060102")
- code := str + t + s
- return code
- }
-
- // 获取his中的有效患者
- func GetHisUser(orgid int64) (hisname []models.GetHisName, err error) {
- err = XTReadDB().Model(&models.GetHisName{}).Where("status = 1 and user_org_id = ?", orgid).Find(&hisname).Error
- return
- }
-
- // 获取his中的有效患者去除了转出和死亡的
- func GetHisUserToAlive(orgid int64) (hisname []models.GetHisName, err error) {
- err = XTReadDB().Model(&models.GetHisName{}).Where("status = 1 and user_org_id = ? and lapseto = 1", orgid).Find(&hisname).Error
- return
- }
-
- // 获取his中的有效患者
- func GetHisUserName(orgid, id int64) (hisname models.GetHisName, err error) {
- err = XTReadDB().Model(&models.GetHisName{}).Where("status = 1 and user_org_id = ? and id = ?", orgid, id).Find(&hisname).Error
- return
- }
-
- // 添加押金(开始)调用接口前记得判断审核状态,确认通过审核后在调用
- func UpDeposit(code, remarks string, his_patient_id, orgid, trial_status, createid int64, deposit decimal.Decimal) (err error) {
- //查押金表是否存在记录
- tmp, tmpdeposit := IsHisPatientId(his_patient_id, orgid)
- if tmp == 0 {
- //需要生成一条数据
- de := models.Deposit{
- UserOrgId: orgid,
- HisPatientId: his_patient_id,
- Ctime: time.Now().Unix(),
- Mtime: time.Now().Unix(),
- Status: 1,
- }
- i, d, err := AddDeposit(de)
- if err != nil || i == 0 {
- utils.ErrorLog("添加用户押金记录失败: %v", err.Error())
- return err
- }
- tmp = i
- tmpdeposit = d
- }
- s_deposit := tmpdeposit
- if trial_status == 1 {
- de := models.Deposit{
- ID: tmp,
- Mtime: time.Now().Unix(),
- Deposit: deposit.Add(tmpdeposit),
- }
- err = UpdateDeposit(de)
- if err != nil {
- utils.ErrorLog("添加用户押金失败: %v", err.Error())
- return
- }
- s_deposit = deposit.Add(tmpdeposit)
- }
- dehistory := models.DepositHistory{
- UserOrgId: orgid,
- HisPatientId: his_patient_id,
- DepositCode: code,
- Deposit: deposit, //本次操作的押金
- SurplusDeposit: s_deposit, //剩余金额
- DepositStatus: 1,
- Status: 1,
- CreateId: createid,
- Ctime: time.Now().Unix(),
- Mtime: time.Now().Unix(),
- TrialStatus: trial_status,
- Remarks: remarks,
- }
- err = AddDepositHistory(dehistory)
- if err != nil {
- utils.ErrorLog("添加用户押金历史记录失败: %v", err.Error())
- }
- return
- }
-
- // 添加押金记录
- func AddDepositHistory(dh models.DepositHistory) error {
- err := XTWriteDB().Create(&dh).Error
- return err
- }
-
- // 押金中添加一条记录,并返回该数据的id和押金余额(当没有该用户记录时调用)
- func AddDeposit(de models.Deposit) (int64, decimal.Decimal, error) {
- var tmp models.Deposit
- err := XTWriteDB().Create(&de).Find(&tmp).Error
- if err != nil {
- return 0, decimal.NewFromFloat(0.00), err
- }
- return tmp.ID, tmp.Deposit, err
- }
-
- // 更改押金记录
- func UpdateDeposit(de models.Deposit) (err error) {
- err = XTWriteDB().Model(&models.Deposit{}).Where("id = ? and status = 1", de.ID).Updates(map[string]interface{}{
- "mtime": de.Mtime,
- "deposit": de.Deposit,
- }).Error
- return
- }
-
- // 判断押金表是否存在当前的患者的一条有效数据,如果有返回id和押金余额,没有返回0
- func IsHisPatientId(his_patient_id, orgid int64) (int64, decimal.Decimal) {
- var tmp []models.Deposit
- XTReadDB().Model(&models.Deposit{}).Where("user_org_id = ? and his_patient_id = ? and status = 1", orgid, his_patient_id).Find(&tmp)
- if len(tmp) != 1 {
- return 0, decimal.NewFromFloat(0.00)
- }
- return tmp[0].ID, tmp[0].Deposit
- }
-
- // 查询押金编号是否重复
- func FindDecimalCode(orgid int64, code string) bool {
- var total int
- XTReadDB().Model(&models.DepositHistory{}).Where("user_org_id = ? and deposit_code = ? and status = 1", orgid, code).Count(&total)
- if total > 0 {
- return true
- } else {
- return false
- }
- }
-
- // 充值明细列表
- func DetailsList(orgid, stime, etime int64, keyword string, slicekey []int64) (deposithistory []models.DepositHistoryname, err error) {
- db := XTReadDB().Model(&models.DepositHistory{}).Where("status = 1 and user_org_id = ? and deposit_status = 1 ", orgid).Where("ctime >= ? and ctime <= ?", stime, etime)
- if len(keyword) > 0 {
- var tmp string = "deposit_code like ?"
- if len(slicekey) > 0 {
- for i := 0; i < len(slicekey); i++ {
- tmp = tmp + " or his_patient_id = " + strconv.FormatInt(slicekey[i], 10)
- }
- }
- keyword = "%" + keyword + "%"
- db = db.Where(tmp, keyword)
- }
- err = db.Order("ctime desc").Find(&deposithistory).Error
- return
- }
-
- // 充值汇总列表
- func SummaryList(orgid, stime, etime int64, keyword string, slicekey []int64) (deposithistory []models.DepositHistory, err error) {
- db := XTReadDB().Model(&models.DepositHistory{}).Where("status = 1 and trial_status = 1 and user_org_id = ? and deposit_status = 1 ", orgid).Where("ctime >= ? and ctime <= ?", stime, etime)
- if len(slicekey) > 0 {
- tmp := ""
- for i := 0; i < len(slicekey); i++ {
- tmp = tmp + " his_patient_id = " + strconv.FormatInt(slicekey[i], 10)
- if i < len(slicekey)-1 {
- tmp = tmp + " or "
- }
- }
- db = db.Where(tmp)
- } else {
- if len(keyword) > 0 {
- return
- }
- }
- err = db.Order("ctime desc").Find(&deposithistory).Error
- return
- }
-
- // 获取本周周一和周日的起止时间戳
- func GetMondayOfWeek() (int64, int64) {
- t := time.Now()
- dayObj := GetZeroTime(t)
- var dayStr string
- loc, _ := time.LoadLocation("Local")
- if t.Weekday() == time.Monday {
- dayStr = dayObj.Format("2006-01-02")
- } else {
- offset := int(time.Monday - t.Weekday())
- if offset > 0 {
- offset = -6
- }
- dayStr = dayObj.AddDate(0, 0, offset).Format("2006-01-02")
- }
- dayStr = dayStr + " 00:00:00"
- stime, _ := time.ParseInLocation("2006-01-02 15:04:05", dayStr, loc)
- return stime.Unix(), stime.Unix() + 604799
- }
-
- // 获取本月的起止时间戳
- func GetMonth() (int64, int64) {
- timeNow := time.Now()
- timeToday := time.Date(timeNow.Year(), timeNow.Month(), timeNow.Day(), 0, 0, 0, 0, timeNow.Location()) // 获取当天0点时间 time类型
- timeMonthStartUnix1 := timeToday.AddDate(0, 0, -timeToday.Day()+1).Unix() // 获取本月第一天0点 时间戳类型
- timeMonthEndUnix1 := timeToday.AddDate(0, 1, -timeToday.Day()+1).Unix() - 1 // 获取下个月第一天/ 本月最后一天24点 时间戳类型
- return timeMonthStartUnix1, timeMonthEndUnix1
- }
-
- // 获取当天起止时间戳
- func GetNowTime() (int64, int64) {
- t := time.Now()
- addTime := time.Date(t.Year(), t.Month(), t.Day(), 0, 0, 0, 0, t.Location())
- timesamp := addTime.Unix()
- return timesamp, timesamp + 86399
- }
-
- // 获取创建者的姓名
- // 原先的(sgj_users.sgj_user_admin)
- // 新加的(sgj_users.sgj_user_admin_role)
- func GetCreateidName(id, orgid int64) string {
- //var tmp models.CreateUser
- //XTReadDB().Select("name").Where("id = ?", id).Find(&tmp)
- //return tmp.Name
-
- var tmp models.CreateUserNames
- XTReadDB().Select("user_name").Where("admin_user_id = ? and org_id = ?", id, orgid).Order("ctime desc").Find(&tmp)
- return tmp.UserName
- }
-
- // 审核通过
- func UpDecimalHistory(id int64) (err error) {
- //开事务
- tx := XTWriteDB().Begin()
- defer func() {
- if err != nil {
- utils.ErrorLog("事务失败,原因为: %v", err)
- tx.Rollback()
- } else {
- tx.Commit()
- }
- }()
-
- //查记录x2
- var history models.DepositHistory
- var detmp models.Deposit
- err = tx.Model(&models.DepositHistory{}).Where("id = ?", id).Find(&history).Error
- if err != nil {
- return
- }
- err = tx.Model(&models.Deposit{}).Where("user_org_id = ? and his_patient_id = ? and status = 1 ", history.UserOrgId, history.HisPatientId).Find(&detmp).Error
- if err != nil {
- return
- }
- //改状态,=====剩余押金
- err = tx.Model(models.DepositHistory{}).Where("id = ?", id).Updates(map[string]interface{}{
- "trial_status": 1,
- "surplus_deposit": detmp.Deposit.Add(history.Deposit),
- "mtime": time.Now().Unix(),
- }).Error
- if err != nil {
- return
- }
- //相加
- err = tx.Model(&models.Deposit{}).Where("id = ? and status = 1", detmp.ID).Updates(map[string]interface{}{
- "mtime": time.Now().Unix(),
- "deposit": detmp.Deposit.Add(history.Deposit),
- }).Error
-
- return
- }
-
- // 删除本次记录
- func DelDecimalHistory(id int64) (err error) {
- err = XTWriteDB().Model(models.DepositHistory{}).Where("id = ?", id).Updates(map[string]interface{}{
- "status": 0,
- "mtime": time.Now().Unix(),
- }).Error
- return
- }
-
- // 根据id获取一条押金历史记录
- func GetDecimalHistoryOne(id int64) (history models.DepositHistory, err error) {
- err = XTReadDB().Model(&models.DepositHistory{}).Where("id = ?", id).Find(&history).Error
- return
- }
-
- // 根据患者id获取该患者当前剩余的押金
- func GetUserMoney(id, orgid int64) decimal.Decimal {
- tmp := models.Deposit{}
- err := XTReadDB().Model(&models.Deposit{}).Where("his_patient_id = ? and user_org_id = ? and status = 1", id, orgid).Find(&tmp).Error
- if err != nil {
- return decimal.NewFromFloat(0)
- }
- return tmp.Deposit
- }
-
- // 查询时间段内患者的余额
- func GetMoneyforTime(id, orgid, etime int64) decimal.Decimal {
- tmp := models.DepositHistory{}
- XTReadDB().Model(&models.DepositHistory{}).Where("his_patient_id = ? and user_org_id = ? and status = 1 and mtime <= ?", id, orgid, etime).Order("mtime").Find(&tmp)
- return tmp.SurplusDeposit
- }
-
- // 押金流水
- func GetFlowList(page, limit, id, orgid, stime, etime, deposit_status int64) (deposit []models.DepositHistory, total int64, err error) {
- s := "status = 1 and trial_status = 1 and user_org_id = ? and his_patient_id = ? and mtime >= ? and mtime <= ?"
- offset := (page - 1) * limit
- if deposit_status != 0 {
- s = s + " and deposit_status = " + strconv.FormatInt(deposit_status, 10)
- }
- err = XTReadDB().Model(&models.DepositHistory{}).Where(s, orgid, id, stime, etime).Count(&total).Offset(offset).Order("mtime desc").Limit(limit).Find(&deposit).Error
- return
- }
-
- // 获取患者押金列表
- func GetUserList(page, limit, orgid int64, keyword string, slicekey []int64) (m []models.Deposit1, total int64, err error) {
- db := XTReadDB().Model(&models.Deposit{}).Where("status = 1 and user_org_id = ? ", orgid)
- offset := (page - 1) * limit
- if len(keyword) > 0 {
- db = db.Where(" his_patient_id = ? ", keyword)
- }
- err = db.Count(&total).Offset(offset).Order("mtime desc").Limit(limit).Find(&m).Error
- return
- }
-
- // 扣费明细列表
- func DeductionList(orgid, stime, etime int64, keyword string, slicekey []int64) (deposithistory []models.DepositHistory, err error) {
- db := XTReadDB().Model(&models.DepositHistory{}).Where("status = 1 and user_org_id = ? and deposit_status = 2 ", orgid).Where("ctime >= ? and ctime <= ?", stime, etime)
- if len(keyword) > 0 {
- var tmp string = "deposit_code like ?"
- if len(slicekey) > 0 {
- for i := 0; i < len(slicekey); i++ {
- tmp = tmp + " or his_patient_id = " + strconv.FormatInt(slicekey[i], 10)
- }
- }
- keyword = "%" + keyword + "%"
- db = db.Where(tmp, keyword)
- }
- err = db.Order("ctime desc").Find(&deposithistory).Error
- return
- }
-
- // 获取医疗费总额
- func MedicalTotal(orgid, id int64) decimal.Decimal {
- tmp := models.HisChargeSettleOrder{}
- //and status = 1 and order_status = 2
- XTReadDB().Model(&models.HisChargeSettleOrder{}).Where("id = ? and user_org_id = ? ", id, orgid).Find(&tmp)
- return decimal.NewFromFloat(tmp.MedfeeSumamt)
- }
-
- // 根据就诊号查询出医收费类型
- func CodeToChargetype(orgid int64, code string) (s string) {
- tmp := models.HisPrintPatient{}
- tmp_hhcr := models.HisHospitalCheckRecordTwo{}
- XTReadDB().Model(&models.HisPrintPatient{}).Where("number = ? and user_org_id = ?", code, orgid).Find(&tmp)
- //tmp.BalanceAccountsType
- if tmp.BalanceAccountsType == 0 {
- XTReadDB().Model(&models.HisHospitalCheckRecordTwo{}).Where("number = ? and user_org_id = ?", code, orgid).Find(&tmp_hhcr)
- tmp.BalanceAccountsType = tmp_hhcr.BalanceAccountsType
- }
- switch tmp.BalanceAccountsType {
- case 1:
- s = "医保"
- case 2:
- s = "自费"
- case 3:
- s = "公费"
- case 4:
- s = "农保"
- case 5:
- s = "会员"
- case 6:
- s = "职工"
- case 7:
- s = "合同"
- case 8:
- s = "医保自费"
- default:
- s = "类型未定义"
- }
-
- return
- }
-
- // 扣除患者的押金,并生成一条扣费历史记录
- // orgid 机构id;
- // his_user_id 患者id;
- // create_id 创建者id;
- // code 就诊号;
- // deposit 本次使用的押金金额,支持float64、int、int64、decimal.Decimal类型
- func SpendDeposit(orgid, his_user_id, create_id int64, code string, deposit interface{}) (err error) {
- tmp_deposit := decimal.Decimal{} //本次患者使用的押金
- tmp_deposit, err = ToDecimal(deposit)
- if err != nil {
- return
- }
- ////开事务
- //tx := XTWriteDB().Begin()
- //defer func() {
- // if err != nil {
- // utils.ErrorLog("事务失败,原因为: %v", err.Error())
- // tx.Rollback()
- // } else {
- // tx.Commit()
- // }
- //}()
- //查询患者押金
- tmp := models.Deposit{}
- err = readDb.Model(&models.Deposit{}).Where("his_patient_id = ? and user_org_id = ? and status = 1", his_user_id, orgid).Find(&tmp).Error
- if err != nil {
- err = fmt.Errorf("押金余额不足")
- return
- }
- //判断能否扣除
- if tmp.Deposit.Cmp(tmp_deposit) == -1 {
- err = fmt.Errorf("押金余额不足")
- return
- }
- //扣除患者押金
- err = readDb.Model(&models.Deposit{}).Where("id = ? and status = 1", tmp.ID).Updates(map[string]interface{}{
- "mtime": time.Now().Unix(),
- "deposit": tmp.Deposit.Sub(tmp_deposit),
- }).Error
- if err != nil {
- return
- }
- //生成一条历史记录
- dehistory := models.DepositHistory{
- UserOrgId: orgid,
- HisPatientId: his_user_id,
- DepositCode: code,
- Deposit: tmp_deposit,
- SurplusDeposit: tmp.Deposit.Sub(tmp_deposit),
- DepositStatus: 2,
- Status: 1,
- CreateId: create_id,
- Ctime: time.Now().Unix(),
- Mtime: time.Now().Unix(),
- TrialStatus: 1,
- }
- err = readDb.Create(&dehistory).Error
- return
- }
-
- func SpendDepositTwo(orgid, his_user_id, create_id int64, code string, deposit interface{}, ctime int64) (err error) {
- tmp_deposit := decimal.Decimal{} //本次患者使用的押金
- tmp_deposit, err = ToDecimal(deposit)
- if err != nil {
- return
- }
- ////开事务
- //tx := XTWriteDB().Begin()
- //defer func() {
- // if err != nil {
- // utils.ErrorLog("事务失败,原因为: %v", err.Error())
- // tx.Rollback()
- // } else {
- // tx.Commit()
- // }
- //}()
- //查询患者押金
- tmp := models.Deposit{}
- err = readDb.Model(&models.Deposit{}).Where("his_patient_id = ? and user_org_id = ? and status = 1", his_user_id, orgid).Find(&tmp).Error
- if err != nil {
- err = fmt.Errorf("押金余额不足")
- return
- }
- //判断能否扣除
- if tmp.Deposit.Cmp(tmp_deposit) == -1 {
- err = fmt.Errorf("押金余额不足")
- return
- }
- //扣除患者押金
- err = readDb.Model(&models.Deposit{}).Where("id = ? and status = 1", tmp.ID).Updates(map[string]interface{}{
- "mtime": time.Now().Unix(),
- "deposit": tmp.Deposit.Sub(tmp_deposit),
- }).Error
- if err != nil {
- return
- }
- //生成一条历史记录
- dehistory := models.DepositHistory{
- UserOrgId: orgid,
- HisPatientId: his_user_id,
- DepositCode: code,
- Deposit: tmp_deposit,
- SurplusDeposit: tmp.Deposit.Sub(tmp_deposit),
- DepositStatus: 2,
- Status: 1,
- CreateId: create_id,
- Ctime: ctime,
- Mtime: time.Now().Unix(),
- TrialStatus: 1,
- }
- err = readDb.Create(&dehistory).Error
- return
- }
-
- // 新增一条退款申请
- func RefundApplication(orgid, his_patient_id, trial_status, createid int64, code string, deposit decimal.Decimal) (err error) {
- //开事务
- tx := XTWriteDB().Begin()
- defer func() {
- if err != nil {
- utils.ErrorLog("事务失败,原因为: %v", err.Error())
- tx.Rollback()
- } else {
- tx.Commit()
- }
- }()
- //获取患者当前余额
- tmp := models.Deposit{}
- err = tx.Model(&models.Deposit{}).Where("his_patient_id = ? and user_org_id = ? and status = 1", his_patient_id, orgid).Find(&tmp).Error
- if err != nil {
- if err.Error() == "record not found" {
- err = fmt.Errorf("没有可退押金,保存失败")
- }
- return
- }
- //判断是否可以退款
- if tmp.Deposit.Cmp(deposit) == -1 {
- err = fmt.Errorf("退款金额不得大于押金余额!")
- return
- }
- s_deposit := tmp.Deposit
- //判断是否审核通过,通过更新当前押金,否则只新增一条历史记录
- if trial_status == 1 {
- //更新患者当前押金余额
- err = tx.Model(&models.Deposit{}).Where("id = ? and status = 1", tmp.ID).Updates(map[string]interface{}{
- "mtime": time.Now().Unix(),
- "deposit": tmp.Deposit.Sub(deposit),
- }).Error
- if err != nil {
- return
- }
- s_deposit = tmp.Deposit.Sub(deposit)
- }
- //生成一条历史记录
- dehistory := models.DepositHistory{
- UserOrgId: orgid,
- HisPatientId: his_patient_id,
- DepositCode: code,
- Deposit: deposit,
- SurplusDeposit: s_deposit,
- DepositStatus: 3, //3退款,4退费
- Status: 1,
- CreateId: createid,
- Ctime: time.Now().Unix(),
- Mtime: time.Now().Unix(),
- TrialStatus: trial_status,
- }
- err = tx.Create(&dehistory).Error
- return
- }
-
- // 退款审核通过/拒绝批量处理
- func RefundReviewMore(orgid, trial_status int64, ids string) (err error) {
- //处理下字符串
- t_ids := ""
- if ids[len(ids)-1] == 44 {
- t_ids = ids[:len(ids)-1]
- } else {
- t_ids = ids
- }
- tmp_id := strings.Split(t_ids, ",")
- //开事务
- tx := XTWriteDB().Begin()
- defer func() {
- if err != nil {
- utils.ErrorLog("事务失败,原因为: %v", err.Error())
- tx.Rollback()
- } else {
- tx.Commit()
- }
- }()
- //循环处理id
- for i := 0; i < len(tmp_id); i++ {
- var id int64
- id, err = strconv.ParseInt(tmp_id[i], 10, 64)
- if err != nil {
- return err
- }
- err = RefundReview(orgid, id, trial_status, tx)
- if err != nil {
- return err
- }
- }
- return err
- }
-
- // 退款审核通过/拒绝
- func RefundReview(orgid, id, trial_status int64, tx *gorm.DB) (err error) {
- //根据id查询该条历史记录
- history := models.DepositHistory{}
- err = tx.Model(&models.DepositHistory{}).Where("id = ? and status = 1", id).Find(&history).Error
- if err != nil {
- return err
- }
- //判断状态是否为未审核
- if history.TrialStatus != 0 {
- err = fmt.Errorf("所选单据中包含了无需审核的单据")
- return err
- }
- //判断类型是否为3,3代表退款,4为退费
- if history.DepositStatus != 3 {
- err = fmt.Errorf("所选单据中包含了无需审核的单据")
- return err
- }
- up := make(map[string]interface{})
- //通过
- if trial_status == 1 {
- //拿患者的id和机构id在去查患者的余额
- tt := models.Deposit{}
- err = tx.Model(&models.Deposit{}).Where("his_patient_id = ? and user_org_id = ? and status = 1", history.HisPatientId, orgid).Find(&tt).Error
- if err != nil {
- return err
- }
- //判断是否可以修改患者押金
- if tt.Deposit.Cmp(history.Deposit) == -1 {
- err = fmt.Errorf("当前押金余额小于退款金额,无法完成退款")
- return err
- }
- //修改患者押金
- err = tx.Model(&models.Deposit{}).Where("id = ? and status = 1", tt.ID).Updates(map[string]interface{}{
- "mtime": time.Now().Unix(),
- "deposit": tt.Deposit.Sub(history.Deposit),
- }).Error
- if err != nil {
- return err
- }
- up = map[string]interface{}{
- "mtime": time.Now().Unix(),
- "surplus_deposit": tt.Deposit.Sub(history.Deposit),
- "trial_status": 1,
- }
- } else {
- up = map[string]interface{}{
- "mtime": time.Now().Unix(),
- "trial_status": 2,
- }
- }
- //修改一条历史记录
- err = tx.Model(&models.DepositHistory{}).Where("id = ? and status = 1", id).Updates(up).Error
- return err
- }
-
- // 退款删除
- func DeleteRefund(orgid, id int64) (err error) {
- //根据id查询历史记录
- history := models.DepositHistory{}
- err = XTReadDB().Model(&models.DepositHistory{}).Where("id = ?", id).Find(&history).Error
- if err != nil {
- return
- }
- //判断是否可以删除
- if history.TrialStatus == 1 || history.DepositStatus != 3 {
- err = fmt.Errorf("当前状态不可删除!")
- return
- }
- //删除
- err = XTWriteDB().Model(&models.DepositHistory{}).Where("id = ?", id).Updates(map[string]interface{}{
- "mtime": time.Now().Unix(),
- "status": 0,
- }).Error
-
- return
- }
-
- // 更改退款申请
- func ChangeRefund(orgid, his_patient_id, trial_status, id int64, code string, deposit decimal.Decimal) (err error) {
- //开事务
- tx := XTWriteDB().Begin()
- defer func() {
- if err != nil {
- utils.ErrorLog("事务失败,原因为: %v", err.Error())
- tx.Rollback()
- } else {
- tx.Commit()
- }
- }()
- //获取患者当前余额
- tmp := models.Deposit{}
- err = tx.Model(&models.Deposit{}).Where("his_patient_id = ? and user_org_id = ? and status = 1", his_patient_id, orgid).Find(&tmp).Error
- if err != nil {
- return
- }
- //判断是否可以退款
- if tmp.Deposit.Cmp(deposit) == -1 {
- err = fmt.Errorf("退款金额不得大于押金余额!")
- return
- }
- up := make(map[string]interface{})
- //判断是否审核通过,通过更新当前押金,否则只新增一条历史记录
- if trial_status == 1 {
- //更新患者当前押金余额
- err = tx.Model(&models.Deposit{}).Where("id = ? and status = 1", tmp.ID).Updates(map[string]interface{}{
- "mtime": time.Now().Unix(),
- "deposit": tmp.Deposit.Sub(deposit),
- }).Error
- if err != nil {
- return
- }
- up = map[string]interface{}{
- "mtime": time.Now().Unix(),
- "deposit_code": code,
- "his_patient_id": his_patient_id,
- "surplus_deposit": tmp.Deposit.Sub(deposit),
- "deposit": deposit,
- "trial_status": trial_status,
- }
- } else {
- up = map[string]interface{}{
- "mtime": time.Now().Unix(),
- "deposit_code": code,
- "his_patient_id": his_patient_id,
- "deposit": deposit,
- "trial_status": trial_status,
- }
- }
- //更新一条历史记录
- err = tx.Model(&models.DepositHistory{}).Where("id = ? and status = 1", id).Updates(up).Error
- return
- }
-
- // 退款分页
- func RefundList(page, limit, orgid, stime, etime, refundtype, examinetype int64, keyword string, slicekey []int64) (depo []models.RefundList, total int64, err error) {
- db := XTReadDB().Model(&models.DepositHistory{}).Where("status = 1 and user_org_id = ? ", orgid).Where("ctime >= ? and ctime <= ?", stime, etime)
- offset := (page - 1) * limit
- //退款类型
- switch refundtype {
- case 0:
- db = db.Where(" deposit_status in (3,4) ")
- case 3, 4:
- db = db.Where(" deposit_status = ? ", refundtype)
- default:
- err = fmt.Errorf("退款类型错误")
- return
- }
- //审核状态
- switch examinetype {
- case 0, 1, 2:
- db = db.Where(" trial_status = ? ", examinetype)
- case 3: //代表查询全部
- db = db
- default:
- err = fmt.Errorf("审核状态错误")
- return
- }
- if len(keyword) > 0 {
- tmp := "deposit_code like ? "
- if len(slicekey) > 0 {
- for i := 0; i < len(slicekey); i++ {
- tmp = tmp + " or his_patient_id = " + strconv.FormatInt(slicekey[i], 10)
- }
- }
- keyword = "%" + keyword + "%"
- db = db.Where(tmp, keyword)
- }
- err = db.Count(&total).Offset(offset).Order("ctime desc").Limit(limit).Find(&depo).Error
- return
-
- }
-
- // 退回患者的押金,并生成一条退费历史记录
- // orgid 机构id
- // his_user_id 患者id
- // code 编号
- // deposit 本次退费的金额,支持float64、int、int64、decimal.Decimal类型
- func MoneyIncrease(orgid, his_user_id int64, code string, deposit interface{}) (err error) {
- tmp_deposit := decimal.Decimal{}
- tmp_deposit, err = ToDecimal(deposit)
- if err != nil {
- return
- }
- //开事务
- tx := XTWriteDB().Begin()
- defer func() {
- if err != nil {
- utils.ErrorLog("事务失败,原因为: %v", err.Error())
- tx.Rollback()
- } else {
- tx.Commit()
- }
- }()
- //获取当前患者押金
- tmp := models.Deposit{}
- err = tx.Model(&models.Deposit{}).Where("his_patient_id = ? and user_org_id = ? and status = 1", his_user_id, orgid).Find(&tmp).Error
- if err != nil {
- return
- }
- //退回患者押金
- err = tx.Model(&models.Deposit{}).Where("id = ? and status = 1", tmp.ID).Updates(map[string]interface{}{
- "mtime": time.Now().Unix(),
- "deposit": tmp.Deposit.Add(tmp_deposit),
- }).Error
- if err != nil {
- return
- }
- //生成一条退费记录
- dehistory := models.DepositHistory{
- UserOrgId: orgid,
- HisPatientId: his_user_id,
- DepositCode: code,
- Deposit: tmp_deposit,
- SurplusDeposit: tmp.Deposit.Add(tmp_deposit),
- DepositStatus: 4,
- Status: 1,
- CreateId: 0,
- Ctime: time.Now().Unix(),
- Mtime: time.Now().Unix(),
- TrialStatus: 1,
- }
- err = tx.Create(&dehistory).Error
- return
- }
- func GetorgName(orgid int64) (name string) {
- tmp := models.GetorgName{}
- XTReadDB().Model(&models.GetorgName{}).Where("id = ? ", orgid).Find(&tmp)
- return tmp.OrgName
- }
-
- // 根据id查询就诊号
- func FindcodeToid(id int64) (code string) {
- tmp := models.GetMdtrtId{}
- XTReadDB().Model(&models.GetMdtrtId{}).Where("id = ?", id).Find(&tmp)
- return tmp.MdtrtId
- }
-
- // 根据id查询就诊号
- func FindnumberToid(id int64) (number string) {
- tmp := models.GetMdtrtId{}
- XTReadDB().Model(&models.GetMdtrtId{}).Where("id = ?", id).Find(&tmp)
- return tmp.Number
- }
-
- // 扣费明细列表,查看详情按钮是否显示,0隐藏,1显示
- func IsButtonShow(code string, orgid, his_patient_id int64) (tmp int64) {
- var total int
- XTReadDB().Model(&models.RefundList{}).Where(" user_org_id = ? and his_patient_id = ? and deposit_code = ? and deposit_status = 4 and status = 1", orgid, his_patient_id, code).Count(&total)
- if total == 0 {
- return 1
- } else {
- //预防万一,多加一个验证
- if total%2 == 0 {
- return 1
- } else {
- return 0
- }
- }
- }
-
- // 把其他的类型转换成decimal.Decimal类型
- func ToDecimal(i interface{}) (d decimal.Decimal, err error) {
- switch i.(type) {
- case float64:
- d = decimal.NewFromFloat(i.(float64))
- case decimal.Decimal:
- d = i.(decimal.Decimal)
- case int64:
- d = decimal.NewFromFloat(float64(i.(int64)))
- case int:
- d = decimal.NewFromFloat(float64(i.(int)))
- default:
- err = fmt.Errorf("类型解析错误")
- }
- return
- }
-
- func TypeConversion(tmp float64) (s string) {
- switch tmp {
- case 1:
- s = "g"
- case 2:
- s = "mg"
- case 3:
- s = "u"
- case 4:
- s = "ml"
- case 5:
- s = "万U"
- case 6:
- s = "枚"
- case 7:
- s = "粒"
- case 8:
- s = "片"
- case 9:
- s = "支"
- case 10:
- s = "μg"
- case 11:
- s = "iu"
- case 12:
- s = "包"
- case 13:
- s = "袋"
- case 14:
- s = "万"
- case 15:
- s = "万iu"
- case 16:
- s = "丸"
- case 17:
- s = "盒"
- case 18:
- s = "瓶"
- case 19:
- s = "瓶(袋)"
- case 20:
- s = "次"
- }
- return s
- }
-
- func TypeConversion02(tmp string) (s string) {
- switch tmp {
- case "1":
- s = "g"
- case "2":
- s = "mg"
- case "3":
- s = "u"
- case "4":
- s = "ml"
- case "5":
- s = "万U"
- case "6":
- s = "枚"
- case "7":
- s = "粒"
- case "8":
- s = "片"
- case "9":
- s = "支"
- case "10":
- s = "μg"
- case "11":
- s = "iu"
- case "12":
- s = "包"
- case "13":
- s = "袋"
- case "14":
- s = "万"
- case "15":
- s = "万iu"
- case "16":
- s = "丸"
- case "17":
- s = "盒"
- case "18":
- s = "瓶"
- case "19":
- s = "瓶(袋)"
- case "20":
- s = "次"
- default:
- s = tmp
- }
- return s
- }
-
- // 获取本段时间内患者退款的总额
- // orgid:机构id,stime:开始时间,etime:结束时间,patient_id:患者id
- func RefundListSum(orgid, stime, etime, patient_id int64) (sum decimal.Decimal, err error) {
- var depo []models.RefundList
- err = XTReadDB().Model(&models.DepositHistory{}).Where("status = 1 and user_org_id = ? and trial_status = 1 and ctime >= ? and ctime <= ? and deposit_status = 3 and his_patient_id = ? ", orgid, stime, etime, patient_id).Find(&depo).Error
- if err != nil {
- return decimal.NewFromFloat(0), err
- }
- for i := 0; i < len(depo); i++ {
- sum = sum.Add(depo[i].Deposit)
- }
- return
-
- }
|