SmartScreenMore.php 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518
  1. <?php
  2. namespace app\sys\controller;
  3. use app\model\ConstructionStep;
  4. use app\model\Employee;
  5. use app\model\Org;
  6. use app\model\SmartScreenConstruction;
  7. use app\model\SmartScreenImportLog;
  8. use app\model\SmartScreenProject;
  9. use app\model\SmartScreenProjectCate;
  10. use cutExcel\MyreadFilter;
  11. use PhpOffice\PhpSpreadsheet\IOFactory;
  12. use think\facade\Db;
  13. use think\facade\Log;
  14. use think\facade\Queue;
  15. use think\facade\View;
  16. class SmartScreenMore
  17. {
  18. /**
  19. * 在施工地列表
  20. */
  21. public function construction() {
  22. $root_id = request()->employee['root_id'];
  23. if (!request()->isAjax()) {
  24. $step_list = ConstructionStep::where('root_id', '=', $root_id)->order('order asc')->select()->toArray();
  25. View::assign('step_list', $step_list);
  26. return View::fetch();
  27. }
  28. $param = request()->only(['page'=> 1, 'limit'=> 15, 'keyword'=> '', 'emp_name'=> '', 'status'=> '']);
  29. $model = SmartScreenConstruction::with(['designer', 'employee'])->where([['root_id', '=', $root_id]]);
  30. if (!empty($param['keyword'])){
  31. $where_k = [['owner_name|address', 'like', '%' . $param['keyword'] . '%']];
  32. $model = $model->where($where_k);
  33. }
  34. if (!empty($param['emp_name'])) {
  35. $where_e = [['project_manager|inspection', 'like', '%' . $param['emp_name'] . '%']];
  36. $emp_name = $param['emp_name'];
  37. $designer_org = Org::where([['path', 'like', $root_id . '%'], ['org_type', '=', 2], ['status', '=', 1]])->column('id');
  38. $designer_id = Employee::where([['root_id', '=', $root_id], ['name', 'like', '%' . $param['emp_name'] . '%'], ['state', '=', '在职'], ['org_id', 'in', $designer_org]])->column('id');
  39. $where_d = [['designer_id', 'in', $designer_id]];
  40. if (empty($designer_id)) {
  41. $model = $model->where($where_e);
  42. } else {
  43. $model = $model->where(function ($query) use ($emp_name, $where_d) {
  44. $query->whereOr([[['project_manager', 'like', '%' . $emp_name . '%']], [['inspection', 'like', '%' . $emp_name . '%']], $where_d]);
  45. });
  46. }
  47. }
  48. if (!empty($param['status'])) {
  49. $where_s = [['status', 'like', '%' . $param['status'] . '%']];
  50. $model = $model->where($where_s);
  51. }
  52. $count = $model->count();
  53. $list = $model->order('addtime desc')->page($param['page'], $param['limit'])->select()->toArray();
  54. return json(['code'=> 0, 'data'=> $list, 'count'=> $count]);
  55. }
  56. /**
  57. * 在施工地添加
  58. */
  59. public function construction_add(){
  60. $root_id = request()->employee['root_id'];
  61. if (!request()->isPost()) {
  62. /* $step_list = ConstructionStep::where('root_id', '=', $root_id)->order('order asc')->select()->toArray();
  63. View::assign('step_list', $step_list); */
  64. //设计师获取
  65. $w[] = ['path', 'like', $root_id . '-%'];
  66. $w[] = ['org_type', '=', 2];
  67. $orgs = Org::where($w)->column('id');
  68. $designer = Employee::where([['org_id', 'in', $orgs], ['state', '=', '在职'], ['show', '=', 0]])->field('id,name,initials s')->order('s asc')->select()->toArray();
  69. View::assign('designer', $designer);
  70. return View::fetch();
  71. }
  72. $param = request()->only(['owner_name', 'address', 'designer_id', 'project_manager', 'inspection', 'status']);
  73. $param['employee_id'] = request()->employee['id'];
  74. $param['root_id'] = request()->employee['root_id'];
  75. $result = SmartScreenConstruction::create($param);
  76. if ($result !== false) {
  77. return json(['code'=> 0, 'data'=> [], 'msg'=> '保存成功']);
  78. } else {
  79. return json(['code'=> 1, 'data'=> [], 'msg'=> '保存失败']);
  80. }
  81. }
  82. /**
  83. * 在施工地编辑
  84. */
  85. public function construction_edit(){
  86. $root_id = request()->employee['root_id'];
  87. $id = input('id', '', 'intval');
  88. $info = SmartScreenConstruction::where([['root_id', '=', $root_id], ['id', '=', $id]])->findOrEmpty();
  89. if (!request()->isPost()) {
  90. if (!$info->isEmpty()) {
  91. View::assign('data', $info);
  92. }
  93. View::assign('id', $id);
  94. /* $step_list = ConstructionStep::where('root_id', '=', $root_id)->order('order asc')->select()->toArray();
  95. View::assign('step_list', $step_list); */
  96. //设计师获取
  97. $w[] = ['path', 'like', $root_id . '-%'];
  98. $w[] = ['org_type', '=', 2];
  99. $orgs = Org::where($w)->column('id');
  100. $designer = Employee::where([['org_id', 'in', $orgs], ['state', '=', '在职'], ['show', '=', 0]])->field('id,name,initials s')->order('s asc')->select()->toArray();
  101. View::assign('designer', $designer);
  102. return View::fetch();
  103. }
  104. $param = request()->only(['id', 'owner_name', 'address', 'designer_id', 'project_manager', 'inspection', 'status']);
  105. if ($info->isEmpty()) {
  106. return json(['code'=> 1, 'msg'=> '操作失败']);
  107. }
  108. $result = $info->save($param);
  109. if ($result !== false) {
  110. return json(['code'=> 0, 'data'=> [], 'msg'=> '保存成功']);
  111. } else {
  112. return json(['code'=> 1, 'data'=> [], 'msg'=> '保存失败']);
  113. }
  114. }
  115. /**
  116. * 在施工地删除
  117. */
  118. public function construction_delete() {
  119. $id = input('id', '', 'intval');
  120. $root_id = request()->employee['root_id'];
  121. $result = SmartScreenConstruction::where([['root_id', '=', $root_id], ['id', '=', $id]])->delete();
  122. if ($result !== false) {
  123. return json(['code'=> 0, 'msg'=> '删除成功']);
  124. } else {
  125. return json(['code'=> 1, 'msg'=> '删除失败']);
  126. }
  127. }
  128. /**
  129. * 项目分类添加
  130. */
  131. public function project_cate_add(){
  132. if (!request()->isPost()) {
  133. return View::fetch();
  134. }
  135. $name = input('name', '', 'trim');
  136. $root_id = request()->employee['root_id'];
  137. $employee_id = request()->employee['id'];
  138. $data = [
  139. 'name'=> $name,
  140. 'root_id'=> $root_id,
  141. 'employee_id'=> $employee_id
  142. ];
  143. $result = SmartScreenProjectCate::create($data);
  144. if ($result !== false) {
  145. return json(['code'=> 0, 'msg'=> '添加成功']);
  146. } else {
  147. return json(['code'=> 1, 'msg'=> '添加失败']);
  148. }
  149. }
  150. /**
  151. * 项目分类编辑
  152. */
  153. public function project_cate_edit(){
  154. $id = input('id', '', 'intval');
  155. $root_id = request()->employee['root_id'];
  156. $info = SmartScreenProjectCate::where([['id', '=', $id], ['root_id', '=', $root_id]])->findOrEmpty();
  157. if (!request()->isPost()) {
  158. View::assign('data', $info);
  159. return View::fetch();
  160. }
  161. if($info->isEmpty()){
  162. return json(['code'=> 1, 'msg'=> '编辑失败']);
  163. }
  164. $name = input('name', '', 'trim');
  165. $root_id = request()->employee['root_id'];
  166. $info->name = $name;
  167. $result = $info->save();
  168. if ($result !== false) {
  169. return json(['code'=> 0, 'msg'=> '编辑成功']);
  170. } else {
  171. return json(['code'=> 1, 'msg'=> '编辑失败']);
  172. }
  173. }
  174. /**
  175. * 项目分类删除
  176. */
  177. public function project_cate_delete(){
  178. $id = input('id', '', 'intval');
  179. $root_id = request()->employee['root_id'];
  180. $info = SmartScreenProjectCate::where([['id', '=', $id], ['root_id', '=', $root_id]])->findOrEmpty();
  181. if($info->isEmpty()){
  182. return json(['code'=> 1, 'msg'=> '删除失败']);
  183. }
  184. Db::startTrans();
  185. $result = $info->delete();
  186. $result1 = SmartScreenProject::where([['cate_id', '=', $id]])->delete();
  187. if ($result !== false && $result1 !== false) {
  188. Db::commit();
  189. return json(['code'=> 0, 'msg'=> '删除成功']);
  190. } else {
  191. Db::rollback();
  192. return json(['code'=> 1, 'msg'=> '删除失败']);
  193. }
  194. }
  195. /**
  196. * 项目清单
  197. */
  198. public function project() {
  199. $root_id = request()->employee['root_id'];
  200. if (!request()->isAjax()) {
  201. return View::fetch();
  202. }
  203. $param = request()->only(['page'=> 1, 'limit'=> 15, 'keyword'=> '']);
  204. $where[] = ['root_id', '=', $root_id];
  205. $keyword = $param['keyword'];
  206. $list = SmartScreenProjectCate::with(['project'=> function($query) use ($keyword){
  207. if ($keyword) {
  208. $query->where('name', 'like', '%' . $keyword . '%')->with('employee');
  209. } else {
  210. $query->with('employee');
  211. }
  212. }])->withCount(['project'=> function($query) use ($keyword){
  213. $query->where('name', 'like', '%' . $keyword . '%')->with('employee');
  214. }])->where('root_id', '=', $root_id)->page($param['page'], $param['limit'])->select()->toArray();
  215. $count = SmartScreenProjectCate::where($where)->count();
  216. return json(['code'=> 0, 'data'=> $list, 'count'=> $count]);
  217. }
  218. /**
  219. * 项目清单添加
  220. */
  221. public function project_add(){
  222. $root_id = request()->employee['root_id'];
  223. if (!request()->isPost()) {
  224. $cate_list = SmartScreenProjectCate::where('root_id', '=', $root_id)->select()->toArray();
  225. View::assign('cate_list', $cate_list);
  226. return View::fetch();
  227. }
  228. $param = request()->only(['name', 'category', 'unit', 'price', 'content', 'cate_id']);
  229. $param['employee_id'] = request()->employee['id'];
  230. $param['root_id'] = $root_id;
  231. $result = SmartScreenProject::create($param);
  232. if ($result !== false) {
  233. return json(['code'=> 0, 'data'=> [], 'msg'=> '保存成功']);
  234. } else {
  235. return json(['code'=> 1, 'data'=> [], 'msg'=> '保存失败']);
  236. }
  237. }
  238. /**
  239. * 项目清单编辑
  240. */
  241. public function project_edit(){
  242. $root_id = request()->employee['root_id'];
  243. $id = input('id', '', 'intval');
  244. $info = SmartScreenProject::where([['root_id', '=', $root_id], ['id', '=', $id]])->findOrEmpty();
  245. if (!request()->isPost()) {
  246. if (!$info->isEmpty()) {
  247. View::assign('data', $info);
  248. }
  249. View::assign('id', $id);
  250. $cate_list = SmartScreenProjectCate::where('root_id', '=', $root_id)->select()->toArray();
  251. View::assign('cate_list', $cate_list);
  252. return View::fetch();
  253. }
  254. $param = request()->only(['id', 'name', 'category', 'unit', 'price', 'content', 'cate_id']);
  255. if ($info->isEmpty()) {
  256. return json(['code'=> 1, 'msg'=> '操作失败']);
  257. }
  258. $result = $info->save($param);
  259. if ($result !== false) {
  260. return json(['code'=> 0, 'data'=> [], 'msg'=> '保存成功']);
  261. } else {
  262. return json(['code'=> 1, 'data'=> [], 'msg'=> '保存失败']);
  263. }
  264. }
  265. /**
  266. * 项目清单删除
  267. */
  268. public function project_delete() {
  269. $id = input('id', '', 'intval');
  270. $root_id = request()->employee['root_id'];
  271. $result = SmartScreenProject::where([['root_id', '=', $root_id], ['id', '=', $id]])->delete();
  272. if ($result !== false) {
  273. return json(['code'=> 0, 'msg'=> '删除成功']);
  274. } else {
  275. return json(['code'=> 1, 'msg'=> '删除失败']);
  276. }
  277. }
  278. /**
  279. * 导入前日志存储
  280. */
  281. public function importLog()
  282. {
  283. $type = input('type', 1, 'intval');
  284. if (!request()->isPost()) {
  285. View::assign('type', $type);
  286. return View::fetch();
  287. }
  288. $request = request();
  289. $param = $request->only(['file_name', 'file', 'type']);
  290. $logData = [
  291. 'name' => $param['file_name'],
  292. 'type' => $param['type'],
  293. 'count' => 0,
  294. 'valid_count' => 0,
  295. 'invalid_count' => 0,
  296. 'path'=> $param['file'],
  297. 'employee_id' => $request->employee->id,
  298. 'root_id'=> $request->employee->root_id
  299. ];
  300. $data = SmartScreenImportLog::create($logData);
  301. if ($data == false) {
  302. return json(['code' => 1, 'msg' => '添加失败']);
  303. }
  304. $data->status = 1;
  305. $data->save();
  306. /* $jobHandlerClassName = 'app\jobs\SmartScreenImport';
  307. $jobQueueName = 'smart_screen_import';
  308. $orderData = ['id'=> $data->id, 'type'=> $type]; //这个是需要传到消费者的数据
  309. Queue::later(0, $jobHandlerClassName, $orderData, $jobQueueName); */
  310. json(['code' => 0, 'msg' => '正在导入中,请刷新列表查看'])->send();
  311. // 开始导入
  312. try {
  313. $tmp_file = $_FILES['file']['tmp_name'];
  314. $content = file_get_contents($tmp_file);
  315. if ($content) {
  316. $data->tmp_path = $tmp_file;
  317. $data->save();
  318. //实例化PHPExcel类
  319. $reader = IOFactory::createReader('Xlsx');
  320. if (!$reader->canRead($tmp_file)) {
  321. Log::record('-------screen read error------')->save();
  322. Log::record('file canRead false')->save();
  323. Log::record('-------screen read error------')->save();
  324. } else {
  325. $rows = 100000;
  326. $start_rows = 1;
  327. $end_rows = $start_rows + $rows;
  328. $MyReadFilter = new MyreadFilter($start_rows, $end_rows);
  329. $reader->setReadFilter($MyReadFilter);
  330. $reader->setReadDataOnly(true);
  331. $objPHPExcel = $reader->load($tmp_file);
  332. $sheet = $objPHPExcel->getSheet(0); //excel中的第一张sheet
  333. $highestRow = $sheet->getHighestRow(); // 取得总行数
  334. $highestColumn = $sheet->getHighestColumn(); // 取得总列数
  335. \PhpOffice\PhpSpreadsheet\Cell\Coordinate::columnIndexFromString($highestColumn);
  336. $lines = $highestRow - 1;
  337. $root_id = $request->employee->root_id;
  338. if ($lines > 0) {
  339. $datas = [];
  340. $j = $start_rows + 1;
  341. for ($j; $j <= $highestRow; $j++) {
  342. if ($type == 1) {
  343. $datas[] = [
  344. 'owner_name' => trim($objPHPExcel->getActiveSheet()->getCell("A" . $j)->getValue()),
  345. 'address' => trim($objPHPExcel->getActiveSheet()->getCell("B" . $j)->getValue()),
  346. 'designer' => trim($objPHPExcel->getActiveSheet()->getCell("C" . $j)->getValue()),
  347. 'project_manager' => trim($objPHPExcel->getActiveSheet()->getCell("D" . $j)->getValue()),
  348. 'inspection' => trim($objPHPExcel->getActiveSheet()->getCell("E" . $j)->getValue()),
  349. 'status' => trim($objPHPExcel->getActiveSheet()->getCell("F" . $j)->getValue()),
  350. 'row'=> $j
  351. ];
  352. } elseif ($type == 2) {
  353. $datas[] = [
  354. 'cate' => trim($objPHPExcel->getActiveSheet()->getCell("A" . $j)->getValue()),
  355. 'category' => trim($objPHPExcel->getActiveSheet()->getCell("B" . $j)->getValue()),
  356. 'name' => trim($objPHPExcel->getActiveSheet()->getCell("C" . $j)->getValue()),
  357. 'unit' => trim($objPHPExcel->getActiveSheet()->getCell("D" . $j)->getValue()),
  358. 'price' => trim($objPHPExcel->getActiveSheet()->getCell("E" . $j)->getValue()),
  359. 'content' => trim($objPHPExcel->getActiveSheet()->getCell("F" . $j)->getValue()),
  360. 'row'=> $j
  361. ];
  362. }
  363. }
  364. $cate_list = SmartScreenProjectCate::where('root_id', '=', $root_id)->column('id', 'name');
  365. $save_data = [];
  366. foreach ($datas as $k => $v) {
  367. $one_cus = [];
  368. if ($type == 1) {
  369. $designer_id = 0;
  370. if (!empty($v['designer'])) {
  371. $designer_id = Employee::where([['name', '=', $v['designer']], ['root_id', '=', $root_id]])->value('id');
  372. }
  373. /* $status = 0;
  374. if (!empty($v['status'])) {
  375. $status = ConstructionStep::where([['root_id', '=', $root_id], ['name', '=', $v['status']]])->value('id');
  376. } */
  377. $one_cus['owner_name'] = $v['owner_name'];
  378. $one_cus['address'] = $v['address'];
  379. $one_cus['designer_id'] = $designer_id ? $designer_id : 0;
  380. $one_cus['project_manager'] = $v['project_manager'];
  381. $one_cus['inspection'] = $v['inspection'];
  382. $one_cus['status'] = $v['status'];
  383. $one_cus['employee_id'] = $request->employee->id;
  384. $one_cus['root_id'] = $root_id;
  385. } elseif ($type == 2) {
  386. if (isset($cate_list[$v['cate']])) {
  387. $one_cus['cate_id'] = $cate_list[$v['cate']];
  388. } else {
  389. $new_id = SmartScreenProjectCate::insertGetId(['name'=> $v['cate'], 'root_id'=> $root_id, 'employee_id'=> $request->employee->id]);
  390. $cate_list[$v['cate']] = $new_id;
  391. $one_cus['cate_id'] = $new_id;
  392. }
  393. $one_cus['category'] = $v['category'];
  394. $one_cus['name'] = $v['name'];
  395. $one_cus['unit'] = $v['unit'];
  396. $one_cus['price'] = $v['price'];
  397. $one_cus['content'] = $v['content'];
  398. $one_cus['employee_id'] = $request->employee->id;
  399. $one_cus['root_id'] = $root_id;
  400. }
  401. $save_data[] = $one_cus;
  402. }
  403. Db::startTrans();
  404. try {
  405. foreach ($save_data as $k => $v) {
  406. if ($type == 1) {
  407. $result = SmartScreenConstruction::create($v);
  408. } elseif ($type == 2) {
  409. SmartScreenProject::create($v);
  410. }
  411. }
  412. Db::commit();
  413. } catch (\Exception $e) {
  414. trace($e->getMessage(), 'error');
  415. // 回滚事务
  416. Db::rollback();
  417. }
  418. $data->status = 2;
  419. $data->count = count($datas);
  420. $data->valid_count = count($datas);
  421. $data->execute_rows = $highestRow;
  422. $data->tmp_path = '';
  423. $data->save();
  424. } else {
  425. $data->tmp_path = '';
  426. $data->status = 2;
  427. $data->save();
  428. }
  429. }
  430. } else {
  431. Log::record('-------screen content empty error------')->save();
  432. Log::record('content empty')->save();
  433. Log::record('-------screen content empty error------')->save();
  434. }
  435. } catch (\Exception $e) {
  436. Log::record('-------screen import error------')->save();
  437. Log::record('content error')->save();
  438. Log::record('-------screen import error------')->save();
  439. }
  440. die;
  441. }
  442. }