package user import ( "SciencesServer/app/api/enterprise/model" "SciencesServer/app/basic/controller" model2 "SciencesServer/app/common/model" "SciencesServer/app/session" "SciencesServer/serve/orm" "errors" "gorm.io/gorm" "strings" "time" ) type Bill struct { *session.Enterprise } type BillHandle func(session *session.Enterprise) *Bill type ( // BillTicketInfo 账单发票信息 BillTicketInfo struct { ID string `json:"id"` *model2.UserBillTicket } // BillTicketParams 账单发票参数信息 BillTicketParams struct { Kind int Name, DutyParagraph, Mobile, Email, Address string } ) // Instance 账单信息 func (c *Bill) Instance(orderNo, createdAt string, page, pageSize int) (*controller.ReturnPages, error) { mUserBill := model.NewUserBill() where := []*model2.ModelWhere{ model2.NewWhere("b.uid", c.UID), } if orderNo != "" { where = append(where, model2.NewWhere("b.order_no", orderNo)) } if createdAt != "" { where = append(where, model2.NewWhereSectionAt("b.created_at", strings.Split(createdAt, " ~ "))...) } var count int64 out, err := mUserBill.Bill(page, pageSize, &count, where...) if err != nil { return nil, err } return &controller.ReturnPages{Data: out, Count: count}, nil } // Ticket 发票信息 func (c *Bill) Ticket(id uint64) (*BillTicketInfo, error) { mUserBillTicket := model.NewUserBillTicket() isExist, err := model2.FirstWhere(mUserBillTicket.UserBillTicket, model2.NewWhere("user_bill_id", id)) if err != nil { return nil, err } else if !isExist { return nil, nil } return &BillTicketInfo{ ID: mUserBillTicket.GetEncodeID(), UserBillTicket: mUserBillTicket.UserBillTicket, }, nil } // TicketIssue 发票开具 func (c *Bill) TicketIssue(id uint64, params *BillTicketParams) error { mUserBill := model.NewUserBill() mUserBill.ID = id isExist, err := model2.FirstField(mUserBill.UserBill, []string{"id", "bill_id", "user_id"}) if err != nil { return err } else if !isExist { return errors.New("操作错误,账单信息不存在或已被删除") } else if mUserBill.UID != c.UID { return errors.New("操作错误,不可开具他人账单发票信息") } // 用户账单信息 mUserBillTicket := model.NewUserBillTicket() var count int64 if err = model2.Count(mUserBillTicket.UserBillTicket, &count, model2.NewWhere("user_bill_id", mUserBill.ID)); err != nil { return err } else if count > 0 { return errors.New("操作错误,当前账单已开具发票") } return orm.GetDB().Transaction(func(tx *gorm.DB) error { mUserBillTicket.UserBillID = mUserBill.ID mUserBillTicket.Kind = model2.UserBillTicketKind(params.Kind) mUserBillTicket.Name = params.Name mUserBillTicket.DutyParagraph = params.DutyParagraph mUserBillTicket.Mobile = params.Mobile mUserBillTicket.Email = params.Email mUserBillTicket.Address = params.Address if err = model2.Create(mUserBillTicket.UserBillTicket, tx); err != nil { return err } mBillInstance := model.NewBillInstance() mBillInstance.ID = mUserBill.BillID return model2.Updates(mBillInstance.BillInstance, map[string]interface{}{ "status": model2.BillInstanceStatusForApply, "updated_at": time.Now(), }, tx) }) } func NewBill() BillHandle { return func(session *session.Enterprise) *Bill { return &Bill{session} } }