generate_test_data.py 45 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543
  1. """生成单表结构的测试数据(与 data/templates 的 10 份模板一一对应)。"""
  2. from __future__ import annotations
  3. import csv
  4. import sys
  5. from pathlib import Path
  6. from openpyxl import Workbook
  7. from openpyxl.comments import Comment
  8. from openpyxl.styles import Alignment, Border, Font, PatternFill, Side
  9. from openpyxl.utils import get_column_letter
  10. from openpyxl.worksheet.datavalidation import DataValidation
  11. sys.stdout.reconfigure(encoding="utf-8")
  12. OUT_DIR = Path(r"E:\CODE\knowledge_agent\data\test_data")
  13. OUT_DIR.mkdir(parents=True, exist_ok=True)
  14. HEADER_FILL = PatternFill("solid", fgColor="2F5597")
  15. HEADER_FONT = Font(name="微软雅黑", size=10, bold=True, color="FFFFFF")
  16. BODY_FONT = Font(name="微软雅黑", size=10)
  17. NOTE_FONT = Font(name="微软雅黑", size=9, color="808080")
  18. THIN = Side(style="thin", color="BFBFBF")
  19. BORDER = Border(left=THIN, right=THIN, top=THIN, bottom=THIN)
  20. TEST_FILL = PatternFill("solid", fgColor="FFF2CC")
  21. def _make_test_file(filename: str, title: str, headers: list[str], widths: list[int],
  22. rows: list[list], notes: list[str],
  23. validations: dict[int, list[str]] | None = None,
  24. comments: dict[int, str] | None = None) -> None:
  25. """一份测试数据 = 一个 CSV 文件。"""
  26. if filename.lower().endswith(".xlsx"):
  27. filename = filename[:-5] + ".csv"
  28. path = OUT_DIR / filename
  29. with path.open("w", newline="", encoding="utf-8-sig") as f:
  30. writer = csv.writer(f)
  31. writer.writerow(headers)
  32. for row in rows:
  33. writer.writerow(row)
  34. def main() -> None:
  35. days = [f"{i}日" for i in range(1, 32)]
  36. dw = [5] * 31
  37. _make_test_file(
  38. "项目信息_测试数据.xlsx", "项目主表",
  39. ["项目编号*", "项目名称*", "项目简称(选填)", "上级项目编号", "续签前项目编号",
  40. "项目起止时间", "省份", "市(区)", "细分业态", "汇总业态", "委托方式",
  41. "计费方式", "合同面积(㎡)", "合同金额(元)", "年化合同额(元)", "合同额具体信息",
  42. "服务期限", "合同状况", "首次服务日期", "年化合同收入(元)", "客户满意度(0-100)",
  43. "客户投诉(条)", "甲方名称", "项目地址", "项目负责人", "项目负责人工号*",
  44. "实际毛利率(%)", "服务状态", "备注"],
  45. [26, 18, 20, 22, 22, 24, 10, 10, 12, 12, 12, 12, 12, 14, 16, 16, 20, 18,
  46. 12, 14, 16, 16, 12, 28, 24, 14, 16, 14, 12, 20],
  47. [
  48. ["XMSQ0199", "青浦区图书馆(2025期)", "青浦-区图书馆", "", "", "2025-02-28~2026-02-27",
  49. "上海", "青浦", "场馆", "公众物业", "多项单委", "包干", 16562,
  50. 3199128, 3199110.84, "当期合同额 3199110.84", "服务期一年(公开)", "已签",
  51. "2020-01-01", 3199110.84, "", "", "上海市青浦区图书馆", "青浦区青龙路60号",
  52. "张某某", "KWL2699006", "", "历史", "测试(上一期,续签链起点)"],
  53. ["XMSQ0102", "上海市青浦区图书馆", "青浦-区图书馆", "", "XMSQ0199",
  54. "2026-02-28~2027-02-27", "上海", "青浦", "场馆", "公众物业", "多项单委",
  55. "包干", 16562, 3199128, 3199110.84, "当期合同额 3199110.84", "服务期一年(公开)",
  56. "已签", "2020-01-01", 3199110.84, "", "", "上海市青浦区图书馆", "青浦区青龙路60号",
  57. "张某某", "KWL2699006", "", "服务中", "测试(当前期,续签自 2025期)"],
  58. ["XMSQ0108", "国家税务总局上海市青浦区税务局", "青浦-税务局", "", "", "2026-01-01~2026-12-31",
  59. "上海", "青浦", "政府机构", "机关办公楼", "全委", "包干", 38999,
  60. 7943908, 7943908, "当期合同额 7943908", "服务期一年(公开)", "已签",
  61. "2020-01-01", 7943908, "", "", "国家税务总局上海市青浦区税务局", "青浦区城中西路80号",
  62. "王某某", "KWL2699007", "", "服务中", "测试(父项目)"],
  63. ["XMSQ-5-1", "税务局本部", "税务局本部", "XMSQ0108", "",
  64. "2026-01-01~2026-12-31", "上海", "青浦", "政府机构", "机关办公楼", "",
  65. "包干", 8000, "", "", "", "", "", "2020-01-01", "", "", "",
  66. "国家税务总局上海市青浦区税务局", "青浦区城中西路80号", "赵某某", "KWL2699021", "", "服务中",
  67. "测试(子项目,无金蝶编码)"],
  68. ["XMSQ-5-2", "第十税务所", "第十税务所", "XMSQ0108", "",
  69. "2026-01-01~2026-12-31", "上海", "青浦", "政府机构", "机关办公楼",
  70. "多项单委", "包干", 5000, "", "", "", "", "", "2020-01-01", "", "", "",
  71. "国家税务总局上海市青浦区税务局", "青浦区徐泾镇盈港东路1838号", "赵某某", "KWL2699021", "", "服务中",
  72. "测试(子项目)"],
  73. ["XMSQ0146", "青浦区赵巷公园", "青浦-赵巷公园", "", "", "2026-01-01~2026-12-31",
  74. "上海", "青浦", "公园", "公众物业", "多项单委", "包干", 60000,
  75. 800000, 800000, "", "服务期一年", "已签", "2024-01-01", 800000, "", "",
  76. "青浦区赵巷镇人民政府", "青浦区赵巷公园", "周某某", "KWL2699008", "", "服务中", "测试"],
  77. ["XMSQ0130", "青浦区赵巷镇政府", "青浦-赵巷镇政府", "", "", "2026-01-01~2026-12-31",
  78. "上海", "青浦", "政府机构", "机关办公楼", "全委", "包干", 14350,
  79. 1435000, 1435000, "", "服务期一年", "已签", "2021-01-01", 1435000, "", "",
  80. "青浦区赵巷镇人民政府", "青浦区赵巷镇沙家埭路18号", "周某某", "KWL2699008", "", "服务中",
  81. "测试(董一青 1-2月)"],
  82. ["XMSQ01141", "青浦-北斗园区", "青浦-北斗园区", "", "", "2026-01-01~2026-12-31",
  83. "上海", "青浦", "园区", "商业办公", "全委", "包干", 50000,
  84. 3600000, 3600000, "", "服务期一年", "已签", "2024-01-01", 3600000, "", "",
  85. "北斗园区运营方", "青浦区北斗园区", "吴某某", "KWL2699023", "", "服务中", "测试(董一青 3-4月)"],
  86. ["XMSQ0131", "青浦区青东办", "青浦-青东办", "", "", "2026-01-01~2026-12-31",
  87. "上海", "青浦", "机关办公楼", "机关办公楼", "全委", "包干", 10000,
  88. 600000, 600000, "", "服务期一年", "已签", "2023-01-01", 600000, "", "",
  89. "青浦区机关事务管理局", "青浦区青东办", "郑某某", "KWL2699024", "", "服务中", "测试(徐娥英)"],
  90. ["XMSQ0153", "青浦工业园区大楼", "青浦-工业园区", "", "", "2026-01-01~2026-12-31",
  91. "上海", "青浦", "园区", "商业办公", "全委", "包干", 80000,
  92. 1800000, 1800000, "", "服务期一年", "已签", "2005-01-01", 1800000, "", "",
  93. "青浦工业园区管理委员会", "青浦工业园区", "孙某某", "KWL2699025", "", "服务中", "测试(设备台账项目)"],
  94. ["XMSQ0176", "上海市环境监测中心", "徐汇-环境监测中心", "", "", "2026-01-01~2026-12-31",
  95. "上海", "徐汇", "机关办公楼", "机关办公楼", "全委", "包干", 30000,
  96. 1500000, 1500000, "", "服务期一年", "已签", "2014-01-01", 1500000, "", "",
  97. "上海市环境监测中心", "上海市环境监测中心", "钱某某", "KWL2699026", "", "服务中", "测试(设备台账项目)"],
  98. ["XMSQ9031", "上海市青浦区档案馆", "青浦-档案馆", "", "", "2026-01-01~2026-12-31",
  99. "上海", "青浦", "政府机构", "机关办公楼", "全委", "包干", 12000,
  100. 900000, 900000, "", "服务期一年", "已签", "2018-01-01", 900000, "", "",
  101. "上海市青浦区档案馆", "青浦区档案馆", "刘某某", "KWL2699105", "", "服务中", "测试(新增项目)"],
  102. ["XMSQ9032", "青浦区民防城运中心", "青浦民防城运", "", "", "2026-01-01~2026-12-31",
  103. "上海", "青浦", "机关办公楼", "机关办公楼", "全委", "包干", 8000,
  104. 600000, 600000, "", "服务期一年", "已签", "2019-01-01", 600000, "", "",
  105. "青浦区民防办公室", "青浦区民防城运中心", "何某某", "KWL2699106", "", "服务中", "测试(新增项目)"],
  106. ["XMSQ9033", "上海大众工业学校", "嘉定-大众工业学校", "", "", "2026-01-01~2026-12-31",
  107. "上海", "嘉定", "学校", "学校", "全委", "包干", 40000,
  108. 2200000, 2200000, "", "服务期一年", "已签", "2019-09-01", 2200000, "", "",
  109. "上海大众工业学校", "嘉定区环城路2290号", "罗某某", "KWL2699107", "", "服务中", "测试(新增项目)"],
  110. ["XMSQ9034", "上海市徐汇区群众艺术馆", "徐汇-群艺馆", "", "", "2026-01-01~2026-12-31",
  111. "上海", "徐汇", "场馆", "公众物业", "全委", "包干", 18000,
  112. 1200000, 1200000, "", "服务期一年", "已签", "2017-01-01", 1200000, "", "",
  113. "上海市徐汇区文化和旅游局", "徐汇区群艺馆", "彭某某", "KWL2699108", "", "服务中", "测试(新增项目)"],
  114. ["XMSQ9035", "上海市松江区公安局", "松江-公安局", "", "", "2026-01-01~2026-12-31",
  115. "上海", "松江", "政府机构", "机关办公楼", "全委", "包干", 25000,
  116. 1800000, 1800000, "", "服务期一年", "已签", "2016-01-01", 1800000, "", "",
  117. "上海市松江区公安局", "松江区公安局", "田某某", "KWL2699109", "", "服务中", "测试(新增项目)"],
  118. ],
  119. ["覆盖续签链(2025期→当前期)与项目从属(税务局→税务局本部/第十税务所)。"],
  120. )
  121. _make_test_file(
  122. "项目月度财务_测试数据.xlsx", "项目财务明细",
  123. ["项目编号*", "项目名称(选填)", "年月(YYYY-MM)*", "开票金额(元)", "收款金额(元)", "口径说明",
  124. "财务经办人工号*", "财务经办人(选填)", "备注"],
  125. [20, 26, 16, 16, 16, 30, 16, 14, 20],
  126. [
  127. ["XMSQ0102", "上海市青浦区图书馆", "2026-01", 266594, 266594, "测试口径", "KWL2699012", "财务员甲", "测试"],
  128. ["XMSQ0102", "上海市青浦区图书馆", "2026-02", 266594, 266594, "测试口径", "KWL2699012", "财务员甲", "测试"],
  129. ["XMSQ0102", "上海市青浦区图书馆", "2026-03", 266594, 266594, "测试口径", "KWL2699012", "财务员甲", "测试"],
  130. ["XMSQ0153", "青浦工业园区大楼", "2026-01", 150000, 140000, "测试口径", "KWL2699012", "财务员甲", "测试"],
  131. ["XMSQ0176", "上海市环境监测中心", "2026-02", 125000, 125000, "测试口径", "KWL2699012", "财务员甲", "测试"],
  132. ["XMSQ9031", "上海市青浦区档案馆", "2026-01", 75000, 75000, "测试口径", "KWL2699012", "财务员甲", "测试"],
  133. ["XMSQ9032", "青浦区民防城运中心", "2026-02", 50000, 48000, "测试口径", "KWL2699012", "财务员甲", "测试"],
  134. ["XMSQ9033", "上海大众工业学校", "2026-03", 183333, 180000, "测试口径", "KWL2699012", "财务员甲", "测试"],
  135. ["XMSQ9034", "上海市徐汇区群众艺术馆", "2026-01", 100000, 100000, "测试口径", "KWL2699012", "财务员甲", "测试"],
  136. ],
  137. ["测试项目月度财务(开票/收款)。"],
  138. )
  139. _make_test_file(
  140. "月度快照_测试数据.xlsx", "月度快照",
  141. ["项目编号*", "项目名称(选填)", "年月(YYYY-MM)*", "在岗人数", "排班人次",
  142. "考勤人次", "开票金额(元)", "收款金额(元)", "备注"],
  143. [20, 26, 16, 12, 12, 12, 16, 16, 24],
  144. [
  145. ["XMSQ0102", "上海市青浦区图书馆", "2026-01", 8, 180, 180, 266594, 266594, "测试"],
  146. ["XMSQ0102", "上海市青浦区图书馆", "2026-02", 8, 180, 180, 266594, 266594, "测试"],
  147. ["XMSQ0102", "上海市青浦区图书馆", "2026-03", 8, 190, 190, 266594, 266594, "测试"],
  148. ["XMSQ0153", "青浦工业园区大楼", "2026-02", 6, 140, 140, 150000, 140000, "测试"],
  149. ["XMSQ0176", "上海市环境监测中心", "2026-02", 4, 90, 90, 125000, 125000, "测试"],
  150. ["XMSQ0146", "青浦区赵巷公园", "2026-03", 7, 160, 160, 0, 0, "测试"],
  151. ["XMSQ0130", "青浦区赵巷镇政府", "2026-02", 3, 60, 60, 0, 0, "测试"],
  152. ["XMSQ01141", "青浦-北斗园区", "2026-03", 5, 110, 110, 0, 0, "测试"],
  153. ["XMSQ9031", "上海市青浦区档案馆", "2026-01", 4, 80, 80, 75000, 75000, "测试"],
  154. ["XMSQ9033", "上海大众工业学校", "2026-03", 5, 120, 120, 183333, 180000, "测试"],
  155. ],
  156. ["测试月度快照,覆盖不同项目/月份,用于项目月度汇总对比。"],
  157. )
  158. _make_test_file(
  159. "科目余额_测试数据.xlsx", "科目余额",
  160. ["项目编号*", "项目名称(选填)", "期间(YYYY-MM)*", "科目编码*", "科目名称",
  161. "借方发生额(元)", "贷方发生额(元)", "期末余额(元)", "备注"],
  162. [20, 26, 16, 16, 22, 16, 16, 16, 24],
  163. [
  164. ["XMSQ0102", "上海市青浦区图书馆", "2026-01", "6602", "物业费收入", 0, 266594, 266594, "测试"],
  165. ["XMSQ0102", "上海市青浦区图书馆", "2026-01", "6401", "主营业务成本", 120000, 0, 120000, "测试"],
  166. ["XMSQ0102", "上海市青浦区图书馆", "2026-02", "6602", "物业费收入", 0, 266594, 266594, "测试"],
  167. ["XMSQ0102", "上海市青浦区图书馆", "2026-02", "6401", "主营业务成本", 118000, 0, 118000, "测试"],
  168. ["XMSQ0153", "青浦工业园区大楼", "2026-01", "6602", "物业费收入", 0, 150000, 150000, "测试"],
  169. ["XMSQ0153", "青浦工业园区大楼", "2026-01", "6401", "主营业务成本", 72000, 0, 72000, "测试"],
  170. ["XMSQ0176", "上海市环境监测中心", "2026-02", "6602", "物业费收入", 0, 125000, 125000, "测试"],
  171. ["XMSQ9031", "上海市青浦区档案馆", "2026-01", "6602", "物业费收入", 0, 75000, 75000, "测试"],
  172. ["XMSQ9033", "上海大众工业学校", "2026-03", "6602", "物业费收入", 0, 183333, 183333, "测试"],
  173. ],
  174. ["测试科目余额,覆盖不同项目/期间/科目编码,支持科目级财务追溯。"],
  175. )
  176. _make_test_file(
  177. "投标记录_测试数据.xlsx", "投标记录",
  178. ["项目编号*", "项目名称(选填)", "年份*", "投标类型", "中标结果", "中标日期", "投标金额(元)", "文档路径",
  179. "投标经办人工号*", "投标经办人(选填)", "备注"],
  180. [20, 26, 10, 14, 12, 14, 16, 50, 16, 14, 20],
  181. [
  182. ["XMSQ0102", "上海市青浦区图书馆", 2024, "中标通知书", "中标", "2024-02-01", 3199128,
  183. "1-青浦区域/102-青浦区图书馆", "KWL2699010", "陈某某", "测试"],
  184. ["XMSQ0102", "上海市青浦区图书馆", 2026, "中标通知书", "中标", "2026-02-01", 3199128,
  185. "1-青浦区域/102-青浦区图书馆", "KWL2699010", "陈某某", "测试"],
  186. ["XMSQ0108", "国家税务总局上海市青浦区税务局", 2026, "中标通知书", "中标", "2025-12-20", 7943908,
  187. "1-青浦区域/108-青浦区税务局", "KWL2699010", "陈某某", "测试"],
  188. ["XMSQ9031", "上海市青浦区档案馆", 2026, "中标通知书", "中标", "2026-01-10", 900000,
  189. "1-青浦区域/青浦区档案馆", "KWL2699010", "陈某某", "测试"],
  190. ["XMSQ9034", "上海市徐汇区群众艺术馆", 2025, "中标公告", "中标", "2025-06-15", 1200000,
  191. "4-中心区域/徐汇群艺馆", "KWL2699010", "陈某某", "测试"],
  192. ["XMSQ9033", "上海大众工业学校", 2026, "投标文件", "未知", "", 2200000,
  193. "3-嘉定区域/大众工业学校", "KWL2699010", "陈某某", "测试"],
  194. ],
  195. ["测试投标/中标事件记录。"],
  196. )
  197. _make_test_file(
  198. "人员信息_测试数据.xlsx", "人员主表",
  199. ["姓名*", "工号*", "组织名称", "岗位名称*", "当前服务项目编号(选填)", "服务起始年月", "服务结束年月",
  200. "职级", "员工层级", "所属组织名称", "入职日期", "离职日期", "司龄", "性别",
  201. "出生日期", "政治面貌", "联系电话", "备注"],
  202. [14, 16, 14, 20, 22, 14, 14, 10, 16, 14, 14, 14, 10, 8, 14, 12, 16, 20],
  203. [
  204. ["陆雷雷", "KWL2306998", "保安部", "保安_领班", "XMSQ0146", "2026-01", "2026-12",
  205. "P3", "一线员工", "保安部", "2025-01-01", "", "1.5年", "男", "1980-05-12", "汉族", "", "真实员工"],
  206. ["王惠云", "KWL2307010", "保安部", "保安_普保", "XMSQ0146", "2026-01", "2026-12",
  207. "P2", "一线员工", "保安部", "2024-06-01", "", "2年", "男", "1982-03-08", "汉族", "", "真实员工"],
  208. ["董一青", "KWL2307024", "管理处", "项目经理", "XMSQ01141", "2026-01", "2026-04",
  209. "P5", "项目管理人员", "管理处", "2023-02-01", "", "3年", "男", "1978-11-20", "汉族", "",
  210. "真实员工(1-2月赵巷镇政府,3-4月北斗园区,由考勤明细体现)"],
  211. ["徐娥英", "KWL2309539", "保洁部", "保洁_内场", "XMSQ0131", "2026-01", "2026-12",
  212. "P1", "一线员工", "保洁部", "2020-05-01", "", "6年", "女", "1975-09-15", "汉族", "", "真实员工"],
  213. ["测试甲", "KWL2699001", "会务部", "会务_接待", "XMSQ0102", "2026-01", "2026-12",
  214. "P3", "一线员工", "会务部", "2024-03-01", "", "2年", "女", "1990-01-01", "汉族", "", "构造员工"],
  215. ["测试乙", "KWL2699002", "保安部", "保安_领班", "XMSQ0102", "2026-01", "2026-12",
  216. "P2", "一线员工", "保安部", "2023-08-01", "", "2.5年", "男", "1985-06-15", "汉族", "", "构造员工"],
  217. ["测试丙", "KWL2699003", "工程部", "工程_强电", "XMSQ0153", "2026-01", "2026-12",
  218. "P3", "一线员工", "工程部", "2022-04-01", "", "4年", "男", "1988-12-01", "汉族", "", "构造员工"],
  219. ["测试丁", "KWL2699004", "保洁部", "保洁_外场", "XMSQ0176", "2026-01", "2026-12",
  220. "P1", "一线员工", "保洁部", "2023-01-10", "", "3年", "女", "1979-07-07", "汉族", "", "构造员工"],
  221. ["陈志强", "KWL2699101", "保安部", "保安_普保", "XMSQ0146", "2026-01", "2026-12",
  222. "P2", "一线员工", "保安部", "2023-05-20", "", "3年", "男", "1986-04-15", "汉族", "", "构造员工"],
  223. ["林芳", "KWL2699102", "保洁部", "保洁_外场", "XMSQ0146", "2026-01", "2026-12",
  224. "P1", "一线员工", "保洁部", "2022-08-01", "", "4年", "女", "1981-10-02", "汉族", "", "构造员工"],
  225. ["黄伟", "KWL2699103", "工程部", "工程_水电", "XMSQ0153", "2026-01", "2026-12",
  226. "P3", "一线员工", "工程部", "2021-03-15", "", "5年", "男", "1984-02-28", "汉族", "", "构造员工"],
  227. ["杨丽", "KWL2699104", "会务部", "会务_领班", "XMSQ0102", "2026-01", "2026-12",
  228. "P3", "一线员工", "会务部", "2022-11-01", "", "3.5年", "女", "1990-08-12", "汉族", "", "构造员工"],
  229. ["张三", "KWL2699005", "管理处", "品质专员", "XMSQ0102", "2026-01", "2026-12",
  230. "P3", "职能人员", "管理处", "2021-06-01", "", "5年", "男", "1983-03-03", "汉族", "", "构造员工(检查人)"],
  231. ["李四", "KWL2699202", "管理处", "品质专员", "XMSQ0108", "2026-01", "2026-12",
  232. "P3", "职能人员", "管理处", "2021-09-01", "", "5年", "男", "1982-07-19", "汉族", "", "构造员工(检查人)"],
  233. ["王五", "KWL2699203", "管理处", "品质专员", "XMSQ0176", "2026-01", "2026-12",
  234. "P3", "职能人员", "管理处", "2020-12-01", "", "5.5年", "男", "1984-11-11", "汉族", "", "构造员工(检查人)"],
  235. ["陈某某", "KWL2699010", "管理处", "投标专员", "", "2026-01", "2026-12",
  236. "P3", "职能人员", "管理处", "2021-04-01", "", "5年", "男", "1986-05-05", "汉族", "", "构造员工(投标经办人)"],
  237. ["采购员甲", "KWL2699011", "管理处", "采购专员", "", "2026-01", "2026-12",
  238. "P3", "职能人员", "管理处", "2020-03-01", "", "6年", "女", "1985-09-09", "汉族", "", "构造员工(采购经办人)"],
  239. ["财务员甲", "KWL2699012", "管理处", "财务专员", "", "2026-01", "2026-12",
  240. "P3", "职能人员", "管理处", "2019-08-01", "", "7年", "女", "1981-12-12", "汉族", "", "构造员工(财务经办人)"],
  241. ["设备员甲", "KWL2699013", "工程部", "设备管理员", "", "2026-01", "2026-12",
  242. "P3", "一线员工", "工程部", "2020-05-01", "", "6年", "男", "1983-01-25", "汉族", "", "构造员工(设备责任人)"],
  243. ["王片区", "KWL2699020", "管理处", "片区负责人", "", "2026-01", "2026-12",
  244. "P4", "项目管理人员", "管理处", "2018-01-01", "", "8年", "男", "1978-06-06", "汉族", "", "构造员工(片区负责人)"],
  245. ["李片区", "KWL2699022", "管理处", "片区负责人", "", "2026-01", "2026-12",
  246. "P4", "项目管理人员", "管理处", "2019-02-01", "", "7年", "女", "1980-04-04", "汉族", "", "构造员工(片区负责人)"],
  247. ["张某某", "KWL2699006", "管理处", "项目经理", "XMSQ0102", "2026-01", "2026-12",
  248. "P5", "项目管理人员", "管理处", "2019-05-01", "", "7年", "男", "1979-08-08", "汉族", "", "构造员工(项目负责人)"],
  249. ["王某某", "KWL2699007", "管理处", "项目经理", "XMSQ0108", "2026-01", "2026-12",
  250. "P5", "项目管理人员", "管理处", "2018-10-01", "", "8年", "男", "1977-02-02", "汉族", "", "构造员工(项目负责人)"],
  251. ["赵某某", "KWL2699021", "管理处", "项目经理", "XMSQ-5-1", "2026-01", "2026-12",
  252. "P4", "项目管理人员", "管理处", "2020-07-01", "", "6年", "男", "1981-10-10", "汉族", "", "构造员工(项目负责人)"],
  253. ["周某某", "KWL2699008", "管理处", "项目经理", "XMSQ0146", "2026-01", "2026-12",
  254. "P4", "项目管理人员", "管理处", "2019-11-01", "", "7年", "男", "1980-12-12", "汉族", "", "构造员工(项目负责人)"],
  255. ["吴某某", "KWL2699023", "管理处", "项目经理", "XMSQ01141", "2026-01", "2026-12",
  256. "P4", "项目管理人员", "管理处", "2020-01-01", "", "6年", "男", "1979-09-09", "汉族", "", "构造员工(项目负责人)"],
  257. ["郑某某", "KWL2699024", "管理处", "项目经理", "XMSQ0131", "2026-01", "2026-12",
  258. "P4", "项目管理人员", "管理处", "2020-02-01", "", "6年", "女", "1982-05-05", "汉族", "", "构造员工(项目负责人)"],
  259. ["孙某某", "KWL2699025", "管理处", "项目经理", "XMSQ0153", "2026-01", "2026-12",
  260. "P4", "项目管理人员", "管理处", "2019-03-01", "", "7年", "男", "1978-07-07", "汉族", "", "构造员工(项目负责人)"],
  261. ["钱某某", "KWL2699026", "管理处", "项目经理", "XMSQ0176", "2026-01", "2026-12",
  262. "P4", "项目管理人员", "管理处", "2019-04-01", "", "7年", "女", "1981-01-01", "汉族", "", "构造员工(项目负责人)"],
  263. ["刘某某", "KWL2699105", "管理处", "项目经理", "XMSQ9031", "2026-01", "2026-12",
  264. "P4", "项目管理人员", "管理处", "2020-06-01", "", "6年", "男", "1979-06-06", "汉族", "", "构造员工(项目负责人)"],
  265. ["何某某", "KWL2699106", "管理处", "项目经理", "XMSQ9032", "2026-01", "2026-12",
  266. "P4", "项目管理人员", "管理处", "2020-08-01", "", "6年", "女", "1983-03-03", "汉族", "", "构造员工(项目负责人)"],
  267. ["罗某某", "KWL2699107", "管理处", "项目经理", "XMSQ9033", "2026-01", "2026-12",
  268. "P4", "项目管理人员", "管理处", "2019-12-01", "", "6.5年", "男", "1978-11-11", "汉族", "", "构造员工(项目负责人)"],
  269. ["彭某某", "KWL2699108", "管理处", "项目经理", "XMSQ9034", "2026-01", "2026-12",
  270. "P4", "项目管理人员", "管理处", "2020-09-01", "", "6年", "女", "1980-10-10", "汉族", "", "构造员工(项目负责人)"],
  271. ["田某某", "KWL2699109", "管理处", "项目经理", "XMSQ9035", "2026-01", "2026-12",
  272. "P4", "项目管理人员", "管理处", "2019-01-01", "", "7.5年", "男", "1977-12-12", "汉族", "", "构造员工(项目负责人)"],
  273. ],
  274. ["服务起始/结束年月用于直接生成 服务于 边;董一青的跨项目流动由考勤明细体现。"],
  275. )
  276. def att_row(emp_id, name, proj_code, proj_name, ym, day_code, days, work, ot, hol, meal, ot_fee, hol_fee, duty, note):
  277. d = [day_code if i <= days else "" for i in range(1, 32)]
  278. return [name, emp_id, proj_code, proj_name, ym, *d, work, ot, hol, meal, ot_fee, hol_fee, duty, "", note]
  279. att_headers = ["姓名*", "工号*", "项目编号*", "项目名称(选填)", "年月(YYYY-MM)*", *days,
  280. "上班天数", "平时加班小时", "国定加班小时", "餐费补助金额(元)",
  281. "加班超时费金额(元)", "国定加班费金额(元)", "值班费金额(元)", "税后工资(元)", "备注"]
  282. att_widths = [14, 16, 20, 26, 16, *dw, 10, 12, 12, 16, 18, 18, 16, 16, 20]
  283. att_rows = [
  284. att_row("KWL2306998", "陆雷雷", "XMSQ0146", "青浦区赵巷公园", "2026-01", "日1", 22, 22, 74, 0, 308, 1748.25, 0, 4896.25, "测试"),
  285. att_row("KWL2306998", "陆雷雷", "XMSQ0146", "青浦区赵巷公园", "2026-02", "日1", 20, 20, 60, 0, 280, 1417.5, 0, 4620, "测试"),
  286. att_row("KWL2306998", "陆雷雷", "XMSQ0146", "青浦区赵巷公园", "2026-03", "日1", 21, 21, 70, 0, 294, 1653.75, 0, 4725, "测试"),
  287. att_row("KWL2307010", "王惠云", "XMSQ0146", "青浦区赵巷公园", "2026-01", "日", 21, 21, 57, 11, 147, 1346.625, 519.75, 0, "测试(日夜班示例)"),
  288. att_row("KWL2307024", "董一青", "XMSQ0130", "青浦区赵巷镇政府", "2026-01", "常", 21, 21, 0, 0, 147, 0, 0, 0, "测试(1月赵巷镇政府)"),
  289. att_row("KWL2307024", "董一青", "XMSQ0130", "青浦区赵巷镇政府", "2026-02", "常", 20, 20, 8, 0, 140, 189, 0, 0, "测试(2月赵巷镇政府)"),
  290. att_row("KWL2307024", "董一青", "XMSQ01141", "青浦-北斗园区", "2026-03", "常", 21, 21, 0, 0, 147, 0, 0, 0, "测试(3月北斗园区)"),
  291. att_row("KWL2307024", "董一青", "XMSQ01141", "青浦-北斗园区", "2026-04", "常", 21, 21, 5, 0, 147, 118.125, 0, 0, "测试(4月北斗园区)"),
  292. att_row("KWL2309539", "徐娥英", "XMSQ0131", "青浦区青东办", "2026-01", "常", 21, 21, 0, 0, 147, 0, 0, 0, "测试"),
  293. att_row("KWL2309539", "徐娥英", "XMSQ0131", "青浦区青东办", "2026-02", "常", 20, 20, 0, 0, 140, 0, 0, 0, "测试"),
  294. att_row("KWL2309539", "徐娥英", "XMSQ0131", "青浦区青东办", "2026-03", "常", 21, 21, 0, 0, 147, 0, 0, 0, "测试"),
  295. att_row("KWL2699001", "测试甲", "XMSQ0102", "上海市青浦区图书馆", "2026-01", "常", 21, 21, 0, 0, 147, 0, 0, 0, "测试"),
  296. att_row("KWL2699001", "测试甲", "XMSQ0102", "上海市青浦区图书馆", "2026-02", "常", 20, 20, 4, 0, 140, 94.5, 0, 0, "测试"),
  297. att_row("KWL2699001", "测试甲", "XMSQ0102", "上海市青浦区图书馆", "2026-03", "常", 21, 21, 6, 0, 147, 150.75, 0, 0, "测试"),
  298. att_row("KWL2699002", "测试乙", "XMSQ0102", "上海市青浦区图书馆", "2026-01", "常", 21, 21, 0, 0, 147, 0, 0, 0, "测试"),
  299. att_row("KWL2699002", "测试乙", "XMSQ0102", "上海市青浦区图书馆", "2026-02", "常", 20, 20, 0, 0, 140, 0, 0, 0, "测试"),
  300. att_row("KWL2699003", "测试丙", "XMSQ0153", "青浦工业园区大楼", "2026-02", "常", 20, 20, 10, 0, 140, 236.25, 0, 0, "测试"),
  301. att_row("KWL2699004", "测试丁", "XMSQ0176", "上海市环境监测中心", "2026-02", "常", 20, 20, 0, 0, 140, 0, 0, 0, "测试"),
  302. att_row("KWL2699002", "测试乙", "XMSQ0102", "上海市青浦区图书馆", "2026-03", "常", 21, 21, 0, 0, 147, 0, 0, 0, "测试"),
  303. att_row("KWL2699005", "张三", "XMSQ0102", "上海市青浦区图书馆", "2026-03", "常", 21, 21, 0, 0, 147, 0, 0, 0, "测试"),
  304. att_row("KWL2699006", "张某某", "XMSQ0102", "上海市青浦区图书馆", "2026-03", "常", 21, 21, 0, 0, 147, 0, 0, 0, "测试"),
  305. att_row("KWL2699101", "陈志强", "XMSQ0146", "青浦区赵巷公园", "2026-01", "日", 21, 21, 0, 0, 147, 0, 0, 0, "测试"),
  306. att_row("KWL2699101", "陈志强", "XMSQ0146", "青浦区赵巷公园", "2026-02", "日", 20, 20, 0, 0, 140, 0, 0, 0, "测试"),
  307. att_row("KWL2699101", "陈志强", "XMSQ0146", "青浦区赵巷公园", "2026-03", "日", 21, 21, 0, 0, 147, 0, 0, 0, "测试"),
  308. att_row("KWL2699102", "林芳", "XMSQ0146", "青浦区赵巷公园", "2026-01", "常", 21, 21, 0, 0, 147, 0, 0, 0, "测试"),
  309. att_row("KWL2699102", "林芳", "XMSQ0146", "青浦区赵巷公园", "2026-02", "常", 20, 20, 0, 0, 140, 0, 0, 0, "测试"),
  310. att_row("KWL2699102", "林芳", "XMSQ0146", "青浦区赵巷公园", "2026-03", "常", 21, 21, 0, 0, 147, 0, 0, 0, "测试"),
  311. att_row("KWL2699103", "黄伟", "XMSQ0153", "青浦工业园区大楼", "2026-01", "常", 21, 21, 0, 0, 147, 0, 0, 0, "测试"),
  312. att_row("KWL2699103", "黄伟", "XMSQ0153", "青浦工业园区大楼", "2026-02", "常", 20, 20, 0, 0, 140, 0, 0, 0, "测试"),
  313. att_row("KWL2699103", "黄伟", "XMSQ0153", "青浦工业园区大楼", "2026-03", "常", 21, 21, 0, 0, 147, 0, 0, 0, "测试"),
  314. att_row("KWL2699104", "杨丽", "XMSQ0102", "上海市青浦区图书馆", "2026-01", "常", 21, 21, 0, 0, 147, 0, 0, 0, "测试"),
  315. att_row("KWL2699104", "杨丽", "XMSQ0102", "上海市青浦区图书馆", "2026-02", "常", 20, 20, 0, 0, 140, 0, 0, 0, "测试"),
  316. att_row("KWL2699104", "杨丽", "XMSQ0102", "上海市青浦区图书馆", "2026-03", "常", 21, 21, 0, 0, 147, 0, 0, 0, "测试"),
  317. ]
  318. _make_test_file(
  319. "考勤与人员财务_测试数据.xlsx", "考勤与人员财务",
  320. att_headers, att_widths, att_rows,
  321. ["18 条记录覆盖 2026-01~04,含跨项目流动(董一青);每日状态为简化测试值。"],
  322. )
  323. def shift_row(emp_id, name, proj_code, proj_name, ym, code, days):
  324. d = [code if i <= days else "OFF" for i in range(1, 32)]
  325. return [name, emp_id, proj_code, proj_name, ym, *d, "测试"]
  326. _make_test_file(
  327. "排班月报_测试数据.xlsx", "排班月报",
  328. ["姓名*", "工号*", "项目编号*", "项目名称(选填)", "年月(YYYY-MM)*", *days, "备注"],
  329. [14, 16, 20, 26, 16, *dw, 20],
  330. [
  331. shift_row("KWL2306998", "陆雷雷", "XMSQ0146", "青浦区赵巷公园", "2026-01", "A003", 22),
  332. shift_row("KWL2307024", "董一青", "XMSQ0130", "青浦区赵巷镇政府", "2026-01", "SQ-C13", 21),
  333. shift_row("KWL2307024", "董一青", "XMSQ0130", "青浦区赵巷镇政府", "2026-02", "SQ-C13", 20),
  334. shift_row("KWL2307024", "董一青", "XMSQ01141", "青浦-北斗园区", "2026-03", "SQ-C13", 21),
  335. shift_row("KWL2309539", "徐娥英", "XMSQ0131", "青浦区青东办", "2026-01", "A003", 21),
  336. shift_row("KWL2699001", "测试甲", "XMSQ0102", "上海市青浦区图书馆", "2026-03", "A003", 21),
  337. shift_row("KWL2699002", "测试乙", "XMSQ0102", "上海市青浦区图书馆", "2026-03", "A003", 21),
  338. shift_row("KWL2699005", "张三", "XMSQ0102", "上海市青浦区图书馆", "2026-03", "A003", 21),
  339. shift_row("KWL2699006", "张某某", "XMSQ0102", "上海市青浦区图书馆", "2026-03", "A003", 21),
  340. shift_row("KWL2699101", "陈志强", "XMSQ0146", "青浦区赵巷公园", "2026-01", "A003", 21),
  341. shift_row("KWL2699102", "林芳", "XMSQ0146", "青浦区赵巷公园", "2026-02", "A003", 20),
  342. shift_row("KWL2699103", "黄伟", "XMSQ0153", "青浦工业园区大楼", "2026-03", "A003", 21),
  343. shift_row("KWL2699104", "杨丽", "XMSQ0102", "上海市青浦区图书馆", "2026-01", "SQ-C13", 21),
  344. ],
  345. ["排班测试行,班次代码常用值见模板说明。"],
  346. )
  347. _make_test_file(
  348. "岗位编制_测试数据.xlsx", "岗位编制",
  349. ["项目编号*", "项目名称(选填)", "岗位", "预算编制", "项目编制", "标准工时人数", "在岗人数", "备注"],
  350. [20, 26, 20, 10, 10, 14, 12, 20],
  351. [
  352. ["XMSQ0102", "上海市青浦区图书馆", "保安_领班", 1, 1, 1, 1, "测试"],
  353. ["XMSQ0102", "上海市青浦区图书馆", "保洁_主管", 2, 2, 2, 2, "测试"],
  354. ["XMSQ0102", "上海市青浦区图书馆", "会务_接待", 1, 1, 1, 1, "测试"],
  355. ["XMSQ0146", "青浦区赵巷公园", "保安_领班", 1, 1, 1, 1, "测试"],
  356. ["XMSQ9031", "上海市青浦区档案馆", "保安_领班", 1, 1, 1, 1, "测试"],
  357. ["XMSQ9032", "青浦区民防城运中心", "保洁_主管", 2, 2, 2, 2, "测试"],
  358. ["XMSQ9033", "上海大众工业学校", "保安_主管", 2, 2, 2, 2, "测试"],
  359. ["XMSQ0153", "青浦工业园区大楼", "工程_强电", 3, 3, 3, 2, "测试(在岗缺编示例)"],
  360. ],
  361. ["岗位编制测试行。"],
  362. )
  363. _make_test_file(
  364. "设备信息_测试数据.xlsx", "设备主表",
  365. ["项目编号*", "项目名称(选填)", "设备编号*", "设备类型", "名称", "规格型号参数", "制造厂商", "安装位置",
  366. "出厂日期", "启用日期", "入项目日期", "退项目日期", "出厂编号", "完好状况", "原值(元)",
  367. "设备责任人工号*", "设备责任人(选填)", "备注"],
  368. [20, 26, 20, 12, 16, 26, 24, 22, 14, 14, 14, 14, 16, 14, 14, 16, 14, 20],
  369. [
  370. ["XMSQ0153", "青浦工业园区大楼", "XF-PLB-01-B1-01", "消防", "喷淋泵", "200T/H 110M 55KW", "上海熊猫",
  371. "主楼地下水泵房", "2004-12", "2005-09", "2005-09", "", "10379", "使用正常", "",
  372. "KWL2699013", "设备员甲", "真实台账"],
  373. ["XMSQ0153", "青浦工业园区大楼", "XF-XFB-01-B1-01", "消防", "消防泵", "200T/H 110M 55KW", "上海熊猫",
  374. "主楼地下水泵房", "2004-12", "2005-09", "2005-09", "", "10478", "使用正常", "",
  375. "KWL2699013", "设备员甲", "真实台账"],
  376. ["XMSQ0153", "青浦工业园区大楼", "DT-KT-01-01", "电梯", "客梯", "OTIS3200 17站17门 1000KG", "中澳集团",
  377. "主楼中间", "2006-08", "", "2006-09", "", "07NA5711", "使用正常", "",
  378. "KWL2699013", "设备员甲", "真实台账"],
  379. ["XMSQ0153", "青浦工业园区大楼", "KT-LSJZ-01-B1-01", "空调", "冷水机组", "30HXC350A", "开利",
  380. "主楼地下室", "2005-03", "2005-09", "2005-09", "", "H350E1240", "使用正常", "",
  381. "KWL2699013", "设备员甲", "真实台账"],
  382. ["XMSQ0176", "上海市环境监测中心", "KT-DJ-01-13-1", "空调", "大金空调", "RUXYQ16AB", "上海大金",
  383. "1号13楼楼顶", "2013-07", "2014-03", "2014-03", "", "", "使用正常", "",
  384. "KWL2699013", "设备员甲", "真实台账"],
  385. ["XMSQ0176", "上海市环境监测中心", "DT-KT-01-01-01", "电梯", "电梯", "HGP 13层", "日立电梯",
  386. "行政楼", "2010-12", "2014-06", "2014-06", "", "09G035218", "使用正常", "",
  387. "KWL2699013", "设备员甲", "真实台账"],
  388. ["XMSQ0153", "青浦工业园区大楼", "GPS-RSB-01-B1-01", "给排水", "热水泵", "6T/H 40M 1.1KW", "凯利",
  389. "主楼地下泵房", "2004-05", "2005-09", "2005-09", "", "10801", "使用正常", "",
  390. "KWL2699013", "设备员甲", "真实台账"],
  391. ["XMSQ0176", "上海市环境监测中心", "XF-XFB-1-B1F-01", "消防", "消防泵", "XBD8/40-125L", "上海双解",
  392. "地下水泵房", "2013-07", "2014-06", "2014-06", "", "1307131", "使用正常", "",
  393. "KWL2699013", "设备员甲", "真实台账"],
  394. ],
  395. ["设备为真实台账片段(工业园区/环境监测中心)。"],
  396. )
  397. _make_test_file(
  398. "采购与维保_测试数据.xlsx", "采购与维保",
  399. ["记录类型*", "项目编号*", "项目名称(选填)", "供应商名称", "供应商编号(选填)", "类别", "名称/合同名称", "数量", "单位",
  400. "单价(元)", "金额(元)", "合同年限", "月份/日期", "当前状态", "经办人工号*", "经办人(选填)", "备注"],
  401. [14, 20, 26, 24, 14, 16, 24, 10, 8, 12, 14, 10, 14, 12, 16, 14, 20],
  402. [
  403. ["供应商", "", "", "上海熊猫", "SUP0001", "设备厂家", "", "", "", "", "", "", "", "",
  404. "KWL2699011", "采购员甲", "测试"],
  405. ["供应商", "", "", "上海大金", "SUP0002", "设备厂家", "", "", "", "", "", "", "", "",
  406. "KWL2699011", "采购员甲", "测试"],
  407. ["供应商", "", "", "开利", "SUP0003", "设备厂家", "", "", "", "", "", "", "", "",
  408. "KWL2699011", "采购员甲", "测试"],
  409. ["供应商", "", "", "日立电梯", "SUP0004", "维保单位", "", "", "", "", "", "", "", "",
  410. "KWL2699011", "采购员甲", "测试"],
  411. ["供应商", "", "", "洁力清洁用品", "SUP0005", "耗材供应商", "", "", "", "", "", "", "", "",
  412. "KWL2699011", "采购员甲", "测试"],
  413. ["维保合同", "XMSQ0153", "青浦工业园区大楼", "上海熊猫", "SUP0001", "电梯维保", "电梯维保合同", "", "", "",
  414. 125000, 3, "2026-01", "", "KWL2699011", "采购员甲", "测试"],
  415. ["维保合同", "XMSQ0176", "上海市环境监测中心", "上海大金", "SUP0002", "空调维保", "空调维保合同", "", "", "",
  416. 83000, 2, "2026-01", "", "KWL2699011", "采购员甲", "测试"],
  417. ["耗材采购", "XMSQ0102", "上海市青浦区图书馆", "洁力清洁用品", "SUP0005", "保洁耗材", "垃圾袋", 500, "卷", 2.5,
  418. 1250, "", "2026-02", "", "KWL2699011", "采购员甲", "测试"],
  419. ["耗材采购", "XMSQ0153", "青浦工业园区大楼", "洁力清洁用品", "SUP0005", "工程耗材", "灯泡", 100, "个", 8,
  420. 800, "", "2026-02", "", "KWL2699011", "采购员甲", "测试"],
  421. ["固定资产", "XMSQ0102", "上海市青浦区图书馆", "", "", "低值易耗", "塑封机", 1, "台", "", 159,
  422. "", "2025-02-05", "在用", "KWL2699011", "采购员甲", "测试"],
  423. ["固定资产", "XMSQ0102", "上海市青浦区图书馆", "", "", "低值易耗", "一米栏", 30, "根", "", 4200,
  424. "", "2025-03-12", "在用", "KWL2699011", "采购员甲", "测试"],
  425. ["维保合同", "XMSQ9031", "上海市青浦区档案馆", "开利", "SUP0003", "消防维保", "消防维保合同", "", "", "",
  426. 60000, 2, "2026-01", "", "KWL2699011", "采购员甲", "测试"],
  427. ["耗材采购", "XMSQ9033", "上海大众工业学校", "洁力清洁用品", "SUP0005", "办公耗材", "打印纸", 50, "箱", 120,
  428. 6000, "", "2026-03", "", "KWL2699011", "采购员甲", "测试"],
  429. ["固定资产", "XMSQ0153", "青浦工业园区大楼", "", "", "办公设备", "打印机", 2, "台", "", 3000,
  430. "", "2025-08-01", "在用", "KWL2699011", "采购员甲", "测试"],
  431. ],
  432. ["一张表四类记录(供应商/维保合同/耗材采购/固定资产),按记录类型填对应列。"],
  433. )
  434. _make_test_file(
  435. "检查记录_测试数据.xlsx", "检查记录",
  436. ["项目编号*", "项目名称(选填)", "检查类型", "检查日期", "检查得分(0-100)", "问题描述", "整改情况",
  437. "整改完成日期", "检查人工号*", "检查人(选填)", "备注"],
  438. [20, 26, 14, 14, 16, 40, 30, 14, 16, 12, 20],
  439. [
  440. ["XMSQ0102", "上海市青浦区图书馆", "品质检查", "2026-03-15", 92, "大厅地面清洁不及时", "已整改",
  441. "2026-03-20", "KWL2699005", "张三", "测试"],
  442. ["XMSQ0108", "国家税务总局上海市青浦区税务局", "安全检查", "2026-02-10", 88, "消防通道堆放杂物", "已清理",
  443. "2026-02-12", "KWL2699202", "李四", "测试"],
  444. ["XMSQ0176", "上海市环境监测中心", "消防检查", "2026-01-20", 95, "", "", "", "KWL2699203", "王五", "测试"],
  445. ["XMSQ9031", "上海市青浦区档案馆", "安全检查", "2026-02-18", 90, "档案库房灭火器压力不足", "已更换",
  446. "2026-02-20", "KWL2699005", "张三", "测试"],
  447. ["XMSQ9033", "上海大众工业学校", "消防检查", "2026-01-25", 93, "教学楼消防通道堆放杂物", "已清理",
  448. "2026-01-27", "KWL2699202", "李四", "测试"],
  449. ["XMSQ0146", "青浦区赵巷公园", "品质检查", "2026-04-10", 91, "公厕异味", "已处理",
  450. "2026-04-12", "KWL2699203", "王五", "测试"],
  451. ],
  452. ["测试品质/安全/消防检查记录。"],
  453. )
  454. _make_test_file(
  455. "片区信息_测试数据.xlsx", "片区主表",
  456. ["片区编号*", "片区名称*", "片区负责人工号*", "片区负责人(选填)", "备注"],
  457. [16, 20, 16, 14, 20],
  458. [
  459. ["PQ-001", "青东片区", "KWL2699022", "李片区", "测试"],
  460. ["PQ-002", "青中1区", "KWL2699020", "王片区", "测试"],
  461. ["PQ-003", "青中2区", "KWL2699020", "王片区", "测试"],
  462. ["PQ-004", "中心区域", "KWL2699020", "王片区", "测试"],
  463. ["PQ-005", "嘉定区域", "KWL2699020", "王片区", "测试"],
  464. ["PQ-006", "松江区域", "KWL2699020", "王片区", "测试"],
  465. ],
  466. ["片区主数据测试行,片区负责人为人员节点关联。"],
  467. )
  468. _make_test_file(
  469. "项目片区关系_测试数据.xlsx", "项目片区关系",
  470. ["项目编号*", "项目名称(选填)", "片区编号*", "片区名称(选填)", "备注"],
  471. [20, 26, 16, 20, 20],
  472. [
  473. ["XMSQ0102", "上海市青浦区图书馆", "PQ-003", "青中2区", "测试"],
  474. ["XMSQ0108", "国家税务总局上海市青浦区税务局", "PQ-002", "青中1区", "测试"],
  475. ["XMSQ-5-1", "税务局本部", "PQ-002", "青中1区", "测试"],
  476. ["XMSQ-5-2", "第十税务所", "PQ-001", "青东片区", "测试"],
  477. ["XMSQ-5-2", "第十税务所", "PQ-002", "青中1区", "测试(一个项目多片区示例)"],
  478. ["XMSQ0146", "青浦区赵巷公园", "PQ-001", "青东片区", "测试"],
  479. ["XMSQ0130", "青浦区赵巷镇政府", "PQ-001", "青东片区", "测试"],
  480. ["XMSQ01141", "青浦-北斗园区", "PQ-001", "青东片区", "测试"],
  481. ["XMSQ0131", "青浦区青东办", "PQ-001", "青东片区", "测试"],
  482. ["XMSQ0153", "青浦工业园区大楼", "PQ-002", "青中1区", "测试"],
  483. ["XMSQ0176", "上海市环境监测中心", "PQ-004", "中心区域", "测试"],
  484. ["XMSQ9031", "上海市青浦区档案馆", "PQ-002", "青中1区", "测试"],
  485. ["XMSQ9032", "青浦区民防城运中心", "PQ-001", "青东片区", "测试"],
  486. ["XMSQ9033", "上海大众工业学校", "PQ-005", "嘉定区域", "测试"],
  487. ["XMSQ9034", "上海市徐汇区群众艺术馆", "PQ-004", "中心区域", "测试"],
  488. ["XMSQ9035", "上海市松江区公安局", "PQ-006", "松江区域", "测试"],
  489. ],
  490. ["项目-片区 M:N 关系测试行(第十税务所属于两个片区作示例)。"],
  491. )
  492. _make_test_file(
  493. "人员证书_测试数据.xlsx", "人员证书",
  494. ["工号*", "姓名(选填)", "专业类别", "证书类别", "证书名称*", "备注"],
  495. [16, 14, 14, 14, 32, 20],
  496. [
  497. ["KWL2306998", "陆雷雷", "安防", "从业资格证", "保安员(三级)", "测试"],
  498. ["KWL2307010", "王惠云", "安防", "从业资格证", "保安员(五级)", "测试"],
  499. ["KWL2699103", "黄伟", "工程", "从业资格证", "低压电工作业", "测试"],
  500. ["KWL2699003", "测试丙", "工程", "从业资格证", "高压电工作业", "测试"],
  501. ["KWL2699003", "测试丙", "工程", "其他", "电梯维修证", "测试"],
  502. ["KWL2307024", "董一青", "综合管理", "职称证", "物业管理师", "测试"],
  503. ["KWL2699005", "张三", "综合管理", "从业资格证", "上物协物业经理证", "测试"],
  504. ["KWL2699005", "张三", "综合管理", "职称证", "物业管理师", "测试"],
  505. ["KWL2699104", "杨丽", "综合管理", "其他", "会务服务证", "测试"],
  506. ],
  507. ["人员证书测试行,覆盖安防/工程/综合管理及多证书人员(测试丙、张三)。"],
  508. )
  509. print("测试数据已生成(CSV 格式):")
  510. for f in sorted(OUT_DIR.glob("*.csv")):
  511. print(f" {f.name}")
  512. if __name__ == "__main__":
  513. main()