import random
import pandas as pd
from faker import Faker
from sqlalchemy import create_engine
from datetime import datetime, timedelta
初始化Faker物件,用於生成假資料
fake = Faker()
資料庫連線配置
engine = create_engine('mysql+mysqlconnector://root:456239@localhost:3306/whsw')
生成order_no的規則:X+7月日期(YYMMDD)+三位字母/數字
def generate_order_no_for_july(prefix):
today = '24' # 7月的年份部分,假設是2024年
random_day = random.randint(1, 31) # 隨機選擇7月中的某一天
date_str = f'{today}{random_day:02d}' # 格式化為YYMMDD
random_str = ''.join(random.choices('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', k=3)) # 三位隨機字母或數字
return f"{prefix}{date_str}{random_str}"
生成7月資料的預約單
def generate_demand_orders_july(num):
orders = []
for _ in range(num):
create_date = fake.date_this_year().replace(
month=7,
day=random.randint(1, 31),
) # 確保日期在7月
create_time = datetime.combine(create_date, datetime.min.time()).replace(
hour=random.randint(0, 23),
minute=random.randint(0, 59),
second=random.randint(0, 59)
)
update_time = create_time + timedelta(minutes=random.randint(60, 600)) # 更新時間
dead_line = create_time + timedelta(days=1) # 最晚處理時間為建立時間後的24小時
order = {
'order_no': generate_order_no_for_july('X'),
'status': '2', # 隨機選擇狀態
'create_time': create_time,
'update_time': update_time,
'garbage_type': '0', # 0大件垃圾,1裝修垃圾 這裡大件70,裝修40,大件垃圾多一個大件型別
'area_code': '', # 示例地址,你可以隨機生成或修改
'dead_line': dead_line,
'enterprise_code': '1',
'committer_name': '使用者 13814816131', # 預設提交人
'user_id': '7', # 預設使用者ID
'role_number': '1', # 隨機角色編號
'contact_number': '13814816131', # 預設聯絡電話
'volume': fake.random_int(min=1, max=100), # 隨機生成預估體積
'weight': fake.random_int(min=1, max=100), # 隨機生成預估重量
'remark': '', # 可為空
'large_type': '110', # 隨機選擇大件型別
'demand_type': random.choice(['0', '1']), # 0按數量,1按車次
'quantity': random.randint(1, 10), # 隨機生成數量
'address': '江蘇省蘇州市吳江區227複線', # 詳細地址,你可以隨機生成
'floor': random.randint(1, 20), # 隨機生成樓層
'elevator_flag': random.choice(['0', '1']), # 隨機選擇是否有電梯
'park_flag': random.choice(['0', '1']), # 隨機選擇是否可以停車
'work_no': '', # 來自對應的工單表的工單編號
'order_type': random.choice(['0', '1']), # 預約方式 0電話1小程式
'photo_url': '', # 可為空
'lng': '120.67205', # 示例經度
'lat': '31.103535', # 示例緯度
'evaluate': '', # 可為空
'comment': '', # 可為空
'worker_role': '110', # 預設收運人角色
'del_flag': '0', # 預設存在
'create_by': '7', # 預設建立人
'update_by': '系統' # 預設修改人
}
orders.append(order)
return pd.DataFrame(orders)
生成7月資料的工單
def generate_work_order_for_july(demand_order):
work_orders = []
for order in demand_order.itertuples():
work_order_no = generate_order_no_for_july('G') # 生成工單編號
exit_weight = random.randint(2800, 3000) # 隨機生成出場稱重(exit_weight)在2800到3000之間
weight = random.randint(10000, 60000) # 隨機生成地磅淨重(weight)在10000到60000之間
entry_weight = exit_weight + weight # 入場稱重(entry_weight)是出場稱重和地磅淨重的總和
weigh_weight = entry_weight - random.randint(10, 100) # 車載重量(weigh_weight)是入場稱重減去10到100之間的隨機數
# 填充工單資料
work_order = {
'work_no': work_order_no,
'area_code': order.area_code,
'status': '2',
'create_time': order.create_time + timedelta(minutes=10),
'update_time': order.update_time,
'enterprise_code': order.enterprise_code,
'car_no': '川ADK0949', # 假設使用預設車牌
'worker_code': '2', # 假設預設收運人編號
'worker_number': '13814855551', # 預設聯絡電話
'order_no': order.order_no, # 與預約單關聯
'create_by': '329',
'update_by': 'xulei',
'weigh_weight': str(weigh_weight), # 車載重量
'entry_weight': str(entry_weight), # 入場稱重
'exit_weight': str(exit_weight), # 出場稱重
'weight': str(weight), # 地磅淨重
}
work_orders.append(work_order)
# 更新需求單中的 work_no 欄位
demand_order.loc[demand_order['order_no'] == order.order_no, 'work_no'] = work_order_no
return pd.DataFrame(work_orders)
生成7月資料的工單流程
def generate_work_process_for_july(work_order):
work_processes = []
# 定義process_status的順序
process_status_order = [0, 1, 3, 4, 6] # 按照6, 4, 3, 1, 0的順序生成流程
for order in work_order.itertuples():
work_no = order.work_no
create_time = order.create_time
update_time = order.update_time
del_flag = 0
contact_number = '13814816131'
time = order.update_time - order.create_time
# 為每條工單生成 5 條流程
for i, process_status in enumerate(process_status_order):
# 每條流程的建立時間要遞增
if process_status == 6:
current_create_time = update_time # 狀態為6時,使用工單的修改時間
else:
time_delta = timedelta(minutes=random.randint(0, time.total_seconds() // 60))
current_create_time = create_time + time_delta # 生成遞增的建立時間
# 確保每條流程的建立時間遞增
if i > 0:
current_create_time = max(current_create_time, work_processes[-1]['create_time'] + timedelta(minutes=1))
else:
current_create_time = create_time
# 照片
if process_status == 0 or process_status == 4:
photo_url = 'https://wh.jonogroup.cn/storage/mybucket/9cf43926-f0ed-4ef1-87a3-2ec1404a70cc-606653014763070'
else:
photo_url = None
# 提交人
if process_status == 0:
committer_name = '使用者 13814816131'
elif process_status == 1:
committer_name = '劉芳'
else:
committer_name = '徐睿'
# 建立工單流程字典
work_process = {
'work_no': work_no,
'photo_url': photo_url,
'committer_name': committer_name,
'contact_number': contact_number, # 預設聯絡電話
'remark': '', # 可以為空
'process_status': str(process_status), # 流程狀態
'del_flag': del_flag, # 刪除標誌
'create_time': current_create_time,
'create_by': '系統', # 預設建立人
'update_time': current_create_time, # 更新時間與建立時間一致
'update_by': '系統' # 預設修改人
}
# 將工單流程新增到列表中
work_processes.append(work_process)
# 返回生成的工單流程資料
return pd.DataFrame(work_processes)
生成臺賬資料
def generate_stock_ledger_for_july(work_orders_df, work_processes_df, demand_orders_df, id_mapping_df):
stock_ledgers = []
# 處理每條工單
for order in work_orders_df.itertuples():
# 獲取工單資訊
work_no = order.work_no
order_no = order.order_no # 關聯的預約單編號
update_time = order.update_time
car_no = order.car_no
driver_id = order.worker_code
weight = order.weight # 地磅淨重(工單中的稱重)
# 獲取需求單資訊(從預約單的 order_no 獲取對應的需求單)
demand_order = demand_orders_df[demand_orders_df['order_no'] == order_no].iloc[0]
committer_id = demand_order['user_id']
committer_name = demand_order['committer_name']
address = demand_order['address']
garbage_type = demand_order['garbage_type']
large_type = demand_order['large_type']
demand_type = demand_order['demand_type']
enterprise_code = demand_order['enterprise_code']
commit_time = demand_order['create_time']
demand_id = id_mapping_df[id_mapping_df['order_no'] == order_no]['id'].values[0]
# 獲取工單流程中的派單時間(dispatch_time)和抵達時間(arrival_time)
dispatch_time = None
arrival_time = None
for process in work_processes_df.itertuples():
if process.work_no == work_no:
if process.process_status == '1': # 派單狀態
dispatch_time = process.create_time
if process.process_status == '3': # 抵達狀態
arrival_time = process.create_time
# 生成臺賬編號
stock_code = generate_order_no_for_july('DZ') # 生成臺賬編號
# 填充臺賬資料
stock_ledger = {
'stock_code': stock_code, # 臺賬編號
'work_no': work_no, # 工單編號
'demand_id': demand_id, # 需求單ID
'committer_id': committer_id, # 提交時間
'committer': committer_name, # 提交時間(需求單的建立時間)
'commit_time': commit_time,
'address': address,
'garbage_type': garbage_type, # 垃圾型別(需求單)
'large_type': large_type, # 大件型別(需求單)
'demand_type': demand_type, # 計費方式(需求單)
'dispatch_time': dispatch_time, # 派單時間(從流程中獲取)
'arrival_time': arrival_time, # 抵達時間(從流程中獲取)
'enterprise_code': enterprise_code, # 企業編號(需求單)
'car_no': car_no, # 車牌號(工單)
'driver_id': driver_id, # 司機ID(工單)
'pound_no': 'A' + str(random.randint(100000, 999999)), # 地磅單號(假設)
'weight': weight, # 裝載重量(工單的稱重)
'create_time': update_time, # 臺賬建立時間
'create_by': 'schedule', # 建立人(假設)
'update_time': update_time, # 更新時間(工單的更新時間)
'update_by': 'schedule', # 更新人(假設)
'del_flag': '0' # 預設標記為存在
}
stock_ledgers.append(stock_ledger)
# 返回生成的臺賬資料
return pd.DataFrame(stock_ledgers)
將資料插入到資料庫
def insert_to_db(dataframe, table_name):
dataframe.to_sql(table_name, con=engine, if_exists='append', index=False)
生成並插入7月資料
num_orders = 70 # 生成100條預約單資料
demand_orders_df = generate_demand_orders_july(num_orders)
work_orders_df = generate_work_order_for_july(demand_orders_df)
work_processes_df = generate_work_process_for_july(work_orders_df)
將資料插入資料庫
insert_to_db(demand_orders_df, 't_demand_order')
print("7月的預約單資料補錄完成!")
查詢資料庫,獲取 order_no 和 id 的對映
id_mapping_query = """
SELECT
id
,
order_no
,
status
,
update_time
,
create_time
,
garbage_type
,
area_code
,
dead_line
,
enterprise_code
,
committer_name
,
user_id
,
role_number
,
contact_number
,
volume
,
weight
,
remark
,
large_type
,
demand_type
,
quantity
,
address
,
floor
,
elevator_flag
,
park_flag
,
work_no
,
order_type
,
photo_url
,
lng
,
lat
,
evaluate
,
comment
,
worker_role
,
del_flag
,
create_by
,
update_by
FROM
whsw
.t_demand_order
;
"""
id_mapping_df = pd.read_sql(id_mapping_query, engine)
將 id 對映與工單資料關聯
for order in work_orders_df.itertuples():
order_no = order.order_no
demand_id = id_mapping_df[id_mapping_df['order_no'] == order_no]['id'].values[0]
stock_ledger_df = generate_stock_ledger_for_july(work_orders_df, work_processes_df, demand_orders_df, id_mapping_df)
insert_to_db(work_orders_df, 't_work_order')
print("7月的工單資料補錄完成!")
insert_to_db(work_processes_df, 't_work_process')
print("7月的工單流程資料補錄完成!")
insert_to_db(stock_ledger_df, 't_stock_ledger')
print("7月的臺賬資料補錄完成!")