FilesManager.php 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. <?php
  2. namespace App\Models;
  3. use Illuminate\Database\Eloquent\Factories\HasFactory;
  4. use Illuminate\Database\Eloquent\Model;
  5. use PhpOffice\PhpSpreadsheet\IOFactory;
  6. /**
  7. * 文件上传记录
  8. *
  9. */
  10. class FilesManager extends Model
  11. {
  12. use HasFactory;
  13. // 与模型关联的表名
  14. protected $table = 'files_manager';
  15. // 是否主动维护时间戳
  16. public $timestamps = false;
  17. protected $connection = 'company';
  18. // 定义时间戳字段名
  19. // const CREATED_AT = 'insert_time';
  20. // const UPDATED_AT = 'update_time';
  21. /**
  22. * 添加数据
  23. *
  24. */
  25. public function add($data)
  26. {
  27. // 时间
  28. $data['insert_time'] = time();
  29. $data['update_time'] = time();
  30. // 写入数据表
  31. $id = $this->query()->insertGetId($data);
  32. // 返回结果
  33. return $id;
  34. }
  35. /**
  36. * 修改数据
  37. *
  38. */
  39. public function edit($id, $data)
  40. {
  41. // 更新时间
  42. $data['update_time'] = time();
  43. // 写入数据表
  44. $result = $this->query()->where(['id' => $id])->update($data);
  45. // 返回结果
  46. return $result;
  47. }
  48. /**
  49. * 文件上传到cos
  50. *
  51. * @param \Illuminate\Http\UploadedFile $file 文件对象
  52. *
  53. * @return Array $result 返回结果
  54. * string $file_path 文件路径
  55. * int $file_size 文件大小
  56. * string $file_name 文件名称
  57. * string $file_md5 文件Md5
  58. */
  59. public function fileStore($file, $path = 'company/license/')
  60. {
  61. // 请指定路径
  62. if (!$path) return ['error' => '请指定存储路径'];
  63. // 组装
  64. $path = trim($path, '/') . '/';
  65. // 判断文件是否有问题
  66. if (!is_object($file)) return ['error' => '文件上传失败,请重试'];
  67. // md5
  68. $fileMd5 = md5_file($file->getPathName());
  69. // 通过文件MD5查询是否已经存在
  70. $data = $this->getOneByMd5($fileMd5);
  71. // 如果存在,直接返回
  72. if ($data) return $data;
  73. // 文件名
  74. $filename = html_entity_decode(ltrim($file->getClientOriginalName(), '/'), ENT_QUOTES, 'UTF-8');
  75. // // 文件名仅支持字母数字中文-_组合
  76. // if (!preg_match('/^[\x{4e00}-\x{9fa5}A-Za-z0-9_\-\+\.\(\)(\x20)]+$/u', $filename)) return ['error' => $filename . '文件名仅支持字母数字中文空格-_组合'];
  77. // 文件大小
  78. $ext = pathinfo($file->getClientOriginalName(),PATHINFO_EXTENSION);
  79. // 文件名
  80. $filename = md5($filename).'.'.$ext;
  81. // 文件大小
  82. $size = $file->getSize();
  83. // 保存文件
  84. $objectPath = $file->move(public_path('uploads/' . $path), $filename);
  85. // 如果有错误
  86. if (!$objectPath) return ['error' => $file->getError()];
  87. // 保存路径
  88. $data = ['file_path' => $path . $filename, 'file_size' => $size, 'file_name' => $filename, 'file_md5' => $fileMd5];
  89. // 写入数据库
  90. $data['file_id'] = $this->add($data);
  91. // 移动失败
  92. if (!$data['file_id']) return ['error' => '存储失败'];
  93. // 返回结果
  94. return $data;
  95. }
  96. /**
  97. * 通过md5值获取文件信息
  98. *
  99. * @param String $fileMd5 文件Md5值
  100. * @param String $$field 指定获取字段名称
  101. *
  102. */
  103. public function getOneByMd5($fileMd5, $field = '')
  104. {
  105. // 获取数据
  106. $data = $this->where([['file_md5', '=', $fileMd5]])->first(['id as file_id', 'file_name', 'file_path', 'file_md5', 'file_size']);
  107. // 如果
  108. $data = $data ? $data->toArray() : [];
  109. // 是否获取字段
  110. return empty($field) ? $data : (isset($data[$field]) ? $data[$field] : null);
  111. }
  112. /**
  113. * 从Excel获取客户信息
  114. *
  115. * @param \Illuminate\Http\UploadedFile $file 传入的文件
  116. *
  117. */
  118. public function excelToUserPackage($file)
  119. {
  120. // 获取文件后缀名
  121. $ext = pathinfo($file->getClientOriginalName(), PATHINFO_EXTENSION);
  122. // 验证文件格式
  123. if (!in_array($ext, ['csv', 'xlsx', 'xls'])) return ['error' => '请上传Excel'];
  124. // 读取文件
  125. $reader = IOFactory::createReader(ucwords($ext))->load($file->getPathname());
  126. // 提取数据
  127. $sheetList = $reader->getActiveSheet()->toArray('');
  128. // 表格列标题
  129. $column = array_shift($sheetList);
  130. // 列标题换字段
  131. $column = $this->userPackageToField($column);
  132. // 字段值
  133. if( !$column ) return ['error' => '请检查内容表头格式'];
  134. // 循环表格数据
  135. foreach ($sheetList as $row=>$value) {
  136. // 获取对应的数据
  137. //$custom = [];
  138. $userPackage = [];
  139. // 循环每个字段,获取值
  140. foreach ($value as $kk => $vv) {
  141. // 根据字段索引获取对应的值,转存到客户信息
  142. if( isset($column[$kk]) ) $userPackage[$column[$kk]] = $vv;
  143. }
  144. // 验证必须数据
  145. if( empty($userPackage['extid']) ) return ['error' => '第'.($row + 1).'行 没有识别到企业用户ID'];
  146. //if( empty($userPackage['phone']) ) return ['error' => '第'.($row + 1).'行 没有识别到用户手机号'];
  147. if (!empty($userPackage['phone'])) {
  148. //验证手机号格式是否正确
  149. if (!preg_match("/^1[3456789]{1}\d{9}$/", $userPackage['phone'])) {
  150. return ['error' => '第'. ($row + 1) . '行 用户手机号格式不正确!'];
  151. }
  152. }
  153. if( empty($userPackage['userid']) ) return ['error' => '第'.($row + 1).'行 没有识别到企业成员ID'];
  154. // 追加到人群包列表
  155. $sheetList[$row] = $userPackage;
  156. }
  157. // 返回结果
  158. return $sheetList;
  159. }
  160. /**
  161. * 获取列对应的数据库字段名
  162. *
  163. */
  164. private function userPackageToField($column)
  165. {
  166. // 字段值
  167. $field = [];
  168. // 循环列标题
  169. foreach ($column as $key => $value) {
  170. if( $value == '企业用户ID') $field[$key] = 'extid';
  171. if( $value == '用户手机号' ) $field[$key] = 'phone';
  172. if( $value == '企业成员ID' ) $field[$key] = 'userid';
  173. }
  174. // 返回字段值
  175. return $field;
  176. }
  177. }