SystemConfigServices.php 61 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
  4. // +----------------------------------------------------------------------
  5. // | Copyright (c) 2016~2023 https://www.crmeb.com All rights reserved.
  6. // +----------------------------------------------------------------------
  7. // | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
  8. // +----------------------------------------------------------------------
  9. // | Author: CRMEB Team <admin@crmeb.com>
  10. // +----------------------------------------------------------------------
  11. namespace app\services\system\config;
  12. use app\dao\system\config\SystemConfigDao;
  13. use app\services\agent\AgentManageServices;
  14. use app\services\BaseServices;
  15. use crmeb\exceptions\AdminException;
  16. use crmeb\services\CacheService;
  17. use crmeb\services\FileService;
  18. use crmeb\services\FormBuilder;
  19. use think\facade\Log;
  20. /**
  21. * 系统配置
  22. * Class SystemConfigServices
  23. * @package app\services\system\config
  24. * @method count(array $where = []) 获取指定条件下的count
  25. * @method save(array $data) 保存数据
  26. * @method get(int $id, ?array $field = []) 获取一条数据
  27. * @method update($id, array $data, ?string $key = null) 修改数据
  28. * @method delete(int $id, ?string $key = null) 删除数据
  29. * @method getUploadTypeList(string $configName) 获取上传配置中的上传类型
  30. */
  31. class SystemConfigServices extends BaseServices
  32. {
  33. /**
  34. * form表单句柄
  35. * @var FormBuilder
  36. */
  37. protected $builder;
  38. /**
  39. * 表单数据切割符号
  40. * @var string
  41. */
  42. protected $cuttingStr = '=>';
  43. /**
  44. * 表单提交url
  45. * @var string[]
  46. */
  47. protected $postUrl = [
  48. 'setting' => [
  49. 'url' => '/setting/config/save_basics',
  50. 'auth' => [],
  51. ],
  52. 'serve' => [
  53. 'url' => '/serve/sms_config/save_basics',
  54. 'auth' => ['short_letter_switch'],
  55. ],
  56. 'freight' => [
  57. 'url' => '/freight/config/save_basics',
  58. 'auth' => ['express'],
  59. ],
  60. 'agent' => [
  61. 'url' => '/agent/config/save_basics',
  62. 'auth' => ['fenxiao'],
  63. ],
  64. 'marketing' => [
  65. 'url' => '/marketing/integral_config/save_basics',
  66. 'auth' => ['point'],
  67. ]
  68. ];
  69. /**
  70. * 子集控制规则
  71. * @var array[]
  72. */
  73. protected $relatedRule = [
  74. 'sign_status' => [
  75. 'son_type' => [
  76. 'sign_mode' => '',
  77. 'sign_remind' => [
  78. 'son_type' => [
  79. 'sign_remind_time' => '',
  80. 'sign_remind_type' => '',
  81. ],
  82. 'show_value' => 1
  83. ],
  84. 'sign_give_point' => '',
  85. 'sign_give_exp' => '',
  86. ],
  87. 'show_value' => 1
  88. ],
  89. 'brokerage_func_status' => [
  90. 'son_type' => [
  91. 'store_brokerage_statu' => [
  92. 'son_type' => ['store_brokerage_price' => ''],
  93. 'show_value' => 3
  94. ],
  95. 'brokerage_bindind' => '',
  96. 'store_brokerage_binding_status' => [
  97. 'son_type' => ['store_brokerage_binding_time' => ''],
  98. 'show_value' => 2
  99. ],
  100. 'spread_banner' => '',
  101. 'brokerage_level' => '',
  102. 'division_status' => '',
  103. 'agent_apply_open' => '',
  104. 'brokerage_window_switch' => '',
  105. ],
  106. 'show_value' => 1
  107. ],
  108. 'brokerage_user_status' => [
  109. 'son_type' => [
  110. 'uni_brokerage_price' => '',
  111. 'day_brokerage_price_upper' => '',
  112. ],
  113. 'show_value' => 1
  114. ],
  115. 'invoice_func_status' => [
  116. 'son_type' => [
  117. 'special_invoice_status' => '',
  118. ],
  119. 'show_value' => 1
  120. ],
  121. 'member_func_status' => [
  122. 'son_type' => [
  123. 'order_give_exp' => '',
  124. 'invite_user_exp' => ''
  125. ],
  126. 'show_value' => 1
  127. ],
  128. 'balance_func_status' => [
  129. 'son_type' => [
  130. 'recharge_attention' => '',
  131. 'recharge_switch' => '',
  132. 'store_user_min_recharge' => '',
  133. ],
  134. 'show_value' => 1
  135. ],
  136. 'pay_wechat_type' => [
  137. 'son_type' => [
  138. 'pay_weixin_key' => '',
  139. ],
  140. 'show_value' => 0
  141. ],
  142. 'pay_wechat_type@' => [
  143. 'son_type' => [
  144. 'pay_weixin_serial_no' => '',
  145. 'v3_transfer_scene_id' => '',
  146. 'pay_weixin_key_v3' => '',
  147. 'v3_pay_public_key' => '',
  148. 'v3_pay_public_pem' => '',
  149. ],
  150. 'show_value' => 1
  151. ],
  152. 'image_watermark_status' => [
  153. 'son_type' => [
  154. 'watermark_type' => [
  155. 'son_type' => [
  156. 'watermark_image' => '',
  157. 'watermark_opacity' => '',
  158. 'watermark_rotate' => '',
  159. ],
  160. 'show_value' => 1
  161. ],
  162. 'watermark_position' => '',
  163. 'watermark_x' => '',
  164. 'watermark_y' => '',
  165. 'watermark_type@' => [
  166. 'son_type' => [
  167. 'watermark_text' => '',
  168. 'watermark_text_size' => '',
  169. 'watermark_text_color' => '',
  170. 'watermark_text_angle' => ''
  171. ],
  172. 'show_value' => 2
  173. ],
  174. ],
  175. 'show_value' => 1
  176. ],
  177. 'customer_type' => [
  178. 'son_type' => [
  179. 'service_feedback' => '',
  180. ],
  181. 'show_value' => 0
  182. ],
  183. 'customer_type#' => [
  184. 'son_type' => [
  185. 'customer_phone' => '',
  186. ],
  187. 'show_value' => 1
  188. ],
  189. 'customer_type@' => [
  190. 'son_type' => [
  191. 'customer_url' => '',
  192. 'customer_corpId' => '',
  193. ],
  194. 'show_value' => 2
  195. ],
  196. 'pay_new_weixin_open' => [
  197. 'son_type' => [
  198. 'pay_new_weixin_mchid' => ''
  199. ],
  200. 'show_value' => 1
  201. ],
  202. 'mer_type' => [
  203. 'son_type' => [
  204. 'pay_sub_merchant_id' => '',
  205. 'sp_appid' => ''
  206. ],
  207. 'show_value' => 1
  208. ],
  209. 'member_card_status' => [
  210. 'son_type' => [
  211. 'member_price_status' => '',
  212. ],
  213. 'show_value' => 1
  214. ],
  215. ];
  216. /**
  217. * SystemConfigServices constructor.
  218. * @param SystemConfigDao $dao
  219. * @param FormBuilder $builder
  220. */
  221. public function __construct(SystemConfigDao $dao, FormBuilder $builder)
  222. {
  223. $this->dao = $dao;
  224. $this->builder = $builder;
  225. }
  226. /**
  227. * @return array|int[]|string[]
  228. * @author 吴汐
  229. * @email 442384644@qq.com
  230. * @date 2023/04/12
  231. */
  232. public function getSonConfig()
  233. {
  234. $sonConfig = [];
  235. $rolateRule = $this->relatedRule;
  236. if ($rolateRule) {
  237. foreach ($rolateRule as $key => $value) {
  238. $sonConfig = array_merge($sonConfig, array_keys($value['son_type']));
  239. foreach ($value['son_type'] as $k => $v) {
  240. if (isset($v['son_type'])) {
  241. $sonConfig = array_merge($sonConfig, array_keys($v['son_type']));
  242. }
  243. }
  244. }
  245. }
  246. return $sonConfig;
  247. }
  248. /**
  249. * 获取单个系统配置
  250. * @param string $configName
  251. * @param null $default
  252. * @return mixed|null
  253. * @throws \ReflectionException
  254. */
  255. public function getConfigValue(string $configName, $default = null)
  256. {
  257. $value = $this->dao->getConfigValue($configName);
  258. return is_null($value) ? $default : json_decode($value, true);
  259. }
  260. /**
  261. * 获取全部配置
  262. * @param array $configName
  263. * @return array
  264. * @throws \ReflectionException
  265. */
  266. public function getConfigAll(array $configName = [])
  267. {
  268. return array_map(function ($item) {
  269. return json_decode($item, true);
  270. }, $this->dao->getConfigAll($configName));
  271. }
  272. /**
  273. * 获取配置并分页
  274. * @param array $where
  275. * @return array
  276. * @throws \think\db\exception\DataNotFoundException
  277. * @throws \think\db\exception\DbException
  278. * @throws \think\db\exception\ModelNotFoundException
  279. */
  280. public function getConfigList(array $where)
  281. {
  282. [$page, $limit] = $this->getPageValue();
  283. $list = $this->dao->getConfigList($where, $page, $limit);
  284. $count = $this->dao->count($where);
  285. $tidy_srr = [];
  286. $configTabList = app()->make(SystemConfigTabServices::class)->getColumn([], 'title', 'id');
  287. foreach ($list as &$item) {
  288. $item['value'] = $item['value'] ? (json_decode($item['value'], true) ?: '') : '';
  289. if ($item['type'] == 'radio' || $item['type'] == 'checkbox') {
  290. $item['value'] = $this->getRadioOrCheckboxValueInfo($item['menu_name'], $item['value']);
  291. }
  292. if ($item['type'] == 'upload' && !empty($item['value'])) {
  293. if ($item['upload_type'] == 1 || $item['upload_type'] == 3) {
  294. $item['value'] = [set_file_url($item['value'])];
  295. } elseif ($item['upload_type'] == 2) {
  296. $item['value'] = set_file_url($item['value']);
  297. }
  298. foreach ($item['value'] as $key => $value) {
  299. $tidy_srr[$key]['filepath'] = $value;
  300. $tidy_srr[$key]['filename'] = basename($value);
  301. }
  302. $item['value'] = $tidy_srr;
  303. }
  304. if ($item['level'] == 1) {
  305. $item['link_data'] = $this->getLinkData($item['link_id'], $item['link_value']);
  306. }
  307. $item['config_tab_name'] = $configTabList[$item['config_tab_id']] ?? '';
  308. }
  309. return compact('count', 'list');
  310. }
  311. /**
  312. * 获取关联的值
  313. * @param $id
  314. * @param $value
  315. * @return string
  316. * @throws \think\db\exception\DataNotFoundException
  317. * @throws \think\db\exception\DbException
  318. * @throws \think\db\exception\ModelNotFoundException
  319. * @author wuhaotian
  320. * @email 442384644@qq.com
  321. * @date 2024/5/31
  322. */
  323. public function getLinkData($id, $value)
  324. {
  325. $info = $this->dao->get($id);
  326. if (!$info) return '';
  327. $parameter = explode("\n", $info['parameter']);
  328. $result = [];
  329. foreach ($parameter as $item) {
  330. $parts = explode('=>', $item);
  331. $result[$parts[0]] = $parts[1];
  332. }
  333. return $info['info'] . '/' . $result[$value];
  334. }
  335. /**
  336. * 获取单选按钮或者多选按钮的显示值
  337. * @param $menu_name
  338. * @param $value
  339. * @return string
  340. * @throws \think\db\exception\DataNotFoundException
  341. * @throws \think\db\exception\ModelNotFoundException
  342. * @throws \think\exception\DbException
  343. */
  344. public function getRadioOrCheckboxValueInfo(string $menu_name, $value): string
  345. {
  346. $option = [];
  347. $config_one = $this->dao->getOne(['menu_name' => $menu_name]);
  348. if (!$config_one) {
  349. return '';
  350. }
  351. $parameter = explode("\n", $config_one['parameter']);
  352. foreach ($parameter as $k => $v) {
  353. if (isset($v) && strlen($v) > 0) {
  354. $data = explode('=>', $v);
  355. $option[$data[0]] = $data[1];
  356. }
  357. }
  358. $str = '';
  359. if (is_array($value)) {
  360. foreach ($value as $v) {
  361. $str .= $option[$v] . ',';
  362. }
  363. } else {
  364. $str .= !empty($value) ? $option[$value] ?? '' : $option[0] ?? '';
  365. }
  366. return $str;
  367. }
  368. /**
  369. * 获取系统配置信息
  370. * @param int $tabId
  371. * @return array
  372. * @throws \think\db\exception\DataNotFoundException
  373. * @throws \think\db\exception\DbException
  374. * @throws \think\db\exception\ModelNotFoundException
  375. */
  376. public function getReadList(int $tabId)
  377. {
  378. $info = $this->dao->getConfigTabAllList($tabId);
  379. foreach ($info as $k => $v) {
  380. if (!is_null(json_decode($v['value'])))
  381. $info[$k]['value'] = json_decode($v['value'], true);
  382. if ($v['type'] == 'upload' && !empty($v['value'])) {
  383. if ($v['upload_type'] == 1 || $v['upload_type'] == 3) $info[$k]['value'] = explode(',', $v['value']);
  384. }
  385. }
  386. return $info;
  387. }
  388. /**
  389. * 创建单行表单
  390. * @param string $type
  391. * @param array $data
  392. * @return array
  393. */
  394. public function createTextForm(string $type, array $data)
  395. {
  396. $formbuider = [];
  397. switch ($type) {
  398. case 'number':
  399. $data['value'] = isset($data['value']) ? json_decode($data['value'], true) : 0;
  400. $formbuider[] = $this->builder->number($data['menu_name'], $data['info'], (float)$data['value'])->controls(false)->appendRule('suffix', [
  401. 'type' => 'div',
  402. 'class' => 'tips-info',
  403. 'domProps' => ['innerHTML' => $data['desc']]
  404. ]);
  405. break;
  406. case 'dateTime':
  407. $formbuider[] = $this->builder->dateTime($data['menu_name'], $data['info'], $data['value'])->appendRule('suffix', [
  408. 'type' => 'div',
  409. 'class' => 'tips-info',
  410. 'domProps' => ['innerHTML' => $data['desc']]
  411. ]);
  412. break;
  413. case 'date':
  414. $data['value'] = json_decode($data['value'], true) ?: '';
  415. $formbuider[] = $this->builder->date($data['menu_name'], $data['info'], $data['value'])->appendRule('suffix', [
  416. 'type' => 'div',
  417. 'class' => 'tips-info',
  418. 'domProps' => ['innerHTML' => $data['desc']]
  419. ]);
  420. break;
  421. case 'time':
  422. $data['value'] = json_decode($data['value'], true) ?: '';
  423. $formbuider[] = $this->builder->time($data['menu_name'], $data['info'], $data['value'])->appendRule('suffix', [
  424. 'type' => 'div',
  425. 'class' => 'tips-info',
  426. 'domProps' => ['innerHTML' => $data['desc']]
  427. ]);
  428. break;
  429. case 'color':
  430. $data['value'] = isset($data['value']) ? json_decode($data['value'], true) : '';
  431. $formbuider[] = $this->builder->color($data['menu_name'], $data['info'], $data['value'])->appendRule('suffix', [
  432. 'type' => 'div',
  433. 'class' => 'tips-info',
  434. 'domProps' => ['innerHTML' => $data['desc']]
  435. ]);
  436. break;
  437. default:
  438. $data['value'] = isset($data['value']) ? json_decode($data['value'], true) : '';
  439. if ($data['menu_name'] == 'api' || $data['menu_name'] == 'routine_api') {
  440. $formbuider[] = $this->builder->input($data['menu_name'], $data['info'], strpos($data['value'], 'http') === false ? sys_config('site_url') . $data['value'] : $data['value'])->appendRule('suffix', [
  441. 'type' => 'div',
  442. 'class' => 'tips-info',
  443. 'domProps' => ['innerHTML' => $data['desc']]
  444. ])->col(13)->readonly(true);
  445. } else {
  446. $formbuider[] = $this->builder->input($data['menu_name'], $data['info'], $data['value'])->appendRule('suffix', [
  447. 'type' => 'div',
  448. 'class' => 'tips-info',
  449. 'domProps' => ['innerHTML' => $data['desc']]
  450. ])->col(13);
  451. }
  452. break;
  453. }
  454. return $formbuider;
  455. }
  456. /**
  457. * 创建多行文本框
  458. * @param array $data
  459. * @return mixed
  460. */
  461. public function createTextareaForm(array $data)
  462. {
  463. $data['value'] = json_decode($data['value'], true) ?: '';
  464. if ($data['menu_name'] == 'param_filter_data') $data['value'] = base64_decode($data['value']);
  465. $formbuider[] = $this->builder->textarea($data['menu_name'], $data['info'], $data['value'])->placeholder($data['desc'])->appendRule('suffix', [
  466. 'type' => 'div',
  467. 'class' => 'tips-info',
  468. 'domProps' => ['innerHTML' => $data['desc']]
  469. ])->rows(6)->col(13);
  470. return $formbuider;
  471. }
  472. /**
  473. * 创建当选表单
  474. * @param array $data
  475. * @param array $control
  476. * @param array $control_two
  477. * @return array
  478. */
  479. public function createRadioForm(array $data, $control = [], $control_two = [], $control_three = [])
  480. {
  481. $formbuider = [];
  482. $data['value'] = json_decode($data['value'], true) ?: '0';
  483. $parameter = explode("\n", $data['parameter']);
  484. $options = [];
  485. if ($parameter) {
  486. foreach ($parameter as $v) {
  487. if (strstr($v, $this->cuttingStr) !== false) {
  488. $pdata = explode($this->cuttingStr, $v);
  489. $res = preg_match('/^[0-9]$/', $pdata[0]);
  490. $options[] = ['label' => $pdata[1], 'value' => $res ? (int)$pdata[0] : $pdata[0]];
  491. }
  492. }
  493. $res = preg_match('/^[0-9]$/', $data['value']);
  494. $formbuider[] = $radio = $this->builder->radio($data['menu_name'], $data['info'], $res ? (int)$data['value'] : $data['value'])->options($options)->appendRule('suffix', [
  495. 'type' => 'div',
  496. 'class' => 'tips-info',
  497. 'domProps' => ['innerHTML' => $data['desc']]
  498. ])->col(13);
  499. if ($control) {
  500. $radio->appendControl($data['show_value'] ?? 1, is_array($control) ? $control : [$control]);
  501. }
  502. if ($control_two && isset($data['show_value2'])) {
  503. $radio->appendControl($data['show_value2'] ?? 2, is_array($control_two) ? $control_two : [$control_two]);
  504. }
  505. if ($control_three && isset($data['show_value3'])) {
  506. $radio->appendControl($data['show_value3'] ?? 3, is_array($control_three) ? $control_three : [$control_three]);
  507. }
  508. return $formbuider;
  509. }
  510. }
  511. /**
  512. * 创建上传组件表单
  513. * @param int $type
  514. * @param array $data
  515. * @return array
  516. */
  517. public function createUploadForm(int $type, array $data)
  518. {
  519. $formbuider = [];
  520. switch ($type) {
  521. case 1:
  522. $data['value'] = json_decode($data['value'], true) ?: '';
  523. if ($data['value'] != '') $data['value'] = set_file_url($data['value']);
  524. $formbuider[] = $this->builder->frameImage($data['menu_name'], $data['info'], $this->url(config('app.admin_prefix', 'admin') . '/widget.images/index', ['fodder' => $data['menu_name']], true), $data['value'])
  525. ->icon('el-icon-picture-outline')->width('950px')->height('560px')->Props(['footer' => false, 'modalTitle' => '预览'])->appendRule('suffix', [
  526. 'type' => 'div',
  527. 'class' => 'tips-info',
  528. 'domProps' => ['innerHTML' => $data['desc']]
  529. ])->col(13);
  530. break;
  531. case 2:
  532. $data['value'] = json_decode($data['value'], true) ?: [];
  533. if ($data['value'])
  534. $data['value'] = set_file_url($data['value']);
  535. $formbuider[] = $this->builder->frameImages($data['menu_name'], $data['info'], $this->url(config('app.admin_prefix', 'admin') . '/widget.images/index', ['fodder' => $data['menu_name'], 'type' => 'many', 'maxLength' => 5], true), $data['value'])
  536. ->maxLength(5)->icon('el-icon-picture-outline')->width('950px')->height('560px')->Props(['footer' => false, 'modalTitle' => '预览'])
  537. ->appendRule('suffix', [
  538. 'type' => 'div',
  539. 'class' => 'tips-info',
  540. 'domProps' => ['innerHTML' => $data['desc']]
  541. ])->col(13);
  542. break;
  543. case 3:
  544. $data['value'] = json_decode($data['value'], true) ?: '';
  545. if ($data['value'] != '') $data['value'] = set_file_url($data['value']);
  546. $formbuider[] = $this->builder->uploadFile($data['menu_name'], $data['info'], $this->url('/adminapi/file/upload/1', ['type' => 1], false, true), $data['value'])
  547. ->name('file')->appendRule('suffix', [
  548. 'type' => 'div',
  549. 'class' => 'tips-info',
  550. 'domProps' => ['innerHTML' => $data['desc']]
  551. ])->col(13)->data(['menu_name' => $data['menu_name']])->headers([
  552. 'Authori-zation' => app()->request->header('Authori-zation'),
  553. ]);
  554. break;
  555. }
  556. return $formbuider;
  557. }
  558. /**
  559. * 创建单选框
  560. * @param array $data
  561. * @return array
  562. * @throws \FormBuilder\Exception\FormBuilderException
  563. */
  564. public function createCheckboxForm(array $data)
  565. {
  566. $formbuider = [];
  567. $data['value'] = json_decode($data['value'], true) ?: [];
  568. $parameter = explode("\n", $data['parameter']);
  569. $options = [];
  570. if ($parameter) {
  571. foreach ($parameter as $v) {
  572. if (strstr($v, $this->cuttingStr) !== false) {
  573. $pdata = explode($this->cuttingStr, $v);
  574. $options[] = ['label' => $pdata[1], 'value' => $pdata[0]];
  575. }
  576. }
  577. $formbuider[] = $this->builder->checkbox($data['menu_name'], $data['info'], $data['value'])->options($options)->appendRule('suffix', [
  578. 'type' => 'div',
  579. 'class' => 'tips-info',
  580. 'domProps' => ['innerHTML' => $data['desc']]
  581. ])->col(13);
  582. }
  583. return $formbuider;
  584. }
  585. /**
  586. * 创建选择框表单
  587. * @param array $data
  588. * @return array
  589. * @throws \FormBuilder\Exception\FormBuilderException
  590. */
  591. public function createSelectForm(array $data)
  592. {
  593. $formbuider = [];
  594. $data['value'] = json_decode($data['value'], true) ?: [];
  595. $parameter = explode("\n", $data['parameter']);
  596. $options = [];
  597. if ($parameter) {
  598. foreach ($parameter as $v) {
  599. if (strstr($v, $this->cuttingStr) !== false) {
  600. $pdata = explode($this->cuttingStr, $v);
  601. $options[] = ['label' => $pdata[1], 'value' => $pdata[0]];
  602. }
  603. }
  604. $formbuider[] = $this->builder->select($data['menu_name'], $data['info'], $data['value'])->options($options)->appendRule('suffix', [
  605. 'type' => 'div',
  606. 'class' => 'tips-info',
  607. 'domProps' => ['innerHTML' => $data['desc']]
  608. ])->col(13);
  609. }
  610. return $formbuider;
  611. }
  612. /**
  613. * 开关选择
  614. * @param $data
  615. * @return array
  616. * @author: 吴汐
  617. * @email: 442384644@qq.com
  618. * @date: 2023/9/6
  619. */
  620. public function createSwitchForm($data)
  621. {
  622. $data['value'] = json_decode($data['value'], true) ?: '';
  623. $formbuider[] = $this->builder->switches($data['menu_name'], $data['info'], $data['value'])->appendRule('suffix', [
  624. 'type' => 'div',
  625. 'class' => 'tips-info',
  626. 'domProps' => ['innerHTML' => $data['desc']]
  627. ])->col(13);
  628. return $formbuider;
  629. }
  630. /**
  631. * 创建颜色选择器
  632. * @param array $data
  633. * @return mixed
  634. */
  635. public function createColorForm(array $data)
  636. {
  637. $data['value'] = json_decode($data['value'], true) ?: '';
  638. $formbuider[] = $this->builder->color($data['menu_name'], $data['info'], $data['value'])->appendRule('suffix', [
  639. 'type' => 'div',
  640. 'class' => 'tips-info',
  641. 'domProps' => ['innerHTML' => $data['desc']]
  642. ])->col(13);
  643. return $formbuider;
  644. }
  645. public function bindBuilderData($data, $relatedRule)
  646. {
  647. if (!$data) return false;
  648. $p_list = array();
  649. foreach ($relatedRule as $rk => $rv) {
  650. $p_list[$rk] = $data[$rk];
  651. if (isset($rv['son_type']) && is_array($rv['son_type'])) {
  652. foreach ($rv['son_type'] as $sk => $sv) {
  653. if (is_array($sv) && isset($sv['son_type'])) {
  654. foreach ($sv['son_type'] as $ssk => $ssv) {
  655. $tmp = $data[$sk];
  656. $tmp['console'] = $data[$ssk];
  657. $p_list[$rk]['console'][] = $tmp;
  658. }
  659. } else {
  660. $p_list[$rk]['console'][] = $data[$sk];
  661. }
  662. }
  663. }
  664. }
  665. return array_values($p_list);
  666. }
  667. /**
  668. * 获取系统配置表单
  669. * @param $data
  670. * @param bool $control
  671. * @param array $controle_two
  672. * @return array
  673. * @throws \FormBuilder\Exception\FormBuilderException
  674. */
  675. public function formTypeShine($data, $control = false, $controle_two = [], $controle_three = [])
  676. {
  677. switch ($data['type']) {
  678. case 'text'://文本框
  679. return $this->createTextForm($data['input_type'], $data);
  680. case 'radio'://单选框
  681. return $this->createRadioForm($data, $control, $controle_two, $controle_three);
  682. case 'textarea'://多行文本框
  683. return $this->createTextareaForm($data);
  684. case 'upload'://文件上传
  685. return $this->createUploadForm((int)$data['upload_type'], $data);
  686. case 'checkbox'://多选框
  687. return $this->createCheckboxForm($data);
  688. case 'select'://多选框
  689. return $this->createSelectForm($data);
  690. case 'color':
  691. return $this->createColorForm($data);
  692. case 'switch'://开关
  693. return $this->createSwitchForm($data);
  694. }
  695. }
  696. /**
  697. * @param int $tabId
  698. * @param array $formData
  699. * @param array $relatedRule
  700. * @return array|bool
  701. * @throws \think\db\exception\DataNotFoundException
  702. * @throws \think\db\exception\DbException
  703. * @throws \think\db\exception\ModelNotFoundException
  704. */
  705. public function createConfigForm(int $tabId, array $relatedRule)
  706. {
  707. $list = $this->dao->getConfigTabAllList($tabId);
  708. if (!$relatedRule) {
  709. $formbuider = $this->createNoCrontrolForm($list);
  710. } else {
  711. $formbuider = $this->createBindCrontrolForm($list, $relatedRule);
  712. }
  713. return $formbuider;
  714. }
  715. /**
  716. * 创建
  717. * @param array $list
  718. * @return array
  719. * @throws \FormBuilder\Exception\FormBuilderException
  720. * @throws \think\db\exception\DataNotFoundException
  721. * @throws \think\db\exception\DbException
  722. * @throws \think\db\exception\ModelNotFoundException
  723. */
  724. public function createForm(array $list)
  725. {
  726. if (!$list) return [];
  727. $list = array_combine(array_column($list, 'menu_name'), $list);
  728. $formbuider = [];
  729. $sonConfig = $this->getSonConfig();
  730. $sonConfig = array_merge($sonConfig, $this->dao->getColumn(['level' => 1], 'menu_name'));
  731. foreach ($list as $key => $data) {
  732. if (in_array($key, $sonConfig)) {
  733. continue;
  734. }
  735. switch ($data['type']) {
  736. case 'text'://文本框
  737. $formbuider = array_merge($formbuider, $this->createTextForm($data['input_type'], $data));
  738. break;
  739. case 'radio'://单选框
  740. $relateRule = $this->relatedRule;
  741. $builder = [];
  742. if (!isset($relateRule[$key])) {
  743. $relateRule = [];
  744. $sonData = $this->dao->getColumn(['level' => 1, 'link_id' => $data['id']], 'menu_name,link_value');
  745. $sonValue = [];
  746. foreach ($sonData as $sv) {
  747. $sonValue[$sv['link_value']][] = $sv['menu_name'];
  748. }
  749. $i = 0;
  750. foreach ($sonValue as $pk => $pv) {
  751. $label = $data['menu_name'];
  752. if ($i == 1) $label = $data['menu_name'] . '@';
  753. if ($i == 2) $label = $data['menu_name'] . '#';
  754. $relateRule[$label]['show_value'] = (int)$pk;
  755. foreach ($pv as $pvv) {
  756. $relateRule[$label]['son_type'][$pvv] = '';
  757. }
  758. $i++;
  759. }
  760. } else {
  761. $sonData = $this->dao->getColumn(['level' => 1, 'link_id' => $data['id']], 'menu_name,link_value');
  762. if ($sonData) {
  763. $sonValue = [];
  764. foreach ($sonData as $sv) {
  765. $sonValue[$sv['link_value']][] = $sv['menu_name'];
  766. }
  767. $i = 0;
  768. foreach ($sonValue as $pk => $pv) {
  769. $label = $data['menu_name'];
  770. if ($i == 1) $label = $data['menu_name'] . '@';
  771. if ($i == 2) $label = $data['menu_name'] . '#';
  772. if (!isset($relateRule[$label])) {
  773. $relateRule[$label]['show_value'] = (int)$pk;
  774. }
  775. foreach ($pv as $pvv) {
  776. $relateRule[$label]['son_type'][$pvv] = '';
  777. }
  778. $i++;
  779. }
  780. }
  781. }
  782. if (isset($relateRule[$key])) {
  783. $role = $relateRule[$key];
  784. $data['show_value'] = $role['show_value'];
  785. foreach ($role['son_type'] as $sk => $sv) {
  786. if (isset($list[$sk])) {
  787. $son_data = $list[$sk];
  788. $son_data['show_value'] = $role['show_value'];
  789. $son_build = [];
  790. if (isset($sv['son_type'])) {
  791. foreach ($sv['son_type'] as $ssk => $ssv) {
  792. $son_data['show_value'] = $sv['show_value'];
  793. $son_build[] = $this->formTypeShine($list[$ssk])[0];
  794. unset($list[$ssk]);
  795. }
  796. }
  797. $son_build_two = [];
  798. if (isset($role['son_type'][$sk . '@'])) {
  799. $son_type_two = $role['son_type'][$sk . '@'];
  800. $son_data['show_value2'] = $son_type_two['show_value'];
  801. if (isset($son_type_two['son_type'])) {
  802. foreach ($son_type_two['son_type'] as $ssk => $ssv) {
  803. if (isset($list[$ssk]['menu_name']) && $list[$ssk]['menu_name'] == 'watermark_text_color') $list[$ssk]['type'] = 'color';
  804. $son_build_two[] = $this->formTypeShine($list[$ssk])[0];
  805. unset($list[$ssk]);
  806. }
  807. }
  808. }
  809. $son_build_three = [];
  810. if (isset($role['son_type'][$sk . '#'])) {
  811. $son_type_three = $role['son_type'][$sk . '#'];
  812. $son_data['show_value3'] = $son_type_three['show_value'];
  813. if (isset($son_type_three['son_type'])) {
  814. foreach ($son_type_three['son_type'] as $ssk => $ssv) {
  815. if (isset($list[$ssk]['menu_name']) && $list[$ssk]['menu_name'] == 'watermark_text_color') $list[$ssk]['type'] = 'color';
  816. $son_build_three[] = $this->formTypeShine($list[$ssk])[0];
  817. unset($list[$ssk]);
  818. }
  819. }
  820. }
  821. $builder[] = $this->formTypeShine($son_data, $son_build, $son_build_two, $son_build_three)[0];
  822. unset($list[$sk]);
  823. }
  824. }
  825. $data['show_value'] = $role['show_value'];
  826. }
  827. $builder_two = [];
  828. if (isset($relateRule[$key . '@'])) {
  829. $role = $relateRule[$key . '@'];
  830. $data['show_value2'] = $role['show_value'];
  831. foreach ($role['son_type'] as $sk => $sv) {
  832. $son_data = $list[$sk];
  833. $son_data['show_value'] = $role['show_value'];
  834. $builder_two[] = $this->formTypeShine($son_data)[0];
  835. }
  836. }
  837. $builder_three = [];
  838. if (isset($relateRule[$key . '#'])) {
  839. $role = $relateRule[$key . '#'];
  840. $data['show_value3'] = $role['show_value'];
  841. foreach ($role['son_type'] as $sk => $sv) {
  842. $son_data = $list[$sk];
  843. $son_data['show_value'] = $role['show_value'];
  844. $builder_three[] = $this->formTypeShine($son_data)[0];
  845. }
  846. }
  847. $formbuider = array_merge($formbuider, $this->createRadioForm($data, $builder, $builder_two, $builder_three));
  848. break;
  849. case 'textarea'://多行文本框
  850. $formbuider = array_merge($formbuider, $this->createTextareaForm($data));
  851. break;
  852. case 'upload'://文件上传
  853. $formbuider = array_merge($formbuider, $this->createUploadForm((int)$data['upload_type'], $data));
  854. break;
  855. case 'checkbox'://多选框
  856. $formbuider = array_merge($formbuider, $this->createCheckboxForm($data));
  857. break;
  858. case 'select'://多选框
  859. $formbuider = array_merge($formbuider, $this->createSelectForm($data));
  860. break;
  861. case 'switch'://开关
  862. $formbuider = array_merge($formbuider, $this->createSwitchForm($data));
  863. break;
  864. }
  865. }
  866. return $formbuider;
  867. }
  868. /**无组件绑定规则
  869. * @param array $list
  870. * @return array|bool
  871. * @throws \FormBuilder\Exception\FormBuilderException
  872. * @throws \think\db\exception\DataNotFoundException
  873. * @throws \think\db\exception\DbException
  874. * @throws \think\db\exception\ModelNotFoundException
  875. */
  876. public function createNoCrontrolForm(array $list)
  877. {
  878. if (!$list) return false;
  879. $formbuider = [];
  880. foreach ($list as $key => $data) {
  881. switch ($data['type']) {
  882. case 'text'://文本框
  883. $formbuider = array_merge($formbuider, $this->createTextForm($data['input_type'], $data));
  884. break;
  885. case 'radio'://单选框
  886. $formbuider = array_merge($formbuider, $this->createRadioForm($data));
  887. break;
  888. case 'textarea'://多行文本框
  889. $formbuider = array_merge($formbuider, $this->createTextareaForm($data));
  890. break;
  891. case 'upload'://文件上传
  892. $formbuider = array_merge($formbuider, $this->createUploadForm((int)$data['upload_type'], $data));
  893. break;
  894. case 'checkbox'://多选框
  895. $formbuider = array_merge($formbuider, $this->createCheckboxForm($data));
  896. break;
  897. case 'select'://多选框
  898. $formbuider = array_merge($formbuider, $this->createSelectForm($data));
  899. break;
  900. case 'switch'://开关
  901. $formbuider = array_merge($formbuider, $this->createSwitchForm($data));
  902. break;
  903. }
  904. }
  905. return $formbuider;
  906. }
  907. /**
  908. * 有组件绑定规则
  909. * @param array $list
  910. * @param array $relatedRule
  911. * @return array|bool
  912. * @throws \FormBuilder\Exception\FormBuilderException
  913. * @throws \think\db\exception\DataNotFoundException
  914. * @throws \think\db\exception\DbException
  915. * @throws \think\db\exception\ModelNotFoundException
  916. */
  917. public function createBindCrontrolForm(array $list, array $relatedRule)
  918. {
  919. if (!$list || !$relatedRule) return false;
  920. $formbuider = [];
  921. $new_data = array();
  922. foreach ($list as $dk => $dv) {
  923. $new_data[$dv['menu_name']] = $dv;
  924. }
  925. foreach ($relatedRule as $rk => $rv) {
  926. if (isset($rv['son_type'])) {
  927. $data = $new_data[$rk];
  928. switch ($data['type']) {
  929. case 'text'://文本框
  930. $formbuider = array_merge($formbuider, $this->createTextForm($data['input_type'], $data));
  931. break;
  932. case 'radio'://单选框
  933. $son_builder = array();
  934. foreach ($rv['son_type'] as $sk => $sv) {
  935. if (isset($sv['son_type'])) {
  936. foreach ($sv['son_type'] as $ssk => $ssv) {
  937. $son_data = $new_data[$sk];
  938. $son_data['show_value'] = $sv['show_value'];
  939. $son_builder[] = $this->formTypeShine($son_data, $this->formTypeShine($new_data[$ssk])[0])[0];
  940. }
  941. } else {
  942. $son_data = $new_data[$sk];
  943. $son_data['show_value'] = $rv['show_value'];
  944. $son_builder[] = $this->formTypeShine($son_data)[0];
  945. }
  946. }
  947. $formbuider = array_merge($formbuider, $this->createRadioForm($data, $son_builder));
  948. break;
  949. case 'textarea'://多行文本框
  950. $formbuider = array_merge($formbuider, $this->createTextareaForm($data));
  951. break;
  952. case 'upload'://文件上传
  953. $formbuider = array_merge($formbuider, $this->createUploadForm((int)$data['upload_type'], $data));
  954. break;
  955. case 'checkbox'://多选框
  956. $formbuider = array_merge($formbuider, $this->createCheckboxForm($data));
  957. break;
  958. case 'select'://多选框
  959. $formbuider = array_merge($formbuider, $this->createSelectForm($data));
  960. break;
  961. case 'switch'://开关
  962. $formbuider = array_merge($formbuider, $this->createSwitchForm($data));
  963. break;
  964. }
  965. }
  966. }
  967. return $formbuider;
  968. }
  969. /**
  970. * 系统配置form表单创建
  971. * @param $url
  972. * @param int $tabId
  973. * @return array
  974. * @throws \FormBuilder\Exception\FormBuilderException
  975. * @throws \think\db\exception\DataNotFoundException
  976. * @throws \think\db\exception\DbException
  977. * @throws \think\db\exception\ModelNotFoundException
  978. */
  979. public function getConfigForm($url, int $tabId)
  980. {
  981. /** @var SystemConfigTabServices $service */
  982. $service = app()->make(SystemConfigTabServices::class);
  983. $title = $service->value(['id' => $tabId], 'title');
  984. $list = $this->dao->getConfigTabAllList($tabId);
  985. $formbuider = $this->createForm($list);
  986. $name = 'setting';
  987. if ($url) {
  988. $name = explode('/', $url)[2] ?? $name;
  989. }
  990. $postUrl = $this->postUrl[$name]['url'] ?? '/setting/config/save_basics';
  991. return create_form($title, $formbuider, $this->url($postUrl), 'POST');
  992. }
  993. /**
  994. * 新增路由增加设置项验证
  995. * @param $url
  996. * @param $post
  997. * @return bool
  998. */
  999. public function checkParam($url, $post)
  1000. {
  1001. $name = '';
  1002. if ($url) {
  1003. $name = explode('/', $url)[2] ?? $name;
  1004. }
  1005. $auth = $this->postUrl[$name]['auth'] ?? false;
  1006. if ($auth === false) {
  1007. throw new AdminException(400601);
  1008. }
  1009. if ($auth) {
  1010. /** @var SystemConfigTabServices $systemConfigTabServices */
  1011. $systemConfigTabServices = app()->make(SystemConfigTabServices::class);
  1012. foreach ($post as $key => $value) {
  1013. $tab_ids = $systemConfigTabServices->getColumn([['eng_title', 'IN', $auth]], 'id');
  1014. if (!$tab_ids || !in_array($key, $this->dao->getColumn([['config_tab_id', 'IN', $tab_ids]], 'menu_name'))) {
  1015. throw new AdminException(400602);
  1016. }
  1017. }
  1018. }
  1019. return true;
  1020. }
  1021. /**
  1022. * 修改配置获取form表单
  1023. * @param int $id
  1024. * @return array
  1025. * @throws \FormBuilder\Exception\FormBuilderException
  1026. * @throws \think\db\exception\DataNotFoundException
  1027. * @throws \think\db\exception\DbException
  1028. * @throws \think\db\exception\ModelNotFoundException
  1029. */
  1030. public function editConfigForm(int $id)
  1031. {
  1032. $menu = $this->dao->get($id)->getData();
  1033. if (!$menu) {
  1034. throw new AdminException(100026);
  1035. }
  1036. /** @var SystemConfigTabServices $service */
  1037. $service = app()->make(SystemConfigTabServices::class);
  1038. $formbuider = [];
  1039. $linkData = $this->linkData($menu['config_tab_id']);
  1040. $formbuider[] = $this->builder->radio('level', '联动显示', $menu['level'])->options([['value' => 0, 'label' => '否'], ['value' => 1, 'label' => '是']])->appendRule('suffix', [
  1041. 'type' => 'div',
  1042. 'class' => 'tips-info',
  1043. 'domProps' => ['innerHTML' => '否:默认正常展示此配置;是:此配置默认隐藏,当选中下方对应配置的值时,此配置才会显示']
  1044. ])->appendControl(1, [
  1045. $this->builder->cascader('link_data', '关联配置/值', [$menu['link_id'], $menu['link_value']])->options($linkData)->props(['props' => ['multiple' => false, 'checkStrictly' => false, 'emitPath' => true]])->style(['width' => '100%']),
  1046. ]);
  1047. $formbuider[] = $this->builder->input('menu_name', '字段变量', $menu['menu_name'])->disabled(1);
  1048. $formbuider[] = $this->builder->hidden('type', $menu['type']);
  1049. [$configTabList, $data] = $service->getConfigTabListForm((int)($menu['config_tab_id'] ?? 0));
  1050. $formbuider[] = $this->builder->cascader('config_tab_id', '分类', $data)->options($configTabList)->filterable(true)->props(['props' => ['multiple' => false, 'checkStrictly' => true, 'emitPath' => true]])->style(['width' => '100%']);
  1051. $formbuider[] = $this->builder->input('info', '配置名称', $menu['info'])->autofocus(1);
  1052. $formbuider[] = $this->builder->input('desc', '配置简介', $menu['desc']);
  1053. switch ($menu['type']) {
  1054. case 'text':
  1055. $menu['value'] = json_decode($menu['value'], true);
  1056. $formbuider[] = $this->builder->select('input_type', '类型', $menu['input_type'])->setOptions([
  1057. ['value' => 'input', 'label' => '文本框']
  1058. , ['value' => 'dateTime', 'label' => '日期时间']
  1059. , ['value' => 'date', 'label' => '日期']
  1060. , ['value' => 'time', 'label' => '时间']
  1061. , ['value' => 'color', 'label' => '颜色']
  1062. , ['value' => 'number', 'label' => '数字']
  1063. ]);
  1064. //输入框验证规则
  1065. $formbuider[] = $this->builder->input('value', '默认值', $menu['value']);
  1066. if (!empty($menu['required'])) {
  1067. $formbuider[] = $this->builder->number('width', '文本框宽', (int)$menu['width']);
  1068. $formbuider[] = $this->builder->input('required', '验证规则', $menu['required'])->placeholder('多个请用,隔开例如:required:true,url:true');
  1069. }
  1070. break;
  1071. case 'textarea':
  1072. $menu['value'] = json_decode($menu['value'], true);
  1073. //多行文本
  1074. if (!empty($menu['high'])) {
  1075. $formbuider[] = $this->builder->textarea('value', '默认值', $menu['value'])->rows(5);
  1076. $formbuider[] = $this->builder->number('width', '文本框宽', (int)$menu['width']);
  1077. $formbuider[] = $this->builder->number('high', '多行文本框高', (int)$menu['high']);
  1078. } else {
  1079. $formbuider[] = $this->builder->input('value', '默认值', $menu['value']);
  1080. }
  1081. break;
  1082. case 'radio':
  1083. $formbuider = array_merge($formbuider, $this->createRadioForm($menu));
  1084. //单选和多选参数配置
  1085. if (!empty($menu['parameter'])) {
  1086. $formbuider[] = $this->builder->textarea('parameter', '配置参数', $menu['parameter'])->placeholder("参数方式例如:\n1=>白色\n2=>红色\n3=>黑色");
  1087. }
  1088. break;
  1089. case 'checkbox':
  1090. $formbuider = array_merge($formbuider, $this->createCheckboxForm($menu));
  1091. //单选和多选参数配置
  1092. if (!empty($menu['parameter'])) {
  1093. $formbuider[] = $this->builder->textarea('parameter', '配置参数', $menu['parameter'])->placeholder("参数方式例如:\n1=>白色\n2=>红色\n3=>黑色");
  1094. }
  1095. break;
  1096. case 'upload':
  1097. $formbuider = array_merge($formbuider, $this->createUploadForm(($menu['upload_type']), $menu));
  1098. //上传类型选择
  1099. if (!empty($menu['upload_type'])) {
  1100. $formbuider[] = $this->builder->radio('upload_type', '上传类型', $menu['upload_type'])->options([['value' => 1, 'label' => '单图'], ['value' => 2, 'label' => '多图'], ['value' => 3, 'label' => '文件']]);
  1101. }
  1102. break;
  1103. case 'switch':
  1104. $formbuider = array_merge($formbuider, $this->createSwitchForm($menu));
  1105. break;
  1106. }
  1107. $formbuider[] = $this->builder->number('sort', '排序', (int)$menu['sort']);
  1108. $formbuider[] = $this->builder->radio('status', '状态', $menu['status'])->options([['value' => 1, 'label' => '显示'], ['value' => 0, 'label' => '隐藏']]);
  1109. return create_form('编辑字段', $formbuider, $this->url('/setting/config/' . $id), 'PUT');
  1110. }
  1111. /**
  1112. * 字段状态
  1113. * @return array
  1114. */
  1115. public function formStatus(): array
  1116. {
  1117. return [['value' => 1, 'label' => '显示'], ['value' => 0, 'label' => '隐藏']];
  1118. }
  1119. /**
  1120. * 选择文文件类型
  1121. * @return array
  1122. */
  1123. public function uploadType(): array
  1124. {
  1125. return [
  1126. ['value' => 1, 'label' => '单图']
  1127. , ['value' => 2, 'label' => '多图']
  1128. , ['value' => 3, 'label' => '文件']
  1129. ];
  1130. }
  1131. /**
  1132. * 选择文本框类型
  1133. * @return array
  1134. */
  1135. public function textType(): array
  1136. {
  1137. return [
  1138. ['value' => 'input', 'label' => '文本框']
  1139. , ['value' => 'dateTime', 'label' => '日期时间']
  1140. , ['value' => 'date', 'label' => '日期']
  1141. , ['value' => 'time', 'label' => '时间']
  1142. , ['value' => 'color', 'label' => '颜色']
  1143. , ['value' => 'number', 'label' => '数字']
  1144. ];
  1145. }
  1146. /**
  1147. * 获取创建配置规格表单
  1148. * @param int $type
  1149. * @param int $tab_id
  1150. * @return array
  1151. * @throws \FormBuilder\Exception\FormBuilderException
  1152. * @throws \think\db\exception\DataNotFoundException
  1153. * @throws \think\db\exception\DbException
  1154. * @throws \think\db\exception\ModelNotFoundException
  1155. */
  1156. public function createFormRule(int $type, int $tab_id): array
  1157. {
  1158. /** @var SystemConfigTabServices $service */
  1159. $service = app()->make(SystemConfigTabServices::class);
  1160. $formbuider = [];
  1161. $form_type = '';
  1162. $info_type = [];
  1163. $parameter = [];
  1164. switch ($type) {
  1165. case 0://文本框
  1166. $form_type = 'text';
  1167. $info_type = $this->builder->select('input_type', '类型')->setOptions($this->textType());
  1168. $parameter[] = $this->builder->input('value', '默认值');
  1169. $parameter[] = $this->builder->number('width', '文本框宽', 100);
  1170. $parameter[] = $this->builder->input('required', '验证规则')->placeholder('多个请用,隔开例如:required:true,url:true');
  1171. break;
  1172. case 1://多行文本框
  1173. $form_type = 'textarea';
  1174. $parameter[] = $this->builder->textarea('value', '默认值');
  1175. $parameter[] = $this->builder->number('width', '文本框宽', 100);
  1176. $parameter[] = $this->builder->number('high', '多行文本框高', 5);
  1177. break;
  1178. case 2://单选框
  1179. $form_type = 'radio';
  1180. $parameter[] = $this->builder->textarea('parameter', '配置参数')->placeholder("参数方式例如:\n1=>男\n2=>女\n3=>保密");
  1181. $parameter[] = $this->builder->input('value', '默认值');
  1182. break;
  1183. case 3://文件上传
  1184. $form_type = 'upload';
  1185. $parameter[] = $this->builder->radio('upload_type', '上传类型', 1)->options($this->uploadType());
  1186. break;
  1187. case 4://多选框
  1188. $form_type = 'checkbox';
  1189. $parameter[] = $this->builder->textarea('parameter', '配置参数')->placeholder("参数方式例如:\n1=>白色\n2=>红色\n3=>黑色");
  1190. break;
  1191. case 5://下拉框
  1192. $form_type = 'select';
  1193. $parameter[] = $this->builder->textarea('parameter', '配置参数')->placeholder("参数方式例如:\n1=>白色\n2=>红色\n3=>黑色");
  1194. break;
  1195. case 6://开关
  1196. $form_type = 'switch';
  1197. $parameter[] = $this->builder->switches('value', '默认');
  1198. break;
  1199. }
  1200. if ($form_type) {
  1201. $formbuider[] = $this->builder->hidden('type', $form_type);
  1202. [$configTabList, $data] = $service->getConfigTabListForm((int)($tab_id ?? 0));
  1203. $linkData = $this->linkData($tab_id);
  1204. $formbuider[] = $this->builder->radio('level', '联动显示', 0)->options([['value' => 0, 'label' => '否'], ['value' => 1, 'label' => '是']])->appendRule('suffix', [
  1205. 'type' => 'div',
  1206. 'class' => 'tips-info',
  1207. 'domProps' => ['innerHTML' => '否:默认正常展示此配置;是:此配置默认隐藏,当选中下方对应配置的值时,此配置才会显示']
  1208. ])->appendControl(1, [
  1209. $this->builder->cascader('link_data', '关联配置/值')->options($linkData)->props(['props' => ['multiple' => false, 'checkStrictly' => false, 'emitPath' => true]])->style(['width' => '100%']),
  1210. ]);
  1211. $formbuider[] = $this->builder->cascader('config_tab_id', '分类', $data)->options($configTabList)->filterable(true)->props(['props' => ['multiple' => false, 'checkStrictly' => true, 'emitPath' => false]])->style(['width' => '100%']);
  1212. if ($info_type) {
  1213. $formbuider[] = $info_type;
  1214. }
  1215. $formbuider[] = $this->builder->input('info', '配置名称')->autofocus(1);
  1216. $formbuider[] = $this->builder->input('menu_name', '字段变量')->placeholder('例如:site_url');
  1217. $formbuider[] = $this->builder->input('desc', '表单说明');
  1218. $formbuider = array_merge($formbuider, $parameter);
  1219. $formbuider[] = $this->builder->number('sort', '排序', 0);
  1220. $formbuider[] = $this->builder->radio('status', '状态', 1)->options($this->formStatus());
  1221. }
  1222. return create_form('添加字段', $formbuider, $this->url('/setting/config'), 'POST');
  1223. }
  1224. /**
  1225. * 根据指定的标签ID,链接数据并以特定格式返回。
  1226. * @param $tab_id
  1227. * @return array
  1228. * @author wuhaotian
  1229. * @email 442384644@qq.com
  1230. * @date 2024/5/30
  1231. */
  1232. public function linkData($tab_id)
  1233. {
  1234. $linkData = $this->selectList(['config_tab_id' => $tab_id, 'type' => 'radio', 'level' => 0], 'info as label,id as value,parameter')->toArray();
  1235. foreach ($linkData as &$item) {
  1236. $parameter = [];
  1237. $parameter = explode("\n", $item['parameter']);
  1238. foreach ($parameter as $pv) {
  1239. $pvArr = explode('=>', $pv);
  1240. $item['children'][] = [
  1241. 'label' => $pvArr[1],
  1242. 'value' => (int)$pvArr[0]
  1243. ];
  1244. }
  1245. }
  1246. return $linkData;
  1247. }
  1248. /**
  1249. * radio 和 checkbox规则的判断
  1250. * @param $data
  1251. * @return bool
  1252. */
  1253. public function valiDateRadioAndCheckbox($data)
  1254. {
  1255. $option = [];
  1256. $option_new = [];
  1257. $data['parameter'] = str_replace("\r\n", "\n", $data['parameter']);//防止不兼容
  1258. $parameter = explode("\n", $data['parameter']);
  1259. if (count($parameter) < 2) {
  1260. throw new AdminException(400603);
  1261. }
  1262. foreach ($parameter as $k => $v) {
  1263. if (isset($v) && !empty($v)) {
  1264. $option[$k] = explode('=>', $v);
  1265. }
  1266. }
  1267. if (count($option) < 2) {
  1268. throw new AdminException(400603);
  1269. }
  1270. $bool = 1;
  1271. foreach ($option as $k => $v) {
  1272. $option_new[$k] = $option[$k][0];
  1273. foreach ($v as $kk => $vv) {
  1274. $vv_num = strlen($vv);
  1275. if (!$vv_num) {
  1276. $bool = 0;
  1277. }
  1278. }
  1279. }
  1280. if (!$bool) {
  1281. throw new AdminException(400603);
  1282. }
  1283. $num1 = count($option_new);//提取该数组的数目
  1284. $arr2 = array_unique($option_new);//合并相同的元素
  1285. $num2 = count($arr2);//提取合并后数组个数
  1286. if ($num1 > $num2) {
  1287. throw new AdminException(400603);
  1288. }
  1289. return true;
  1290. }
  1291. /**
  1292. * 验证参数
  1293. * @param $data
  1294. * @return bool
  1295. */
  1296. public function valiDateValue($data)
  1297. {
  1298. if (!$data || !isset($data['required']) || !$data['required']) {
  1299. return true;
  1300. }
  1301. $valids = explode(',', $data['required']);
  1302. foreach ($valids as $valid) {
  1303. $valid = explode(':', $valid);
  1304. if (isset($valid[0]) && isset($valid[1])) {
  1305. $k = strtolower(trim($valid[0]));
  1306. $v = strtolower(trim($valid[1]));
  1307. switch ($k) {
  1308. case 'required':
  1309. if ($v == 'true' && $data['value'] === '') {
  1310. throw new AdminException(400604, ['name' => $data['info'] ?? '']);
  1311. }
  1312. break;
  1313. case 'url':
  1314. if ($v == 'true' && !check_link($data['value'])) {
  1315. throw new AdminException(400605, ['name' => $data['info'] ?? '']);
  1316. }
  1317. break;
  1318. }
  1319. }
  1320. }
  1321. }
  1322. /**
  1323. * 保存平台电子面单打印信息
  1324. * @param array $data
  1325. * @return bool
  1326. */
  1327. public function saveExpressInfo(array $data)
  1328. {
  1329. if (!is_array($data) || !$data) return false;
  1330. // config_export_id 快递公司id
  1331. // config_export_temp_id 快递公司模板id
  1332. // config_export_com 快递公司编码
  1333. // config_export_to_name 发货人姓名
  1334. // config_export_to_tel 发货人电话
  1335. // config_export_to_address 发货人详细地址
  1336. // config_export_siid 电子面单打印机编号
  1337. foreach ($data as $key => $value) {
  1338. $this->dao->update(['menu_name' => 'config_export_' . $key], ['value' => json_encode($value)]);
  1339. }
  1340. CacheService::clear();
  1341. return true;
  1342. }
  1343. /**
  1344. * 获取分享海报 兼容方法
  1345. */
  1346. public function getSpreadBanner()
  1347. {
  1348. //配置
  1349. $banner = sys_config('spread_banner', []);
  1350. if (!$banner) {
  1351. //组合数据
  1352. $banner = sys_data('routine_spread_banner');
  1353. if ($banner) {
  1354. $banner = array_column($banner, 'pic');
  1355. $this->dao->update(['menu_name' => 'spread_banner'], ['value' => json_encode($banner)]);
  1356. CacheService::clear();
  1357. }
  1358. }
  1359. return $banner;
  1360. }
  1361. /**
  1362. * 保存wss配置
  1363. * @param int $wssOpen
  1364. * @param string $wssLocalpk
  1365. * @param string $wssLocalCert
  1366. */
  1367. public function saveSslFilePath(int $wssOpen, string $wssLocalpk, string $wssLocalCert)
  1368. {
  1369. $wssFile = root_path() . '.wss';
  1370. $content = <<<WSS
  1371. wssOpen = $wssOpen
  1372. wssLocalpk = $wssLocalpk
  1373. wssLocalCert = $wssLocalCert
  1374. WSS;
  1375. try {
  1376. file_put_contents($wssFile, $content);
  1377. } catch (\Throwable $e) {
  1378. throw new AdminException(400606);
  1379. }
  1380. }
  1381. /**
  1382. * 获取wss配置
  1383. * @param string $key
  1384. * @return array|false|mixed
  1385. */
  1386. public function getSslFilePath(string $key = '')
  1387. {
  1388. $wssFile = root_path() . '.wss';
  1389. try {
  1390. $content = parse_ini_file($wssFile);
  1391. } catch (\Throwable $e) {
  1392. $content = [];
  1393. }
  1394. return $content[$key] ?? $content;
  1395. }
  1396. /**
  1397. * 检测缩略图水印配置是否更改
  1398. * @param array $post
  1399. * @return bool
  1400. */
  1401. public function checkThumbParam(array $post)
  1402. {
  1403. unset($post['upload_type'], $post['image_watermark_status']);
  1404. /** @var SystemConfigTabServices $systemConfigTabServices */
  1405. $systemConfigTabServices = app()->make(SystemConfigTabServices::class);
  1406. //上传配置->基础配置
  1407. $tab_id = $systemConfigTabServices->getColumn(['eng_title' => 'base_config'], 'id');
  1408. if ($tab_id) {
  1409. $all = $this->dao->getColumn(['config_tab_id' => $tab_id], 'value', 'menu_name');
  1410. if (array_intersect(array_keys($all), array_keys($post))) {
  1411. foreach ($post as $key => $item) {
  1412. //配置更改删除原来生成的缩略图
  1413. if (isset($all[$key]) && $item != json_decode($all[$key], true)) {
  1414. try {
  1415. FileService::delDir(public_path('uploads/thumb_water'));
  1416. break;
  1417. } catch (\Throwable $e) {
  1418. }
  1419. }
  1420. }
  1421. }
  1422. }
  1423. return true;
  1424. }
  1425. /**
  1426. * 变更分销绑定关系模式
  1427. * @param array $post
  1428. * @return bool
  1429. */
  1430. public function checkBrokerageBinding(array $post)
  1431. {
  1432. try {
  1433. $config_data = $post['store_brokerage_binding_status'];
  1434. $config_one = $this->dao->getOne(['menu_name' => 'store_brokerage_binding_status']);
  1435. $config_old = json_decode($config_one['value'], true);
  1436. if ($config_old != 2 && $config_data == 2) {
  1437. //自动解绑上级绑定
  1438. /** @var AgentManageServices $agentManage */
  1439. $agentManage = app()->make(AgentManageServices::class);
  1440. $agentManage->resetSpreadTime();
  1441. }
  1442. } catch (\Throwable $e) {
  1443. Log::error('变更分销绑定模式重置绑定时间失败,失败原因:' . $e->getMessage());
  1444. return false;
  1445. }
  1446. return true;
  1447. }
  1448. }