SystemConfigServices.php 60 KB

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