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 }