Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

392 рядки
22KB

  1. # coding=utf-8
  2. import sys
  3. import re
  4. import mysql_pool
  5. from pymysql.converters import escape_string
  6. import cosin_similarity
  7. import pandas as pd
  8. import datetime
  9. import requests
  10. import os
  11. wdys1 = {
  12. "项目名称": "xmmc",
  13. "现状问题": "xzwt",
  14. "系统基础": "xtjc",
  15. "项目目标": "xmmb",
  16. "预期绩效": "yqjx",
  17. "建设需求": "jsxq",
  18. "数据需求": "sjxq",
  19. "安全需求": "aqxq",
  20. "业务领域": "ywly",
  21. "核心业务": "hxyw",
  22. "业务需求": "ywxq",
  23. "业务协同": "ywxt",
  24. "建设层级": "jscj",
  25. "用户范围": "yhfw",
  26. "目标群体": "mbqt",
  27. "建设内容": "jsnr",
  28. "功能模块": "gnmk",
  29. "数据共享": "sjgx",
  30. "智能要素": "znys"
  31. }
  32. wdys2 = {
  33. "xmmc": "项目名称",
  34. "xzwt": "现状问题",
  35. "xtjc": "系统基础",
  36. "xmmb": "项目目标",
  37. "yqjx": "预期绩效",
  38. "jsxq": "建设需求",
  39. "sjxq": "数据需求",
  40. "aqxq": "安全需求",
  41. "ywly": "业务领域",
  42. "hxyw": "核心业务",
  43. "ywxq": "业务需求",
  44. "ywxt": "业务协同",
  45. "jscj": "建设层级",
  46. "yhfw": "用户范围",
  47. "mbqt": "目标群体",
  48. "jsnr": "建设内容",
  49. "gnmk": "功能模块",
  50. "sjgx": "数据共享",
  51. "znys": "智能要素"
  52. }
  53. gnmkys = {
  54. "gnmc": "功能名称",
  55. "gnms": "功能描述"
  56. }
  57. def getFlag():
  58. data_dict = {}
  59. df = pd.read_excel("0825-丽水系统查重维度.xlsx")
  60. data = df.values
  61. data = list(pd.Series(data[:, 1]).dropna())
  62. for d in data:
  63. try:
  64. wd = re.search("(.*?)(.*?%)", d).group(1).strip()
  65. wdc = wdys1.get(wd)
  66. if wdc:
  67. qz = re.search(".*?((.*?%))", d).group(1)
  68. data_dict[wdc] = qz
  69. except:
  70. pass
  71. return data_dict
  72. def gong_neng_mo_kuai(mysql, dl, data, er_title):
  73. # 将excel文件中的所有第三维度内容进行拼接
  74. str_dict = {}
  75. for et in er_title:
  76. for d in data:
  77. if d[1] == et:
  78. if str_dict.get(et):
  79. str_dict[et] = str_dict.get(et) + d[3]
  80. else:
  81. str_dict[et] = d[3]
  82. # print(str_dict)
  83. for k, v in str_dict.items():
  84. mysql.sql_change_msg(
  85. """insert into idc_project_module (project_id, check_duplicate_count, module_name, module_content, create_time, update_time, tag) value(%d, 1, "%s", "%s", "%s", "%s", "模块")""" % (
  86. int(dl[0]), k, v, str(datetime.datetime.now())[:-7], str(datetime.datetime.now())[:-7]))
  87. module_id_list = mysql.sql_select_many(
  88. """select project_module_id, module_name, module_content from idc_project_module where project_id=%d""" % dl[
  89. 0])
  90. data_list = []
  91. for mil in module_id_list:
  92. data_dict = {}
  93. data_dict["project_module_id"] = mil.get("project_module_id")
  94. data_dict["gnmc"] = mil.get("module_name")
  95. data_dict["gnms"] = mil.get("module_content")
  96. data_list.append(data_dict)
  97. # print(data_list)
  98. for i in data_list:
  99. gnmk_copy1 = mysql.sql_select_many("""select * from user_history_module_data""")
  100. if gnmk_copy1:
  101. for gc in gnmk_copy1:
  102. total_similarity1 = 0
  103. total_keywords1 = []
  104. total_similarity2 = 0
  105. total_keywords2 = []
  106. mysql.sql_change_msg(
  107. """insert into idc_project_module_check (project_module_id, module_name, project_name, company_name, create_time, update_time) value(%d, "%s", "%s", "%s", "%s", "%s")"""
  108. % (
  109. i.get("project_module_id"), gc.get("gnmc"), gc.get("xmmc"), "",
  110. str(datetime.datetime.now())[:-7],
  111. str(datetime.datetime.now())[:-7]))
  112. dup_module_id = mysql.cur.lastrowid
  113. for j in ["gnmc", "gnms"]:
  114. # 循环遍历每一个模块名称
  115. content_x = gc.get(j)
  116. content_y = i.get(j)
  117. if content_x and content_y:
  118. if j == "gnmc":
  119. similarity = cosin_similarity.CosineSimilarity(content_x, content_y)
  120. # 相似度 关键词
  121. similarity, keyword_x, keywords = similarity.main()
  122. similarity = similarity * 1
  123. total_keywords1 += keywords
  124. print("######################相似度: %.2f%%" % similarity, "关键词: %s" % keywords)
  125. # 相似度相加
  126. total_similarity1 += similarity
  127. mysql.sql_change_msg(
  128. """insert into idc_project_module_check_detail (dup_module_id, project_name, module_content, dup_module_content, similarity, dimension, create_time, update_time) value (%d, "%s", "%s", "%s", %f, "%s", "%s", "%s")"""
  129. % (dup_module_id, dl[2], escape_string(content_y), escape_string(content_x), similarity,
  130. "功能名称",
  131. str(datetime.datetime.now())[:-7], str(datetime.datetime.now())[:-7]))
  132. else:
  133. similarity = cosin_similarity.CosineSimilarity(content_x, content_y)
  134. # 相似度 关键词
  135. similarity, keyword_x, keywords = similarity.main()
  136. similarity = similarity * 99
  137. total_keywords2 += keywords
  138. print("######################相似度: %.2f%%" % similarity, "关键词: %s" % keywords)
  139. # 相似度相加
  140. total_similarity2 += similarity
  141. mysql.sql_change_msg(
  142. """insert into idc_project_module_check_detail (dup_module_id, project_name, module_content, dup_module_content, similarity, dimension, create_time, update_time) value (%d, "%s", "%s", "%s", %f, "%s", "%s", "%s")"""
  143. % (dup_module_id, dl[2], escape_string(content_y), escape_string(content_x), similarity,
  144. "功能模块描述",
  145. str(datetime.datetime.now())[:-7], str(datetime.datetime.now())[:-7]))
  146. mysql.sql_change_msg("""update idc_project_module_check set similarity=%f where dup_module_id=%d""" % (
  147. total_similarity1 + total_similarity2, dup_module_id))
  148. gnmk_gjc = {}
  149. for a in ["gnmc", "gnms"]:
  150. if i.get(a):
  151. content_x = i.get(a)
  152. content_y = i.get(a)
  153. if a == "gnmc":
  154. similarity = cosin_similarity.CosineSimilarity(content_x, content_y)
  155. # 相似度 关键词
  156. similarity, keyword_x, keywords = similarity.main()
  157. gnmk_gjc[a] = keywords
  158. else:
  159. similarity = cosin_similarity.CosineSimilarity(content_x, content_y)
  160. # 相似度 关键词
  161. similarity, keyword_x, keywords = similarity.main()
  162. gnmk_gjc[a] = keywords
  163. mysql.sql_change_msg("""insert into user_module_keywords (xmmc, gnmc, gnms) value("%s", "%s", "%s")""" % (
  164. dl[2], str(gnmk_gjc.get("gnmc"))[1:-1] if gnmk_gjc.get("gnmc") else None,
  165. str(gnmk_gjc.get("gnms"))[1:-1] if gnmk_gjc.get("gnms") else None))
  166. def project_check(data_list):
  167. mysql = mysql_pool.ConnMysql()
  168. # mysql.sql_select_many("""select * from mkgjc""")
  169. # 读取维度和权重
  170. # xmnr_count = len(mysql.sql_select_many("""select * from xmnr_copy1"""))
  171. # gnmk_count = len(mysql.sql_select_many("""select * from gnmk_copy1"""))
  172. xmnr_count = len(mysql.sql_select_many("""select * from user_history_data"""))
  173. gnmk_count = len(mysql.sql_select_many("""select * from user_history_module_data"""))
  174. get_data_dict = getFlag()
  175. # 遍历excel存储路径
  176. for dl in data_list:
  177. # path = "0825-丽水系统查重维度1.xlsx"
  178. # 读取路径下的excel
  179. df = pd.read_excel(dl[1])
  180. data = df.values
  181. # 将excel文件中的所有维度内容进行拼接
  182. join_str = ""
  183. str_dict = {}
  184. title = ""
  185. er_title = set()
  186. for d in data:
  187. if pd.notnull(d[0]):
  188. title = d[0]
  189. if title == "功能模块":
  190. er_title.add(d[1])
  191. join_str = ""
  192. for i in d[1:]:
  193. if pd.notnull(i):
  194. join_str +=i
  195. str_dict[wdys1.get(title)] = join_str
  196. else:
  197. if title == "功能模块":
  198. er_title.add(d[1])
  199. for i in d[1:]:
  200. if pd.notnull(i):
  201. join_str +=i
  202. str_dict[wdys1.get(title)] = str_dict.get(wdys1.get(title)) + join_str
  203. # print(str_dict)
  204. mysql.sql_change_msg(
  205. """insert into user_data (xmmc, xzwt, xtjc, xmmb, yqjx, jsxq, sjxq, aqxq, ywly, hxyw, ywxq, ywxt, jscj, yhfw, mbqt, jsnr, gnmk, sjgx, znys) value ("%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s")"""
  206. % (dl[0], str_dict.get("xzwt") if str_dict.get("xzwt") else None,
  207. str_dict.get("xtjc") if str_dict.get("xtjc") else None,
  208. str_dict.get("xmmb") if str_dict.get("xmmb") else None,
  209. str_dict.get("yqjx") if str_dict.get("yqjx") else None,
  210. str_dict.get("jsxq") if str_dict.get("jsxq") else None,
  211. str_dict.get("sjxq") if str_dict.get("sjxq") else None,
  212. str_dict.get("aqxq") if str_dict.get("aqxq") else None,
  213. str_dict.get("ywly") if str_dict.get("ywly") else None,
  214. str_dict.get("hxyw") if str_dict.get("hxyw") else None,
  215. str_dict.get("ywxq") if str_dict.get("ywxq") else None,
  216. str_dict.get("ywxt") if str_dict.get("ywxt") else None,
  217. str_dict.get("jscj") if str_dict.get("jscj") else None,
  218. str_dict.get("yhfw") if str_dict.get("yhfw") else None,
  219. str_dict.get("mbqt") if str_dict.get("mbqt") else None,
  220. str_dict.get("jsnr") if str_dict.get("jsnr") else None,
  221. str_dict.get("gnmk") if str_dict.get("gnmk") else None,
  222. str_dict.get("sjgx") if str_dict.get("sjgx") else None,
  223. str_dict.get("znys") if str_dict.get("znys") else None))
  224. # 或取所有的xmnr_copy1
  225. xmnr_copy1 = mysql.sql_select_many("""select * from user_history_data""")
  226. # 对比xmnr_copy1和xmnr维度是否都有
  227. if xmnr_copy1:
  228. for xc in xmnr_copy1:
  229. total_keywords = {}
  230. total_similarity = 0
  231. dup_count = 0
  232. # 保存相加后的相似度到idc_project_check
  233. mysql.sql_change_msg(
  234. """insert into idc_project_check (project_id, dup_project_name, file_path, company_name, create_year, project_tag, project_range_tag, project_area, create_time, update_time) value ("%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s")"""
  235. % (dl[0], xc.get("xmmc"), dl[1], "", "", "需求相似、业务相似", "历史项目", "",
  236. str(datetime.datetime.now())[:-7], str(datetime.datetime.now())[:-7]))
  237. dup_id = mysql.cur.lastrowid
  238. for x in list(xc.keys())[1:]:
  239. content_x = xc.get(x)
  240. content_y = str_dict.get(x)
  241. if content_x and content_y:
  242. if x == 'gnmk':
  243. continue
  244. elif x == 'jsnr':
  245. continue
  246. else:
  247. dup_count += 1
  248. for x in list(xc.keys())[1:]:
  249. content_x = xc.get(x)
  250. content_y = str_dict.get(x)
  251. if content_x and content_y:
  252. if x == 'gnmk':
  253. # 匹配到历史数据,次数加1
  254. # dup_count += 1
  255. # 循环遍历每一个维度
  256. similarity = cosin_similarity.CosineSimilarity(content_x, content_y)
  257. # 相似度 关键词
  258. similarity, keywords_x, keywords_y = similarity.main()
  259. similarity = similarity * 50
  260. print("**************相似度: %.2f%%" % similarity, "关键词: %s" % keywords_y)
  261. # 相似度相加
  262. total_similarity += similarity
  263. # 关键词收集
  264. total_keywords[x] = keywords_y
  265. function_content = content_y
  266. dup_function_content = content_x
  267. for word_y in keywords_y:
  268. word_y = word_y.strip().strip("'").strip('"')
  269. function_content = str(function_content.replace("\"", "'")).replace(word_y,
  270. f'<span class="similarity">{word_y.strip()}</span>')
  271. for word_x in keywords_x:
  272. word_x = word_x.strip().strip("'").strip('"')
  273. dup_function_content = str(dup_function_content.replace("\"", "'")).replace(word_x,
  274. f'<span class="similarity">{word_x.strip()}</span>')
  275. # 保存每个维度对应的相似度到idc_project_check_detail
  276. mysql.sql_change_msg(
  277. """insert into idc_project_check_detail (dup_id, dimension, similarity, function_content, dup_function_content, create_time, update_time) value (%d, "%s", %f, "%s", "%s", "%s", "%s")"""
  278. % (dup_id, wdys2.get(x), similarity, escape_string(function_content),
  279. escape_string(dup_function_content), str(datetime.datetime.now())[:-7],
  280. str(datetime.datetime.now())[:-7]))
  281. # content = content.replace(gjcs, f'<span class="similarity">{gjcs.strip()}</span>')
  282. elif x == 'jsnr':
  283. similarity = cosin_similarity.CosineSimilarity(content_x, content_y)
  284. # 相似度 关键词
  285. similarity, keywords_x, keywords_y = similarity.main()
  286. similarity = similarity * 40
  287. print("**************相似度: %.2f%%" % similarity, "关键词: %s" % keywords_y)
  288. # 相似度相加
  289. total_similarity += similarity
  290. # 关键词收集
  291. total_keywords[x] = keywords_y
  292. function_content = content_y
  293. dup_function_content = content_x
  294. for word_y in keywords_y:
  295. word_y = word_y.strip().strip("'").strip('"')
  296. function_content = str(function_content.replace("\"", "'")).replace(word_y,
  297. f'<span class="similarity">{word_y.strip()}</span>')
  298. for word_x in keywords_x:
  299. word_x = word_x.strip().strip("'").strip('"')
  300. dup_function_content = str(dup_function_content.replace("\"", "'")).replace(word_x,
  301. f'<span class="similarity">{word_x.strip()}</span>')
  302. # 保存每个维度对应的相似度到idc_project_check_detail
  303. mysql.sql_change_msg(
  304. """insert into idc_project_check_detail (dup_id, dimension, similarity, function_content, dup_function_content, create_time, update_time) value (%d, "%s", %f, "%s", "%s", "%s", "%s")"""
  305. % (dup_id, wdys2.get(x), similarity, escape_string(function_content),
  306. escape_string(dup_function_content), str(datetime.datetime.now())[:-7],
  307. str(datetime.datetime.now())[:-7]))
  308. else:
  309. similarity = cosin_similarity.CosineSimilarity(content_x, content_y)
  310. # 相似度 关键词
  311. similarity, keywords_x, keywords_y = similarity.main()
  312. similarity = similarity * (10 / dup_count)
  313. print("**************相似度: %.2f%%" % similarity, "关键词: %s" % keywords_y)
  314. # 相似度相加
  315. total_similarity += similarity
  316. # 关键词收集
  317. total_keywords[x] = keywords_y
  318. function_content = content_y
  319. dup_function_content = content_x
  320. for word_y in keywords_y:
  321. word_y = word_y.strip().strip("'").strip('"')
  322. function_content = str(function_content.replace("\"", "'")).replace(word_y,
  323. f'<span class="similarity">{word_y.strip()}</span>')
  324. for word_x in keywords_x:
  325. word_x = word_x.strip().strip("'").strip('"')
  326. dup_function_content = str(dup_function_content.replace("\"", "'")).replace(word_x,
  327. f'<span class="similarity">{word_x.strip()}</span>')
  328. # 保存每个维度对应的相似度到idc_project_check_detail
  329. mysql.sql_change_msg(
  330. """insert into idc_project_check_detail (dup_id, dimension, similarity, function_content, dup_function_content, create_time, update_time) value (%d, "%s", %f, "%s", "%s", "%s", "%s")"""
  331. % (dup_id, wdys2.get(x), similarity, escape_string(function_content),
  332. escape_string(dup_function_content), str(datetime.datetime.now())[:-7],
  333. str(datetime.datetime.now())[:-7]))
  334. mysql.sql_change_msg(
  335. """update idc_project_check set similarity=%f where dup_id=%d""" % (total_similarity, dup_id))
  336. project_gjc = {}
  337. for w in wdys2.keys():
  338. content_x = str_dict.get(w)
  339. content_y = str_dict.get(w)
  340. if content_x and content_y:
  341. # 循环遍历每一个维度
  342. similarity = cosin_similarity.CosineSimilarity(content_x, content_y)
  343. # 相似度 关键词
  344. similarity, keywords_x, keywords = similarity.main()
  345. project_gjc[w] = keywords
  346. mysql.sql_change_msg(
  347. """insert into user_keyword (xmmc, xzwt, xtjc, xmmb, yqjx, jsxq, sjxq, aqxq, ywly, hxyw, ywxq, ywxt, jscj, yhfw, mbqt, jsnr, gnmk, sjgx, znys) value ("%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s")"""
  348. % (dl[0], str(project_gjc.get("xzwt"))[1:-1] if project_gjc.get("xzwt") else None,
  349. str(project_gjc.get("xtjc"))[1:-1] if project_gjc.get("xtjc") else None,
  350. str(project_gjc.get("xmmb"))[1:-1] if project_gjc.get("xmmb") else None,
  351. str(project_gjc.get("yqjx"))[1:-1] if project_gjc.get("yqjx") else None,
  352. str(project_gjc.get("jsxq"))[1:-1] if project_gjc.get("jsxq") else None,
  353. str(project_gjc.get("sjxq"))[1:-1] if project_gjc.get("sjxq") else None,
  354. str(project_gjc.get("aqxq"))[1:-1] if project_gjc.get("aqxq") else None,
  355. str(project_gjc.get("ywly"))[1:-1] if project_gjc.get("ywly") else None,
  356. str(project_gjc.get("hxyw"))[1:-1] if project_gjc.get("hxyw") else None,
  357. str(project_gjc.get("ywxq"))[1:-1] if project_gjc.get("ywxq") else None,
  358. str(project_gjc.get("ywxt"))[1:-1] if project_gjc.get("ywxt") else None,
  359. str(project_gjc.get("jscj"))[1:-1] if project_gjc.get("jscj") else None,
  360. str(project_gjc.get("yhfw"))[1:-1] if project_gjc.get("yhfw") else None,
  361. str(project_gjc.get("mbqt"))[1:-1] if project_gjc.get("mbqt") else None,
  362. str(project_gjc.get("jsnr"))[1:-1] if project_gjc.get("jsnr") else None,
  363. str(project_gjc.get("gnmk"))[1:-1] if project_gjc.get("gnmk") else None,
  364. str(project_gjc.get("sjgx"))[1:-1] if project_gjc.get("sjgx") else None,
  365. str(project_gjc.get("znys"))[1:-1] if project_gjc.get("znys") else None))
  366. mysql.sql_change_msg(
  367. """update idc_project set dup_status=3, one_vote_veto_status=1, self_check_status=1, history_project_count=%d ,module_count=%d where project_id=%d""" % (
  368. xmnr_count, gnmk_count, dl[0]))
  369. gong_neng_mo_kuai(mysql, dl, data, er_title)
  370. if __name__ == "__main__":
  371. all_path = requests.get("http://127.0.0.1:19099/check/duplicates/%s" % 15).json()
  372. # print(all_path)
  373. #
  374. # data_list = []
  375. # for ap in all_path.get("data"):
  376. # # if os.path.exists(ap.get("file_path")):
  377. # data_list.append((ap.get("project_id"), ap.get("file_path"), ap.get("project_name")))
  378. # print(data_list)
  379. # data_list = [(11, r"D:\pythonDM\Ndkj\duplicate_check\0825-丽水系统查重维度1.xlsx", "数字百山祖(一期)—“云值守”建设方案")]
  380. # project_check(data_list)