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
|
|||
|
|
}
|