IndexController.php 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445
  1. <?php
  2. namespace App\Http\Controllers\Admin\Flow;
  3. use App\Exports\BasicExport;
  4. use App\Http\Controllers\Controller;
  5. use App\Http\Models\FlowInfo;
  6. use App\Http\Models\FlowInfoTpl;
  7. use App\Http\Models\FlowStage;
  8. use App\Http\Models\FlowStageTpl;
  9. use App\Http\Models\Role;
  10. use App\Http\Models\Site;
  11. use App\Http\Models\SiteProcess;
  12. use App\Http\Models\User;
  13. use Illuminate\Http\Request;
  14. use Illuminate\Support\Facades\DB;
  15. /**
  16. * 项目管理 详情下 新版流程
  17. * Class IndexController
  18. * @package App\Http\Controllers\Admin\Flow
  19. */
  20. class IndexController extends Controller
  21. {
  22. public function index($siteId)
  23. {
  24. $stageList = FlowStage::query()->where(['site_id' => $siteId])
  25. ->with('infoList')->orderBy('sort')->get();
  26. foreach ($stageList as $item) {
  27. if ($item->expected_date) {
  28. $item->expected_date = date('Y-m-d', strtotime($item->expected_date));
  29. }
  30. if ($item->complete_date) {
  31. $item->complete_date = date('Y-m-d', strtotime($item->complete_date));
  32. }
  33. $item->extension = explode(',', $item->extension);
  34. }
  35. $roleScope = array_keys(FlowInfoTpl::RoleScope);
  36. unset($roleScope[1]); //删除客户
  37. $userList = User::query()->select(['id', 'nickname', 'role_id'])->whereIn('role_id', $roleScope)
  38. ->get()->toArray();
  39. $site = Site::query()->select(['cn_title'])->find($siteId);
  40. $userList[] = ['id' => -1, 'role_id' => -1, 'nickname' => $site->cn_title ?? '站点名称'];
  41. $deploy = SiteProcess::query()->where([['process_id', '=', 7], ['active', '=', 2], ['site_id', '=', $siteId]])->whereNotNull('deploy')->value('deploy');
  42. return view('admin.flow.index', [
  43. 'siteId' => $siteId,
  44. 'stageList' => $stageList,
  45. 'userList' => $userList,
  46. 'authUser' => auth()->user(),
  47. 'domain' => $deploy['domain'] ?? '',
  48. ]);
  49. }
  50. //流程保存
  51. public function flowSave(Request $request, $siteId)
  52. {
  53. $dataList = $request->input('dataList') ?? [];
  54. $where = ['site_id' => $siteId];
  55. $stepIds = array_column($dataList, 'step_id');
  56. $stageIds = FlowStage::query()->where($where)->pluck('id')->toArray();
  57. $delIds = array_diff($stageIds, $stepIds);
  58. if ($delIds) {
  59. FlowStage::query()->where($where)->whereIn('id', $delIds)->delete();
  60. }
  61. $stageTplList = FlowInfoTpl::query()->get();
  62. $mapInfoIds = FlowInfo::query()->select(['id', 'stage_id'])->where($where)->get()->groupBy('stage_id')->toArray();
  63. $reqInfoList = [];
  64. foreach ($dataList as $item) {
  65. foreach ($item['children'] as $v) {
  66. $reqInfoList[] = [
  67. 'except_range_date' => $v['except_range_date'],
  68. 'info_id' => $v['info_id'] ?? 0,
  69. 'step_id' => $item['step_id'],
  70. 'step_title' => $item['step_title'],
  71. ];
  72. }
  73. }
  74. $scopeInfoList = FlowInfo::query()->selectRaw('id,except_range_date')->get();
  75. $modifyInfo = [
  76. 'info_id' => 0,
  77. 'except_range_date' => null,
  78. 'step_title' => '',
  79. ];
  80. foreach ($reqInfoList as $item) {
  81. foreach ($scopeInfoList as $v) {
  82. if ($item['info_id'] == $v->id && !empty($item['except_range_date']) && ($item['except_range_date'] != $v->except_range_date)) {
  83. $modifyInfo = [
  84. 'info_id' => $item['info_id'],
  85. 'except_range_date' => $item['except_range_date'],
  86. 'step_title' => $item['step_title'],
  87. ];
  88. break;
  89. }
  90. }
  91. }
  92. $isUpdate = false;
  93. $nextDate = null;
  94. $stageExcept = [
  95. 'collect' => null,
  96. 'schema' => null,
  97. 'homepage' => null,
  98. 'insidePage' => null,
  99. 'wholeOffer' => null,
  100. 'testSite' => null,
  101. 'keyword' => null,
  102. 'seo' => null,
  103. 'online' => null
  104. ];
  105. foreach ($dataList as $step) {
  106. $stepChildren = $step['children'] ?? [];
  107. if (!empty($step['extension'])) {
  108. $extension = implode(',', $step['extension']);
  109. } else {
  110. $extension = '';
  111. }
  112. if (empty($step['step_id'])) {
  113. $stage = FlowStage::query()->create([
  114. 'title' => $step['step_title'],
  115. 'expected_date' => $step['expected_date'],
  116. 'complete_date' => $step['complete_date'],
  117. 'extension' => $extension,
  118. 'site_id' => $siteId,
  119. 'sort' => $this->getStageSort($stageTplList, $step['step_title'])
  120. ]);
  121. foreach ($stepChildren as $item) {
  122. FlowInfo::query()->create([
  123. 'site_id' => $siteId,
  124. 'stage_id' => $stage->id,
  125. 'except_range_date' => $item['except_range_date'],
  126. 'detail_list' => ($item['children'] ?? []),
  127. ]);
  128. }
  129. } else {
  130. $infoIds = array_column($mapInfoIds[$step['step_id']] ?? [], 'id');
  131. $dataInfoIds = array_column($stepChildren, 'info_id');
  132. $infoDelIds = array_diff($infoIds, $dataInfoIds);
  133. if ($infoIds) {
  134. FlowInfo::query()->where($where)->whereIn('id', $infoDelIds)->delete();
  135. }
  136. $updateData = [
  137. 'title' => $step['step_title'],
  138. 'expected_date' => $step['expected_date'],
  139. 'complete_date' => $step['complete_date'],
  140. 'extension' => $extension,
  141. ];
  142. FlowStage::query()->where(['id' => $step['step_id']])->update($updateData);
  143. foreach ($stepChildren as $item) {
  144. if (empty($item['info_id'])) {
  145. FlowInfo::query()->create([
  146. 'site_id' => $siteId,
  147. 'stage_id' => $step['step_id'],
  148. 'except_range_date' => $item['except_range_date'],
  149. 'detail_list' => ($item['children'] ?? []),
  150. ]);
  151. } else {
  152. $exceptDate = $item['except_range_date'];
  153. // $exceptDate = null;
  154. if ($step['step_title'] == "项目资料搜集") {
  155. $stageExcept['collect'] = $item['except_range_date'];
  156. }
  157. if ($step['step_title'] == "网站架构" && $stageExcept['collect']) {
  158. if ($isUpdate) {
  159. $exceptDate = $stageExcept['schema'] = date('Y-m-d', strtotime('+1 week', strtotime($stageExcept['collect'])));
  160. } else {
  161. $stageExcept['schema'] = $item['except_range_date'];
  162. }
  163. }
  164. if ($step['step_title'] == "首页设计" && $stageExcept['schema']) {
  165. if ($isUpdate) {
  166. $exceptDate = $stageExcept['homepage'] = date('Y-m-d', strtotime('+1 week', strtotime($stageExcept['schema'])));
  167. } else {
  168. $stageExcept['homepage'] = $item['except_range_date'];
  169. }
  170. }
  171. if ($step['step_title'] == "内页设计" && $stageExcept['homepage']) {
  172. if ($isUpdate) {
  173. $exceptDate = $stageExcept['insidePage'] = date('Y-m-d', strtotime('+1 week', strtotime($stageExcept['homepage'])));
  174. } else {
  175. $stageExcept['insidePage'] = $item['except_range_date'];
  176. }
  177. // dd($exceptDate);
  178. }
  179. if ($step['step_title'] == "整站资料提供" && $stageExcept['schema']) {
  180. if ($isUpdate) {
  181. $exceptDate = $stageExcept['wholeOffer'] = date('Y-m-d', strtotime('+4 week', strtotime($stageExcept['schema'])));
  182. } else {
  183. $stageExcept['wholeOffer'] = $item['except_range_date'];
  184. }
  185. }
  186. if ($step['step_title'] == "测试站" && $stageExcept['insidePage']) {
  187. if ($isUpdate) {
  188. $exceptDate = $stageExcept['testSite'] = date('Y-m-d', strtotime('+4 week', strtotime($stageExcept['insidePage'])));
  189. } else {
  190. $stageExcept['testSite'] = $item['except_range_date'];
  191. }
  192. }
  193. if ($step['step_title'] == "关键词" && $stageExcept['insidePage']) {
  194. if ($isUpdate) {
  195. $exceptDate = $stageExcept['keyword'] = date('Y-m-d', strtotime('+4 week', strtotime($stageExcept['insidePage'])));
  196. } else {
  197. $stageExcept['keyword'] = $item['except_range_date'];
  198. }
  199. }
  200. if ($step['step_title'] == "SEO完善" && $stageExcept['testSite']) {
  201. if ($isUpdate) {
  202. $exceptDate = $stageExcept['seo'] = date('Y-m-d', strtotime('+1 week', strtotime($stageExcept['testSite'])));
  203. } else {
  204. $stageExcept['seo'] = $item['except_range_date'];
  205. }
  206. }
  207. if ($step['step_title'] == "上线" && $stageExcept['seo']) {
  208. if ($isUpdate) {
  209. $exceptDate = $stageExcept['online'] = date('Y-m-d', strtotime('+1 week', strtotime($stageExcept['seo'])));
  210. } else {
  211. $stageExcept['online'] = $item['except_range_date'];
  212. }
  213. }
  214. // if ($isUpdate) {
  215. // $exceptDate= $nextDate = $this->computeDate($step['step_title'], $nextDate);
  216. // }
  217. if ($item['info_id'] == $modifyInfo['info_id']) {
  218. //
  219. $exceptDate = $nextDate = $modifyInfo['except_range_date'];//一定有值
  220. $isUpdate = true;
  221. }
  222. FlowInfo::query()->where(['id' => $item['info_id']])->update([
  223. 'except_range_date' => $exceptDate,
  224. 'detail_list' => json_encode($item['children'] ?? []),
  225. ]);
  226. }
  227. }
  228. }
  229. }
  230. return response()->json(['message' => '操作成功']);
  231. }
  232. //流程清空
  233. public function flowClear($siteId)
  234. {
  235. FlowStage::query()->where(['site_id' => $siteId])->delete();
  236. FlowInfo::query()->where(['site_id' => $siteId])->delete();
  237. }
  238. //初始化流程
  239. public function initFlow($siteId)
  240. {
  241. $site = Site::query()->select(['created_at'])->find($siteId);
  242. if (!$site) {
  243. return response()->json(['message' => '站点信息不存在'], 400);
  244. }
  245. $site = $site->toArray();
  246. $stageTplList = FlowStageTpl::query()->with('infoTplList')->get();
  247. if (FlowStage::query()->where(['site_id' => $siteId])->exists()) {
  248. return response()->json(['message' => '流程已初始化'], 400);
  249. }
  250. $userIds = DB::table('user_has_sites')->where(['site_id' => $siteId])->pluck('user_id')->toArray();
  251. $userList = User::query()->select(['id', 'role_id'])->whereIn('id', $userIds)->get()->toArray();
  252. $datetime = date('Y-m-d H:i:s');
  253. $stageExcept = [
  254. 'collect' => null,
  255. 'schema' => null,
  256. 'homepage' => null,
  257. 'insidePage' => null,
  258. 'wholeOffer' => null,
  259. 'testSite' => null,
  260. 'keyword' => null,
  261. 'seo' => null,
  262. 'online' => null
  263. ];
  264. foreach ($stageTplList as $item) {
  265. $stage = FlowStage::query()->create([
  266. 'sort' => $item->sort,
  267. 'title' => $item->title,
  268. 'site_id' => $siteId,
  269. ]);
  270. $insertData = [];
  271. foreach ($item->infoTplList as $info) {
  272. $detailList = $info->detail_list;
  273. foreach ($detailList as &$detail) {
  274. $duty_man = $detail['duty_man'] ?? [];
  275. $detail['duty_user'] = $this->getUserIdsByRoleIds($userList, $duty_man);
  276. }
  277. $exceptDate = null;
  278. if ($item->title == "项目资料搜集") {
  279. $exceptDate = $stageExcept['collect'] = date('Y-m-d', strtotime($site['created_at']));
  280. }
  281. if ($item->title == "网站架构" && $stageExcept['collect']) {
  282. $exceptDate = $stageExcept['schema'] = date('Y-m-d', strtotime('+1 week', strtotime($stageExcept['collect'])));
  283. }
  284. if ($item->title == "首页设计" && $stageExcept['schema']) {
  285. $exceptDate = $stageExcept['homepage'] = date('Y-m-d', strtotime('+1 week', strtotime($stageExcept['schema'])));
  286. }
  287. if ($item->title == "内页设计" && $stageExcept['homepage']) {
  288. $exceptDate = $stageExcept['insidePage'] = date('Y-m-d', strtotime('+1 week', strtotime($stageExcept['homepage'])));
  289. }
  290. if ($item->title == "整站资料提供" && $stageExcept['schema']) {
  291. $exceptDate = $stageExcept['wholeOffer'] = date('Y-m-d', strtotime('+4 week', strtotime($stageExcept['schema'])));
  292. }
  293. if ($item->title == "测试站" && $stageExcept['insidePage']) {
  294. $exceptDate = $stageExcept['testSite'] = date('Y-m-d', strtotime('+4 week', strtotime($stageExcept['insidePage'])));
  295. }
  296. if ($item->title == "关键词" && $stageExcept['insidePage']) {
  297. $exceptDate = $stageExcept['keyword'] = date('Y-m-d', strtotime('+4 week', strtotime($stageExcept['insidePage'])));
  298. }
  299. if ($item->title == "SEO完善" && $stageExcept['testSite']) {
  300. $exceptDate = $stageExcept['seo'] = date('Y-m-d', strtotime('+1 week', strtotime($stageExcept['testSite'])));
  301. }
  302. if ($item->title == "上线" && $stageExcept['seo']) {
  303. $exceptDate = $stageExcept['online'] = date('Y-m-d', strtotime('+1 week', strtotime($stageExcept['seo'])));
  304. }
  305. $insertData[] = [
  306. 'site_id' => $siteId,
  307. 'stage_id' => $stage->id,
  308. 'detail_list' => json_encode(array_values($detailList)),
  309. 'except_range_date' => $exceptDate,
  310. 'created_at' => $datetime,
  311. 'updated_at' => $datetime,
  312. ];
  313. }
  314. FlowInfo::query()->insert($insertData);
  315. }
  316. return response()->json(['message' => '操作成功']);
  317. }
  318. public function getStageSort($stageTpl, $stageTitle)
  319. {
  320. foreach ($stageTpl as $item) {
  321. if ($item->title === $stageTitle) {
  322. return $item->sort;
  323. }
  324. }
  325. return 0;
  326. }
  327. private function computeDate($stepTitle, $prevDate)
  328. {
  329. $preTime = strtotime($prevDate);
  330. if ($stepTitle == "项目资料搜集") {
  331. return $prevDate;
  332. }
  333. if ($stepTitle == "网站架构") {
  334. return date('Y-m-d', strtotime('+1 week', $preTime));
  335. }
  336. if ($stepTitle == "首页设计") {
  337. return date('Y-m-d', strtotime('+1 week', $preTime));
  338. }
  339. if ($stepTitle == "内页设计") {
  340. return date('Y-m-d', strtotime('+1 week', $preTime));
  341. }
  342. if ($stepTitle == "整站资料提供") {
  343. return date('Y-m-d', strtotime('+2 week', $preTime));
  344. }
  345. if ($stepTitle == "测试站") {
  346. return date('Y-m-d', strtotime('+4 week', $preTime));
  347. }
  348. if ($stepTitle == "关键词") {
  349. return date('Y-m-d', strtotime('+0 week', $preTime));
  350. }
  351. if ($stepTitle == "SEO完善") {
  352. return date('Y-m-d', strtotime('+1 week', $preTime));
  353. }
  354. if ($stepTitle == "上线") {
  355. return date('Y-m-d', strtotime('+1 week', $preTime));
  356. }
  357. return null;
  358. }
  359. protected function getUserIdsByRoleIds(&$scopes, $roleIds)
  360. {
  361. $userIds = [];
  362. foreach ($scopes as $scope) {
  363. if (in_array($scope['role_id'], $roleIds)) {
  364. $userIds[] = $scope['id'];
  365. }
  366. }
  367. if (in_array(-1, $roleIds)) {
  368. $userIds[] = -1;
  369. }
  370. return $userIds;
  371. }
  372. }