muyu-apiserver/rpc/purchase/internal/logic/createpurchasereceiptlogic.go

88 lines
2.3 KiB
Go
Raw Normal View History

package logic
import (
"context"
"database/sql"
"fmt"
"strconv"
"time"
"muyu-apiserver/model"
"muyu-apiserver/pkg/tenantctx"
"muyu-apiserver/pkg/uid"
"muyu-apiserver/rpc/purchase/internal/svc"
"muyu-apiserver/rpc/purchase/pb"
"github.com/zeromicro/go-zero/core/logx"
)
type CreatePurchaseReceiptLogic struct {
ctx context.Context
svcCtx *svc.ServiceContext
logx.Logger
}
func NewCreatePurchaseReceiptLogic(ctx context.Context, svcCtx *svc.ServiceContext) *CreatePurchaseReceiptLogic {
return &CreatePurchaseReceiptLogic{ctx: ctx, svcCtx: svcCtx, Logger: logx.WithContext(ctx)}
}
func (l *CreatePurchaseReceiptLogic) CreatePurchaseReceipt(in *pb.CreatePurchaseReceiptReq) (*pb.IdResp, error) {
tenantId := tenantctx.ExtractTenantId(l.ctx)
order, err := l.svcCtx.OrderModel.FindOneByOrderId(l.ctx, in.OrderId)
if err != nil {
return nil, ErrOrderNotFound
}
if order.Status != 1 {
return nil, ErrOrderNotConfirmed
}
// Generate receipt number
today := time.Now().Format("20060102")
count, err := l.svcCtx.ReceiptModel.CountTodayReceipts(l.ctx, tenantId, time.Now().Format("2006-01-02"))
if err != nil {
return nil, err
}
receiptNo := fmt.Sprintf("REC-%s-%04d", today, count+1)
receiptDate, err := time.Parse("2006-01-02", in.ReceiptDate)
if err != nil {
receiptDate = time.Now()
}
receiptId := uid.Generate()
_, err = l.svcCtx.ReceiptModel.Insert(l.ctx, &model.PurPurchaseReceipt{
ReceiptId: receiptId,
TenantId: tenantId,
ReceiptNo: receiptNo,
OrderId: in.OrderId,
ReceiptDate: receiptDate,
ReceivedBy: in.ReceivedBy,
Status: 0, // draft
Remark: sql.NullString{String: in.Remark, Valid: in.Remark != ""},
})
if err != nil {
return nil, err
}
details := make([]*model.PurPurchaseReceiptDetail, 0, len(in.Details))
for _, d := range in.Details {
qty, _ := strconv.ParseFloat(d.ActualQty, 64)
cost, _ := strconv.ParseFloat(d.UnitCost, 64)
details = append(details, &model.PurPurchaseReceiptDetail{
DetailId: uid.Generate(),
ReceiptId: receiptId,
OrderDetailId: d.OrderDetailId,
ProductId: d.ProductId,
ActualQty: qty,
UnitCost: cost,
Remark: sql.NullString{String: d.Remark, Valid: d.Remark != ""},
})
}
if err := l.svcCtx.ReceiptDetailModel.BulkInsert(l.ctx, details); err != nil {
return nil, err
}
return &pb.IdResp{Id: receiptId}, nil
}