350 lines
12 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package service
import (
"fmt"
"github.com/shopspring/decimal"
"hospital-admin-api/api/dao"
"hospital-admin-api/api/model"
"hospital-admin-api/extend/aliyun"
"hospital-admin-api/utils"
"math/rand"
"time"
)
// ExportService 导出
type ExportService struct {
}
// DoctorWithdrawalData 提现记录数据
type DoctorWithdrawalData struct {
WithdrawalId string // 提现编号
DoctorName string // 医生姓名
Mobile string // 医生手机号
DoctorCardNum string // 医生证件号码
AppliedWithdrawalAmount float64 // 提现金额
ActualWithdrawalAmount float64 // 实际提现金额
IncomeTax float64 // 提现所得税金额
BankName string // 提现银行名称
BankCardCode string // 银行卡号
BankCardAddress string // 银行地址
ExamineStatus string // 审核状态1:审核中 2:审核通过 3:审核未通过)
ExamineFailReason string // 审核失败原因
ExamineTime time.Time // 审核日期
ExamineBy string // 审核人员名称
PaymentStatus string // 财务打款状态0:否 1:是)
PaymentTime time.Time // 财务打款时间
PaymentBy string // 财务打款人员id后台用户id
CreatedAt time.Time // 创建时间
}
type DoctorWithdrawalOrderData struct {
DoctorName string // 医生姓名
PatientName string // 患者姓名-就诊人
PatientSex string // 患者性别-就诊人0:未知 1:男 2:女)
PatientAge string // 患者年龄-就诊人
PatientMobile string // 患者电话
PayChannel string // 支付渠道1:小程序支付 2:微信扫码支付 3:模拟支付)
PayTime time.Time // 支付时间
InquiryNo string // 系统订单编号
EscrowTradeNo string // 第三方支付流水号
InquiryStatus string // 问诊订单状态1:待支付 2:待分配 3:待接诊 4:已接诊 5:已完成 6:已结束 7:已取消)
AmountTotal float64 // 订单金额
CouponAmountTotal float64 // 优惠卷金额
PaymentAmountTotal float64 // 实际付款金额
DoctorAmount float64 // 医生收益
}
// DoctorWithdrawal 提现记录
func (r *ExportService) DoctorWithdrawal(doctorWithdrawals []*model.DoctorWithdrawal) (string, error) {
header := []utils.HeaderCellData{
{Value: "提现编号", CellType: "string", NumberFmt: "", ColWidth: 25},
{Value: "医生姓名", CellType: "string", NumberFmt: "", ColWidth: 18},
{Value: "医生手机号", CellType: "string", NumberFmt: "", ColWidth: 18},
{Value: "医生证件号码", CellType: "string", NumberFmt: "", ColWidth: 25},
{Value: "申请提现金额", CellType: "float", NumberFmt: "0.0000", ColWidth: 18},
{Value: "实际提现金额", CellType: "float", NumberFmt: "0.0000", ColWidth: 18},
{Value: "个人所得税", CellType: "float", NumberFmt: "0.0000", ColWidth: 18},
{Value: "银行名称", CellType: "string", NumberFmt: "", ColWidth: 25},
{Value: "银行卡号", CellType: "string", NumberFmt: "", ColWidth: 27},
{Value: "银行地址", CellType: "string", NumberFmt: "", ColWidth: 46},
{Value: "审核状态", CellType: "string", NumberFmt: "", ColWidth: 18},
{Value: "审核失败原因", CellType: "string", NumberFmt: "", ColWidth: 33},
{Value: "审核日期", CellType: "date", NumberFmt: "yyyy-mm-dd hh:mm:ss", ColWidth: 30},
{Value: "审核人员", CellType: "string", NumberFmt: "", ColWidth: 18},
{Value: "打款状态", CellType: "string", NumberFmt: "", ColWidth: 18},
{Value: "打款时间", CellType: "date", NumberFmt: "yyyy-mm-dd hh:mm:ss", ColWidth: 30},
{Value: "打款人员", CellType: "string", NumberFmt: "", ColWidth: 18},
{Value: "申请时间", CellType: "date", NumberFmt: "yyyy-mm-dd hh:mm:ss", ColWidth: 30},
}
var interfaceSlice []interface{}
for _, v := range doctorWithdrawals {
// 审核状态
examineStatus := "未知"
if v.ExamineStatus == 1 {
examineStatus = "审核中"
} else if v.ExamineStatus == 2 {
examineStatus = "审核通过"
} else if v.ExamineStatus == 3 {
examineStatus = "审核未通过"
}
// 审核人员
examineBy := ""
if v.ExamineBy != 0 {
adminUserDao := dao.AdminUserDao{}
adminUser, err := adminUserDao.GetAdminUserFirstById(v.ExamineBy)
if err == nil && adminUser != nil {
examineBy = adminUser.NickName
}
}
// 打款状态
paymentStatus := "未知"
if v.PaymentStatus == 0 {
paymentStatus = "未打款"
} else if v.ExamineStatus == 1 {
paymentStatus = "已打款"
}
// 打款人员
paymentBy := ""
if v.PaymentBy != 0 {
adminUserDao := dao.AdminUserDao{}
adminUser, err := adminUserDao.GetAdminUserFirstById(v.PaymentBy)
if err == nil && adminUser != nil {
paymentBy = adminUser.NickName
}
}
// 银行名称
bankName := "未知"
if v.DoctorWithdrawalBank != nil {
if v.DoctorWithdrawalBank.BasicBank != nil {
if v.DoctorWithdrawalBank.BasicBank.BankName != "" {
bankName = v.DoctorWithdrawalBank.BasicBank.BankName
}
}
}
// 银行卡号
bankCardCode := "未知"
// 开户行地址
bankCardAddress := ""
if v.DoctorWithdrawalBank != nil {
if v.DoctorWithdrawalBank.BankCardCode != "" {
bankCardCode = v.DoctorWithdrawalBank.BankCardCode
}
bankCardAddress = v.DoctorWithdrawalBank.Province + v.DoctorWithdrawalBank.City + v.DoctorWithdrawalBank.County
}
// 时间处理
var examineTime time.Time
if v.ExamineTime != (model.LocalTime{}) {
t := time.Time(v.ExamineTime)
examineTime = t
}
var paymentTime time.Time
if v.PaymentTime != (model.LocalTime{}) {
t := time.Time(v.PaymentTime)
paymentTime = t
}
var createdAt time.Time
if v.CreatedAt != (model.LocalTime{}) {
t := time.Time(v.CreatedAt)
createdAt = t
}
doctorWithdrawalData := DoctorWithdrawalData{
WithdrawalId: fmt.Sprintf("%d", v.WithdrawalId),
DoctorName: v.UserDoctor.UserName,
Mobile: v.UserDoctor.User.Mobile,
DoctorCardNum: v.UserDoctor.UserDoctorInfo.CardNum,
AppliedWithdrawalAmount: v.AppliedWithdrawalAmount,
ActualWithdrawalAmount: v.ActualWithdrawalAmount,
IncomeTax: v.IncomeTax,
BankName: bankName,
BankCardCode: bankCardCode,
BankCardAddress: bankCardAddress,
ExamineStatus: examineStatus,
ExamineFailReason: v.ExamineFailReason,
ExamineTime: examineTime,
ExamineBy: examineBy,
PaymentStatus: paymentStatus,
PaymentTime: paymentTime,
PaymentBy: paymentBy,
CreatedAt: createdAt,
}
interfaceSlice = append(interfaceSlice, doctorWithdrawalData)
}
file, err := utils.Export(header, interfaceSlice)
if err != nil {
return "", err
}
// 设置文件名字
now := time.Now()
dateTimeString := now.Format("20060102150405") // 当前时间字符串
rand.Seed(time.Now().UnixNano()) // 设置随机数
ossPath := "admin/export/output" + dateTimeString + fmt.Sprintf("%d", rand.Intn(9000)+1000) + ".xlsx"
// 上传oss
_, err = aliyun.PutObjectByte(ossPath, file.Bytes())
if err != nil {
return "", err
}
ossPath = utils.AddOssDomain("/" + ossPath)
return ossPath, nil
}
// DoctorWithdrawalOrder 提现记录-关联订单
func (r *ExportService) DoctorWithdrawalOrder(doctorWithdrawalOrders []*model.DoctorWithdrawalOrder) (string, error) {
header := []utils.HeaderCellData{
{Value: "医生姓名", CellType: "string", NumberFmt: "", ColWidth: 18},
{Value: "就诊人姓名", CellType: "string", NumberFmt: "", ColWidth: 18},
{Value: "就诊人性别", CellType: "string", NumberFmt: "", ColWidth: 18},
{Value: "就诊人年龄", CellType: "string", NumberFmt: "", ColWidth: 18},
{Value: "患者电话", CellType: "string", NumberFmt: "", ColWidth: 20},
{Value: "支付渠道", CellType: "float", NumberFmt: "", ColWidth: 18},
{Value: "支付时间", CellType: "date", NumberFmt: "yyyy-mm-dd hh:mm:ss", ColWidth: 30},
{Value: "系统订单编号", CellType: "string", NumberFmt: "", ColWidth: 30},
{Value: "第三方支付流水号", CellType: "string", NumberFmt: "", ColWidth: 30},
{Value: "订单状态", CellType: "string", NumberFmt: "", ColWidth: 18},
{Value: "订单金额", CellType: "float", NumberFmt: "0.0000", ColWidth: 18},
{Value: "优惠卷金额", CellType: "float", NumberFmt: "0.0000", ColWidth: 18},
{Value: "付款金额", CellType: "float", NumberFmt: "0.0000", ColWidth: 18},
{Value: "医生收益", CellType: "float", NumberFmt: "0.0000", ColWidth: 18},
}
var interfaceSlice []interface{}
for _, v := range doctorWithdrawalOrders {
// 医生姓名
doctorName := ""
if v.UserDoctor != nil {
doctorName = v.UserDoctor.UserName
}
// 就诊人数据
patientName := "未知"
patientSex := ""
patientAge := ""
patientMobile := ""
payChannel := "未知"
inquiryNo := "未知"
escrowTradeNo := "未知"
inquiryStatus := "未知"
var amountTotal float64
var couponAmountTotal float64
var paymentAmountTotal float64
var doctorAmount float64
var payTime time.Time
if v.OrderInquiry != nil {
patientName = v.OrderInquiry.PatientName
if v.OrderInquiry.PatientSex == 1 {
patientSex = "男"
} else if v.OrderInquiry.PatientSex == 2 {
patientSex = "女"
}
// 患者年龄
patientAge = fmt.Sprintf("%d", v.OrderInquiry.PatientAge)
// 患者电话
if v.OrderInquiry.User != nil {
patientMobile = v.OrderInquiry.User.Mobile
}
// 支付渠道
if v.OrderInquiry.InquiryPayChannel == 1 {
payChannel = "小程序支付"
} else if v.OrderInquiry.InquiryPayChannel == 2 {
payChannel = "微信扫码支付"
} else if v.OrderInquiry.InquiryPayChannel == 3 {
payChannel = "模拟支付"
}
inquiryNo = v.OrderInquiry.InquiryNo
escrowTradeNo = v.OrderInquiry.EscrowTradeNo
if v.OrderInquiry.InquiryStatus == 1 {
inquiryStatus = "待支付"
} else if v.OrderInquiry.InquiryStatus == 2 {
inquiryStatus = "待分配"
} else if v.OrderInquiry.InquiryStatus == 3 {
inquiryStatus = "待接诊"
} else if v.OrderInquiry.InquiryStatus == 4 {
inquiryStatus = "已接诊"
} else if v.OrderInquiry.InquiryStatus == 5 {
inquiryStatus = "已完成"
} else if v.OrderInquiry.InquiryStatus == 6 {
inquiryStatus = "已结束"
} else if v.OrderInquiry.InquiryStatus == 7 {
inquiryStatus = "已取消"
}
amountTotal = v.OrderInquiry.AmountTotal
couponAmountTotal = v.OrderInquiry.CouponAmountTotal
paymentAmountTotal = v.OrderInquiry.PaymentAmountTotal
// 医生收益
doctorAmount, _ = decimal.NewFromFloat(v.OrderInquiry.AmountTotal).Mul(decimal.NewFromFloat(0.75)).Round(2).Float64()
// 时间处理
if v.OrderInquiry.PayTime != (model.LocalTime{}) {
t := time.Time(v.OrderInquiry.PayTime)
payTime = t
}
}
doctorWithdrawalOrderData := DoctorWithdrawalOrderData{
DoctorName: doctorName,
PatientName: patientName,
PatientSex: patientSex,
PatientAge: patientAge,
PatientMobile: patientMobile,
PayChannel: payChannel,
PayTime: payTime,
InquiryNo: inquiryNo,
EscrowTradeNo: escrowTradeNo,
InquiryStatus: inquiryStatus,
AmountTotal: amountTotal,
CouponAmountTotal: couponAmountTotal,
PaymentAmountTotal: paymentAmountTotal,
DoctorAmount: doctorAmount,
}
interfaceSlice = append(interfaceSlice, doctorWithdrawalOrderData)
}
file, err := utils.Export(header, interfaceSlice)
if err != nil {
return "", err
}
// 设置文件名字
now := time.Now()
dateTimeString := now.Format("20060102150405") // 当前时间字符串
rand.Seed(time.Now().UnixNano()) // 设置随机数
ossPath := "admin/export/output" + dateTimeString + fmt.Sprintf("%d", rand.Intn(9000)+1000) + ".xlsx"
// 上传oss
_, err = aliyun.PutObjectByte(ossPath, file.Bytes())
if err != nil {
return "", err
}
ossPath = utils.AddOssDomain("/" + ossPath)
return ossPath, nil
}