添加打印,并调整结算

develop
vine_liutk 2023-06-13 16:05:17 +08:00
parent f3f97c64d7
commit 497b1fda08
14 changed files with 283 additions and 17 deletions

View File

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

View File

@ -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', '金额')
]),

View File

@ -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 = [];

View File

@ -1 +1,2 @@
<?php
use Slowlyo\OwlAdmin\Admin;

View File

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

View File

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

View File

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

View File

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

View File

@ -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();
//更新客人信息状态;

View File

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

View File

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

View File

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

View File

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

View File

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