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 }