package settle_account_main import ( "dashoo.cn/micro_libary/request" "errors" "fmt" "github.com/gogf/gf/os/gtime" "github.com/gogf/gf/util/gconv" "lims_adapter/dao/account" "lims_adapter/model" accountModel "lims_adapter/model/account" "strconv" ) // Service 会议室服务 type Service struct { Dao *account.SettleAccountMainDao Tenant string } // NewSrv 服务初始化 func NewService(tenant string) Service { return Service{Dao: account.NewSettleAccountMainDao(tenant), Tenant: tenant} } // List 结算明细 func (s Service) List(req model.ListReq) ([]accountModel.SettleAccountMain, int, error) { entityModel := s.Dao.M where := "1=1" if req.Entity != nil { entity := new(accountModel.SettleAccountMainReq) err := gconv.Struct(req.Entity, entity) if err != nil { return nil, 0, err } if entity.MainUserId != 0 { where += fmt.Sprintf(" AND MainUserId='%v'", entity.MainUserId) } if entity.MainUser != "" { where += fmt.Sprintf(" AND MainUser LIKE '%%%v%%'", entity.MainUser) } if entity.AttachUserId != 0 { where += fmt.Sprintf(" AND AttachUserId='%v'", entity.AttachUserId) } if entity.AttachUser != "" { where += fmt.Sprintf(" AND AttachUser LIKE '%%%v%%'", entity.AttachUser) } if entity.InstrumentId != 0 { where += fmt.Sprintf(" AND InstrumentId='%v'", entity.InstrumentId) } if entity.InstrumentName != "" { where += fmt.Sprintf(" AND InstrumentName LIKE '%%%v%%'", entity.InstrumentName) } if entity.AppointUserId != 0 { where += fmt.Sprintf(" AND AppointUserId='%v'", entity.AppointUserId) } if entity.AppointUser != "" { where += fmt.Sprintf(" AND AppointUser LIKE '%%%v%%'", entity.AppointUser) } if entity.Status != "" { where += fmt.Sprintf(" AND Status='%v'", entity.Status) } if entity.SettleStatus != "" { where += fmt.Sprintf(" AND SettleStatus='%v'", entity.SettleStatus) } if entity.SettleUser != "" { where += fmt.Sprintf(" AND SettleUser LIKE '%%%v%%'", entity.SettleUser) } if entity.FeeType != "" { where += fmt.Sprintf(" AND FeeType='%v'", entity.FeeType) } if entity.AppointStartDate != "" && entity.AppointEndDate != "" { where += fmt.Sprintf(" AND AppointStartDate>'%v' AND AppointEndDate<'%v'", entity.AppointStartDate, entity.AppointEndDate) } } entityModel = entityModel.Where(where) total, err := entityModel.Count() if err != nil { return nil, 0, err } if total == 0 { return nil, 0, nil } res, err := entityModel.Page(req.Current, req.Size).Order("settle_account_main.CreateOn DESC").Fields("settle_account_main.*").FindAll() if err != nil { return nil, 0, err } if res.IsEmpty() { return nil, 0, nil } list := make([]accountModel.SettleAccountMain, 0) err = res.Structs(&list) if err != nil { return nil, 0, err } return list, total, nil } // 新增 func (s Service) Add(req accountModel.AccountMainAddReq, user request.UserInfo) error { now := gtime.Now() // 获取当前时间 var baseAccount accountModel.BaseAccount // 更新必要信息 req.Main.CreateUserId = int(user.Id) req.Main.CreateBy = user.RealName req.Main.CreateOn = now req.Main.UpdateUserId = int(user.Id) req.Main.UpdateBy = user.RealName req.Main.UpdateOn = now // 获取账户 result1, err := s.Dao.DB.Model("base_account").Where(fmt.Sprintf("MainUserId='%v'", req.Main.MainUserId)).Order("Advance ASC").FindOne() if err != nil { return err } err = result1.Struct(&baseAccount) if err != nil { return err } baseAccount.Available -= req.Main.TotalPrice // 账户可用金额计算 tx, err := s.Dao.DB.Begin() if err != nil { return err } result, err := tx.Insert("settle_account_main", req.Main) if err != nil { tx.Rollback() return err } id , _ := result.LastInsertId() for index := range req.Details { // 更新必要信息 req.Details[index].CreateUserId = int(user.Id) req.Details[index].CreateBy = user.RealName req.Details[index].CreateOn = now req.Details[index].UpdateUserId = int(user.Id) req.Details[index].UpdateBy = user.RealName req.Details[index].UpdateOn = now req.Details[index].Pid = int(id) } _, err = tx.Insert("settle_account_detail", req.Details) if err != nil { tx.Rollback() return err } _, err = tx.Save("base_account", baseAccount) if err != nil { tx.Rollback() return err } return tx.Commit() } // 确认 func (s Service) Confirm(req accountModel.AccountMainConfirmReq, user request.UserInfo) error { if req.MainId == 0 { return errors.New("参数缺失") } _, err := s.Dao.M.Update(fmt.Sprintf("SettleStatus='1',SettleUserId='%v',SettleUser='%v',SettleDate='%v'", user.Id, user.RealName, gtime.Now()), fmt.Sprintf("Id='%v'", req.MainId)) return err } // 预约取消 func (s Service) Cancel(req accountModel.AccountMainCancelReq, user request.UserInfo) error { if req.AppointId == 0 { return errors.New("参数缺失") } var main accountModel.SettleAccountMain var details []accountModel.SettleAccountDetail var baseAccount accountModel.BaseAccount var rules []Param now := gtime.Now() per := float64(0) userNumber := 0 one, err := s.Dao.M.Where(fmt.Sprintf("AppointId='%v'", req.AppointId)).FindOne() if err != nil { return err } err = one.Struct(&main) if err != nil { return err } if main.Id == 0 { // 该预约未生成账单 return nil } all, err := s.Dao.DB.Model("settle_account_detail").Where(fmt.Sprintf("pid='%v' AND PaymentType='0'", main.Id)).FindAll() if err != nil { return err } err = all.Structs(&details) if err != nil { return err } all, err = s.Dao.DB.Model("base_param").Where("Name LIKE '违约计费规则%'").Order("Code ASC").FindAll() if err != nil { return err } err = all.Structs(&rules) if err != nil { return err } // 计算当前机器占用数量 userNumber, err = s.Dao.DB.Model("appointment").Where(fmt.Sprintf("RelevanceId='%v' AND SignInTime IS NOT NULL AND SignOutTime IS NULL", main.InstrumentId)).Count() if err != nil { return err } // 获取账户 result1, err := s.Dao.DB.Model("base_account").Where(fmt.Sprintf("MainUserId='%v'", main.MainUserId)).Order("Advance ASC").FindOne() if err != nil { return err } err = result1.Struct(&baseAccount) if err != nil { return err } var detail accountModel.SettleAccountDetail detail.PaymentType = "1" detail.PaymentAccount = 0 detail.Data1 = main.AppointStartDate.Format("Y-m-d H:m:s") detail.Data2 = main.AppointEndDate.Format("Y-m-d H:m:s") detail.Data3 = now.Format("Y-m-d H:m:s") // 取消时间 mins := now.Sub(main.AppointStartDate).Minutes() if mins > 0 { // 正向超时,计算违约收费 r := "" for _, rule := range rules { value1, _ := strconv.ParseFloat(rule.Code, 64) if mins < value1 { per, _ := strconv.ParseFloat(rule.Value, 64) per /= 100 r += rule.Code + "分钟内" + rule.Value + "%" } } detail.Data4 = r // 扣费规则 } else { detail.Data4 = "已开始之后取消,100%" // 扣费规则 per = 1 } if userNumber > 0 { // 机器被占用,机器被占用,取消不扣费 detail.Data4 = "机器被占用,取消不扣费" per = 0 } main.ActualMachineHour = 0 for _, item := range details { detail.PaymentAccount += item.PaymentAccount * per } oldAmount := main.TotalPrice main.TotalPrice = detail.PaymentAccount diffValue := oldAmount - detail.PaymentAccount baseAccount.Available += diffValue // 账户可用金额返还 tx, err := s.Dao.DB.Begin() if err != nil { return err } // 更新账单明细信息 _, err = tx.Save("settle_account_main", main) if err != nil { tx.Rollback() return err } // 计费明细费用设置为0 _, err = tx.Update("settle_account_detail", "PaymentAccount=0", fmt.Sprintf("pid='%v'", main.Id)) if err != nil { tx.Rollback() return err } // 新增违约计费 _, err = tx.Save("settle_account_detail", detail) if err != nil { tx.Rollback() return err } _, err = tx.Save("base_account", baseAccount) if err != nil { tx.Rollback() return err } return tx.Commit() } type Param struct { Id int32 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"` Code string `protobuf:"bytes,2,opt,name=code,proto3" json:"code,omitempty"` Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` Value string `protobuf:"bytes,4,opt,name=value,proto3" json:"value,omitempty"` Sys string `protobuf:"bytes,5,opt,name=sys,proto3" json:"sys"` SortCode int32 `protobuf:"varint,6,opt,name=sort_code,json=sortCode,proto3" json:"sort_code"` Description string `protobuf:"bytes,7,opt,name=description,proto3" json:"description,omitempty"` CreateOn string `protobuf:"bytes,8,opt,name=create_on,json=createOn,proto3" json:"create_on,omitempty"` CreateUserId int32 `protobuf:"varint,9,opt,name=create_user_id,json=createUserId,proto3" json:"create_user_id,omitempty"` CreateBy string `protobuf:"bytes,10,opt,name=create_by,json=createBy,proto3" json:"create_by,omitempty"` ModifiedOn string `protobuf:"bytes,11,opt,name=modified_on,json=modifiedOn,proto3" json:"modified_on,omitempty"` ModifiedUserId int32 `protobuf:"varint,12,opt,name=modified_user_id,json=modifiedUserId,proto3" json:"modified_user_id,omitempty"` ModifiedBy string `protobuf:"bytes,13,opt,name=modified_by,json=modifiedBy,proto3" json:"modified_by,omitempty"` }