补录数据脚本
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月的台账数据补录完成!")

浙公网安备 33010602011771号