QuantizationService.php 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692
  1. <?php
  2. namespace App\Service;
  3. use App\Model\CustomerSupply;
  4. use App\Model\Dimension;
  5. use App\Model\Employee;
  6. use App\Model\Organization;
  7. use App\Model\Quantization;
  8. use App\Model\QuantizationCreate;
  9. use App\Model\QuantizationCreateDetails;
  10. use App\Model\QuantizationDetails;
  11. use Illuminate\Support\Facades\DB;
  12. class QuantizationService extends Service
  13. {
  14. //量化档案-----------------------------------------------
  15. public function quantizationEdit($data,$user){
  16. list($status,$msg) = $this->quantizationRule($data, $user, false);
  17. if(!$status) return [$status,$msg];
  18. try {
  19. DB::beginTransaction();
  20. $model = Quantization::where('id',$data['id'])->first();
  21. $model->title = $data['title'] ?? '';
  22. $model->code = $data['code'] ?? '';
  23. $model->is_use = $data['is_use'] ?? 0;
  24. $model->industry = $data['industry'] ?? '';
  25. $model->model_mark = $data['model_mark'] ?? '';
  26. $model->save();
  27. $time = time();
  28. QuantizationDetails::where('del_time',0)
  29. ->where('quantization_id', $data['id'])
  30. ->update(['del_time' => $time]);
  31. $this->saveDetail($model->id, $time, $data);
  32. DB::commit();
  33. }catch (\Exception $exception){
  34. DB::rollBack();
  35. return [false,$exception->getMessage()];
  36. }
  37. return [true, ''];
  38. }
  39. public function quantizationAdd($data,$user){
  40. list($status,$msg) = $this->quantizationRule($data, $user);
  41. if(!$status) return [$status,$msg];
  42. try {
  43. DB::beginTransaction();
  44. $model = new Quantization();
  45. $model->title = $data['title'] ?? '';
  46. $model->code = $data['code'] ?? '';
  47. $model->is_use = $data['is_use'] ?? 0;
  48. $model->type = $data['type'] ?? 0;
  49. $model->industry = $data['industry'] ?? '';
  50. $model->model_mark = $data['model_mark'] ?? '';
  51. $model->crt_id = $user['id'];
  52. $model->save();
  53. $time = time();
  54. $this->saveDetail($model->id, $time, $data);
  55. DB::commit();
  56. }catch (\Exception $exception){
  57. DB::rollBack();
  58. return [false,$exception->getMessage()];
  59. }
  60. return [true, ''];
  61. }
  62. private function saveDetail($id, $time, $data){
  63. foreach ($data['details'] as $value) {
  64. // 插入父级
  65. $parent = QuantizationDetails::create([
  66. 'quantization_id' => $id,
  67. 'title' => $value['title'],
  68. 'score' => $value['score'],
  69. 'parent_id' => 0, // 顶层 parent_id = 0
  70. 'crt_time' => $time,
  71. ]);
  72. // 再处理子级
  73. if (! empty($value['details_son'])) {
  74. foreach ($value['details_son'] as $son) {
  75. $detailsSonData[] = [
  76. 'quantization_id' => $id,
  77. 'title' => $son['title'],
  78. 'score' => $son['score'],
  79. 'parent_id' => $parent->id, // 子级关联父级 id
  80. 'crt_time' => $time,
  81. ];
  82. }
  83. }
  84. }
  85. // 批量插入子级
  86. if (!empty($detailsSonData)) QuantizationDetails::insert($detailsSonData);
  87. }
  88. private function getDetail($id){
  89. // 查所有数据
  90. $all = QuantizationDetails::where('quantization_id', $id)
  91. ->where('del_time', 0)
  92. ->orderBy('id','asc')
  93. ->get()
  94. ->toArray();
  95. // 按 parent_id 分组
  96. $grouped = [];
  97. foreach ($all as $item) {
  98. $grouped[$item['parent_id']][] = $item;
  99. }
  100. $result = [];
  101. // 只取 parent_id = 0 的父级
  102. if (!empty($grouped[0])) {
  103. foreach ($grouped[0] as $parent) {
  104. $parent['details_son'] = $grouped[$parent['id']] ?? (object)[];
  105. $result[] = $parent;
  106. }
  107. }
  108. return $result;
  109. }
  110. public function quantizationDel($data){
  111. if($this->isEmpty($data,'id')) return [false,'请选择数据!'];
  112. try {
  113. DB::beginTransaction();
  114. $time = time();
  115. Quantization::where('del_time',0)
  116. ->whereIn('id',$data['id'])
  117. ->update(['del_time' => $time]);
  118. QuantizationDetails::where('del_time',0)
  119. ->whereIn('quantization_id', $data['id'])
  120. ->update(['del_time' => $time]);
  121. DB::commit();
  122. }catch (\Exception $exception){
  123. DB::rollBack();
  124. return [false,$exception->getMessage()];
  125. }
  126. return [true, ''];
  127. }
  128. public function quantizationDetail($data,$user){
  129. if($this->isEmpty($data,'id')) return [false,'请选择数据!'];
  130. $customer = Quantization::where('del_time',0)
  131. ->where('id',$data['id'])
  132. ->first();
  133. if(empty($customer)) return [false,'量化档案不存在或已被删除'];
  134. $customer = $customer->toArray();
  135. $details = $this->getDetail($customer['id']);
  136. $customer['details'] = $details;
  137. $customer['crt_name'] = Employee::where('id',$customer['crt_id'])->value('emp_name');
  138. $customer['crt_time'] = $customer['crt_time'] ? date("Y-m-d H:i:s",$customer['crt_time']): '';
  139. return [true, $customer];
  140. }
  141. public function quantizationCommon($data,$user, $field = []){
  142. if(empty($field)) $field = Quantization::$field;
  143. $model = Quantization::where('del_time',0)
  144. ->select($field)
  145. ->orderby('id', 'desc');
  146. if(! empty($data['code'])) $model->where('code', 'LIKE', '%'.$data['code'].'%');
  147. if(! empty($data['title'])) $model->where('title', 'LIKE', '%'.$data['title'].'%');
  148. if(! empty($data['type'])) $model->where('type', $data['type']);
  149. if(! empty($data['id'])) $model->whereIn('id', $data['id']);
  150. if(isset($data['is_use'])) $model->where('is_use', $data['is_use']);
  151. if(! empty($data['crt_time'][0]) && ! empty($data['crt_time'][1])) {
  152. $return = $this->changeDateToTimeStampAboutRange($data['crt_time']);
  153. $model->where('crt_time','>=',$return[0]);
  154. $model->where('crt_time','<=',$return[1]);
  155. }
  156. return $model;
  157. }
  158. public function quantizationList($data,$user){
  159. $model = $this->quantizationCommon($data, $user);
  160. $list = $this->limit($model,'',$data);
  161. $list = $this->fillData($list,$user);
  162. return [true, $list];
  163. }
  164. public function quantizationRule(&$data, $user, $is_add = true){
  165. if(empty($data['type'])) return [false, '量化档案类型类型不能为空'];
  166. if(! isset(Quantization::$type_name[$data['type']])) return [false, '量化档案类型错误'];
  167. if(empty($data['title'])) return [false, '名称不能为空'];
  168. if(empty($data['code'])) return [false, '编码不能为空'];
  169. if(empty($data['details'])) return [false, '评价明细不能为空'];
  170. foreach ($data['details'] as $key => $value) {
  171. $rowNum = $key + 1;
  172. // 校验外层 title 不能为空
  173. if (empty($value['title'])) {
  174. return [false, "第{$rowNum}行的评价名称不能为空"];
  175. }
  176. // 校验外层 title 不重复
  177. if (!isset($titleSet)) $titleSet = [];
  178. if (in_array($value['title'], $titleSet)) {
  179. return [false, "第{$rowNum}行的评价名称 [{$value['title']}] 重复"];
  180. }
  181. $titleSet[] = $value['title'];
  182. // 校验维度总分
  183. if (empty($value['score']) || ! is_numeric($value['score']) || floatval($value['score']) <= 0.0) {
  184. return [false, "第{$rowNum}行的维度总分错误"];
  185. }
  186. if(empty($value['details_son'])) return [false, '维度明细不能为空'];
  187. // 校验明细中 title 不重复
  188. $sonTitleSet = [];
  189. foreach ($value['details_son'] as $sonKey => $val) {
  190. $sonRowNum = $sonKey + 1;
  191. if (empty($val['title'])) {
  192. return [false, "第{$rowNum}行下的第{$sonRowNum}个明细名称不能为空"];
  193. }
  194. if (in_array($val['title'], $sonTitleSet)) {
  195. return [false, "第{$rowNum}行下的明细名称 [{$val['title']}] 重复"];
  196. }
  197. if (empty($val['score']) || ! is_numeric($val['score']) || floatval($val['score']) <= 0.0) {
  198. return [false, "第{$rowNum}行下的第{$sonRowNum}个明细赋分错误"];
  199. }
  200. $sonTitleSet[] = $val['title'];
  201. }
  202. }
  203. $rate_total = floatval(array_sum(array_column($data['details'],'score')));
  204. if($rate_total != 100.0) return [false, '维度总分之和必须等于100'];
  205. if($is_add){
  206. $bool = Quantization::where('code',$data['code'])
  207. ->where('del_time',0)
  208. ->exists();
  209. }else{
  210. if(empty($data['id'])) return [false,'ID不能为空'];
  211. $bool = Quantization::where('code',$data['code'])
  212. ->where('id','<>',$data['id'])
  213. ->where('del_time',0)
  214. ->exists();
  215. }
  216. if($bool) return [false,'编码已存在'];
  217. return [true, $data];
  218. }
  219. public function fillData($data, $user){
  220. if(empty($data['data'])) return $data;
  221. $emp = (new EmployeeService())->getEmployeeMap(array_unique(array_column($data['data'],'crt_id')));
  222. foreach ($data['data'] as $key => $value){
  223. $data['data'][$key]['crt_time'] = $value['crt_time'] ? date('Y-m-d H:i:s',$value['crt_time']) : '';
  224. $data['data'][$key]['crt_name'] = $emp[$value['crt_id']] ?? '';
  225. $data['data'][$key]['is_use_title'] = Quantization::$is_use_name[$value['is_use']] ?? '';
  226. $data['data'][$key]['type_title'] = Quantization::$type_name[$value['type']] ?? '';
  227. }
  228. return $data;
  229. }
  230. //量化档案-----------------------------------------------
  231. //量化创建-----------------------------------------------
  232. public function quantizationCreateEdit($data,$user){
  233. list($status,$msg) = $this->quantizationCreateRule($data, $user, false);
  234. if(!$status) return [$status,$msg];
  235. try {
  236. DB::beginTransaction();
  237. $model = QuantizationCreate::where('id',$data['id'])->first();
  238. $model->data_id = $data['data_id'] ?? 0;
  239. $model->data_title = $data['data_title'] ?? '';
  240. $model->quantization_id = $data['quantization_id'];
  241. $model->start_time = $data['start_time'] ?? 0;
  242. $model->end_time = $data['end_time'] ?? 0;
  243. $model->products = $data['products'] ?? '';
  244. $model->score = $data['score'] ?? 0;
  245. $model->address = $data['address'] ?? '';
  246. $model->address_title = $data['address_title'] ?? '';
  247. $model->man_mark = $data['man_mark'] ?? '';
  248. $model->result_type = $data['result_type'] ?? 0;
  249. $model->save();
  250. $time = time();
  251. QuantizationCreateDetails::where('del_time',0)
  252. ->where('quantization_create_id', $data['id'])
  253. ->update(['del_time' => $time]);
  254. $this->saveDetail1($model->id, $time, $data);
  255. DB::commit();
  256. }catch (\Exception $exception){
  257. DB::rollBack();
  258. return [false,$exception->getMessage()];
  259. }
  260. return [true, ''];
  261. }
  262. public function quantizationCreateAdd($data,$user){
  263. list($status,$msg) = $this->quantizationCreateRule($data, $user);
  264. if(!$status) return [$status,$msg];
  265. try {
  266. DB::beginTransaction();
  267. $model = new QuantizationCreate();
  268. $model->data_id = $data['data_id'] ?? 0;
  269. $model->data_title = $data['data_title'] ?? '';
  270. $model->quantization_id = $data['quantization_id'];
  271. $model->start_time = $data['start_time'] ?? 0;
  272. $model->end_time = $data['end_time'] ?? 0;
  273. $model->products = $data['products'] ?? '';
  274. $model->score = $data['score'] ?? 0;
  275. $model->type = $data['type'] ?? 0;
  276. $model->address = $data['address'] ?? '';
  277. $model->address_title = $data['address_title'] ?? '';
  278. $model->man_mark = $data['man_mark'] ?? '';
  279. $model->result_type = $data['result_type'] ?? 0;
  280. $model->crt_id = $user['id'];
  281. $model->save();
  282. $time = time();
  283. $this->saveDetail1($model->id, $time, $data);
  284. DB::commit();
  285. }catch (\Exception $exception){
  286. DB::rollBack();
  287. return [false,$exception->getMessage()];
  288. }
  289. return [true, ''];
  290. }
  291. private function saveDetail1($id, $time, $data){
  292. foreach ($data['details'] as $value) {
  293. // 插入父级
  294. $parent = QuantizationCreateDetails::create([
  295. 'quantization_create_id' => $id,
  296. 'title' => $value['title'],
  297. 'quantization_score' => $value['quantization_score'],
  298. 'parent_id' => 0, // 顶层 parent_id = 0
  299. 'crt_time' => $time,
  300. 'dimension_id' => $value['dimension_id'] ?? 0,
  301. 'score' => $value['score'] ?? 0,
  302. ]);
  303. // 再处理子级
  304. if (! empty($value['details_son'])) {
  305. foreach ($value['details_son'] as $son) {
  306. $detailsSonData[] = [
  307. 'quantization_create_id' => $id,
  308. 'title' => $son['title'],
  309. 'parent_id' => $parent->id, // 子级关联父级 id
  310. 'crt_time' => $time,
  311. 'dimension_id' => $son['dimension_id'] ?? 0,
  312. 'score' => $son['score'] ?? 0,
  313. 'rate' => $son['rate'] ?? 0,
  314. ];
  315. }
  316. }
  317. }
  318. // 批量插入子级
  319. if (!empty($detailsSonData)) QuantizationCreateDetails::insert($detailsSonData);
  320. }
  321. private function getDetail1($id){
  322. // 查所有数据
  323. $all = QuantizationCreateDetails::where('quantization_create_id', $id)
  324. ->where('del_time', 0)
  325. ->orderBy('id','asc')
  326. ->get()
  327. ->toArray();
  328. $map = Dimension::whereIn('id',array_unique(array_filter(array_column($all,'dimension_id'))))
  329. ->pluck('title','id')
  330. ->toArray();
  331. // 按 parent_id 分组
  332. $grouped = [];
  333. foreach ($all as $item) {
  334. $item['dimension_title'] = $map[$item['dimension_id']] ?? "";
  335. $grouped[$item['parent_id']][] = $item;
  336. }
  337. $result = [];
  338. // 只取 parent_id = 0 的父级
  339. if (!empty($grouped[0])) {
  340. foreach ($grouped[0] as $parent) {
  341. $parent['details_son'] = $grouped[$parent['id']] ?? (object)[];
  342. $result[] = $parent;
  343. }
  344. }
  345. return $result;
  346. }
  347. public function quantizationCreateDel($data){
  348. if($this->isEmpty($data,'id')) return [false,'请选择数据!'];
  349. try {
  350. DB::beginTransaction();
  351. $time = time();
  352. QuantizationCreate::where('del_time',0)
  353. ->whereIn('id',$data['id'])
  354. ->update(['del_time' => $time]);
  355. QuantizationCreateDetails::where('del_time',0)
  356. ->whereIn('quantization_create_id', $data['id'])
  357. ->update(['del_time' => $time]);
  358. DB::commit();
  359. }catch (\Exception $exception){
  360. DB::rollBack();
  361. return [false,$exception->getMessage()];
  362. }
  363. return [true, ''];
  364. }
  365. public function quantizationCreateDetail($data,$user){
  366. if($this->isEmpty($data,'id')) return [false,'请选择数据!'];
  367. $customer = QuantizationCreate::where('del_time',0)
  368. ->where('id',$data['id'])
  369. ->first();
  370. if(empty($customer)) return [false,'量化信息不存在或已被删除'];
  371. $customer = $customer->toArray();
  372. $customer['quantization_title'] = Quantization::where('id', $customer['quantization_id'])->value('title');
  373. $details = $this->getDetail1($customer['id']);
  374. $customer['details'] = $details;
  375. $customer['crt_name'] = Employee::where('id',$customer['crt_id'])->value('emp_name');
  376. $customer['crt_time'] = $customer['crt_time'] ? date("Y-m-d H:i:s",$customer['crt_time']): '';
  377. return [true, $customer];
  378. }
  379. public function quantizationCreateCommon($data,$user, $field = []){
  380. if(empty($data['type']) || ! isset(QuantizationCreate::$type_name[$data['type']])) return [false, '类型不存在或错误'];
  381. if(empty($field)) $field = QuantizationCreate::$field;
  382. $model = QuantizationCreate::Clear($user,$data);
  383. $model->where('del_time',0)
  384. ->select($field)
  385. ->orderby('id', 'desc');
  386. if(! empty($data['type'])) $model->where('type', $data['type']);
  387. if(! empty($data['result_type'])) $model->where('result_type', $data['result_type']);
  388. if(! empty($data['id'])) $model->whereIn('id', $data['id']);
  389. if(! empty($data['data_title'])) $model->where('data_title', 'LIKE', '%'.$data['data_title'].'%');
  390. if($data['type'] == QuantizationCreate::type_one || $data['type'] == QuantizationCreate::type_two){
  391. if(! empty($data['data_code'])){
  392. list($status, $id) = (new OrganizationService())->organizationListForSearch(['code' => $data['data_code']], $user);
  393. $model->whereIn('data_id', $id);
  394. }
  395. }else{
  396. if(! empty($data['data_code'])){
  397. list($status, $id) = (new CustomerSupplyService())->customerSupplyListForSearch(['code' => $data['data_code']], $user);
  398. $model->whereIn('data_id', $id);
  399. }
  400. }
  401. if(! empty($data['crt_time'][0]) && ! empty($data['crt_time'][1])) {
  402. $return = $this->changeDateToTimeStampAboutRange($data['crt_time']);
  403. $model->where('crt_time','>=',$return[0]);
  404. $model->where('crt_time','<=',$return[1]);
  405. }
  406. if(! empty($data['zq'][0]) && ! empty($data['zq'][1])) {
  407. $return = $this->changeDateToTimeStampAboutRange($data['zq']);
  408. $model->where('start_time','>=',$return[0]);
  409. $model->where('end_time','<=',$return[1]);
  410. }
  411. return [true, $model];
  412. }
  413. public function quantizationCreateList($data,$user){
  414. list($status,$model) = $this->quantizationCreateCommon($data, $user);
  415. if(! $status) return [false,$model];
  416. $list = $this->limit($model,'',$data);
  417. $list = $this->fillCreateData($list,$user);
  418. return [true, $list];
  419. }
  420. public function quantizationCreateRule(&$data, $user, $is_add = true){
  421. if(empty($data['type'])) return [false, '量化档案类型类型不能为空'];
  422. if(empty($data['quantization_id'])) return [false, '量化档案ID不能为空'];
  423. $q = Quantization::where('del_time',0)
  424. ->where('id', $data['quantization_id'])
  425. ->first();
  426. if(empty($q)) return [false, '引用的档案不存在或已被删除'];
  427. $q = $q->toArray();
  428. if(! isset(QuantizationCreate::$type_name[$data['type']])) return [false, '量化档案类型错误'];
  429. if($q['type'] != $data['type']) return [false, '引用档案类型与量化档案类型不一致'];
  430. if($data['type'] == QuantizationCreate::type_one){
  431. if(empty($data['address']) && ! is_string($data['address'])) return [false, '地点(省市)编码不能为空'];
  432. if(empty($data['address_title']) && ! is_string($data['address_title'])) return [false, '地点(省市)不能为空'];
  433. }elseif($data['type'] == QuantizationCreate::type_two){
  434. if(empty($data['start_time']) || empty($data['end_time'])) return [false, '周期不能为空'];
  435. $data['start_time'] = $this->changeDateToDate($data['start_time']);
  436. $data['end_time'] = $this->changeDateToDate($data['end_time']);
  437. }
  438. if($data['type'] == Quantization::type_one || $data['type'] == Quantization::type_two){
  439. if(empty($data['data_id'])) return [false, '组织id不能为空'];
  440. $title = Organization::where('del_time',0)
  441. ->where('id',$data['data_id'])
  442. ->value('title');
  443. if(! $title) return [false, '组织不存在或已被删除'];
  444. $data['data_title'] = $title;
  445. }else{
  446. if(! empty($data['data_id'])){
  447. $title = CustomerSupply::where('del_time',0)
  448. ->where('id',$data['data_id'])
  449. ->value('title');
  450. if(! $title) return [false, '人员不存在或已被删除'];
  451. $data['data_title'] = $title;
  452. }
  453. if(empty($data['result_type'])) return [false,'人物类型不能为空'];
  454. }
  455. if(! isset($data['score'])) return [false, '分数不存在'];
  456. $res = $this->checkNumber($data['score']);
  457. if(! $res['valid']) return [false,'分数:' . $res['error']];
  458. $map = [];
  459. if(! empty($data['from_wx'])){
  460. $map = Dimension::where('del_time',0)
  461. ->where('is_use',Dimension::is_use_one)
  462. ->where('type',$data['type'])
  463. ->pluck('id','rate')
  464. ->toArray();
  465. }
  466. if(empty($data['details'])) return [false, '量化详情不能为空'];
  467. foreach ($data['details'] as $key => $value) {
  468. $rowNum = $key + 1;
  469. // 校验外层 title 不能为空
  470. if (empty($value['title'])) return [false, "第{$rowNum}行的评价名称不能为空"];
  471. // 校验维度总分
  472. if (empty($value['quantization_score']) || ! is_numeric($value['quantization_score']) || floatval($value['quantization_score']) <= 0.0) {
  473. return [false, "第{$rowNum}行的维度总分错误"];
  474. }
  475. if (empty($value['score']) || ! is_numeric($value['score']) || floatval($value['score']) <= 0.0) {
  476. return [false, "第{$rowNum}行的总得分错误"];
  477. }
  478. if(empty($value['details_son'])) return [false, '维度明细不能为空'];
  479. foreach ($value['details_son'] as $sonKey => $val) {
  480. $sonRowNum = $sonKey + 1;
  481. if (empty($val['title'])) return [false, "第{$rowNum}行下的第{$sonRowNum}个明细名称不能为空"];
  482. if (empty($val['score']) || ! is_numeric($val['score']) || floatval($val['score']) <= 0.0) {
  483. return [false, "第{$rowNum}行下的第{$sonRowNum}个明细的维度选项赋分不能为空"];
  484. }
  485. if(empty($data['from_wx'])){
  486. if (empty($val['dimension_id'])) return [false, "第{$rowNum}行下的第{$sonRowNum}个明细的维度选项不能为空"];
  487. }else{
  488. $dimension_id = $this->getDimensionIdByRate($map, $val['rate']);
  489. if(empty($dimension_id)) return [false, "第{$rowNum}行下的第{$sonRowNum}个明细的维度选项找不到对应档案"];
  490. $data['details'][$key]['details_son'][$sonKey]['dimension_id'] = $dimension_id;
  491. }
  492. if (empty($val['rate']) || ! is_numeric($val['rate']) || floatval($val['rate']) <= 0.0) {
  493. return [false, "第{$rowNum}行下的第{$sonRowNum}个明细的维度选项打分比例不能为空"];
  494. }
  495. }
  496. }
  497. $startTime = $data['start_time'] ?? 0;
  498. $endTime = $data['end_time'] ?? 0;
  499. if ($is_add) {
  500. if ($data['type'] == QuantizationCreate::type_one) {
  501. // 能力量化:只允许唯一一份
  502. $bool = QuantizationCreate::where('data_id', $data['data_id'])
  503. ->where('type', QuantizationCreate::type_one)
  504. ->where('del_time', 0)
  505. ->exists();
  506. if ($bool) {
  507. return [false, '该组织已创建能力量化档案,请勿重复创建'];
  508. }
  509. } else {
  510. // 合作量化:检查时间区间重叠
  511. $bool = QuantizationCreate::where('data_id', $data['data_id'])
  512. ->where('type', QuantizationCreate::type_two) // 建议限定 type,防止误匹配
  513. ->where('del_time', 0)
  514. ->where(function($query) use ($startTime, $endTime) {
  515. $query->where('start_time', '<=', $endTime)
  516. ->where('end_time', '>=', $startTime);
  517. })
  518. ->exists();
  519. if ($bool) {
  520. return [false, '该组织在该周期内已创建合作量化档案,请勿重复创建'];
  521. }
  522. }
  523. } else {
  524. // 编辑模式
  525. if (empty($data['id'])) return [false, 'ID不能为空'];
  526. $id = $data['id'];
  527. if ($data['type'] == QuantizationCreate::type_one) {
  528. $bool = QuantizationCreate::where('data_id', $data['data_id'])
  529. ->where('type', QuantizationCreate::type_one)
  530. ->where('id', '<>', $id)
  531. ->where('del_time', 0)
  532. ->exists();
  533. if ($bool) return [false, '该组织已创建能力量化档案,请勿重复创建'];
  534. } else {
  535. $bool = QuantizationCreate::where('data_id', $data['data_id'])
  536. ->where('type', QuantizationCreate::type_two)
  537. ->where('del_time', 0)
  538. ->where(function($query) use ($startTime, $endTime) {
  539. $query->where('start_time', '<=', $endTime)
  540. ->where('end_time', '>=', $startTime);
  541. })
  542. ->where('id', '<>', $id)
  543. ->exists();
  544. if ($bool) return [false, '该组织在该周期内已创建合作量化档案,请勿重复创建'];
  545. }
  546. }
  547. return [true, ''];
  548. }
  549. function getDimensionIdByRate($map, $rate) {
  550. // 标准化输入为 "X.XX" 格式
  551. $key = number_format((float)$rate, 2, '.', '');
  552. return $map[$key] ?? null;
  553. }
  554. public function fillCreateData($data, $user){
  555. if(empty($data['data'])) return $data;
  556. $emp = (new EmployeeService())->getEmployeeMap(array_unique(array_column($data['data'],'crt_id')));
  557. foreach ($data['data'] as $key => $value){
  558. $data['data'][$key]['crt_time'] = $value['crt_time'] ? date('Y-m-d H:i:s',$value['crt_time']) : '';
  559. $data['data'][$key]['start_time'] = $value['start_time'] ? date('Y-m-d',$value['start_time']) : '';
  560. $data['data'][$key]['end_time'] = $value['end_time'] ? date('Y-m-d',$value['end_time']) : '';
  561. $data['data'][$key]['crt_name'] = $emp[$value['crt_id']] ?? '';
  562. $data['data'][$key]['type_title'] = QuantizationCreate::$type_name[$value['type']] ?? '';
  563. $data['data'][$key]['result'] = $this->fillDataResult($value);
  564. }
  565. return $data;
  566. }
  567. private function fillDataResult($value)
  568. {
  569. $score = isset($value['score']) ? floatval($value['score']) : 0;
  570. $type = $value['type'] ?? null;
  571. if ($type != QuantizationCreate::type_one && $type != QuantizationCreate::type_two) {
  572. return '';
  573. }
  574. if ($score >= 90) return '优秀';
  575. if ($score >= 80) return '良好';
  576. if ($score >= 60) return '合格';
  577. return '不合格';
  578. }
  579. //量化创建-----------------------------------------------
  580. }