| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199 |
- package account
- import (
- "dashoo.cn/micro_libary/request"
- "database/sql"
- "errors"
- "github.com/gogf/gf/frame/g"
- "github.com/gogf/gf/os/gtime"
- "github.com/gogf/gf/util/gconv"
- dao "lims_adapter/dao/account"
- "lims_adapter/model"
- account "lims_adapter/model/account"
- "strconv"
- )
- // Service 账号相关
- type Service struct {
- Dao *dao.SettleAccountMainDao
- Tenant string
- }
- type AccountService struct {
- Dao *dao.BaseAccountDao
- Tenant string
- }
- // NewSrv 服务初始化
- func NewSrv(tenant string) Service {
- return Service{Dao: dao.NewSettleAccountMainDao(tenant), Tenant: tenant}
- }
- func NewAccountSrv(tenant string) AccountService {
- return AccountService{Dao: dao.NewBaseAccountDao(tenant), Tenant: tenant}
- }
- // 结算明细分页 代码已弃用
- func (s Service) SettleAccountList(req model.ListReq, info request.UserInfo) ([]account.SettleAccountMain, int, error) {
- entityModel := s.Dao.DB.Model("settle_account_main s").
- LeftJoin("appointment a", "s.AppointId = a.Id").
- LeftJoin("Instrument i").
- Fields("s.Id, s.BillId, s.AppointUser, s.MainUser, s.FeeType, s.TotalPrice, ").
- Where("MainUserId = ?", info.Id)
- if req.Entity != nil {
- entity := new(account.SettleAccountMainReq)
- gconv.Struct(req.Entity, entity)
- if strconv.Itoa(entity.AppointUserId) != "" {
- entityModel = entityModel.WhereLike(s.Dao.Columns.AppointUserId, "%"+strconv.Itoa(entity.AppointUserId)+"%")
- }
- if strconv.Itoa(entity.RelevanceId) != "" {
- entityModel = entityModel.WhereLike("RelevanceId", "%"+strconv.Itoa(entity.RelevanceId)+"%")
- }
- }
- total, err := entityModel.Count()
- if err != nil {
- return nil, 0, err
- }
- if total == 0 {
- return nil, 0, nil
- }
- return nil, 0, nil
- res, err := entityModel.Page(req.Current, req.Size).FindAll()
- if err != nil {
- return nil, 0, err
- }
- list := make([]account.SettleAccountMain, 0)
- res.Structs(&list)
- return list, total, nil
- }
- // 新增结算明细主表、明细子表 代码已弃用
- func (s Service) AddCountMainDetail(mobAppoint account.AppointInfoReq) error {
- contractBreach := 1.0
- paymentType := 1
- // TODO 如果是已取消预约,则计算违约费用
- if mobAppoint.Appointment.Appoint.Status == 4 {
- contractBreachEntity := model.ContractBreach{}
- // 计算取消时间与实验开始时间差,选择相应违约规则
- startTime := mobAppoint.Appointment.Appoint.StartTime
- cancelTime := mobAppoint.Appointment.Appoint.UpdateAt
- totalMinute := (startTime.Hour()-cancelTime.Hour())*60 + (startTime.Minute() - cancelTime.Minute())
- if err := s.Dao.DB.Model("contract_breach").
- Where("MinPoint <= ? and MaxPoint >= ?", totalMinute, totalMinute).Scan(&contractBreachEntity); err != nil {
- return err
- }
- contractBreach = contractBreachEntity.Persent
- paymentType = 2
- }
- // 通过设备、用户查询优惠状态
- var result account.AppointInfo
- isDiscount := false
- err := s.Dao.DB.Model("base_equipment_qualification").Fields("Qualification as IsPreferential").
- Where("EquipmentId = " + strconv.Itoa(mobAppoint.Appointment.Instr.Id) + " and Qualification = 3 " +
- " and UserId = " + strconv.Itoa(mobAppoint.Appointment.User.Id)).Scan(&result.User)
- // 如果没有数据,则没有权限
- if err == sql.ErrNoRows {
- // TODO
- } else {
- if result.User.IsPreferential == "3" {
- isDiscount = true
- }
- }
- // 计算实际实验时长、费用,目前为一条明细子表数据,后期可能扩展为多条数据子表数据
- totalMinutes := 0.0
- //signInTime := mobAppoint.Appointment.Appoint.SignInTime
- //hour := mobAppoint.SignOutTime.Hour() - signInTime.Hour()
- //minute := mobAppoint.SignOutTime.Minute() - signInTime.Minute()
- //totalMinute += hour * 60 + minute
- totalMinutes += mobAppoint.Appointment.Appoint.RealityUseDuration * 60
- unitCount := float64(mobAppoint.Appointment.Instr.UnitCount)
- // 有优惠权,则按照优惠计费
- if isDiscount {
- unitCount = unitCount * float64(mobAppoint.Appointment.Instr.UnitCount) / 100
- }
- totalPrice := totalMinutes / 60 * unitCount
- // 生成结算明细主表
- now := gtime.Now()
- var mainEntity = g.Map{
- "AppointId": mobAppoint.Appointment.Appoint.Id,
- "AppointUserId": mobAppoint.Appointment.User.Id,
- "AppointUser": mobAppoint.Appointment.User.Realname,
- "SettleStatus": 1,
- "TotalPrice": totalPrice * contractBreach,
- "CreateUserId": mobAppoint.Appointment.User.Id,
- "CreateBy": mobAppoint.Appointment.User.Realname,
- "CreateOn": now,
- }
- id, err := s.Dao.DB.Model("settle_account_main").InsertAndGetId(mainEntity)
- if err != nil {
- return err
- } else {
- // 生成结算明细子表
- // TODO 判断正常支出或是违约
- var detailEntity = g.Map{
- "pid": id,
- "UnitPrice": unitCount,
- "Minutes": totalMinutes,
- "PaymentType": paymentType,
- "PaymentAccount": totalPrice * contractBreach,
- "CreateUserId": mobAppoint.Appointment.User.Id,
- "CreateBy": mobAppoint.Appointment.User.Realname,
- "CreateOn": now,
- }
- _, err := s.Dao.DB.Model("settle_account_detail").Insert(detailEntity)
- if err != nil {
- return err
- }
- }
- return nil
- }
- // AddAccount 添加财务账号
- func (s Service) AddAccount(req *account.BaseAccount) error {
- count, err := s.Dao.DB.Model("base_account").Where("Account = ?", req.Account).Count()
- if err != nil {
- return err
- }
- if count > 0 {
- return errors.New("该账号已存在,请重新输入!")
- }
- _, err = s.Dao.DB.Model("base_account").Insert(req)
- if err != nil {
- return err
- }
- return nil
- }
- // AccountList 财务账号分页查询
- func (s Service) AccountList(req *account.AccountReq) (infos account.BaseAccountRsp, err error) {
- current := req.PageNun
- size := req.PageSize
- model := s.Dao.DB.Model("base_account a").
- LeftJoin("user_account_bind b", "a.Id = b.AccountId").
- LeftJoin("base_user c", "b.UserId = c.Id")
- if req.Account != "" {
- model = model.WhereLike("Account", req.Account)
- }
- if req.RealName != "" {
- model = model.WhereLike("RealName", req.RealName)
- }
- if req.AccountName != "" {
- model = model.Where("AccountName", req.AccountName)
- }
- infos.Total, err = model.Count()
- if err != nil {
- return infos, err
- }
- err = model.Fields("a.Id, a.Account,a.AccountName,A.Surplus,a.Available,a.Limit,a.Advance,c.Id UserId,c.RealName").Page(current, size).Scan(&infos.Records)
- return infos, nil
- }
- // DepositAccount 充值账户
- func (s AccountService) DepositAccount(req *account.BaseAccountResp) error {
- _, err := s.Dao.M.Update("Surplus = "+strconv.Itoa(req.Surplus), "Id = "+strconv.Itoa(req.Id))
- if err != nil {
- return err
- }
- return nil
- }
|