CustomFieldSettingService.php 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  1. <?php
  2. namespace App\Service;
  3. use App\Model\CustomFieldDefinitions;
  4. use App\Model\SysMenu;
  5. use App\Model\SysModules;
  6. use App\Model\SysOssTasks;
  7. use Illuminate\Support\Facades\DB;
  8. class CustomFieldSettingService extends Service
  9. {
  10. public function add($data,$user){
  11. list($status,$msg) = $this->fieldRule($data,$user);
  12. if(!$status) return [$status,$msg];
  13. try {
  14. DB::beginTransaction();
  15. CustomFieldDefinitions::insert($data['data']);
  16. DB::commit();
  17. }catch (\Exception $exception){
  18. DB::rollBack();
  19. return [false,$exception->getMessage()];
  20. }
  21. return [true,''];
  22. }
  23. public function edit($data,$user){
  24. list($status,$msg) = $this->fieldRule($data,$user, false);
  25. if(!$status) return [$status,$msg];
  26. try {
  27. DB::beginTransaction();
  28. $update = $msg['data'][0];
  29. $model = new CustomFieldDefinitions();
  30. $model->where('id', $data['id'])->update($update);
  31. DB::commit();
  32. }catch (\Exception $exception){
  33. DB::rollBack();
  34. return [false,$exception->getMessage()];
  35. }
  36. return [true,''];
  37. }
  38. public function del($data, $user){
  39. if(empty($data['id']) || ! is_array($data['id'])) return [false,'ID不能为空或格式错误'];
  40. try {
  41. CustomFieldDefinitions::whereIn('id', $data['id'])->update([
  42. 'del_time' => time()
  43. ]);
  44. }catch (\Exception $exception){
  45. DB::rollBack();
  46. return [false,$exception->getMessage()];
  47. }
  48. return [true,''];
  49. }
  50. public function fieldCommon($data,$user, $field = []){
  51. if(empty($field)) $field = CustomFieldDefinitions::$field;
  52. $model = CustomFieldDefinitions::TopClear($user,$data);
  53. $model = $model->where('del_time',0)
  54. ->select($field)
  55. ->orderby('id', 'desc');
  56. if(! empty($data['field_label'])) $model->where('field_label', 'LIKE', '%'.$data['field_label'].'%');
  57. return $model;
  58. }
  59. public function list($data, $user){
  60. $model = $this->fieldCommon($data, $user);
  61. $list = $this->limit($model,'',$data);
  62. $list = $this->fillList($list);
  63. return [true, $list];
  64. }
  65. public function fillList($data){
  66. if(empty($data['data'])) return $data;
  67. $emp = (new EmployeeService())->getEmployeeMap(array_unique(array_column($data['data'],'crt_id')));
  68. $menu_map = (new SysMenuService())->getMap(array_unique(array_column($data['data'],'menu_id')));
  69. foreach ($data['data'] as $key => $value){
  70. $data['data'][$key]['crt_time'] = $value['crt_time'] ? date('Y-m-d H:i:s',$value['crt_time']) : '';
  71. $data['data'][$key]['crt_name'] = $emp[$value['crt_id']] ?? '';
  72. $data['data'][$key]['menu_title'] = $menu_map[$value['menu_id']] ?? '';
  73. $data['data'][$key]['field_type_title'] = CustomFieldDefinitions::State_Type[$value['field_type']] ?? '';
  74. }
  75. return $data;
  76. }
  77. public function fieldRule(&$data,$user, $is_add = true){
  78. if(empty($data['menu_id'])) return [false, '菜单不能为空'];
  79. $data['top_depart_id'] = $user['top_depart_id'];
  80. $title = SysMenu::where('id', $data['menu_id'])->value('title');
  81. if(empty($title)) return [false, '菜单不存在或已被删除'];
  82. $bool = SysModules::where('del_time',0)
  83. ->where('top_depart_id', $data['top_depart_id'])
  84. ->where('menu_id', $data['menu_id'])
  85. ->exists();
  86. if(! $bool) return [false, $title . '不允许增加自定义表头'];
  87. if(empty($data['data'])) return [false,'自定义数据不能为空'];
  88. $title = array_column($data['data'],'field_label');
  89. $title = array_map(function($val) {
  90. return $val !== null ? $val : 0;
  91. }, $title);
  92. $title_count = array_count_values($title);
  93. foreach ($title as $value){
  94. if(empty($value)) return [false,'自定义名称不能为空!'];
  95. if($title_count[$value] > 1) return [false,'自定义名称不能重复'];
  96. }
  97. foreach ($data['data'] as $key => $value){
  98. if(empty($value['field_label'])) return [false, '自定义项名称不能为空'];
  99. if(empty($value['field_type'])) return [false, '自定义项类型不能为空'];
  100. if(! isset(CustomFieldDefinitions::State_Type[$value['field_type']])) return [false, '自定义项类型错误'];
  101. $top_depart_id = $user['top_depart_id'];
  102. $data['data'][$key]['menu_id'] = $data['menu_id'];
  103. $data['data'][$key]['top_depart_id'] = $top_depart_id;
  104. $data['data'][$key]['upd_time'] = time();
  105. if($is_add){
  106. $data['data'][$key]['crt_time'] = time();
  107. $fieldKey = 'f_' . substr(md5(microtime() . $value['field_label']), 0, 8);
  108. $data['data'][$key]['field_key'] = $fieldKey;
  109. $bool = CustomFieldDefinitions::where("field_label", $value['field_label'])
  110. ->where('top_depart_id', $top_depart_id)
  111. ->where('menu_id', $data['menu_id'])
  112. ->where('del_time',0)
  113. ->exists();
  114. }else{
  115. if($this->isEmpty($data,'id')) return [false,'id不能为空!'];
  116. $bool = CustomFieldDefinitions::where("field_label", $value['field_label'])
  117. ->where('top_depart_id', $top_depart_id)
  118. ->where('menu_id', $data['menu_id'])
  119. ->where('id','<>',$data['id'])
  120. ->where('del_time',0)
  121. ->exists();
  122. if(isset($value['field_key'])) unset($data['data'][$key]['field_key']);
  123. }
  124. if($bool) return [false,'自定义设置已存在'];
  125. }
  126. return [true, ''];
  127. }
  128. public static function syncCustomFieldData($id, $data, $user)
  129. {
  130. $top_depart_id = $user['top_depart_id'];
  131. if (empty($data['menu_id'])) return [false, '菜单ID不能为空'];
  132. $menuId = $data['menu_id'];
  133. $definitions = CustomFieldDefinitions::where('menu_id', $menuId)
  134. ->where('top_depart_id', $top_depart_id)
  135. ->get();
  136. $pendingTasks = [];
  137. $time = time();
  138. foreach ($definitions as $df) {
  139. $key = $df->field_key;
  140. // 如果请求数据中没有这个自定义字段的 key,跳过(支持局部更新)
  141. if (!array_key_exists($key, $data)) continue;
  142. $newVal = (string)($data[$key] ?? '');
  143. // --- 附件类型逻辑处理 ---
  144. if ($df->field_type === 'file') {
  145. // 查询数据库中已有的旧路径
  146. $oldVal = DB::table('custom_field_values')
  147. ->where('model_id', $id)
  148. ->where('definition_id', $df->id)
  149. ->value('field_value') ?? '';
  150. if ($newVal !== $oldVal) {
  151. //产生一个【删除任务】
  152. if (!empty($oldVal)) {
  153. $pendingTasks[] = [
  154. 'type' => 1, // 删除旧文件
  155. 'url' => $oldVal,
  156. 'top_depart_id' => $top_depart_id,
  157. 'crt_time' => $time,
  158. ];
  159. }
  160. //产生一个【新增同步任务】
  161. if (!empty($newVal)) {
  162. $pendingTasks[] = [
  163. 'type' => 2, // 新增同步到 OSS
  164. 'url' => $newVal,
  165. 'top_depart_id' => $top_depart_id,
  166. 'crt_time' => $time,
  167. ];
  168. }
  169. }
  170. }
  171. // --- 统一更新业务值表 (文本或附件路径) ---
  172. DB::table('custom_field_values')->updateOrInsert(
  173. [
  174. 'model_id' => $id,
  175. 'definition_id' => $df->id,
  176. 'top_depart_id' => $top_depart_id,
  177. ],
  178. [
  179. 'field_value' => $newVal, // 如果是删除,这里存入空字符串
  180. 'upd_time' => time()
  181. ]
  182. );
  183. }
  184. //需要执行的oss的任务 调用这个方法的地方在 事务结束后触发下队列 todo
  185. if(! empty($pendingTasks)) SysOssTasks::insert($pendingTasks);
  186. return [true, ''];
  187. }
  188. }