forked from erp-dev/erp
feat: added mdy stagging upload to tiia, and change outgoing_date to datetime type
This commit is contained in:
37
docs/2026-01-22_summary.md
Normal file
37
docs/2026-01-22_summary.md
Normal file
@@ -0,0 +1,37 @@
|
||||
### 2026-01-22 工作记录
|
||||
|
||||
#### 1) 核查 PlateOrder / PrintingOrder 创建接口是否会写入 merchant_id(防止再次产生 merchant=NULL)
|
||||
|
||||
背景:
|
||||
- 之前查询接口无数据的根因已确认是历史数据 `merchant_id` 为空;生产已手动回填修复。
|
||||
- 为避免“新增数据再次写空”,需要确认 create API 是否会自动写入 `merchant_id`。
|
||||
|
||||
核查结论(仅检查代码逻辑,未修改任何代码):
|
||||
- `PlateOrder`:
|
||||
- create 时在 `PlateOrderViewSet.perform_create()` 内部注入 `merchant`(来自 `request.user.employee.merchant`),并与 `created_by` 一起写入。
|
||||
- 若当前用户不存在 `employee` 或 `employee.merchant` 为空,则会写入 `merchant=NULL`。
|
||||
- `PrintingOrder`:
|
||||
- create 由 `PrintingOrderCreateUpdateSerializer.create()` 调用 `PrintingOrderService.create_printing_order(...)`。
|
||||
- service 内部会在创建前注入 `merchant`(来自 `request.user.employee.merchant`)与 `created_by`。
|
||||
- 若当前用户不存在 `employee` 或 `employee.merchant` 为空,则会写入 `merchant=NULL`。
|
||||
|
||||
建议(无需改代码即可执行的运维/数据侧约束):
|
||||
- 确认所有会创建 `PlateOrder/PrintingOrder` 的账号类型都已正确绑定 `employee` 且 `employee.merchant` 非空(否则仍可能产生新 “merchant=NULL” 数据)。
|
||||
|
||||
#### 2) 新增:MDY 开版暂存(MDYPlateOrderStaging)“开版图”上传到腾讯云 TIIA 图库(增量定时任务)
|
||||
|
||||
- 数据源:`api_v1.models.MDYPlateOrderStaging.raw["62d52f4b8d2972284492dd27"]`(开版图 Attachment)
|
||||
- URL 选择策略:`original_file_full_path` 优先,`DownloadUrl` 候补(不再使用带 token 的 `preview_url`)
|
||||
- 新增 service:`api_v1/mdy_plate_order_staging_tiia_upload.py`
|
||||
- 新增任务:`api_v1.tasks.upload_mdy_plate_order_staging_images_to_tencent_tiia`
|
||||
- 游标:`api_v1.models.DataSync`(`table_name=mdy_plate_order_staging_tiia_upload`,`last_rowid` 存 staging 自增 id)
|
||||
- 失败落库:`api_v1.models.MDYPlateOrderStagingTiiaUploadFailure`(Django Admin 可查)
|
||||
- 新增 Beat:`flower/settings.py` 中 `daily_mdy_plate_order_staging_tiia_image_upload`(默认 03:20)
|
||||
|
||||
#### 3) PrintingOrder.outgoing_date 升级为日期时间(DateTime),并保持入参兼容
|
||||
|
||||
- 模型字段:`printing.models.PrintingOrder.outgoing_date` 从 `DateField` 升级为 `DateTimeField`(迁移:`printing/migrations/0032_alter_printingorder_outgoing_date.py`)
|
||||
- API 入参兼容:仍可传 `YYYY-MM-DD`,会自动视为当天 `00:00:00`
|
||||
- API 返回值:统一返回日期时间字符串(包含时间部分,即使为 `00:00:00`)
|
||||
- 列表筛选:`outgoing_date_from/outgoing_date_to` 支持传日期或日期时间;其中 `outgoing_date_to` 传日期时按“包含整天”处理(`< 次日 00:00:00`)
|
||||
- 测试:严格执行 `api_v1.views.printing.test_api`(新增用例覆盖 `outgoing_date_to` 的整天包含语义),全绿
|
||||
@@ -47,6 +47,11 @@ Command 默认会读取/写入 checkpoint;可以通过参数关闭。
|
||||
|
||||
但代码里确实存在 PlateOrder 的 Celery task(见下文),只是 **未配置到 beat schedule**。
|
||||
|
||||
补充:**与“同步”不同**,项目已新增一条“开版暂存 → 腾讯云 TIIA 图库上传”的定时任务(用于把暂存表中的开版图入库到腾讯图库),它是单独的 beat 项,详见:
|
||||
|
||||
- `docs/tiia_image_gallery.md` 的 “四点五、MDY 开版暂存图片上传到图库”
|
||||
- `flower/settings.py`:`CELERY_BEAT_SCHEDULE['daily_mdy_plate_order_staging_tiia_image_upload']`(默认 03:20)
|
||||
|
||||
---
|
||||
|
||||
## 三、如何手动运行(推荐:management command)
|
||||
|
||||
@@ -105,6 +105,58 @@
|
||||
|
||||
---
|
||||
|
||||
## 四点五、MDY 开版暂存(MDYPlateOrderStaging)图片上传到图库(CreateImage)
|
||||
|
||||
### 4.5.1 目标数据源与字段(明道云暂存)
|
||||
|
||||
数据源:
|
||||
|
||||
- 模型:`api_v1.models.MDYPlateOrderStaging`
|
||||
- 图片字段:`raw["62d52f4b8d2972284492dd27"]`(明道云开版主表字段“开版图”,Attachment)
|
||||
|
||||
单个附件项的 URL 取值策略(当前约定):
|
||||
|
||||
- **优先**:`original_file_full_path`(你确认的主用字段)
|
||||
- **候补**:`DownloadUrl`
|
||||
- 不再使用:`preview_url`(通常带 token/过期参数,不适合作为长期回显 URL)
|
||||
|
||||
### 4.5.2 Service(上传单条暂存记录)
|
||||
|
||||
位置:`api_v1/mdy_plate_order_staging_tiia_upload.py`
|
||||
|
||||
- `upload_mdy_plate_order_staging_plate_images_to_tencent_tiia(staging, rate_limiter=None, dry_run=False)`
|
||||
- `EntityId`:使用 `staging.mdy_rowid`
|
||||
- 每张图调用:`api_v1.utils.tencentcloud_tiia.upload_image_url_to_tencent_tiia(image_url, entity_id, custom_content=image_url)`
|
||||
- 限流:`SimpleRateLimiter(qps=settings.TENCENTCLOUD_TIIA_QPS)`(默认 10)
|
||||
- 单张失败不影响其它图片,返回 `successes/failures` 明细
|
||||
|
||||
### 4.5.3 定时任务(Celery Beat)
|
||||
|
||||
位置:`api_v1/tasks.py`
|
||||
|
||||
- task:`upload_mdy_plate_order_staging_images_to_tencent_tiia(batch_size=200, dry_run=False)`
|
||||
- **游标**:`api_v1.models.DataSync`(`table_name=mdy_plate_order_staging_tiia_upload`),用 `last_rowid` 存储 staging 表自增 `id`
|
||||
- **失败落库**:`api_v1.models.MDYPlateOrderStagingTiiaUploadFailure`(同日同 rowid 去重,attempts 累加)
|
||||
|
||||
Beat 配置位置:`flower/settings.py`
|
||||
|
||||
- `CELERY_BEAT_SCHEDULE['daily_mdy_plate_order_staging_tiia_image_upload']`
|
||||
- 默认:**03:20** 运行
|
||||
- kwargs 默认值:
|
||||
- `batch_size=500`
|
||||
- `dry_run=False`
|
||||
|
||||
手动触发(示例):
|
||||
|
||||
- `uv run python manage.py shell -c "from api_v1.tasks import upload_mdy_plate_order_staging_images_to_tencent_tiia; r=upload_mdy_plate_order_staging_images_to_tencent_tiia.delay(batch_size=50, dry_run=True); print(r.id)"`
|
||||
|
||||
### 4.5.4 迁移与 Admin
|
||||
|
||||
- 迁移:`api_v1/migrations/0010_mdy_plate_order_staging_tiia_upload_failure.py`
|
||||
- Admin:`api_v1/admin.py` 已注册 `MDYPlateOrderStagingTiiaUploadFailure`
|
||||
|
||||
---
|
||||
|
||||
## 五、手动跑批(推荐:management command)
|
||||
|
||||
位置:`printing/management/commands/tiia_upload_plate_order_images.py`
|
||||
|
||||
Reference in New Issue
Block a user