import os,shutil import redis import oss2,time,sys import requests import argparse,json from utils.funcs import requestApiToUpdateSliceStatus # 将当前脚本所在目录添加到 Python 路径,以便导入 utils 模块 sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) # from download_print_out import download_transform_save_by_json from utils.oss_redis import redisClient from utils.funcs import downloadJsonAndJpgFileAndMoveToCorrectDir, downloadDataByOssAndTransformSave # 默认使用脚本所在目录 currentDir = os.path.dirname(os.path.abspath(__file__)) ENV = 'prod' url = 'https://mp.api.suwa3d.com' if ENV == 'dev': url = 'http://mp.api.dev.com' elif ENV == 'prod': url = 'https://mp.api.suwa3d.com' #判断是否上传了 JSON 文件 def step1(versionId): # 下载json 文件 和 图片 dirName,machineInfo = downloadJsonAndJpgFileAndMoveToCorrectDir(versionId,currentDir) if not dirName: return False #判断是否是小机台 isSmallMachine = False if str(machineInfo["machine_type"]) == '1': isSmallMachine = True #下载数据,转换数据 res = downloadDataByOssAndTransformSave(dirName,isSmallMachine) if not res: return False #判断下载的obj文件数量和json里的是否一致,排除arrange文件夹 objFilePath = os.path.join(dirName, 'data') objCounts = 0 for file in os.listdir(objFilePath): if file == 'arrange': continue if file.endswith('.obj'): objCounts += 1 print(f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())} 下载处理完成的obj文件数量: {objCounts}') # requestApiToUpdateSliceStatus(versionId,objCounts) # 读取 队列中一个数据出来 def main(work_dir=None, batch_id=None): global currentDir # 如果指定了工作目录,使用指定的目录 if work_dir: work_dir = os.path.abspath(work_dir) if not os.path.exists(work_dir): print(f'指定的工作目录不存在: {work_dir},将创建该目录') os.makedirs(work_dir, exist_ok=True) currentDir = work_dir print(f'使用指定的工作目录: {currentDir}') else: print(f'没有指定工作目录,退出') exit(0) versionId = str(batch_id) print(f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())} 正在处理版次ID={versionId}') res = step1(versionId) if res == False: print(f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())} JSON文件下载数据失败,等待10秒') # time.sleep(10) # continue # 循环处理,直到队列为空 # try: # while True: # try: # r = redisClient() # #检测队列是否有值 # if r.scard('pb:sliceing') == 0: # print(f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())} 队列为空,等待10秒') # time.sleep(10) # continue # #获取队列中的值 # data = r.spop('pb:sliceing') # if data is None: # print(f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())} 取出的数据为空,等待10秒') # time.sleep(10) # continue # data = data.decode('utf-8') # #判断是否是数字 # if not data.isdigit(): # print(f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())} 取出的数据不是数字,等待10秒') # time.sleep(10) # continue # versionId = str(data) # print(f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())} 正在处理版次ID={versionId}') # res = step1(versionId) # if res == False: # print(f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())} JSON文件下载数据失败,等待10秒') # time.sleep(10) # continue # # 在长时间操作后,确保 Redis 连接仍然有效 # # 通过重新获取客户端来触发连接检查 # try: # r = redisClient() # r.ping() # 测试连接 # except Exception as e: # print(f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())} Redis连接检查失败: {str(e)},将在下次循环时自动重连') # #time.sleep(10) # except KeyboardInterrupt: # # 在循环内部捕获 KeyboardInterrupt,允许在 sleep 或操作中被中断 # raise # 重新抛出,让外层捕获 # except KeyboardInterrupt: # print(f'\n{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())} 收到中断信号,正在优雅退出...') # print(f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())} 程序已停止') # sys.exit(0) def testMain(): global currentDir currentDir = "/Users/dcx/code/make2/script/factory_sliceing_v2/tempData" versionId = '10153' #'10153 10158' print(f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())} 正在处理版次ID={versionId}') res = step1(versionId) print(f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())} 处理完成,res={res}') if __name__ == '__main__': #testMain() 新增参数 batchId parser = argparse.ArgumentParser(description='排版打印订单处理程序') parser.add_argument( '--work-dir', type=str, default=None, help='指定工作目录(磁盘路径),例如: D:/work 或 /Users/username/work。如果不指定,则使用脚本所在目录' ) parser.add_argument( '--batch—id', type=str, default=None, help='指定批次ID' ) args = parser.parse_args() main(work_dir=args.work_dir, batch_id=args.batch_id)