app.py 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  1. # coding:utf-8
  2. import inspect
  3. from tables.fields.winner import WinnerChecker
  4. from tables.fields.buyer import BuyerChecker
  5. from tables.fields.bidamount import BidAmountChecker
  6. from tables.fields.budget import BudgetChecker
  7. from tables.fields.NoField import NoFieldChecker
  8. from tables.fields.title import TitleChecker
  9. from tables.fields.area import AreaChecker
  10. from tables.fields.projectcode import ProjectcodeChecker
  11. from tables.fields.projectname import ProjectnameChecker
  12. from tables.fields.subpackage import SubpackageChecker
  13. from tables import CatchContentObject
  14. from tables.fields.fieldtype import FieldTypeChecker
  15. from tables.fields.purchasing import PurchasingChecker
  16. area_checker = AreaChecker()
  17. winner_checker = WinnerChecker()
  18. buyer_checker = BuyerChecker()
  19. amount_checker = BidAmountChecker()
  20. budget_checker = BudgetChecker()
  21. title_checker = TitleChecker()
  22. nofield_checker = NoFieldChecker()
  23. projectname_checker = ProjectnameChecker()
  24. projectcode_checker = ProjectcodeChecker()
  25. multipackage_checker = SubpackageChecker()
  26. fieldtype_checker = FieldTypeChecker()
  27. purchasing_checker = PurchasingChecker()
  28. # 定义检查链
  29. check_chain = {
  30. "title": {
  31. "checker": title_checker,
  32. },
  33. "projectname": {
  34. "checker": projectname_checker,
  35. },
  36. "winner": {
  37. "checker": winner_checker,
  38. },
  39. "buyer": {
  40. "checker": buyer_checker,
  41. },
  42. "projectcode": {
  43. "checker": projectcode_checker,
  44. },
  45. "bidamount": {
  46. "checker": amount_checker,
  47. },
  48. "budget": {
  49. "checker": budget_checker,
  50. },
  51. "area": {
  52. "checker": area_checker,
  53. },
  54. "multipackage": {
  55. "checker": multipackage_checker,
  56. },
  57. "purchasinglist": {
  58. "checker": purchasing_checker,
  59. }
  60. }
  61. def check_params(func, param_rows: dict, is_check_type=False) -> (bool, list):
  62. """
  63. 函数传参数
  64. """
  65. _default_params = {"attach_text": {}, "bidamount": 0, "budget": 0} # 必要参数的默认值
  66. func_params = inspect.getfullargspec(func) # 取出函数的参数
  67. args_annotations = func_params.annotations # 参数类型dict,取出参数类型
  68. args_list = func_params.args # 参数list
  69. if "self" in args_list:
  70. args_list.remove("self")
  71. params = {} # 返回参数列表
  72. for arg in args_list:
  73. if arg in param_rows: # 存在参数
  74. if is_check_type and not isinstance(param_rows[arg], args_annotations[arg]):
  75. # 不满足参数类型需求
  76. return False, []
  77. params[arg] = param_rows[arg]
  78. elif arg in _default_params: # 使用默认值
  79. params[arg] = _default_params[arg]
  80. # print(params, args_list)
  81. if len(params) != len(args_list):
  82. # 参数不够
  83. return False, params
  84. return True, params # 满足参数需求
  85. def check(obj: any, rules) -> any:
  86. """
  87. 单行数据质量检查
  88. :return:any
  89. """
  90. catch_content = CatchContentObject()
  91. obj["catch_content"] = catch_content
  92. field_qa = {}
  93. for field in rules: # 获取检查字段
  94. qa = {}
  95. # 字段检查
  96. if field not in obj:
  97. func = nofield_checker.errors_tables[field]
  98. # 开始执行函数
  99. if func(obj, catch_content):
  100. qa["0000"] = f"{field}:不存在!!"
  101. field_qa["%s_qa" % field] = qa
  102. continue
  103. # 字段存在,判断类型是否正确如值为null的,并把英文括号转换为中文括号
  104. # 类型检查
  105. func_type = fieldtype_checker.errors_tables[field]
  106. value = func_type(obj.get(field))
  107. if value is True:
  108. qa["0001"] = f"{field}:类型不正确、空值"
  109. field_qa["%s_qa" % field] = qa
  110. continue
  111. checker = check_chain[field]["checker"] # 获取检测器
  112. for err,err_detail in rules[field].items(): # 获取检测的规则
  113. # 错误类型检查
  114. if err not in checker.errors_tables:
  115. qa[err] = f"{field}:服务端未定义错误类型"
  116. field_qa["%s_qa" % field] = qa
  117. continue
  118. func = checker.errors_tables[err]["checkFn"] # 获取检查方法
  119. status, params = check_params(func, obj) # 多参数解决方案
  120. if status:
  121. # 开始执行函数
  122. if func(**params):
  123. qa[err] = err_detail.get("name","")
  124. else:
  125. # 参数不满足要求
  126. qa[err] = f"{field}:必须参数(字段)缺失"
  127. field_qa["%s_qa" % field] = qa
  128. return field_qa
  129. if __name__ == '__main__':
  130. row={
  131. "comeintime" : int(1698739748),
  132. "area" : "内蒙古",
  133. "purchasingsource" : "[{\"start\": 13, \"verify\": \"确定\", \"direction\": \"h\", \"type\": \"识别\", \"header\": {\"itemname\": \"产品名称\", \"model\": \"技术规格\", \"number\": \"数量\", \"unitprice\": \"单价(元)\", \"totalprice\": \"金额(元)\"}, \"file_name\": \"公告\"}]",
  134. "toptype" : "结果",
  135. "spidercode" : "nm_nmgzzqzfcgw_dzmc_zgcgcjgs",
  136. "extracttype" : int(1),
  137. "s_sha" : "9269588cb73151d8ec09cf16347539678549f81395559589a731ca1394828582",
  138. "detail" : "二连浩特市人民医院在政采商城电子卖场完成协议供货直购采购,采购结果确认如下:<br/>一、项目概述<br/>采购编号:ELHTSZFCG-DD-2023-407774<br/>采购单位:二连浩特市人民医院<br/>所属区域:二连浩特市本级<br/>预算金额(元):15,440.00<br/>采购人及联系方式:白瑜/7535324<br/>采购计划备案书/核准书编号:二财购备字(电子)[2023]00864号<br/>采购方式:电子卖场(协议采购)<br/>二、采购结果<br/>成交供应商:二连浩特市智慧真彩文体办公<br/>成交时间:2023-10-31 15:24<br/>成交金额:15440.00,大写(人民币):壹万伍仟肆佰肆拾元整。<br/> <table border=\"1\"> <tbody><tr> <th>产品名称</th> <th>技术规格</th> <th>备注</th> <th>数量</th> <th>单价(元)</th> <th>金额(元)</th> </tr> <tr> <td>台式计算机</td> <td> 联想/LENOVO,<br/> 联想/LENOVOThinkCentre M930Z-GEN2 台式计算机 I5-10500/8G/512G/DVDRW/2G独立/WIFI/摄像头/W10-HOME / 23寸液晶屏,<br/> M930Z,<br/> 数量:2;<br/> </td> <td></td> <td>2</td> <td> ¥5450.0000<br/> </td> <td> ¥10900.00<br/> </td> </tr> <tr> <td>台式计算机</td> <td> 联想/LENOVO,<br/> 联想 启天M420 台式计算机 商用办公计算机 处理器I3-9100 / 4G / 1T / 集显 / 21.5寸液晶显示器,<br/> M420,<br/> 数量:1;<br/> </td> <td></td> <td>1</td> <td> ¥4540.0000<br/> </td> <td> ¥4540.00<br/> </td> </tr> <tr> <td>合计</td> <td colspan=\"5\"> ¥15440.00 大写(人民币): 壹万伍仟肆佰肆拾元整</td> </tr> </tbody></table><br/> 采购单位:二连浩特市人民医院<br/> 2023年10月31日",
  139. "purchasing" : "台式计算机",
  140. "site" : "内蒙古自治区政府采购网",
  141. "title" : "二连浩特市人民医院台式计算机(等)直接订购成交公告",
  142. "dataging" : int(0),
  143. "publishtime" : int(1698739410),
  144. "subtype" : "成交",
  145. "purchasinglist" : [
  146. {
  147. "score" : 0.8275,
  148. "itemname" : "台式计算机",
  149. "model" : "联想/LENOVO, 联想/LENOVOThinkCentre M930Z-GEN2 台式计算机 I5-10500/8G^~^",
  150. "number" : 2.0,
  151. "unitprice" : 5450.0,
  152. "totalprice" : 10900.0,
  153. "table" : int(0)
  154. },
  155. {
  156. "unitprice" : 4540.0,
  157. "totalprice" : 4540.0,
  158. "table" : int(0),
  159. "score" : 0.8275,
  160. "itemname" : "台式计算机",
  161. "model" : "联想/LENOVO, 联想 启天M420 台式计算机 商用办公计算机 处理器I3-9100 / 4G / 1T / 集显^~^",
  162. "number" : 1.0
  163. }
  164. ],
  165. "goods_start" : int(1698739805),
  166. "type" : "",
  167. "city" : "锡林郭勒盟",
  168. "areaval" : int(16),
  169. "contenthtml" : "\n <div class=\"noticeArea\">\n <div class=\"contractWrap\" style=\"page-break-after: always;\">\n <p></p>\n <p>二连浩特市人民医院在政采商城电子卖场完成协议供货直购采购,采购结果确认如下:</p>\n <h3><strong>一、项目概述</strong></h3>\n <p>采购编号:ELHTSZFCG-DD-2023-407774</p>\n <p>采购单位:二连浩特市人民医院</p>\n <p>所属区域:二连浩特市本级</p>\n <p>预算金额(元):15,440.00</p>\n <p>采购人及联系方式:白瑜/7535324</p>\n <p>采购计划备案书/核准书编号:二财购备字(电子)[2023]00864号</p>\n <p>采购方式:电子卖场(协议采购)</p>\n <h3><strong>二、采购结果</strong></h3>\n <p>成交供应商:二连浩特市智慧真彩文体办公</p>\n <p>成交时间:2023-10-31 15:24</p>\n <p>成交金额:15440.00,大写(人民币):壹万伍仟肆佰肆拾元整。</p>\n <table cellpadding=\"0\" cellspacing=\"0\" class=\"noticeTable\" border=\"1\" style=\"width:100%\">\n <tbody><tr style=\"height:40px\">\n <th style=\"width:18%;text-align:center;\">产品名称</th>\n <th style=\"width:32%;text-align:center;\">技术规格</th>\n <th style=\"width:12%;text-align:center;\">备注</th>\n <th style=\"width:12%;text-align:center;\">数量</th>\n <th style=\"width:13%;text-align:center;\">单价(元)</th>\n <th style=\"width:13%;text-align:center;\">金额(元)</th>\n </tr>\n <!--订单商品集合-->\n <tr style=\"height:36px;\">\n <td style=\"padding:3px 5px;\">台式计算机</td>\n <td style=\"padding:3px 5px;\">\n 联想/LENOVO,\n 联想/LENOVOThinkCentre M930Z-GEN2 台式计算机 I5-10500/8G/512G/DVDRW/2G独立/WIFI/摄像头/W10-HOME / 23寸液晶屏,\n M930Z,\n 数量:2;\n <br/>\n \n </td>\n <td></td>\n <td style=\"padding:3px 5px;text-align:center\">2</td>\n <td style=\"padding:3px 5px;text-align:right\">\n ¥5450.0000\n </td>\n <td style=\"padding:3px 5px;text-align:right\">\n ¥10900.00\n </td>\n </tr>\n<!--订单商品集合-->\n <tr style=\"height:36px;\">\n <td style=\"padding:3px 5px;\">台式计算机</td>\n <td style=\"padding:3px 5px;\">\n 联想/LENOVO,\n 联想 启天M420 台式计算机 商用办公计算机 处理器I3-9100 / 4G / 1T / 集显 / 21.5寸液晶显示器,\n M420,\n 数量:1;\n <br/>\n \n </td>\n <td></td>\n <td style=\"padding:3px 5px;text-align:center\">1</td>\n <td style=\"padding:3px 5px;text-align:right\">\n ¥4540.0000\n </td>\n <td style=\"padding:3px 5px;text-align:right\">\n ¥4540.00\n </td>\n </tr>\n <tr style=\"height:36px\">\n <td style=\"text-align: center;padding:3px 5px;\">合计</td>\n <td colspan=\"5\" style=\"text-align: left;padding:3px 5px;\">\n ¥15440.00 大写(人民币): 壹万伍仟肆佰肆拾元整</td>\n </tr>\n </tbody></table>\n <p class=\"text-right\" style=\"font-family: FangSong ;font-size:12pt\">采购单位:二连浩特市人民医院</p>\n <p class=\"text-right\" style=\"font-family: FangSong ;font-size:12pt\">2023年10月31日</p>\n <style>\n /*网页规范:\n 宋体,2.5行高,默认16号字\n 大标题用h2标签,字号为24号加粗\n 一级标题用h3标签,字号为18号加粗\n 二级标题用h4标签,字号为16号加粗\n 三级标题用h5标签,字号为16号加粗,首行缩进28px\n 段落字号16px,首行缩进28px\n 普通文字为16号字体\n 表格标题为加粗,表格字号为16号字体,高度为32px,表格外部上下间距10px,左右居中;单元格内部上下间距5px,左右间距8px;\n 标题加粗,自己改为<strong></strong>或者加样式。\n 标题段落间距为8px\n */\n\n .noticeArea {\n line-height: 2.5;\n font-size: 16px;\n text-align: justify;\n font-family: '宋体';\n }\n\n .noticeArea * {\n padding: 0;\n margin: 0;\n\t\t\t\tfont-family: '宋体';\n }\n\n .noticeArea h2 {\n font-size: 24px;\n text-align: center;\n margin-bottom: 20px;\n }\n\n .noticeArea h3 {\n font-size: 18px;\n font-weight: normal;\n }\n\n .noticeArea h4 {\n font-size: 16px;\n font-weight: normal;\n }\n\n .noticeArea h5 {\n font-size: 16px;\n text-indent: 28px;\n font-weight: normal;\n }\n\n .noticeArea p {\n text-indent: 28px;\n font-size: 16px;\n }\n\n .noticeArea .noticeTable {\n font-size: 16px;\n border-collapse: collapse;\n border-spacing: 0;\n width: 100%;\n margin: 10px auto;\n }\n\n .noticeArea .noticeTable tr td {\n border-collapse: collapse;\n border: 1px solid #333;\n text-align: center;\n padding: 5px 8px;\n }\n\n .noticeArea .noticeTable tr th {\n font-weight: bold;\n text-align: center;\n border: 1px solid #333;\n padding: 5px 8px;\n }\n\n .noticeArea .noticeTable tr {\n height: 32px;\n }\n\n @media print {\n /*打印规范:\n 宋体,1.8行高\n 大标题用h2标签,字号为34号加粗,对应WORD为二号\n 一级标题用h3标签,字号为24号加粗,对应WORD为小三号\n 二级标题用h4标签,字号为21号加粗。对应WORD为四号\n 三级标题用h5标签,字号为18号加粗。对应WORD为小四号,首行缩进28px\n 段落普通文字为18号字体,对应WORD为小四号,首行缩进28px\n 普通文字为18号字体,对应WORD为小四号\n 表格标题为加粗,表格字号为16号字体,高度为32px;考虑内容多,用16号,对应WORD为五号;表格外部上下间距10px,左右居中;单元格内部上下间距5px,左右间距8px\n 标题加粗,自己改为<strong></strong>或者加样式。\n */\n .noticeArea {\n font-family: '宋体';\n line-height: 1.8;\n font-size: 18px;\n text-align: justify;\n }\n\n .noticeArea * {\n padding: 0;\n margin: 0\n }\n\n .noticeArea .focuscontent {\n color: #337ab7;\n }\n\n .noticeArea h2 {\n font-size: 34px;\n text-align: center;\n margin-bottom: 25px;\n font-family: SimHei;\n }\n\n .noticeArea h3 {\n font-size: 24px;\n font-weight: normal;\n }\n\n .noticeArea h4 {\n font-size: 21px;\n font-weight: normal;\n }\n\n .noticeArea h5 {\n font-size: 18px;\n font-weight: normal;\n }\n\n .noticeArea p {\n text-indent: 32px;\n font-size: 18px;\n }\n\n .noticeArea .noticeTable {\n font-size: 16px;\n border-collapse: collapse;\n border-spacing: 0;\n width: 100%;\n margin: 15px auto;\n }\n\n .noticeArea .noticeTable tr td {\n border-collapse: collapse;\n border: 1px solid #333;\n text-align: center;\n padding: 2px 6px;\n }\n\n .noticeArea .noticeTable tr th {\n font-weight: bold;\n text-align: center;\n padding: 2px 6px;\n }\n\n .noticeArea .noticeTable tr {\n height: 32px;\n }\n\n }\n </style>\n </div>\n </div>\n ",
  170. "infoformat" : 1.0,
  171. "href" : "https://www.ccgp-neimenggu.gov.cn/category/onlinetender?tb_id=001076&p_id=2000957690&type=2",
  172. "channel" : "电子卖场-直购采购成交公示",
  173. "detail_isvalidity" : int(1),
  174. "jsondata" : {
  175. "toptype" : "结果"
  176. },
  177. "basicClass" : "货物",
  178. "rate" : "97%",
  179. "autoid" : int(249351001),
  180. "bidamount" : 15440.0,
  181. "bidway" : "电子投标",
  182. "budget" : 15440.0,
  183. "buyer" : "二连浩特市人民医院",
  184. "buyerclass" : "医疗",
  185. "dataprocess" : int(8),
  186. "description" : "二连浩特市人民医院在政采商城电子卖场完成协议供货直购采购,采购结果确认如下:一、项目概述采购编号:ELHTSZFCG-DD-2023-407774采购单位:二连浩特市人民医院所属区域:二连浩特市本级预算金额(元):15,440.00采购人及",
  187. "district" : "二连浩特市",
  188. "entidlist" : [
  189. "ff3d9d9a24326937b4a9f45edbfab35a"
  190. ],
  191. "keywords" : "二连浩特市人民医院,台式计算机,订购,成交,公告",
  192. "multipackage" : int(0),
  193. "projectcode" : "ELHTSZFCG-DD-2023-407774",
  194. "projectname" : "二连浩特市人民医院台式计算机(等)直接订购",
  195. "purchasing_tag" : "台式计算机,计算机,摄像头,液晶显示器,DR,M9,液晶,4G",
  196. "s_subscopeclass" : "信息技术_其他,行政办公_通用办公设备",
  197. "s_topscopeclass" : "行政办公,信息技术",
  198. "s_winner" : "二连浩特市智慧真彩文体办公",
  199. "subscopeclass" : [
  200. "信息技术_其他",
  201. "行政办公_通用办公设备"
  202. ],
  203. "topscopeclass" : [
  204. "行政办公d",
  205. "信息技术d",
  206. "信息技术t"
  207. ],
  208. "winner" : "二连浩特市智慧真彩文体办公",
  209. "pici" : int(1698740066)
  210. }
  211. result=check(row,rules={"purchasinglist":["0101"]})
  212. print(result)