You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

353 lines
17 KiB

5 months ago
<?php
namespace App\Http\Controllers\Admin;
use App\Exports\BaseExport;
2 weeks ago
use App\Exports\CommonExport;
5 months ago
use App\Helpers\ResponseCode;
use App\Models\AppointmentType;
use App\Models\Book;
use App\Models\Calendar;
use App\Models\Company;
use App\Models\CourseContentEvaluationAsk;
use App\Models\CourseContentEvaluationForm;
1 week ago
use App\Models\CourseSign;
use App\Models\CourseType;
5 months ago
use App\Models\CustomForm;
use App\Models\CustomFormField;
use App\Models\EmailTemplate;
use App\Models\SupplyDemand;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Validator;
use Maatwebsite\Excel\Facades\Excel;
use Rap2hpoutre\FastExcel\FastExcel;
class CompanyController extends BaseController
{
/**
* 构造函数
*/
public function __construct()
{
parent::__construct(new Company());
}
3 weeks ago
/**
* @OA\Get(
* path="/api/admin/company/config",
* tags={"公司管理"},
* summary="参数",
* description="",
* @OA\Parameter(name="token", in="query", @OA\Schema(type="string"), required=true, description="token"),
* @OA\Response(
* response="200",
* description="暂无"
* )
* )
*/
public function config()
{
// 企业标签
3 weeks ago
$companiesTags = Company::where('company_tag', '!=', '')->pluck('company_tag');
3 weeks ago
$companiesTags = $companiesTags->flatten()->implode(',');
2 weeks ago
$companiesTags = array_unique(explode(',', $companiesTags));
3 weeks ago
// 去除$companiesTags中包含小数点的元素
$companiesTags = array_filter($companiesTags, function ($item) {
return !strpos($item, '.');
});
3 weeks ago
$companiesTags = array_values($companiesTags);
3 weeks ago
1 week ago
return $this->success(compact('companiesTags'));
3 weeks ago
}
5 months ago
/**
* @OA\Get(
* path="/api/admin/company/index",
* tags={"公司管理"},
* summary="列表",
* description="",
* @OA\Parameter(name="is_export", in="query", @OA\Schema(type="string"), required=false, description="是否导出0否1是"),
* @OA\Parameter(name="export_fields", in="query", @OA\Schema(type="string"), required=false, description="需要导出的字段数组"),
* @OA\Parameter(name="filter", in="query", @OA\Schema(type="string"), required=false, description="查询条件。数组"),
* @OA\Parameter(name="show_relation", in="query", @OA\Schema(type="string"), required=false, description="需要输出的关联关系数组包括teachercourseSettingscoursePeriods"),
* @OA\Parameter(name="page_size", in="query", @OA\Schema(type="string"), required=false, description="每页显示的条数"),
* @OA\Parameter(name="page", in="query", @OA\Schema(type="string"), required=false, description="页码"),
* @OA\Parameter(name="sort_name", in="query", @OA\Schema(type="string"), required=false, description="排序字段名字"),
* @OA\Parameter(name="sort_type", in="query", @OA\Schema(type="string"), required=false, description="排序类型"),
* @OA\Parameter(name="token", in="query", @OA\Schema(type="string"), required=true, description="token"),
1 week ago
* @OA\Parameter(name="start_year", in="query", @OA\Schema(type="string"), required=false, description="开始年份"),
* @OA\Parameter(name="end_year", in="query", @OA\Schema(type="string"), required=false, description="结束年份"),
* @OA\Parameter(name="start_date", in="query", @OA\Schema(type="string"), required=false, description="开始日期(用于统计)"),
* @OA\Parameter(name="end_date", in="query", @OA\Schema(type="string"), required=false, description="结束日期(用于统计)"),
2 weeks ago
* @OA\Parameter(name="course_type_id", in="query", @OA\Schema(type="string"), required=true, description="课程体系id"),
* @OA\Parameter(name="course_name", in="query", @OA\Schema(type="string"), required=true, description="课程名称"),
* @OA\Parameter(name="user_name", in="query", @OA\Schema(type="string"), required=true, description="学员名称"),
* @OA\Parameter(name="is_schoolmate", in="query", @OA\Schema(type="string"), required=true, description="是否校友0否1是"),
5 months ago
* @OA\Response(
* response="200",
* description="暂无"
* )
* )
*/
public function index()
{
$all = request()->all();
1 week ago
$start_year = $all['start_year'] ?? null;
$end_year = $all['end_year'] ?? null;
1 week ago
$list = $this->model->with([
'users' => function ($query) use ($all) {
$query->whereHas('courseSigns', function ($q) {
$q->where('status', 1);
})->with('courseSigns.course');
}
])->whereHas('users', function ($query) use ($all) {
2 weeks ago
if (isset($all['course_type_id'])) {
$query->whereHas('courses', function ($q) use ($all) {
$q->where('type', $all['course_type_id']);
});
}
if (isset($all['course_name'])) {
$query->whereHas('courses', function ($q) use ($all) {
$q->where('name', 'like', '%' . $all['course_name'] . '%');
});
}
if (isset($all['user_name'])) {
$query->where('username', 'like', '%' . $all['user_name'] . '%');
}
if (isset($all['is_schoolmate'])) {
$query->where('is_schoolmate', $all['is_schoolmate']);
}
1 week ago
})->where(function ($query) use ($all, $start_year, $end_year) {
// 根据开始和结束年份筛选 project_users 中的 investDate
if ($start_year && $end_year) {
// 使用 LIKE 匹配 JSON 字符串中的年份范围
$query->where(function ($q) use ($start_year, $end_year) {
for ($year = (int)$start_year; $year <= (int)$end_year; $year++) {
$q->orWhere('project_users', 'like', '%"investDate":"' . $year . '%');
}
});
}
5 months ago
if (isset($all['filter']) && !empty($all['filter'])) {
foreach ($all['filter'] as $condition) {
$key = $condition['key'] ?? null;
$op = $condition['op'] ?? null;
$value = $condition['value'] ?? null;
if (!isset($key) || !isset($op) || !isset($value)) {
continue;
}
2 weeks ago
if ($key == 'company_tag') {
$valueArray = explode(',', $value);
1 week ago
if (!empty($valueArray)) {
$query->where(function ($q) use ($valueArray) {
foreach ($valueArray as $item) {
$item = trim($item);
$q->where('company_tag', 'like', '%' . $item . '%');
}
});
}
3 months ago
continue;
}
2 weeks ago
5 months ago
// 等于
if ($op == 'eq') {
$query->where($key, $value);
}
// 不等于
if ($op == 'neq') {
$query->where($key, '!=', $value);
}
// 大于
if ($op == 'gt') {
$query->where($key, '>', $value);
}
// 大于等于
if ($op == 'egt') {
$query->where($key, '>=', $value);
}
// 小于
if ($op == 'lt') {
$query->where($key, '<', $value);
}
// 小于等于
if ($op == 'elt') {
$query->where($key, '<=', $value);
}
// 模糊搜索
if ($op == 'like') {
$query->where($key, 'like', '%' . $value . '%');
}
// 否定模糊搜索
if ($op == 'notlike') {
$query->where($key, 'not like', '%' . $value . '%');
}
// 范围搜索
if ($op == 'range') {
list($from, $to) = explode(',', $value);
if (empty($from) || empty($to)) {
continue;
}
$query->whereBetween($key, [$from, $to]);
}
}
}
})->orderBy($all['sort_name'] ?? 'id', $all['sort_type'] ?? 'desc');
if (isset($all['is_export']) && !empty($all['is_export'])) {
$list = $list->get()->toArray();
2 weeks ago
return Excel::download(new CommonExport($list, $all['export_fields'] ?? ''), $all['file_name'] ?? '' . date('YmdHis') . '.xlsx');
5 months ago
} else {
// 输出
$list = $list->paginate($all['page_size'] ?? 20);
}
1 week ago
// 计算统计数据(如果提供了开始和结束年份)
$statistics = [
'course_signs_invested' => 0,
'company_invested_after_enrollment_total' => 0,
'company_invested_year_total' => 0,
];
1 week ago
$start_date = $start_year ? $start_year . '-01-01' : date('Y-m-d');
1 week ago
$end_date = $end_year ? $end_year . '-12-31' : date('Y-m-d');
if ($start_date && $end_date) {
// 累计被投企业数(从起始日期到结束日期)
1 week ago
$statistics['course_signs_invested'] = Company::yhInvestedTotal($end_date);
1 week ago
// 年份范围内被投企业数(在指定时间范围内报名的学员所在公司中,被投时间在年份范围内的公司数量)
1 week ago
$statistics['company_invested_year_total'] = Company::yhInvested($start_date, $end_date);
// 入学后被投企业数量(在指定时间范围内报名的学员所在公司中,在入学后被投的公司数量)
$statistics['company_invested_after_enrollment_total'] = Company::companyInvestedYear($start_date, $end_date);
1 week ago
}
// 将统计数据添加到返回结果中
$result = $list->toArray();
$result['statistics'] = $statistics;
return $this->success($result);
5 months ago
}
/**
* @OA\Get(
* path="/api/admin/company/show",
* tags={"公司管理"},
* summary="详情",
* description="",
* @OA\Parameter(name="id", in="query", @OA\Schema(type="string"), required=true, description="id"),
* @OA\Parameter(name="show_relation", in="query", @OA\Schema(type="string"), required=false, description="需要输出的关联关系数组,填写输出指定数据"),
* @OA\Parameter(name="token", in="query", @OA\Schema(type="string"), required=true, description="token"),
* @OA\Response(
* response="200",
* description="暂无"
* )
* )
*/
public function show()
{
$all = \request()->all();
$messages = [
5 months ago
'id.required' => 'Id必填',
5 months ago
];
$validator = Validator::make($all, [
5 months ago
'id' => 'required'
5 months ago
], $messages);
if ($validator->fails()) {
return $this->fail([ResponseCode::ERROR_PARAMETER, implode(',', $validator->errors()->all())]);
}
1 week ago
$detail = $this->model->with([
'users' => function ($query) {
$query->whereHas('courseSigns', function ($q) {
$q->where('status', 1);
})->with('courseSigns.course');
}
])->find($all['id']);
5 months ago
return $this->success($detail);
}
/**
* @OA\Post(
* path="/api/admin/company/save",
* tags={"公司管理"},
* summary="保存",
* description="",
* @OA\Parameter(name="id", in="query", @OA\Schema(type="int"), required=true, description="Id(存在更新,不存在新增)"),
5 months ago
* @OA\Parameter(name="company_name", in="query", @OA\Schema(type="string", nullable=true), description="企业名字"),
* @OA\Parameter(name="company_attribute", in="query", @OA\Schema(type="string", nullable=true), description="行业类型"),
* @OA\Parameter(name="company_tag", in="query", @OA\Schema(type="string", nullable=true), description="标签"),
* @OA\Parameter(name="company_scale", in="query", @OA\Schema(type="string", nullable=true), description="企业规模"),
* @OA\Parameter(name="company_date", in="query", @OA\Schema(type="string", format="date", nullable=true), description="成立时间"),
* @OA\Parameter(name="company_legal_representative", in="query", @OA\Schema(type="string", nullable=true), description="法人代表"),
5 months ago
* @OA\Parameter(name="company_shareholder", in="query", @OA\Schema(type="string", nullable=true), description="股东信息"),
5 months ago
* @OA\Parameter(name="management_platform", in="query", @OA\Schema(type="string", nullable=true), description="管理平台"),
* @OA\Parameter(name="project_manager", in="query", @OA\Schema(type="string", nullable=true), description="项目经理"),
* @OA\Parameter(name="market_value", in="query", @OA\Schema(type="integer", format="int64", nullable=true), description="市值"),
* @OA\Parameter(name="company_fund", in="query", @OA\Schema(type="integer", format="int64", nullable=true), description="公司融资情况"),
* @OA\Parameter(name="valuation", in="query", @OA\Schema(type="integer", format="int64", nullable=true), description="估值"),
* @OA\Parameter(name="company_address", in="query", @OA\Schema(type="string", nullable=true), description="公司地址"),
* @OA\Parameter(name="company_area", in="query", @OA\Schema(type="string", nullable=true), description="公司区域"),
5 months ago
* @OA\Parameter(name="company_city", in="query", @OA\Schema(type="string", nullable=true), description="公司城市"),
* @OA\Parameter(name="company_market", in="query", @OA\Schema(type="string", nullable=true), description="是否上市0否1是"),
5 months ago
* @OA\Parameter(name="company_industry", in="query", @OA\Schema(type="string", nullable=true), description="公司所属行业"),
5 months ago
* @OA\Parameter(name="is_schoolmate", in="query", @OA\Schema(type="string", nullable=true), description="是否校友企业-0非校友1校友"),
5 months ago
* @OA\Parameter(name="company_need_fund", in="query", @OA\Schema(type="string", nullable=true), description="公司是否需要融资-0否1是"),
* @OA\Parameter(name="company_introduce", in="query", @OA\Schema(type="string", format="textarea", nullable=true), description="公司简介"),
* @OA\Parameter(name="company_other", in="query", @OA\Schema(type="string", nullable=true), description="其他"),
* @OA\Parameter(name="company_product", in="query", @OA\Schema(type="string", format="textarea", nullable=true), description="产品"),
* @OA\Parameter(name="overseas_experience", in="query", @OA\Schema(type="string", nullable=true), description="海外经验"),
* @OA\Parameter(name="sales_volume", in="query", @OA\Schema(type="string", nullable=true), description="销售额"),
4 months ago
* @OA\Parameter(name="tag", in="query", @OA\Schema(type="string", nullable=true), description="标签,千企走访这类的数据"),
5 months ago
* @OA\Parameter(name="token", in="query", @OA\Schema(type="string"), required=true, description="认证token"),
* @OA\Response(
* response="200",
* description="操作成功"
* )
* )
*/
public function save()
{
$all = \request()->all();
DB::beginTransaction();
try {
if (isset($all['id'])) {
$model = $this->model->find($all['id']);
if (empty($model)) {
return $this->fail([ResponseCode::ERROR_BUSINESS, '数据不存在']);
}
} else {
$model = $this->model;
$all['admin_id'] = $this->getUserId();
$all['department_id'] = $this->getUser()->department_id;
}
$original = $model->getOriginal();
$model->fill($all);
$model->save();
DB::commit();
// 记录日志
$this->saveLogs($original, $model);
return $this->success($model);
} catch (\Exception $exception) {
DB::rollBack();
return $this->fail([$exception->getCode(), $exception->getMessage()]);
}
}
/**
* @OA\Get(
* path="/api/admin/company/destroy",
* tags={"公司管理"},
* summary="删除",
* description="",
* @OA\Parameter(name="id", in="query", @OA\Schema(type="string"), required=true, description="id"),
* @OA\Parameter(name="token", in="query", @OA\Schema(type="string"), required=true, description="token"),
* @OA\Response(
* response="200",
* description="暂无"
* )
* )
*/
public function destroy()
{
return parent::destroy();
}
}