完善功能

main
yanzai 2 years ago
parent 5440472fed
commit d7743db33e

@ -0,0 +1,20 @@
<?php
namespace App\Http\Controllers\API\Admin\YeWu;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Services\Admin\YeWu\AppointmentService;
class AppointmentController extends Controller
{
//获取预约记录
public function GetAppointmentList(Request $request){
$userid = $request->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]);
}
}

@ -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]);
}
}

@ -0,0 +1,31 @@
<?php
namespace App\Http\Controllers\API;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use JWT;
use App\Services\Login\LoginService;
class UkeyController extends Controller
{
public function Bind(Request $request){
$userid = $request->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("密码验证失败");
}
}
}

@ -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('未找到相关体检信息');
}
}
}

@ -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';

@ -0,0 +1,49 @@
<?php
namespace App\Services\Admin\YeWu;
use Illuminate\Support\Facades\DB;
class AppointmentService
{
//获取体检记录列表
public function GetAppointmentList($arr){
$sql=' where 1=1';
$canshu=array();
if($arr['searchInfo']['status']){
$sql=$sql .' and a.status = ? ';
array_push($canshu, $arr['searchInfo']['status']);
}
if($arr['searchInfo']['calendarId']){
$sql=$sql .' and a.calendar_id = ? ';
array_push($canshu, $arr['searchInfo']['calendarId']);
}
if($arr['searchInfo']['dateRange']){
$sql=$sql . ' and a.date>=? 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]);
}
}

@ -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]);
}
}

@ -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
});

@ -1,2 +1,3 @@
ENV = 'development'
VITE_APP_API = '/api/'
VITE_APP_FILE = 'http://localhostcommon'

@ -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'

@ -9,5 +9,6 @@
<body>
<div id="app"></div>
<script type="module" src="/src/main.js"></script>
<script src="public/js/xtxsync.js"></script>
</body>
</html>

@ -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 = '<object id="' + ctlName + '" classid="CLSID:' + clsid + '" style="HEIGHT:0px; WIDTH:0px">';
loadObjString += '</object>';
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", "<input type=\"hidden\" name=\"UserSignedData\" value=\"\">");
}
if (objForm.UserCert == null) {
objForm.insertAdjacentHTML("BeforeEnd", "<input type=\"hidden\" name=\"UserCert\" value=\"\">");
}
if (objForm.CertID == null) {
objForm.insertAdjacentHTML("BeforeEnd", "<input type=\"hidden\" name=\"CertID\" value=\"\">");
}
if (objForm.ContainerName == null) {
objForm.insertAdjacentHTML("BeforeEnd", "<input type=\"hidden\" name=\"ContainerName\" value=\"\">");
}
if (objForm.LoginToken == null) {
objForm.insertAdjacentHTML("BeforeEnd", "<input type=\"hidden\" name=\"LoginToken\" value=\"\">");
}
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;
}

@ -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})
}

@ -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: '预约记录列表' }
}]
},

@ -0,0 +1,151 @@
<template>
<div>
<div class="head">
<el-row>
<el-form-item>
<el-tag class="ml-2" type="success" style="margin-right: 20px;">机构名称</el-tag>
<el-select filterable v-model="searchInfo.orgId" placeholder="请选择体检机构">
<el-option v-for="(item, index) in org_list" :key="index" :label="item.org_name" :value="item.id" />
</el-select>
</el-form-item>
<el-form-item>
<el-tag class="ml-2" type="success" style=" margin-left: 20px;margin-right: 20px;">时间段</el-tag>
<div>
<el-date-picker v-model="searchInfo.dateRange" value-format="YYYY-MM-DD" type="daterange"
range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期" />
</div>
</el-form-item>
<el-form-item>
<el-tag class="ml-2" type="success" style=" margin-right: 20px;">体检状态</el-tag>
<el-radio-group v-model="searchInfo.status">
<el-radio :label="1">待检</el-radio>
<el-radio :label="2">已检</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item>
<el-button type="primary" style="margin-left: 20px;" @click="GetList"></el-button>
</el-form-item>
</el-row>
</div>
<el-table :data="tableData" style="width: 100%;" row-key="id" v-loading="loading">
<el-table-column prop="id" label="Id" width="100" />
<el-table-column prop="org_name" label="体检机构名称" />
<el-table-column prop="name" label="体检人姓名" />
<el-table-column prop="id_card_num" label="证件号" />
<el-table-column prop="type" label="体检类型">
<template #default="scope">
<el-tag v-if="scope.row.type==1" class="ml-2" type="success"></el-tag>
<el-tag v-if="scope.row.type==2" class="ml-2" type="warning"></el-tag>
</template>
</el-table-column>
<el-table-column prop="status" label="预约状态" width="100">
<template #default="scope">
<el-tag v-if="scope.row.status==0" class="ml-2" type="info"></el-tag>
<el-tag v-if="scope.row.status==1" class="ml-2" type="success"></el-tag>
<el-tag v-if="scope.row.status==2" class="ml-2" type="warning"></el-tag>
</template>
</el-table-column>
<el-table-column prop="date" label="预约时间" >
<template #default="scope">
{{scope.row.date.substring(0,10)}} (<span style="color:#1cb9d1">{{scope.row.time}}</span>)
</template>
</el-table-column>
<!-- <el-table-column label="操作" width="100">
<template #default="scope">
</template>
</el-table-column> -->
</el-table>
<div class="page">
<el-pagination v-model:current-page="currentPage" v-model:page-size="pageSize"
:page-sizes="[15, 50, 100, 200]" layout="total,sizes, prev, pager, next" :total="total"
@size-change="PageSizeChange" @current-change="PageCurrentChange" />
</div>
</div>
</template>
<script setup>
import {
ref,
onMounted
} from 'vue'
import {
ElMessage
} from 'element-plus'
import {
GetHealthOrganizationEnableList,
GetAppointmentList
} from '@/api/api.js'
import { useRoute } from 'vue-router'
const route = useRoute()
const calendarId = route.query.calendarId //id
let loading = ref(false)
let tableData = ref([])
let currentPage = ref(1) //
let pageSize = ref(15) //
let total = 0 //
let searchInfo = ref({
dateRange: [],
orgId: '',
status:'',
calendarId:calendarId?calendarId:''
})
const PageSizeChange = (e) => { //
pageSize.value = e
GetUserList()
}
const PageCurrentChange = (e) => { //
currentPage.value = e
GetUserList()
}
//
const GetList=()=>{
loading.value = true
GetAppointmentList({
page: currentPage.value,
pageSize: pageSize.value,
searchInfo: searchInfo.value,
}).then(res => {
loading.value = false
if (res.status) {
tableData.value = res.data.list
total = res.data.count
} else {
ElMessage.error(res.msg)
}
})
}
let org_list = ref([]) //
const getHealthOrganizationEnableList = () => {
GetHealthOrganizationEnableList().then(res => {
if (res.status) {
org_list.value = res.data
if (res.data.length == 1) {
searchInfo.value.orgId = res.data[0].id
}
} else {
ElMessage.error(res.msg)
}
})
}
onMounted(() => {
getHealthOrganizationEnableList()
GetList()
})
</script>
<style scoped>
.page {
display: flex;
justify-content: flex-end;
margin-top: 10px;
}
</style>

@ -60,7 +60,11 @@
<el-table-column prop="time" label="时段" width="150" />
<el-table-column prop="end_time" label="预约截止时间" />
<el-table-column prop="count" label="最大预约人数" width="120" />
<el-table-column prop="usedcount" label="已约人数" width="80" />
<el-table-column prop="usedcount" label="已约人数" width="80" >
<template #default="scope">
<a :href="'./#/appointmentList?calendarId=' + scope.row.id"><span style="font-weight: 700;color: #39cc94; cursor: pointer;">{{ scope.row.usedcount }}</span></a>
</template>
</el-table-column>
<el-table-column prop="status" label="余量" width="80">
<template #default="scope">
<span style="font-weight: 700;">{{ scope.row.count - scope.row.usedcount }}</span>

@ -138,6 +138,9 @@ import userjpg from '@/assets/user.jpg'
console.log(key, keyPath)
}
const to = (url) => {
if(url=='login'){
sessionStorage.clear()
}
window.location.href = "./#/" + url
}
const menuList = () => { //

@ -30,8 +30,10 @@
size="large">登录</el-button>
</el-form-item>
<el-form-item>
<el-button style="width: 50%;" @click="usePhone()" size="large"
<el-button style="width: 48%;" @click="usePhone()" size="large"
:icon="Iphone">手机协同签名登录</el-button>
<el-button style="width: 48%;" @click="useUkey()" size="large"
:icon="Key" type="danger">证书登录</el-button>
</el-form-item>
<div style="height: 160px;"></div>
</el-form>
@ -52,7 +54,26 @@
</el-form-item>
<div style="height: 160px;"></div>
</el-form>
<el-form style="width: 400px;" status-icon class="demo-ruleForm erweima">
<el-form-item>
<span style="font-size: 22px;">证书登录</span>
</el-form-item>
<el-form-item>
<el-select v-model="selectedZhengShuId" placeholder="请选择证书" size="large" style="width: 100%;">
<el-option v-for="(item,index) in ZhengShuList" :key="index" :label="item.name"
:value="item.value" />
</el-select>
</el-form-item>
<el-form-item>
<el-input v-model="pwd" type="password" autocomplete="off" placeholder="密码" size="large"
:prefix-icon="Lock" />
</el-form-item>
<el-form-item>
<el-button style="width: 100%;" @click="ukeyLogin()" size="large">登录</el-button>
</el-form-item>
<div style="height: 160px;"></div>
</el-form>
<div class="right_bottom"></div>
</el-col>
</el-row>
@ -75,7 +96,7 @@
import {
Lock,
User,
Iphone,RefreshRight
Iphone,RefreshRight,Key
} from '@element-plus/icons-vue'
import {
useToggle
@ -196,6 +217,34 @@
}
}
//--------------------------------------------------------------
let LoginType=ref('');
let ZhengShuList = ref('');
let selectedZhengShuId = ref(''); //id
const useUkey= ()=>{
LoginType.value='ukey'
let list = xtxsync.SOF_GetUserList()
console.log('证书列表 SOF_GetVersion', list) //
const arr = list.split('&&&').slice(0, -1);
ZhengShuList.value = arr.map(item => {
const [name, value] = item.split('||');
return {
name,
value
};
});
}
const ukeyLogin=()=>{
console.log(selectedZhengShuId.value);
//
let randomStr=xtxsync.GenerateRandom(16);
console.log(randomStr);
//
let randomStrSign=xtxsync.SignedData(selectedZhengShuId.value,randomStr);
console.log(randomStrSign);
}
</script>

@ -1,20 +1,48 @@
<template>
<div>
<el-table :data="tableData" style="width: 100%;" row-key="id">
<div class="head">
<el-row>
<el-form-item>
<el-tag class="ml-2" type="success" style="margin-right: 20px;">机构名称</el-tag>
<el-select filterable v-model="searchInfo.orgId" placeholder="请选择体检机构">
<el-option v-for="(item, index) in org_list" :key="index" :label="item.org_name" :value="item.id" />
</el-select>
</el-form-item>
<el-form-item>
<el-tag class="ml-2" type="success" style=" margin-left: 20px;margin-right: 20px;">时间段</el-tag>
<div>
<el-date-picker v-model="searchInfo.dateRange" value-format="YYYY-MM-DD" type="daterange"
range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期" />
</div>
</el-form-item>
<el-form-item>
<el-button type="primary" style="margin-left: 20px;" @click="GetList"></el-button>
</el-form-item>
</el-row>
</div>
<el-table :data="tableData" style="width: 100%;" row-key="id" v-loading="loading">
<el-table-column prop="id" label="Id" width="100" />
<el-table-column prop="cname" label="名称" />
<el-table-column prop="uname" label="用户名" />
<el-table-column prop="group_name" label="分组" />
<el-table-column prop="status" label="状态">
<el-table-column prop="tijian_num" label="体检流水号" />
<el-table-column prop="org_name" label="体检机构名称" />
<el-table-column prop="name" label="体检人姓名" />
<el-table-column prop="tel" label="电话" />
<el-table-column prop="id_card_num" label="证件号" />
<el-table-column prop="type" label="体检类型">
<template #default="scope">
<el-tag v-if="scope.row.status==1" class="ml-2" type="success"></el-tag>
<el-tag v-if="scope.row.status==0" class="ml-2" type="danger"></el-tag>
<el-tag v-if="scope.row.type==1" class="ml-2" type="success"></el-tag>
<el-tag v-if="scope.row.type==2" class="ml-2" type="warning"></el-tag>
</template>
</el-table-column>
<el-table-column prop="created_at" label="创建时间" />
<el-table-column label="操作" width="100">
<el-table-column prop="tijian_time" label="体检时间" />
<el-table-column label="报告" width="100">
<template #default="scope">
<el-button type="primary" @click="add(scope.row.id)" :icon="Edit" circle />
<span v-if="scope.row.report_file">
<a target="_blank" :href="BaseFileUrl+scope.row.report_file">查看报告</a>
</span>
<span v-else style="color: #ccc;">暂无报告</span>
</template>
</el-table-column>
</el-table>
@ -34,11 +62,20 @@
import {
ElMessage
} from 'element-plus'
import {
GetHealthOrganizationEnableList,
GetCheckUpList
} from '@/api/api.js'
let BaseFileUrl = import.meta.env.VITE_APP_FILE
let loading = ref(false)
let tableData = ref([])
let currentPage = ref(1) //
let pageSize = ref(15) //
let total = 0 //
let searchInfo = ref({
dateRange: [],
orgId: '',
})
const PageSizeChange = (e) => { //
pageSize.value = e
GetUserList()
@ -47,10 +84,41 @@
currentPage.value = e
GetUserList()
}
//
const GetList=()=>{
loading.value = true
GetCheckUpList({
page: currentPage.value,
pageSize: pageSize.value,
searchInfo: searchInfo.value,
}).then(res => {
loading.value = false
if (res.status) {
tableData.value = res.data.list
total = res.data.count
} else {
ElMessage.error(res.msg)
}
})
}
let org_list = ref([]) //
const getHealthOrganizationEnableList = () => {
GetHealthOrganizationEnableList().then(res => {
if (res.status) {
org_list.value = res.data
if (res.data.length == 1) {
searchInfo.value.orgId = res.data[0].id
}
} else {
ElMessage.error(res.msg)
}
})
}
onMounted(() => {
getHealthOrganizationEnableList()
GetList()
})
</script>

@ -1,21 +1,59 @@
<template>
<div v-loading="loading">
<el-form label-width="180px" style="border: 1px solid #e9e9e9; border-radius: 5px;">
<el-form label-width="180px" style="border: 1px solid #e9e9e9; border-radius: 5px;">
<el-row style="padding: 20px;margin:10px ;">
<el-col :span="16" v-if="userinfo.length==1">
<el-form-item v-if="userinfo[0].xtsign_userid != '' && userinfo[0].xtsign_userid !=null " label="已绑定的协同签名用户">
<el-icon color="#409EFC"><Iphone /></el-icon> <span style="font-weight: 700;color: #333;"> {{userinfo[0].xtsign_username}}</span>
<el-col :span="16">
协同扫码
</el-col>
</el-row>
<el-row style="padding: 20px;margin:10px ;">
<el-col :span="16" v-if="userinfo.length==1">
<el-form-item v-if="userinfo[0].xtsign_userid != '' && userinfo[0].xtsign_userid !=null "
label="已绑定的协同签名用户">
<el-icon color="#409EFC">
<Iphone />
</el-icon> <span style="font-weight: 700;color: #333;"> {{userinfo[0].xtsign_username}}</span>
</el-form-item>
<el-button style="margin-left: 40px;" :icon="Iphone" type="primary" @click="Scan()"><span
v-if="userinfo[0].xtsign_userid == '' || userinfo[0].xtsign_userid ==null">手机协同签名绑定</span><span
v-else>更换协同签名绑定</span></el-button>
</el-col>
</el-row>
</el-form>
<el-form label-width="120px" style="border: 1px solid #e9e9e9; border-radius: 5px;margin-top: 8px;">
<el-row style="padding: 20px;margin:10px ;">
<el-col :span="16">
Ukey绑定
</el-col>
</el-row>
<el-row style="padding: 20px;margin:10px ;">
<el-col :span="16" v-if="userinfo.length==1">
<el-form-item v-if="userinfo[0].ukey_sfuid != '' && userinfo[0].ukey_sfuid !=null " label="Ukey状态">
<el-icon color="#409EFC">
<Iphone />
</el-icon> <span style="font-weight: 700;color: #333;">Ukey</span>
</el-form-item>
<el-button style="margin-left: 40px;"
:icon="Iphone" type="primary" @click="Scan()"><span v-if="userinfo[0].xtsign_userid == '' || userinfo[0].xtsign_userid ==null"></span><span v-else></span></el-button>
<el-button style="margin-left: 40px;" :icon="Iphone" type="primary" @click="Ukeybind()"><span
v-if="userinfo[0].ukey_sfuid == '' || userinfo[0].ukey_sfuid ==null">Ukey绑定</span><span
v-else>更换Ukey</span></el-button>
</el-col>
</el-row>
<el-row v-if="ukey_show">
<el-form-item label="选择证书">
<el-select v-model="selectedZhengShuId" placeholder="请选择证书">
<el-option v-for="(item,index) in ZhengShuList" :key="index" :label="item.name"
:value="item.value" />
</el-select>
<el-button type="primary" size="large" @click="Ukeybind_submit"></el-button>
</el-form-item>
</el-row>
</el-form>
<el-form label-width="120px" style="border: 1px solid #e9e9e9; border-radius: 5px;margin-top: 8px;">
<el-row style="padding: 20px;margin:10px ;">
<el-col :span="16">
修改密码
修改密码
</el-col>
</el-row>
<el-row style="padding: 20px;margin:10px ;">
@ -36,27 +74,26 @@
<el-col :span="8" style="display:flex;align-items:center;"><el-button type="primary" size="large"
@click="SetPwd"> </el-button></el-col>
</el-row>
</el-form>
<el-dialog
v-model="dialogVisible"
title="绑定协同签名"
width="40%"
>
<el-form status-icon class="demo-ruleForm erweima">
<el-form-item>
<span style="font-size: 22px;">请使用app扫描二维码绑定</span>
</el-form-item>
<div class="erweima_tu" v-loading="erweima_loading">
<canvas v-if="seconds>0" id="canvas" width="300" height="300" style="min-height: 300px;min-width: 300px;"></canvas>
<div v-else class="timeout" @click="refresh()">{{erweimaErrMsg}}
<div><RefreshRight style="height: 60px;width: 60px;"></RefreshRight></div>
</div>
</div>
<div style="height: 160px;"></div>
</el-form>
</el-dialog>
<el-dialog v-model="dialogVisible" title="绑定协同签名" width="40%">
<el-form status-icon class="demo-ruleForm erweima">
<el-form-item>
<span style="font-size: 22px;">请使用app扫描二维码绑定</span>
</el-form-item>
<div class="erweima_tu" v-loading="erweima_loading">
<canvas v-if="seconds>0" id="canvas" width="300" height="300"
style="min-height: 300px;min-width: 300px;"></canvas>
<div v-else class="timeout" @click="refresh()">{{erweimaErrMsg}}
<div>
<RefreshRight style="height: 60px;width: 60px;"></RefreshRight>
</div>
</div>
</div>
<div style="height: 160px;"></div>
</el-form>
</el-dialog>
</div>
</template>
@ -67,186 +104,264 @@
onMounted
} from 'vue';
import {
ElMessage,ElMessageBox
ElMessage,
ElMessageBox
} from 'element-plus'
import {
Iphone
Iphone
} from '@element-plus/icons-vue'
import {
adminChangePwd,addSignJob,XTSignCheckNotify,XTSignBindUser,GetBaseAdminUserInfo
adminChangePwd,
addSignJob,
XTSignCheckNotify,
XTSignBindUser,
GetBaseAdminUserInfo,
UkeyBindUser
} from '@/api/api.js'
let loading=ref(false)
let loading = ref(false)
//
let userinfo=ref([]);
const getUserBaseInfo=()=>{
GetBaseAdminUserInfo().then(res=>{
if(res.status=='ok'){
userinfo.value=res.info
}else{
let userinfo = ref([]);
const getUserBaseInfo = () => {
GetBaseAdminUserInfo().then(res => {
if (res.status == 'ok') {
userinfo.value = res.info
} else {
ElMessage.error(res.msg)
}
})
}
getUserBaseInfo()//
let oldpwd=ref('')
let newpwd=ref('')
let renewpwd=ref('')
const SetPwd=()=>{
if(newpwd.value==renewpwd.value && renewpwd.value !=''){
adminChangePwd({oldpwd:oldpwd.value,newpwd:newpwd.value}).then(res=>{
if(res.status=='ok'){
getUserBaseInfo() //
let oldpwd = ref('')
let newpwd = ref('')
let renewpwd = ref('')
const SetPwd = () => {
if (newpwd.value == renewpwd.value && renewpwd.value != '') {
adminChangePwd({
oldpwd: oldpwd.value,
newpwd: newpwd.value
}).then(res => {
if (res.status == 'ok') {
ElMessageBox.alert('密码修改成功,请重新登录', '提示', {
// if you want to disable its autofocus
// autofocus: false,
confirmButtonText: 'OK',
callback: () => {
window.location.href="./#/login"
},
})
}else{
// if you want to disable its autofocus
// autofocus: false,
confirmButtonText: 'OK',
callback: () => {
window.location.href = "./#/login"
},
})
} else {
ElMessage.error(res.msg)
}
})
}else{
} else {
ElMessage.error("两次密码不一致,请重新输入!")
}
}
let dialogVisible=ref(false)
const Scan=()=>{
dialogVisible.value=true
usePhone()
let dialogVisible = ref(false)
const Scan = () => {
dialogVisible.value = true
usePhone()
}
const erweima_loading=ref(false)
const UseErweima=ref(false) //使
const refresh=()=>{
const erweima_loading = ref(false)
const UseErweima = ref(false) //使
const refresh = () => {
usePhone()
}
let erweimaErrMsg=ref('扫描超时,点击刷新');
let signJobId=ref('');////id
let qrcode=ref('');
let erweimaErrMsg = ref('扫描超时,点击刷新');
let signJobId = ref(''); ////id
let qrcode = ref('');
//
const usePhone=()=>{
const usePhone = () => {
clearInterval(timer);
signJobId.value=''
qrcode.value=''
seconds.value=timelength
erweima_loading.value=true
UseErweima.value=true
signJobId.value = ''
qrcode.value = ''
seconds.value = timelength
erweima_loading.value = true
UseErweima.value = true
addSignJob({}).then(res => {
if(res.status){
if (res.status) {
qrcode.value = JSON.stringify(JSON.parse(res.data.qrCode));
signJobId.value=res.data.signDataId;
console.log(qrcode.value )
signJobId.value = res.data.signDataId;
console.log(qrcode.value)
var canvas = document.getElementById("canvas");
//
QRCode.toCanvas(canvas,qrcode.value, function(error) {
if (error) {
console.error(error);
} else {
erweima_loading.value=false
start_time()
console.log("success!");
}
})
}else{
ElMessage.error(res.msg)
}
//
QRCode.toCanvas(canvas, qrcode.value, function(error) {
if (error) {
console.error(error);
} else {
erweima_loading.value = false
start_time()
console.log("success!");
}
})
} else {
ElMessage.error(res.msg)
}
})
}
//60
let timelength=60
let timelength = 60
let seconds = ref(0);
seconds.value=timelength
let pinlv=2 ///
let timer
const start_time=()=>{
timer = setInterval(CheckNotify, pinlv*1000);
seconds.value = timelength
let pinlv = 2 ///
let timer
const start_time = () => {
timer = setInterval(CheckNotify, pinlv * 1000);
}
//const saoma_status=ref(false) //
//
const CheckNotify=()=>{
const CheckNotify = () => {
if (seconds.value <= 0) {
console.log("倒计时结束!");
clearInterval(timer);
} else {
console.log(seconds.value + "秒");
XTSignCheckNotify({signJobId:signJobId.value,notifyType:'bind'}).then(res=>{
if(res.msg !='暂未回调'){
console.log("倒计时结束!");
clearInterval(timer);
} else {
console.log(seconds.value + "秒");
XTSignCheckNotify({
signJobId: signJobId.value,
notifyType: 'bind'
}).then(res => {
if (res.msg != '暂未回调') {
//
clearInterval(timer);
if(res.status){
dialogVisible.value=false
ElMessageBox.prompt('扫码成功,请输入登录密码,验证绑定', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
inputType:'password'
})
.then(({ value }) => {
console.log(value)
clearInterval(timer);
if (res.status) {
dialogVisible.value = false
ElMessageBox.prompt('扫码成功,请输入登录密码,验证绑定', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
inputType: 'password'
})
.then(({
value
}) => {
console.log(value)
XTbind(value)
})
.catch(() => {
})
}else{
ElMessage.error(res.msg)
erweimaErrMsg.value=res.msg
seconds.value=0
}
})
.catch(() => {
})
} else {
ElMessage.error(res.msg)
erweimaErrMsg.value = res.msg
seconds.value = 0
}
}
})
seconds.value=seconds.value-pinlv;
}
seconds.value = seconds.value - pinlv;
}
}
//userid
const XTbind=(pwd)=>{
XTSignBindUser({signJobId:signJobId.value,pwd:pwd}).then(res=>{
if(res.status){
const XTbind = (pwd) => {
XTSignBindUser({
signJobId: signJobId.value,
pwd: pwd
}).then(res => {
if (res.status) {
ElMessageBox.alert('绑定成功', '提示', {
// if you want to disable its autofocus
// autofocus: false,
confirmButtonText: 'OK',
callback: () => {
// if you want to disable its autofocus
// autofocus: false,
confirmButtonText: 'OK',
callback: () => {
getUserBaseInfo()
},
})
}else{
},
})
} else {
ElMessage.error(res.msg)
}
})
}
//Ukey---------------------------------------------------------------------------------------------
let ukey_show=ref(false);
let ZhengShuList = ref('');
let selectedZhengShuId = ref(''); //id
let ZhengShuSfid = ref('');
const Ukeybind = () => {
ukey_show.value=true
console.log('获取证书版本号 SOF_GetVersion', xtxsync.SOF_GetVersion()) //
let list = xtxsync.SOF_GetUserList()
console.log('证书列表 SOF_GetVersion', list) //
const arr = list.split('&&&').slice(0, -1);
ZhengShuList.value = arr.map(item => {
const [name, value] = item.split('||');
return {
name,
value
};
});
}
const Ukeybind_submit = () => {
console.log(selectedZhengShuId.value);
//
var zhengshu = xtxsync.GetSignCert(selectedZhengShuId.value);
//
ZhengShuSfid.value = xtxsync.GetCertEntity(zhengshu)
if (ZhengShuSfid.value.length > 1) {
ElMessageBox.prompt('请输入登录密码,验证绑定', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
inputType: 'password'
})
.then(({
value
}) => {
console.log(value)
UkeyBindUser({
sfid: ZhengShuSfid.value,
pwd: value
}).then(res => {
if (res.status) {
ElMessageBox.alert('绑定成功', '提示', {
confirmButtonText: 'OK',
callback: () => {
ukey_show.value=false
getUserBaseInfo()
},
})
} else {
ElMessage.error(res.msg)
}
})
})
.catch(() => {
})
}
}
</script>
<style scoped>
.erweima_tu {
height: 310px;
margin-left: auto;
margin-right: auto;
margin-bottom: 20px;
text-align: center;
color: coral;
}
.timeout{
.timeout {
margin-top: 20%;
text-align: center;
color: coral;
cursor:pointer;
cursor: pointer;
}
.saoma_tishi{
color: #7cba74;
padding-top: 20%;
font-size: 20px;
.saoma_tishi {
color: #7cba74;
padding-top: 20%;
font-size: 20px;
}
</style>

@ -1,4 +1,5 @@
ENV = 'development'
VITE_APP_API = '/api/'
VITE_APP_WXCODE_URL = 'http://192.168.31.106/wxLogin/development'
VITE_APP_FILE_URL= 'http://localhostcommon'
VITE_APPID = "wx526430047d34c85c"

@ -1,4 +1,5 @@
ENV = 'production'
VITE_APP_API = 'https://www.yanzai.vip/common/laravel/public/api/'
VITE_APP_WXCODE_URL = 'http://www.yanzai.vip/common/laravel/public/wxLogin/production'
VITE_APP_FILE_URL= 'http://www.yanzai.vip/common/laravel/public/'
VITE_APPID = "wx526430047d34c85c"

@ -13,8 +13,7 @@
"pinia": "^2.1.6",
"vant": "^4.7.0",
"vue": "^3.3.4",
"vue-router": "^4.2.4",
"weixin-js-sdk": "^1.6.3"
"vue-router": "^4.2.4"
},
"devDependencies": {
"@rushstack/eslint-patch": "^1.3.3",
@ -3622,11 +3621,6 @@
"integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==",
"optional": true
},
"node_modules/weixin-js-sdk": {
"version": "1.6.3",
"resolved": "https://registry.npmjs.org/weixin-js-sdk/-/weixin-js-sdk-1.6.3.tgz",
"integrity": "sha512-5jYNtVcxWmgHNqCLSPoX6vXab9G4RPDZx0klX8IsVwGjDTwx/UDmgfF7fkRMGguRpuFv0O7tk1jb+Oay2QiV1w=="
},
"node_modules/whatwg-url": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
@ -6069,11 +6063,6 @@
"integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==",
"optional": true
},
"weixin-js-sdk": {
"version": "1.6.3",
"resolved": "https://registry.npmjs.org/weixin-js-sdk/-/weixin-js-sdk-1.6.3.tgz",
"integrity": "sha512-5jYNtVcxWmgHNqCLSPoX6vXab9G4RPDZx0klX8IsVwGjDTwx/UDmgfF7fkRMGguRpuFv0O7tk1jb+Oay2QiV1w=="
},
"whatwg-url": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",

@ -15,8 +15,7 @@
"pinia": "^2.1.6",
"vant": "^4.7.0",
"vue": "^3.3.4",
"vue-router": "^4.2.4",
"weixin-js-sdk": "^1.6.3"
"vue-router": "^4.2.4"
},
"devDependencies": {
"@rushstack/eslint-patch": "^1.3.3",

@ -28,4 +28,9 @@ export const StartYuYue = (data) => {
//上传图片
export const UpFile = (data) => {
return axios({url:import.meta.env.VITE_APP_API+'v1/mH5/UpFile',data:data})
}
//获取体检报告详情
export const GetPersonReportDetail = (data) => {
return axios({url:import.meta.env.VITE_APP_API+'v1/mH5/GetPersonReportDetail',data:data})
}

@ -25,7 +25,7 @@
sessionStorage.setItem('token', res.token);
sessionStorage.setItem('refreshToken', res.refresh_token);
var token = sessionStorage.getItem('token');
if (token == res.token) {
if (token == res.token){
if(res.isRegister){
//
// window.location.href="./#/selectOrganization"
@ -35,7 +35,6 @@
//window.location.href="./#/register"
router.replace('/register')
}
}else{
showToast('查询存储信息失败');
}

@ -1,18 +1,22 @@
<template>
<div>
<img
style="width: 100%;"
src="../assets/report.png"
/>
</div>
</template>
<script setup>
import { ref, onMounted } from 'vue';
import { useRoute,useRouter } from "vue-router"
const route = useRoute()
const router = useRouter()
let tijian_file =import.meta.env.VITE_APP_FILE_URL+ route.query.tijian_num //
console.log(tijian_file)
onMounted(()=>{
window.location.href=tijian_file
})
</script>

@ -1,17 +1,19 @@
<template>
<div class="showreport">
<div class="showreport" v-if="reportinfo !=''">
<LoadingD :status="loading"></LoadingD>
<div class="top">
<van-row class="title">
<van-col span="6">姓名</van-col>
<van-col span="18">张三</van-col>
<van-col span="18">{{reportinfo.name}}</van-col>
</van-row>
<van-row class="title">
<van-col span="6">性别</van-col>
<van-col span="18"></van-col>
<van-col span="18" v-if="reportinfo.sex==0"></van-col>
<van-col span="18" v-if="reportinfo.sex==1"></van-col>
</van-row>
<van-row class="title">
<van-col span="6">身份证</van-col>
<van-col span="18">131122115511555111</van-col>
<van-col span="18">{{reportinfo.id_card_num}}</van-col>
</van-row>
<van-row class="button">
<van-col span="12"><RouterLink to="/healthCertificate"><van-button size="small" plain>查看健康证</van-button></RouterLink></van-col>
@ -25,21 +27,27 @@
<van-col span="16">项目</van-col>
<van-col span="4">结果</van-col>
</van-row>
<van-row v-for="(item, index) in list" :key="index" class="list">
<van-col v-if="item.value == '无'" span="4"><van-icon name="checked" color="#4dde79" size="20px" /></van-col>
<van-col v-if="item.value == '有'" span="4"><van-icon name="warning" color="#de554d" size="20px" /></van-col>
<van-col span="16">{{ item.name }}</van-col>
<van-col v-if="item.value == '无'" span="4"><span style="color: #ccc;"></span></van-col>
<van-col v-if="item.value == '有'" span="4"></van-col>
<van-row v-for="(item, index) in reportinfo.items" :key="index" class="list">
<van-col v-if="item.flag == '' || item.flag == null" span="4"><van-icon name="checked" color="#4dde79" size="20px" /></van-col>
<van-col v-else span="4"><van-icon name="warning" color="#de554d" size="20px" /></van-col>
<van-col span="16">{{ item.item_name }}</van-col>
<van-col v-if="item.flag == '' || item.flag == null" span="4"><span style="color: #ccc;"></span></van-col>
<van-col v-else span="4">{{item.item_result}}</van-col>
</van-row>
</div>
</div>
</template>
<script setup>
import { ref, onMounted } from 'vue';
import { RouterLink ,useRouter} from 'vue-router';
import { GetPersonReportDetail} from "@/api/api.js";
import {
showToast,
showDialog
} from 'vant';
const router = useRouter();
let loading=ref(false)
let list = [
{
name: "细菌性痢疾",
@ -75,10 +83,42 @@ let list = [
},
]
document.title='报告查询'
let reportinfo=ref('')
const getDetail=()=>{
loading.value=true
GetPersonReportDetail({tijian_num:'34567'}).then(res => {
loading.value=false
if (res.status) {
reportinfo.value=res.data.info
} else {
showToast(res.msg);
}
})
}
//
const previewReport=()=>{
router.push('/previewReport')
console.log(reportinfo.value)
if(reportinfo.value.report_file !=undefined && reportinfo.value.report_file.length>2){
//router.push('/previewReport?tijian_num='+reportinfo.value.report_file)
window.location.href=import.meta.env.VITE_APP_FILE_URL+ reportinfo.value.report_file
}else{
showDialog({
title: '通知',
message: "暂无报告可查询",
messageAlign: 'left',
confirmButtonText: '好的',
theme: 'round-button',
confirmButtonColor: "#33cdc9"
}).then(() => {
});
}
}
onMounted(()=>{
getDetail()
})
</script>
<style scoped >
.showreport {

Loading…
Cancel
Save