clinical-逻辑核查数据的操作
1. 前端页面样式
2. 前端代码
添加:
展示:
修改
删除
3. 后台代码
封装的DAO类数据
1 # coding: utf-8 2 3 from pdform.services.db.dbCore import GCP_LogicalVerify, GCP_LogicalVerifyRecord, GCP_ProjectSubject 4 from pdform import db, app 5 from pdform.services.util import Util 6 from pdform.services.sysParams import SYSParams 7 from pdform.services.appStaticVal import PDFormApp 8 from gcp.appStaticVal import GCPApp 9 from dataservices.config import * 10 from sqlalchemy import and_, or_, func, desc 11 from gcp.dao.project_subject_dao import GCPProjectSubjectDao 12 from gcp.dao.project_global_var_dao import ProjectGlobalVarDao 13 14 import traceback 15 from xlrd import * 16 import xlrd 17 import js2py 18 import re 19 20 class GCPLogicalVerifyDao: 21 """ 22 逻辑核查 23 """ 24 def __init__(self): 25 self.projectGlobalVarDao = ProjectGlobalVarDao() 26 27 def get_status_message(self, status): 28 """ 29 根据核查状态返回信息 30 :param status: 31 :return: 32 """ 33 if status == GCPApp.TYPE_LV_STATUS_PASSED: 34 return u"通过" 35 elif status == GCPApp.TYPE_LV_STATUS_FAILED: 36 return u"失败" 37 return u"未知" 38 39 def get_logical_verify(self, lv_id): 40 """ 41 获取单条核查项 42 :param lv_id: 43 :return: 44 """ 45 logical_verify = db.query(GCP_LogicalVerify).filter(GCP_LogicalVerify.lv_id == lv_id).first() 46 print(11,logical_verify) 47 if not logical_verify: 48 return None 49 logical_verify_dict = Util.row2dict(logical_verify) 50 print(222,logical_verify) 51 return logical_verify_dict 52 53 def get_logical_verifies(self, project_id, params): 54 """ 55 返回核查项列表 56 :param project_id: 57 :param params: 58 :return: 59 """ 60 is_slice, is_slice_success, query_start, query_end = SYSParams.check_fetch_query_start_and_end(params) 61 if is_slice and not is_slice_success: 62 return [], 0 63 64 # 初始化 65 query = db.query(GCP_LogicalVerify) 66 print(1111,query) 67 68 # 项目 69 if project_id is not None: 70 query = query.filter(GCP_LogicalVerify.project_id == project_id) 71 print(222,query) 72 73 # 模糊匹配 74 has_search_text, search_text = SYSParams.check_fetch_query_search_text(params) 75 if has_search_text: 76 search_text = "%" + search_text + "%" 77 query = query.filter(GCP_LogicalVerify.name.like(search_text)) 78 print(3333,query) 79 80 # 滤重和排序 81 query = query.distinct(GCP_LogicalVerify.lv_id).order_by(GCP_LogicalVerify.create_date) 82 print(444,query) 83 84 # 查询结果 85 all_logical_verify_array = query.all() 86 print(555,all_logical_verify_array) 87 total = len(all_logical_verify_array) 88 89 if is_slice: 90 logical_verify_array = all_logical_verify_array[query_start:query_end] 91 else: 92 logical_verify_array = all_logical_verify_array 93 return Util.rows2dict(logical_verify_array), total 94 95 def check_exist_logical_verify(self, project_id, name, type, lv_id): 96 """ 97 判断核查项是否重名 98 :param project_id: 99 :param name: 100 :return: is_exist 101 """ 102 logical_verify_array = db.query(GCP_LogicalVerify)\ 103 .filter(GCP_LogicalVerify.project_id == project_id)\ 104 .filter(GCP_LogicalVerify.type == type)\ 105 .filter(GCP_LogicalVerify.name == name)\ 106 .all() 107 lv_count = len(logical_verify_array) 108 if lv_count <= 0: 109 return False 110 if not lv_id or lv_count > 1: 111 return True 112 logical_verify = logical_verify_array[0] 113 if logical_verify.lv_id == lv_id: 114 return False 115 return True 116 117 def add_logical_verify(self, project_id, logical_verify_dict): 118 """ 119 添加一条核查项 120 :param project_id: 121 :param logical_verify_dict: 122 :return: is_success, lv_id, error_code 123 """ 124 try: 125 is_created = False 126 logical_verify = db.query(GCP_LogicalVerify)\ 127 .filter(GCP_LogicalVerify.project_id == project_id)\ 128 .filter(GCP_LogicalVerify.name == logical_verify_dict["name"])\ 129 .first() 130 if not logical_verify: 131 is_created = True 132 logical_verify = GCP_LogicalVerify() 133 logical_verify.lv_id = Util.getUUID() 134 logical_verify.project_id = project_id 135 logical_verify.create_date = Util.getDateTime() 136 if SYSParams.check_key_exist_and_not_none(logical_verify_dict, "name"): 137 logical_verify.name = logical_verify_dict["name"] 138 if SYSParams.check_key_exist_and_not_none(logical_verify_dict, "script"): 139 logical_verify.script = logical_verify_dict["script"] 140 if SYSParams.check_key_exist_and_not_none(logical_verify_dict, "type"): 141 logical_verify.type = logical_verify_dict["type"] 142 if is_created: 143 db.add(logical_verify) 144 db.commit() 145 return True, logical_verify.lv_id 146 except Exception, ex: 147 db.rollback() 148 app.logger.error(traceback.format_exc()) 149 return False, None 150 151 def update_logical_verify(self, lv_id, logical_verify_dict): 152 """ 153 修改一条核查项 154 :param lv_id: 155 :param logical_verify_dict: 156 :return: is_success 157 """ 158 try: 159 logical_verify = db.query(GCP_LogicalVerify).filter(GCP_LogicalVerify.lv_id == lv_id).first() 160 if not logical_verify: 161 return False 162 if SYSParams.check_key_exist_and_not_none(logical_verify_dict, "name"): 163 logical_verify.name = logical_verify_dict["name"] 164 if SYSParams.check_key_exist_and_not_none(logical_verify_dict, "script"): 165 logical_verify.script = logical_verify_dict["script"] 166 if SYSParams.check_key_exist_and_not_none(logical_verify_dict, "type"): 167 logical_verify.type = logical_verify_dict["type"] 168 db.commit() 169 return True 170 except Exception, ex: 171 db.rollback() 172 app.logger.error(traceback.format_exc()) 173 return False 174 175 def delete_logical_verify(self, lv_id): 176 """ 177 删除一条核查项 178 :param lv_id: 179 :return: 180 """ 181 try: 182 logical_verify = db.query(GCP_LogicalVerify).filter(GCP_LogicalVerify.lv_id == lv_id).first() 183 if not logical_verify: 184 return False 185 db.delete(logical_verify) 186 db.commit() 187 return True 188 except Exception, ex: 189 db.rollback() 190 app.logger.error(traceback.format_exc()) 191 return False 192 193 def check_fetch_worksheet(self, xls_files): 194 """ 195 获取XLS的worksheet 196 :param xls_files: 197 :return: 198 """ 199 if not xls_files or len(xls_files) <= 0: 200 return None 201 xls_data = xls_files[0].stream.read() 202 xls_rd = xlrd.open_workbook(None, sys.stdout, 0, USE_MMAP, xls_data) 203 if xls_rd.nsheets <= 0: 204 return None 205 ws = xls_rd.sheet_by_index(0) 206 return ws 207 208 def get_cell_value(self, ws, i_row, i_col): 209 """ 210 获取指定字段的值 211 :param ws 212 :param i_row: 213 :param i_col 214 :return: 215 """ 216 try: 217 cell_value = ws.cell_value(i_row, i_col) 218 cell_value = cell_value if cell_value else "" 219 return cell_value 220 except Exception, ex: 221 app.logger.error(traceback.format_exc()) 222 return "" 223 224 def import_xls_files(self, project_id, xls_files): 225 """ 226 逻辑核查导入 227 :param project_id: 228 :param xls_files: 229 :return is_success, success_lines_count, failed_lines_array: 230 """ 231 232 # 校验XLS数据,如果不合法,则不执行操作 233 ws = self.check_fetch_worksheet(xls_files) 234 if not ws: 235 return False, 0, [] 236 237 failed_lines_array = [] 238 success_lines_count = 0 239 last_table_name = "" 240 for i_row in range(1, ws.nrows): 241 # 名称,脚本 242 if ws.ncols < 2: 243 failed_lines_array.append(i_row+1) 244 continue 245 246 # 名称不能为空 247 name = self.get_cell_value(ws, i_row, 0) 248 if not name: 249 failed_lines_array.append(i_row+1) 250 continue 251 logical_type = self.get_cell_value(ws, i_row, 2) 252 if not logical_type: 253 logical_type = "0" 254 logical_verify_dict = { 255 "name": name, 256 "type": logical_type, 257 "script": self.get_cell_value(ws, i_row, 1) 258 } 259 is_success, lv_id = self.add_logical_verify(project_id, logical_verify_dict) 260 if not is_success: 261 failed_lines_array.append(i_row+1) 262 continue 263 success_lines_count += 1 264 265 return True, success_lines_count, failed_lines_array 266 267 def get_logical_verify_records(self, project_id, params): 268 """ 269 返回核查记录列表 270 :param project_id: 271 :param params: 272 :return: 273 """ 274 is_slice, is_slice_success, query_start, query_end = SYSParams.check_fetch_query_start_and_end(params) 275 if is_slice and not is_slice_success: 276 return [], 0 277 278 # 初始化 279 query = db.query(GCP_LogicalVerifyRecord, GCP_ProjectSubject)\ 280 .join(GCP_ProjectSubject, and_(GCP_ProjectSubject.project_id == GCP_LogicalVerifyRecord.project_id, 281 GCP_ProjectSubject.dm_id == GCP_LogicalVerifyRecord.dm_id)) 282 283 # 项目 284 if project_id is not None: 285 query = query.filter(GCP_LogicalVerifyRecord.project_id == project_id) 286 287 # 受试者 288 if SYSParams.check_key_exist_and_not_none(params, "dm_id"): 289 query = query.filter(GCP_LogicalVerifyRecord.dm_id == params["dm_id"]) 290 291 # 模糊匹配 292 has_search_text, search_text = SYSParams.check_fetch_query_search_text(params) 293 if has_search_text: 294 search_text = "%" + search_text + "%" 295 query = query.filter(GCP_LogicalVerifyRecord.name.like(search_text)) 296 297 # 滤重和排序 298 query = query.distinct(GCP_LogicalVerifyRecord.lvr_id).order_by(GCP_LogicalVerifyRecord.verify_date) 299 300 # 查询结果 301 all_lvr_row_array = query.all() 302 total = len(all_lvr_row_array) 303 304 if is_slice: 305 lvr_row_array = all_lvr_row_array[query_start:query_end] 306 else: 307 lvr_row_array = all_lvr_row_array 308 lvr_dict_array = [] 309 for lvr_row in lvr_row_array: 310 logical_verify_record = lvr_row[0] 311 project_subject = lvr_row[1] 312 lvr_dict = Util.row2dict(logical_verify_record) 313 lvr_dict.update(Util.row2dict(project_subject)) 314 lvr_dict["verify_status_message"] = self.get_status_message(lvr_dict["verify_status"]) 315 lvr_dict_array.append(lvr_dict) 316 317 return lvr_dict_array, total 318 319 def clear_all_logical_verify_records(self, project_id): 320 """ 321 清除项目所有核查记录 322 :param project_id: 323 :return: 324 """ 325 try: 326 db.query(GCP_LogicalVerifyRecord).filter(GCP_LogicalVerifyRecord.project_id == project_id).delete() 327 db.commit() 328 return True 329 except Exception, ex: 330 db.rollback() 331 app.logger.error(traceback.format_exc()) 332 return False 333 334 def add_logical_verify_record(self, project_id, project_subject_dict, logical_verify_dict, logical_script_name, script_ret): 335 """ 336 添加核查记录 337 :param project_id: 338 :param project_subject_dict: 339 :param logical_verify_dict: 340 :param script_ret: 341 :return: 342 """ 343 try: 344 logical_verify_record = GCP_LogicalVerifyRecord() 345 logical_verify_record.lvr_id = Util.getUUID() 346 logical_verify_record.lv_id = logical_verify_dict["lv_id"] 347 logical_verify_record.project_id = project_id 348 logical_verify_record.dm_id = project_subject_dict["dm_id"] 349 logical_verify_record.name = logical_script_name 350 logical_verify_record.script = logical_verify_dict["script"] 351 logical_verify_record.verify_date = Util.getDateTime() 352 logical_verify_record.verify_status = \ 353 GCPApp.TYPE_LV_STATUS_PASSED if script_ret else GCPApp.TYPE_LV_STATUS_FAILED 354 db.add(logical_verify_record) 355 db.commit() 356 return True 357 except Exception, ex: 358 db.rollback() 359 app.logger.error(traceback.format_exc()) 360 return False 361 362 def translate_script(self, script, global_var_dict): 363 """ 364 翻译脚本 365 :param script: 366 :param global_var_dict: 367 :return: is_success, new_script 368 """ 369 variant_pattern = "\$[A-Za-z0-9_/]+\$" 370 variant_array = re.findall(variant_pattern, script, re.I) 371 if not variant_array: 372 return True, script 373 374 new_script = script 375 regex = re.compile(variant_pattern) 376 for variant in variant_array: 377 variant_name = variant[1:-1] 378 if variant_name not in global_var_dict: 379 return False, new_script 380 variant_value = global_var_dict[variant_name] 381 variant_value = '"%s"' % variant_value if variant_value else '' 382 new_script = regex.sub(variant_value, new_script, 1) 383 return True, new_script 384 385 def verify_subject(self, project_id, project_subject_dict, logical_verify_dict_array): 386 """ 387 核查受试者 388 :param project_id: 389 :param project_subject_dict: 390 :param logical_verify_dict_array: 391 :return: is_success, error_code, success_count, failed_count 392 """ 393 # Global variants from system 394 global_var_name_array, global_var_dict = \ 395 self.projectGlobalVarDao.get_global_vars(project_id, project_subject_dict["dm_id"], None) 396 397 success_count = 0 398 failed_count = 0 399 for logical_verify_dict in logical_verify_dict_array: 400 logical_verify_name = logical_verify_dict["name"] 401 is_success, logical_verify_name = self.translate_script(logical_verify_name, global_var_dict) 402 if not is_success: 403 logical_verify_name = logical_verify_dict["name"] 404 script = logical_verify_dict["script"] 405 if not script: 406 # Skip if script is empty 407 self.add_logical_verify_record( 408 project_id, project_subject_dict, logical_verify_dict, logical_verify_name, True) 409 success_count += 1 410 continue 411 412 # Translate script 413 is_success, new_script = self.translate_script(script, global_var_dict) 414 if is_success and new_script: 415 try: 416 # Evaluate script 417 script_ret = js2py.eval_js(new_script) 418 if script_ret: 419 # Script result is true 420 self.add_logical_verify_record( 421 project_id, project_subject_dict, logical_verify_dict, logical_verify_name, True) 422 success_count += 1 423 continue 424 except Exception, ex: 425 app.logger.error(traceback.format_exc()) 426 427 self.add_logical_verify_record( 428 project_id, project_subject_dict, logical_verify_dict, logical_verify_name, False) 429 failed_count += 1 430 431 return True, 0, success_count, failed_count 432 433 def verify_all(self, project_id, project_subject_dict_array): 434 """ 435 以受试者为核查对象遍历所有核查项 436 :param project_id: 437 :param project_subject_dict_array: 438 :return: is_success, error_code, success_count, failed_count 439 """ 440 if not project_subject_dict_array: 441 return True, 0, 0, 0 442 logical_verify_dict_array, total = self.get_logical_verifies(project_id, {}) 443 if not logical_verify_dict_array: 444 return True, 0, 0, 0 445 446 success_count = 0 447 failed_count = 0 448 for project_subject_dict in project_subject_dict_array: 449 is_success, error_code, subject_success_count, subject_failed_count = \ 450 self.verify_subject(project_id, project_subject_dict, logical_verify_dict_array) 451 if not is_success: 452 return False, error_code, 0, 0 453 success_count += subject_success_count 454 failed_count += subject_failed_count 455 456 return True, 0, success_count, failed_count 457 458 def get_screening_period_logical_verifies(self, project_id): 459 """ 460 返回核查项列表 461 :param project_id: 462 :param params: 463 :return: 464 """ 465 logical_verify_list = db.query(GCP_LogicalVerify)\ 466 .filter(GCP_LogicalVerify.project_id == project_id)\ 467 .filter(GCP_LogicalVerify.type == 0)\ 468 .all() 469 if not logical_verify_list: 470 return [] 471 return Util.rows2dict(logical_verify_list) 472 473 def screening_period_verify_subject(self, project_id, dm_id): 474 """ 475 核查受试者 476 :param project_id: 477 :param project_subject_dict: 478 :param logical_verify_dict_array: 479 :return: is_success, error_code, success_count, failed_count 480 """ 481 # Global variants from system 482 483 logical_verify_dict_array = self.get_screening_period_logical_verifies(project_id) 484 485 global_var_name_array, global_var_dict = \ 486 self.projectGlobalVarDao.get_global_vars(project_id, dm_id, None) 487 logical_verify_result = [] 488 for logical_verify_dict in logical_verify_dict_array: 489 script_name = logical_verify_dict["name"] 490 is_success, script_name = self.translate_script(script_name, global_var_dict) 491 if not is_success: 492 script_name = logical_verify_dict["name"] 493 script = logical_verify_dict["script"] 494 if not script: 495 logical_verify_result.append(script_name) 496 continue 497 # Translate script 498 is_success, new_script = self.translate_script(script, global_var_dict) 499 if is_success and new_script: 500 try: 501 # Evaluate script 502 script_ret = js2py.eval_js(new_script) 503 if script_ret: 504 logical_verify_result.append(script_name) 505 continue 506 except Exception, ex: 507 app.logger.error(traceback.format_exc()) 508 509 return logical_verify_result 510 511 #逻辑核查记录DAO 512 513 class GCPLogicalVerifyRecordDao: 514 515 """ 516 逻辑核查记录 517 """ 518 def __init__(self): 519 self.projectGlobalVarDao = ProjectGlobalVarDao() 520 521 def get_logical_verifies(self, project_id, params): 522 """ 523 返回核查项列表 524 :param project_id: 525 :param params: 526 :return: 527 """ 528 is_slice, is_slice_success, query_start, query_end = SYSParams.check_fetch_query_start_and_end(params) 529 if is_slice and not is_slice_success: 530 return [], 0 531 532 # 初始化 533 query = db.query(GCP_LogicalVerifyRecord) 534 535 # 项目 536 if project_id is not None: 537 query = query.filter(GCP_LogicalVerifyRecord.project_id == project_id) 538 539 # 模糊匹配 540 has_search_text, search_text = SYSParams.check_fetch_query_search_text(params) 541 if has_search_text: 542 search_text = "%" + search_text + "%" 543 query = query.filter(GCP_LogicalVerifyRecord.name.like(search_text)) 544 545 # 查询结果 546 all_logical_verify_array = query.all() 547 total = len(all_logical_verify_array) 548 549 if is_slice: 550 logical_verify_array = all_logical_verify_array[query_start:query_end] 551 else: 552 logical_verify_array = all_logical_verify_array 553 return Util.rows2dict(logical_verify_array), total
获取单条数据:
# coding: utf-8 from pdform.api_request import PDRequest from pdform.services.appStaticVal import PDFormApp from gcp.dao.logical_verify_dao import GCPLogicalVerifyDao from gcp.dao.project_subject_dao import GCPProjectSubjectDao class PDLogicalVerify(PDRequest): """ 逻辑核查 URI映射为: /api/v1/logical_verify """ API_NAME = "logical_verify" def __init__(self): """ 初始化 """ super(PDLogicalVerify, self).__init__("lv_id") self.logicalVerifyDao = GCPLogicalVerifyDao() #继承父类的对象 self.parser.add_argument("name") self.parser.add_argument("type") self.parser.add_argument("script") self.parser.add_argument("page_index", type=int) self.parser.add_argument("page_size", type=int) self.parser.add_argument("search_text") self.parser.add_argument("command") self.parser.add_argument("dm_id") def get_request(self, args, lv_id): """ 获取单条核查信息 :param lv_id: :return: """ logical_verify_dict = self.logicalVerifyDao.get_logical_verify(lv_id) print("222",logical_verify_dict["lv_id"]) # print(logical_verify_dict["project_id"]) print(logical_verify_dict["name"]) print(logical_verify_dict["type"]) print(logical_verify_dict["script"]) print(logical_verify_dict["create_date"]) if not logical_verify_dict: return PDFormApp.API_Error(PDFormApp.INFO_ERROR_DB_NONE), 200 return {"status": PDFormApp.STATUE_SUCCESS, "message": PDFormApp.STATUE_SUCCESS, "logical_verify": logical_verify_dict}, 200
打印结果:
('222', u'7e356c00822211e98840f4b7e2e95ca4')
11d262c0806a11e984fff4b7e2e95ca4
胜多负少
0
大幅度
2019-05-29 23:00:26
查看所有:
1 def list_request(self, args): 2 """ 3 获取所有核查信息 4 :return: 5 """ 6 project_id = args["project_id"] if args["project_id"] else "" 7 logical_verify_dict_array, total = self.logicalVerifyDao.get_logical_verifies(project_id, args) 8 9 for i in logical_verify_dict_array: 10 print("lv_id",i["lv_id"]) 11 print("projectid",i["project_id"]) 12 print("name",i["name"]) 13 print('type',i["type"]) 14 print("========") 15 return {"status": PDFormApp.STATUE_SUCCESS, "message": PDFormApp.STATUE_SUCCESS, 16 "logical_verify_list": logical_verify_dict_array, "total": total}, 200
打印结果:
('lv_id', u'6451ae1e807e11e98f55f4b7e2e95ca4')
('projectid', u'11d262c0806a11e984fff4b7e2e95ca4')
('name', u'1221')
('type', 0)
========
('lv_id', u'e54f6d4081f111e9b978f4b7e2e95ca4')
('projectid', u'11d262c0806a11e984fff4b7e2e95ca4')
('name', u'333')
('type', 1)
========
('lv_id', u'ec6f9d7081f111e980c8f4b7e2e95ca4')
('projectid', u'11d262c0806a11e984fff4b7e2e95ca4')
('name', u'3332')
('type', 0)
========
添加:
def add_request(self, args): """ 添加一条核查 :return: """ project_id = args["project_id"] if args["project_id"] else "" if args["command"] == "verify": dm_id = args["dm_id"] if dm_id: project_subject_dict = GCPProjectSubjectDao.get_subject(project_id, dm_id) if not project_subject_dict: return PDFormApp.API_Error(PDFormApp.INFO_ERROR_DB_NONE), 200 project_subject_dict_array = [project_subject_dict] else: project_subject_dict_array, total = GCPProjectSubjectDao().getProjectSubjects(args) if not project_subject_dict_array: return PDFormApp.API_Error(PDFormApp.INFO_ERROR_DB_NONE), 200 is_success, error_code, success_count, failed_count = \ self.logicalVerifyDao.verify_all(project_id, project_subject_dict_array) if not is_success: return PDFormApp.API_Error(error_code), 200 return {"status": PDFormApp.STATUE_SUCCESS, "message": PDFormApp.INFO_RUN_OK, "success_lvr_count": success_count, "failed_lvr_count": failed_count}, 200
if not args["name"]:
return PDFormApp.API_Error(PDFormApp.INFO_WARNING_LESS_PARAMETERS), 200
if self.logicalVerifyDao.check_exist_logical_verify(project_id, args["name"], args["type"], None):
return PDFormApp.API_Error(PDFormApp.INFO_WARNING_LOGICAL_VERIFY_ALREADY_EXIST), 200
is_success, lv_id = self.logicalVerifyDao.add_logical_verify(project_id, args)
if not is_success:
return PDFormApp.API_Error(PDFormApp.INFO_ERROR_DB_WRITE), 200
return {"status": PDFormApp.STATUE_SUCCESS, "message": PDFormApp.INFO_RUN_OK, "lv_id": lv_id}, 200