SystemConfigServices.php 43 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
  4. // +----------------------------------------------------------------------
  5. // | Copyright (c) 2016~2020 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\BaseServices;
  14. use crmeb\exceptions\AdminException;
  15. use crmeb\services\FormBuilder;
  16. use think\exception\ValidateException;
  17. /**
  18. * 系统配置
  19. * Class SystemConfigServices
  20. * @package app\services\system\config
  21. * @method count(array $where = []) 获取指定条件下的count
  22. * @method save(array $data) 保存数据
  23. * @method get(int $id, ?array $field = []) 获取一条数据
  24. * @method update($id, array $data, ?string $key = null) 修改数据
  25. * @method delete(int $id, ?string $key = null) 删除数据
  26. * @method getUploadTypeList(string $configName) 获取上传配置中的上传类型
  27. */
  28. class SystemConfigServices extends BaseServices
  29. {
  30. /**
  31. * form表单句柄
  32. * @var FormBuilder
  33. */
  34. protected $builder;
  35. /**
  36. * 表单数据切割符号
  37. * @var string
  38. */
  39. protected $cuttingStr = '=>';
  40. /**
  41. * 表单提交url
  42. * @var string[]
  43. */
  44. protected $postUrl = [
  45. 'setting' => [
  46. 'url' => '/setting/config/save_basics',
  47. 'auth' => [],
  48. ],
  49. 'serve' => [
  50. 'url' => '/serve/sms_config/save_basics',
  51. 'auth' => ['short_letter_switch'],
  52. ],
  53. 'freight' => [
  54. 'url' => '/freight/config/save_basics',
  55. 'auth' => ['express'],
  56. ],
  57. 'agent' => [
  58. 'url' => '/agent/config/save_basics',
  59. 'auth' => ['fenxiao','brokerage_type','brokerage_set','extract_set'],
  60. ],
  61. 'marketing' => [
  62. 'url' => '/marketing/integral_config/save_basics',
  63. 'auth' => ['point'],
  64. ]
  65. ];
  66. /**
  67. * 子集控制规则
  68. * @var array[]
  69. */
  70. protected $relatedRule = [
  71. 'brokerage_func_status' => [
  72. 'son_type' => [
  73. 'store_brokerage_statu' => [
  74. 'son_type' => ['store_brokerage_price' => ''],
  75. 'show_value' => 3
  76. ],
  77. 'brokerage_bindind' => '',
  78. 'store_brokerage_binding_status' => [
  79. 'son_type' => ['store_brokerage_binding_time' => ''],
  80. 'show_value' => 2
  81. ],
  82. 'spread_banner' => '',
  83. ],
  84. 'show_value' => 1
  85. ],
  86. 'brokerage_user_status' => [
  87. 'son_type' => [
  88. 'uni_brokerage_price' => '',
  89. 'day_brokerage_price_upper' => '',
  90. ],
  91. 'show_value' => 1
  92. ],
  93. 'pay_success_printing_switch' => [
  94. 'son_type' => [
  95. 'develop_id' => '',
  96. 'printing_api_key' => '',
  97. 'printing_client_id' => '',
  98. 'terminal_number' => '',
  99. ],
  100. 'show_value' => 1
  101. ],
  102. 'wss_open' => [
  103. 'son_type' => [
  104. 'wss_local_cert' => '',
  105. 'wss_local_pk' => '',
  106. ],
  107. 'show_value' => 1
  108. ],
  109. 'invoice_func_status' => [
  110. 'son_type' => [
  111. 'special_invoice_status' => '',
  112. ],
  113. 'show_value' => 1
  114. ],
  115. 'member_func_status' => [
  116. 'son_type' => [
  117. 'order_give_exp' => '',
  118. 'sign_give_exp' => '',
  119. 'invite_user_exp' => ''
  120. ],
  121. 'show_value' => 1
  122. ],
  123. 'balance_func_status' => [
  124. 'son_type' => [
  125. 'recharge_attention' => '',
  126. 'recharge_switch' => '',
  127. 'store_user_min_recharge' => '',
  128. ],
  129. 'show_value' => 1
  130. ],
  131. 'system_product_copy_type' => [
  132. 'son_type' => [
  133. 'copy_product_apikey' => '',
  134. ],
  135. 'show_value' => 2
  136. ],
  137. 'logistics_type' => [
  138. 'son_type' => [
  139. 'system_express_app_code' => '',
  140. ],
  141. 'show_value' => 2
  142. ],
  143. 'ali_pay_status' => [
  144. 'son_type' => [
  145. 'ali_pay_appid' => '',
  146. 'alipay_merchant_private_key' => '',
  147. 'alipay_public_key' => '',
  148. ],
  149. 'show_value' => 1
  150. ],
  151. 'pay_weixin_open' => [
  152. 'son_type' => [
  153. 'pay_weixin_mchid' => '',
  154. 'pay_weixin_key' => '',
  155. 'pay_weixin_client_cert' => '',
  156. 'pay_weixin_client_key' => '',
  157. 'paydir' => '',
  158. ],
  159. 'show_value' => 1
  160. ],
  161. 'config_export_open' => [
  162. 'son_type' => [
  163. 'config_export_to_name' => '',
  164. 'config_export_to_tel' => '',
  165. 'config_export_to_address' => '',
  166. 'config_export_siid' => '',
  167. ],
  168. 'show_value' => 1
  169. ],
  170. 'image_watermark_status' => [
  171. 'son_type' => [
  172. 'watermark_type' => [
  173. 'son_type' => [
  174. 'watermark_image' => '',
  175. 'watermark_opacity' => '',
  176. 'watermark_rotate' => '',
  177. ],
  178. 'show_value' => 1
  179. ],
  180. 'watermark_position' => '',
  181. 'watermark_x' => '',
  182. 'watermark_y' => '',
  183. 'watermark_type@' => [
  184. 'son_type' => [
  185. 'watermark_text' => '',
  186. 'watermark_text_size' => '',
  187. 'watermark_text_color' => '',
  188. 'watermark_text_angle' => ''
  189. ],
  190. 'show_value' => 2
  191. ],
  192. ],
  193. 'show_value' => 1
  194. ],
  195. ];
  196. /**
  197. * SystemConfigServices constructor.
  198. * @param SystemConfigDao $dao
  199. */
  200. public function __construct(SystemConfigDao $dao, FormBuilder $builder)
  201. {
  202. $this->dao = $dao;
  203. $this->builder = $builder;
  204. }
  205. public function getSonConfig()
  206. {
  207. $sonConfig = [];
  208. $rolateRule = $this->relatedRule;
  209. if ($rolateRule) {
  210. foreach ($rolateRule as $key => $value) {
  211. $sonConfig = array_merge($sonConfig, array_keys($value['son_type']));
  212. foreach ($value['son_type'] as $k => $v) {
  213. if (isset($v['son_type'])) {
  214. $sonConfig = array_merge($sonConfig, array_keys($v['son_type']));
  215. }
  216. }
  217. }
  218. }
  219. return $sonConfig;
  220. }
  221. /**
  222. * 获取单个系统配置
  223. * @param string $configName
  224. * @param null $default
  225. * @return mixed|null
  226. */
  227. public function getConfigValue(string $configName, $default = null)
  228. {
  229. $value = $this->dao->getConfigValue($configName);
  230. return is_null($value) ? $default : json_decode($value,true);
  231. }
  232. /**
  233. * 获取全部配置
  234. * @param array $configName
  235. * @return array
  236. */
  237. public function getConfigAll(array $configName = [])
  238. {
  239. return array_map(function ($item) {
  240. return json_decode($item, true);
  241. }, $this->dao->getConfigAll($configName));
  242. }
  243. /**
  244. * 获取配置并分页
  245. * @param array $where
  246. * @return array
  247. * @throws \think\db\exception\DataNotFoundException
  248. * @throws \think\db\exception\DbException
  249. * @throws \think\db\exception\ModelNotFoundException
  250. */
  251. public function getConfigList(array $where)
  252. {
  253. [$page, $limit] = $this->getPageValue();
  254. $list = $this->dao->getConfigList($where, $page, $limit);
  255. $count = $this->dao->count($where);
  256. foreach ($list as &$item) {
  257. $item['value'] = $item['value'] ? json_decode($item['value'], true) ?: '' : '';
  258. if ($item['type'] == 'radio' || $item['type'] == 'checkbox') {
  259. $item['value'] = $this->getRadioOrCheckboxValueInfo($item['menu_name'], $item['value']);
  260. }
  261. if ($item['type'] == 'upload' && !empty($item['value'])) {
  262. if ($item['upload_type'] == 1 || $item['upload_type'] == 3) {
  263. $item['value'] = [set_file_url($item['value'])];
  264. }elseif ($item['upload_type'] == 2){
  265. $item['value'] = set_file_url($item['value']);
  266. }
  267. foreach ($item['value'] as $key => $value) {
  268. $tidy_srr[$key]['filepath'] = $value;
  269. $tidy_srr[$key]['filename'] = basename($value);
  270. }
  271. $item['value'] = $tidy_srr;
  272. }
  273. }
  274. return compact('count', 'list');
  275. }
  276. /**
  277. * 获取单选按钮或者多选按钮的显示值
  278. * @param $menu_name
  279. * @param $value
  280. * @return string
  281. * @throws \think\db\exception\DataNotFoundException
  282. * @throws \think\db\exception\ModelNotFoundException
  283. * @throws \think\exception\DbException
  284. */
  285. public function getRadioOrCheckboxValueInfo(string $menu_name, $value): string
  286. {
  287. $option = [];
  288. $config_one = $this->dao->getOne(['menu_name' => $menu_name]);
  289. if (!$config_one) {
  290. return '';
  291. }
  292. $parameter = explode("\n", $config_one['parameter']);
  293. foreach ($parameter as $k => $v) {
  294. if (isset($v) && strlen($v) > 0) {
  295. $data = explode('=>', $v);
  296. $option[$data[0]] = $data[1];
  297. }
  298. }
  299. $str = '';
  300. if (is_array($value)) {
  301. foreach ($value as $v) {
  302. $str .= $option[$v] . ',';
  303. }
  304. } else {
  305. $str .= !empty($value) ? $option[$value] ?? '' : $option[0] ?? '';
  306. }
  307. return $str;
  308. }
  309. /**
  310. * 获取系统配置信息
  311. * @param int $tabId
  312. * @return array
  313. * @throws \think\db\exception\DataNotFoundException
  314. * @throws \think\db\exception\DbException
  315. * @throws \think\db\exception\ModelNotFoundException
  316. */
  317. public function getReadList(int $tabId)
  318. {
  319. $info = $this->dao->getConfigTabAllList($tabId);
  320. foreach ($info as $k => $v) {
  321. if (!is_null(json_decode($v['value'])))
  322. $info[$k]['value'] = json_decode($v['value'], true);
  323. if ($v['type'] == 'upload' && !empty($v['value'])) {
  324. if ($v['upload_type'] == 1 || $v['upload_type'] == 3) $info[$k]['value'] = explode(',', $v['value']);
  325. }
  326. }
  327. return $info;
  328. }
  329. /**
  330. * 创建单行表单
  331. * @param string $type
  332. * @param array $data
  333. * @return array
  334. */
  335. public function createTextForm(string $type, array $data)
  336. {
  337. $formbuider = [];
  338. switch ($type) {
  339. case 'input':
  340. $data['value'] = isset($data['value']) ? json_decode($data['value'], true) : '';
  341. $formbuider[] = $this->builder->input($data['menu_name'], $data['info'], $data['value'])->info($data['desc'])->placeholder($data['desc'])->col(13);
  342. break;
  343. case 'number':
  344. $data['value'] = isset($data['value']) ? json_decode($data['value'], true) : 0;
  345. $formbuider[] = $this->builder->number($data['menu_name'], $data['info'], (float)$data['value'])->info($data['desc']);
  346. break;
  347. case 'dateTime':
  348. $formbuider[] = $this->builder->dateTime($data['menu_name'], $data['info'], $data['value'])->info($data['desc']);
  349. break;
  350. case 'color':
  351. $data['value'] = isset($data['value']) ? json_decode($data['value'], true) : '';
  352. $formbuider[] = $this->builder->color($data['menu_name'], $data['info'], $data['value'])->info($data['desc']);
  353. break;
  354. default:
  355. $data['value'] = isset($data['value']) ? json_decode($data['value'], true) : '';
  356. $formbuider[] = $this->builder->input($data['menu_name'], $data['info'], $data['value'])->info($data['desc'])->placeholder($data['desc'])->col(13);
  357. break;
  358. }
  359. return $formbuider;
  360. }
  361. /**
  362. * 创建多行文本框
  363. * @param array $data
  364. * @return mixed
  365. */
  366. public function createTextareaForm(array $data)
  367. {
  368. $data['value'] = json_decode($data['value'], true) ?: '';
  369. $formbuider[] = $this->builder->textarea($data['menu_name'], $data['info'], $data['value'])->placeholder($data['desc'])->info($data['desc'])->rows(6)->col(13);
  370. return $formbuider;
  371. }
  372. /**
  373. * 创建当选表单
  374. * @param array $data
  375. * @return array
  376. * @throws \FormBuilder\Exception\FormBuilderException
  377. */
  378. public function createRadioForm(array $data, $control = false)
  379. {
  380. $formbuider = [];
  381. $data['value'] = json_decode($data['value'], true) ?: '0';
  382. $parameter = explode("\n", $data['parameter']);
  383. $options = [];
  384. if ($parameter) {
  385. foreach ($parameter as $v) {
  386. if (strstr($v, $this->cuttingStr) !== false) {
  387. $pdata = explode($this->cuttingStr, $v);
  388. $options[] = ['label' => $pdata[1], 'value' => (int)$pdata[0]];
  389. }
  390. }
  391. $formbuider[] = $radio = $this->builder->radio($data['menu_name'], $data['info'], (int)$data['value'])->options($options)->info($data['desc'])->col(13);
  392. if ($control) {
  393. $radio->appendControl(isset($data['show_value']) ? $data['show_value'] : 1, is_array($control) ? $control : [$control]);
  394. }
  395. return $formbuider;
  396. }
  397. }
  398. /**
  399. * 创建上传组件表单
  400. * @param int $type
  401. * @param array $data
  402. * @return array
  403. */
  404. public function createUpoadForm(int $type, array $data)
  405. {
  406. $formbuider = [];
  407. switch ($type) {
  408. case 1:
  409. $data['value'] = json_decode($data['value'], true) ?: '';
  410. if($data['value'] != '') $data['value'] = set_file_url($data['value']);
  411. $formbuider[] = $this->builder->frameImage($data['menu_name'], $data['info'], $this->url('admin/widget.images/index', ['fodder' => $data['menu_name']], true), $data['value'])
  412. ->icon('ios-image')->width('950px')->height('420px')->info($data['desc'])->col(13);
  413. break;
  414. case 2:
  415. $data['value'] = json_decode($data['value'], true) ?: [];
  416. if($data['value'])
  417. $data['value'] = set_file_url($data['value']);
  418. $formbuider[] = $this->builder->frameImages($data['menu_name'], $data['info'], $this->url('admin/widget.images/index', ['fodder' => $data['menu_name'], 'type' => 'many', 'maxLength' => 5], true), $data['value'])
  419. ->maxLength(5)->icon('ios-images')->width('950px')->height('420px')
  420. ->info($data['desc'])->col(13);
  421. break;
  422. case 3:
  423. $data['value'] = json_decode($data['value'], true) ?: '';
  424. if($data['value'] != '') $data['value'] = set_file_url($data['value']);
  425. $formbuider[] = $this->builder->uploadFile($data['menu_name'], $data['info'], $this->url('/adminapi/file/upload/1', ['type' => 1], false, true), $data['value'])
  426. ->name('file')->info($data['desc'])->col(13)->headers([
  427. 'Authori-zation' => app()->request->header('Authori-zation'),
  428. ]);
  429. break;
  430. }
  431. return $formbuider;
  432. }
  433. /**
  434. * 创建单选框
  435. * @param array $data
  436. * @return array
  437. * @throws \FormBuilder\Exception\FormBuilderException
  438. */
  439. public function createCheckboxForm(array $data)
  440. {
  441. $formbuider = [];
  442. $data['value'] = json_decode($data['value'], true) ?: [];
  443. $parameter = explode("\n", $data['parameter']);
  444. $options = [];
  445. if ($parameter) {
  446. foreach ($parameter as $v) {
  447. if (strstr($v, $this->cuttingStr) !== false) {
  448. $pdata = explode($this->cuttingStr, $v);
  449. $options[] = ['label' => $pdata[1], 'value' => $pdata[0]];
  450. }
  451. }
  452. $formbuider[] = $this->builder->checkbox($data['menu_name'], $data['info'], $data['value'])->options($options)->info($data['desc'])->col(13);
  453. }
  454. return $formbuider;
  455. }
  456. /**
  457. * 创建选择框表单
  458. * @param array $data
  459. * @return array
  460. * @throws \FormBuilder\Exception\FormBuilderException
  461. */
  462. public function createSelectForm(array $data)
  463. {
  464. $formbuider = [];
  465. $data['value'] = json_decode($data['value'], true) ?: [];
  466. $parameter = explode("\n", $data['parameter']);
  467. $options = [];
  468. if ($parameter) {
  469. foreach ($parameter as $v) {
  470. if (strstr($v, $this->cuttingStr) !== false) {
  471. $pdata = explode($this->cuttingStr, $v);
  472. $options[] = ['label' => $pdata[1], 'value' => $pdata[0]];
  473. }
  474. }
  475. $formbuider[] = $this->builder->select($data['menu_name'], $data['info'], $data['value'])->options($options)->info($data['desc'])->col(13);
  476. }
  477. return $formbuider;
  478. }
  479. public function bindBuilderData($data, $relatedRule)
  480. {
  481. if (!$data) return false;
  482. $p_list = array();
  483. foreach ($relatedRule as $rk => $rv) {
  484. $p_list[$rk] = $data[$rk];
  485. if (isset($rv['son_type']) && is_array($rv['son_type'])) {
  486. foreach ($rv['son_type'] as $sk => $sv) {
  487. if (is_array($sv) && isset($sv['son_type'])) {
  488. foreach ($sv['son_type'] as $ssk => $ssv) {
  489. $tmp = $data[$sk];
  490. $tmp['console'] = $data[$ssk];
  491. $p_list[$rk]['console'][] = $tmp;
  492. }
  493. } else {
  494. $p_list[$rk]['console'][] = $data[$sk];
  495. }
  496. }
  497. }
  498. }
  499. return array_values($p_list);
  500. }
  501. /**
  502. * 获取系统配置表单
  503. * @param int $id
  504. * @param array $formData
  505. * @return array
  506. * @throws \think\db\exception\DataNotFoundException
  507. * @throws \think\db\exception\DbException
  508. * @throws \think\db\exception\ModelNotFoundException
  509. */
  510. public function formTypeShine($data, $control = false)
  511. {
  512. switch ($data['type']) {
  513. case 'text'://文本框
  514. return $this->createTextForm($data['input_type'], $data);
  515. break;
  516. case 'radio'://单选框
  517. return $this->createRadioForm($data, $control);
  518. break;
  519. case 'textarea'://多行文本框
  520. return $this->createTextareaForm($data);
  521. break;
  522. case 'upload'://文件上传
  523. return $this->createUpoadForm((int)$data['upload_type'], $data);
  524. break;
  525. case 'checkbox'://多选框
  526. return $this->createCheckboxForm($data);
  527. break;
  528. case 'select'://多选框
  529. return $this->createSelectForm($data);
  530. break;
  531. }
  532. }
  533. /**
  534. * @param int $tabId
  535. * @param array $formData
  536. * @param array $relatedRule
  537. * @return array|bool
  538. * @throws \think\db\exception\DataNotFoundException
  539. * @throws \think\db\exception\DbException
  540. * @throws \think\db\exception\ModelNotFoundException
  541. */
  542. public function createConfigForm(int $tabId, array $relatedRule)
  543. {
  544. $list = $this->dao->getConfigTabAllList($tabId);
  545. if (!$relatedRule) {
  546. $formbuider = $this->createNoCrontrolForm($list);
  547. } else {
  548. $formbuider = $this->createBindCrontrolForm($list, $relatedRule);
  549. }
  550. return $formbuider;
  551. }
  552. /**
  553. * 创建
  554. * @param array $list
  555. * @return array
  556. * @throws \FormBuilder\Exception\FormBuilderException
  557. * @throws \think\db\exception\DataNotFoundException
  558. * @throws \think\db\exception\DbException
  559. * @throws \think\db\exception\ModelNotFoundException
  560. */
  561. public function createForm(array $list)
  562. {
  563. if (!$list) return [];
  564. $list = array_combine(array_column($list, 'menu_name'), $list);
  565. $formbuider = [];
  566. $relateRule = $this->relatedRule;
  567. $sonConfig = $this->getSonConfig();
  568. foreach ($list as $key => $data) {
  569. if (in_array($key, $sonConfig)) {
  570. continue;
  571. }
  572. switch ($data['type']) {
  573. case 'text'://文本框
  574. $formbuider = array_merge($formbuider, $this->createTextForm($data['input_type'], $data));
  575. break;
  576. case 'radio'://单选框
  577. $builder = [];
  578. if (isset($relateRule[$key])) {
  579. $role = $relateRule[$key];
  580. $data['show_value'] = $role['show_value'];
  581. foreach ($role['son_type'] as $sk => $sv) {
  582. if (isset($list[$sk])) {
  583. $son_data = $list[$sk];
  584. $son_data['show_value'] = $role['show_value'];
  585. $son_build = [];
  586. if (isset($sv['son_type'])) {
  587. foreach ($sv['son_type'] as $ssk => $ssv) {
  588. $son_data['show_value'] = $sv['show_value'];
  589. $son_build[] = $this->formTypeShine($list[$ssk])[0];
  590. unset($list[$ssk]);
  591. }
  592. }
  593. $builder[] = $this->formTypeShine($son_data, $son_build)[0];
  594. unset($list[$sk]);
  595. }
  596. }
  597. $data['show_value'] = $role['show_value'];
  598. }
  599. $formbuider = array_merge($formbuider, $this->createRadioForm($data, $builder));
  600. break;
  601. case 'textarea'://多行文本框
  602. $formbuider = array_merge($formbuider, $this->createTextareaForm($data));
  603. break;
  604. case 'upload'://文件上传
  605. $formbuider = array_merge($formbuider, $this->createUpoadForm((int)$data['upload_type'], $data));
  606. break;
  607. case 'checkbox'://多选框
  608. $formbuider = array_merge($formbuider, $this->createCheckboxForm($data));
  609. break;
  610. case 'select'://多选框
  611. $formbuider = array_merge($formbuider, $this->createSelectForm($data));
  612. break;
  613. }
  614. }
  615. return $formbuider;
  616. }
  617. /**无组件绑定规则
  618. * @param array $list
  619. * @return array|bool
  620. * @throws \FormBuilder\Exception\FormBuilderException
  621. * @throws \think\db\exception\DataNotFoundException
  622. * @throws \think\db\exception\DbException
  623. * @throws \think\db\exception\ModelNotFoundException
  624. */
  625. public function createNoCrontrolForm(array $list)
  626. {
  627. if (!$list) return false;
  628. $formbuider = [];
  629. foreach ($list as $key => $data) {
  630. switch ($data['type']) {
  631. case 'text'://文本框
  632. $formbuider = array_merge($formbuider, $this->createTextForm($data['input_type'], $data));
  633. break;
  634. case 'radio'://单选框
  635. $formbuider = array_merge($formbuider, $this->createRadioForm($data));
  636. break;
  637. case 'textarea'://多行文本框
  638. $formbuider = array_merge($formbuider, $this->createTextareaForm($data));
  639. break;
  640. case 'upload'://文件上传
  641. $formbuider = array_merge($formbuider, $this->createUpoadForm((int)$data['upload_type'], $data));
  642. break;
  643. case 'checkbox'://多选框
  644. $formbuider = array_merge($formbuider, $this->createCheckboxForm($data));
  645. break;
  646. case 'select'://多选框
  647. $formbuider = array_merge($formbuider, $this->createSelectForm($data));
  648. break;
  649. }
  650. }
  651. return $formbuider;
  652. }
  653. /**有组件绑定规则
  654. * @param array $list
  655. * @param array $relatedRule
  656. * @return array|bool
  657. * @throws \FormBuilder\Exception\FormBuilderException
  658. * @throws \think\db\exception\DataNotFoundException
  659. * @throws \think\db\exception\DbException
  660. * @throws \think\db\exception\ModelNotFoundException
  661. */
  662. public function createBindCrontrolForm(array $list, array $relatedRule)
  663. {
  664. if (!$list || !$relatedRule) return false;
  665. $formbuider = [];
  666. $new_data = array();
  667. foreach ($list as $dk => $dv) {
  668. $new_data[$dv['menu_name']] = $dv;
  669. }
  670. foreach ($relatedRule as $rk => $rv) {
  671. if (isset($rv['son_type'])) {
  672. $data = $new_data[$rk];
  673. switch ($data['type']) {
  674. case 'text'://文本框
  675. $formbuider = array_merge($formbuider, $this->createTextForm($data['input_type'], $data));
  676. break;
  677. case 'radio'://单选框
  678. $son_builder = array();
  679. foreach ($rv['son_type'] as $sk => $sv) {
  680. if (isset($sv['son_type'])) {
  681. foreach ($sv['son_type'] as $ssk => $ssv) {
  682. $son_data = $new_data[$sk];
  683. $son_data['show_value'] = $sv['show_value'];
  684. $son_builder[] = $this->formTypeShine($son_data, $this->formTypeShine($new_data[$ssk])[0])[0];
  685. }
  686. } else {
  687. $son_data = $new_data[$sk];
  688. $son_data['show_value'] = $rv['show_value'];
  689. $son_builder[] = $this->formTypeShine($son_data)[0];
  690. }
  691. }
  692. $formbuider = array_merge($formbuider, $this->createRadioForm($data, $son_builder));
  693. break;
  694. case 'textarea'://多行文本框
  695. $formbuider = array_merge($formbuider, $this->createTextareaForm($data));
  696. break;
  697. case 'upload'://文件上传
  698. $formbuider = array_merge($formbuider, $this->createUpoadForm((int)$data['upload_type'], $data));
  699. break;
  700. case 'checkbox'://多选框
  701. $formbuider = array_merge($formbuider, $this->createCheckboxForm($data));
  702. break;
  703. case 'select'://多选框
  704. $formbuider = array_merge($formbuider, $this->createSelectForm($data));
  705. break;
  706. }
  707. }
  708. }
  709. return $formbuider;
  710. }
  711. /**
  712. * 系统配置form表单创建
  713. * @param int $tabId
  714. * @return array
  715. * @throws \FormBuilder\Exception\FormBuilderException
  716. * @throws \think\db\exception\DataNotFoundException
  717. * @throws \think\db\exception\DbException
  718. * @throws \think\db\exception\ModelNotFoundException
  719. */
  720. public function getConfigForm($url, int $tabId)
  721. {
  722. /** @var SystemConfigTabServices $service */
  723. $service = app()->make(SystemConfigTabServices::class);
  724. $title = $service->value(['id' => $tabId], 'title');
  725. $list = $this->dao->getConfigTabAllList($tabId);
  726. $formbuider = $this->createForm($list);
  727. $name = 'setting';
  728. if ($url) {
  729. $name = explode('/', $url)[2] ?? $name;
  730. }
  731. $postUrl = $this->postUrl[$name]['url'] ?? '/setting/config/save_basics';
  732. return create_form($title, $formbuider, $this->url($postUrl), 'POST');
  733. }
  734. /**
  735. * 新增路由增加设置项验证
  736. * @param $url
  737. * @param $post
  738. * @return bool
  739. */
  740. public function checkParam($url, $post)
  741. {
  742. $name = '';
  743. if ($url) {
  744. $name = explode('/', $url)[2] ?? $name;
  745. }
  746. $auth = $this->postUrl[$name]['auth'] ?? false;
  747. if ($auth === false) {
  748. throw new ValidateException('请求不被允许');
  749. }
  750. if ($auth) {
  751. /** @var SystemConfigTabServices $systemConfigTabServices */
  752. $systemConfigTabServices = app()->make(SystemConfigTabServices::class);
  753. foreach ($post as $key => $value) {
  754. $tab_ids = $systemConfigTabServices->getColumn([['eng_title', 'IN', $auth]], 'id');
  755. if (!$tab_ids || !in_array($key, $this->dao->getColumn([['config_tab_id', 'IN', $tab_ids]], 'menu_name'))) {
  756. throw new ValidateException('设置类目不被允许');
  757. }
  758. }
  759. }
  760. return true;
  761. }
  762. /**
  763. * 修改配置获取form表单
  764. * @param int $id
  765. * @return array
  766. * @throws \FormBuilder\Exception\FormBuilderException
  767. * @throws \think\db\exception\DataNotFoundException
  768. * @throws \think\db\exception\DbException
  769. * @throws \think\db\exception\ModelNotFoundException
  770. */
  771. public function editConfigForm(int $id)
  772. {
  773. $menu = $this->dao->get($id)->getData();
  774. if (!$menu) {
  775. throw new AdminException('修改数据不存在!');
  776. }
  777. /** @var SystemConfigTabServices $service */
  778. $service = app()->make(SystemConfigTabServices::class);
  779. $formbuider = [];
  780. $formbuider[] = $this->builder->input('menu_name', '字段变量', $menu['menu_name'])->disabled(1);
  781. $formbuider[] = $this->builder->hidden('type', $menu['type']);
  782. $formbuider[] = $this->builder->select('config_tab_id', '分类', (string)$menu['config_tab_id'])->setOptions($service->getSelectForm());
  783. $formbuider[] = $this->builder->input('info', '配置名称', $menu['info'])->autofocus(1);
  784. $formbuider[] = $this->builder->input('desc', '配置简介', $menu['desc']);
  785. switch ($menu['type']) {
  786. case 'text':
  787. $menu['value'] = json_decode($menu['value'], true);
  788. $formbuider[] = $this->builder->select('input_type', '类型', $menu['input_type'])->setOptions([
  789. ['value' => 'input', 'label' => '文本框']
  790. , ['value' => 'dateTime', 'label' => '时间']
  791. , ['value' => 'color', 'label' => '颜色']
  792. , ['value' => 'number', 'label' => '数字']
  793. ]);
  794. //输入框验证规则
  795. $formbuider[] = $this->builder->input('value', '默认值', $menu['value']);
  796. if (!empty($menu['required'])) {
  797. $formbuider[] = $this->builder->number('width', '文本框宽(%)', (int)$menu['width']);
  798. $formbuider[] = $this->builder->input('required', '验证规则', $menu['required'])->placeholder('多个请用,隔开例如:required:true,url:true');
  799. }
  800. break;
  801. case 'textarea':
  802. $menu['value'] = json_decode($menu['value'], true);
  803. //多行文本
  804. if (!empty($menu['high'])) {
  805. $formbuider[] = $this->builder->textarea('value', '默认值', $menu['value'])->rows(5);
  806. $formbuider[] = $this->builder->number('width', '文本框宽(%)', (int)$menu['width']);
  807. $formbuider[] = $this->builder->number('high', '多行文本框高(%)', (int)$menu['high']);
  808. } else {
  809. $formbuider[] = $this->builder->input('value', '默认值', $menu['value']);
  810. }
  811. break;
  812. case 'radio':
  813. $formbuider = array_merge($formbuider, $this->createRadioForm($menu));
  814. //单选和多选参数配置
  815. if (!empty($menu['parameter'])) {
  816. $formbuider[] = $this->builder->textarea('parameter', '配置参数', $menu['parameter'])->placeholder("参数方式例如:\n1=>白色\n2=>红色\n3=>黑色");
  817. }
  818. break;
  819. case 'checkbox':
  820. $formbuider = array_merge($formbuider, $this->createCheckboxForm($menu));
  821. //单选和多选参数配置
  822. if (!empty($menu['parameter'])) {
  823. $formbuider[] = $this->builder->textarea('parameter', '配置参数', $menu['parameter'])->placeholder("参数方式例如:\n1=>白色\n2=>红色\n3=>黑色");
  824. }
  825. break;
  826. case 'upload':
  827. $formbuider = array_merge($formbuider, $this->createUpoadForm(($menu['upload_type']), $menu));
  828. //上传类型选择
  829. if (!empty($menu['upload_type'])) {
  830. $formbuider[] = $this->builder->radio('upload_type', '上传类型', $menu['upload_type'])->options([['value' => 1, 'label' => '单图'], ['value' => 2, 'label' => '多图'], ['value' => 3, 'label' => '文件']]);
  831. }
  832. break;
  833. }
  834. $formbuider[] = $this->builder->number('sort', '排序', (int)$menu['sort']);
  835. $formbuider[] = $this->builder->radio('status', '状态', $menu['status'])->options([['value' => 1, 'label' => '显示'], ['value' => 2, 'label' => '隐藏']]);
  836. return create_form('编辑字段', $formbuider, $this->url('/setting/config/' . $id), 'PUT');
  837. }
  838. /**
  839. * 字段状态
  840. * @return array
  841. */
  842. public function formStatus(): array
  843. {
  844. return [['value' => 1, 'label' => '显示'], ['value' => 2, 'label' => '隐藏']];
  845. }
  846. /**
  847. * 选择文文件类型
  848. * @return array
  849. */
  850. public function uploadType(): array
  851. {
  852. return [
  853. ['value' => 1, 'label' => '单图']
  854. , ['value' => 2, 'label' => '多图']
  855. , ['value' => 3, 'label' => '文件']
  856. ];
  857. }
  858. /**
  859. * 选择文本框类型
  860. * @return array
  861. */
  862. public function textType(): array
  863. {
  864. return [
  865. ['value' => 'input', 'label' => '文本框']
  866. , ['value' => 'dateTime', 'label' => '时间']
  867. , ['value' => 'color', 'label' => '颜色']
  868. , ['value' => 'number', 'label' => '数字']
  869. ];
  870. }
  871. /**
  872. * 获取创建配置规格表单
  873. * @param int $type
  874. * @param int $tab_id
  875. * @return array
  876. */
  877. public function createFormRule(int $type, int $tab_id): array
  878. {
  879. /** @var SystemConfigTabServices $service */
  880. $service = app()->make(SystemConfigTabServices::class);
  881. $formbuider = [];
  882. $form_type = '';
  883. $info_type = [];
  884. $parameter = [];
  885. switch ($type) {
  886. case 0://文本框
  887. $form_type = 'text';
  888. $info_type = $this->builder->select('input_type', '类型')->setOptions($this->textType());
  889. $parameter[] = $this->builder->input('value', '默认值');
  890. $parameter[] = $this->builder->number('width', '文本框宽(%)', 100);
  891. $parameter[] = $this->builder->input('required', '验证规则')->placeholder('多个请用,隔开例如:required:true,url:true');
  892. break;
  893. case 1://多行文本框
  894. $form_type = 'textarea';
  895. $parameter[] = $this->builder->textarea('value', '默认值');
  896. $parameter[] = $this->builder->number('width', '文本框宽(%)', 100);
  897. $parameter[] = $this->builder->number('high', '多行文本框高(%)', 5);
  898. break;
  899. case 2://单选框
  900. $form_type = 'radio';
  901. $parameter[] = $this->builder->textarea('parameter', '配置参数')->placeholder("参数方式例如:\n1=>男\n2=>女\n3=>保密");
  902. $parameter[] = $this->builder->input('value', '默认值');
  903. break;
  904. case 3://文件上传
  905. $form_type = 'upload';
  906. $parameter[] = $this->builder->radio('upload_type', '上传类型', 1)->options($this->uploadType());
  907. break;
  908. case 4://多选框
  909. $form_type = 'checkbox';
  910. $parameter[] = $this->builder->textarea('parameter', '配置参数')->placeholder("参数方式例如:\n1=>白色\n2=>红色\n3=>黑色");
  911. break;
  912. case 5://下拉框
  913. $form_type = 'select';
  914. $parameter[] = $this->builder->textarea('parameter', '配置参数')->placeholder("参数方式例如:\n1=>白色\n2=>红色\n3=>黑色");
  915. break;
  916. }
  917. if ($form_type) {
  918. $formbuider[] = $this->builder->hidden('type', $form_type);
  919. $formbuider[] = $this->builder->select('config_tab_id', '分类', $tab_id)->setOptions($service->getSelectForm());
  920. if ($info_type) {
  921. $formbuider[] = $info_type;
  922. }
  923. $formbuider[] = $this->builder->input('info', '配置名称')->autofocus(1);
  924. $formbuider[] = $this->builder->input('menu_name', '字段变量')->placeholder('例如:site_url');
  925. $formbuider[] = $this->builder->input('desc', '配置简介');
  926. $formbuider = array_merge($formbuider, $parameter);
  927. $formbuider[] = $this->builder->number('sort', '排序', 0);
  928. $formbuider[] = $this->builder->radio('status', '状态', 1)->options($this->formStatus());
  929. }
  930. return create_form('添加字段', $formbuider, $this->url('/setting/config'), 'POST');
  931. }
  932. /**
  933. * radio 和 checkbox规则的判断
  934. * @param $data
  935. * @return bool
  936. */
  937. public function valiDateRadioAndCheckbox($data)
  938. {
  939. $option = [];
  940. $option_new = [];
  941. $data['parameter'] = str_replace("\r\n", "\n", $data['parameter']);//防止不兼容
  942. $parameter = explode("\n", $data['parameter']);
  943. if (count($parameter) < 2) {
  944. throw new AdminException('请输入正确格式的配置参数');
  945. }
  946. foreach ($parameter as $k => $v) {
  947. if (isset($v) && !empty($v)) {
  948. $option[$k] = explode('=>', $v);
  949. }
  950. }
  951. if (count($option) < 2) {
  952. throw new AdminException('请输入正确格式的配置参数');
  953. }
  954. $bool = 1;
  955. foreach ($option as $k => $v) {
  956. $option_new[$k] = $option[$k][0];
  957. foreach ($v as $kk => $vv) {
  958. $vv_num = strlen($vv);
  959. if (!$vv_num) {
  960. $bool = 0;
  961. }
  962. }
  963. }
  964. if (!$bool) {
  965. throw new AdminException('请输入正确格式的配置参数');
  966. }
  967. $num1 = count($option_new);//提取该数组的数目
  968. $arr2 = array_unique($option_new);//合并相同的元素
  969. $num2 = count($arr2);//提取合并后数组个数
  970. if ($num1 > $num2) {
  971. throw new AdminException('请输入正确格式的配置参数');
  972. }
  973. return true;
  974. }
  975. /**
  976. * 验证参数
  977. * @param $data
  978. * @return bool
  979. */
  980. public function valiDateValue($data)
  981. {
  982. if (!$data || !isset($data['required']) || !$data['required']) {
  983. return true;
  984. }
  985. $valids = explode(',', $data['required']);
  986. foreach ($valids as $valid) {
  987. $valid = explode(':', $valid);
  988. if (isset($valid[0]) && isset($valid[1])) {
  989. $k = strtolower(trim($valid[0]));
  990. $v = strtolower(trim($valid[1]));
  991. switch ($k) {
  992. case 'required':
  993. if ($v == 'true' && $data['value'] === '') {
  994. throw new ValidateException(($data['info'] ?? '') . '请输入默认值');
  995. }
  996. break;
  997. case 'url':
  998. if ($v == 'true' && !check_link($data['value'])) {
  999. throw new ValidateException(($data['info'] ?? '') . '请输入正确url');
  1000. }
  1001. break;
  1002. }
  1003. }
  1004. }
  1005. }
  1006. /**保存平台电子面单打印信息
  1007. * @param array $data
  1008. * @return bool
  1009. */
  1010. public function saveExpressInfo(array $data)
  1011. {
  1012. if (!is_array($data) || !$data) return false;
  1013. // config_export_id 快递公司id
  1014. // config_export_temp_id 快递公司模板id
  1015. // config_export_com 快递公司编码
  1016. // config_export_to_name 发货人姓名
  1017. // config_export_to_tel 发货人电话
  1018. // config_export_to_address 发货人详细地址
  1019. // config_export_siid 电子面单打印机编号
  1020. foreach ($data as $key => $value) {
  1021. $this->dao->update(['menu_name' => 'config_export_' . $key], ['value' => json_encode($value)]);
  1022. }
  1023. }
  1024. /**
  1025. * 获取分享海报 兼容方法
  1026. */
  1027. public function getSpreadBanner()
  1028. {
  1029. //配置
  1030. $banner = sys_config('spread_banner', []);
  1031. if (!$banner) {
  1032. //组合数据
  1033. $banner = sys_data('routine_spread_banner');
  1034. if ($banner) {
  1035. $banner = array_column($banner, 'pic');
  1036. $this->dao->update(['menu_name' => 'spread_banner'], ['value' => json_encode($banner)]);
  1037. \crmeb\services\CacheService::clear();
  1038. }
  1039. }
  1040. return $banner;
  1041. }
  1042. /**
  1043. * 保存wss配置
  1044. * @param int $wssOpen
  1045. * @param string $wssLocalpk
  1046. * @param string $wssLocalCert
  1047. */
  1048. public function saveSslFilePath(int $wssOpen, string $wssLocalpk, string $wssLocalCert)
  1049. {
  1050. $wssFile = root_path() . '.wss';
  1051. $content = <<<WSS
  1052. wssOpen = $wssOpen
  1053. wssLocalpk = $wssLocalpk
  1054. wssLocalCert = $wssLocalCert
  1055. WSS;
  1056. try {
  1057. file_put_contents($wssFile, $content);
  1058. } catch (\Throwable $e) {
  1059. throw new ValidateException('保存wss证书失败,失败原因:' . $e->getMessage());
  1060. }
  1061. }
  1062. /**
  1063. * 获取wss配置
  1064. * @param string $key
  1065. * @return array|false|mixed
  1066. */
  1067. public function getSslFilePath(string $key = '')
  1068. {
  1069. $wssFile = root_path() . '.wss';
  1070. try {
  1071. $content = parse_ini_file($wssFile);
  1072. } catch (\Throwable $e) {
  1073. $content = [];
  1074. }
  1075. if (isset($content[$key])) {
  1076. return $content[$key];
  1077. } else {
  1078. return $content;
  1079. }
  1080. }
  1081. }