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

91 lines
2.6 KiB
Go
Raw Permalink Normal View History

package logic
import (
"context"
"database/sql"
"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 ConfirmPurchaseReceiptLogic struct {
ctx context.Context
svcCtx *svc.ServiceContext
logx.Logger
}
func NewConfirmPurchaseReceiptLogic(ctx context.Context, svcCtx *svc.ServiceContext) *ConfirmPurchaseReceiptLogic {
return &ConfirmPurchaseReceiptLogic{ctx: ctx, svcCtx: svcCtx, Logger: logx.WithContext(ctx)}
}
func (l *ConfirmPurchaseReceiptLogic) ConfirmPurchaseReceipt(in *pb.ConfirmPurchaseReceiptReq) (*pb.Empty, error) {
tenantId := tenantctx.ExtractTenantId(l.ctx)
receipt, err := l.svcCtx.ReceiptModel.FindOneByReceiptId(l.ctx, in.ReceiptId)
if err != nil {
return nil, ErrReceiptNotFound
}
if receipt.Status == 1 {
return nil, ErrReceiptAlreadyConfirmed
}
receipt.Status = 1
if err := l.svcCtx.ReceiptModel.Update(l.ctx, receipt); err != nil {
return nil, err
}
// Load receipt details and update order detail received_qty + write inventory logs
details, err := l.svcCtx.ReceiptDetailModel.FindByReceiptId(l.ctx, in.ReceiptId)
if err != nil {
return nil, err
}
var totalQty float64
for _, d := range details {
totalQty += d.ActualQty
// Update order detail received_qty
if err := l.svcCtx.OrderDetailModel.UpdateReceivedQty(l.ctx, d.OrderDetailId, d.ActualQty); err != nil {
l.Errorf("update order detail received_qty failed: %v", err)
}
// Write InventoryLog
_, err = l.svcCtx.InventoryLogModel.Insert(l.ctx, &model.InvInventoryLog{
LogId: uid.Generate(),
TenantId: tenantId,
ProductId: d.ProductId,
ChangeQty: d.ActualQty,
ChangeType: 1, // purchase receipt
RefType: "PURCHASE",
RefId: in.ReceiptId,
ContactId: receipt.OrderId,
LogDate: time.Now(),
Operator: tenantId,
Remark: sql.NullString{String: receipt.ReceiptNo, Valid: true},
})
if err != nil {
l.Errorf("write inventory log failed: %v", err)
}
}
// Update order received_qty and receipt_status
if err := l.svcCtx.OrderModel.UpdateReceiptProgress(l.ctx, receipt.OrderId, totalQty); err != nil {
l.Errorf("update order receipt progress failed: %v", err)
}
// Update supplier delivered_qty
if order, err := l.svcCtx.OrderModel.FindOneByOrderId(l.ctx, receipt.OrderId); err == nil {
if err := l.svcCtx.SupplierModel.UpdateStats(l.ctx, order.SupplierId, 0, 0, 0, totalQty); err != nil {
l.Errorf("update supplier delivered_qty failed: %v", err)
}
}
return &pb.Empty{}, nil
}