fix: 修复安装明细空状态筛选 #494

Merged
qiuxiang merged 1 commits from fix/qiuxiang-installation-filter-null-status into main 2026-10-24 15:00:22 +08:00
2 changed files with 51 additions and 9 deletions

View File

@ -121,11 +121,27 @@ class InstallationDetailMirrorRepository
if (!empty($filters[$prefix.'_from'])) $query->where('v.'.$column, '>=', $filters[$prefix.'_from']);
if (!empty($filters[$prefix.'_to'])) $query->where('v.'.$column, '<', \Illuminate\Support\Carbon::parse($filters[$prefix.'_to'])->addDay()->toDateString());
}
foreach (['push_status'=>'apistatus','order_no'=>'OrderNum','customer_review'=>'kfsh','finance_review'=>'cwsh','quote_status'=>'BidStatus','fee_payer'=>'costtaker','completed_status'=>'installComplete','shop_name'=>'shop_name','delete_status'=>'Delete','installation_company'=>'installCompanyName','installation_no'=>'ordernum_id','order_type'=>'TypeDto'] as $key=>$column) {
foreach (['push_status'=>'apistatus','order_no'=>'OrderNum','quote_status'=>'BidStatus','fee_payer'=>'costtaker','shop_name'=>'shop_name','installation_company'=>'installCompanyName','installation_no'=>'ordernum_id','order_type'=>'TypeDto'] as $key=>$column) {
if (isset($filters[$key]) && $filters[$key] !== '') $query->where('v.'.$column, $filters[$key]);
}
foreach (['customer_review'=>'kfsh','finance_review'=>'cwsh','completed_status'=>'installComplete','delete_status'=>'Delete'] as $key=>$column) {
if (!isset($filters[$key]) || $filters[$key] === '') continue;
if ((string) $filters[$key] === '1') {
$query->where('v.'.$column, 1);
} else {
$query->where(function ($sub) use ($column): void {
$sub->whereNull('v.'.$column)->orWhere('v.'.$column, 0);
});
}
}
if (isset($filters['arranged_status']) && $filters['arranged_status'] !== '') {
$query->where('v.StatusId', $filters['arranged_status'] === '1' ? '>' : '<=', 0);
if ($filters['arranged_status'] === '1') {
$query->where('v.StatusId', '>', 0);
} else {
$query->where(function ($sub): void {
$sub->whereNull('v.StatusId')->orWhere('v.StatusId', '<=', 0);
});
}
}
if (!empty($filters['product_id'])) {
$query->whereExists(function ($sub) use ($itemTable, $filters) {
@ -215,18 +231,18 @@ class InstallationDetailMirrorRepository
];
}
private function yesNo(mixed $value): ?string
private function yesNo(mixed $value): string
{
return $value === null ? null : ((int) $value === 1 ? '是' : '否');
return (int) $value === 1 ? '是' : '否';
}
private function review(mixed $value): ?string
private function review(mixed $value): string
{
return $value === null ? null : ((int) $value === 1 ? '已审核' : '未审核');
return (int) $value === 1 ? '已审核' : '未审核';
}
private function arranged(mixed $value): ?string
private function arranged(mixed $value): string
{
return $value === null ? null : ((int) $value > 0 ? '已安排' : '未安排');
return (int) $value > 0 ? '已安排' : '未安排';
}
}

View File

@ -29,7 +29,7 @@ class InstallationDetailMirrorRepositoryTest extends TestCase
$schema->create('fixture_install',function(Blueprint $t){
$t->integer('Id');
foreach(['SourceGuid','OrderNum','ordernum_id','shop_name','SubmitTime','kfshTime','cwshTime','apistatus','kfsh','cwsh','BidStatus','costtaker','installComplete','Delete','installCompanyName','TypeDto'] as $c) $t->string($c)->nullable();
$t->integer('StatusId')->default(0);
$t->integer('StatusId')->nullable()->default(0);
foreach(['installcost','settleAmount','acceptAmount'] as $c) $t->decimal($c,14,2)->default(0);
});
$schema->create('fixture_items',function(Blueprint $t){$t->integer('Id');$t->string('guid');$t->string('shopproid');$t->string('Sourceno')->nullable();});
@ -79,6 +79,32 @@ class InstallationDetailMirrorRepositoryTest extends TestCase
$this->assertTrue($result['has_more']);
}
public function test_unset_status_filters_include_null_values_and_render_explicit_labels(): void
{
DB::connection('business_mirror')->table('fixture_install')->where('Id',3)->update(['StatusId'=>null]);
foreach (['customer_review','finance_review','completed_status','delete_status','arranged_status'] as $key) {
$this->assertSame(3,$this->repository->paginate(1,50,[$key=>'0'])['total'],$key);
}
$other=$this->repository->paginate(1,50,['shop_name'=>'其他店'])['data'][0];
$this->assertSame('未审核',$other['customer_service_review']);
$this->assertSame('未审核',$other['finance_review']);
$this->assertSame('否',$other['completed_status']);
$this->assertSame('未安排',$other['arranged_status']);
DB::connection('business_mirror')->table('fixture_install')->where('Id',2)->update([
'kfsh'=>1,
'cwsh'=>1,
'installComplete'=>1,
'Delete'=>0,
'StatusId'=>1,
]);
foreach (['customer_review','finance_review','completed_status','arranged_status'] as $key) {
$this->assertSame(1,$this->repository->paginate(1,50,[$key=>'1'])['total'],$key);
}
}
public function test_end_date_alone_is_valid_and_invalid_status_is_rejected(): void
{
request()->merge(['created_to'=>'2026-08-20']);