Files
assets/service/stock/unit_conversion_service.go

104 lines
2.6 KiB
Go
Raw Normal View History

2026-03-18 10:18:03 +08:00
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"
2026-06-10 15:40:17 +08:00
"gitea.redpowerfuture.com/red-future/common/utils"
2026-03-18 10:18:03 +08:00
"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
}