From d7743db33ef092e6cd6abe6a5139297af1a12e59 Mon Sep 17 00:00:00 2001 From: yanzai Date: Sun, 25 Feb 2024 23:23:50 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../API/Admin/YeWu/AppointmentController.php | 20 + .../Admin/YeWu/HealthCheckupController.php | 15 +- .../Http/Controllers/API/UkeyController.php | 31 + .../Controllers/API/mH5/PersonController.php | 17 +- Laravel/app/Services/Admin/UserService.php | 2 +- .../Admin/YeWu/AppointmentService.php | 49 + .../Admin/YeWu/HealthCheckupService.php | 34 + Laravel/routes/api.php | 4 + el-admin/.env.development | 1 + el-admin/.env.production | 2 +- el-admin/index.html | 1 + el-admin/public/js/xtxsync.js | 985 ++++++++++++++++++ el-admin/src/api/api.js | 13 + el-admin/src/router/index.js | 6 + .../views/AppointmentMngr/AppointmentList.vue | 151 +++ .../views/AppointmentMngr/HealthCalendar.vue | 6 +- el-admin/src/views/Index.vue | 3 + el-admin/src/views/Login.vue | 55 +- .../views/MedicalCenter/HealthCheckList.vue | 88 +- .../src/views/SystemMngr/User/ChangPwd.vue | 413 +++++--- mH5/.env.development | 1 + mH5/.env.production | 1 + mH5/package-lock.json | 13 +- mH5/package.json | 3 +- mH5/src/api/api.js | 5 + mH5/src/views/GetWxCode.vue | 3 +- mH5/src/views/PreviewReport.vue | 18 +- mH5/src/views/ShowReport.vue | 64 +- 28 files changed, 1802 insertions(+), 202 deletions(-) create mode 100644 Laravel/app/Http/Controllers/API/Admin/YeWu/AppointmentController.php create mode 100644 Laravel/app/Http/Controllers/API/UkeyController.php create mode 100644 Laravel/app/Services/Admin/YeWu/AppointmentService.php create mode 100644 el-admin/public/js/xtxsync.js create mode 100644 el-admin/src/views/AppointmentMngr/AppointmentList.vue diff --git a/Laravel/app/Http/Controllers/API/Admin/YeWu/AppointmentController.php b/Laravel/app/Http/Controllers/API/Admin/YeWu/AppointmentController.php new file mode 100644 index 0000000..1dea04f --- /dev/null +++ b/Laravel/app/Http/Controllers/API/Admin/YeWu/AppointmentController.php @@ -0,0 +1,20 @@ +get('userid');//中间件产生的参数 + $group = $request->get('role');//中间件产生的参数 + $page =request('page'); + $pageSize =request('pageSize'); + $searchInfo=request('searchInfo'); + $s=app()->make(AppointmentService::class); + return $s->GetAppointmentList(['userid'=>$userid,'group'=>$group,'page'=>$page,'pageSize'=>$pageSize,'searchInfo'=>$searchInfo]); + } +} diff --git a/Laravel/app/Http/Controllers/API/Admin/YeWu/HealthCheckupController.php b/Laravel/app/Http/Controllers/API/Admin/YeWu/HealthCheckupController.php index d9f2646..5acd345 100644 --- a/Laravel/app/Http/Controllers/API/Admin/YeWu/HealthCheckupController.php +++ b/Laravel/app/Http/Controllers/API/Admin/YeWu/HealthCheckupController.php @@ -7,6 +7,8 @@ use Illuminate\Http\Request; use App\Services\Admin\YeWu\HealthCheckupService; use App\Services\mH5\PersonService; use Illuminate\Support\Facades\DB; +use Illuminate\Support\Facades\Storage; + class HealthCheckupController extends Controller { //创建体检记录 @@ -58,7 +60,7 @@ class HealthCheckupController extends Controller if(!$save['status']) return \Yz::echoError1('文件保持失败'); - $u=DB::table('examination_records')->where(['id'=>$cha[0]->id])->update(['report_file'=>$save['data']]); + $u=DB::table('examination_records')->where(['id'=>$cha[0]->id])->update(['report_file'=>Storage::url($save['data'])]); if($u>0){ return \Yz::Return(true,'上传成功',['file'=>$save['data']]); }else{ @@ -82,4 +84,15 @@ class HealthCheckupController extends Controller $s=app()->make(HealthCheckupService::class); return $s->GetPersonCheckUpDetail(['tijian_num'=>$tijian_num]); } + + //admin后台获取体检记录列表 + public function GetCheckUpList(Request $request){ + $userid = $request->get('userid');//中间件产生的参数 + $group = $request->get('role');//中间件产生的参数 + $page =request('page'); + $pageSize =request('pageSize'); + $searchInfo=request('searchInfo'); + $s=app()->make(HealthCheckupService::class); + return $s->GetCheckUpList(['userid'=>$userid,'group'=>$group,'page'=>$page,'pageSize'=>$pageSize,'searchInfo'=>$searchInfo]); + } } diff --git a/Laravel/app/Http/Controllers/API/UkeyController.php b/Laravel/app/Http/Controllers/API/UkeyController.php new file mode 100644 index 0000000..9281e47 --- /dev/null +++ b/Laravel/app/Http/Controllers/API/UkeyController.php @@ -0,0 +1,31 @@ +get('userid');//中间件产生的参数 + $pwd=request('pwd'); //密码 + $sfid=request('sfid'); //密码 + $s=app()->make(LoginService::class); + $check=$s->CheckPwd(['userid'=>$userid,'password'=>$pwd]); + if($check['status']){ + $u=DB::table('users')->where(['id'=>$userid])->update([ + 'ukey_sfuid'=>$sfid, + ]); + if($u){ + return \Yz::Return(true,'绑定成功',[]); + }else{ + return \Yz::echoError1("绑定失败"); + } + }else{ + return \Yz::echoError1("密码验证失败"); + } + } +} diff --git a/Laravel/app/Http/Controllers/API/mH5/PersonController.php b/Laravel/app/Http/Controllers/API/mH5/PersonController.php index 089c601..f755999 100644 --- a/Laravel/app/Http/Controllers/API/mH5/PersonController.php +++ b/Laravel/app/Http/Controllers/API/mH5/PersonController.php @@ -5,7 +5,7 @@ namespace App\Http\Controllers\API\mH5; use App\Http\Controllers\Controller; use App\Services\mH5\PersonService; use Illuminate\Http\Request; - +use Illuminate\Support\Facades\DB; class PersonController extends Controller { //注册 @@ -21,4 +21,19 @@ class PersonController extends Controller $s=app()->make(PersonService::class); return $s->GetPersonRecode(['openid'=>$openid,'group'=>$group]); } + //获取用户pdf + public function GetPersonReportDetail(){ + $tijian_num =request('tijian_num'); + $info=DB::table('examination_records')->where(['tijian_num'=>$tijian_num])->first(); + if($info){ + $item=DB::table('report_result_item') + ->where(['examination_id'=>$info->id]) + ->select(['item_name','item_result','flag'])->get(); + $info->items=$item; + return \Yz::Return(true,'',['info'=>$info]); + }else{ + return \Yz::echoError1('未找到相关体检信息'); + } + + } } diff --git a/Laravel/app/Services/Admin/UserService.php b/Laravel/app/Services/Admin/UserService.php index 192d227..8f7389f 100644 --- a/Laravel/app/Services/Admin/UserService.php +++ b/Laravel/app/Services/Admin/UserService.php @@ -60,7 +60,7 @@ class UserService return $result; } public function GetDetail($arr){ - $c=DB::table('users')->select(['id','cn_name','username','status','group','img','xtsign_userid','xtsign_username'])->where(['id'=>$arr['id']])->whereIn('status',[0,1])->get(); + $c=DB::table('users')->select(['id','cn_name','username','status','group','img','xtsign_userid','xtsign_username','ukey_sfuid'])->where(['id'=>$arr['id']])->whereIn('status',[0,1])->get(); if(count($c)){ $result['info']=$c; $result['status']='ok'; diff --git a/Laravel/app/Services/Admin/YeWu/AppointmentService.php b/Laravel/app/Services/Admin/YeWu/AppointmentService.php new file mode 100644 index 0000000..0569748 --- /dev/null +++ b/Laravel/app/Services/Admin/YeWu/AppointmentService.php @@ -0,0 +1,49 @@ +=? and a.date<=? '; + array_push($canshu,$arr['searchInfo']['dateRange'][0],$arr['searchInfo']['dateRange'][1]); + } + + + if($arr['group']==7){ + $cha=DB::table('medical_institution')->where(['link_user_id'=>$arr['userid']])->get(); + $sql=$sql .' and a.org_id=?'; + array_push($canshu, $cha[0]->id); + }else{ + if($arr['searchInfo']['orgId']){ + + $sql=$sql .' and a.org_id=?'; + array_push($canshu, $arr['searchInfo']['orgId']); + } + + } + + array_push($canshu,($arr['page']-1)*$arr['pageSize'],$arr['pageSize']); + + $query=DB::select("select a.*,b.org_name from appointment_record as a LEFT JOIN + medical_institution as b on a.org_id=b.id ".$sql." order by a.id desc limit ?,?",$canshu); + + $count=DB::select("select count(*) as c from appointment_record as a ".$sql,$canshu); + return \Yz::Return(true,'',['list'=>$query,'count'=>$count[0]->c]); + + } +} diff --git a/Laravel/app/Services/Admin/YeWu/HealthCheckupService.php b/Laravel/app/Services/Admin/YeWu/HealthCheckupService.php index af57083..f194682 100644 --- a/Laravel/app/Services/Admin/YeWu/HealthCheckupService.php +++ b/Laravel/app/Services/Admin/YeWu/HealthCheckupService.php @@ -46,10 +46,14 @@ class HealthCheckupService $u2=DB::table('examination_records')->insert([ "name"=>$CheckupInfo['name'], + "sex"=>$CheckupInfo['sex'], + "tel"=>$CheckupInfo['tel'], "id_card_num"=>$CheckupInfo['id_card_num'], "type"=>$CheckupInfo['type'], + "industry_type"=>$CheckupInfo['industry_type'], "institution_id"=>$org_id[0]->id, "tijian_time"=>$CheckupInfo['tijian_time'], + "register_time"=>$CheckupInfo['register_time'],//登记时间 "tijian_num"=>$CheckupInfo['tijian_num'], "report_content"=>json_encode($CheckupInfo['report_content']), "fee_type"=>$CheckupInfo['fee_type'] @@ -112,5 +116,35 @@ class HealthCheckupService } + } + //获取体检记录列表 + public function GetCheckUpList($arr){ + $sql=' where 1=1'; + $canshu=array(); + + if($arr['searchInfo']['dateRange']){ + + $sql=$sql . ' and a.tijian_time>=? and a.tijian_time<=? '; + array_push($canshu,$arr['searchInfo']['dateRange'][0],$arr['searchInfo']['dateRange'][1]); + } + + + if($arr['group']==7){ + $cha=DB::table('medical_institution')->where(['link_user_id'=>$arr['userid']])->get(); + $sql=$sql .' and a.institution_id=?'; + array_push($canshu, $cha[0]->id); + }else{ + if($arr['searchInfo']['orgId']){ + + $sql=$sql .' and a.institution_id=?'; + array_push($canshu, $arr['searchInfo']['orgId']); + } + + } + array_push($canshu,($arr['page']-1)*$arr['pageSize'],$arr['pageSize']); + $query=DB::select("select a.*,b.org_name from examination_records as a LEFT JOIN medical_institution as b on a.institution_id=b.id ".$sql." order by a.id desc limit ?,?",$canshu); + $count=DB::select("select count(*) as c from examination_records as a ".$sql,$canshu); + return \Yz::Return(true,'',['list'=>$query,'count'=>$count[0]->c]); + } } diff --git a/Laravel/routes/api.php b/Laravel/routes/api.php index 649e056..8c83fd5 100644 --- a/Laravel/routes/api.php +++ b/Laravel/routes/api.php @@ -45,7 +45,10 @@ Route::group(['middleware'=>['checktoken','log'],'prefix'=>'v1'],function () { Route::post('admin/CalendarGetList','App\Http\Controllers\API\Admin\YeWu\healthCalendarController@getList'); //admin后台获取日历列表 Route::post('admin/CalendarListDel','App\Http\Controllers\API\Admin\YeWu\healthCalendarController@Del'); //admin后台删除日历 Route::post('admin/CalendarChangeInfo','App\Http\Controllers\API\Admin\YeWu\healthCalendarController@ChangeInfo'); //admin后台更新日历 + Route::post('admin/GetCheckUpList','App\Http\Controllers\API\Admin\YeWu\HealthCheckupController@GetCheckUpList'); //admin后台获取体检记录 + Route::post('admin/GetAppointmentList','App\Http\Controllers\API\Admin\YeWu\AppointmentController@GetAppointmentList'); //admin后台获取预约记录 Route::post('admin/XTSignBindUser','App\Http\Controllers\API\XTSignController@bindUser');//admin后台用户绑定协同签名useid + Route::post('admin/UkeyBindUser','App\Http\Controllers\API\UkeyController@Bind');//admin后台用户绑定协同签名useid }); @@ -58,6 +61,7 @@ Route::group(['middleware'=>['checktoken','log'],'prefix'=>'v1/mH5'],function () Route::post('GetEnableCalendar','App\Http\Controllers\API\mH5\OrganizationController@GetEnableCalendar'); //获取可用体检机构日历 Route::post('StartYuYue','App\Http\Controllers\API\mH5\OrganizationController@StartYuYue'); //开始预约 Route::post('UpFile','App\Http\Controllers\API\UpLoadController@UpFile'); //上传文件 + Route::post('GetPersonReportDetail','App\Http\Controllers\API\mH5\PersonController@GetPersonReportDetail');//获取用户pdf }); diff --git a/el-admin/.env.development b/el-admin/.env.development index 8bf461b..f1e7868 100644 --- a/el-admin/.env.development +++ b/el-admin/.env.development @@ -1,2 +1,3 @@ ENV = 'development' VITE_APP_API = '/api/' +VITE_APP_FILE = 'http://localhostcommon' \ No newline at end of file diff --git a/el-admin/.env.production b/el-admin/.env.production index 6d8ddb9..1a89d63 100644 --- a/el-admin/.env.production +++ b/el-admin/.env.production @@ -1,4 +1,4 @@ ENV = 'production' VITE_APP_API = 'https://www.yanzai.vip/common/laravel/public/api/' - +VITE_APP_FILE = 'https://www.yanzai.vip/common/laravel/public' diff --git a/el-admin/index.html b/el-admin/index.html index 03cdc53..c7c1988 100644 --- a/el-admin/index.html +++ b/el-admin/index.html @@ -9,5 +9,6 @@
+ diff --git a/el-admin/public/js/xtxsync.js b/el-admin/public/js/xtxsync.js new file mode 100644 index 0000000..73447c6 --- /dev/null +++ b/el-admin/public/js/xtxsync.js @@ -0,0 +1,985 @@ +/* + -------------------------------------------------------------- + * FileName:xtxsync.js + * This Javascript provides synchronous interfaces + * Support bjca client version 3.4.1 and later + * Author:BJCA-zys + * Date: 2021-05-06 + * + -------------------------------------------------------------- + */ + +(function() { +if (typeof xtxsync === 'undefined') { + xtxsync = {}; +} +})(); + +// initialize xtxsync hashMap object +(function() { + +function xtxsyncHashMap(){ + this.map = {}; +} + +xtxsyncHashMap.prototype = { + put : function(key , value){ + this.map[key] = value; + }, + + get : function(key){ + if(this.map.hasOwnProperty(key)){ + return this.map[key]; + } + return null; + }, + + remove : function(key){ + if(this.map.hasOwnProperty(key)){ + return delete this.map[key]; + } + return false; + }, + + removeAll : function(){ + this.map = {}; + }, + + keySet : function(){ + var _keys = []; + for(var i in this.map){ + _keys.push(i); + } + return _keys; + } +}; + +xtxsyncHashMap.prototype.constructor = xtxsyncHashMap; + +xtxsync.HashMap = xtxsyncHashMap; +})(); + +// initialize xtxsync util object +(function() { + +function initUtilObject(xtxsync) { + + var util = xtxsync.util = xtxsync.util || {}; + + util.checkBrowserISIE = function() { + return (!!window.ActiveXObject || 'ActiveXObject' in window) ? true : false; + } + + util.checkLocationIsHttps = function() { + return 'https:' == document.location.protocol ? true: false; + } + + util.evalFunction = function (func) { + if (typeof func === 'function') { + return func; + } else if (typeof func === 'string') { + cb = eval(func); + } else { + return null; + } + } + + util.consolelog = function(param) { + if (window.console == undefined || window.console.log == undefined) { + return; + } + console.log(param); + } + + util.isEmpty = function(param) { + if (!param) { + return true; + } + if (typeof param == 'string' && param == "") { + return true; + } + + return false; + } + + util.loadIECtl = function(clsid, ctlName, checkFunc) { + if (!util.checkBrowserISIE()) { + return null; + } + var ctl = document.getElementById(ctlName); + if (ctl) { + return ctl; + } + try { + var loadObjString = ''; + loadObjString += ''; + document.write(loadObjString); + if (checkFunc != null && checkFunc != "" && eval(ctlName + "." + checkFunc) == undefined) { + return null; + } + } catch (e) { + util.consolelog(e); + return null; + } + return document.getElementById(ctlName); + } + + util.getAutoExecFunctionString = function (func) { + var ret = "("; + ret += func.toString(); + ret += ")()"; + + return ret; + } + + util.attachIEEvent = function(ctlName, eventName, eventFunc) { + var ctl; + if (typeof ctlName === 'string') { + ctl = eval(ctlName); + } else { + ctl = ctlName; + } + eventName = eventName.toLowerCase(); + + var cb = util.evalFunction(eventFunc); + if (cb == null) { + return; + } + + if (ctl.attachEvent) { + ctl.attachEvent(eventName, cb); + } else { // IE11 not support attachEvent, and addEventListener do not work well, so addEvent ourself + var handler = document.createElement("script"); + handler.setAttribute("for", ctlName); + handler.setAttribute("event", eventName); + var eventScript = util.getAutoExecFunctionString(eventFunc); + handler.appendChild(document.createTextNode(eventScript)); + document.getElementsByTagName("head")[0].appendChild(handler); + } + } + + util.loadWebSocketCtl = function(wsUrl, wssUrl) { + if (xtxsync.wsObject) { + return xtxsync.wsObject; + } + var url; + if (util.checkLocationIsHttps()) { + url = "wss://" + wssUrl; + } else { + url = "ws://" + wsUrl; + } + + var wsObject = { + socket : undefined, + wsEventQueue : new xtxsync.HashMap(), + wsURL : url + }; + xtxsync.wsObject = wsObject; + xtxsync.wsObject.wsEventQueue.put("onusbkeychange", util.evalFunction(xtxsync.custom.defaultUsbkeyChange)); + + try { + wsObject.socket = new WebSocket(url); + } catch (e) { + util.consolelog(e); + return null; + } + + wsObject.socket.onopen = function(evt) { + xtxsync.util.consolelog("open websocket[" + url + "] ok..."); + xtxsync.util.consolelog("SOF_GetVersion:(" + xtxsync.SOF_GetVersion() + ")"); + } + wsObject.socket.onclose = function(evt) { + util.consolelog("websocket[" + url + "] closed, reopen it..."); + xtxsync.wsObject = undefined; + xtxsync.XTXAppWebSocket = xtxsync.util.loadWebSocketCtl(wsUrl, wssUrl); + }; + wsObject.socket.onmessage = function(evt) { + var eventCmd = false; + if (xtxsync.util.isEmpty(evt.data)) { + util.consolelog("onmessage evt.data is NULL or empty!!!"); + return; + } + try { + var res = JSON.parse(evt.data); + var cmdId = undefined; + if (res['call_cmd_id']) { + cmdId = res['call_cmd_id']; + } else { + util.consolelog("return JSON not include call_cmd_id!!!"); + return; + } + + var retVal = ""; + if (res['retVal']) { + retVal = res['retVal']; + } else if (res['retValue']) { + retVal = res['retValue']; + } + + var execFunc = xtxsync.wsObject.wsEventQueue.get(cmdId.toLowerCase()); + if (execFunc && typeof execFunc == 'function') { // event + execFunc(retVal); + } + } catch (e) { + return; + } + }; + wsObject.socket.onerror = function(evt) { + xtxsync.util.consolelog(evt.data); + }; + + return wsObject; + } + + util.attachWebSocketEvent = function(wsObject, eventName, eventFunc) { + if (wsObject == null) { + return; + } + wsObject.wsEventQueue.put(eventName.toLowerCase(), util.evalFunction(eventFunc)); + } + + util.createHttpRequest = function() { + if (window.XMLHttpRequest) { + return new XMLHttpRequest(); + } else { + return new ActiveXObject("Microsoft.XMLHTTP"); + } + } + + util.ajaxSyncall = function(clsid, methodName, outPramType, argsArray) { + var defaultErrRet; + if (outPramType == 'bool') { + defaultErrRet = false; + } else if (outPramType == 'number') { + defaultErrRet = -1; + } else { + defaultErrRet = ""; + } + try { + var xhr = xtxsync.util.createHttpRequest(); + var strUrl = "http://127.0.0.1:21051/synctl"; + if (util.checkLocationIsHttps()) { + strUrl = "https://127.0.0.1:21061/synctl"; + } + xhr.open("POST", strUrl, false); + xhr.setRequestHeader("Content-type","application/json"); + var sendArray = { + url:window.location.href, + clsid:clsid, + func:methodName, + param:argsArray + }; + var token = xtxsync.custom.getToken(); + if (token != "") { + sendArray.token = token; + } + + xhr.send(JSON.stringify(sendArray)); + if (xhr.status != 200) { + if (methodName == 'SOF_Login' || methodName == 'SOF_LoginEx') { + xtxsync.custom.setToken(""); + } + return defaultErrRet; + } + + var res = JSON.parse(xhr.responseText); + if (res.token) { + xtxsync.custom.setToken(res.token); + } + + var ret = defaultErrRet; + if (res.hasOwnProperty('retValue')) { + ret = res.retValue; + } else if (res.hasOwnProperty('retVal')) { + if (outPramType == "bool"){ + if (typeof(res.retVal) == 'string') { + ret = res.retVal == "true" ? true : false; + } else { + ret = res.retVal; + } + } else if (outPramType == "number"){ + if (typeof(res.retVal) == 'string') { + ret = Number(res.retVal); + } else { + ret = res.retVal; + } + } else{ + ret = res.retVal; + } + } + if (ret == undefined) { + ret = defaultErrRet; + } + if (((methodName == 'SOF_Login' || methodName == 'SOF_LoginEx') && !ret) || (methodName == 'SOF_Logout' && ret)) { + xtxsync.custom.setToken(""); + } + return ret; + } catch (e) { + return defaultErrRet; + } + } +} + +return initUtilObject(xtxsync); +})(); + +// initialize index page and other custom action +(function() { + +function initCustomActions(xtxsync) { + var custom = xtxsync.custom = xtxsync.custom || {}; + + custom.softCertListID = ""; + custom.hardCertListID = ""; + custom.allCertListID = ""; + custom.loginCertID = ""; + custom.logoutFunc = null; + custom.UsbkeyChangeFunc = null; + custom.loginToken = ""; + + custom.errorReportFunc = function(msg) { + alert(msg); + } + + custom.setAutoLogoutParameter = function(strCertID, logoutFunc) { + var custom = xtxsync.custom; + custom.loginCertID = strCertID; + custom.logoutFunc = logoutFunc; + } + + custom.clearDropList = function(dropListId) { + if (dropListId == "") { + return; + } + + var obj = document.getElementById(dropListId); + if (obj == undefined) { + obj = eval(dropListId); + } + if (obj == undefined) { + return; + } + + var i, n = obj.length; + for (i = 0; i < n; i++) { + obj.remove(0); + } + } + + custom.pushOneDropListBox = function(userListArray, strListID) + { + var obj = document.getElementById(strListID); + if (obj == undefined) { + obj = eval(strListID); + } + if (obj == undefined) { + return; + } + + for (var i = 0; i < userListArray.length; i++) { + var certObj = userListArray[i]; + var objItem = new Option(certObj.certName, certObj.certID); + obj.options.add(objItem); + } + return; + } + + custom.pushUserListToAllDroplist = function(strUserList) { + var custom = xtxsync.custom; + + custom.clearDropList(custom.softCertListID); + custom.clearDropList(custom.hardCertListID); + custom.clearDropList(custom.allCertListID); + + var allListArray = []; + while (true) { + var i = strUserList.indexOf("&&&"); + if (i <= 0 ) { + break; + } + var strOneUser = strUserList.substring(0, i); + var strName = strOneUser.substring(0, strOneUser.indexOf("||")); + var strCertID = strOneUser.substring(strOneUser.indexOf("||") + 2, strOneUser.length); + allListArray.push({certName:strName, certID:strCertID}); + + if (custom.hardCertListID != "") { + var devType = xtxsync.GetDeviceInfo(strCertID, 7); + if (devType == "HARD") { + custom.pushOneDropListBox([{certName:strName, certID:strCertID}], custom.hardCertListID); + } + } + + if (custom.softCertListID != "") { + var devType = xtxsync.GetDeviceInfo(strCertID, 7); + if (devType == "SOFT") { + custom.pushOneDropListBox([{certName:strName, certID:strCertID}], custom.softCertListID); + } + } + var len = strUserList.length; + strUserList = strUserList.substring(i + 3, len); + } + + if (custom.allCertListID != "") { + custom.pushOneDropListBox(allListArray, custom.allCertListID); + } + } + + custom.setUserCertList = function(certListId, certType) { + var custom = xtxsync.custom; + + if (certType == CERT_TYPE_ALL || certType == undefined) { + custom.allCertListID = certListId; + } + + if (certType == CERT_TYPE_HARD) { + custom.hardCertListID = certListId; + } + + if (certType == CERT_TYPE_SOFT) { + custom.softCertListID = certListId; + } + custom.pushUserListToAllDroplist(xtxsync.SOF_GetUserList()); + } + + custom.setOnUsbKeyChangeCallBack = function(callback) { + xtxsync.custom.UsbkeyChangeFunc = callback; + } + + custom.setErrorReportFunc = function(errFunc) { + xtxsync.custom.errorReportFunc = errFunc; + } + + custom.autoLogoutCallBack = function(strUserList) { + var custom = xtxsync.custom; + if (strUserList.indexOf(custom.loginCertID) <= 0) { + custom.logoutFunc(); + } + } + + custom.defaultUsbkeyChange = function() { + var custom = xtxsync.custom; + custom.pushUserListToAllDroplist(xtxsync.SOF_GetUserList()); + + if (typeof custom.UsbkeyChangeFunc == 'function') { + custom.UsbkeyChangeFunc(); + } + + if (custom.loginCertID != "" && typeof custom.logoutFunc == 'function') { + custom.autoLogoutCallBack(xtxsync.SOF_GetUserList()); + } + } + + custom.getToken = function() { + return custom.loginToken; + } + + custom.setToken = function(token) { + custom.loginToken = token; + } +} + +return initCustomActions(xtxsync); +})(); + +// initialize xtxappcom object +(function() { + +function initXTXAppCOM(xtxsync) { + var util = xtxsync.util; + var custom = xtxsync.custom; + + xtxsync.XTXAppCOM = util.loadIECtl(xtxsync.xtx_clsid, "XTXAppObj", "SOF_GetVersion()"); + if (xtxsync.XTXAppCOM == null) { + custom.errorReportFunc("加载XTXAppCOM控件失败,请确认已正确安装BJCA证书应用环境!"); + return false; + } + var XTXAppCOM = xtxsync.XTXAppCOM; + + util.attachIEEvent("XTXAppObj", "onUsbkeyChange", xtxsync.custom.defaultUsbkeyChange); + + // get key pic interface + var GetPicObj = util.loadIECtl(xtxsync.getpic_clsid, "GetPicObj", "Hash('0')"); + if (GetPicObj == null) { + //custom.errorReportFunc("加载GetKeyPic控件失败,请确认已正确安装GetKeyPic控件!"); + } else { + XTXAppCOM.GetPic = function(strCertID) { + return GetPicObj.GetPic(strCertID); + } + XTXAppCOM.Hash = function(inData) { + return GetPicObj.Hash(inData); + } + XTXAppCOM.ConvertPicFormat = function(inData, type) { + return GetPicObj.ConvertPicFormat(inData, type); + } + XTXAppCOM.ConvertGif2Jpg = function(inData) { + return GetPicObj.ConvertGif2Jpg(inData); + } + XTXAppCOM.GetPic1 = function(strCertID) { + return GetPicObj.GetPic1(strCertID); + } + XTXAppCOM.ConvertPicSize = function(strPicture, w, h) { + return GetPicObj.ConvertPicSize(strPicture, w, h); + } + } + + // xtxversion interface + var XTXVersionOBJ = util.loadIECtl(xtxsync.xtx_version_clsid, "XTXVersionOBJ", "GetEnvVersion()"); + if (XTXVersionOBJ == null) { + //custom.errorReportFunc("加载XTXVersion控件失败,请确认已正确安装证书应用环境!"); + } else { + XTXAppCOM.GetEnvVersion = function() { + return XTXVersionOBJ.GetEnvVersion(); + } + } + + return true; +} + +function initXTXAppWebSocket(xtxsync) { + xtxsync.XTXAppWebSocket = xtxsync.util.loadWebSocketCtl("127.0.0.1:21051/xtxapp/", "127.0.0.1:21061/xtxapp/"); + if (xtxsync.XTXAppWebSocket == null) { + custom.errorReportFunc("连接XTXAppCOM服务失败,请确认已正确安装BJCA证书应用环境!"); + return false; + } + + return true; +} + +function initXTXAppObject(xtxsync) { + var util = xtxsync.util; + xtxsync.xtx_clsid = "3F367B74-92D9-4C5E-AB93-234F8A91D5E6"; + xtxsync.getpic_clsid = "3BC3C868-95B5-47ED-8686-E0E3E94EF366"; + xtxsync.xtx_version_clsid = "574887FB-22A5-488B-A49C-2CF25F56BE68"; + var getImplmentFunction; + + if (util.checkBrowserISIE()) { // IE + if (!initXTXAppCOM(xtxsync)) { + return false; + } + getImplmentFunction = function(methodInfo) { + if (methodInfo.inParams == '') { // 0 input param + window[methodInfo.funcName] = new Function('return xtxsync.XTXAppCOM.' + methodInfo.funcName + '();'); + } else { + window[methodInfo.funcName] = new Function(methodInfo.inParams, + 'return xtxsync.XTXAppCOM.' + methodInfo.funcName + '(' + methodInfo.inParams + ');'); + } + } + } else { // other brower + if (!initXTXAppWebSocket(xtxsync)) { + return false; + } + getImplmentFunction = function(methodInfo) { + if (methodInfo.inParams == '') { // 0 input param + window[methodInfo.funcName] = new Function( + "return xtxsync.util.ajaxSyncall('" + + methodInfo.clsid + "', '" + methodInfo.funcName + "', '" + methodInfo.outParamType + "');"); + } else { + window[methodInfo.funcName] = new Function(methodInfo.inParams, + "return xtxsync.util.ajaxSyncall('" + methodInfo.clsid + "', '" + + methodInfo.funcName + "','" + methodInfo.outParamType + "', [" + methodInfo.inParams + "]);"); + } + } + } + + var export_functions = [ + {funcName:'SOF_SetSignMethod', inParams:'SignMethod', outParamType:'number', clsid:xtxsync.xtx_clsid, aliasName:'SetSignMethod'}, + {funcName:'SOF_GetSignMethod', inParams:'', outParamType:'number', clsid:xtxsync.xtx_clsid}, + {funcName:'SOF_SetEncryptMethod', inParams:'EncryptMethod', outParamType:'number', clsid:xtxsync.xtx_clsid}, + {funcName:'SOF_GetEncryptMethod', inParams:'', outParamType:'number', clsid:xtxsync.xtx_clsid}, + {funcName:'SOF_GetUserList', inParams:'', outParamType:'string', clsid:xtxsync.xtx_clsid, aliasName:'GetUserList'}, + {funcName:'SOF_ExportUserCert', inParams:'CertID', outParamType:'string', clsid:xtxsync.xtx_clsid, aliasName:'GetSignCert'}, + {funcName:'SOF_Login', inParams:'CertID, PassWd', outParamType:'bool', clsid:xtxsync.xtx_clsid, aliasName:'VerifyUserPIN'}, + {funcName:'SOF_GetPinRetryCount', inParams:'CertID', outParamType:'number', clsid:xtxsync.xtx_clsid, aliasName:'GetUserPINRetryCount'}, + {funcName:'SOF_ChangePassWd', inParams:'CertID, oldPass, newPass', outParamType:'bool', clsid:xtxsync.xtx_clsid, aliasName:'ChangeUserPassword'}, + {funcName:'SOF_GetCertInfo', inParams:'Cert, type', outParamType:'string', clsid:xtxsync.xtx_clsid, aliasName:'GetCertBasicinfo'}, + {funcName:'SOF_GetCertInfoByOid', inParams:'Cert, Oid', outParamType:'string', clsid:xtxsync.xtx_clsid, aliasName:'GetExtCertInfoByOID'}, + {funcName:'SOF_SignData', inParams:'CertID, InData', outParamType:'string', clsid:xtxsync.xtx_clsid, aliasName:'SignedData'}, + {funcName:'SOF_VerifySignedData', inParams:'Cert, InData, SignValue', outParamType:'bool', clsid:xtxsync.xtx_clsid, aliasName:'VerifySignedData'}, + {funcName:'SOF_SignFile', inParams:'CertID, InFile', outParamType:'string', clsid:xtxsync.xtx_clsid, aliasName:'SOF_SignFile'}, + {funcName:'SOF_VerifySignedFile', inParams:'Cert, InFile, SignValue', outParamType:'bool', clsid:xtxsync.xtx_clsid, aliasName:'VerifySignFile'}, + {funcName:'SOF_EncryptData', inParams:'Cert, InData', outParamType:'string', clsid:xtxsync.xtx_clsid, aliasName:'EncodeP7Enveloped'}, + {funcName:'SOF_DecryptData', inParams:'CertID, InData', outParamType:'string', clsid:xtxsync.xtx_clsid, aliasName:'DecodeP7Enveloped'}, + {funcName:'SOF_EncryptFile', inParams:'Cert, InFile, OutFile', outParamType:'bool', clsid:xtxsync.xtx_clsid}, + {funcName:'SOF_DecryptFile', inParams:'CertID, InFile, OutFile', outParamType:'bool', clsid:xtxsync.xtx_clsid}, + {funcName:'SOF_SignMessage', inParams:'dwFlag, CertID, InData', outParamType:'string', clsid:xtxsync.xtx_clsid}, + {funcName:'SOF_VerifySignedMessage', inParams:'MessageData, InData', outParamType:'bool', clsid:xtxsync.xtx_clsid, aliasName:'VerifyDatabyP7'}, + {funcName:'SOF_GetInfoFromSignedMessage', inParams:'SignedMessage, type', outParamType:'string', clsid:xtxsync.xtx_clsid}, + {funcName:'SOF_SignDataXML', inParams:'CertID, InData', outParamType:'string', clsid:xtxsync.xtx_clsid}, + {funcName:'SOF_VerifySignedDataXML', inParams:'InData', outParamType:'bool', clsid:xtxsync.xtx_clsid}, + {funcName:'SOF_GetXMLSignatureInfo', inParams:'XMLSignedData, type', outParamType:'string', clsid:xtxsync.xtx_clsid}, + {funcName:'SOF_GenRandom', inParams:'RandomLen', outParamType:'string', clsid:xtxsync.xtx_clsid, aliasName:'GenerateRandom'}, + {funcName:'SOF_PubKeyEncrypt', inParams:'Cert, InData', outParamType:'string', clsid:xtxsync.xtx_clsid, aliasName:'PubKeyEncrypt'}, + {funcName:'SOF_PriKeyDecrypt', inParams:'CertID, InData', outParamType:'string', clsid:xtxsync.xtx_clsid, aliasName:'PriKeyDecrypt'}, + {funcName:'SOF_SecertSegment', inParams:'Secert, m, n, k', outParamType:'string', clsid:xtxsync.xtx_clsid}, + {funcName:'SOF_SecertRecovery', inParams:'Seg', outParamType:'string', clsid:xtxsync.xtx_clsid}, + {funcName:'SOF_GetLastError', inParams:'', outParamType:'number', clsid:xtxsync.xtx_clsid}, + {funcName:'GetDeviceCount', inParams:'', outParamType:'number', clsid:xtxsync.xtx_clsid}, + {funcName:'GetAllDeviceSN', inParams:'', outParamType:'string', clsid:xtxsync.xtx_clsid}, + {funcName:'GetDeviceSNByIndex', inParams:'iIndex', outParamType:'string', clsid:xtxsync.xtx_clsid}, + {funcName:'GetDeviceInfo', inParams:'sDeviceSN, iType', outParamType:'string', clsid:xtxsync.xtx_clsid}, + {funcName:'ChangeAdminPass', inParams:'sDeviceSN, sOldPass, sNewPass', outParamType:'bool', clsid:xtxsync.xtx_clsid}, + {funcName:'UnlockUserPass', inParams:'sDeviceSN, sAdminPass, sNewUserPass', outParamType:'bool', clsid:xtxsync.xtx_clsid}, + {funcName:'GenerateKeyPair', inParams:'sDeviceSN, sContainerName, iKeyType, bSign', outParamType:'bool', clsid:xtxsync.xtx_clsid}, + {funcName:'ExportPubKey', inParams:'sDeviceSN, sContainerName, bSign', outParamType:'string', clsid:xtxsync.xtx_clsid}, + {funcName:'ImportSignCert', inParams:'sDeviceSN, sContainerName, sCert', outParamType:'bool', clsid:xtxsync.xtx_clsid}, + {funcName:'ImportEncCert', inParams:'sDeviceSN, sContainerName, sCert, sPriKeyCipher', outParamType:'bool', clsid:xtxsync.xtx_clsid}, + {funcName:'ReadFile', inParams:'sDeviceSN, sFileName', outParamType:'string', clsid:xtxsync.xtx_clsid, aliasName:'readFile'}, + {funcName:'WriteFile', inParams:'sDeviceSN, sFileName, sContent, bPrivate', outParamType:'bool', clsid:xtxsync.xtx_clsid, aliasName:'writeFile'}, + {funcName:'IsContainerExist', inParams:'sDeviceSN, sContainerName', outParamType:'bool', clsid:xtxsync.xtx_clsid}, + {funcName:'DeleteContainer', inParams:'sDeviceSN, sContainerName', outParamType:'bool', clsid:xtxsync.xtx_clsid}, + {funcName:'ExportPKCS10', inParams:'sDeviceSN, sContainerName, sDN, bSign', outParamType:'string', clsid:xtxsync.xtx_clsid}, + {funcName:'InitDevice', inParams:'sDeviceSN, sAdminPass', outParamType:'bool', clsid:xtxsync.xtx_clsid}, + {funcName:'AddSignInfo', inParams:'sUserPass', outParamType:'bool', clsid:xtxsync.xtx_clsid}, + {funcName:'SOF_GetVersion', inParams:'', outParamType:'string', clsid:xtxsync.xtx_clsid}, + {funcName:'SOF_ExportExChangeUserCert', inParams:'CertID', outParamType:'string', clsid:xtxsync.xtx_clsid, aliasName:'GetExchCert'}, + {funcName:'SOF_ValidateCert', inParams:'Cert', outParamType:'number', clsid:xtxsync.xtx_clsid, aliasName:'ValidateCert'}, + {funcName:'GetENVSN', inParams:'sDeviceSN', outParamType:'string', clsid:xtxsync.xtx_clsid}, + {funcName:'SetENVSN', inParams:'sDeviceSN, sEnvsn', outParamType:'bool', clsid:xtxsync.xtx_clsid}, + {funcName:'IsDeviceExist', inParams:'sDeviceSN', outParamType:'bool', clsid:xtxsync.xtx_clsid}, + {funcName:'GetContainerCount', inParams:'sDeviceSN', outParamType:'number', clsid:xtxsync.xtx_clsid}, + {funcName:'SOF_SymEncryptData', inParams:'sKey, indata', outParamType:'string', clsid:xtxsync.xtx_clsid, aliasName:'EncryptData'}, + {funcName:'SOF_SymDecryptData', inParams:'sKey, indata', outParamType:'string', clsid:xtxsync.xtx_clsid, aliasName:'DecryptData'}, + {funcName:'SOF_SymEncryptFile', inParams:'sKey, inFile, outFile', outParamType:'bool', clsid:xtxsync.xtx_clsid, aliasName:'EncryptFile'}, + {funcName:'SOF_SymDecryptFile', inParams:'sKey, inFile, outFile', outParamType:'bool', clsid:xtxsync.xtx_clsid, aliasName:'DecryptFile'}, + {funcName:'SOF_GetLastErrMsg', inParams:'', outParamType:'string', clsid:xtxsync.xtx_clsid}, + {funcName:'SOF_Base64Encode', inParams:'sIndata', outParamType:'string', clsid:xtxsync.xtx_clsid}, + {funcName:'SOF_Base64Decode', inParams:'sIndata', outParamType:'string', clsid:xtxsync.xtx_clsid}, + {funcName:'SOF_HashData', inParams:'hashAlg, sInData', outParamType:'string', clsid:xtxsync.xtx_clsid}, + {funcName:'SOF_HashFile', inParams:'hashAlg, inFile', outParamType:'string', clsid:xtxsync.xtx_clsid}, + {funcName:'UnlockUserPassEx', inParams:'sDeviceSN, sAdminPin, sNewUserPass', outParamType:'bool', clsid:xtxsync.xtx_clsid}, + {funcName:'DeleteOldContainer', inParams:'sDeviceSN', outParamType:'bool', clsid:xtxsync.xtx_clsid}, + {funcName:'WriteFileEx', inParams:'sDeviceSN, sFileName, sContent', outParamType:'bool', clsid:xtxsync.xtx_clsid}, + {funcName:'ReadFileEx', inParams:'sDeviceSN, sFileName', outParamType:'string', clsid:xtxsync.xtx_clsid}, + {funcName:'WriteFileBase64', inParams:'sDeviceSN, sFileName, sContent', outParamType:'bool', clsid:xtxsync.xtx_clsid}, + {funcName:'DeleteFile', inParams:'sDeviceSN, sFileName', outParamType:'bool', clsid:xtxsync.xtx_clsid}, + {funcName:'SOF_EncryptDataEx', inParams:'Cert, InData', outParamType:'string', clsid:xtxsync.xtx_clsid}, + {funcName:'Base64EncodeFile', inParams:'sInFile', outParamType:'string', clsid:xtxsync.xtx_clsid}, + {funcName:'SOF_GetRetryCount', inParams:'CertID', outParamType:'number', clsid:xtxsync.xtx_clsid}, + {funcName:'SOF_GetAllContainerName', inParams:'sDeviceSN', outParamType:'string', clsid:xtxsync.xtx_clsid}, + {funcName:'CreateSoftDevice', inParams:'sDeviceSN, sLabel', outParamType:'bool', clsid:xtxsync.xtx_clsid}, + {funcName:'DeleteSoftDevice', inParams:'sDeviceSN, sPasswd', outParamType:'bool', clsid:xtxsync.xtx_clsid}, + {funcName:'EnableSoftDevice', inParams:'enable, sDeviceSN', outParamType:'bool', clsid:xtxsync.xtx_clsid}, + {funcName:'SoftDeviceBackup', inParams:'sDeviceSN, sPasswd', outParamType:'string', clsid:xtxsync.xtx_clsid}, + {funcName:'SoftDeviceRestore', inParams:'sDeviceSN, sPasswd, sInFilePath', outParamType:'bool', clsid:xtxsync.xtx_clsid}, + {funcName:'SOF_Logout', inParams:'CertID', outParamType:'bool', clsid:xtxsync.xtx_clsid, aliasName:'Logout'}, + {funcName:'SetUserConfig', inParams:'type, strConfig', outParamType:'bool', clsid:xtxsync.xtx_clsid}, + {funcName:'SOF_SignByteData', inParams:'CertID, byteLen', outParamType:'string', clsid:xtxsync.xtx_clsid}, + {funcName:'SOF_VerifySignedByteData', inParams:'Cert, byteLen, SignValue', outParamType:'bool', clsid:xtxsync.xtx_clsid}, + {funcName:'OTP_GetChallengeCode', inParams:'sCertID', outParamType:'string', clsid:xtxsync.xtx_clsid}, + {funcName:'ImportEncCertEx', inParams:'sDeviceSN, sContainerName, sCert, sPriKeyCipher, ulSymAlg', outParamType:'bool', clsid:xtxsync.xtx_clsid}, + {funcName:'SOF_GetCertEntity', inParams:'sCert', outParamType:'string', clsid:xtxsync.xtx_clsid, aliasName:'GetCertEntity'}, + {funcName:'SOF_HMAC', inParams:'hashid, key, indata', outParamType:'string', clsid:xtxsync.xtx_clsid}, + {funcName:'SOF_SignDataByPriKey', inParams:'sPriKey, sCert, sInData', outParamType:'string', clsid:xtxsync.xtx_clsid}, + {funcName:'ImportKeyCertToSoftDevice', inParams:'sDeviceSN, sContainerName, sPriKey, sCert, bSign', outParamType:'bool', clsid:xtxsync.xtx_clsid}, + {funcName:'InitDeviceEx', inParams:'sDeviceSN, sAdminPass, sUserPin, sKeyLabel, adminPinMaxRetry, userPinMaxRetry', outParamType:'bool', clsid:xtxsync.xtx_clsid}, + {funcName:'SelectFile', inParams:'', outParamType:'string', clsid:xtxsync.xtx_clsid}, + {funcName:'SOF_SignHashData', inParams:'CertID, b64ashData, hashAlg', outParamType:'string', clsid:xtxsync.xtx_clsid, aliasName:'SignHashData'}, + {funcName:'SOF_VerifySignedHashData', inParams:'Cert, b64ashData, SignValue, hashAlg', outParamType:'bool', clsid:xtxsync.xtx_clsid, aliasName:'VerifySignedHashData'}, + {funcName:'CheckSoftDeviceEnv', inParams:'', outParamType:'bool', clsid:xtxsync.xtx_clsid}, + {funcName:'ImportPfxToDevice', inParams:'sDeviceSN, sContainerName, bSign, strPfx, strPfxPass', outParamType:'bool', clsid:xtxsync.xtx_clsid}, + {funcName:'SOF_HashDataEx', inParams:'hashAlg, sInData, sCert, sID', outParamType:'string', clsid:xtxsync.xtx_clsid}, + {funcName:'SOF_HashFileEx', inParams:'hashAlg, inFile, sCert, sID', outParamType:'string', clsid:xtxsync.xtx_clsid}, + {funcName:'GetDeviceCountEx', inParams:'type', outParamType:'number', clsid:xtxsync.xtx_clsid}, + {funcName:'GetAllDeviceSNEx', inParams:'type', outParamType:'string', clsid:xtxsync.xtx_clsid}, + {funcName:'SOF_UpdateCert', inParams:'CertID, type', outParamType:'number', clsid:xtxsync.xtx_clsid}, + {funcName:'OpenSpecifiedFolder', inParams:'backupFilePath', outParamType:'', clsid:xtxsync.xtx_clsid}, + {funcName:'OTP_GetChallengeCodeEx', inParams:'sCertID, szAccount, money', outParamType:'string', clsid:xtxsync.xtx_clsid}, + {funcName:'Base64DecodeFile', inParams:'sInData, sFilePath', outParamType:'bool', clsid:xtxsync.xtx_clsid}, + {funcName:'EnumFilesInDevice', inParams:'sDeviceSN', outParamType:'string', clsid:xtxsync.xtx_clsid}, + {funcName:'OTP_Halt', inParams:'sCertID', outParamType:'bool', clsid:xtxsync.xtx_clsid}, + {funcName:'SOF_TSGenREQ', inParams:'b64Hash, hashAlg, bReqCert, policyID, b64Nonce, b64Extension', outParamType:'string', clsid:xtxsync.xtx_clsid}, + {funcName:'SOF_TSCompareNonce', inParams:'b64TSReq, b64TSAResp', outParamType:'bool', clsid:xtxsync.xtx_clsid}, + {funcName:'SOF_TSGenPDFSignature', inParams:'b64TSAResp, b64OriPDFSignature', outParamType:'string', clsid:xtxsync.xtx_clsid}, + {funcName:'SOF_TSVerifyPDFSignature', inParams:'b64TSPDFSignature', outParamType:'bool', clsid:xtxsync.xtx_clsid}, + {funcName:'SOF_TSGetPDFSignatureInfo', inParams:'b64TSPDFSignature, iType', outParamType:'string', clsid:xtxsync.xtx_clsid}, + {funcName:'OTP_GetState', inParams:'sCertID, bCert', outParamType:'string', clsid:xtxsync.xtx_clsid}, + {funcName:'OTP_GetSyncCode', inParams:'sCertID, ChallengeCode', outParamType:'string', clsid:xtxsync.xtx_clsid}, + {funcName:'SOF_IsLogin', inParams:'CertID', outParamType:'bool', clsid:xtxsync.xtx_clsid}, + {funcName:'SOF_LoginEx', inParams:'CertID, PassWd, updateFlag', outParamType:'bool', clsid:xtxsync.xtx_clsid}, + {funcName:'EnumSupportDeviceList', inParams:'', outParamType:'string', clsid:xtxsync.xtx_clsid}, + {funcName:'ExportPfxFromDevice', inParams:'sDeviceSN, sContainerName, bSign, strPfxPass', outParamType:'string', clsid:xtxsync.xtx_clsid}, + {funcName:'SOF_SignHashMessage', inParams:'CertID, InHashData, hashAlg', outParamType:'string', clsid:xtxsync.xtx_clsid}, + {funcName:'ExportPfxToFile', inParams:'sDeviceSN, sContainerName, bSign, strPfxPass', outParamType:'string', clsid:xtxsync.xtx_clsid}, + {funcName:'SOF_SignAPK', inParams:'CertID, strOriSignature', outParamType:'string', clsid:xtxsync.xtx_clsid}, + {funcName:'YZT_GenerateKeyPair', inParams:'sDeviceSN, sContainerName, iKeyTypeRSA, iKeyTypeSM2', outParamType:'bool', clsid:xtxsync.xtx_clsid}, + {funcName:'YZT_ExportPubKey', inParams:'sDeviceSN, sContainerName, bSign', outParamType:'string', clsid:xtxsync.xtx_clsid}, + {funcName:'YZT_ImportSignCert', inParams:'sDeviceSN, sContainerName, sRSACert, sSM2Cert', outParamType:'bool', clsid:xtxsync.xtx_clsid}, + {funcName:'YZT_ImportEncCert', inParams:'sDeviceSN, sContainerName, sRSACert, sRSAPriKeyCipher, ulRSASymAlg, sSM2Cert, sSM2PriKeyCipher, ulSM2SymAlg', outParamType:'bool', clsid:xtxsync.xtx_clsid}, + {funcName:'SOF_ListenUKey', inParams:'Parm', outParamType:'string', clsid:xtxsync.xtx_clsid}, + {funcName:'SOF_EnableLoginWindow', inParams:'Parm', outParamType:'string', clsid:xtxsync.xtx_clsid}, + {funcName:'SOF_SignEnvelope', inParams:'CertID, Cert, InData', outParamType:'string', clsid:xtxsync.xtx_clsid}, + {funcName:'SOF_UnSignEnvelope', inParams:'CertID, InData', outParamType:'string', clsid:xtxsync.xtx_clsid}, + {funcName:'BIO_MAKExportPKCS10', inParams:'sDeviceSN, iKeyType, sDN', outParamType:'string', clsid:xtxsync.xtx_clsid}, + {funcName:'BIO_MAKImportSignEncCert', inParams:'sDeviceSN, sSignCert, sEncCert, sPriKeyCipher', outParamType:'bool', clsid:xtxsync.xtx_clsid}, + {funcName:'BIO_IssueDAKCert', inParams:'sDeviceSN, iKeyType, sDN', outParamType:'bool', clsid:xtxsync.xtx_clsid}, + {funcName:'BIO_InfoCollect', inParams:'', outParamType:'string', clsid:xtxsync.xtx_clsid}, + {funcName:'BIO_GetBioInfo', inParams:'sDeviceSN', outParamType:'string', clsid:xtxsync.xtx_clsid}, + {funcName:'SOF_GetLastLoginCertID', inParams:'', outParamType:'string', clsid:xtxsync.xtx_clsid}, + {funcName:'SOF_ReadESealData', inParams:'CertID, ulKeyIndex, ulKeyAlgId, ulFlags', outParamType:'string', clsid:xtxsync.xtx_clsid}, + {funcName:'SOF_ReadKFXESealData', inParams:'CertID, ulKeyIndex, ulKeyAlgId, ulFlags', outParamType:'string', clsid:xtxsync.xtx_clsid}, + {funcName:'SOF_SymDecryptFileToData', inParams:'sKey, inFile', outParamType:'string', clsid:xtxsync.xtx_clsid}, + {funcName:'SOF_SignMessageBase64', inParams:'dwFlag, CertID, InData', outParamType:'string', clsid:xtxsync.xtx_clsid}, + {funcName:'SOF_VerifySignedMessageBase64', inParams:'MessageData, InData', outParamType:'bool', clsid:xtxsync.xtx_clsid}, + {funcName:'SOF_VerifySignedHashMessage', inParams:'MessageData, InHashData', outParamType:'bool', clsid:xtxsync.xtx_clsid}, + {funcName:'SOF_SignDataBase64', inParams:'CertID, InData', outParamType:'string', clsid:xtxsync.xtx_clsid}, + {funcName:'SOF_VerifySignedDataBase64', inParams:'Cert, InData, SignValue', outParamType:'bool', clsid:xtxsync.xtx_clsid}, + {funcName:'SOF_HashDataExBase64', inParams:'hashAlg, sInData, sCert, sID', outParamType:'string', clsid:xtxsync.xtx_clsid}, + {funcName:'SOF_GetProductVersion', inParams:'', outParamType:'string', clsid:xtxsync.xtx_clsid}, + {funcName:'SOF_UpdateCertEx', inParams:'CertID, PassWd', outParamType:'number', clsid:xtxsync.xtx_clsid}, + {funcName:'SOF_GetLastSignDataCertID', inParams:'CertID', outParamType:'string', clsid:xtxsync.xtx_clsid}, + {funcName:'BIO_SetUserConfig', inParams:'CertID, type, strConfig', outParamType:'bool', clsid:xtxsync.xtx_clsid}, + {funcName:'BIO_InvokeCommand', inParams:'CertID, bstrCommand', outParamType:'string', clsid:xtxsync.xtx_clsid}, + {funcName:'SOF_ImportSymmKey', inParams:'CertID, ulKeyIndex, InData, ulFlags', outParamType:'bool', clsid:xtxsync.xtx_clsid}, + {funcName:'SOF_WriteESealData', inParams:'CertID, InData, ulFlags', outParamType:'bool', clsid:xtxsync.xtx_clsid}, + {funcName:'SOF_EPS_Encrypt', inParams:'CertID, ulKeyIndex, ulKeyAlgId, IVData, DivCount, DivComponent, InData, ulFlags', outParamType:'string', clsid:xtxsync.xtx_clsid}, + {funcName:'SOF_EPS_Decrypt', inParams:'CertID, ulKeyIndex, ulKeyAlgId, IVData, DivCount, DivComponent, InData, ulFlags', outParamType:'string', clsid:xtxsync.xtx_clsid}, + {funcName:'SOF_EPS_Mac', inParams:'CertID, ulKeyIndex, ulKeyAlgId, IVData, DivCount, DivComponent, InData, ulFlags', outParamType:'string', clsid:xtxsync.xtx_clsid}, + {funcName:'SOF_PriKeyDecryptEx', inParams:'CertID, InData', outParamType:'string', clsid:xtxsync.xtx_clsid}, + {funcName:'SOF_EPS_ReadESealData', inParams:'CertID, ulKeyIndex, ulKeyAlgId, ulFlags', outParamType:'string', clsid:xtxsync.xtx_clsid}, + {funcName:'SOF_EPS_WriteESealData', inParams:'CertID, InData, ulFlags', outParamType:'bool', clsid:xtxsync.xtx_clsid}, + {funcName:'EnumESeal', inParams:'sDeviceSN', outParamType:'string', clsid:xtxsync.xtx_clsid}, + {funcName:'GetPicture', inParams:'bstrConName', outParamType:'string', clsid:xtxsync.xtx_clsid}, + {funcName:'SOF_SignEnvelopeFile', inParams:'CertID, Cert, InFile, OutFile', outParamType:'bool', clsid:xtxsync.xtx_clsid}, + {funcName:'SOF_UnSignEnvelopeFile', inParams:'CertID, InFile, OutFile', outParamType:'bool', clsid:xtxsync.xtx_clsid}, + {funcName:'SOFX_EncryptFile', inParams:'CertID, Cert, InFile, OutFile, ulFlags', outParamType:'bool', clsid:xtxsync.xtx_clsid}, + {funcName:'SOFX_DecryptFile', inParams:'CertID, InFile, OutFile, ulFlags', outParamType:'bool', clsid:xtxsync.xtx_clsid}, + {funcName:'GetPic', inParams:'bstrConName', outParamType:'string', clsid:xtxsync.getpic_clsid}, + {funcName:'Hash', inParams:'inData', outParamType:'string', clsid:xtxsync.getpic_clsid}, + {funcName:'ConvertPicFormat', inParams:'inData, type', outParamType:'string', clsid:xtxsync.getpic_clsid}, + {funcName:'ConvertGif2Jpg', inParams:'inData', outParamType:'string', clsid:xtxsync.getpic_clsid}, + {funcName:'GetPic1', inParams:'bstrConName', outParamType:'string', clsid:xtxsync.getpic_clsid}, + {funcName:'ConvertPicSize', inParams:'bstrPic, w, h', outParamType:'string', clsid:xtxsync.getpic_clsid}, + {funcName:'GetEnvVersion', inParams:'', outParamType:'string', clsid:xtxsync.xtx_version_clsid}, + {funcName:'InitDeviceWithParam', inParams:'sDeviceSN, sAppName, sAdminPass, sUserPin, sKeyLabel, adminPinMaxRetry, userPinMaxRetry, createFileRights', outParamType:'bool', clsid:xtxsync.xtx_clsid}, + {funcName:'SOF_SignDataEx', inParams:'CertID, InData,signFlag', outParamType:'string', clsid:xtxsync.xtx_clsid}, + {funcName:'SOF_VerifySignedDataEx', inParams:'Cert, InData, SignValue,signFlag', outParamType:'bool', clsid:xtxsync.xtx_clsid}, + {funcName:'SOF_SymEncryptDataEx', inParams:'sKey,sIV,indata', outParamType:'string', clsid:xtxsync.xtx_clsid}, + {funcName:'SOF_SymDecryptDataEx', inParams:'sKey,sIV,indata', outParamType:'string', clsid:xtxsync.xtx_clsid} + ]; + + for (var i = 0; i < export_functions.length; i++) { + getImplmentFunction(export_functions[i]); + xtxsync[export_functions[i].funcName] = window[export_functions[i].funcName]; + if (export_functions[i].aliasName) { + window[export_functions[i].aliasName] = window[export_functions[i].funcName]; + xtxsync[export_functions[i].aliasName] = window[export_functions[i].funcName]; + } + + } + + return true; +} + +return initXTXAppObject(xtxsync); +})(); + +/////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////// EXPORT VAR AND FUNCTIONS /////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////////////// +// const var +var CERT_TYPE_HARD = 1; +var CERT_TYPE_SOFT = 2; +var CERT_TYPE_ALL = 3; + +// set auto logout parameters +function SetAutoLogoutParameter(strCertID, logoutFunc) { + xtxsync.custom.setAutoLogoutParameter(strCertID, logoutFunc); +} + +// set user cert list id +function SetUserCertList(strListID, certType) { + xtxsync.custom.setUserCertList(strListID, certType); +} + +// set custom usbkeychange callback +function SetOnUsbKeyChangeCallBack(callback) { + xtxsync.custom.setOnUsbKeyChangeCallBack(callback); +} + +// set custom alert function +function SetAlertFunction(custom_alert) { + xtxsync.custom.setErrorReportFunc(custom_alert); +} + +// get custom userlogin token +function GetLoginToken() { + return xtxsync.custom.getToken(); +} + +function SetLoginToken(tokenData) { + return xtxsync.custom.setToken(tokenData); +} + +function GetUserListByType(strType) { // strType is 'HARD' or 'SOFT' + var strUserList = xtxsync.SOF_GetUserList(); + var strReturn = ""; + while (true) { + var i = strUserList.indexOf("&&&"); + if (i <= 0 ) { + break; + } + var strOneUser = strUserList.substring(0, i); + var strName = strOneUser.substring(0, strOneUser.indexOf("||")); + var strCertID = strOneUser.substring(strOneUser.indexOf("||") + 2, strOneUser.length); + var devType = xtxsync.GetDeviceInfo(strCertID, 7); + if (devType == strType) { + strReturn += (strName + "||" + strCertID + "&&&"); + } + var len = strUserList.length; + strUserList = strUserList.substring(i + 3, len); + }; + + return strReturn; +} + +//get usbKey user list +function GetUserList_USBKey(cb, ctx) { + return GetUserListByType("HARD", cb, ctx); +} + +//get soft user list +function GetUserList_Soft() { + return GetUserListByType("SOFT", cb, ctx); +} + +//sign data with pkcs7 format +function SignByP7(strCertID, strInData, bDetach) { + return xtxsync.SOF_SignMessage(bDetach ? 1 : 0, strCertID, strInData); +} + +//get symmitric key length +//because xtx and secxv2 secx default symmitric alg is no equal +function GetSymKeyLength() { + return 24; +} + +//get device type return SOFT or HARD +function GetDeviceType(strCertID) { + return xtxsync.GetDeviceInfo(strCertID, 7); +} + +// calculate file's hash +function HashFile(strFilePath) { + return xtxsync.SOF_HashFile(2/*sha1*/, strFilePath); +} + +function ParseDateString(strDate) { + var strYear = strDate.substring(0, 4); + var strMonth = strDate.substring(4, 6); + var strDay = strDate.substring(6, 8); + var strHour = strDate.substring(8, 10); + var strMin = strDate.substring(10, 12); + var strSecond = strDate.substring(12, 14); + var RtnDate = new Date(); + RtnDate.setFullYear(Number(strYear), Number(strMonth) - 1, Number(strDay)); + RtnDate.setHours(Number(strHour)); + RtnDate.setMinutes(Number(strMin)); + RtnDate.setSeconds(Number(strSecond)); + return RtnDate; +} + +//Form login +function Login(formName, strCertID, strPin) { + var objForm = eval(formName); + if (objForm == null) { + return false; + } + if (strCertID == null || strCertID == "") { + xtxsync.custom.errorReportFunc("请输入证书密码!"); + return false; + } + if (strPin == null || strPin == "") { + xtxsync.custom.errorReportFunc("请输入证书密码!"); + return false; + } + + //Add a hidden item ... + if (objForm.UserSignedData == null) { + objForm.insertAdjacentHTML("BeforeEnd", ""); + } + if (objForm.UserCert == null) { + objForm.insertAdjacentHTML("BeforeEnd", ""); + } + if (objForm.CertID == null) { + objForm.insertAdjacentHTML("BeforeEnd", ""); + } + if (objForm.ContainerName == null) { + objForm.insertAdjacentHTML("BeforeEnd", ""); + } + if (objForm.LoginToken == null) { + objForm.insertAdjacentHTML("BeforeEnd", ""); + } + + var bRet = xtxsync.SOF_Login(strCertID, strPin); + if (!bRet) { + var retryCount = xtxsync.SOF_GetPinRetryCount(strCertID); + if (retryCount > 0) { + xtxsync.custom.errorReportFunc("校验证书密码失败!您还有" + retryCount + "次机会重试!"); + } else if (retryCount == 0) { + xtxsync.custom.errorReportFunc("您的证书密码已被锁死,请联系BJCA进行解锁!"); + } else { + xtxsync.custom.errorReportFunc("登录失败!"); + } + return false; + } + + var strClientCert = xtxsync.SOF_ExportUserCert(strCertID); + if (strClientCert == "") { + xtxsync.custom.errorReportFunc("导出用户证书失败!"); + return false; + } + + var strNotBefore = xtxsync.SOF_GetCertInfo(strClientCert, 11); + var strNotAfter = xtxsync.SOF_GetCertInfo(strClientCert, 12); + var notBeforeDate = ParseDateString(strNotBefore); + var days = parseInt((notBeforeDate.getTime() - new Date().getTime()) / (1000*60*60*24)); + if (days > 0) { + xtxsync.custom.errorReportFunc("您的证书尚未生效!距离生效日期还剩" + days + "天!"); + return false; + } + + var notAfterDate = ParseDateString(strNotAfter); + var milliseconds = notAfterDate.getTime() - new Date().getTime(); + if (milliseconds < 0) { + xtxsync.custom.errorReportFunc("您的证书已过期,请尽快到北京数字证书认证中心办理证书更新手续!"); + return false; + } + + days = parseInt(milliseconds / (1000*60*60*24)); + if (days > 0 && days <= 60) { + xtxsync.custom.errorReportFunc("您的证书还有" + days + "天过期\n请您尽快到北京数字证书认证中心办理证书更新手续!"); + } else if (days == 0) { // 证书有效期天数小于1天 + var hours = parseInt(milliseconds / (1000*60*60)); + if (hours > 0) { + xtxsync.custom.errorReportFunc("您的证书还有" + hours + "小时过期\n请您尽快到北京数字证书认证中心办理证书更新手续!"); + } + // 证书有效期小于1小时 + var minutes = parseInt(milliseconds / (1000*60)); + if (minutes > 1) { + xtxsync.custom.errorReportFunc("您的证书还有" + minutes + "分钟过期\n请您尽快到北京数字证书认证中心办理证书更新手续!"); + } else { + xtxsync.custom.errorReportFunc("您的证书已过期,请尽快到北京数字证书认证中心办理证书更新手续!"); + return false; + } + } + + bRet = xtxsync.SOF_VerifySignedData(strServerCert, strServerRan, strServerSignedData); + if (!bRet) { + xtxsync.custom.errorReportFunc("验证服务器端信息失败!"); + return false; + } + + var clientSignData = xtxsync.SOF_SignData(strCertID, strServerRan); + if (clientSignData == "") { + xtxsync.custom.errorReportFunc("客户端签名失败!"); + return false; + } + + objForm.CertID.value = strCertID; + objForm.ContainerName.value = strCertID; + objForm.UserCert.value = strClientCert; + objForm.UserSignedData.value = clientSignData; + objForm.LoginToken.value = xtxsync.custom.getToken(); + + return true; +} diff --git a/el-admin/src/api/api.js b/el-admin/src/api/api.js index 3d65bf8..23e9ebf 100644 --- a/el-admin/src/api/api.js +++ b/el-admin/src/api/api.js @@ -87,6 +87,14 @@ export const CalendarChangeInfo = (data={}) => { export const CheckMenuAuth = (data={}) => { return axios({url:import.meta.env.VITE_APP_API+'v1/admin/CheckMenuAuth',data:data}) } +//admin后台获取体检记录 +export const GetCheckUpList = (data={}) => { + return axios({url:import.meta.env.VITE_APP_API+'v1/admin/GetCheckUpList',data:data}) +} +//admin后台获取预约记录 +export const GetAppointmentList = (data={}) => { + return axios({url:import.meta.env.VITE_APP_API+'v1/admin/GetAppointmentList',data:data}) +} //请求登录二维码 export const addSignJob = (data={}) => { return axios({url:import.meta.env.VITE_APP_API+'addSignJob',data:data}) @@ -98,4 +106,9 @@ export const XTSignCheckNotify = (data={}) => { //admin后台用户绑定协同签名useid export const XTSignBindUser = (data={}) => { return axios({url:import.meta.env.VITE_APP_API+'v1/admin/XTSignBindUser',data:data}) +} + +//admin后台用户绑定ukey +export const UkeyBindUser = (data={}) => { + return axios({url:import.meta.env.VITE_APP_API+'v1/admin/UkeyBindUser',data:data}) } \ No newline at end of file diff --git a/el-admin/src/router/index.js b/el-admin/src/router/index.js index 689ef23..f45274c 100644 --- a/el-admin/src/router/index.js +++ b/el-admin/src/router/index.js @@ -9,6 +9,7 @@ import AdminGroupList from '../views/SystemMngr/Group/List.vue' import AdminUserList from '../views/SystemMngr/User/List.vue' import AdminChangPwd from '../views/SystemMngr/User/ChangPwd.vue' import HealthCalendar from '../views/AppointmentMngr/HealthCalendar.vue' +import AppointmentList from '../views/AppointmentMngr/AppointmentList.vue' import healthCheckList from '../views/MedicalCenter/HealthCheckList.vue' import Dashboard from '../views/MedicalCenter/Dashboard.vue' @@ -66,6 +67,11 @@ const router = createRouter({ name: 'HealthCheckList', component: healthCheckList, meta: { title: '体检记录列表' } + }, { + path: '/appointmentList', + name: 'AppointmentList', + component: AppointmentList, + meta: { title: '预约记录列表' } }] }, diff --git a/el-admin/src/views/AppointmentMngr/AppointmentList.vue b/el-admin/src/views/AppointmentMngr/AppointmentList.vue new file mode 100644 index 0000000..8a93fd1 --- /dev/null +++ b/el-admin/src/views/AppointmentMngr/AppointmentList.vue @@ -0,0 +1,151 @@ + + + + + \ No newline at end of file diff --git a/el-admin/src/views/AppointmentMngr/HealthCalendar.vue b/el-admin/src/views/AppointmentMngr/HealthCalendar.vue index 2cbe716..99c62d3 100644 --- a/el-admin/src/views/AppointmentMngr/HealthCalendar.vue +++ b/el-admin/src/views/AppointmentMngr/HealthCalendar.vue @@ -60,7 +60,11 @@ - + + +