getAttributes.py 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. # -*- coding: utf-8 -*-
  2. """``interface/getAttributes.py`` — Phase 6 拆分后的兼容层。
  3. 按 ARCHITECTURE.md Phase 6 拆分建议,原 ``interface/getAttributes.py``
  4. (5,348 行)中的业务装配函数已按职责迁移到以下目标模块:
  5. | 目标文件 | 迁出内容 | 类型 |
  6. |---|---|---|
  7. | ``common/attr_utils.py`` | ``turnMoneySource``、``get_days_between``、``extract_serviceTime`` | CORE (pure) |
  8. | ``assembly/package_scope.py`` | ``getPackage``、``getPackagesFromArticle``、``getPackageScopePattern``、``pattern_packageScope``、``dict_role_id``、``role2id_dict`` | ASSEMBLY |
  9. | ``assembly/role_money.py`` | ``getRoleList``、``getPackageRoleMoney``、``findAttributeAfterEntity``、``get_legal_comba``、``get_dict_entity_prob``、``getSumExpectation``、``dispatch``、``initPackageAttr`` | ASSEMBLY |
  10. | ``assembly/time_attrs.py`` | ``getTimeAttributes``、``turnBidWay``、``my_timeFormat``、``timeAdd``、``getOtherAttributes``、``my_time_format_pattern``、``time_sub_pattern`` | ASSEMBLY |
  11. | ``assembly/contacts.py`` | ``getProjectContacts`` | ASSEMBLY |
  12. | ``assembly/post_process.py`` | ``getPREMs``、``correct_rolemoney``、``limit_maximum_amount``、``update_prem``、``rule_add_role``、``confirm_prem``、``add_package_name``、``fix_single_source``、``demand_to_prem``、``add_manager`` | ASSEMBLY |
  13. | ``assembly/joint.py`` | ``get_win_joint``、``get_multi_winner_and_money`` | ASSEMBLY |
  14. 本文件通过 re-export 保持全部旧 import 路径可用:
  15. ``from BiddingKG.dl.interface.getAttributes import getPREMs`` 仍然有效
  16. ``import BiddingKG.dl.interface.getAttributes as getAttributes`` 仍然有效
  17. 循环依赖消除:
  18. ``turnMoneySource``、``extract_serviceTime``、``get_days_between`` 原被
  19. ``predictors/`` 反向导入,造成 ``predictors ↔ interface.getAttributes`` 循环。
  20. 现已下沉到 ``common/attr_utils.py``(CORE 层),``predictors/`` 改为从
  21. ``common/`` 导入,不再反向依赖 ``interface.getAttributes``。
  22. 未迁移的函数(保留为本地定义):
  23. - ``getTheRole`` — 小型辅助函数,不在 Phase 6 迁移范围
  24. - ``getServiceTime`` — 空占位函数
  25. - ``getMoneyRange`` — 空占位函数
  26. - ``limit_maximum_amount_backup`` — 旧版备份函数,保留以备回滚
  27. """
  28. from __future__ import absolute_import
  29. # ============================================================================
  30. # Re-exports from common/attr_utils.py
  31. # 纯函数,下沉到 common 层以消除 predictors ↔ interface.getAttributes 循环依赖
  32. # ============================================================================
  33. from BiddingKG.dl.common.attr_utils import (
  34. turnMoneySource,
  35. get_days_between,
  36. extract_serviceTime,
  37. )
  38. # ============================================================================
  39. # Re-exports from assembly/package_scope.py
  40. # 包/标段作用域相关
  41. # ============================================================================
  42. from BiddingKG.dl.assembly.package_scope import (
  43. dict_role_id,
  44. role2id_dict,
  45. getPackageScopePattern,
  46. pattern_packageScope,
  47. getPackagesFromArticle,
  48. getPackage,
  49. )
  50. # ============================================================================
  51. # Re-exports from assembly/role_money.py
  52. # 角色/金额/KM 匹配相关
  53. # ============================================================================
  54. from BiddingKG.dl.assembly.role_money import (
  55. get_legal_comba,
  56. get_dict_entity_prob,
  57. getSumExpectation,
  58. getRoleList,
  59. dispatch,
  60. findAttributeAfterEntity,
  61. initPackageAttr,
  62. getPackageRoleMoney,
  63. )
  64. # ============================================================================
  65. # Re-exports from assembly/time_attrs.py
  66. # 时间属性相关
  67. # ============================================================================
  68. from BiddingKG.dl.assembly.time_attrs import (
  69. turnBidWay,
  70. my_time_format_pattern,
  71. time_sub_pattern,
  72. my_timeFormat,
  73. timeAdd,
  74. getTimeAttributes,
  75. getOtherAttributes,
  76. )
  77. # ============================================================================
  78. # Re-exports from assembly/contacts.py
  79. # 联系人相关
  80. # ============================================================================
  81. from BiddingKG.dl.assembly.contacts import (
  82. getProjectContacts,
  83. )
  84. # ============================================================================
  85. # Re-exports from assembly/post_process.py
  86. # 结果后处理/修正相关
  87. # ============================================================================
  88. from BiddingKG.dl.assembly.post_process import (
  89. getPREMs,
  90. correct_rolemoney,
  91. limit_maximum_amount,
  92. update_prem,
  93. rule_add_role,
  94. confirm_prem,
  95. add_package_name,
  96. fix_single_source,
  97. demand_to_prem,
  98. add_manager,
  99. )
  100. # ============================================================================
  101. # Re-exports from assembly/joint.py
  102. # 联合体相关
  103. # ============================================================================
  104. from BiddingKG.dl.assembly.joint import (
  105. get_win_joint,
  106. get_multi_winner_and_money,
  107. )
  108. # ============================================================================
  109. # 本地定义(Phase 6 未迁移)
  110. # 以下函数不在用户指定的迁移映射中,保留为本地定义。
  111. # ============================================================================
  112. def getTheRole(entity, role_list):
  113. '''
  114. @summary:根据实体名称拿到index
  115. @param:
  116. entity:实体名称
  117. role_list:角色list
  118. @return:该实体所在下标
  119. '''
  120. for role_index in range(len(role_list)):
  121. if entity in role_list[role_index]:
  122. return role_index
  123. return None
  124. def getServiceTime():
  125. pass
  126. def getMoneyRange(RoleList):
  127. pass
  128. def limit_maximum_amount_backup(prem, industry):
  129. indu = industry['industry'].get('class_name', '')
  130. indu_amount = {
  131. '计算机设备': 200000000,
  132. '办公设备': 100000000,
  133. '家具用具': 500000000,
  134. '办公消耗用品及类似物品': 100000000,
  135. '日杂用品': 100000000,
  136. '餐饮业': 1000000000,
  137. '物业管理': 1000000000,
  138. '工程技术与设计服务': 1000000000,
  139. '工程评价服务': 100000000,
  140. '其他工程服务': 100000000,
  141. '工程监理服务': 100000000,
  142. '工程造价服务': 100000000,
  143. '会计、审计及税务服务': 100000000,
  144. }
  145. if indu in indu_amount:
  146. maximum_amount = indu_amount[indu]
  147. try:
  148. for value in prem[0]['prem'].values():
  149. for l in value['roleList']:
  150. if l["role_name"] == 'win_tenderer' and float(l["role_money"]['money']) > maximum_amount:
  151. if indu in ['餐饮业', '物业管理']:
  152. l["role_money"]['money'] = str(float(l["role_money"]['money'])/10000)
  153. elif l["role_money"]['money_unit'] == '万元':
  154. l["role_money"]['money'] = str(float(l["role_money"]['money'])/10000)
  155. if float(value['tendereeMoney']) > maximum_amount:
  156. if indu in ['餐饮业', '物业管理']:
  157. value['tendereeMoney'] = float(value['tendereeMoney'])/10000
  158. elif value['tendereeMoneyUnit'] == '万元':
  159. value['tendereeMoney'] = float(value['tendereeMoney']) / 10000
  160. except Exception as e:
  161. print('行业分类限制最高金额抛出异常:%s' % e)