100 lines
3.4 KiB
Python
100 lines
3.4 KiB
Python
|
|
|
||
|
|
from math import ceil
|
||
|
|
def data_to_package(package_data):
|
||
|
|
"""
|
||
|
|
输入{"包裹1": {"宽": 20.0, "长": 200.0, "高": 20.0, "重量": 7500}, "包裹2": {"宽": 15.0, "长": 150.0, "高": 15.0, "重量": 5000}}
|
||
|
|
返回一个packages对象
|
||
|
|
"""
|
||
|
|
packages = Package_group()
|
||
|
|
for name, data in package_data.items():
|
||
|
|
package = Package(name, data["长"],data["宽"], data["高"], data["重量"])
|
||
|
|
packages.add_package(package)
|
||
|
|
return packages
|
||
|
|
|
||
|
|
class Package:
|
||
|
|
def __init__(self,name, length, width, height, weight):
|
||
|
|
self.length = length
|
||
|
|
self.width = width
|
||
|
|
self.height = height
|
||
|
|
self.weight = weight
|
||
|
|
self.name = name
|
||
|
|
sizes = sorted([self.length, self.width, self.height])
|
||
|
|
self.fst_size = sizes[2]
|
||
|
|
self.sed_size = sizes[1]
|
||
|
|
self.trd_size = sizes[0]
|
||
|
|
self.girth = (self.sed_size + self.trd_size) * 2 + self.fst_size
|
||
|
|
self.volume = self.length * self.width * self.height
|
||
|
|
self.size_sum = self.fst_size + self.sed_size + self.trd_size # 三边和
|
||
|
|
self.density = ceil(self.weight / self.volume * 1000)
|
||
|
|
|
||
|
|
self.fst_inch = self.fst_size * 0.3937
|
||
|
|
self.sed_inch = self.sed_size * 0.3937
|
||
|
|
self.trd_inch = self.trd_size * 0.3937
|
||
|
|
self.girth_inch = self.girth * 0.3937
|
||
|
|
self.volume_inch = self.fst_inch *self.sed_inch*self.trd_inch
|
||
|
|
self.lbs_weight = self.weight/1000 * 2.2046
|
||
|
|
|
||
|
|
def get_volume_weight(self, volume_weight_ratio):
|
||
|
|
volume_weight = (self.length * self.width * self.height) / volume_weight_ratio
|
||
|
|
return volume_weight
|
||
|
|
def __repr__(self):
|
||
|
|
result = "{"
|
||
|
|
result += f"\"长\":{self.length}, \"宽\"{self.width}, \"高\"{self.height}, \"重量\"{self.weight}"
|
||
|
|
result +="}"
|
||
|
|
return result
|
||
|
|
|
||
|
|
class PackageLogistics(Package):
|
||
|
|
def __init__(self, length, width, height, weight,convey,company):
|
||
|
|
super().__init__(length,width,height,weight)
|
||
|
|
self.company = company
|
||
|
|
self.convey = convey
|
||
|
|
|
||
|
|
class Package_group:
|
||
|
|
def __init__(self, packages=None):
|
||
|
|
self.packages = packages if packages else []
|
||
|
|
self.volume_weight_key = None # 用于存储体积重系数的键
|
||
|
|
self.density = self.density()
|
||
|
|
|
||
|
|
def add_package(self, package):
|
||
|
|
self.packages.append(package)
|
||
|
|
|
||
|
|
# 设置体积重系数的键
|
||
|
|
def set_volume_weight_key(self, key):
|
||
|
|
self.volume_weight_key = key
|
||
|
|
|
||
|
|
def total_volume_weight(self):
|
||
|
|
total_volume_weight = 0
|
||
|
|
for package in self.packages:
|
||
|
|
if self.volume_weight_key: # 如果设置了体积重系数的键
|
||
|
|
volume_weight = package[self.volume_weight_key]
|
||
|
|
total_volume_weight += volume_weight
|
||
|
|
return total_volume_weight
|
||
|
|
|
||
|
|
def density(self):
|
||
|
|
volume = 0
|
||
|
|
weight = 0
|
||
|
|
density = 0
|
||
|
|
for package in self.packages:
|
||
|
|
volume += package.length * package.width * package.height
|
||
|
|
weight += package.weight
|
||
|
|
density = ceil(weight / volume * 1000)
|
||
|
|
return density
|
||
|
|
|
||
|
|
def __iter__(self):
|
||
|
|
return iter(self.packages)
|
||
|
|
|
||
|
|
def __len__(self):
|
||
|
|
return len(self.packages)
|
||
|
|
def __repr__(self):
|
||
|
|
result = "{"
|
||
|
|
i=1
|
||
|
|
for package in self.packages:
|
||
|
|
result +=f"\"包裹{i}\": {package.__repr__()}"
|
||
|
|
i+=1
|
||
|
|
if i>len(self.packages):
|
||
|
|
break
|
||
|
|
result += ","
|
||
|
|
result += "}"
|
||
|
|
return result
|
||
|
|
|