補錄資料指令碼

一只快乐的柠檬精J發表於2024-12-01

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月的臺賬資料補錄完成!")

相關文章