diff --git a/app/Admin/Controllers/ConstFlowController.php b/app/Admin/Controllers/ConstFlowController.php index 167a8bb..dcfd049 100644 --- a/app/Admin/Controllers/ConstFlowController.php +++ b/app/Admin/Controllers/ConstFlowController.php @@ -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); } diff --git a/app/Admin/Controllers/LiveExitController.php b/app/Admin/Controllers/LiveExitController.php index 0b619bb..14683ed 100644 --- a/app/Admin/Controllers/LiveExitController.php +++ b/app/Admin/Controllers/LiveExitController.php @@ -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', '金额') ]), diff --git a/app/Admin/Controllers/OldmenController.php b/app/Admin/Controllers/OldmenController.php index aca39c4..1ef8dc6 100644 --- a/app/Admin/Controllers/OldmenController.php +++ b/app/Admin/Controllers/OldmenController.php @@ -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 = []; diff --git a/app/Admin/bootstrap.php b/app/Admin/bootstrap.php index b3d9bbc..5aa3d58 100644 --- a/app/Admin/bootstrap.php +++ b/app/Admin/bootstrap.php @@ -1 +1,2 @@ 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; + } +} \ No newline at end of file diff --git a/app/Models/ConstFlow.php b/app/Models/ConstFlow.php index ec635cc..6988df4 100644 --- a/app/Models/ConstFlow.php +++ b/app/Models/ConstFlow.php @@ -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); + } } diff --git a/app/Services/Admin/BaseService.php b/app/Services/Admin/BaseService.php index 92665ed..d38b3c7 100644 --- a/app/Services/Admin/BaseService.php +++ b/app/Services/Admin/BaseService.php @@ -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) diff --git a/app/Services/Admin/LiveContinueService.php b/app/Services/Admin/LiveContinueService.php index da64ee8..940326a 100644 --- a/app/Services/Admin/LiveContinueService.php +++ b/app/Services/Admin/LiveContinueService.php @@ -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){ diff --git a/app/Services/Admin/LiveExitService.php b/app/Services/Admin/LiveExitService.php index 2a5737c..fe70948 100644 --- a/app/Services/Admin/LiveExitService.php +++ b/app/Services/Admin/LiveExitService.php @@ -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(); //更新客人信息状态; diff --git a/app/Services/Admin/LiveInService.php b/app/Services/Admin/LiveInService.php index caf7ac8..88d2e06 100644 --- a/app/Services/Admin/LiveInService.php +++ b/app/Services/Admin/LiveInService.php @@ -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(); diff --git a/app/Services/Admin/OldmenService.php b/app/Services/Admin/OldmenService.php index af7ef69..e769e14 100644 --- a/app/Services/Admin/OldmenService.php +++ b/app/Services/Admin/OldmenService.php @@ -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'], diff --git a/database/migrations/2023_06_05_095831_create_const_flows_table.php b/database/migrations/2023_06_05_095831_create_const_flows_table.php index 02468ab..76ab4e4 100644 --- a/database/migrations/2023_06_05_095831_create_const_flows_table.php +++ b/database/migrations/2023_06_05_095831_create_const_flows_table.php @@ -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(); }); } diff --git a/resources/views/print-const.blade.php b/resources/views/print-const.blade.php new file mode 100644 index 0000000..cc22cb7 --- /dev/null +++ b/resources/views/print-const.blade.php @@ -0,0 +1,94 @@ + + +
+ +重庆市巴南区狮子山老年公寓收据
++ 客户姓名 :{{$name}} + 日期 :{{$time}} + 单据编号 :{{$sn}} +
+| 序号 | +费用类别 | +起止日期 | +金额 | +备注 | +
|---|---|---|---|---|
| {{$loop->iteration}} | +{{$item['fee_name']}} | +2022-01-01至2022-01-31 | +{{$item['fee_value']}} | ++ + | +
| 合计大写: | +{{$bigTotal}} | +|||
+ 单位盖章 : + + 收款人 :{{$adminName}} +
+