104 lines
2.6 KiB
Go
104 lines
2.6 KiB
Go
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
|
||
}
|