_gen_bid_annex.py 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317
  1. # -*- coding: utf-8 -*-
  2. """生成响应文件附件类单据:三份资格承诺书、软著一览表、项目团队岗位职责表。
  3. 项目:2026年河南产互联制造业数据智能运营平台研发项目(0635-202611FW0036)
  4. 采购人:河南产业互联网联合发展有限公司
  5. """
  6. import os
  7. import shutil
  8. from docx import Document
  9. from docx.enum.table import WD_TABLE_ALIGNMENT
  10. from docx.enum.text import WD_ALIGN_PARAGRAPH
  11. from docx.oxml import OxmlElement
  12. from docx.oxml.ns import qn
  13. from docx.shared import Cm, Pt, RGBColor
  14. HERE = os.path.dirname(os.path.abspath(__file__))
  15. SYNC_DIR = r"C:\Users\skygu\OneDrive\Projects\AIDOP\项目\项目招投标"
  16. PROJECT = "2026年河南产互联制造业数据智能运营平台研发项目"
  17. PROJECT_NO = "0635-202611FW0036"
  18. BUYER = "河南产业互联网联合发展有限公司"
  19. COMPANY = "北京智造易科技有限公司"
  20. TAX_NO = "91110000MA00AFPA3H"
  21. SW_COPYRIGHTS = [
  22. ("数字化项目管理系统 V1.0", "软著登字第 3664568 号", "2019SR0243811"),
  23. ("透明工厂管理平台 V1.0", "软著登字第 3664577 号", "2019SR0243820"),
  24. ("智造资源检查系统 V1.0", "软著登字第 3664585 号", "2019SR0243828"),
  25. ("智能在线选型系统 V1.0", "软著登字第 3664596 号", "2019SR0243839"),
  26. ("工业部件云物流系统 V1.0", "软著登字第 3664336 号", "2019SR0243579"),
  27. ("供应商绩效云管理系统 V1.0", "软著登字第 3664349 号", "2019SR0243592"),
  28. ("智能订单系统 V1.0", "软著登字第 3664361 号", "2019SR0243604"),
  29. ("数字化仓库系统 V1.0", "软著登字第 3664368 号", "2019SR0243611"),
  30. ("智能化生产排单系统 V1.0", "软著登字第 3664376 号", "2019SR0243619"),
  31. ("订单导航智能系统 V1.0", "软著登字第 3664386 号", "2019SR0243629"),
  32. ]
  33. # 软著与本项目业务模块的对应关系,用于说明「制造业相关领域」
  34. SW_RELEVANCE = {
  35. "数字化项目管理系统 V1.0": "项目与任务管理、进度跟踪,对应实施管理与改善闭环",
  36. "透明工厂管理平台 V1.0": "车间可视化与生产透明化,对应 S2 制造协同、S6 生产执行",
  37. "智造资源检查系统 V1.0": "设备、模具与产能资源核查,对应 S0 制造建模、S6 设备台账",
  38. "智能在线选型系统 V1.0": "产品与物料选型配置,对应 S0 物料建模、S1 产品设计",
  39. "工业部件云物流系统 V1.0": "工业物料流转与仓储物流,对应 S5 物料仓储、S7 成品仓储",
  40. "供应商绩效云管理系统 V1.0": "供应商评价与交付绩效,对应 S3 供应协同、S4 采购执行",
  41. "智能订单系统 V1.0": "订单接收、评审与执行跟踪,对应 S1 产销协同",
  42. "数字化仓库系统 V1.0": "库存、库位与出入库管理,对应 S5、S7 仓储模块",
  43. "智能化生产排单系统 V1.0": "生产排程与日计划编制,对应 S2 生产排程",
  44. "订单导航智能系统 V1.0": "订单全链路导航与进度追踪,对应 S8 订单链路全景",
  45. }
  46. TEAM_ROLES = [
  47. ("项目经理(项目负责人)", 1,
  48. "对进度、质量、成本与交付负总责;对接采购人项目负责人;组织周例会与阶段评审;"
  49. "风险识别与升级"),
  50. ("技术架构师", 1,
  51. "总体技术方案与集成方案设计;技术风险评估;关键技术决策;架构层面的代码与配置评审"),
  52. ("前端开发工程师", 1,
  53. "看板与页面适配;图表与大屏配置;移动端适配;前端缺陷修复"),
  54. ("后端开发工程师", 1,
  55. "集成通道适配;数据加工与指标计算任务;接口开发;后端缺陷修复"),
  56. ("实施顾问", 1,
  57. "业务调研;主数据梳理与落地;业务蓝图与指标口径确认;业务参数配置;用户操作辅导"),
  58. ("测试工程师", 1,
  59. "测试方案与用例设计;集成测试执行;UAT 支持;缺陷跟踪与回归验证"),
  60. ("UI 设计交互工程师", 1,
  61. "看板与大屏视觉设计;页面交互优化;移动端界面适配"),
  62. ("运维工程师", 1,
  63. "环境搭建与部署;监控告警配置;备份策略实施;上线支持与运行巡检"),
  64. ]
  65. # ----------------------------------------------------------------- 排版基础
  66. def new_doc(body_pt=14):
  67. doc = Document()
  68. sec = doc.sections[0]
  69. sec.top_margin = sec.bottom_margin = Cm(2.54)
  70. sec.left_margin = sec.right_margin = Cm(3.17)
  71. st = doc.styles["Normal"]
  72. st.font.name = "宋体"
  73. st.font.size = Pt(body_pt)
  74. st.element.rPr.rFonts.set(qn("w:eastAsia"), "宋体")
  75. st.element.rPr.rFonts.set(qn("w:ascii"), "Times New Roman")
  76. st.element.rPr.rFonts.set(qn("w:hAnsi"), "Times New Roman")
  77. st.paragraph_format.line_spacing = 1.5
  78. return doc
  79. def title(doc, text, pt=22):
  80. p = doc.add_paragraph()
  81. p.alignment = WD_ALIGN_PARAGRAPH.CENTER
  82. r = p.add_run(text)
  83. r.font.name = "黑体"
  84. r.font.size = Pt(pt)
  85. r.font.bold = True
  86. r.element.rPr.rFonts.set(qn("w:eastAsia"), "黑体")
  87. p.paragraph_format.space_after = Pt(18)
  88. return p
  89. def para(doc, text, align=WD_ALIGN_PARAGRAPH.JUSTIFY, indent=True, after=6):
  90. p = doc.add_paragraph(text)
  91. p.alignment = align
  92. if indent:
  93. p.paragraph_format.first_line_indent = Pt(doc.styles["Normal"].font.size.pt * 2)
  94. p.paragraph_format.space_after = Pt(after)
  95. return p
  96. def signature(doc, extra=()):
  97. for line in (f"承诺人(供应商名称,加盖单位公章):{COMPANY}",
  98. "法定代表人或其授权代表(签字或盖章):__________",
  99. "日  期:2026 年 __ 月 __ 日", *extra):
  100. para(doc, line, align=WD_ALIGN_PARAGRAPH.RIGHT, indent=False, after=14)
  101. def _cell(cell, text, pt=10.5, bold=False, align="l", fill=None):
  102. cell.text = ""
  103. p = cell.paragraphs[0]
  104. p.alignment = {"l": WD_ALIGN_PARAGRAPH.LEFT, "c": WD_ALIGN_PARAGRAPH.CENTER}[align]
  105. p.paragraph_format.space_before = Pt(2)
  106. p.paragraph_format.space_after = Pt(2)
  107. p.paragraph_format.line_spacing = 1.15
  108. r = p.add_run(str(text))
  109. r.font.name = "宋体"
  110. r.font.size = Pt(pt)
  111. r.font.bold = bold
  112. r.element.rPr.rFonts.set(qn("w:eastAsia"), "宋体")
  113. if fill:
  114. sh = OxmlElement("w:shd")
  115. sh.set(qn("w:fill"), fill)
  116. cell._tc.get_or_add_tcPr().append(sh)
  117. def add_table(doc, headers, rows, widths, aligns=None):
  118. t = doc.add_table(rows=1, cols=len(headers))
  119. t.style = "Table Grid"
  120. t.alignment = WD_TABLE_ALIGNMENT.CENTER
  121. t.autofit = False
  122. aligns = aligns or ["l"] * len(headers)
  123. for i, h in enumerate(headers):
  124. _cell(t.rows[0].cells[i], h, bold=True, align="c", fill="DDEBF7")
  125. for data in rows:
  126. cells = t.add_row().cells
  127. for i, v in enumerate(data):
  128. _cell(cells[i], v, align=aligns[i])
  129. for row in t.rows:
  130. for i, w in enumerate(widths):
  131. row.cells[i].width = Cm(w)
  132. return t
  133. def save(doc, name):
  134. out = os.path.join(HERE, name + ".docx")
  135. doc.save(out)
  136. if os.path.isdir(SYNC_DIR):
  137. shutil.copy2(out, os.path.join(SYNC_DIR, os.path.basename(out)))
  138. print(f"[完成] {name}.docx")
  139. return out
  140. def header_lines(doc, ref):
  141. para(doc, f"项目名称:{PROJECT}", indent=False, after=0)
  142. para(doc, f"项目编号:{PROJECT_NO}", indent=False, after=18)
  143. para(doc, f"{BUYER}:", indent=False)
  144. para(doc, f"我方已认真阅读上述项目询比采购文件,现就采购文件{ref}的要求,"
  145. f"郑重承诺如下:")
  146. def closing(doc):
  147. para(doc, "本承诺书作为我方询比响应文件的组成部分,"
  148. "我方中选后作为合同附件,与合同具有同等法律效力。")
  149. para(doc, "如有违反上述承诺,我方自愿接受作废标处理,"
  150. "并承担由此产生的全部法律责任。")
  151. para(doc, "特此承诺。", after=48)
  152. signature(doc)
  153. # ----------------------------------------------------------------- 承诺书一
  154. def gen_invoice_commitment():
  155. doc = new_doc()
  156. title(doc, "关于能够提供增值税专用发票的承诺书")
  157. header_lines(doc, "“供应商资格条件”第 3.2 条")
  158. para(doc, f"一、我方({COMPANY},纳税人识别号 {TAX_NO})为增值税一般纳税人,"
  159. "依法具备开具增值税专用发票的资格与能力。")
  160. para(doc, "二、我方若在本项目中选,将按照合同约定,"
  161. "向采购人开具合法、合规、真实有效的增值税专用发票,"
  162. "发票内容与合同约定及实际履约情况一致,发票税率按国家现行规定执行。")
  163. para(doc, "三、我方保证不存在虚开、代开发票等违法行为。"
  164. "如因我方原因导致发票不符合规定、无法认证抵扣或无法税前扣除,"
  165. "由我方负责及时重新开具并承担由此产生的全部责任。")
  166. closing(doc)
  167. return save(doc, "承诺书-能够提供增值税专用发票")
  168. # ----------------------------------------------------------------- 承诺书二
  169. def gen_no_consortium_commitment():
  170. doc = new_doc()
  171. title(doc, "关于不组成联合体及中选后不转包的承诺书")
  172. header_lines(doc, "“供应商资格条件”第 3.4 条")
  173. para(doc, "一、我方以独立法人身份参加本项目应答,"
  174. "不与任何其他单位组成联合体,"
  175. "响应文件中不存在联合体应答的情形。")
  176. para(doc, "二、我方若在本项目中选,将由我方独立履行合同全部义务,"
  177. "不将本项目整体或主体、关键性工作转包给其他单位或个人,"
  178. "也不以任何变相方式规避本项承诺。")
  179. para(doc, "三、我方承诺本项目的需求调研、方案设计、系统开发与配置、"
  180. "集成对接、测试、部署上线、培训及售后服务等各项工作,"
  181. "均由我方自有人员实施;"
  182. "项目团队人员均与我方签订劳动合同,不存在借用他人资质或人员的情形。")
  183. para(doc, "四、我方承诺不将本单位的身份证明、资质资格证明及相关人员的"
  184. "资质证明材料转借其他单位和个人使用。")
  185. closing(doc)
  186. return save(doc, "承诺书-不组成联合体及中选后不转包")
  187. # ----------------------------------------------------------------- 承诺书三
  188. def gen_credit_commitment():
  189. doc = new_doc()
  190. title(doc, "关于资格条件及信用状况的承诺书")
  191. header_lines(doc, "“供应商资格条件”第 3.5 条、第 3.6 条")
  192. para(doc, "一、我方为依法设立并有效存续的法人,"
  193. "具有独立承担民事责任的能力,"
  194. "所提供的营业执照及各项资格证明材料均真实、合法、有效。")
  195. para(doc, "二、截至本响应文件递交截止之日,我方在“国家企业信用信息公示系统”"
  196. "中未被列入“经营异常名录”,未被列入“严重违法失信名单”。")
  197. para(doc, "三、截至本响应文件递交截止之日,我方在“信用中国”网站"
  198. "(www.creditchina.gov.cn)中未被列入“失信被执行人”、"
  199. "“重大税收违法失信主体”、"
  200. "“政府采购严重违法失信行为记录名单”。")
  201. para(doc, "四、我方不存在下列任一情形:")
  202. for line in ("(一)被责令停业或处于破产状态;",
  203. "(二)被暂停或取消投标资格;",
  204. "(三)财产被接管、查封、扣押或冻结;",
  205. "(四)近三年(2023 年 1 月 1 日至本项目评审之日),"
  206. "在河南产互联组织的采购活动中,被认定存在串标、围标、骗标等行为;",
  207. "(五)为采购人不具有独立法人资格的附属机构(单位);",
  208. "(六)为本项目提供招标代理服务。"):
  209. para(doc, line, after=4)
  210. para(doc, "五、我方提交的全部响应文件及证明材料均真实有效,"
  211. "不存在伪造、虚假成份,材料所述内容均为我方真实拥有。")
  212. para(doc, "六、我方同意采购人或采购代理机构通过“国家企业信用信息公示系统”、"
  213. "“信用中国”网站及其他合法途径核查我方的信用状况;"
  214. "核查结果与本承诺不一致的,我方接受作废标处理。")
  215. closing(doc)
  216. return save(doc, "承诺书-资格条件及信用状况")
  217. # ----------------------------------------------------------------- 软著一览表
  218. def gen_sw_copyright_table():
  219. doc = new_doc(body_pt=12)
  220. title(doc, "计算机软件著作权登记证书一览表", pt=18)
  221. para(doc, f"项目名称:{PROJECT}", indent=False, after=0)
  222. para(doc, f"项目编号:{PROJECT_NO}", indent=False, after=0)
  223. para(doc, f"供应商名称:{COMPANY}", indent=False, after=12)
  224. para(doc, f"我方共持有计算机软件著作权登记证书 {len(SW_COPYRIGHTS)} 项,"
  225. "全部为制造业相关领域软件,著作权人均为我方,权利范围均为全部权利,"
  226. "登记机关为中国版权保护中心。证书扫描件附后。", after=12)
  227. add_table(doc,
  228. ["序号", "软件名称及版本", "证书号", "登记号", "与本项目的相关性"],
  229. [[str(i + 1), n, c, r, SW_RELEVANCE[n]]
  230. for i, (n, c, r) in enumerate(SW_COPYRIGHTS)],
  231. [1.0, 3.6, 3.0, 2.6, 5.4],
  232. ["c", "l", "l", "l", "l"])
  233. para(doc, "", indent=False, after=6)
  234. para(doc, "说明:上表所列软件著作权均围绕制造业运营管理场景形成,"
  235. "涵盖订单管理、生产排程、车间透明化、仓储物流、供应商绩效与资源核查等环节,"
  236. "与本项目采购需求中的产销协同、制造协同、供应协同、采购执行、"
  237. "物料仓储、生产执行、成品仓储等业务场景直接相关。", after=24)
  238. for line in (f"供应商名称(加盖单位公章):{COMPANY}",
  239. "日  期:2026 年 __ 月 __ 日"):
  240. para(doc, line, align=WD_ALIGN_PARAGRAPH.RIGHT, indent=False, after=12)
  241. return save(doc, "软件著作权登记证书一览表")
  242. # ----------------------------------------------------------------- 团队岗位表
  243. def gen_team_table():
  244. doc = new_doc(body_pt=12)
  245. title(doc, "项目团队岗位职责与人员配备表", pt=18)
  246. para(doc, f"项目名称:{PROJECT}", indent=False, after=0)
  247. para(doc, f"项目编号:{PROJECT_NO}", indent=False, after=0)
  248. para(doc, f"供应商名称:{COMPANY}", indent=False, after=12)
  249. para(doc, "我方按采购文件对项目团队的要求配备全部岗位人员,"
  250. "岗位设置、人数与职责分工如下表。"
  251. "全部人员均与我方签订劳动合同,"
  252. "劳动合同扫描件与人员资历证明材料附后。", after=12)
  253. add_table(doc,
  254. ["序号", "岗位名称", "人数", "姓名", "主要职责"],
  255. [[str(i + 1), role, str(n), "", duty]
  256. for i, (role, n, duty) in enumerate(TEAM_ROLES)],
  257. [1.0, 3.6, 1.2, 2.4, 7.4],
  258. ["c", "l", "c", "c", "l"])
  259. para(doc, "", indent=False, after=6)
  260. para(doc, "说明:一、上表岗位覆盖采购文件要求的项目负责人、架构师、"
  261. "前后端开发工程师、测试工程师、UI 设计交互工程师全部核心岗位,"
  262. "并按采购需求增配实施顾问与运维工程师。", after=4)
  263. para(doc, "二、项目经理、技术架构师、实施顾问三个关键岗位另设备份人员,"
  264. "备份人员参与项目周例会并掌握项目状态,"
  265. "主责人员因故不能履职时可即时接手。", after=4)
  266. para(doc, "三、项目实施期间人员不得随意更换;"
  267. "确需更换时,提前书面报采购人同意,"
  268. "更换人员的资历不低于原人员。", after=24)
  269. for line in (f"供应商名称(加盖单位公章):{COMPANY}",
  270. "法定代表人或其授权代表(签字或盖章):__________",
  271. "日  期:2026 年 __ 月 __ 日"):
  272. para(doc, line, align=WD_ALIGN_PARAGRAPH.RIGHT, indent=False, after=12)
  273. return save(doc, "项目团队岗位职责与人员配备表")
  274. if __name__ == "__main__":
  275. gen_invoice_commitment()
  276. gen_no_consortium_commitment()
  277. gen_credit_commitment()
  278. gen_sw_copyright_table()
  279. gen_team_table()
  280. print("\n附件类单据生成完毕")