SystemConfigServices.php 53 KB

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