90 lines
3.7 KiB
Python
90 lines
3.7 KiB
Python
from sqlalchemy.orm import Session
|
||
from sqlalchemy import func
|
||
from typing import List
|
||
import logging
|
||
|
||
from app.models.location import TAppLocation
|
||
from app.schemas.location import LocationQueryRequest
|
||
from app.schemas.common import BaseWmsApiResponse, WmsApiResponse
|
||
from app.utils.string_utils import pad_left
|
||
|
||
logger = logging.getLogger(__name__)
|
||
|
||
|
||
class LocationService:
|
||
|
||
def __init__(self, db: Session):
|
||
self.db = db
|
||
|
||
def gen_locations(self, location_query: LocationQueryRequest) -> BaseWmsApiResponse:
|
||
try:
|
||
new_location_list: List[TAppLocation] = []
|
||
|
||
for row in range(1, location_query.l_row + 1):
|
||
for col in range(1, location_query.l_col + 1):
|
||
for layer in range(1, location_query.l_layer + 1):
|
||
for depth in range(1, location_query.l_depth + 1):
|
||
# 生成库位ID,格式:子区域 + 行(2位) + "-" + 列(2位) + "-" + 层(2位) + "-" + 深度(2位)
|
||
location_id = (
|
||
f"{location_query.sub_area}"
|
||
f"{pad_left(str(row), '0', 2)}-"
|
||
f"{pad_left(str(col), '0', 2)}-"
|
||
f"{pad_left(str(layer), '0', 2)}-"
|
||
f"{pad_left(str(depth), '0', 2)}"
|
||
)
|
||
|
||
new_location = TAppLocation(
|
||
location_id=location_id,
|
||
location_name="",
|
||
location_type=1,
|
||
is_occupy=0,
|
||
is_enable=0,
|
||
equipment_id=0,
|
||
aisle_num_left=(row + 1) // 2,
|
||
aisle_num_right=(row + 1) // 2,
|
||
l_row=row,
|
||
l_col=col,
|
||
l_layer=layer,
|
||
l_depth=depth,
|
||
remark="",
|
||
area_id=location_query.area_id if location_query.area_id is not None else 1,
|
||
sub_area=location_query.sub_area
|
||
)
|
||
new_location_list.append(new_location)
|
||
|
||
self.db.add_all(new_location_list)
|
||
self.db.commit()
|
||
|
||
logger.info(f"成功创建了{len(new_location_list)}个库位")
|
||
return BaseWmsApiResponse.success(f"成功创建了{len(new_location_list)}个库位。")
|
||
|
||
except Exception as e:
|
||
self.db.rollback()
|
||
logger.error(f"创建库位失败: {str(e)}")
|
||
return BaseWmsApiResponse.error(f"创建库位失败: {str(e)}")
|
||
|
||
def get_used_locations(self, equipment_id: int, location_type: int) -> WmsApiResponse:
|
||
try:
|
||
count = self.db.query(func.count(TAppLocation.location_id)).filter(
|
||
TAppLocation.equipment_id == equipment_id,
|
||
TAppLocation.location_type == location_type,
|
||
TAppLocation.is_occupy == 1
|
||
).scalar()
|
||
|
||
# 确保count不为None
|
||
if count is None:
|
||
count = 0
|
||
|
||
return WmsApiResponse.success(data=count, message="查询成功")
|
||
|
||
except Exception as e:
|
||
# 打印完整异常信息(包含堆栈)
|
||
logger.exception("查询已使用库位时发生异常")
|
||
|
||
# 返回错误响应 - 也使用直接实例化
|
||
return WmsApiResponse.error(
|
||
code=500,
|
||
message=f"查询失败: {type(e).__name__}",
|
||
data=None
|
||
)
|