controller.py 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482
  1. from typing import Annotated
  2. import uuid
  3. from fastapi import APIRouter, Depends, Path, Query
  4. from fastapi.responses import JSONResponse
  5. from app.api.v1.module_system.auth.schema import AuthSchema
  6. from app.common.response import ResponseSchema, SuccessResponse
  7. from app.core.dependencies import AuthPermission
  8. from app.core.logger import log
  9. from app.core.router_class import OperationLogRoute
  10. from app.plugin.module_payment.expense.institution.schema import InstitutionListOutSchema
  11. from .service import InstitutionService, InstitutionScopeService, IssueruleService
  12. from alipay.aop.api.domain.AlipayEbppInvoiceInstitutionCreateModel import (
  13. AlipayEbppInvoiceInstitutionCreateModel,
  14. )
  15. from alipay.aop.api.response.AlipayEbppInvoiceInstitutionCreateResponse import (
  16. AlipayEbppInvoiceInstitutionCreateResponse,
  17. )
  18. from alipay.aop.api.domain.AlipayEbppInvoiceInstitutionDeleteModel import (
  19. AlipayEbppInvoiceInstitutionDeleteModel,
  20. )
  21. from alipay.aop.api.response.AlipayEbppInvoiceInstitutionDeleteResponse import (
  22. AlipayEbppInvoiceInstitutionDeleteResponse,
  23. )
  24. from alipay.aop.api.domain.AlipayEbppInvoiceInstitutionModifyModel import (
  25. AlipayEbppInvoiceInstitutionModifyModel,
  26. )
  27. from alipay.aop.api.response.AlipayEbppInvoiceInstitutionModifyResponse import (
  28. AlipayEbppInvoiceInstitutionModifyResponse,
  29. )
  30. InstitutionRouter = APIRouter(
  31. route_class=OperationLogRoute,
  32. prefix="/institution",
  33. tags=["费控制度"],
  34. )
  35. @InstitutionRouter.post(
  36. "",
  37. summary="创建费控制度",
  38. description="创建费控制度。支持串联调用:创建制度→设置成员→创建发放规则",
  39. )
  40. async def create_institution_controller(
  41. data: dict,
  42. auth: Annotated[AuthSchema, Depends(AuthPermission(["module_payment:expense:institution:create"]))],
  43. ) -> JSONResponse:
  44. """创建费控制度(含完整串联流程)"""
  45. enterprise_id = data.get("enterprise_id", "")
  46. if not enterprise_id:
  47. from app.plugin.module_payment.enterprise.model import EnterpriseModel
  48. from sqlalchemy import select
  49. tenant_id = auth.user.tenant_id if auth.user and auth.user.tenant_id else auth.tenant_id
  50. log.info(f"推导 enterprise_id: tenant_id={tenant_id}, user_tenant_id={getattr(auth.user, 'tenant_id', None)}")
  51. stmt = select(EnterpriseModel).where(EnterpriseModel.tenant_id == tenant_id).limit(1)
  52. result = await auth.db.execute(stmt)
  53. enterprise = result.scalar_one_or_none()
  54. log.info(f"查询 enterprise 结果: {enterprise.enterprise_id if enterprise else 'None'}")
  55. enterprise_id = enterprise.enterprise_id if enterprise else ""
  56. if enterprise_id:
  57. data["enterprise_id"] = enterprise_id
  58. # 字段映射:前端 name → Alipay institution_name
  59. if data.get("name") and not data.get("institution_name"):
  60. data["institution_name"] = data["name"]
  61. # Alipay 必填:商户外部单据号(唯一标识)
  62. if not data.get("outer_source_id"):
  63. data["outer_source_id"] = str(uuid.uuid4()).replace("-", "")
  64. # expense_type 映射:前端值 → 支付宝标准值
  65. EXPENSE_TYPE_MAP = {"GENERAL": "DEFAULT", "DEFAULT": "DEFAULT"}
  66. if data.get("expense_type") in EXPENSE_TYPE_MAP:
  67. data["expense_type"] = EXPENSE_TYPE_MAP[data["expense_type"]]
  68. # 时间格式补全:YYYY-MM-DD → YYYY-MM-DD HH:mm:ss
  69. if data.get("effective_start_date") and len(data["effective_start_date"]) == 10:
  70. data["effective_start_date"] = data["effective_start_date"] + " 00:00:00"
  71. if data.get("effective_end_date") and len(data["effective_end_date"]) == 10:
  72. data["effective_end_date"] = data["effective_end_date"] + " 23:59:59"
  73. elif not data.get("effective_end_date") and data.get("effective_time_type") == "unlimited":
  74. # 长期有效:设为2099年底
  75. data["effective_end_date"] = "2099-12-31 23:59:59"
  76. # 默认使用规则(支付宝必填)
  77. if not data.get("standard_info_list"):
  78. single_limit = data.get("single_limit", 0)
  79. period_type = data.get("period_type", "")
  80. amount = data.get("amount", 0)
  81. standard_info = {
  82. "standard_name": data.get("institution_name", "默认规则"),
  83. "standard_desc": f"单笔限额{single_limit}元" if single_limit else "通用规则",
  84. "consume_mode": "DEFAULT",
  85. "payment_policy": "PERSONAL",
  86. "personal_qrcode_mode": 0,
  87. "outer_source_id": str(uuid.uuid4()).replace("-", ""),
  88. }
  89. condition_list = []
  90. if single_limit:
  91. condition_list.append({"rule_factor": "QUOTA_TOTAL", "rule_name": "单次消费金额", "rule_value": str(single_limit)})
  92. # 定额发放时,将周期限额写入使用规则条件
  93. PERIOD_FACTOR_MAP = {
  94. "daily": "QUOTA_DAY", "weekly": "QUOTA_WEEK",
  95. "monthly": "QUOTA_MONTH", "quarterly": "QUOTA_QUARTER",
  96. "yearly": "QUOTA_YEAR",
  97. }
  98. if data.get("grant_mode") == "period" and period_type in PERIOD_FACTOR_MAP and amount:
  99. condition_list.append({
  100. "rule_factor": PERIOD_FACTOR_MAP[period_type],
  101. "rule_name": f"{period_type}限额",
  102. "rule_value": str(amount),
  103. })
  104. if condition_list:
  105. standard_info["standard_condition_info_list"] = condition_list
  106. data["standard_info_list"] = [standard_info]
  107. institution_create_model = AlipayEbppInvoiceInstitutionCreateModel.from_alipay_dict(data)
  108. # 解析适用成员数据
  109. scope_data = None
  110. adapter_type = data.get("applicable_scope")
  111. if adapter_type and adapter_type not in ("NONE", "none"):
  112. ADAPTER_TYPE_MAP = {"all": "EMPLOYEE_ALL", "employee": "EMPLOYEE_SELECT", "department": "EMPLOYEE_DEPARTMENT"}
  113. mapped_adapter = ADAPTER_TYPE_MAP.get(adapter_type, adapter_type)
  114. scope_data = {
  115. "adapter_type": mapped_adapter,
  116. "owner_type": data.get("scope_owner_type", "ENTERPRISE_PAY_UID"),
  117. "add_owner_id_list": data.get("scope_owner_id_list"),
  118. }
  119. # 全体员工时把 scope 写入创建请求(避免默认无scope导致支付宝后台不可操作)
  120. if adapter_type == "all":
  121. data["institution_scope_info"] = {
  122. "adapter_type": "ALL",
  123. "owner_type": "ENTERPRISE_PAY_UID",
  124. }
  125. # 解析发放规则数据
  126. issuerule_data = None
  127. if data.get("grant_mode") == "period":
  128. period_type_raw = data.get("period_type", "monthly")
  129. # 映射前端period_type到支付宝枚举
  130. ISSUE_TYPE_MAP = {
  131. "daily": "ISSUE_DAY",
  132. "weekly": "ISSUE_WEEK",
  133. "monthly": "ISSUE_MONTH",
  134. "quarterly": "ISSUE_QUARTER",
  135. "yearly": "ISSUE_YEAR",
  136. }
  137. issue_type = ISSUE_TYPE_MAP.get(period_type_raw, "ISSUE_MONTH")
  138. amount = data.get("amount", 0)
  139. # 有效时间配置
  140. effective_time_type = data.get("effective_time_type", "unlimited")
  141. if effective_time_type == "unlimited":
  142. effective_period = '{"all": true}'
  143. elif effective_time_type == "workday":
  144. workday_start = data.get("workday_start_time", "00:00")
  145. workday_end = data.get("workday_end_time", "23:59")
  146. effective_period = f'{{"regular":{{"workday":[["{workday_start}","{workday_end}"]]}}}}'
  147. else:
  148. effective_period = '{"all": true}'
  149. issuerule_data = {
  150. "quota_type": "CAP",
  151. "issue_type": issue_type,
  152. "issue_amount_value": str(amount),
  153. "issue_rule_name": data.get("name", "") + "-发放规则",
  154. "effective_period": effective_period,
  155. "invalid_mode": 1 if data.get("effective_time_type") == "unlimited" else 0,
  156. "share_mode": 0,
  157. "outer_source_id": data.get("outer_source_id") or str(uuid.uuid4()),
  158. }
  159. result = await InstitutionService.create_institution_full_flow(
  160. auth=auth,
  161. institution_model=institution_create_model,
  162. enterprise_id=enterprise_id,
  163. scope_data=scope_data,
  164. issuerule_data=issuerule_data,
  165. raw_data=data,
  166. )
  167. log.info(f"创建费控制度成功: institution_id={result.get('institution_id')}")
  168. return SuccessResponse(data=result, msg="创建费控制度成功")
  169. @InstitutionRouter.get(
  170. "",
  171. summary="查询费控制度列表",
  172. description="分页查询费控制度列表",
  173. response_model=ResponseSchema[InstitutionListOutSchema],
  174. )
  175. async def list_institution_controller(
  176. auth: Annotated[AuthSchema, Depends(AuthPermission(["module_payment:expense:institution:list"]))],
  177. page_no: Annotated[int, Query(description="页码")] = 1,
  178. page_size: Annotated[int, Query(description="每页数量")] = 20,
  179. enterprise_id: Annotated[str | None, Query(description="企业ID")] = None,
  180. name: Annotated[str | None, Query(description="制度名称")] = None,
  181. expense_type: Annotated[str | None, Query(description="费用类型")] = None,
  182. status: Annotated[str | None, Query(description="状态")] = None,
  183. ) -> JSONResponse:
  184. """查询费控制度列表"""
  185. search = {}
  186. if enterprise_id:
  187. search["enterprise_id"] = enterprise_id
  188. if name:
  189. search["name"] = name
  190. if expense_type:
  191. search["expense_type"] = expense_type
  192. if status:
  193. search["status"] = status
  194. result = await InstitutionService.list_service(
  195. auth=auth, page_no=page_no, page_size=page_size, search=search
  196. )
  197. return SuccessResponse(data=result, msg="查询费控制度列表成功")
  198. @InstitutionRouter.get(
  199. "/{institution_id}",
  200. summary="查询费控制度详情",
  201. description="查询费控制度详情 (alipay.ebpp.invoice.institution.detailinfo.query),失败时降级到本地DB",
  202. )
  203. async def detail_institution_controller(
  204. institution_id: Annotated[str, Path(description="制度ID")],
  205. auth: Annotated[AuthSchema, Depends(AuthPermission(["module_payment:expense:institution:detail"]))],
  206. enterprise_id: Annotated[str | None, Query(description="企业ID")] = None,
  207. ) -> JSONResponse:
  208. """查询费控制度详情"""
  209. if not enterprise_id:
  210. from app.plugin.module_payment.enterprise.model import EnterpriseModel
  211. from sqlalchemy import select
  212. tenant_id = auth.user.tenant_id if auth.user and auth.user.tenant_id else auth.tenant_id
  213. stmt = select(EnterpriseModel).where(EnterpriseModel.tenant_id == tenant_id).limit(1)
  214. result = await auth.db.execute(stmt)
  215. ent = result.scalar_one_or_none()
  216. enterprise_id = ent.enterprise_id if ent else ""
  217. result = await InstitutionService.detailinfo_query_service(
  218. auth=auth,
  219. institution_id=institution_id,
  220. enterprise_id=enterprise_id,
  221. )
  222. if result is None:
  223. return SuccessResponse(data=None, msg="制度不存在")
  224. return SuccessResponse(data=result, msg="查询费控制度详情成功")
  225. @InstitutionRouter.delete(
  226. "",
  227. summary="删除费控制度",
  228. description="删除费控制度 (alipay.ebpp.invoice.institution.delete)",
  229. )
  230. async def delete_institution_controller(
  231. data: dict,
  232. auth: Annotated[AuthSchema, Depends(AuthPermission(["module_payment:expense:institution:delete"]))],
  233. ) -> JSONResponse:
  234. """删除费控制度"""
  235. institution_delete_model = AlipayEbppInvoiceInstitutionDeleteModel.from_alipay_dict(data)
  236. result = await InstitutionService.delete_institution_service(auth=auth, data=institution_delete_model)
  237. log.info(f"删除费控制度成功: institution_id={institution_delete_model.institution_id}, enterprise_id={institution_delete_model.enterprise_id}")
  238. return SuccessResponse(data=result, msg="删除费控制度成功")
  239. @InstitutionRouter.post(
  240. "/modify",
  241. summary="编辑费控制度",
  242. description="编辑费控制度 (alipay.ebpp.invoice.institution.modify)",
  243. )
  244. async def modify_institution_controller(
  245. data: dict,
  246. auth: Annotated[AuthSchema, Depends(AuthPermission(["module_payment:expense:institution:modify"]))],
  247. ) -> JSONResponse:
  248. """编辑费控制度"""
  249. # enterprise_id 推导
  250. if not data.get("enterprise_id"):
  251. from app.plugin.module_payment.enterprise.model import EnterpriseModel
  252. from sqlalchemy import select
  253. tenant_id = auth.user.tenant_id if auth.user and auth.user.tenant_id else auth.tenant_id
  254. stmt = select(EnterpriseModel).where(EnterpriseModel.tenant_id == tenant_id).limit(1)
  255. result = await auth.db.execute(stmt)
  256. enterprise = result.scalar_one_or_none()
  257. if enterprise:
  258. data["enterprise_id"] = enterprise.enterprise_id
  259. # name → institution_name
  260. if data.get("name") and not data.get("institution_name"):
  261. data["institution_name"] = data["name"]
  262. # 时间格式
  263. if data.get("effective_start_date") and len(data["effective_start_date"]) == 10:
  264. data["effective_start_date"] = data["effective_start_date"] + " 00:00:00"
  265. if data.get("effective_end_date") and len(data["effective_end_date"]) == 10:
  266. data["effective_end_date"] = data["effective_end_date"] + " 23:59:59"
  267. elif not data.get("effective_end_date") and data.get("effective_time_type") == "unlimited":
  268. data["effective_end_date"] = "2099-12-31 23:59:59"
  269. # expense_type 映射
  270. EXPENSE_TYPE_MAP = {"GENERAL": "DEFAULT", "DEFAULT": "DEFAULT"}
  271. if data.get("expense_type") in EXPENSE_TYPE_MAP:
  272. data["expense_type"] = EXPENSE_TYPE_MAP[data["expense_type"]]
  273. # 提取 scope 变更数据(需与基础修改分两次请求)
  274. applicable_scope = data.get("applicable_scope", "")
  275. scope_info = None
  276. enterprise_id = data.get("enterprise_id", "")
  277. if applicable_scope and applicable_scope not in ("NONE", "none"):
  278. ADAPTER_MAP = {"all": "EMPLOYEE_ALL", "employee": "EMPLOYEE_SELECT", "department": "EMPLOYEE_DEPARTMENT"}
  279. new_adapter = ADAPTER_MAP.get(applicable_scope, applicable_scope)
  280. # 查询当前scope:计算旧→新的差异
  281. old_ids = []
  282. try:
  283. scope_old = await InstitutionScopeService.scopepageinfo_query_service(
  284. auth=auth, institution_id=institution_id, enterprise_id=enterprise_id,
  285. page_num=1, page_size=500,
  286. )
  287. old_ids = [str(i) for i in (scope_old.get("owner_id_list") or []) if i]
  288. except Exception:
  289. log.warning(f"查询旧scope失败,将全量覆盖: institution_id={institution_id}")
  290. new_ids_raw = data.get("scope_owner_id_list") or []
  291. new_ids = [str(i) for i in new_ids_raw if i is not None and str(i).strip()]
  292. # 计算差异
  293. old_set, new_set = set(old_ids), set(new_ids)
  294. add_ids = list(new_set - old_set)
  295. delete_ids = list(old_set - new_set)
  296. scope_info = {
  297. "enterprise_id": enterprise_id,
  298. "adapter_type": new_adapter,
  299. "owner_type": "ENTERPRISE_PAY_UID",
  300. }
  301. if add_ids:
  302. scope_info["add_owner_id_list"] = add_ids
  303. if delete_ids:
  304. scope_info["delete_owner_id_list"] = delete_ids
  305. log.info(
  306. f"scope 差异: add={add_ids}, delete={delete_ids}, "
  307. f"old_count={len(old_ids)}, new_count={len(new_ids)}"
  308. )
  309. if not add_ids and not delete_ids:
  310. scope_info = None
  311. log.info("scope 无变化,跳过")
  312. # 从请求中移除 scope 数据,避免与基础修改冲突
  313. data.pop("modify_scope_info", None)
  314. # 第1次请求:仅修改制度基础信息(不含 scope)
  315. base_data = {k: v for k, v in data.items() if k != "modify_scope_info"}
  316. institution_modify_model = AlipayEbppInvoiceInstitutionModifyModel.from_alipay_dict(base_data)
  317. try:
  318. result = await InstitutionService.modify_institution_service(
  319. auth=auth, data=institution_modify_model, raw_data=base_data, scope_info=scope_info
  320. )
  321. except Exception as e:
  322. err_msg = str(e)
  323. if "consult" in err_msg.lower() or "咨询" in err_msg or "发" in err_msg:
  324. raise CustomException(msg="制度下存在发放规则,咨询模式不允许修改为外部服务商,请先删除发放规则后再试")
  325. raise
  326. log.info(f"编辑费控制度成功: institution_id={institution_modify_model.institution_id}")
  327. return SuccessResponse(data=result, msg="编辑费控制度成功")
  328. # ========== 制度成员范围管理 ==========
  329. @InstitutionRouter.get(
  330. "/{institution_id}/scope",
  331. summary="查询制度成员范围",
  332. description="查询制度下成员范围 (alipay.ebpp.invoice.institution.scopepageinfo.query)",
  333. )
  334. async def list_scope_controller(
  335. institution_id: Annotated[str, Path(description="制度ID")],
  336. auth: Annotated[AuthSchema, Depends(AuthPermission(["module_payment:expense:institution:scope:list"]))],
  337. enterprise_id: Annotated[str | None, Query(description="企业ID")] = None,
  338. owner_type: Annotated[str | None, Query(description="适配ID类型")] = None,
  339. page_num: Annotated[int, Query(description="页码")] = 1,
  340. page_size: Annotated[int, Query(description="每页条数")] = 20,
  341. ) -> JSONResponse:
  342. """查询制度成员"""
  343. result = await InstitutionScopeService.scopepageinfo_query_service(
  344. auth=auth,
  345. institution_id=institution_id,
  346. enterprise_id=enterprise_id,
  347. page_num=page_num,
  348. page_size=page_size,
  349. owner_type=owner_type,
  350. )
  351. return SuccessResponse(data=result, msg="查询成功")
  352. @InstitutionRouter.post(
  353. "/{institution_id}/scope",
  354. summary="设置制度成员范围",
  355. description="设置/修改制度成员范围 (alipay.ebpp.invoice.institution.scope.modify)",
  356. )
  357. async def modify_scope_controller(
  358. institution_id: Annotated[str, Path(description="制度ID")],
  359. data: dict,
  360. auth: Annotated[AuthSchema, Depends(AuthPermission(["module_payment:expense:institution:scope:modify"]))],
  361. ) -> JSONResponse:
  362. """设置制度成员"""
  363. result = await InstitutionScopeService.scope_modify_service(
  364. auth=auth,
  365. institution_id=institution_id,
  366. data=data,
  367. )
  368. log.info(f"设置制度成员成功: institution_id={institution_id}, adapter_type={data.get('adapter_type')}")
  369. return SuccessResponse(data=result, msg="设置成功")
  370. # ========== 自动额度发放规则管理 ==========
  371. @InstitutionRouter.post(
  372. "/{institution_id}/issuerule",
  373. summary="创建自动发放规则",
  374. description="创建自动额度发放规则 (alipay.ebpp.invoice.issuerule.create)",
  375. )
  376. async def create_issuerule_controller(
  377. institution_id: Annotated[str, Path(description="制度ID")],
  378. data: dict,
  379. auth: Annotated[AuthSchema, Depends(AuthPermission(["module_payment:expense:institution:issuerule:create"]))],
  380. ) -> JSONResponse:
  381. """创建自动发放规则"""
  382. result = await IssueruleService.create_issuerule_service(
  383. auth=auth,
  384. institution_id=institution_id,
  385. enterprise_id=data.get("enterprise_id", ""),
  386. quota_type=data.get("quota_type", "CAP"),
  387. issue_type=data.get("issue_type", "ISSUE_MONTH"),
  388. issue_amount_value=data.get("issue_amount_value", "0"),
  389. outer_source_id=data.get("outer_source_id"),
  390. issue_rule_name=data.get("issue_rule_name"),
  391. effective_period=data.get("effective_period"),
  392. invalid_mode=data.get("invalid_mode"),
  393. share_mode=data.get("share_mode"),
  394. )
  395. log.info(f"创建自动发放规则成功: institution_id={institution_id}")
  396. return SuccessResponse(data=result, msg="创建自动发放规则成功")
  397. @InstitutionRouter.put(
  398. "/{institution_id}/issuerule/{issue_rule_id}",
  399. summary="编辑自动发放规则",
  400. description="编辑自动额度发放规则 (alipay.ebpp.invoice.issuerule.modify)",
  401. )
  402. async def modify_issuerule_controller(
  403. institution_id: Annotated[str, Path(description="制度ID")],
  404. issue_rule_id: Annotated[str, Path(description="发放规则ID")],
  405. data: dict,
  406. auth: Annotated[AuthSchema, Depends(AuthPermission(["module_payment:expense:institution:issuerule:modify"]))],
  407. ) -> JSONResponse:
  408. result = await IssueruleService.modify_issuerule_service(
  409. auth=auth,
  410. institution_id=institution_id,
  411. issue_rule_id=issue_rule_id,
  412. enterprise_id=data.get("enterprise_id", ""),
  413. quota_type=data.get("quota_type"),
  414. issue_type=data.get("issue_type"),
  415. issue_amount_value=data.get("issue_amount_value"),
  416. issue_rule_name=data.get("issue_rule_name"),
  417. effective=data.get("effective"),
  418. effective_period=data.get("effective_period"),
  419. invalid_mode=data.get("invalid_mode"),
  420. share_mode=data.get("share_mode"),
  421. )
  422. log.info(f"编辑自动发放规则成功: issue_rule_id={issue_rule_id}")
  423. return SuccessResponse(data=result, msg="编辑自动发放规则成功")
  424. @InstitutionRouter.delete(
  425. "/{institution_id}/issuerule",
  426. summary="删除自动发放规则",
  427. description="删除自动额度发放规则 (alipay.ebpp.invoice.issuerule.delete)",
  428. )
  429. async def delete_issuerule_controller(
  430. institution_id: Annotated[str, Path(description="制度ID")],
  431. data: dict,
  432. auth: Annotated[AuthSchema, Depends(AuthPermission(["module_payment:expense:institution:issuerule:delete"]))],
  433. ) -> JSONResponse:
  434. result = await IssueruleService.delete_issuerule_service(
  435. auth=auth,
  436. institution_id=institution_id,
  437. issue_rule_id_list=data.get("issue_rule_id_list", []),
  438. enterprise_id=data.get("enterprise_id", ""),
  439. )
  440. log.info(f"删除自动发放规则成功: institution_id={institution_id}")
  441. return SuccessResponse(data=result, msg="删除自动发放规则成功")