初始化
缺陷:主题配色需要优化整体的同风格
This commit is contained in:
162
app/Service/business/EnterpriseService.php
Normal file
162
app/Service/business/EnterpriseService.php
Normal file
@@ -0,0 +1,162 @@
|
||||
<?php
|
||||
|
||||
namespace App\Service\business;
|
||||
|
||||
use App\BaseApp\BaseService;
|
||||
use App\Models\business\EnterpriseModel;
|
||||
use App\Models\business\WxUserModel;
|
||||
use App\Service\common\MediaUrlService;
|
||||
use Exception;
|
||||
use Psr\Container\ContainerExceptionInterface;
|
||||
use Psr\Container\NotFoundExceptionInterface;
|
||||
|
||||
/**
|
||||
* 企业管理
|
||||
*
|
||||
* 老项目里企业只是微信用户管理页顺手塞的两个字段(name/logo),
|
||||
* 没有独立模块,也没有联系人、税号、默认倍率,做不了对公结算。
|
||||
*/
|
||||
class EnterpriseService extends BaseService
|
||||
{
|
||||
private MediaUrlService $media;
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct();
|
||||
$this->model = EnterpriseModel::class;
|
||||
$this->selectField = [
|
||||
'id', 'name', 'logo', 'contact_name', 'phone', 'address',
|
||||
'tax_no', 'settle_type', 'price_number', 'status', 'remark',
|
||||
'created_at', 'updated_at',
|
||||
];
|
||||
$this->queryField = [
|
||||
'name' => 'like',
|
||||
'contact_name' => 'like',
|
||||
'phone' => 'like',
|
||||
'status' => '=',
|
||||
];
|
||||
$this->media = MediaUrlService::getInstance();
|
||||
}
|
||||
|
||||
/**
|
||||
* @throws ContainerExceptionInterface
|
||||
* @throws NotFoundExceptionInterface
|
||||
*/
|
||||
public function list(): array
|
||||
{
|
||||
$result = $this->getPageList();
|
||||
$ids = array_column($result['items'], 'id');
|
||||
$counts = empty($ids)
|
||||
? []
|
||||
: WxUserModel::whereIn('enterprise_id', $ids)
|
||||
->where('deleted_at', 0)
|
||||
->selectRaw('enterprise_id, COUNT(*) as total')
|
||||
->groupBy('enterprise_id')
|
||||
->pluck('total', 'enterprise_id')
|
||||
->all();
|
||||
|
||||
foreach ($result['items'] as &$item) {
|
||||
$item['logo'] = $this->media->toPublic($item['logo'] ?? '');
|
||||
$item['user_count'] = (int) ($counts[$item['id']] ?? 0);
|
||||
}
|
||||
unset($item);
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* 下拉:SearchSelect 组件按关键词模糊搜索,所以支持 keyword 入参
|
||||
*/
|
||||
public function option(): mixed
|
||||
{
|
||||
$keyword = trim((string) request()->get('keyword', ''));
|
||||
$limit = (int) request()->get('limit', 30);
|
||||
$limit = $limit > 0 && $limit <= 100 ? $limit : 30;
|
||||
|
||||
return EnterpriseModel::where('deleted_at', 0)
|
||||
->where('status', 0)
|
||||
->when($keyword !== '', function ($q) use ($keyword) {
|
||||
$q->where(function ($sub) use ($keyword) {
|
||||
$sub->where('name', 'like', "%{$keyword}%")
|
||||
->orWhere('contact_name', 'like', "%{$keyword}%")
|
||||
->orWhere('phone', 'like', "%{$keyword}%");
|
||||
});
|
||||
})
|
||||
->orderBy('id', 'desc')
|
||||
->limit($limit)
|
||||
->get(['id', 'name', 'logo', 'contact_name', 'phone', 'price_number'])
|
||||
->map(function ($row) {
|
||||
$row->logo = $this->media->toPublic($row->logo);
|
||||
return $row;
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 详情:带企业下的微信用户
|
||||
* @throws Exception
|
||||
*/
|
||||
public function detail($id): mixed
|
||||
{
|
||||
$info = $this->getDetail($id);
|
||||
$info->logo = $this->media->toPublic($info->logo);
|
||||
$info->users = WxUserModel::where('enterprise_id', $id)
|
||||
->where('deleted_at', 0)
|
||||
->orderBy('id', 'desc')
|
||||
->get(['id', 'nick_name', 'phone', 'is_p', 'show_price', 'price_number', 'created_at'])
|
||||
->toArray();
|
||||
$info->user_count = count($info->users);
|
||||
return $info;
|
||||
}
|
||||
|
||||
public function create($params): mixed
|
||||
{
|
||||
$params = $this->normalize($params);
|
||||
return $this->insert($params);
|
||||
}
|
||||
|
||||
/**
|
||||
* @throws Exception
|
||||
*/
|
||||
public function update($id, $params): mixed
|
||||
{
|
||||
$params = $this->normalize($params);
|
||||
return $this->save($id, $params);
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除企业前先解绑用户,否则用户会挂在一个查不到的企业上
|
||||
* @throws Exception
|
||||
*/
|
||||
public function delete($id): mixed
|
||||
{
|
||||
$ids = array_values(array_filter(array_map('intval', is_array($id) ? $id : [$id])));
|
||||
if (empty($ids)) {
|
||||
$this->utils->errorThrow('参数错误');
|
||||
}
|
||||
if (WxUserModel::whereIn('enterprise_id', $ids)->where('deleted_at', 0)->exists()) {
|
||||
$this->utils->errorThrow('该企业下仍有微信用户,请先解绑用户');
|
||||
}
|
||||
return $this->del($ids);
|
||||
}
|
||||
|
||||
/**
|
||||
* @throws Exception
|
||||
*/
|
||||
public function status($id, $status): mixed
|
||||
{
|
||||
return $this->save($id, ['status' => (int) $status]);
|
||||
}
|
||||
|
||||
private function normalize(array $params): array
|
||||
{
|
||||
if (array_key_exists('logo', $params)) {
|
||||
$params['logo'] = $this->media->firstOf($params['logo']);
|
||||
}
|
||||
if (array_key_exists('price_number', $params)) {
|
||||
$number = $params['price_number'];
|
||||
$params['price_number'] = !is_numeric($number) || (float) $number <= 0
|
||||
? '1'
|
||||
: (string) $number;
|
||||
}
|
||||
return $params;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user