1
0
forked from erp-dev/erp

feat: wecomm setting clean

This commit is contained in:
2026-01-23 18:02:55 +08:00
parent 0e3b5c9b64
commit 81640cb84b
4 changed files with 124 additions and 10 deletions

View File

@@ -3,7 +3,9 @@
#### 1) 新增:企业微信机器人 Webhooktext 消息util 与测试命令 #### 1) 新增:企业微信机器人 Webhooktext 消息util 与测试命令
- settings - settings
- `flower/settings.py` 新增 `WECOM_WEBHOOK_BASE_URL` / `WECOM_WEBHOOK_KEY`(按当前需求直接写入 settings未接入 .env - `flower/settings.py` 新增 `WECOM_WEBHOOK_BASE_URL` / `WECOM_WEBHOOK_KEY`
- `WECOM_WEBHOOK_KEY` 已改为从 `.env` 读取(默认空);若为空,发送时会报错(不会静默吞掉)
- 仓库内提供 `env.example`(等价于常见的 `.env.example`),可用 `cp env.example .env` 生成本地 `.env`
- util - util
- `api_v1/utils/wecom_webhook.py` - `api_v1/utils/wecom_webhook.py`
- 提供 `send_wecom_webhook_message(content=..., msgtype=..., key=..., timeout_seconds=...)` - 提供 `send_wecom_webhook_message(content=..., msgtype=..., key=..., timeout_seconds=...)`
@@ -36,7 +38,11 @@
- `PRINTING_JOB_STATE_ADVANCED_WECOM_MARKDOWN_TEMPLATE` - `PRINTING_JOB_STATE_ADVANCED_WECOM_MARKDOWN_TEMPLATE`
- 开关:`PRINTING_JOB_STATE_ADVANCED_WECOM_NOTIFY_ENABLED`(默认测试环境关闭,非测试环境开启) - 开关:`PRINTING_JOB_STATE_ADVANCED_WECOM_NOTIFY_ENABLED`(默认测试环境关闭,非测试环境开启)
- 模板已增加字段:`{sender}`(发送者) - 模板已增加字段:`{sender}`(发送者)
- 模板已增加字段:`{followup_url}`(跟进地址,来自 `PRINTING_JOB_STATE_ADVANCED_FOLLOWUP_URL_TEMPLATE` - 跟进地址:
- `.env``PRINTING_JOB_STATE_ADVANCED_FOLLOWUP_URL_TEMPLATE`(默认空)
- 若为空则**消息中省略“跟进地址”字段**,但消息仍然发送
- 模板占位符:
- `{followup_line}`(由 service 渲染:有 url 才会输出“跟进地址”行)
- 模板已增加字段:`{process_params_markdown}`(工序参数,来自 `state_log.get_all_parameters_summary()` - 模板已增加字段:`{process_params_markdown}`(工序参数,来自 `state_log.get_all_parameters_summary()`
#### 3) 重构:提取“发送最新状态到企业微信”逻辑为可复用 service便于后续 API 化) #### 3) 重构:提取“发送最新状态到企业微信”逻辑为可复用 service便于后续 API 化)

105
env.example Normal file
View File

@@ -0,0 +1,105 @@
# Copy this file to ".env" (same directory as manage.py), then fill values.
# 注意:这里是示例文件,请勿提交真实密钥到仓库。
############################
# Django / 基础
############################
SECRET_KEY=replace_me_with_a_strong_secret
DEBUG=False
# 逗号分隔django-environ Env.list
ALLOWED_HOSTS=yuwenerp.yuwen.cloud,localhost,127.0.0.1
CSRF_TRUSTED_ORIGINS=https://yuwenerp.yuwen.cloud,http://localhost:8000
DATA_UPLOAD_MAX_NUMBER_FIELDS=20000
############################
# 数据库(必填)
############################
DB_NAME=flower
DB_USER=flower
DB_PASSWORD=replace_me
DB_HOST=localhost
DB_PORT=6432
CONN_MAX_AGE=0
############################
# 缓存(可选)
############################
# 二选一:优先使用 CACHE_URL否则使用 CACHE_HOST/CACHE_PORT/CACHE_DB 组合
#CACHE_URL=redis://localhost:6379/0
CACHE_HOST=localhost
CACHE_PORT=6379
CACHE_DB=0
CACHE_KEY_PREFIX=flower
CACHE_DEFAULT_TIMEOUT=300
############################
# 日志(可选)
############################
LOG_LEVEL=INFO
DJANGO_LOG_LEVEL=INFO
UVICORN_LOG_LEVEL=INFO
UVICORN_ACCESS_LOG_LEVEL=INFO
############################
# 明道云同步(可选)
############################
MDY_MERCHANT_ID=1
MDY_PRODUCT_CATEGORY_ID=1
MDY_SYNC_PAGE_SIZE=100
MDY_SYNC_MAX_PAGES=2
MDY_SYNC_MAX_RECORDS=200
############################
# 腾讯云 TIIA建议必填生产环境请务必使用真实值
############################
TENCENTCLOUD_SECRET_ID=replace_me
TENCENTCLOUD_SECRET_KEY=replace_me
TENCENTCLOUD_TOKEN=
TENCENTCLOUD_TIIA_GROUP_ID=168
TENCENTCLOUD_TIIA_REGION=ap-guangzhou
TENCENTCLOUD_TIIA_ENDPOINT=tiia.tencentcloudapi.com
TENCENTCLOUD_TIIA_PIC_NAME_PREFIX=plate_order
TENCENTCLOUD_TIIA_QPS=10
############################
# 企业微信机器人WeCom Webhook
############################
# 为空时发送会报错WeCom webhook key 未配置
WECOM_WEBHOOK_KEY=
# PrintingJob 状态推进通知的“跟进地址”模板;为空则消息里省略“跟进地址”字段
PRINTING_JOB_STATE_ADVANCED_FOLLOWUP_URL_TEMPLATE=https://app.yuwen.cloud/workstation/production/batch-advance?orderId={order_id}
############################
# Printing 自动创建销售品(可选)
############################
AUTO_CREATE_SALESITEM_FROM_PRINT_ORDER=False
# 必填settings 中无默认值),用于从指定 State 读取参数创建 SalesItem
PRINTING_SALES_ITEM_SOURCE_STATE_ID=0
############################
# Celery可选
############################
# 二选一:优先使用 CELERY_BROKER_URL否则使用 host/port/user/password/vhost 组合
#CELERY_BROKER_URL=amqp://guest:guest@localhost:5672//
CELERY_BROKER_HOST=localhost
CELERY_BROKER_PORT=5672
CELERY_BROKER_USER=guest
CELERY_BROKER_PASSWORD=guest
CELERY_BROKER_VHOST=/
# 二选一:优先使用 CELERY_RESULT_BACKEND否则使用 host/port/db 组合
#CELERY_RESULT_BACKEND=redis://localhost:6379/1
CELERY_RESULT_HOST=localhost
CELERY_RESULT_PORT=6379
CELERY_RESULT_DB=1
############################
# CORS可选
############################
# 逗号分隔
CORS_ALLOWED_ORIGINS=http://localhost:8000,http://127.0.0.1:5173,http://127.0.0.1:5174,http://127.0.0.1:5179,https://yuwenerp.yuwen.cloud

View File

@@ -79,7 +79,7 @@ TENCENTCLOUD_TIIA_QPS = env.int('TENCENTCLOUD_TIIA_QPS', default=10) # Tencent
# 企业微信机器人 Webhook目前按需求直接写入 settings不走 .env # 企业微信机器人 Webhook目前按需求直接写入 settings不走 .env
# 使用https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxxx # 使用https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxxx
WECOM_WEBHOOK_BASE_URL = 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send' WECOM_WEBHOOK_BASE_URL = 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send'
WECOM_WEBHOOK_KEY = 'cc88bdef-a13f-4d7e-bdb6-ee51b68b8205' WECOM_WEBHOOK_KEY = env('WECOM_WEBHOOK_KEY', default='')
# CORS 配置 # CORS 配置
@@ -272,9 +272,7 @@ else:
PRINTING_JOB_STATE_ADVANCED_WECOM_NOTIFY_ENABLED = (not TESTING) PRINTING_JOB_STATE_ADVANCED_WECOM_NOTIFY_ENABLED = (not TESTING)
# PrintingJob 跟进地址(用于企业微信通知里展示/点击) # PrintingJob 跟进地址(用于企业微信通知里展示/点击)
# orderId 使用 PrintingOrder.id # orderId 使用 PrintingOrder.id
PRINTING_JOB_STATE_ADVANCED_FOLLOWUP_URL_TEMPLATE = ( PRINTING_JOB_STATE_ADVANCED_FOLLOWUP_URL_TEMPLATE = env('PRINTING_JOB_STATE_ADVANCED_FOLLOWUP_URL_TEMPLATE', default='')
"https://app.yuwen.cloud/workstation/production/batch-advance?orderId={order_id}"
)
PRINTING_JOB_STATE_ADVANCED_WECOM_MARKDOWN_TEMPLATE = ( PRINTING_JOB_STATE_ADVANCED_WECOM_MARKDOWN_TEMPLATE = (
"### 印染任务状态推进\n" "### 印染任务状态推进\n"
"\n" "\n"
@@ -283,7 +281,7 @@ PRINTING_JOB_STATE_ADVANCED_WECOM_MARKDOWN_TEMPLATE = (
"- **推进状态****{state_name}**\n" "- **推进状态****{state_name}**\n"
"- **推进时间**`{advanced_at}`\n" "- **推进时间**`{advanced_at}`\n"
"- **发送者**{sender}\n" "- **发送者**{sender}\n"
"- **跟进地址**[{followup_url}]({followup_url})\n" "{followup_line}"
"\n" "\n"
"**工序参数**\n" "**工序参数**\n"
"{process_params_markdown}\n" "{process_params_markdown}\n"

View File

@@ -28,8 +28,11 @@ def build_printing_job_followup_url(*, printing_order_id: int | None) -> str:
tmpl = getattr( tmpl = getattr(
settings, settings,
"PRINTING_JOB_STATE_ADVANCED_FOLLOWUP_URL_TEMPLATE", "PRINTING_JOB_STATE_ADVANCED_FOLLOWUP_URL_TEMPLATE",
"https://app.yuwen.cloud/workstation/production/batch-advance?orderId={order_id}", "",
) )
tmpl = (str(tmpl or "")).strip()
if not tmpl:
return ""
oid = printing_order_id if printing_order_id is not None else "" oid = printing_order_id if printing_order_id is not None else ""
try: try:
return str(tmpl).format(order_id=str(oid)) return str(tmpl).format(order_id=str(oid))
@@ -128,19 +131,21 @@ def render_printing_job_state_markdown(
"- **推进状态****{state_name}**\n" "- **推进状态****{state_name}**\n"
"- **推进时间**`{advanced_at}`\n" "- **推进时间**`{advanced_at}`\n"
"- **发送者**{sender}\n" "- **发送者**{sender}\n"
"- **跟进地址**[{followup_url}]({followup_url})\n" "{followup_line}"
"\n" "\n"
"**工序参数**\n" "**工序参数**\n"
"{process_params_markdown}\n" "{process_params_markdown}\n"
), ),
) )
followup_url = (followup_url or "").strip()
followup_line = f"- **跟进地址**[{followup_url}]({followup_url})\n" if followup_url else ""
return template.format( return template.format(
printing_order_id=str(printing_order_id), printing_order_id=str(printing_order_id),
printing_job_id=str(printing_job_id), printing_job_id=str(printing_job_id),
state_name=str(state_name), state_name=str(state_name),
advanced_at=str(advanced_at), advanced_at=str(advanced_at),
sender=str(sender_label or "系统自动发送"), sender=str(sender_label or "系统自动发送"),
followup_url=str(followup_url), followup_line=str(followup_line),
process_params_markdown=str(process_params_markdown), process_params_markdown=str(process_params_markdown),
) )