houde_web_api/app/common/model/School/Student.php
2023-04-16 23:05:17 +08:00

628 lines
22 KiB
PHP

<?php
namespace app\common\model\School;
use app\common\model\School\StudentService as ModelStudentService;
use app\common\model\User\User as ModelUser;
use app\common\model\School\Classes as ModelClasses;
use app\common\model\Product\ProductType as ModelProductType;
use app\common\model\Product\Product as ModelProduct;
use app\common\model\Product\ProductParts as ModelProductParts;
use app\common\arw\adjfut\src\Validate;
use app\BaseModel;
use think\model\concern\SoftDelete;
use app\Request;
use think\facade\Db;
use app\common\exception\RegularVerification;
use app\common\arw\adjfut\src\Excel;
use app\common\exception\Map;
class Student extends BaseModel
{
use SoftDelete;
// 删除字段
protected $deleteTime = 'student_delete_time';
// 设置主键名
protected $pk = 'student_guid';
// 设置废弃字段
protected $disuse = [];
// 设置字段信息
protected $schema = [
"student_id" => "int",
"student_guid" => "string",
"student_name" => "string",
"user_guid" => "string",
"classes_guid" => "string",
"studnet_phone" => "string",
"student_id_card" => "string",
"student_email" => "string",
"student_sex" => "string",
"student_price" => "",
"student_brithday" => "date",
"product_type" => "string",
"product_guid" => "string",
"product_parts_guid" => "string",
"student_img" => "string",
"student_banner_img" => "string",
"student_attachment" => "string",
"student_intro" => "string",
"student_location" => "string",
"longitude" => "string",
"latitude" => "string",
"student_membe_type" => "string",
"student_member_begin_time" => "date",
"student_member_end_time" => "date",
"student_audit_status" => "string",
"student_audit_user_guid" => "string",
"student_create_time" => "datetime",
"student_create_user_guid" => "string",
"student_update_time" => "datetime",
"student_update_user_guid" => "string",
"student_delete_time" => "datetime",
"student_delete_user_guid" => "string",
];
// 设置json类型字段
protected $json = [''];
// 开启自动写入时间戳字段
protected $autoWriteTimestamp = 'datetime';
// 创建时间
protected $createTime = 'student_create_time';
// 修改时间
protected $updateTime = 'student_update_time';
/**
* 新增前
*/
public static function onBeforeInsert(self $model): void
{
// self::checkRepeatData($model);
$model->completeCreateField();
}
/**
* 更新前
*/
public static function onBeforeUpdate(self $model): void
{
// self::checkRepeatData($model);
$model->completeUpdateField();
}
/**
* 删除前
*/
public static function onBeforeDelete(self $model): void
{
$model->completeDeleteField();
}
/**
* 审核学生
*/
public static function auditStudent($params)
{
$params_audit_status = $params['student_audit_status'];
$student_guids_arr = explode(',', $params['student_guid']);
Db::startTrans();
try {
if (count($student_guids_arr) > 1) {
foreach ($student_guids_arr as $key => $value) {
self::audit($value,$params);
}
} else {
self::audit($params['student_guid'],$params);
}
Db::commit();
} catch (\Throwable $th) {
Db::rollback();
throw $th;
}
}
/**
* 审核
*/
public static function audit($value,$params)
{
$model = self::where('student_guid', $value)->find();
if (!$model) throwErrorMsg("该学生不存在", 1);
$params['student_audit_user_guid'] = Request::getCurrentUser()->user_guid;
$audit_status = $model->student_audit_status;
$student_name = $model->student_name;
if ($audit_status == 2) throwErrorMsg("{$student_name} 学生已通过审核!");
if ($audit_status == 3) throwErrorMsg("{$student_name} 学生已驳回审核!");
$model->allowField([
'student_audit_status',
'student_audit_user_guid'
])->save($params);
}
/**
* 新增前初始化
*/
public static function initAdd($params)
{
$user = ModelUser::where('user_name', $params['user_name'])->find();
$params['user_guid'] = $user->user_guid;
$student_user = self::where('user_guid', $params['user_guid'])->find();
if ($student_user) throwErrorMsg("用户已经被绑定,请重新选择!");
$isPhone = RegularVerification::checkPreg($params['studnet_phone'], 'mobile');
if (!$isPhone) throwErrorMsg("电话格式错误");
$isIdCard = RegularVerification::checkPreg($params['student_id_card'], 'idcard');
if (!$isIdCard) throwErrorMsg("身份证格式错误");
$isEmail = RegularVerification::checkPreg($params['student_email'], 'email');
if (!$isEmail) throwErrorMsg("邮箱格式错误");
// 季卡
if ($params['student_membe_type'] == '1') {
$params['student_member_begin_time'] = date('Y-m-d H:i:s');
$params['student_member_end_time'] = date('Y-m-d H:i:s', strtotime('+3 month'));
}
// 年卡
if ($params['student_membe_type'] == '2') {
$params['student_member_begin_time'] = date('Y-m-d H:i:s');
$params['student_member_end_time'] = date('Y-m-d H:i:s', strtotime('+1 year'));
}
// 已审核
$params['student_audit_status'] = "1";
// $params['student_audit_user_guid'] = "ds4a3d2asd423s3as4d34asdd";
return $params;
}
/**
* 导入前初始化
*/
public static function ImportStudentInit($value)
{
// 用户判断
$user = ModelUser::where('user_name', $value['user_name'])->find();
// array_push($error, "{$line}: 产品类型不存在,导入失败!");
if (!$user) throwErrorMsg("用户 {$value['user_name']} 不存在");
$value['user_guid'] = $user->user_guid;
$student_user = self::where('user_guid', $value['user_guid'])->find();
if ($student_user) throwErrorMsg("用户 {$value['user_name']} 已经被绑定,请重新选择!");
// 班级判断
$classes = ModelClasses::where('classes_name', $value['classes_name'])->find();
if (!$classes) throwErrorMsg("班级不存在");
$value['classes_guid'] = $classes->classes_guid;
$isPhone = RegularVerification::checkPreg($value['studnet_phone'], 'mobile');
if (!$isPhone) throwErrorMsg("电话格式错误");
// $isIdCard = RegularVerification::checkPreg($value['student_id_card'], 'idcard');
// if (!$isIdCard) throwErrorMsg("身份证格式错误");
$isEmail = RegularVerification::checkPreg($value['student_email'], 'email');
if (!$isEmail) throwErrorMsg("邮箱格式错误");
$sex_val = [1 => '男', 2 => '女'];
// 性别判断
if (!in_array($value['student_sex'], ["", ""])) throwErrorMsg("请填写男或女");
else {
$value['student_sex'] = array_search($value['student_sex'], $sex_val);
// if ($value['student_sex'] == "男") $value['student_sex'] = 1;
// if ($value['student_sex'] == "女") $value['student_sex'] = 2;
}
// 价格判断
if (!is_numeric($value['student_price'])) throwErrorMsg("学生价格必须为整数");
if ($value['student_price'] < 0) throwErrorMsg("学生价格不能为负数");
// 产品类型判断
$product_type = ModelProductType::where('product_type_name', $value['product_type_name'])->find();
if (!$product_type) throwErrorMsg("{$value['product_type_name']} 产品类型不存在");
$value['product_type_guid'] = $product_type->product_type_guid;
// 产品判断
$product = ModelProduct::where('product_name', $value['product_name'])->find();
if (!$product) throwErrorMsg("{$value['product_name']} 产品不存在");
$value['product_guid'] = $product->product_guid;
$InProductType = ModelProduct::where('product_type_guid', $value['product_type_guid'])->find();
if (!$InProductType) throwErrorMsg("{$value['product_name']} 产品 没有绑定产品类型:{$value['product_type_name']}");
// 产品零件判断
$product_parts = ModelProductParts::where('product_parts_name', $value['product_parts_name'])->find();
if (!$product_parts) throwErrorMsg("{$value['product_parts_name']} 产品零件不存在");
$value['product_parts_guid'] = $product_parts->product_parts_guid;
$InProduct = ModelProductParts::where('product_guid', $value['product_guid'])->find();
if (!$InProduct) throwErrorMsg("{$value['product_parts_name']} 产品零件 没有绑定产品:{$value['product_name']}");
// 获取经纬度
$longitude_latitude_arr = Map::getLongitudeAndLatitude($value['student_location']);
$value['longitude'] = $longitude_latitude_arr['longitude'];
$value['latitude'] = $longitude_latitude_arr['latitude'];
// 季卡
if ($value['student_membe_type'] == '季卡') {
$value['student_membe_type'] = '1';
$value['student_member_begin_time'] = date('Y-m-d H:i:s');
$value['student_member_end_time'] = date('Y-m-d H:i:s', strtotime('+3 month'));
}
// 年卡
if ($value['student_membe_type'] == '年卡') {
$value['student_membe_type'] = '2';
$value['student_member_begin_time'] = date('Y-m-d H:i:s');
$value['student_member_end_time'] = date('Y-m-d H:i:s', strtotime('+1 year'));
}
// 已审核
$value['student_audit_status'] = "2";
$value['student_audit_user_guid'] = "ds4a3d2asd423s3as4d34asdd";
// 生日日期处理
$time = strtotime($value['student_brithday']);
$newformat = date('Y-m-d', $time);
return self::create([
'student_name' => $value['student_name'],
'user_guid' => $value['user_guid'],
'classes_guid' => $value['classes_guid'],
'studnet_phone' => $value['studnet_phone'],
'student_id_card' => $value['student_id_card'],
'student_email' => $value['student_email'],
'student_sex' => $value['student_sex'],
'student_price' => $value['student_price'],
'student_brithday' => $newformat,
'product_type' => $value['product_type_guid'],
'product_guid' => $value['product_guid'],
'product_parts_guid' => $value['product_parts_guid'],
'student_img' => $value['student_img'],
'student_banner_img' => $value['student_banner_img'],
'student_intro' => $value['student_intro'],
'student_location' => $value['student_location'],
'longitude' => $value['longitude'],
'latitude' => $value['latitude'],
'student_membe_type' => $value['student_membe_type'],
'student_member_begin_time' => $value['student_member_begin_time'],
'student_member_end_time' => $value['student_member_end_time'],
'student_audit_status' => $value['student_audit_status'],
'student_audit_user_guid' => $value['student_audit_user_guid'],
]);
}
/**
* 导入学生
*/
public static function ImportStudent($file)
{
$error = [];
Db::startTrans();
try {
$excel = new Excel($file);
$data = $excel->parseExcel(
[
[
'title' => '学生名称',
'validate' => 'require',
'field' => 'student_name',
], [
'title' => '用户',
'validate' => 'require',
'field' => 'user_name',
], [
'title' => '班级',
'validate' => 'require',
'field' => 'classes_name',
], [
'title' => '手机号',
'validate' => 'require',
'field' => 'studnet_phone',
], [
'title' => '身份证号',
'validate' => 'require',
'field' => 'student_id_card',
], [
'title' => '邮箱',
'validate' => 'require',
'field' => 'student_email',
], [
'title' => '性别',
'validate' => 'require',
'field' => 'student_sex',
], [
'title' => '学生价格',
'validate' => 'require',
'field' => 'student_price',
], [
'title' => '生日',
'validate' => 'require',
'field' => 'student_brithday',
], [
'title' => '产品类型',
'validate' => 'require',
'field' => 'product_type_name',
], [
'title' => '产品',
'validate' => 'require',
'field' => 'product_name',
], [
'title' => '产品零件',
'validate' => 'require',
'field' => 'product_parts_name',
], [
'title' => '头像',
'validate' => 'require',
'field' => 'student_img',
], [
'title' => '轮播图片',
'validate' => 'require',
'field' => 'student_banner_img',
], [
'title' => '简介',
'validate' => 'require',
'field' => 'student_intro',
], [
'title' => '家庭住址',
'validate' => 'require',
'field' => 'student_location',
], [
'title' => '会员类型',
'validate' => 'require',
'field' => 'student_membe_type',
],
// [
// 'title' => '会员开始时间',
// 'validate' => 'require',
// 'field' => 'student_member_begin_time',
// ], [
// 'title' => '会员结束时间',
// 'validate' => 'require',
// 'field' => 'student_member_end_time',
// ],
],
[
'titleLine' => [1]
]
);
if (!$data) throwErrorMsg('excel无数据', 1);
$error = [];
foreach ($data as $line => $value) {
try {
$model = self::ImportStudentInit($value);
$error[] = "{$line} 学生:【{$value['student_name']}】<span style='color:#27af49'>新增成功!</span><br>";
} catch (\Throwable $th) {
$error[] = "{$line} 学生:【{$value['student_name']}】<span style='color:red'>{$th->getMessage()}</span><br>";
}
}
Db::commit();
return implode(', ', $error);
} catch (\Throwable $th) {
Db::rollback();
throw $th;
}
return $error;
}
/**
* 导出学生
*/
public static function exportStudent()
{
$select = self::alias('a')
->field([
'a.student_name',
'b.user_name',
'f.classes_name',
'a.studnet_phone',
'a.student_id_card',
'a.student_email',
'a.student_sex',
'a.student_price',
'a.student_brithday',
'c.product_type_name',
'd.product_name',
'e.product_parts_name',
'a.student_img',
'a.student_banner_img',
'a.student_attachment',
'a.student_location',
'a.student_membe_type',
'a.student_member_begin_time',
'a.student_member_end_time',
'a.student_audit_status',
"(SELECT `user`.`user_name` FROM `user` WHERE `user`.user_guid = `a`.`student_audit_user_guid`) as student_audit_user_name",
])
->leftjoin('user b', 'a.user_guid = b.user_guid')
->leftjoin('product_type c', 'a.product_type = c.product_type_guid')
->leftjoin('product d', 'a.product_guid = d.product_guid')
->leftjoin('product_parts e', 'a.product_parts_guid = e.product_parts_guid')
->leftjoin('classes f', 'a.classes_guid = f.classes_guid')
->order('student_update_time', 'desc')->select();
$data = [[
'学生名称',
'用户',
'班级',
'手机号',
'身份证号',
'邮箱',
'性别',
'学生价格',
'生日',
'产品类型',
'产品',
'产品零件',
'头像',
'轮播图片',
'家庭住址',
'会员类型',
'会员开始时间',
'会员结束时间',
'审核状态',
'审核人'
]];
foreach ($select as $key => $val) {
$sex_arr = [1 => "", 2 => ""];
$member_arr = [1 => "季卡", 2 => "年卡"];
$audit_arr = [1 => "未审核", 2 => "已审核", 3 => "未通过"];
$val['student_sex'] = $sex_arr[$val['student_sex']];
$val['student_membe_type'] = $member_arr[$val['student_membe_type']];
$val['student_audit_status'] = $audit_arr[$val['student_audit_status']];
$val['student_img'] = Excel::ExportImgFiled($val['student_img']);
$val['student_banner_img'] = Excel::ExportImgFiled($val['student_banner_img']);
$data[] = [
$val['student_name'],
$val['user_name'],
$val['classes_name'],
$val['studnet_phone'],
$val['student_id_card'],
$val['student_email'],
$val['student_sex'],
$val['student_price'],
$val['student_brithday'],
$val['product_type_name'],
$val['product_name'],
$val['product_parts_name'],
$val['student_img'],
$val['student_banner_img'],
$val['student_location'],
$val['student_membe_type'],
$val['student_member_begin_time'],
$val['student_member_end_time'],
$val['student_audit_status'],
$val['student_audit_user_name'],
];
}
$excel = (new Excel())->exporTsheet($data);
$excel->save('学生.xlsx');
}
/**
* 新增学生服务
*/
public static function addStudentService($student_guid, $params): void
{
$student_service_arr = $params['student_service'];
foreach ($student_service_arr as $key => $item) {
Db::startTrans();
try {
$add_data = [
'student_guid' => $student_guid,
'student_service_name' => $item['service_name'],
'student_service_price' => $item['service_price'],
];
$student_service = ModelStudentService::create($add_data);
Db::commit();
} catch (\Throwable $th) {
Db::rollback();
throw $th;
}
}
}
/**
* 编辑学生服务
*/
public static function editStudentService($params): void
{
// 从学生服务(副表)查询出所有当前学生的服务,进行删除
ModelStudentService::where('student_guid', $params['student_guid'])->select()->delete();
// 再把传值的数据,写入副表
$student_service_arr = $params['student_service'];
foreach ($student_service_arr as $key => $item) {
Db::startTrans();
try {
$add_data = [
'student_guid' => $params['student_guid'],
'student_service_name' => $item['service_name'],
'student_service_price' => $item['service_price'],
];
ModelStudentService::create($add_data);
Db::commit();
} catch (\Throwable $th) {
Db::rollback();
throw $th;
}
}
}
/**
* 会员时间获取器
*/
public function getStudentMemberTimeAttr($value, $data)
{
$student_member_time = [];
array_push($student_member_time, $data['student_member_begin_time']);
array_push($student_member_time, $data['student_member_end_time']);
return $student_member_time;
}
/**
* 学生服务获取器
*/
public function getStudentServiceAttr($value, $data)
{
$studnet_guid = $data['student_guid'];
$studetn_service = ModelStudentService::field([
'student_service_guid',
'student_service_name' => 'service_name',
'student_service_price' => 'service_price',
])->where('student_guid', $studnet_guid)->select();
return $studetn_service;
}
}