CustomFieldSettingService.php 9.9 KB

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