ViolationProductJobs.php 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436
  1. <?php
  2. namespace App\Jobs\Manager\CollectData\Backfill;
  3. use Illuminate\Bus\Queueable;
  4. use Illuminate\Contracts\Queue\ShouldBeUnique;
  5. use Illuminate\Contracts\Queue\ShouldQueue;
  6. use Illuminate\Foundation\Bus\Dispatchable;
  7. use Illuminate\Queue\InteractsWithQueue;
  8. use Illuminate\Queue\SerializesModels;
  9. use App\Models\Manager\Process\ViolationProduct as ViolationProductModel;
  10. use App\Models\Manager\WashConfig\ViolationStore as ViolationStoreModel;
  11. use App\Models\Manager\Personnel\EmployeeArea as EmployeeAreaModel;
  12. use App\Models\Manager\Personnel\Employee as EmployeeModel;
  13. use App\Models\Manager\WashConfig\ViolationCompany as ViolationCompanyModel;
  14. use App\Models\Manager\WashConfig\ViolationCompanyMember as ViolationCompanyMemberModel;
  15. use App\Models\Manager\Process\ViolationProductMember as ViolationProductMemberModel;
  16. use App\Models\Manager\Personnel\EmployeePlatform as EmployeePlatformModel;
  17. use Illuminate\Support\Facades\DB;
  18. use App\Facades\Servers\Logs\Log;
  19. /**
  20. * 禁止商品数据数据清洗-回填责任人
  21. * @author: 唐远望
  22. * @version: 1.0
  23. * @date: 2026-05-22
  24. */
  25. class ViolationProductJobs implements ShouldQueue
  26. {
  27. use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
  28. public $tries = 3; // 限制重试次数
  29. public $timeout = 600; // 10分钟超时
  30. protected $message_data;
  31. /**
  32. * Create a new job instance.
  33. *
  34. * @return void
  35. */
  36. public function __construct(array $message_data)
  37. {
  38. $this->message_data = $message_data;
  39. }
  40. /**
  41. * Execute the job.
  42. *
  43. * @return void
  44. */
  45. public function handle()
  46. {
  47. $ViolationProductModel = new ViolationProductModel();
  48. $company_id = $this->message_data['company_id'];
  49. $map = [];
  50. $map[] = ['merge_city_id', '!=', '0'];
  51. $map[] = ['first_responsible_person', '=', ''];
  52. $map[] = ['responsible_person', '=', ''];
  53. $map[] = ['source_responsible_person', '=', ''];
  54. $map[] = ['company_id', '=', $company_id];
  55. $page = isset($this->message_data['page']) ? $this->message_data['page'] : 1;
  56. $limit = isset($this->message_data['limit']) ? $this->message_data['limit'] : 10;
  57. DB::beginTransaction();
  58. try {
  59. $result = $ViolationProductModel->where($map)->orderByDesc('id')->orderByDesc('id')->paginate($limit, ['*'], 'page', $page)->toarray();
  60. $select_product_datas = $result['data'];
  61. $last_page = $result['last_page'];
  62. if (empty($select_product_datas)) {
  63. return true;
  64. } else {
  65. if ($page < $last_page) {
  66. //继续执行下一页
  67. $this->message_data['page'] = $page + 1;
  68. $this->message_data['limit'] = $limit;
  69. ViolationProductJobs::dispatch($this->message_data);
  70. }
  71. foreach ($result['data'] as $key => $product_data) {
  72. $specify_responsible_person = $product_data['specify_responsible_person'];
  73. //获取指定人员信息
  74. $insert_product_data = [];
  75. if ($specify_responsible_person == 0) {
  76. $product_data['qualification_number'] = $product_data['social_credit_code'];
  77. $product_data['platform_id'] = $product_data['platform'];
  78. $insert_product_data = $this->get_responsible_person_info($product_data);
  79. }
  80. $update_data = $insert_product_data;
  81. if (!empty($update_data) && count($update_data) > 0) {
  82. $product_data['first_responsible_person'] = isset($update_data['first_responsible_person']) ? $update_data['first_responsible_person'] : $product_data['first_responsible_person'];
  83. $product_data['responsible_person'] = isset($update_data['responsible_person']) ? $update_data['responsible_person'] : $product_data['responsible_person'];
  84. $product_data['source_responsible_person'] = isset($update_data['source_responsible_person']) ? $update_data['source_responsible_person'] : $product_data['source_responsible_person'];
  85. $ViolationProductModel->where('id', $product_data['id'])->update($update_data);
  86. }
  87. $insert_product_data['first_responsible_person'] = $product_data['first_responsible_person'];
  88. $insert_product_data['responsible_person'] = $product_data['responsible_person'];
  89. $insert_product_data['source_responsible_person'] = $product_data['source_responsible_person'];
  90. $this->insert_violation_product_responsible_person_info($product_data, $insert_product_data);
  91. }
  92. }
  93. DB::commit();
  94. // 成功处理...
  95. } catch (\Exception $e) {
  96. DB::rollBack();
  97. Log::info('job_error', '数据回填-禁止商品责任人数据回填队列失败', ['data' => $this->message_data, 'error' => $e->getMessage()]);
  98. }
  99. }
  100. /**
  101. * 写入处理禁止商品-责任人信息
  102. * @author: 唐远望
  103. * @version: 1.0
  104. * @date: 2026-05-19
  105. */
  106. private function insert_violation_product_responsible_person_info($product_data, $data)
  107. {
  108. $ViolationProductMemberModel = new ViolationProductMemberModel();
  109. $ViolationProduct_id = $product_data['id'];
  110. $first_responsible_persons = $data['first_responsible_person'] != '' ? explode(',', $data['first_responsible_person']) : [];
  111. $first_responsible_person_data = [];
  112. if (count($first_responsible_persons) > 0) {
  113. //去除重复的责任人
  114. $first_responsible_persons = array_unique($first_responsible_persons);
  115. //移除数组内的空值
  116. $first_responsible_persons = array_filter($first_responsible_persons);
  117. $EmployeeModel = new EmployeeModel();
  118. $employee_user_list = $EmployeeModel->whereIn('id', $first_responsible_persons)->select(['id', 'name'])->get()->toarray();
  119. $employee_user_list_name = [];
  120. if (!empty($employee_user_list)) {
  121. foreach ($employee_user_list as $key => $employee_user_info) {
  122. $employee_id = $employee_user_info['id'];
  123. $employee_user_list_name[$employee_id] = $employee_user_info['name'];
  124. }
  125. }
  126. foreach ($first_responsible_persons as $key => $employee_id) {
  127. //如果不是数字或者为空,则跳过
  128. if ($employee_id == '' || is_null($employee_id) || !is_numeric($employee_id)) continue;
  129. $member_info = $ViolationProductMemberModel->where('violation_product_logid', $ViolationProduct_id)->where('employee_id', $employee_id)->where('duty_type', 1)->count();
  130. if ($member_info > 0) continue;
  131. $first_responsible_person_data[] = [
  132. 'violation_product_logid' => $ViolationProduct_id,
  133. 'employee_id' => $employee_id,
  134. 'employee_name' => isset($employee_user_list_name[$employee_id]) ? $employee_user_list_name[$employee_id] : '',
  135. 'duty_type' => 1, //责任类型1=第一责任人,2=责任人,3=溯源责任人
  136. ];
  137. }
  138. }
  139. if (!empty($first_responsible_person_data)) {
  140. $ViolationProductMemberModel->insert($first_responsible_person_data);
  141. }
  142. $responsible_persons = $data['responsible_person'] != '' ? explode(',', $data['responsible_person']) : [];
  143. $responsible_person_data = [];
  144. if (count($responsible_persons) > 0) {
  145. //去除重复的责任人
  146. $responsible_persons = array_unique($responsible_persons);
  147. //移除数组内的空值
  148. $responsible_persons = array_filter($responsible_persons);
  149. $EmployeeModel = new EmployeeModel();
  150. $employee_user_list = $EmployeeModel->whereIn('id', $responsible_persons)->select(['id', 'name'])->get()->toarray();
  151. $employee_user_list_name = [];
  152. if (!empty($employee_user_list)) {
  153. foreach ($employee_user_list as $key => $employee_user_info) {
  154. $employee_id = $employee_user_info['id'];
  155. $employee_user_list_name[$employee_id] = $employee_user_info['name'];
  156. }
  157. }
  158. foreach ($responsible_persons as $key => $employee_id) {
  159. //如果不是数字或者为空,则跳过
  160. if ($employee_id == '' || is_null($employee_id) || !is_numeric($employee_id)) continue;
  161. $member_info = $ViolationProductMemberModel->where('violation_product_logid', $ViolationProduct_id)->where('employee_id', $employee_id)->where('duty_type', 2)->count();
  162. if ($member_info > 0) continue;
  163. $responsible_person_data[] = [
  164. 'violation_product_logid' => $ViolationProduct_id,
  165. 'employee_id' => $employee_id,
  166. 'employee_name' => isset($employee_user_list_name[$employee_id]) ? $employee_user_list_name[$employee_id] : '',
  167. 'duty_type' => 2, //责任类型1=第一责任人,2=责任人,3=溯源责任人
  168. ];
  169. }
  170. }
  171. if ($responsible_person_data) {
  172. $ViolationProductMemberModel->insert($responsible_person_data);
  173. }
  174. $source_responsible_persons = $data['source_responsible_person'] != '' ? explode(',', $data['source_responsible_person']) : [];
  175. $source_responsible_person_data = [];
  176. if (count($source_responsible_persons) > 0) {
  177. //去除重复的责任人
  178. $source_responsible_persons = array_unique($source_responsible_persons);
  179. //移除数组内的空值
  180. $source_responsible_persons = array_filter($source_responsible_persons);
  181. $EmployeeModel = new EmployeeModel();
  182. $employee_user_list = $EmployeeModel->whereIn('id', $source_responsible_persons)->select(['id', 'name'])->get()->toarray();
  183. $employee_user_list_name = [];
  184. if (!empty($employee_user_list)) {
  185. foreach ($employee_user_list as $key => $employee_user_info) {
  186. $employee_id = $employee_user_info['id'];
  187. $employee_user_list_name[$employee_id] = $employee_user_info['name'];
  188. }
  189. }
  190. foreach ($source_responsible_persons as $key => $employee_id) {
  191. //如果不是数字或者为空,则跳过
  192. if ($employee_id == '' || is_null($employee_id) || !is_numeric($employee_id)) continue;
  193. $member_info = $ViolationProductMemberModel->where('violation_product_logid', $ViolationProduct_id)->where('employee_id', $employee_id)->where('duty_type', 3)->count();
  194. if ($member_info > 0) continue;
  195. $source_responsible_person_data[] = [
  196. 'violation_product_logid' => $ViolationProduct_id,
  197. 'employee_id' => $employee_id,
  198. 'employee_name' => isset($employee_user_list_name[$employee_id]) ? $employee_user_list_name[$employee_id] : '',
  199. 'duty_type' => 3, //责任类型1=第一责任人,2=责任人,3=溯源责任人
  200. ];
  201. }
  202. }
  203. if ($source_responsible_person_data) {
  204. $ViolationProductMemberModel->insert($source_responsible_person_data);
  205. }
  206. }
  207. /**
  208. * 根据规则获取责任人分配信息
  209. * @author: 唐远望
  210. * @version: 1.0
  211. * @date: 2026-05-18
  212. */
  213. private function get_responsible_person_info($product_data)
  214. {
  215. $EmployeeAreaModel = new EmployeeAreaModel();
  216. $EmployeePlatformModel = new EmployeePlatformModel();
  217. $ViolationCompanyModel = new ViolationCompanyModel();
  218. $ViolationCompanyMemberModel = new ViolationCompanyMemberModel();
  219. $company_id = $product_data['company_id'];
  220. //获取店铺责任人信息
  221. $ViolationStoreModel = new ViolationStoreModel();
  222. $store_data_info = $ViolationStoreModel->where('company_id', $company_id)->where('store_name', $product_data['store_name'])->where('status', '0')->first();
  223. if (!empty($store_data_info) && trim($store_data_info->employee_ids) != '') {
  224. //查询店铺第一责任人信息
  225. $EmployeeModel = new EmployeeModel();
  226. $store_where_query = [];
  227. $employee_id_store = explode(',', $store_data_info->employee_ids);
  228. $store_where_query[] = ['company_id', '=', $company_id];
  229. $store_where_query[] = ['status', '=', 0];
  230. $store_where_query[] = ['duty_type', '=', 1]; //责任类型1=第一责任人,2=责任人
  231. $first_responsible_person = $EmployeeModel->whereIn('id', $employee_id_store)->where($store_where_query)->pluck('id')->implode(',');
  232. $insert_product_data['first_responsible_person'] = $first_responsible_person;
  233. //查询店铺责任人信息
  234. $EmployeeModel = new EmployeeModel();
  235. $store_where_query = [];
  236. $employee_id_store = explode(',', $store_data_info->employee_ids);
  237. $store_where_query[] = ['company_id', '=', $company_id];
  238. $store_where_query[] = ['status', '=', 0];
  239. $store_where_query[] = ['duty_type', '=', 2]; //责任类型1=第一责任人,2=责任人
  240. $responsible_person = $EmployeeModel->whereIn('id', $employee_id_store)->where($store_where_query)->pluck('id')->implode(',');
  241. $insert_product_data['responsible_person'] = $responsible_person;
  242. //溯源责任人
  243. $source_responsible_person = '';
  244. if ($first_responsible_person && $responsible_person) {
  245. //转换成数组,合并后在去重
  246. $first_responsible_person = explode(',', $first_responsible_person);
  247. $responsible_person = explode(',', $responsible_person);
  248. $source_responsible_person = array_unique(array_merge($first_responsible_person, $responsible_person));
  249. $source_responsible_person = ',' . implode(',', $source_responsible_person) . ',';
  250. } else if ($first_responsible_person) {
  251. $source_responsible_person = $first_responsible_person;
  252. } else if ($responsible_person) {
  253. $source_responsible_person = $responsible_person;
  254. }
  255. $insert_product_data['source_responsible_person'] = $source_responsible_person;
  256. } else {
  257. //获取公司绑定责任人信息
  258. $company_data = $ViolationCompanyModel->leftjoin('washconfig_company_category', 'washconfig_company_category.id', '=', 'washconfig_violation_company.category_id')
  259. ->where('washconfig_violation_company.social_credit_code', $product_data['qualification_number'])
  260. ->where('washconfig_violation_company.company_id', $company_id)
  261. ->select(['washconfig_violation_company.id', 'washconfig_company_category.name as category_name'])->first();
  262. $employee_id_list = [];
  263. if ($company_data) {
  264. $employee_id_list = $ViolationCompanyMemberModel->where('company_logid', $company_data->id)->pluck('employee_id')->toarray();
  265. $insert_product_data['company_category_name'] = $company_data->category_name ? $company_data->category_name : '';
  266. }
  267. $where_query1 = [];
  268. $where_query2 = [];
  269. $where_query3 = [];
  270. //查询指定公司第一责任人
  271. if (!empty($employee_id_list)) {
  272. $where_query1[] = ['company_id', '=', $company_id];
  273. $where_query1[] = ['id', 'in', $employee_id_list];
  274. $where_query1[] = ['status', '=', 0];
  275. $where_query1[] = ['duty_type', '=', 1]; //责任类型1=第一责任人,2=责任人
  276. }
  277. //查询地区配置的第一责任人
  278. $employee_id_area = $EmployeeAreaModel->where('city_id', $product_data['city_id'])->pluck('employee_id')->toarray();
  279. if (!empty($employee_id_area)) {
  280. $where_query2[] = ['company_id', '=', $company_id];
  281. $where_query2[] = ['id', 'in', $employee_id_area];
  282. $where_query2[] = ['status', '=', 0];
  283. $where_query2[] = ['duty_type', '=', 1]; //责任类型1=第一责任人,2=责任人
  284. }
  285. //查询平台配置的第一责任人
  286. $employee_id_platform = $EmployeePlatformModel->where('platform_id', $product_data['platform_id'])->pluck('employee_id')->toarray();
  287. if (!empty($employee_id_platform)) {
  288. $where_query3[] = ['company_id', '=', $company_id];
  289. $where_query3[] = ['id', 'in', $employee_id_platform];
  290. $where_query3[] = ['status', '=', 0];
  291. $where_query3[] = ['duty_type', '=', 1]; //责任类型1=第一责任人,2=责任人
  292. }
  293. //并行查询第一责任人
  294. $EmployeeModel = new EmployeeModel();
  295. $EmployeeModel = $EmployeeModel
  296. ->orWhere(function ($q) use ($employee_id_list, $company_id) {
  297. if (!empty($employee_id_list)) {
  298. $q->where('company_id', $company_id)
  299. ->orWhereIn('id', $employee_id_list)
  300. ->where('duty_type', 1)
  301. ->where('status', 0);
  302. }
  303. })->orWhere(function ($q) use ($employee_id_area, $company_id) {
  304. if (!empty($employee_id_area)) {
  305. $q->where('company_id', $company_id)
  306. ->whereIn('id', $employee_id_area)
  307. ->where('duty_type', 1)
  308. ->where('status', 0);
  309. }
  310. })->orWhere(function ($q) use ($employee_id_platform, $company_id) {
  311. if (!empty($employee_id_platform)) {
  312. $q->where('company_id', $company_id)
  313. ->whereIn('id', $employee_id_platform)
  314. ->where('duty_type', 1)
  315. ->where('status', 0);
  316. }
  317. });
  318. $first_responsible_person = $EmployeeModel->pluck('id')->implode(',');
  319. //当以上规则匹配不到责任人时,则去查询发货地区信息关联责任人
  320. if (trim($first_responsible_person) == '' && trim($product_data['shipment_city_id']) != '') {
  321. $employee_id_area = $EmployeeAreaModel->where('company_id', $company_id)->where('city_id', $product_data['shipment_city_id'])->pluck('employee_id')->toarray();
  322. if (!empty($employee_id_area)) {
  323. $where_city = [];
  324. $where_city[] = ['company_id', '=', $company_id];
  325. $where_city[] = ['status', '=', 0];
  326. $where_city[] = ['duty_type', '=', 1]; //责任类型1=第一责任人,2=责任人
  327. $EmployeeModel = new EmployeeModel();
  328. $first_responsible_person = $EmployeeModel->whereIn('id', $employee_id_area)->where($where_city)->pluck('id')->implode(',');
  329. }
  330. }
  331. //调试记录查询条件
  332. $insert_product_data['first_responsible_person'] = $first_responsible_person;
  333. //查询责任人
  334. $where_query1 = [];
  335. $where_query2 = [];
  336. $where_query3 = [];
  337. //查询指定公司责任人
  338. if (!empty($employee_id_list)) {
  339. $where_query1[] = ['company_id', '=', $company_id];
  340. $where_query1[] = ['id', 'in', $employee_id_list];
  341. $where_query1[] = ['status', '=', 0];
  342. $where_query1[] = ['duty_type', '=', 2]; //责任类型1=第一责任人,2=责任人
  343. }
  344. //查询地区配置的员工
  345. $employee_id_area = $EmployeeAreaModel->where('city_id', $product_data['city_id'])->pluck('employee_id')->toarray();
  346. if (!empty($employee_id_area)) {
  347. $where_query2[] = ['company_id', '=', $company_id];
  348. $where_query2[] = ['id', 'in', $employee_id_area];
  349. $where_query2[] = ['status', '=', 0];
  350. $where_query2[] = ['duty_type', '=', 2]; //责任类型1=第一责任人,2=责任人
  351. }
  352. //查询平台配置的员工
  353. $employee_id_platform = $EmployeePlatformModel->where('platform_id', $product_data['platform_id'])->pluck('employee_id')->toarray();
  354. if (!empty($employee_id_platform)) {
  355. $where_query3[] = ['company_id', '=', $company_id];
  356. $where_query3[] = ['id', 'in', $employee_id_platform];
  357. $where_query3[] = ['status', '=', 0];
  358. $where_query3[] = ['duty_type', '=', 2]; //责任类型1=第一责任人,2=责任人
  359. }
  360. //并行查询责任人
  361. $EmployeeModel = new EmployeeModel();
  362. $EmployeeModel = $EmployeeModel
  363. ->orWhere(function ($q) use ($employee_id_list, $company_id) {
  364. if (!empty($employee_id_list)) {
  365. $q->where('company_id', $company_id)
  366. ->orWhereIn('id', $employee_id_list)
  367. ->where('duty_type', 2)
  368. ->where('status', 0);
  369. }
  370. })->orWhere(function ($q) use ($employee_id_area, $company_id) {
  371. if (!empty($employee_id_area)) {
  372. $q->where('company_id', $company_id)
  373. ->whereIn('id', $employee_id_area)
  374. ->where('duty_type', 2)
  375. ->where('status', 0);
  376. }
  377. })->orWhere(function ($q) use ($employee_id_platform, $company_id) {
  378. if (!empty($employee_id_platform)) {
  379. $q->where('company_id', $company_id)
  380. ->whereIn('id', $employee_id_platform)
  381. ->where('duty_type', 2)
  382. ->where('status', 0);
  383. }
  384. });
  385. $responsible_person = $EmployeeModel->pluck('id')->implode(',');
  386. //当以上规则匹配不到责任人时,则去查询发货地区信息关联责任人
  387. if (trim($responsible_person) == '' && trim($product_data['shipment_city_id']) != '') {
  388. $employee_id_area = $EmployeeAreaModel->where('company_id', $company_id)->where('city_id', $product_data['shipment_city_id'])->pluck('employee_id')->toarray();
  389. if (!empty($employee_id_area)) {
  390. $where_city = [];
  391. $where_city[] = ['company_id', '=', $company_id];
  392. $where_city[] = ['status', '=', 0];
  393. $where_city[] = ['duty_type', '=', 2]; //责任类型1=第一责任人,2=责任人
  394. $EmployeeModel = new EmployeeModel();
  395. $responsible_person = $EmployeeModel->whereIn('id', $employee_id_area)->where($where_city)->pluck('id')->implode(',');
  396. }
  397. }
  398. $insert_product_data['responsible_person'] = $responsible_person;
  399. //溯源责任人
  400. $source_responsible_person = '';
  401. if ($first_responsible_person && $responsible_person) {
  402. //转换成数组,合并后在去重
  403. $first_responsible_person = explode(',', $first_responsible_person);
  404. $responsible_person = explode(',', $responsible_person);
  405. $source_responsible_person = array_unique(array_merge($first_responsible_person, $responsible_person));
  406. $source_responsible_person = ',' . implode(',', $source_responsible_person) . ',';
  407. } else if ($first_responsible_person) {
  408. $source_responsible_person = $first_responsible_person;
  409. } else if ($responsible_person) {
  410. $source_responsible_person = $responsible_person;
  411. }
  412. $insert_product_data['source_responsible_person'] = $source_responsible_person;
  413. }
  414. return $insert_product_data;
  415. }
  416. public function failed(\Throwable $exception)
  417. {
  418. Log::info('job_error', '数据回填-禁止商品责任人数据回填队列完全失败', ['data' => $this->message_data, 'error' => $exception->getMessage()]);
  419. }
  420. }