过年啦

补录数据脚本

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

posted @ 2024-12-01 22:43  一只快乐的柠檬精J  阅读(29)  评论(0)    收藏  举报