Pull latest changes from upstream/main (GitHub) including: - Purchase RPC service (proto, server, logic, models) - Gateway route updates for purchase endpoints - SQL migration and config updates Excludes deploy/bin/ pre-compiled arm64 binaries (builds use multi-stage Dockerfiles targeting amd64).
91 lines
2.6 KiB
Go
91 lines
2.6 KiB
Go
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
|
|
}
|