Files
assets/service/stock/unit_conversion_service.go
2026-03-18 10:18:03 +08:00

104 lines
2.6 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
// unit_conversion_service.go
// 单位换算服务层
//
// 职责:
// 1. GetConversionFactor - 获取单位换算系数
// 查询UnitConversion表返回fromUnit→toUnit的换算系数
//
// 2. ConvertWithCeil - 向上取整换算(用于容量计算)
// 公式ceil(fromQty / factor)
// 示例50瓶 ÷ 20瓶/箱)= 2.5 → ceil = 3箱
//
// 3. ConvertExact - 精确换算(用于出入库数量计算)
// 公式fromQty / factor
// 示例50瓶 ÷ 20瓶/箱)= 2.5箱
//
// 核心逻辑:
// - 从UnitConversion表查询换算系数
// - 向上取整确保不满一个单位也占用空间
// - 只能在同一CapacityUnitType枚举类型内换算
import (
dao "assets/dao/stock"
dto "assets/model/dto/stock"
entity "assets/model/entity/stock"
"context"
"gitea.com/red-future/common/utils"
"go.mongodb.org/mongo-driver/v2/bson"
)
var UnitConversion = new(unitConversion)
type unitConversion struct{}
// Create 创建单位换算规则
func (s *unitConversion) Create(ctx context.Context, req *dto.CreateUnitConversionReq) (res *dto.CreateUnitConversionRes, err error) {
var conversion *entity.UnitConversion
if err = utils.Struct(req, &conversion); err != nil {
return
}
ids, err := dao.UnitConversion.Insert(ctx, conversion)
if err != nil {
return
}
id := ids[0].(bson.ObjectID)
res = &dto.CreateUnitConversionRes{
Id: &id,
}
return
}
// Update 更新单位换算规则
func (s *unitConversion) Update(ctx context.Context, req *dto.UpdateUnitConversionReq) (err error) {
update := bson.M{}
if req.ConversionCode != "" {
update["conversionCode"] = req.ConversionCode
}
if req.ConversionName != "" {
update["conversionName"] = req.ConversionName
}
if req.UnitType != "" {
update["unitType"] = req.UnitType
}
if req.FromUnit != "" {
update["fromUnit"] = req.FromUnit
}
if req.ToUnit != "" {
update["toUnit"] = req.ToUnit
}
if req.ConversionFactor > 0 {
update["conversionFactor"] = req.ConversionFactor
}
if req.Remark != "" {
update["remark"] = req.Remark
}
err = dao.UnitConversion.Update(ctx, req.Id, update)
return
}
// Delete 删除单位换算规则
func (s *unitConversion) Delete(ctx context.Context, req *dto.DeleteUnitConversionReq) (err error) {
err = dao.UnitConversion.DeleteFake(ctx, req.Id)
return
}
// List 查询单位换算列表
func (s *unitConversion) List(ctx context.Context, req *dto.ListUnitConversionReq) (res *dto.ListUnitConversionRes, err error) {
list, err := dao.UnitConversion.List(ctx, req.UnitType, req.FromUnit, req.ToUnit)
if err != nil {
return
}
res = &dto.ListUnitConversionRes{
List: list,
}
return
}