main
yanzai 1 year ago
parent 74193c2c82
commit 4b071b33b9

@ -127,7 +127,7 @@ class HealthCheckupController extends Controller
"type"=>$type,
"institution_id"=>$org_id->id,
"tijian_num"=>$tijian_num,
"pdfs"=>isset($pdfs)?json_encode($pdfs):'',
"pdfs"=>isset($pdfs)?json_encode($pdfs,JSON_UNESCAPED_UNICODE):'',
'hmac'=>$Hmac['data'],
]);
if($i){

@ -28,13 +28,18 @@ class PersonController extends Controller
//获取用户体检详情和pdf
public function GetPersonReportDetail(){
$sfz =request('sfz');
$type =request('type');
//HSM加密
$HSM_sfz =\App\Lib\HSM::HsmEncrypt($sfz);
if($HSM_sfz['status']!=true){
return \Yz::echoError1('调用HSM加密失败');
}
$sfz=$HSM_sfz['data'];
$info=DB::table('examination_records')->where(['id_card_num'=>$sfz,'is_del'=>0]) ->orderBy('id', 'desc')->first();
$info=DB::table('examination_records')->where(['id_card_num'=>$sfz,'is_del'=>0]);
if(isset($type)){
$info=$info->where('type',$type);
}
$info=$info ->orderBy('id', 'desc')->first();
if($info){
$info->pdfs=count(json_decode($info->pdfs, true));
$item=DB::table('report_result_item')
@ -50,7 +55,6 @@ class PersonController extends Controller
$info->id_card_num=$HSM_sfz['data'];
}
return \Yz::Return(true,'',['info'=>$info]);
}else{
return \Yz::echoError1('未找到相关体检信息');
@ -161,4 +165,37 @@ class PersonController extends Controller
}
//H5用户获取自己的 本年度 预约记录详情 2024-07-18 23:35
//获取从h5自助预约的信息
public function H5GetAppointmentRecord(Request $request)
{
date_default_timezone_set('PRC');
$currentYear = date('Y');
$firstDay = date('Y-01-01', strtotime($currentYear));
$lastDay = date('Y-12-31', strtotime($currentYear));
$openid = $request->get('userid');//中间件产生的参数
$sfz =request('sfz');
$HSM=\App\Lib\HSM::HsmEncrypt($sfz);
if($HSM['status']!=true){
return \Yz::echoError1('调用HSM加密失败');
}
$sfz=$HSM['data'];
if(isset($sfz)){
$info=DB::table('appointment_record as a')
->select('a.name','a.id_card_num','a.date','a.time','a.type','a.doc_type_name','a.created_at','b.org_name')
->join('medical_institution as b','a.org_code','=','b.sn')
->where(['a.id_card_num'=>$sfz,'a.is_del'=>0])->whereNull('a.source')
->whereBetween('a.created_at',[$firstDay,$lastDay])->orderBy('a.id','desc')->first();
if(!!$info){
$info->id_card_num=request('sfz');
}
return \Yz::Return(true,'查完完成',$info);
}
}
}

@ -179,6 +179,9 @@ class HealthCheckupService
}
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);
foreach ($query as $key=>$item){
$item->psfds=json_decode($item->pdfs,true);
}
$count=DB::select("select count(*) as c from examination_records as a ".$sql,$canshu);
return \Yz::Return(true,'',['list'=>$query,'count'=>$count[0]->c]);

@ -78,7 +78,7 @@ Route::group(['middleware'=>['checktoken','log'],'prefix'=>'v1/mH5'],function ()
Route::post('GetPersonReportDetail','App\Http\Controllers\API\mH5\PersonController@GetPersonReportDetail');//获取用户pdf
Route::post('GetIndustryList','App\Http\Controllers\API\mH5\IndustryController@GetIndustry');
Route::post('GetPersonPdfDetailByLink','App\Http\Controllers\API\mH5\PersonController@GetPersonPdfDetailByLink');//根据链接获取体检那边的pdf
Route::post('H5GetAppointmentRecord','App\Http\Controllers\API\mH5\PersonController@H5GetAppointmentRecord'); //获取自己的预约记录
});

@ -67,3 +67,7 @@ export const GetPersonPdfDetailByLink = (data) => {
export const GetConfigInArray = (data) => {
return axios({url:import.meta.env.VITE_APP_API+'GetConfigInArray',data:data})
}
//获取自己的预约记录
export const H5GetAppointmentRecord = (data) => {
return axios({url:import.meta.env.VITE_APP_API+'v1/mH5/H5GetAppointmentRecord',data:data})
}

@ -1,7 +1,7 @@
<template>
<div v-if="status==true" class="c_loading">
<van-row class="loading" v-if="status==true">
<van-col span="24" style="text-align: center;"><van-loading color="#33cdc9" >加载中...</van-loading></van-col>
<van-col span="24" style="text-align: center;"><van-loading color="#238f8b" size="64px" >加载中...</van-loading></van-col>
</van-row>
</div>
@ -9,7 +9,6 @@
</template>
<script setup>
import { defineProps } from 'vue';
defineProps({status:false});
console.log(status)
</script>

@ -68,6 +68,10 @@ const router = createRouter({
path: '/personReportLogin',
name: 'PersonReportLogin',
component: () => import('../views/PersonReportLogin.vue')
},{
path: '/myappointment',
name: 'MyAppointment',
component: () => import('../views/MyAppointment.vue')
}]
})

@ -1,29 +1,74 @@
<template>
<div class="LoginMain">
<LoadingD :status="dloading"></LoadingD>
<van-button class="button" round type="default" icon="todo-list-o" :loading="loading" @click="gotoYuyue">{{buttonText}}</van-button>
<div class="top" style="margin-top: -90px;">
<div class="biaoti"><van-icon name="todo-list-o" size="22" />体检预约</div>
<div class="button_group">
<div class="button_new" @click="gotoYuyue" v-if="JianKangZhengEnable==1">
<div>健康证明</div>
<div style="font-size: 12px;color: #277d7b;">预约健康证体检</div>
</div>
<div class="button_new" v-if="LaoNianRenEnable==1">
<div> 65岁以上老年人</div>
<div style="font-size: 12px;color: #277d7b;">老年人体检预约</div>
</div>
<div class="button_new" v-if="JianKangTiJianEnable==1">
<div>健康体检</div>
<div style="font-size: 12px;color: #277d7b;">健康体检预约</div>
</div>
<div class="button_new" style="background-color: #277d7b;" @click=" router.push('/myappointment')">
<div><van-icon name="todo-list-o" size="16" style="margin-right: 4px;" />预约记录</div>
<div style="font-size: 12px;color: #7dbfbe;"> 预约登记记录</div>
</div>
</div>
</div>
<div class="top">
<div class="biaoti"><van-icon name="newspaper-o" size="22" />报告查询</div>
<div class="button_group">
<div class="button_new2" @click="gotoReport(1)" v-if="JianKangZhengEnable_baogao==1">
<div>健康证明查询</div>
<div style="font-size: 12px;color: #c3805f;">健康证明查询</div>
</div>
<div class="button_new2" @click="gotoReport(2)" v-if="LaoNianRenEnable_baogao==1">
<div> 65岁以上老年人体检报告</div>
<div style="font-size: 12px;color: #c3805f;">老年人体检报告查询</div>
</div>
<div class="button_new2" v-if="JianKangTiJianEnable_baogao==1">
<div>健康体检报告</div>
<div style="font-size: 12px;color: #c3805f;">健康体检报告查询</div>
</div>
</div>
</div>
<!-- <van-button class="button" round type="default" icon="todo-list-o" :loading="loading" @click="gotoYuyue">{{buttonText}}</van-button>
<van-button class="button2" round type="warning" icon="newspaper-o" :loading="loading" @click="gotoReport"></van-button>
-->
</div>
</template>
<script setup>
import {
AppLogin,AppGetUserInfo,mH5Register,GetConfigInArray
AppLogin,
AppGetUserInfo,
mH5Register,
GetConfigInArray
} from "@/api/api.js";
import {
ref,
onMounted,onActivated
onMounted,
onActivated
} from 'vue';
import {
useRoute,
useRouter
} from "vue-router"
import { showToast } from 'vant';
import {
showToast
} from 'vant';
const route = useRoute()
const router = useRouter();
let openid =''
let openid = ''
const login = () => {
if( !sessionStorage.getItem('sfz')) {
if (!sessionStorage.getItem('sfz')) {
showToast('查询用户信息出错!');
return false
}
@ -37,19 +82,19 @@
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){
if (res.isRegister) {
//
// router.push('/selectOrganization')
}else{
} else {
//
Reg()
}
}else{
} else {
showToast('查询存储信息失败');
}
}else{
} else {
showToast(res.msg);
}
})
@ -60,44 +105,45 @@
let buttonText = ref('开始预约')
const gotoYuyue=()=>{
if(JianKangZhengEnable.value !=1){
const gotoYuyue = () => {
if (JianKangZhengEnable.value != 1) {
showToast('暂未开放健康证预约');
return false;
}
if( sessionStorage.getItem('sfz')){
if (sessionStorage.getItem('sfz')) {
router.push('/selectOrganization')
}else{
} else {
showToast('查询用户信息出错!');
}
}
const gotoReport=()=>{
if( sessionStorage.getItem('sfz')){
router.push('/showReport')
}else{
const gotoReport = (type) => {
let p = '?type=' + type
if (sessionStorage.getItem('sfz')) {
router.push('/showReport' + p)
} else {
showToast('查询用户信息出错!');
}
}
let dloading=ref(false)
const AppGetUserinfoAction=()=>{ //APP
dloading.value=true
let dloading = ref(false)
const AppGetUserinfoAction = () => { //APP
dloading.value = true
AppGetUserInfo({
userId: openid
}).then(res => {
dloading.value=false
dloading.value = false
console.log(res)
if (res.status) {
let info=res.data
if(info[0] !=undefined){
let info = res.data
if (info[0] != undefined) {
sessionStorage.setItem('sfz', info[0].idcardno);
sessionStorage.setItem('name', info[0].xm);
sessionStorage.setItem('tel', info[0].sj);
sessionStorage.setItem('sex', info[0].xb);
login()
}else{
} else {
showToast('查询用户信息出错!');
}
}else{
} else {
showToast(res.msg);
}
})
@ -105,17 +151,17 @@
//
const Reg = () => {
let info={
let info = {
name: sessionStorage.getItem('name'),
sex: sessionStorage.getItem('sex'),
tel: sessionStorage.getItem('tel'),
sfz: sessionStorage.getItem('sfz'),
}
loading.value=true
loading.value = true
mH5Register({
info: info
}).then(res => {
loading.value=false
loading.value = false
if (res.status == true) {
// showDialog({
// title: '',
@ -130,28 +176,53 @@
}
})
}
let configInfo=ref(null);
let LaoNianRenEnable=ref(0);
let JianKangZhengEnable=ref(0);
let configInfo = ref(null);
let LaoNianRenEnable = ref(0);
let JianKangZhengEnable = ref(0);
let JianKangTiJianEnable = ref(0);
let LaoNianRenEnable_baogao = ref(0);
let JianKangZhengEnable_baogao = ref(0);
let JianKangTiJianEnable_baogao = ref(0);
//
const GetConfigInArrayFunc=()=>{
const GetConfigInArrayFunc = () => {
GetConfigInArray({
labels: ['是否开启H5老年人','是否开启H5健康证']
labels: ['是否开启H5老年人', '是否开启H5健康证', '是否开启H5健康体检', '是否开启H5老年人报告查询', '是否开启H5健康证明查询', '是否开启H5健康体检报告查询']
}).then(res => {
loading.value=false
loading.value = false
if (res.status) {
configInfo.value=res.data
configInfo.value.forEach(function(v,i){
if(v.label=='是否开启H5老年人'){
if(v.value==1){
LaoNianRenEnable.value=1
configInfo.value = res.data
configInfo.value.forEach(function(v, i) {
if (v.label == '是否开启H5老年人') {
if (v.value == 1) {
LaoNianRenEnable.value = 1
}
}
if (v.label == '是否开启H5健康证') {
if (v.value == 1) {
JianKangZhengEnable.value = 1
}
}
if(v.label=='是否开启H5健康证'){
if(v.value==1){
JianKangZhengEnable.value=1
if (v.label == '是否开启H5健康体检') {
if (v.value == 1) {
JianKangTiJianEnable.value = 1
}
}
if (v.label == '是否开启H5老年人报告查询') {
if (v.value == 1) {
LaoNianRenEnable_baogao.value = 1
}
}
if (v.label == '是否开启H5健康证明查询') {
if (v.value == 1) {
JianKangZhengEnable_baogao.value = 1
}
}
if (v.label == '是否开启H5健康体检报告查询') {
if (v.value == 1) {
JianKangTiJianEnable_baogao.value = 1
}
}
})
} else {
showToast(res.msg);
@ -159,15 +230,16 @@
})
}
onMounted(() => {
openid= route.query.userId
openid = route.query.userId
//AppGetUserinfoAction()
tiaoGuoAppYanzheng();
GetConfigInArrayFunc();
console.log(openid);
})
// app
const tiaoGuoAppYanzheng=()=>{
sessionStorage.setItem('sfz', "13030219880808587X");
const tiaoGuoAppYanzheng = () => {
//sessionStorage.setItem('sfz', "130302199910001112");
sessionStorage.setItem('sfz', "110224195909090061");
sessionStorage.setItem('name', '测试');
sessionStorage.setItem('tel', "13333356789");
sessionStorage.setItem('sex', 1);
@ -182,12 +254,58 @@
justify-content: center;
flex-direction: column;
height: 100vh;
background-image: url('../assets/image/login.jpg');
/* background-image: url('../assets/image/login.jpg'); */
background-size: 100%;
background-repeat: no-repeat;
background-color: #afeefd;
background-position: top center;
padding: 10px;
}
.top {
width: 100%;
padding: 20px;
background-color: rgba(255, 255, 255, 0.5);
margin-top: 10px;
border-radius: 10px;
}
.biaoti {
font-size: 18px;
margin-bottom: 10px;
color: #43ae9c;
font-weight: 700;
}
.button_group {
display: flex;
width: 100%;
justify-content: space-between;
flex-wrap: wrap;
}
.button_new {
background-color: #33cdc9;
border: 3px solid #fff;
padding: 10px;
font-size: 16px;
border-radius: 10px;
width: 48%;
margin-bottom: 20px;
color: #fff;
}
.button_new2 {
background-color: #ffaa7f;
border: 3px solid #fff;
padding: 10px;
font-size: 16px;
border-radius: 10px;
width: 48%;
margin-bottom: 20px;
color: #fff;
}
.button {
@ -197,6 +315,7 @@
color: #fff;
border: 3px solid #e6f5fd;
}
.button2 {
width: 60%;
margin-top: 20px;

@ -0,0 +1,120 @@
<template>
<div class="Myappointment">
<div class="info">
<div style="font-size: 18px; font-weight: 700;margin-bottom: 10px;margin-top: 10px; color:#33cdc9">我的预约记录
</div>
<table v-if="Info">
<tr>
<td>姓名</td>
<td>{{Info.name}}</td>
</tr>
<tr>
<td>身份证</td>
<td>{{Info.id_card_num}}</td>
</tr>
<tr>
<td>预约类型</td>
<td><span v-if="Info.type==1"></span><span v-if="Info.type==2">65</span></td>
</tr>
<tr>
<td>预约机构</td>
<td>{{Info.org_name}}</td>
</tr>
<tr>
<td>预约时间</td>
<td>{{Info.date.substr(0,10)}} {{Info.time}}</td>
</tr>
<tr>
<td>记录时间</td>
<td>{{Info.created_at}}</td>
</tr>
</table>
<van-empty v-else description="暂无记录" />
<van-button class="button" round type="default" icon="todo-list-o" @click="router.go(-1)"></van-button>
</div>
</div>
</template>
<script setup>
import {
ref,
onMounted
} from 'vue';
import {
useRoute,
useRouter
} from "vue-router"
import {
H5GetAppointmentRecord
} from "@/api/api.js";
import {
showToast
} from 'vant';
const route = useRoute()
const router = useRouter();
let loading = ref(false)
let Info =ref('');
const GetInfo=()=>{
let sfz = sessionStorage.getItem('sfz');
H5GetAppointmentRecord({sfz:sfz}).then(res => {
if(res.status){
Info.value=res.data
}
})
}
onMounted(()=>{
GetInfo()
})
</script>
<style scoped>
.Myappointment {
background-color: #afeefd;
height: 100vh;
padding: 8px;
}
.info {
position: relative;
/* border: 1px solid red; */
border-radius: 10px;
background-color: #fff;
padding: 20px 20px;
}
table {
border: 1px solid #ddd;
border-collapse: collapse;
width: 100%;
}
td {
border: 1px solid #ddd;
padding: 8px;
}
tr td:first-child {
width: 40%;
font-weight: 700;
padding-left: 30px;
}
tr td:last-child {
width: 60%;
}
.button {
width: 100%;
margin-top: 40px;
background-color: #33cdc9;
color: #fff;
border: 3px solid #e6f5fd;
}
</style>

@ -1,8 +1,8 @@
<template>
<div >
<div>
<LoadingD :status="loading"></LoadingD>
<div class="showreport" v-if="reportinfo !=''">
<div class="top" >
<div class="top">
<van-row class="title">
<van-col span="6">姓名</van-col>
<van-col span="18">{{reportinfo.name}}</van-col>
@ -18,21 +18,23 @@
</van-row>
<van-row class="button">
<!-- <van-col span="12"><van-button @click="gotoHealthCertificate" size="small" plain>查看健康证</van-button></van-col> -->
<van-col span="24"><van-button size="small" @click="previewReport" plain>查看报告</van-button></van-col>
<van-col span="24"><van-button @click="previewReport" plain>查看报告</van-button></van-col>
</van-row>
<div class="title1">北京市从业人员体检结果</div>
<div class="title1">{{title}}</div>
</div>
<div class="bottom">
<div class="bottom" v-if="reportinfo.items.length>0">
<van-row style="margin-top: 20px;color: #9e9e9e;">
<van-col span="4"></van-col>
<van-col span="16">项目</van-col>
<van-col span="4">结果</van-col>
</van-row>
<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-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-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>
@ -40,26 +42,33 @@
</div>
<van-popup v-model:show="showPicker" round position="bottom">
<van-picker
:columns="columns"
@cancel="showPicker = false"
@confirm="selectPDF"
/>
<van-picker :columns="columns" @cancel="showPicker = false" @confirm="selectPDF" />
</van-popup>
</div>
</template>
<script setup>
import { ref, onMounted } from 'vue';
import { RouterLink ,useRouter} from 'vue-router';
import { GetPersonReportDetail} from "@/api/api.js";
import {
ref,
onMounted
} from 'vue';
import {
RouterLink,
useRouter,
useRoute,
} from 'vue-router';
import {
GetPersonReportDetail
} from "@/api/api.js";
import {
showToast,
showDialog
} from 'vant';
const router = useRouter();
let loading=ref(false)
let list = [
{
const route = useRoute()
const router = useRouter();
let type=route.query.type
let loading = ref(false)
let title=ref("");
let list = [{
name: "细菌性痢疾",
value: "无"
}, {
@ -91,21 +100,33 @@ let list = [
name: "手部的银屑病或者鳞屑",
value: "无"
},
]
document.title='报告查询'
let reportinfo=ref('')
const getDetail=()=>{
let sfz=sessionStorage.getItem('sfz');
loading.value=true
GetPersonReportDetail({sfz:sfz}).then(res => {
loading.value=false
]
document.title = '报告查询'
let reportinfo = ref('')
const getDetail = () => {
let sfz = sessionStorage.getItem('sfz');
loading.value = true
GetPersonReportDetail({
sfz: sfz,
type:type
}).then(res => {
loading.value = false
if (res.status) {
reportinfo.value=res.data.info
for(var i=0;i<reportinfo.value.pdfs;i++){
let ii=0;
ii=i+1;
reportinfo.value = res.data.info
if(reportinfo.value.type==1){
title.value="北京市从业人员体检结果"
}
if(reportinfo.value.type==2){
title.value="老年人体检报告查询"
}
for (var i = 0; i < reportinfo.value.pdfs; i++) {
let ii = 0;
ii = i + 1;
console.log(999)
columns.value.push({text:'报告'+ii,value:i});
columns.value.push({
text: '报告' + ii,
value: i
});
}
console.log(columns.value);
@ -114,9 +135,9 @@ const getDetail=()=>{
}
})
}
//
const previewReport=()=>{
}
//
const previewReport = () => {
// 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
@ -132,11 +153,11 @@ const previewReport=()=>{
// });
// }
if(reportinfo.value.pdfs>0){
showPicker.value=true;
if (reportinfo.value.pdfs > 0) {
showPicker.value = true;
}else{
} else {
showDialog({
title: '通知',
message: "暂无报告可查询",
@ -148,34 +169,36 @@ const previewReport=()=>{
});
}
}
const gotoHealthCertificate=()=>{
if(reportinfo.value.result_status==1){
}
const gotoHealthCertificate = () => {
if (reportinfo.value.result_status == 1) {
router.push('/healthCertificate')
}else{
} else {
showToast('暂无对应此次体检结果的健康证');
}
}
let showPicker=ref(false);
let columns = ref([])
const selectPDF=({ selectedOptions })=>{
}
let showPicker = ref(false);
let columns = ref([])
const selectPDF = ({
selectedOptions
}) => {
showPicker.value = false;
console.log(selectedOptions[0].value) ;
console.log(selectedOptions[0].value);
router.push('/previewReport?recordid='+reportinfo.value.id+'&pdf_num='+selectedOptions[0].value)
}
onMounted(()=>{
router.push('/previewReport?recordid=' + reportinfo.value.id + '&pdf_num=' + selectedOptions[0].value)
}
onMounted(() => {
getDetail()
})
})
</script>
<style scoped >
.showreport {
<style scoped>
.showreport {
height: 100vh;
background: radial-gradient(circle at top center, #33cdc9 30%, #e3e3e3, transparent 2%);
padding-top: 20px;
}
}
.title1 {
.title1 {
text-align: center;
font-size: 18px;
background-color: #fff;
@ -186,9 +209,9 @@ onMounted(()=>{
transform: translateY(20px);
white-space: nowrap;
}
}
.top {
.top {
color: #ffffff;
background-color: #33cdc9;
border: 1px solid #fff;
@ -197,8 +220,9 @@ onMounted(()=>{
padding: 20px 20px 0px 20px;
}
.top .button {
}
.top .button {
margin-top: 10px;
}
@ -226,13 +250,14 @@ onMounted(()=>{
}
.bottom {
.bottom {
background-color: #fff;
padding: 20px;
}
.bottom .list {
}
.bottom .list {
margin-top: 10px;
padding-bottom: 10px;
border-bottom: 1px dotted #ddd;

Loading…
Cancel
Save