Shop.php 49 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159
  1. <?php
  2. /**
  3. * 易优CMS
  4. * ============================================================================
  5. * 版权所有 2016-2028 海南赞赞网络科技有限公司,并保留所有权利。
  6. * 网站地址: http://www.eyoucms.com
  7. * ----------------------------------------------------------------------------
  8. * 如果商业用途务必到官方购买正版授权, 以免引起不必要的法律纠纷.
  9. * ============================================================================
  10. * Author: 陈风任 <491085389@qq.com>
  11. * Date: 2019-03-26
  12. */
  13. namespace app\admin\controller;
  14. use think\Page;
  15. use think\Db;
  16. use think\Config;
  17. use app\admin\logic\ShopLogic;
  18. use app\admin\logic\ProductSpecLogic; // 用于产品规格逻辑功能处理
  19. use app\user\model\Pay as PayModel; //用于虚拟网盘商品付款后自动走流程处理
  20. class Shop extends Base {
  21. private $UsersConfigData = [];
  22. /**
  23. * 构造方法
  24. */
  25. public function __construct(){
  26. parent::__construct();
  27. $this->language_access(); // 多语言功能操作权限
  28. $this->users_db = Db::name('users'); // 会员信息表
  29. $this->shop_order_db = Db::name('shop_order'); // 订单主表
  30. $this->shop_order_details_db = Db::name('shop_order_details'); // 订单明细表
  31. $this->shop_address_db = Db::name('shop_address'); // 收货地址表
  32. $this->shop_express_db = Db::name('shop_express'); // 物流名字表
  33. $this->shop_order_log_db = Db::name('shop_order_log'); // 订单操作表
  34. $this->shipping_template_db = Db::name('shop_shipping_template'); // 运费模板表
  35. $this->product_spec_preset_db = Db::name('product_spec_preset'); // 产品规格预设表
  36. // 会员中心配置信息
  37. $this->UsersConfigData = getUsersConfigData('all');
  38. $this->assign('userConfig',$this->UsersConfigData);
  39. $this->ProductSpecLogic = new ProductSpecLogic;
  40. }
  41. public function home()
  42. {
  43. $this->redirect(url('Statistics/index'));
  44. exit;
  45. }
  46. /**
  47. * 商城设置
  48. */
  49. public function conf(){
  50. if (IS_POST) {
  51. $post = input('post.');
  52. if (!empty($post)) {
  53. /*邮件提醒*/
  54. $smtp['smtp_shop_order_pay'] = !empty($post['smtp_shop_order_pay']) ? 1 : 0;
  55. $smtp['smtp_shop_order_send'] = !empty($post['smtp_shop_order_send']) ? 1 : 0;
  56. tpCache('smtp', $smtp);
  57. unset($post['smtp_shop_order_pay']);
  58. unset($post['smtp_shop_order_send']);
  59. /*END*/
  60. $TestPass = $post['TestPass'];
  61. unset($post['TestPass']);
  62. if (0 == $TestPass) unset($post['shop']['shop_open_spec']);
  63. foreach ($post as $key => $val) {
  64. is_array($val) && getUsersConfigData($key, $val);
  65. }
  66. $this->success('设置成功!', url('Shop/conf'));
  67. }
  68. }
  69. $Result = VerifyLatestTemplate();
  70. if (!empty($Result)) getUsersConfigData('shop', ['shop_open_spec' => 0]);
  71. $TestPass = empty($Result) ? 1 : 0;
  72. $this->assign('TestPass', $TestPass);
  73. // 商城配置信息
  74. $smtp = tpCache('smtp');
  75. $this->assign('smtp', $smtp);
  76. return $this->fetch('conf');
  77. }
  78. /**
  79. * 订单列表
  80. */
  81. public function index()
  82. {
  83. // 初始化数组和条件
  84. $list = array();
  85. $Where = [
  86. 'lang' => $this->admin_lang,
  87. ];
  88. // 订单号查询
  89. $order_code = input('order_code/s');
  90. if (!empty($order_code)) $Where['order_code'] = array('LIKE', "%{$order_code}%");
  91. // 订单状态查询
  92. $order_status = input('order_status/s');
  93. if (!empty($order_status)) $Where['order_status'] = 10 == $order_status ? 0 : $order_status;
  94. // 查询满足要求的总记录数
  95. $count = $this->shop_order_db->where($Where)->count('order_id');
  96. // 实例化分页类 传入总记录数和每页显示的记录数
  97. $pageObj = new Page($count, config('paginate.list_rows'));
  98. // 订单主表数据查询
  99. $list = $this->shop_order_db->where($Where)
  100. ->order('order_id desc')
  101. ->limit($pageObj->firstRow.','.$pageObj->listRows)
  102. ->select();
  103. // 分页显示输出
  104. $pageStr = $pageObj->show();
  105. // 获取订单状态
  106. $admin_order_status_arr = Config::get('global.admin_order_status_arr');
  107. // 获取订单方式名称
  108. $pay_method_arr = Config::get('global.pay_method_arr');
  109. // 订单状态筛选数组
  110. $OrderStatus = array(
  111. 0 => array(
  112. 'order_status' => '1',
  113. 'status_name' => '待发货',
  114. ),
  115. 1 => array(
  116. 'order_status' => '2',
  117. 'status_name' => '已发货',
  118. ),
  119. 2 => array(
  120. 'order_status' => '3',
  121. 'status_name' => '已完成',
  122. ),
  123. );
  124. // 数据加载
  125. $this->assign('pageObj', $pageObj);
  126. $this->assign('list', $list);
  127. $this->assign('pageStr', $pageStr);
  128. $this->assign('admin_order_status_arr',$admin_order_status_arr);
  129. $this->assign('pay_method_arr',$pay_method_arr);
  130. $this->assign('OrderStatus', $OrderStatus);
  131. /*检测是否存在订单中心模板*/
  132. if ('v1.0.1' > getVersion('version_themeshop') && !empty($this->UsersConfigData['shop_open'])) {
  133. $is_syn_theme_shop = 1;
  134. } else {
  135. $is_syn_theme_shop = 0;
  136. }
  137. $this->assign('is_syn_theme_shop',$is_syn_theme_shop);
  138. /*--end*/
  139. return $this->fetch();
  140. }
  141. /**
  142. * 订单详情
  143. */
  144. public function order_details()
  145. {
  146. $order_id = input('param.order_id');
  147. if (!empty($order_id)) {
  148. // 查询订单信息
  149. $this->GetOrderData($order_id);
  150. // 查询订单操作记录
  151. $Action = $this->shop_order_log_db->where('order_id',$order_id)->order('action_id desc')->select();
  152. // 操作记录数据处理
  153. foreach ($Action as $key => $value) {
  154. if ('0' == $value['action_user']) {
  155. // 若action_user为0,表示会员操作,根据订单号中的ID获取会员名。
  156. $username = $this->users_db->field('username')->where('users_id',$value['users_id'])->find();
  157. $Action[$key]['username'] = '会 &nbsp; 员: '.$username['username'];
  158. }else{
  159. // 若action_user不为0,表示管理员操作,根据ID获取管理员名。
  160. $user_name = Db::name('admin')->field('user_name')->where('admin_id',$value['action_user'])->find();
  161. $Action[$key]['username'] = '管理员: '.$user_name['user_name'];
  162. }
  163. // 操作时,订单发货状态
  164. $Action[$key]['express_status'] = '未发货';
  165. if ('1' == $value['express_status']) {
  166. $Action[$key]['express_status'] = '已发货';
  167. }
  168. // 操作时,订单付款状态
  169. $Action[$key]['pay_status'] = '未支付';
  170. if ('1' == $value['pay_status']) {
  171. $Action[$key]['pay_status'] = '已支付';
  172. }
  173. }
  174. $this->assign('Action', $Action);
  175. return $this->fetch('order_details');
  176. }else{
  177. $this->error('非法访问!');
  178. }
  179. }
  180. /**
  181. * 订单发货
  182. */
  183. public function order_send()
  184. {
  185. $order_id = input('param.order_id');
  186. if ($order_id) {
  187. // 查询订单信息
  188. $this->GetOrderData($order_id);
  189. return $this->fetch('order_send');
  190. }
  191. }
  192. /**
  193. * 订单发货操作
  194. */
  195. public function order_send_operating()
  196. {
  197. if (IS_POST) {
  198. $post = input('post.');
  199. // 条件数组
  200. $Where = [
  201. 'order_id' => $post['order_id'],
  202. 'users_id' => $post['users_id'],
  203. 'lang' => $this->admin_lang,
  204. ];
  205. // 更新数组
  206. $UpdateData = [
  207. 'order_status' => 2,
  208. 'express_order' => $post['express_order'],
  209. 'express_name' => $post['express_name'],
  210. 'express_code' => $post['express_code'],
  211. 'express_time' => getTime(),
  212. 'consignee' => $post['consignee'],
  213. 'update_time' => getTime(),
  214. 'note' => $post['note'],
  215. 'virtual_delivery' => $post['virtual_delivery'],
  216. ];
  217. // 订单操作记录逻辑
  218. $LogWhere = [
  219. 'order_id' => $post['order_id'],
  220. 'express_status' => 1,
  221. ];
  222. $LogData = $this->shop_order_log_db->where($LogWhere)->count();
  223. if (!empty($LogData)) {
  224. // 数据存在则表示为修改发货内容
  225. $OrderData = $this->shop_order_db->where($Where)->field('prom_type')->find();
  226. $Desc = '修改发货内容!';
  227. if (1 == $post['prom_type']) {
  228. // 提交的数据为虚拟订单
  229. if ($OrderData['prom_type'] != $post['prom_type']) {
  230. // 此处判断后,提交的订单类型和数据库中的订单类型不相同,表示普通订单修改为虚拟订单
  231. $Note = '管理员将普通订单修改为虚拟订单!';
  232. if (!empty($post['virtual_delivery'])) {
  233. // 若存在数据则拼装
  234. $Note .= '给买家回复:'.$post['virtual_delivery'];
  235. }
  236. }else{
  237. // 继续保持为虚拟订单修改
  238. $Note = '虚拟订单,无需物流。';
  239. if (!empty($post['virtual_delivery'])) {
  240. // 若存在数据则拼装
  241. $Note .= '给买家回复:'.$post['virtual_delivery'];
  242. }
  243. }
  244. }else{
  245. // 提交的数据为普通订单
  246. if ($OrderData['prom_type'] != $post['prom_type']) {
  247. // 这一段暂时无用,因为发货时,暂时无法选择将虚拟订单修改为普通订单
  248. $Note = '管理员将虚拟订单修改为普通订单!';
  249. if (!empty($post['virtual_delivery'])) {
  250. // 若存在数据则拼装
  251. $Note .= '给买家回复:'.$post['virtual_delivery'];
  252. }
  253. }else{
  254. // 继续保持为普通订单修改
  255. $Note = '使用'.$post['express_name'].'发货成功!';
  256. }
  257. }
  258. $UpdateData['prom_type'] = $post['prom_type'];
  259. }else{
  260. // 数据不存在则表示为初次发货,拼装发货内容
  261. $Desc = '发货成功!';
  262. $Note = '使用'.$post['express_name'].'发货成功!';
  263. if ('1' == $post['prom_type']) {
  264. // 若为虚拟订单,无需发货物流。
  265. $UpdateData['prom_type'] = $post['prom_type'];
  266. $Note = '虚拟订单,无需物流。';
  267. if (!empty($post['virtual_delivery'])) {
  268. // 若存在数据则拼装
  269. $Note .= '给买家回复:'.$post['virtual_delivery'];
  270. }
  271. }
  272. }
  273. if (empty($post['prom_type']) && empty($post['express_order'])) {
  274. $this->error('配送单号不能为空!');
  275. }
  276. // 更新订单主表信息
  277. $IsOrder = $this->shop_order_db->where($Where)->update($UpdateData);
  278. if (!empty($IsOrder)) {
  279. // 更新订单明细表信息
  280. $Data['update_time'] = getTime();
  281. $this->shop_order_details_db->where('order_id',$post['order_id'])->update($Data);
  282. // 添加订单操作记录
  283. AddOrderAction($post['order_id'],'0',session('admin_id'),'2','1','1',$Desc,$Note);
  284. $Field = 'username, nickname, email, mobile';
  285. $Users = $this->users_db->field($Field)->where('users_id', $post['users_id'])->find();
  286. // 邮箱发送
  287. $SmtpConfig = tpCache('smtp');
  288. $Result['email'] = GetEamilSendData($SmtpConfig, $Users, $post, 2);
  289. // 手机发送
  290. $SmsConfig = tpCache('sms');
  291. $Result['mobile'] = GetMobileSendData($SmsConfig, $Users, $post, 2);
  292. $this->success('发货成功', null, $Result);
  293. } else {
  294. $this->error('发货失败');
  295. }
  296. }
  297. }
  298. /**
  299. * 查询快递名字及Code
  300. */
  301. public function order_express()
  302. {
  303. $ExpressData = array();
  304. $Where = array();
  305. $keywords = input('keywords/s');
  306. if (!empty($keywords)) {
  307. $Where['express_name'] = array('LIKE', "%{$keywords}%");
  308. }
  309. $count = $this->shop_express_db->where($Where)->count('express_id');// 查询满足要求的总记录数
  310. $pageObj = new Page($count, '10');// 实例化分页类 传入总记录数和每页显示的记录数
  311. $ExpressData = $this->shop_express_db->where($Where)
  312. ->order('sort_order asc,express_id asc')
  313. ->limit($pageObj->firstRow.','.$pageObj->listRows)
  314. ->select();
  315. $pageStr = $pageObj->show();
  316. $this->assign('ExpressData', $ExpressData);
  317. $this->assign('pageStr', $pageStr);
  318. $this->assign('pageObj', $pageObj);
  319. return $this->fetch('order_express');
  320. }
  321. /**
  322. * 管理员后台标记订单状态
  323. */
  324. public function order_mark_status()
  325. {
  326. if (IS_POST) {
  327. $post = input('post.');
  328. // 条件数组
  329. $Where = [
  330. 'order_id' => $post['order_id'],
  331. 'users_id' => $post['users_id'],
  332. 'lang' => $this->admin_lang,
  333. ];
  334. if ('ddsc' == $post['status_name']) {
  335. // 订单删除
  336. $IsDelete = $this->shop_order_db->where($Where)->delete();
  337. if (!empty($IsDelete)) {
  338. // 同步删除订单下的产品
  339. $this->shop_order_details_db->where($Where)->delete();
  340. // 同步删除订单下的操作记录
  341. $this->shop_order_log_db->where($Where)->delete();
  342. $this->success('删除成功!');
  343. }else{
  344. $this->error('数据错误!');
  345. }
  346. }else{
  347. $OrderData = $this->shop_order_db->where($Where)->find();
  348. // 更新数组
  349. $UpdateData = [
  350. 'update_time' => getTime(),
  351. ];
  352. // 根据不同操作标记不同操作内容
  353. if ('yfk' == $post['status_name']) {
  354. // 订单标记为付款,追加更新数组
  355. $UpdateData['order_status'] = '1';
  356. $UpdateData['pay_time'] = getTime();
  357. // 管理员付款
  358. $UpdateData['pay_name'] = 'admin_pay';
  359. /*用于添加订单操作记录*/
  360. $order_status = '1'; // 订单状态
  361. $express_status = '0'; // 发货状态
  362. $pay_status = '1'; // 支付状态
  363. $action_desc = '付款成功!'; // 操作明细
  364. $action_note = '管理员确认订单付款!'; // 操作备注
  365. /*结束*/
  366. }else if ('ysh' == $post['status_name']) {
  367. // 订单确认收货,追加更新数组
  368. $UpdateData['order_status'] = '3';
  369. $UpdateData['confirm_time'] = getTime();
  370. /*用于添加订单操作记录*/
  371. $order_status = '3'; // 订单状态
  372. $express_status = '1'; // 发货状态
  373. $pay_status = '1'; // 支付状态
  374. $action_desc = '确认收货!'; // 操作明细
  375. $action_note = '管理员确认订单已收货!'; // 操作备注
  376. /*结束*/
  377. }else if ('gbdd' == $post['status_name']) {
  378. // 订单关闭,追加更新数组
  379. $UpdateData['order_status'] = '-1';
  380. /*用于添加订单操作记录*/
  381. $order_status = '-1'; // 订单状态
  382. if ('0' == $OrderData['order_status'] || '1' == $OrderData['order_status']) {
  383. $express_status = '0'; // 发货状态
  384. $pay_status = '0'; // 支付状态
  385. }else{
  386. $express_status = '1'; // 发货状态
  387. $pay_status = '1'; // 支付状态
  388. }
  389. $action_desc = '订单关闭!'; // 操作明细
  390. $action_note = '管理员关闭订单!'; // 操作备注
  391. /*结束*/
  392. }
  393. // 更新订单主表
  394. $IsOrder = $this->shop_order_db->where($Where)->update($UpdateData);
  395. if (!empty($IsOrder)) {
  396. // 更新订单明细表
  397. $Data['update_time'] = getTime();
  398. $this->shop_order_details_db->where('order_id',$post['order_id'])->update($Data);
  399. // 如果是关闭订单操作则执行还原产品库存
  400. if ('gbdd' == $post['status_name']) {
  401. $UpWhere = $this->shop_order_details_db->where('order_id',$post['order_id'])->field('product_id as aid,num,data')->find();
  402. // 读取规格值ID,拼装作为更新条件
  403. $UpWhere['spec_value_id'] = unserialize($UpWhere['data'])['spec_value_id'];
  404. // 更新数据
  405. $UpData['spec_stock'] = Db::raw('spec_stock+'.($UpWhere['num']));
  406. $UpData['spec_sales_num'] = Db::raw('spec_sales_num-'.($UpWhere['num']));
  407. // 清除多余num数据
  408. unset($UpWhere['num']);
  409. // 清除多余data数据
  410. unset($UpWhere['data']);
  411. // 更新库存及销量
  412. Db::name('product_spec_value')->where($UpWhere)->update($UpData);
  413. }
  414. // 添加订单操作记录
  415. AddOrderAction($post['order_id'], 0, session('admin_id'), $order_status, $express_status, $pay_status, $action_desc, $action_note);
  416. // 判断是否为虚拟商品
  417. if ('yfk' == $post['status_name'] && $OrderData['prom_type'] == 1) {
  418. PayModel::afterVirtualProductPay($Where);
  419. }
  420. $this->success('操作成功!');
  421. }
  422. }
  423. }else{
  424. $this->error('非法访问!');
  425. }
  426. }
  427. /*
  428. * 更新管理员备注
  429. */
  430. public function update_note()
  431. {
  432. if (IS_AJAX_POST) {
  433. $post = input('post.');
  434. if (!empty($post['order_id'])) {
  435. $UpdateData = [
  436. 'admin_note' => $post['admin_note'],
  437. 'update_time' => getTime(),
  438. ];
  439. $return = $this->shop_order_db->where('order_id',$post['order_id'])->update($UpdateData);
  440. if (!empty($return)) {
  441. $this->success('保存成功!');
  442. }
  443. }else{
  444. $this->error('非法访问!');
  445. }
  446. }else{
  447. $this->error('非法访问!');
  448. }
  449. }
  450. /*
  451. * 运费模板列表
  452. */
  453. public function shipping_template()
  454. {
  455. $Where = [
  456. 'a.level' => 1,
  457. ];
  458. $region_name = input('param.region_name');
  459. if (!empty($region_name)) {
  460. $Where['a.name'] = array('LIKE', "%{$region_name}%");
  461. }
  462. // 省份
  463. $Template = M('region')->field('a.id, a.name,b.template_money,b.template_id')
  464. ->alias('a')
  465. ->join('__SHOP_SHIPPING_TEMPLATE__ b', 'a.id = b.province_id', 'LEFT')
  466. ->where($Where)
  467. ->getAllWithIndex('id');
  468. $this->assign('Template', $Template);
  469. // 统一配送
  470. $info = $this->shipping_template_db->where('province_id','100000')->find();
  471. $this->assign('info', $info);
  472. return $this->fetch('shipping_template');
  473. }
  474. // 订单批量删除
  475. public function order_del()
  476. {
  477. $order_id = input('del_id/a');
  478. $order_id = eyIntval($order_id);
  479. if (IS_AJAX_POST && !empty($order_id)) {
  480. // 条件数组
  481. $Where = [
  482. 'order_id' => ['IN', $order_id],
  483. 'lang' => $this->admin_lang,
  484. ];
  485. // 查询数据,存在adminlog日志
  486. $result = $this->shop_order_db->field('order_code')->where($Where)->select();
  487. $order_code_list = get_arr_column($result, 'order_code');
  488. // 删除订单列表数据
  489. $return = $this->shop_order_db->where($Where)->delete();
  490. if ($return) {
  491. // 同步删除订单下的产品
  492. $this->shop_order_details_db->where($Where)->delete();
  493. // 同步删除订单下的操作记录
  494. $this->shop_order_log_db->where($Where)->delete();
  495. adminLog('删除订单:'.implode(',', $order_code_list));
  496. $this->success('删除成功');
  497. }else{
  498. $this->error('删除失败');
  499. }
  500. }
  501. $this->error('参数有误');
  502. }
  503. /*
  504. * 查询会员订单数据并加载,无返回
  505. */
  506. function GetOrderData($order_id)
  507. {
  508. // 获取订单数据
  509. $OrderData = $this->shop_order_db->find($order_id);
  510. // 获取会员数据
  511. $UsersData = $this->users_db->find($OrderData['users_id']);
  512. // 当前单条订单信息的会员ID,存入session,用于添加订单操作表
  513. session('OrderUsersId',$OrderData['users_id']);
  514. // 获取订单详细表数据
  515. $DetailsData = $this->shop_order_details_db->where('order_id',$OrderData['order_id'])->select();
  516. // 获取订单状态,后台专用
  517. $admin_order_status_arr = Config::get('global.admin_order_status_arr');
  518. // 获取订单方式名称
  519. $pay_method_arr = Config::get('global.pay_method_arr');
  520. // 处理订单主表的地址数据处理,显示中文名字
  521. $OrderData['country'] = '中国';
  522. $OrderData['province'] = get_province_name($OrderData['province']);
  523. $OrderData['city'] = get_city_name($OrderData['city']);
  524. $OrderData['district'] = get_area_name($OrderData['district']);
  525. $array_new = get_archives_data($DetailsData,'product_id');
  526. $OrderData['prom_type_virtual'] = false;
  527. // 处理订单详细表数据处理
  528. foreach ($DetailsData as $key => $value) {
  529. if ($value['prom_type'] == 1) {
  530. $OrderData['prom_type_virtual'] = true;
  531. }
  532. // 产品属性处理
  533. $ValueData = unserialize($value['data']);
  534. // 规制值
  535. $spec_value = !empty($ValueData['spec_value']) ? htmlspecialchars_decode($ValueData['spec_value']) : '';
  536. $spec_value = htmlspecialchars_decode($spec_value);
  537. // 旧参数
  538. $attr_value = !empty($ValueData['attr_value']) ? htmlspecialchars_decode($ValueData['attr_value']) : '';
  539. $attr_value = htmlspecialchars_decode($attr_value);
  540. // 新参数
  541. $attr_value_new = !empty($ValueData['attr_value_new']) ? htmlspecialchars_decode($ValueData['attr_value_new']) : '';
  542. $attr_value_new = htmlspecialchars_decode($attr_value_new);
  543. // 优先显示新参数
  544. $attr_value = !empty($attr_value_new) ? $attr_value_new : $attr_value;
  545. $DetailsData[$key]['data'] = $spec_value . $attr_value;
  546. // 产品内页地址
  547. $DetailsData[$key]['arcurl'] = get_arcurl($array_new[$value['product_id']]);
  548. // 小计
  549. $DetailsData[$key]['subtotal'] = $value['product_price'] * $value['num'];
  550. $DetailsData[$key]['litpic'] = handle_subdir_pic($DetailsData[$key]['litpic']); // 支持子目录
  551. }
  552. // 订单类型
  553. if (empty($OrderData['prom_type'])) {
  554. $OrderData['prom_type_name'] = '普通订单';
  555. }else{
  556. $OrderData['prom_type_name'] = '虚拟订单';
  557. }
  558. // 移动端查询物流链接
  559. $MobileExpressUrl = "//m.kuaidi100.com/index_all.html?type=".$OrderData['express_code']."&postid=".$OrderData['express_order'];
  560. // 加载数据
  561. $this->assign('MobileExpressUrl', $MobileExpressUrl);
  562. $this->assign('OrderData', $OrderData);
  563. $this->assign('DetailsData', $DetailsData);
  564. $this->assign('UsersData', $UsersData);
  565. $this->assign('admin_order_status_arr',$admin_order_status_arr);
  566. $this->assign('pay_method_arr',$pay_method_arr);
  567. }
  568. // 检测并第一次从官方同步订单中心的前台模板
  569. public function ajax_syn_theme_shop()
  570. {
  571. $msg = '下载订单中心模板包异常,请第一时间联系技术支持,排查问题!';
  572. $shopLogic = new ShopLogic;
  573. $data = $shopLogic->syn_theme_shop();
  574. if (true !== $data) {
  575. if (1 <= intval($data['code'])) {
  576. $this->success('初始化成功!', url('Shop/index'));
  577. } else {
  578. if (is_array($data)) {
  579. $msg = $data['msg'];
  580. }
  581. }
  582. }
  583. getUsersConfigData('shop', ['shop_open' => 0]);
  584. $this->error($msg);
  585. }
  586. // ------------------------------------------------------------------------------------------------------
  587. // 以下所有代码都是产品规格处理逻辑 2019-07-08 陈风任
  588. // ------------------------------------------------------------------------------------------------------
  589. // 规格列表管理,包含新增、更新
  590. public function spec_template()
  591. {
  592. if (IS_AJAX_POST) {
  593. // 新增、更新
  594. $post = input('post.');
  595. // 当前时间戳
  596. $time = getTime();
  597. /*新增数据处理*/
  598. $post_new = [];
  599. foreach ($post['preset_new'] as $key => $value) {
  600. // 规格名称不允许为空
  601. $preset_name = $post['preset_name_'.$value][0];
  602. if (empty($preset_name)) continue;
  603. // 排序号
  604. $sort_order = $post['sort_order_'.$value];
  605. // 拼装三维数组
  606. foreach ($post['preset_value_'.$value] as $kk => $vv) {
  607. if (empty($vv)) continue;
  608. $post_new[$key][$kk]['preset_mark_id'] = $value; // 标记ID,一整条规格信息中的唯一标识
  609. $post_new[$key][$kk]['preset_name'] = $preset_name;
  610. $post_new[$key][$kk]['preset_value'] = $vv;
  611. $post_new[$key][$kk]['sort_order'] = $sort_order;
  612. $post_new[$key][$kk]['lang'] = $this->admin_lang;
  613. $post_new[$key][$kk]['add_time'] = $time;
  614. $post_new[$key][$kk]['update_time'] = $time;
  615. }
  616. }
  617. // 三维数组降为二维数组
  618. $data_new = $this->ProductSpecLogic->ArrayDowngrade($post_new);
  619. /* END */
  620. /*原有数据处理*/
  621. $post_old = [];
  622. foreach ($post['preset_old'] as $key => $value) {
  623. // 规格名称不允许为空
  624. $preset_name = $post['preset_name_old_'.$value][0];
  625. if (empty($preset_name)) continue;
  626. // 排序号
  627. $sort_order = $post['sort_order_'.$value];
  628. // 拼装三维数组
  629. foreach ($post['preset_value_old_'.$value] as $kk => $vv) {
  630. if (empty($vv)) continue;
  631. $preset_id = $post['preset_id_old_'.$value][$kk];
  632. // 如果ID是否为空
  633. if (!empty($preset_id)) {
  634. // 有ID则为更新
  635. $post_old[$key][$kk]['preset_id'] = $preset_id;
  636. }else{
  637. // 无ID则为新增
  638. $post_old[$key][$kk]['lang'] = $this->admin_lang;
  639. $post_old[$key][$kk]['add_time'] = $time;
  640. $post_old[$key][$kk]['preset_mark_id'] = $value; // 标记ID,一整条规格信息中的唯一标识
  641. }
  642. $post_old[$key][$kk]['preset_name'] = $preset_name;
  643. $post_old[$key][$kk]['preset_value'] = $vv;
  644. $post_old[$key][$kk]['sort_order'] = $sort_order;
  645. $post_old[$key][$kk]['update_time'] = $time;
  646. }
  647. }
  648. // 三维数组降为二维数组
  649. $data_old = $this->ProductSpecLogic->ArrayDowngrade($post_old);
  650. /* END */
  651. // 合并数组并且更新数据
  652. $UpData = array_merge($data_old, $data_new);
  653. model('ProductSpecPreset')->saveAll($UpData);
  654. $this->success('更新成功!');
  655. }
  656. // 查询规格数据
  657. $PresetData = $this->product_spec_preset_db->where('lang',$this->admin_lang)->order('sort_order asc, preset_id asc')->select();
  658. // 数组转化
  659. $ResultData = $this->ProductSpecLogic->GetPresetData($PresetData);
  660. // 获取预设规格中最大的标记MarkId
  661. $PresetMarkId = model('ProductSpecPreset')->GetMaxPresetMarkId();
  662. // 加载参数
  663. $this->assign('info', $ResultData);
  664. $this->assign('PresetMarkId', $PresetMarkId);
  665. return $this->fetch('spec_template');
  666. }
  667. // 删除规格名称\规格值
  668. public function spec_delete()
  669. {
  670. if (IS_AJAX_POST) {
  671. $post = input('post.');
  672. $where = $this->ProductSpecLogic->GetDeleteSpecWhere($post);
  673. if (!empty($where)) {
  674. $result = $this->product_spec_preset_db->where($where)->delete();
  675. if (!empty($result)) {
  676. $this->success('删除成功!');
  677. }
  678. }
  679. $this->error('删除失败!');
  680. }
  681. }
  682. // 选中规格名称,追加html到页面展示
  683. public function spec_select()
  684. {
  685. if (IS_AJAX_POST) {
  686. $post = input('post.');
  687. // 当选中的规格名称超过三个,不允许再添加
  688. if (3 == count(session('spec_arr'))) {
  689. $this->error('最多只能添加三种规格大类!');
  690. }
  691. // 获取预设规格标记ID数组
  692. $PresetMarkIdArray = $this->ProductSpecLogic->GetPresetMarkIdArray($post);
  693. // 拼装预设名称下拉选项
  694. if (!empty($PresetMarkIdArray)) {
  695. // 添加选中的规格数据
  696. model('ProductSpecData')->PresetSpecAddData($post);
  697. // 拼装更新预设名称下拉选项
  698. $Result = $this->ProductSpecLogic->GetPresetNameOption($PresetMarkIdArray, $post);
  699. }else{
  700. $this->error('最多只能添加三种规格大类!');
  701. }
  702. if (isset($post['aid']) && !empty($post['aid'])) {
  703. $ResultData = $this->ProductSpecLogic->GetPresetValueOption('', $post['spec_mark_id'], $post['aid'], 2);
  704. $PresetName = $ResultData['PresetName'];
  705. $PresetValueOption = $ResultData['PresetValueOption'];
  706. }else{
  707. // 拼装预设值下拉选项
  708. $PresetValue = $this->product_spec_preset_db->where('preset_mark_id','IN',$post['preset_mark_id'])->field('preset_id,preset_name,preset_value')->select();
  709. $PresetName = $PresetValue[0]['preset_name'];
  710. $PresetValueOption = $this->ProductSpecLogic->GetPresetValueOption($PresetValue);
  711. }
  712. if (isset($post['aid']) && !empty($post['aid'])) {
  713. // 结果返回
  714. $ReturnHtml = [
  715. 'preset_name' => $PresetName,
  716. 'preset_name_option' => $Result['Option'],
  717. 'spec_mark_id_arr' => $Result['MarkId'],
  718. 'preset_value_option' => $PresetValueOption,
  719. ];
  720. }else{
  721. // 结果返回
  722. $ReturnHtml = [
  723. 'preset_name' => $PresetName,
  724. 'preset_name_option' => $Result['Option'],
  725. 'preset_mark_id_arr' => $Result['MarkId'],
  726. 'preset_value_option' => $PresetValueOption,
  727. ];
  728. }
  729. $this->success('加载成功!', null, $ReturnHtml);
  730. }
  731. }
  732. // 当规格库更新后,调用此方式及时更新选择预设规格的下拉框信息及规格框信息
  733. public function update_spec_info()
  734. {
  735. if (IS_AJAX_POST) {
  736. $post = input('post.');
  737. // 拼装更新预设名称下拉选项
  738. $ResultData = $this->ProductSpecLogic->GetPresetNameOption($post['preset_mark_id_arr']);
  739. // 获取规格拼装后的html表格
  740. $ResultArray = $this->ProductSpecLogic->GetPresetSpecAssembly($post);
  741. // 结果返回
  742. if (isset($post['aid']) && !empty($post['aid'])) {
  743. $ReturnHtml = [
  744. 'HtmlTable' => $ResultArray['HtmlTable'],
  745. 'spec_name_option' => $ResultData['Option'],
  746. 'spec_mark_id_arr' => $ResultArray['PresetMarkIdArray'],
  747. ];
  748. }else{
  749. // 拼装更新预设名称下拉选项
  750. $where = [
  751. 'preset_mark_id' => ['IN', $post['preset_mark_id_arr']],
  752. ];
  753. $PresetData = $this->product_spec_preset_db->where($where)->order('preset_id asc')->select();
  754. $sessionData = session('spec_arr');
  755. foreach ($PresetData as $key => $value) {
  756. if (!empty($sessionData[$value['preset_mark_id']])) {
  757. if (in_array($value['preset_id'], $sessionData[$value['preset_mark_id']])) {
  758. unset($PresetData[$key]);
  759. }
  760. }
  761. }
  762. $PresetData = group_same_key($PresetData, 'preset_mark_id');
  763. $result = [];
  764. foreach ($PresetData as $key => $value) {
  765. $result[$key] .= "<option value='0'>选择规格值</option>";
  766. if(!empty($value)){
  767. foreach($value as $sub_value){
  768. $result[$key] .= "<option value='{$sub_value['preset_id']}'>{$sub_value['preset_value']}</option>";
  769. }
  770. }
  771. }
  772. $ReturnHtml = [
  773. 'HtmlTable' => $ResultArray['HtmlTable'],
  774. 'preset_name_option' => $ResultData['Option'],
  775. 'preset_mark_id_arr' => $ResultArray['PresetMarkIdArray'],
  776. 'preset_value_id' => explode(',', $post['preset_mark_id_arr']),
  777. 'preset_value_option' => $result,
  778. ];
  779. }
  780. $this->success('更新成功!', null, $ReturnHtml);
  781. }
  782. }
  783. // 获取或更新规格组合的数据
  784. // preset_id:预设值ID
  785. // preset_mark_id:预设参数标记ID,同一预设规格名称下的所有规格值统一使用,可理解为规格名称唯一ID。
  786. public function assemble_spec_data()
  787. {
  788. if (IS_AJAX_POST) {
  789. $post = input('post.');
  790. // 刷新或重新进入产品添加页则清除关于产品session
  791. if (isset($post['initialization']) && !empty($post['initialization'])) {
  792. session('spec_arr', null);
  793. $this->success('初始化完成');
  794. }
  795. // 若清除一整条规格信息则清除session中相应的数据并且重置规格名称下拉框选项
  796. $ResultArray = $this->ProductSpecLogic->GetResetPresetNameOption($post);
  797. // 删除单个规格值则清除session对应的值
  798. $ValueArray = $this->ProductSpecLogic->ClearSpecValueID($post);
  799. // 把session中的数据和提交的数据组合
  800. $SpecArray = $this->ProductSpecLogic->GetSessionPostArrayMerge($post);
  801. if (isset($SpecArray['error']) && !empty($SpecArray['error'])) {
  802. $this->error($SpecArray['error']);
  803. }
  804. // 获取规格拼装后的html表格
  805. if (isset($post['aid']) && !empty($post['aid'])) {
  806. // 编辑
  807. $HtmlTable = $this->ProductSpecLogic->SpecAssemblyEdit($SpecArray, $post['aid']);
  808. }else{
  809. // 新增
  810. $HtmlTable = $this->ProductSpecLogic->SpecAssembly($SpecArray);
  811. }
  812. if (!empty($ValueArray['Option'])) {
  813. // 删除规格值后的规格值下拉框
  814. $PresetValueOption = $ValueArray['Option'];
  815. $ResultValue['Value'] = null;
  816. }else{
  817. $ResultValue = model('ProductSpecPreset')->GetPresetNewData(session('spec_arr'), $post);
  818. // 获取新增规格值后的下拉框
  819. if (empty($post['aid'])) {
  820. $PresetValueOption = $this->ProductSpecLogic->GetPresetValueOption($ResultValue['Option']);
  821. }else{
  822. $PresetValueOption = $ResultValue['Option'];
  823. }
  824. }
  825. // 返回数据
  826. $ReturnData = [
  827. 'HtmlTable' => $HtmlTable,
  828. 'PresetNameOption' => $ResultArray['Option'],
  829. 'PresetMarkIdArray' => $ResultArray['MarkId'],
  830. 'SelectPresetValue' => $ResultValue['Value'],
  831. 'PresetValueOption' => $PresetValueOption,
  832. ];
  833. $this->success('加载成功!', null, $ReturnData);
  834. }
  835. }
  836. // 同步规格值到产品规格中,刷新规格值下拉框
  837. public function refresh_spec_value()
  838. {
  839. if (IS_AJAX_POST) {
  840. $post = input('post.');
  841. // 是否提交完整数据
  842. if (empty($post['spec_mark_id']) || empty($post['aid'])) $this->error('数据有误,同步失败,请刷新重试!');
  843. /*查询产品已选规格数据*/
  844. $where = [
  845. 'aid' => $post['aid'],
  846. 'spec_mark_id' => $post['spec_mark_id'],
  847. ];
  848. $SpecData = Db::name('product_spec_data')->where($where)->order('spec_value_id asc')->select();
  849. // 以规格值ID为键名
  850. $SpecData = group_same_key($SpecData, 'spec_value_id');
  851. /* END */
  852. /*查询规格库数据*/
  853. $where = [
  854. 'preset_mark_id' => $post['spec_mark_id'],
  855. ];
  856. $PresetData = $this->product_spec_preset_db->where($where)->order('preset_id asc')->select();
  857. /* END */
  858. // 初始化数组
  859. $AddData = $UpData = $SpecIds = $UpSpecWhere = $UpSpecName = [];
  860. // 数据处理
  861. foreach ($PresetData as $pd_k => $pd_v) {
  862. if (!empty($SpecData[$pd_v['preset_id']]) && $pd_v['preset_name'] != $SpecData[$pd_v['preset_id']][0]['spec_name']) {
  863. // 更新规格名称数组
  864. if (empty($UpSpecWhere) && empty($UpSpecName)) {
  865. $UpSpecWhere = [
  866. 'aid' => $post['aid'],
  867. 'spec_mark_id' => $pd_v['preset_mark_id'],
  868. ];
  869. $UpSpecName = [
  870. 'spec_name' => $pd_v['preset_name'],
  871. ];
  872. }
  873. }
  874. if (empty($SpecData[$pd_v['preset_id']])) {
  875. // 添加规格值数据
  876. $AddData[] = [
  877. 'aid' => $post['aid'],
  878. 'spec_mark_id' => $pd_v['preset_mark_id'],
  879. 'spec_name' => $pd_v['preset_name'],
  880. 'spec_value_id' => $pd_v['preset_id'],
  881. 'spec_value' => $pd_v['preset_value'],
  882. 'spec_is_select' => 0,
  883. 'lang' => $this->admin_lang,
  884. 'add_time' => getTime(),
  885. 'update_time' => getTime(),
  886. ];
  887. } else if (!empty($SpecData[$pd_v['preset_id']]) && $pd_v['preset_value'] != $SpecData[$pd_v['preset_id']][0]['spec_value']) {
  888. // 更新规格值数据
  889. $UpData[] = [
  890. 'spec_id' => $SpecData[$pd_v['preset_id']][0]['spec_id'],
  891. 'spec_mark_id' => $pd_v['preset_mark_id'],
  892. 'spec_name' => $pd_v['preset_name'],
  893. 'spec_value_id' => $pd_v['preset_id'],
  894. 'spec_value' => $pd_v['preset_value'],
  895. 'update_time' => getTime(),
  896. ];
  897. // 删除产品已选规格表中对应需要更新的规格值数据
  898. unset($SpecData[$pd_v['preset_id']]);
  899. } else {
  900. // 删除规格库中不存在的规格值数据
  901. unset($SpecData[$pd_v['preset_id']]);
  902. }
  903. }
  904. // 合并添加、编辑数据,统一处理
  905. $SaveData = array_merge($AddData, $UpData);
  906. /*处理需要删除的规格值数据*/
  907. if (!empty($SpecData)) {
  908. $DelIsSelect = 0;
  909. foreach ($SpecData as $key => $value) {
  910. $SpecIds[] = $value[0]['spec_id'];
  911. if (1 == $value[0]['spec_is_select']) {
  912. $DelIsSelect = 1;
  913. }
  914. $spec_mark_id = $value[0]['spec_mark_id'];
  915. }
  916. }
  917. /* END */
  918. $HtmlTable = $SpecMarks = '';
  919. if (!empty($SpecIds)) {
  920. // 删除废弃的规格值数据
  921. Db::name('product_spec_data')->where('spec_id', 'IN', $SpecIds)->delete();
  922. if (1 == $DelIsSelect) {
  923. session('spec_arr', null);
  924. $SpecWhere = [
  925. 'aid' => $post['aid'],
  926. 'lang' => $this->admin_lang,
  927. 'spec_is_select' => 1,// 已选中的
  928. ];
  929. $order = 'spec_value_id asc, spec_id asc';
  930. $product_spec_data = Db::name('product_spec_data')->where($SpecWhere)->order($order)->select();
  931. if (!empty($product_spec_data)) {
  932. $spec_arr_new = group_same_key($product_spec_data, 'spec_mark_id');
  933. $DelAllSpec = $spec_mark_id;
  934. foreach ($spec_arr_new as $key => $value) {
  935. $spec_mark_id_arr[] = $key;
  936. for ($i=0; $i<count($value); $i++) {
  937. $spec_arr_new[$key][$i] = $value[$i]['spec_value_id'];
  938. }
  939. if ($spec_mark_id == $key) {
  940. $DelAllSpec = 0;
  941. }
  942. }
  943. session('spec_arr', $spec_arr_new);
  944. $HtmlTable = $this->ProductSpecLogic->SpecAssemblyEdit($spec_arr_new, $post['aid']);
  945. $SpecMarks = implode(',', $spec_mark_id_arr);
  946. }
  947. }
  948. }
  949. if (!empty($SaveData)) {
  950. // 批量保存更新新规格
  951. model('ProductSpecData')->saveAll($SaveData);
  952. }
  953. if (!empty($UpSpecWhere) && !empty($UpSpecName)) {
  954. // 更新当前产品下对应的规格名称
  955. Db::name('product_spec_data')->where($UpSpecWhere)->update($UpSpecName);
  956. if (empty($UpData)) {
  957. $UpData[0] = [
  958. 'spec_name' => $UpSpecName['spec_name'],
  959. 'spec_mark_id' => $UpSpecWhere['spec_mark_id']
  960. ];
  961. }
  962. }
  963. $ValueOption = $this->ProductSpecLogic->GetPresetValueOption('', $post['spec_mark_id'], $post['aid']);
  964. $ResultData = [
  965. 'UpData' => $UpData,
  966. 'SpecIds' => $SpecIds,
  967. 'HtmlTable' => $HtmlTable,
  968. 'SpecMarks' => $SpecMarks,
  969. 'DelAllSpec' => $DelAllSpec,
  970. 'ValueOption' => $ValueOption,
  971. ];
  972. $this->success('同步成功,规格值已刷新!', null, $ResultData);
  973. }
  974. }
  975. // 新增产品时更新同步规格数据
  976. public function refresh_preset_value()
  977. {
  978. if (IS_AJAX_POST) {
  979. $post = input('post.');
  980. if (!empty($post)) {
  981. $HtmlTable = $DelAllPreset = $PresetData = $MarkData = '';
  982. if ((isset($post['mark_mark_ids']) && !empty($post['mark_mark_ids'])) || (isset($post['mark_preset_ids']) && !empty($post['mark_preset_ids']))) {
  983. if (!empty($post['mark_mark_ids'])) {
  984. $MarkData = $this->product_spec_preset_db->where('preset_mark_id', 'IN', $post['mark_mark_ids'])->field('preset_mark_id, preset_name')->select();
  985. }
  986. if (!empty($post['mark_preset_ids'])) {
  987. $PresetData = $this->product_spec_preset_db->where('preset_id', 'IN', $post['mark_preset_ids'])->field('preset_id, preset_value')->select();
  988. }
  989. } else {
  990. $DelAllPreset = 0;
  991. $spec_arr_ses = session('spec_arr');
  992. foreach ($spec_arr_ses[$post['preset_mark_id']] as $key => $value) {
  993. if ($value == $post['preset_id']) {
  994. unset($spec_arr_ses[$post['preset_mark_id']][$key]);
  995. }
  996. }
  997. if (empty($spec_arr_ses[$post['preset_mark_id']])) {
  998. unset($spec_arr_ses[$post['preset_mark_id']]);
  999. $count = $this->product_spec_preset_db->where('preset_mark_id', $post['preset_mark_id'])->count();
  1000. if (empty($count)) {
  1001. $DelAllPreset = 1;
  1002. }
  1003. }
  1004. session('spec_arr',$spec_arr_ses);
  1005. $HtmlTable = $this->ProductSpecLogic->SpecAssembly($spec_arr_ses);
  1006. }
  1007. $ResultData = [
  1008. 'MarkData' => $MarkData,
  1009. 'HtmlTable' => $HtmlTable,
  1010. 'PresetData' => $PresetData,
  1011. 'DelAllPreset' => $DelAllPreset,
  1012. ];
  1013. $this->success('同步成功!', null, $ResultData);
  1014. }
  1015. }
  1016. }
  1017. // 检查是否最新的购物车标签
  1018. public function VerifyLatestTemplate()
  1019. {
  1020. // 验证最新模板
  1021. $ResultData = VerifyLatestTemplate();
  1022. if (empty($ResultData)) {
  1023. // 更新开启多规格
  1024. getUsersConfigData('shop', ['shop_open_spec' => 1]);
  1025. // 返回提示
  1026. $this->success('模板检测通过,规格已开启!');
  1027. }else{
  1028. if (5 == count($ResultData)) {
  1029. $msg = '未检测到规格标签,请根据提示手工调用后再重新验证!';
  1030. }else{
  1031. $msg = '规格标签缺少变量:<br/><span style="color: red;">'.implode(', ', $ResultData).'</span><br/>请检查模板核实后再次验证!';
  1032. }
  1033. // 更新关闭多规格
  1034. getUsersConfigData('shop', ['shop_open_spec' => 0]);
  1035. // 返回提示
  1036. $this->error($msg);
  1037. }
  1038. }
  1039. public function FindSmptConfig() {
  1040. $Smtp = tpCache('smtp');
  1041. if (empty($Smtp['smtp_server']) || empty($Smtp['smtp_port']) || empty($Smtp['smtp_user']) || empty($Smtp['smtp_pwd']) || empty($Smtp['smtp_from_eamil'])) {
  1042. $this->error('邮箱配置尚未配置完成,前往配置?', url('System/smtp'));
  1043. } else {
  1044. // tpCache('smtp', [input('post.field') => 1]);
  1045. $this->success('配置完成');
  1046. }
  1047. }
  1048. }