添加打印,并调整结算
parent
f3f97c64d7
commit
497b1fda08
|
|
@ -40,7 +40,6 @@ class ConstFlowController extends AdminController
|
|||
amisMake()->TableColumn('created_at', '办理时间')->type('datetime')->sortable(true),
|
||||
amisMake()->Operation()->label(__('admin.actions'))->buttons([
|
||||
$this->showFlow(),
|
||||
//打印票据
|
||||
]),
|
||||
]);
|
||||
|
||||
|
|
@ -68,8 +67,18 @@ class ConstFlowController extends AdminController
|
|||
$rows = [];
|
||||
$flow = $this->service->getDetail($id);
|
||||
$rows = $this->service->makeFeelist($flow);
|
||||
$page = amisMake()->table()->affixHeader(false)
|
||||
$page = amisMake()->CRUDTable()->affixHeader(false)
|
||||
->headerToolbar([
|
||||
'bulkActions',
|
||||
])
|
||||
->primaryField('ukey')
|
||||
->bulkActions([
|
||||
//打印明细
|
||||
amisMake()->Button()->label('打印预览')->actionType('url')->blank(true)
|
||||
->url(url('/print-const-flow').'?id=${id}&ukeys=${ids}')
|
||||
])
|
||||
->data([
|
||||
'id' => $id,
|
||||
'rows' => $rows
|
||||
])
|
||||
->title('')
|
||||
|
|
@ -78,10 +87,10 @@ class ConstFlowController extends AdminController
|
|||
->columns([
|
||||
amisMake()->TableColumn()->name('name')->label('名称'),
|
||||
amisMake()->TableColumn()->name('fee_name')->label('费用项'),
|
||||
amisMake()->TableColumn()->name('fee_value')->label('费用'),
|
||||
amisMake()->TableColumn()->name('fee_value')->label('费用')
|
||||
])->affixRow([
|
||||
amis('text')->text('合计')->colSpan(2),
|
||||
amis('tpl')->tpl('${SUM(ARRAYMAP(rows, item => item.fee_value))}')
|
||||
// amis('text')->text('合计')->colSpan(2),
|
||||
// amis('tpl')->tpl('${SUM(ARRAYMAP(rows, item => item.fee_value))}')
|
||||
]);
|
||||
return $this->response()->success($page);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -102,11 +102,11 @@ class LiveExitController extends AdminController
|
|||
]),
|
||||
|
||||
amisMake()->FieldSetControl()->className('mt-10')->title('附加项')->collapsable(true)->body([
|
||||
amisMake()->ComboControl('del_extends','收费项')->multiple(true)->items([
|
||||
amisMake()->ComboControl('add_extends','收费项')->multiple(true)->items([
|
||||
amisMake()->TextControl('name', '名称'),
|
||||
Components::make()->decimalControl('fee', '金额')
|
||||
]),
|
||||
amisMake()->ComboControl('add_extends','抵扣项')->multiple(true)->items([
|
||||
amisMake()->ComboControl('del_extends','抵扣项')->multiple(true)->items([
|
||||
amisMake()->TextControl('name', '名称'),
|
||||
Components::make()->decimalControl('fee', '金额')
|
||||
]),
|
||||
|
|
|
|||
|
|
@ -254,6 +254,7 @@ class OldmenController extends AdminController
|
|||
if($oldMan){
|
||||
$flowList = ConstFlow::where('oldman_id', $oldMan->id)
|
||||
->whereIn('const_type', [ConstFlow::TYPE_IN, ConstFlow::TYPE_CONTINUE])
|
||||
->where('state', 0)
|
||||
->whereBetween('start_at', [$oldMan->live_in_at, $oldMan->avliable_at])//开始时间在用户这段时间内的清单
|
||||
->get();
|
||||
$tableList = [];
|
||||
|
|
|
|||
|
|
@ -1 +1,2 @@
|
|||
<?php
|
||||
use Slowlyo\OwlAdmin\Admin;
|
||||
|
|
|
|||
|
|
@ -0,0 +1,110 @@
|
|||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Models\ConstFlow;
|
||||
use Illuminate\Http\Request;
|
||||
use App\Services\Admin\ConstFlowService;
|
||||
|
||||
class PrintController extends Controller
|
||||
{
|
||||
public function showConst(Request $request)
|
||||
{
|
||||
$name = '';
|
||||
$time = now()->format('Y-m-d H:i:s');
|
||||
$sn = '';
|
||||
//默认list最少N行,最多N行;
|
||||
$list = [];
|
||||
$bigTotal = '';
|
||||
$adminName = '';
|
||||
$timeZone = '';
|
||||
|
||||
$flow = ConstFlow::find($request->input('id', 0));
|
||||
if($flow){
|
||||
$rows = (new ConstFlowService())->makeFeelist($flow);
|
||||
$flow->load(['oldman', 'adminuser']);
|
||||
$name = $flow->oldman->name;
|
||||
$time = $flow->created_at->format('Y-m-d H:i:s');
|
||||
$sn = $flow->sn;
|
||||
$ukeys = explode(',', $request->input('ukeys', ''));
|
||||
foreach($rows as $item){
|
||||
if(in_array($item['ukey'], $ukeys)){
|
||||
$list[] = $item;
|
||||
}
|
||||
}
|
||||
if(count($list) > 0){
|
||||
$total = collect($list)->sum('fee_value');
|
||||
if($total > 0){
|
||||
$bigTotal = $this->num2chinese($total);
|
||||
}else{
|
||||
$bigTotal = '负'.$this->num2chinese(abs($total));
|
||||
}
|
||||
}
|
||||
$adminName = $flow->adminuser->name;
|
||||
}
|
||||
|
||||
return view('print-const', compact('name', 'time', 'sn', 'list', 'bigTotal', 'adminName'));
|
||||
}
|
||||
|
||||
|
||||
private function num2chinese($num) {
|
||||
$cnNums = array(
|
||||
"", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"
|
||||
);
|
||||
$cnIntUnits = array("", "拾", "佰", "仟");
|
||||
$cnIntRadice = array("", "万", "亿", "兆");
|
||||
$cnDecUnits = array("角", "分");
|
||||
$cnInteger = "整";
|
||||
|
||||
$intStr = (string)$num;
|
||||
$len = strlen($intStr);
|
||||
if ($len > 15 || $num < 0) {
|
||||
return false; // 超出处理范围
|
||||
}
|
||||
|
||||
if ($num == 0) {
|
||||
return "零元整";
|
||||
}
|
||||
|
||||
$zeroCount = 0;
|
||||
$outChinese = "";
|
||||
for ($i = 0; $i < $len; $i++) {
|
||||
$idx = $len - $i - 1;
|
||||
$thisNum = (int)$intStr[$idx];
|
||||
if ($thisNum == 0) {
|
||||
$zeroCount++;
|
||||
continue;
|
||||
}
|
||||
if ($zeroCount > 0) {
|
||||
$outChinese = "零" . $outChinese; // 处理零
|
||||
}
|
||||
$zeroCount = 0;
|
||||
$outChinese = $cnNums[$thisNum] . $cnIntUnits[$i % 4] . $outChinese;
|
||||
if ($i % 4 == 0) {
|
||||
$outChinese = $cnIntRadice[$i / 4] . $outChinese;
|
||||
}
|
||||
}
|
||||
|
||||
if ($zeroCount > 0) {
|
||||
$outChinese = "零" . $outChinese; // 处理最后的零
|
||||
}
|
||||
|
||||
$outChinese .= "元";
|
||||
|
||||
// 处理小数部分
|
||||
if (strpos($num, '.') !== false) {
|
||||
$decPart = substr($num, strpos($num, '.') + 1);
|
||||
for ($i = 0, $len = strlen($decPart); $i < $len; $i++) {
|
||||
$thisNum = (int)$decPart[$i];
|
||||
if ($thisNum == 0) {
|
||||
continue;
|
||||
}
|
||||
$outChinese .= $cnNums[$thisNum] . $cnDecUnits[$i];
|
||||
}
|
||||
} else {
|
||||
$outChinese .= "整";
|
||||
}
|
||||
|
||||
return $outChinese;
|
||||
}
|
||||
}
|
||||
|
|
@ -4,6 +4,8 @@ namespace App\Models;
|
|||
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use EloquentFilter\Filterable;
|
||||
use Slowlyo\OwlAdmin\Models\AdminUser;
|
||||
use Carbon\Carbon;
|
||||
|
||||
class ConstFlow extends Model
|
||||
{
|
||||
|
|
@ -38,10 +40,29 @@ class ConstFlow extends Model
|
|||
|
||||
protected $fillable = [
|
||||
'oldman_id', 'const_type', 'money', 'extends', 'start_at', 'end_at',
|
||||
'change_lv', 'old_lv', 'new_lv'
|
||||
'change_lv', 'old_lv', 'new_lv',
|
||||
'state', 'sn', 'adminuser_id',
|
||||
];
|
||||
|
||||
protected static function boot()
|
||||
{
|
||||
parent::boot();
|
||||
// 监听 flow 创建事件,创建sn;
|
||||
static::creating(function ($oldmen) {
|
||||
$oldmen->sn = self::createSn();
|
||||
});
|
||||
}
|
||||
|
||||
public function oldman(){
|
||||
return $this->belongsTo(Oldmen::class, 'oldman_id');
|
||||
}
|
||||
|
||||
public function adminuser(){
|
||||
return $this->belongsTo(AdminUser::class, 'adminuser_id');
|
||||
}
|
||||
|
||||
private static function createSn()
|
||||
{
|
||||
return Carbon::now()->isoFormat('YYMMDDHHmmss').rand(1000, 9999);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -39,7 +39,7 @@ class BaseService extends AdminService
|
|||
$query->filter(request()->input(), $filter);
|
||||
}
|
||||
|
||||
return $query->orderByDesc($model->getUpdatedAtColumn() ?? $model->getKeyName());
|
||||
return $query->orderByDesc($model->getUpdatedAtColumn() ?? $model->getKeyName())->orderByDesc('id');
|
||||
}
|
||||
|
||||
public function getDetail($id)
|
||||
|
|
|
|||
|
|
@ -7,6 +7,7 @@ use App\Models\ConstFlow;
|
|||
use DB;
|
||||
use Throwable;
|
||||
use Carbon\Carbon;
|
||||
use Slowlyo\OwlAdmin\OwlAdmin;
|
||||
|
||||
/**
|
||||
* @method Oldmen getModel()
|
||||
|
|
@ -51,6 +52,7 @@ class LiveContinueService extends OldmenService
|
|||
$flow->end_at = $endAt;
|
||||
$flow->money = $this->totalFee($feeArr);
|
||||
$flow->extends = $feeArr;
|
||||
$flow->adminuser_id = OwlAdmin::user()->id;
|
||||
|
||||
//记录变更护理等级情况;
|
||||
if($changeLv && $lv != $oldMan->nurse_lv){
|
||||
|
|
|
|||
|
|
@ -5,6 +5,7 @@ namespace App\Services\Admin;
|
|||
use App\Models\Oldmen;
|
||||
use App\Models\ConstFlow;
|
||||
use DB;
|
||||
use Slowlyo\OwlAdmin\OwlAdmin;
|
||||
use Throwable;
|
||||
|
||||
/**
|
||||
|
|
@ -25,12 +26,13 @@ class LiveExitService extends OldmenService
|
|||
|
||||
$flowList = ConstFlow::where('oldman_id', $oldMan->id)
|
||||
->whereIn('const_type', [ConstFlow::TYPE_IN, ConstFlow::TYPE_CONTINUE])
|
||||
->where('state', 0)
|
||||
->whereBetween('start_at', [$oldMan->live_in_at, $oldMan->avliable_at])//开始时间在用户这段时间内的清单
|
||||
->get();
|
||||
|
||||
$flowMoney = 0;
|
||||
foreach($flowList as $flow){
|
||||
$flowMoney = bcadd($flowMoney, $flow->money, 2);
|
||||
$flowMoney = bcsub($flowMoney, $flow->money, 2);
|
||||
}
|
||||
|
||||
$flow = new ConstFlow();
|
||||
|
|
@ -40,9 +42,19 @@ class LiveExitService extends OldmenService
|
|||
$flow->end_at = $oldMan->avliable_at;//办理结算时间
|
||||
$flow->money = bcadd($flowMoney, $this->totalFee($feeArr), 2);
|
||||
$flow->extends = $feeArr;
|
||||
$flow->state = 1;
|
||||
$flow->adminuser_id = OwlAdmin::user()->id;
|
||||
|
||||
try{
|
||||
DB::beginTransaction();
|
||||
//更新明细清算状态
|
||||
ConstFlow::where('oldman_id', $oldMan->id)
|
||||
->whereIn('const_type', [ConstFlow::TYPE_IN, ConstFlow::TYPE_CONTINUE])
|
||||
->where('state', 0)
|
||||
->whereBetween('start_at', [$oldMan->live_in_at, $oldMan->avliable_at])//开始时间在用户这段时间内的清单
|
||||
->update([
|
||||
'state' => 1
|
||||
]);
|
||||
//缴费生成流水;
|
||||
$flow->save();
|
||||
//更新客人信息状态;
|
||||
|
|
|
|||
|
|
@ -6,6 +6,7 @@ use App\Models\ConstFlow;
|
|||
use App\Models\Oldmen;
|
||||
use DB;
|
||||
use Throwable;
|
||||
use Slowlyo\OwlAdmin\OwlAdmin;
|
||||
|
||||
/**
|
||||
* @method Oldmen getModel()
|
||||
|
|
@ -46,6 +47,7 @@ class LiveInService extends OldmenService
|
|||
$flow->end_at = $endAt;
|
||||
$flow->money = $this->totalFee($feeArr);
|
||||
$flow->extends = $feeArr;
|
||||
$flow->adminuser_id = OwlAdmin::user()->id;
|
||||
|
||||
try{
|
||||
DB::beginTransaction();
|
||||
|
|
|
|||
|
|
@ -121,13 +121,15 @@ class OldmenService extends BaseService
|
|||
|
||||
$flowList = ConstFlow::where('oldman_id', $oldMan->id)
|
||||
->whereIn('const_type', [ConstFlow::TYPE_IN, ConstFlow::TYPE_CONTINUE])
|
||||
->where('state', 0)
|
||||
->whereBetween('start_at', [$startAt, $endAt])//开始时间在用户这段时间内的清单
|
||||
->get();
|
||||
foreach($flowList as $flow){
|
||||
$rows[] = [
|
||||
'ukey' => 'history_'.$flow->id,
|
||||
'name' => '缴费记录',
|
||||
'fee_name' => ConstFlow::typeMap()[$flow->const_type].'【'.$flow->created_at->format('m-d H:i:s').'】',
|
||||
'fee_value' => $flow->money,
|
||||
'fee_value' => 0-$flow->money,
|
||||
];
|
||||
}
|
||||
}
|
||||
|
|
@ -140,19 +142,21 @@ class OldmenService extends BaseService
|
|||
if(!$delFee){
|
||||
$delFee = Arr::get($extends, 'del_fee', []);
|
||||
}
|
||||
foreach($addFee as $item){
|
||||
foreach($addFee as $i => $item){
|
||||
if(isset($item['name']) && isset($item['fee'])){
|
||||
$rows[] = [
|
||||
'name' => '抵扣项',
|
||||
'ukey' => 'add_'.$i,
|
||||
'name' => '收费项',
|
||||
'fee_name' => $item['name'],
|
||||
'fee_value' => $item['fee'],
|
||||
];
|
||||
}
|
||||
}
|
||||
foreach($delFee as $item){
|
||||
foreach($delFee as $i => $item){
|
||||
if(isset($item['name']) && isset($item['fee'])){
|
||||
$rows[] = [
|
||||
'name' => '收费项',
|
||||
'ukey' => 'del_'.$i,
|
||||
'name' => '抵扣项',
|
||||
'fee_name' => $item['name'],
|
||||
'fee_value' => 0-$item['fee'],
|
||||
];
|
||||
|
|
@ -175,6 +179,7 @@ class OldmenService extends BaseService
|
|||
foreach($value as $item =>$vv){
|
||||
$_fee = Keyword::where('key', $item)->first();
|
||||
$rows[] = [
|
||||
'ukey' => $item,
|
||||
'name' => $_fee->parent?->name ?? '',
|
||||
'fee_name' => $_fee->name,
|
||||
'fee_value' => $vv,
|
||||
|
|
@ -183,6 +188,7 @@ class OldmenService extends BaseService
|
|||
}else{
|
||||
$_fee = Keyword::where('key', $key)->first();
|
||||
$rows[] = [
|
||||
'ukey' => $key,
|
||||
'name' => $_fee->parent?->name ?? '',
|
||||
'fee_name' => $_fee->name,
|
||||
'fee_value' => $value,
|
||||
|
|
@ -190,18 +196,20 @@ class OldmenService extends BaseService
|
|||
}
|
||||
}
|
||||
}
|
||||
foreach($addFee as $item){
|
||||
foreach($addFee as $i => $item){
|
||||
if(isset($item['name']) && isset($item['fee'])){
|
||||
$rows[] = [
|
||||
'ukey' => 'add_'.$i,
|
||||
'name' => '收费项',
|
||||
'fee_name' => $item['name'],
|
||||
'fee_value' => $item['fee'],
|
||||
];
|
||||
}
|
||||
}
|
||||
foreach($delFee as $item){
|
||||
foreach($delFee as $i => $item){
|
||||
if(isset($item['name']) && isset($item['fee'])){
|
||||
$rows[] = [
|
||||
'ukey' => 'del_'.$i,
|
||||
'name' => '抵扣项',
|
||||
'fee_name' => $item['name'],
|
||||
'fee_value' => 0-$item['fee'],
|
||||
|
|
|
|||
|
|
@ -14,14 +14,17 @@ return new class extends Migration
|
|||
Schema::create('const_flows', function (Blueprint $table) {
|
||||
$table->id();
|
||||
$table->unsignedBigInteger('oldman_id');
|
||||
$table->string('sn')->comment('流水编号');
|
||||
$table->unsignedTinyInteger('const_type')->comment('类别:1入住缴费;2续住缴费;3结算离场');
|
||||
$table->decimal('money', 10, 2)->default(0.00)->nullable()->comment('总金额');
|
||||
$table->text('extends')->nullable()->comment('收费明细');
|
||||
$table->unsignedTinyInteger('state')->nullable()->default(0)->comment('清算状态');
|
||||
$table->timestamp('start_at')->nullable()->comment('开始时间');
|
||||
$table->timestamp('end_at')->nullable()->comment('结束时间');
|
||||
$table->unsignedTinyInteger('change_lv')->nullable()->comment('是否变更护理等级');
|
||||
$table->unsignedTinyInteger('old_lv')->nullable()->comment('老护理等级');
|
||||
$table->unsignedTinyInteger('new_lv')->nullable()->comment('新护理等级');
|
||||
$table->unsignedBigInteger('adminuser_id')->comment('操作人');
|
||||
$table->timestamps();
|
||||
});
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,94 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="zh">
|
||||
<head>
|
||||
<meta charset="utf-8"/>
|
||||
<title>打印</title>
|
||||
<style>
|
||||
@media print {
|
||||
@page {
|
||||
margin: 0;
|
||||
}
|
||||
body {
|
||||
margin: 1.6cm;
|
||||
}
|
||||
}
|
||||
body {
|
||||
font-family: "宋体", sans-serif;
|
||||
}
|
||||
.container {
|
||||
/* width: 800px; */
|
||||
text-align: center;
|
||||
}
|
||||
.tag {
|
||||
overflow: hidden; /* 清除浮动 */
|
||||
}
|
||||
span{
|
||||
display: block;
|
||||
float: left;
|
||||
width: 33.333%;
|
||||
text-align: left;
|
||||
}
|
||||
span.left {
|
||||
text-align: left;
|
||||
}
|
||||
span.right {
|
||||
float: right;
|
||||
text-align: left;
|
||||
}
|
||||
table.print-table {
|
||||
width: 100%;
|
||||
border-collapse:collapse;
|
||||
border: 1px solid black;
|
||||
margin: 0 auto;
|
||||
table-layout: fixed;
|
||||
}
|
||||
td,th{
|
||||
line-height: 35px;
|
||||
border: 1px solid black;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<button type="button" class="print-hide" onclick="this.style.display='none';window.print();this.style.display='inline';">打印</button>
|
||||
<div class="container" id="print-content">
|
||||
<p style="font-size:30px;">重庆市巴南区狮子山老年公寓收据</p>
|
||||
<p class="tag" style="font-size:20px;">
|
||||
<span class="left">客户姓名 :{{$name}}</span>
|
||||
<span class="middle">日期 :{{$time}}</span>
|
||||
<span class="right">单据编号 :{{$sn}}</span>
|
||||
</p>
|
||||
<table class="print-table">
|
||||
<tr>
|
||||
<th style="width: 5%;">序号</th>
|
||||
<th style="width: 25%;">费用类别</th>
|
||||
<th style="width: 30%;">起止日期</th>
|
||||
<th style="width: 15%;">金额</th>
|
||||
<th style="width: 25%;">备注</th>
|
||||
</tr>
|
||||
@foreach($list as $item)
|
||||
<tr>
|
||||
<td>{{$loop->iteration}}</td>
|
||||
<td>{{$item['fee_name']}}</td>
|
||||
<td>2022-01-01至2022-01-31</td>
|
||||
<td>{{$item['fee_value']}}</td>
|
||||
<td>
|
||||
<input type="text" style="border:none">
|
||||
</td>
|
||||
</tr>
|
||||
@endforeach
|
||||
<tr>
|
||||
<td colspan="3">合计大写:</td>
|
||||
<td colspan="2">{{$bigTotal}}</td>
|
||||
</tr>
|
||||
</table>
|
||||
<p class="tag" style="font-size:20px;">
|
||||
<span class="left">单位盖章 :</span>
|
||||
<span class="middle"> </span>
|
||||
<span class="right">收款人 :{{$adminName}}</span>
|
||||
</p>
|
||||
</div>
|
||||
</body>
|
||||
<script>
|
||||
|
||||
</script>
|
||||
</html>
|
||||
|
|
@ -1,5 +1,6 @@
|
|||
<?php
|
||||
|
||||
use App\Http\Controllers\PrintController;
|
||||
use Illuminate\Support\Facades\Route;
|
||||
|
||||
/*
|
||||
|
|
@ -16,3 +17,5 @@ use Illuminate\Support\Facades\Route;
|
|||
Route::get('/', function () {
|
||||
return view('welcome');
|
||||
});
|
||||
|
||||
Route::get('/print-const-flow', [PrintController::class, 'showConst']);
|
||||
Loading…
Reference in New Issue