导出体检时间报表

main
yanzai 1 year ago
parent 155d6605e5
commit 39294f809e

@ -2,9 +2,15 @@
namespace App\Http\Controllers\H5;
use App\Http\Controllers\API\PEISApiController;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Http\Controllers\API\H5\FenzhenController as fzc;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Str;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
use PhpOffice\PhpSpreadsheet\IOFactory;
class FenzhenController extends Controller
{
@ -64,4 +70,117 @@ class FenzhenController extends Controller
'queue' => $queue
]);
}
public function export(){
$fzc = new fzc();
$date=request('date');
$res = $fzc->fz('export', [
'date' => $date
]);
$table_list=$res['data']['table1'];
$clinic_list=$res['data']['table2'];
$table_list3=$res['data']['table3'];
// dd(json_encode($table_list3,JSON_UNESCAPED_UNICODE));
$template_path = Storage::path('public/excel/check_time.xlsx');
$spreadsheet = IOFactory::load($template_path);
$worksheet = $spreadsheet->getActiveSheet();
$styleArray = [
'borders' => [
'allBorders' => [
'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN,
'color' => ['argb' => 'FF000000'],
],
],
];
$row = 3;
$col = [
'A' => 'date',
'B' => 'name',
'C' => 'number',
'D' => 'phone',
'E' => 'group_name',
'F' => 'clinic',
'G' => 'doctor',
'H' => 'queue',
'I' => 'calling',
'J' => 'done',
'K' => 'clinic_check_time',
'L' => 'true_check_time',
'M' => 'timeout_check_time',
'N' => 'clinic_wait_time',
'O' => 'true_wait_time',
'P' => 'timeout_wait_time',
'Q' => 'clinic_all_time',
'R' => 'true_all_time',
'S' => 'timeout_all_time',
];
foreach ($table_list as $table_item) {
foreach ($col as $index => $key) {
$worksheet->setCellValueExplicit($index . $row, $table_item[$key], \PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_STRING);
}
$row++;
}
$worksheet->getStyle('A3:S' . ($row - 1))->applyFromArray($styleArray);
$row = 3;
$col = [
'U' => 'group_name',
'V' => 'clinic',
'W' => 'doctor',
'X' => 'check',
'Y' => 'check_out',
'Z' => 'wait',
'AA' => 'wait_out',
];
foreach ($clinic_list as $clinic_item) {
foreach ($col as $index => $key) {
$worksheet->setCellValueExplicit($index . $row, $clinic_item[$key], \PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_STRING);
}
$row++;
}
$worksheet->getStyle('U3:AA' . ($row - 1))->applyFromArray($styleArray);
$row = 3;
$col = [
'AC' => 'date',
'AD' => 'name',
'AE' => 'number',
'AF' => 'phone',
'AG' => 'combo',
'AH' => 'clinic_time',
'AI' => 'used_time',
'AJ' => 'timeout',
];
foreach ($table_list3 as $table_list3_i) {
$peis = new PEISApiController();
$data = [
'电话号码' => "",
'证件号码' => "",
'体检号' => $table_list3_i['uuid'],
'包含内部信息' => true
];
$reports = $peis::Post('体检报告查询', 1, $data);
if(isset($reports['data'][0]['套餐名称'])){
$table_list3_i['combo']=$reports['data'][0]['套餐名称'];
}else{
$table_list3_i['combo']='';
}
foreach ($col as $index => $key) {
$worksheet->setCellValueExplicit($index . $row, $table_list3_i[$key], \PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_STRING);
}
$row++;
}
$worksheet->getStyle('AC3:AJ' . ($row - 1))->applyFromArray($styleArray);
$file_name = Str::orderedUuid();
$dir_path = "public/excel/" . date('Ym') . '/' . $file_name;
Storage::makeDirectory($dir_path);
$name_date = date('n.j', strtotime($date . ' 00:00:00'));
$excel_path = $dir_path . "/体检报表-时间监控$name_date.xlsx";
$writer = new Xlsx($spreadsheet);
$writer->save(Storage::path($excel_path));
$url = Storage::url($excel_path);
return \Yz::Return(true,"获取成功",['url' => env('APP_URL').$url]);
}
}

@ -14,6 +14,7 @@
"laravel/framework": "^8.75",
"laravel/sanctum": "^2.11",
"laravel/tinker": "^2.5",
"phpoffice/phpspreadsheet": "^1.29",
"wechatpay/wechatpay": "^1.4",
"zoujingli/ip2region": "^2.0"
},

11999
Laravel/composer.lock generated

File diff suppressed because it is too large Load Diff

@ -100,3 +100,6 @@ Route::any('/UsePlan', 'App\Http\Controllers\API\Internal\PlanController@UsePlan
Route::any('/CancelUsePlan', 'App\Http\Controllers\API\Internal\PlanController@CancelUsePlan')->middleware('log');//取消占用号源
Route::post('/RoundPayCheck', 'App\Http\Controllers\API\H5\OrderController@RoundPayCheck');//轮询支付检查
Route::any('api/FenzhenInfoExport', 'App\Http\Controllers\H5\FenzhenController@export')->middleware('log');//导出报表

@ -425,4 +425,8 @@ export const ComboGetAllList = (data = {}) => {
//获取号源列表的列表
export const PlanListGetList = (data = {}) => {
return axios({ url: import.meta.env.VITE_APP_API + `v1/admin/PlanListGetList`, data: data })
}
//导出分诊数据
export const FenzhenInfoExport = (data = {}) => {
return axios({ url: import.meta.env.VITE_APP_API + `FenzhenInfoExport`, data: data })
}

@ -239,6 +239,13 @@ const router = createRouter({
meta: {
title: '代金券管理'
}
},{
path: '/reportforms/tijiantime',
name: 'ReportFormsTiJianTime',
component: () => import('../views/ReportForms/TiJianTime.vue'),
meta: {
title: '体检报表时间监控'
}
}]
},

@ -1,29 +1,6 @@
<template>
<div class="Dashboard">
<el-alert show-icon title="因未对接体检数据接口,以下数据均为演示.报表内容和类型可根据需求调整" type="warning" :closable="false" style="margin-bottom: 20px;"/>
<el-row class="row1" :gutter="20">
<el-col :span="12">
<div id="MonthCount" class="MonthCount"></div>
</el-col>
<el-col :span="12">
<div id="TypeCount" class="TypeCount"></div>
</el-col>
</el-row>
<el-row class="row2">
<el-col :span="24">
<div class="title">各体检机构体检量统计</div>
<el-table :data="tableData" style="width: 100%;" row-key="id">
<!-- <el-table-column prop="id" label="Id" width="100" /> -->
<el-table-column prop="name" label="机构名称" />
<el-table-column prop="count" label="数量" />
</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> -->
</el-col>
</el-row>
<div class="Dashboard" v-loading="loading">
</div>
</template>
@ -32,100 +9,18 @@
ref,
onMounted
} from 'vue'
import * as echarts from 'echarts';
import {
ElMessage,
ElMessageBox
} from 'element-plus'
import {
} from '@/api/api.js'
let loading = ref(false)
let tableData = ref([{
name:'医管中心',
count:'500'
},{
name:'亦庄医院',
count:'636'
},{
name:'采育卫生院',
count:'425'
},{
name:'西红门医院',
count:'266'
}])
let currentPage = ref(1) //
let pageSize = ref(15) //
let total = 0 //
const PageSizeChange = (e) => { //
pageSize.value = e
GetUserList()
}
const PageCurrentChange = (e) => { //
currentPage.value = e
GetUserList()
}
const GetList=()=>{
}
onMounted(()=>{
var ChartMonthCount = echarts.init(document.getElementById('MonthCount'));
//
ChartMonthCount.setOption({
title: {
text: '2023-01-01~2023-06-30体检数量统计'
},
tooltip: {},
xAxis: {
data: ['1月', '2月', '3月', '4月', '5月', '6月']
},
yAxis: {},
series: [
{
name: '数量',
type: 'bar',
data: [5, 20, 36, 10, 10, 20]
}
]
});
var ChartTypeCount = echarts.init(document.getElementById('TypeCount'));
ChartTypeCount.setOption(
{
title: {
text: '2023-01-01~2023-06-30体检行业分类统计'
},
tooltip: {
trigger: 'item'
},
legend: {
top: '5%',
left: 'center'
},
series: [
{
name: '数量',
type: 'pie',
radius: ['40%', '70%'],
avoidLabelOverlap: false,
label: {
show: false,
position: 'center'
},
emphasis: {
label: {
show: true,
fontSize: 40,
fontWeight: 'bold'
}
},
labelLine: {
show: false
},
data: [
{ value: 1048, name: '食品类' },
{ value: 735, name: '化妆品类' },
{ value: 580, name: '公共场所类' },
{ value: 484, name: '生活饮用水类' },
{ value: 300, name: '消毒产品生产类' }
]
}
]
})
})
@ -134,7 +29,7 @@
<style scoped>
.Dashboard{
padding: 20px;
display: none;
}
.MonthCount{
height: 400px;

@ -0,0 +1,59 @@
<template>
<div v-loading="loading">
<el-row>
<el-form-item>
<el-date-picker v-model="date" value-format="YYYY-MM-DD" type="date" placeholder="选择日期" />
</el-form-item>
</el-row>
<el-button type="success" @click="ExportFenZhenInfo()" style="margin-left: 10px;">导出体检报表时间监控</el-button>
</div>
</template>
<script setup>
import {
ref,
onMounted
} from 'vue'
import {
ElMessage,
ElMessageBox
} from 'element-plus'
import {
FenzhenInfoExport
} from '@/api/api.js'
let loading = ref(false)
let date = ref('');
const ExportFenZhenInfo = () => {
loading.value = true
FenzhenInfoExport({date:date.value}).then(res => {
loading.value = false
if (res.status) {
const a = document.createElement('a');
a.style.display = 'none';
a.href = res.data.url;
document.body.appendChild(a);
a.click();
// window.URL.revokeObjectURL(url);
} else {
ElMessage.error(res.msg)
}
})
}
const GetToday = () =>{
const today = new Date();
const year = today.getFullYear();
const month = String(today.getMonth() + 1).padStart(2, '0'); // 0
const day = String(today.getDate()).padStart(2, '0')
date.value=(`${year}-${month}-${day}`)
}
onMounted(() => {
GetToday()
})
</script>
<style>
</style>
Loading…
Cancel
Save