12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147 |
- <?php
- /**
- * 易优CMS
- * ============================================================================
- * 版权所有 2016-2028 海口快推科技有限公司,并保留所有权利。
- * 网站地址: http://www.eyoucms.com
- * ----------------------------------------------------------------------------
- * 如果商业用途务必到官方购买正版授权, 以免引起不必要的法律纠纷.
- * ============================================================================
- * Author: 陈风任 <491085389@qq.com>
- * Date: 2019-03-26
- */
-
- namespace app\admin\controller;
-
- use think\Page;
- use think\Db;
- use think\Config;
- use app\admin\logic\ShopLogic;
- use app\admin\logic\ProductSpecLogic; // 用于产品规格逻辑功能处理
- use app\user\model\Pay as PayModel; //用于虚拟网盘商品付款后自动走流程处理
-
- class Shop extends Base {
-
- public $UsersConfigData = [];
-
- /**
- * 构造方法
- */
- public function __construct(){
- parent::__construct();
- $this->language_access(); // 多语言功能操作权限
- $this->users_db = Db::name('users'); // 会员信息表
- $this->shop_order_db = Db::name('shop_order'); // 订单主表
- $this->shop_order_details_db = Db::name('shop_order_details'); // 订单明细表
- $this->shop_address_db = Db::name('shop_address'); // 收货地址表
- $this->shop_express_db = Db::name('shop_express'); // 物流名字表
- $this->shop_order_log_db = Db::name('shop_order_log'); // 订单操作表
- $this->shipping_template_db = Db::name('shop_shipping_template'); // 运费模板表
- $this->product_spec_preset_db = Db::name('product_spec_preset'); // 产品规格预设表
-
- // 会员中心配置信息
- $this->UsersConfigData = getUsersConfigData('all');
-
- $this->assign('userConfig', $this->UsersConfigData);
-
- // 用于产品规格逻辑功能处理
- $this->ProductSpecLogic = new ProductSpecLogic;
-
- // 模型是否开启
- $channeltype_row = \think\Cache::get('extra_global_channeltype');
- $this->assign('channeltype_row', $channeltype_row);
-
- // 过期订单预处理
- $this->ShopLogic = new ShopLogic;
- $this->ShopLogic->OverdueOrderHandle();
-
- // 列出营销功能里已使用的模块
- $marketFunc = $this->ShopLogic->marketLogic();
- $this->assign('marketFunc', $marketFunc);
-
- // 获取核销插件数据
- $this->weappInfo = model('ShopPublicHandle')->getWeappVerifyInfo();
- $this->assign('weappInfo', $this->weappInfo);
- }
-
- public function home()
- {
- $url = url('Statistics/index', [], true, true);
- $url = preg_replace('/^http(s?)/i', $this->request->scheme(), $url);
- $this->redirect($url);
- exit;
- }
-
- /**
- * 商城设置
- */
- public function conf()
- {
- if (IS_POST) {
- $post = input('post.');
- if (!empty($post)) {
- $TestPass = $post['TestPass'];
- unset($post['TestPass']);
- if (0 == $TestPass) unset($post['shop']['shop_open_spec']);
-
- foreach ($post as $key => $val) {
- is_array($val) && getUsersConfigData($key, $val);
- }
- if (!empty($post['shop_open_comment']) && 1 === intval($post['shop_open_comment'])) {
- tpCache('web', ['web_shopcomment_switch' => 1]);
- } else if (isset($post['shop_open_comment']) && 0 === intval($post['shop_open_comment'])) {
- tpCache('web', ['web_shopcomment_switch' => 0]);
- }
-
- $this->success('设置成功!', url('Shop/conf'));
- }
- }
-
- $Result = VerifyLatestTemplate();
- if (!empty($Result)) getUsersConfigData('shop', ['shop_open_spec' => 0]);
- $TestPass = empty($Result) ? 1 : 0;
- $this->assign('TestPass', $TestPass);
-
- // 商城配置信息
- $smtp = tpCache('smtp');
- $this->assign('smtp', $smtp);
- return $this->fetch('conf');
- }
-
- /**
- * 订单列表
- */
- public function index()
- {
- // 是否安装 秒杀抢购插件
- $where = [
- 'status' => 1,
- 'code' => 'Seckill'
- ];
- $seckill = Db::name('weapp')->where($where)->count();
- $this->assign('seckill', $seckill);
-
- // 积分商城插件
- $pointsShop = model('ShopPublicHandle')->getWeappPointsShop();
- $this->assign('pointsShop', $pointsShop);
-
- // 手机端后台管理插件特定使用参数
- $isMobile = input('param.isMobile/d', 0);
-
- // 初始化数组和条件
- $where = [
- 'merchant_id' => 0,
- 'a.lang' => $this->admin_lang,
- ];
-
- // 订单号查询
- $order_code = input('order_code/s');
- if (!empty($order_code)) $where['a.order_code'] = ['LIKE', "%{$order_code}%"];
-
- // 支付方式查询
- $pay_name = input('pay_name/s');
- if (!empty($pay_name)) $where['a.pay_name'] = $pay_name;
- $this->assign('pay_name', $pay_name);
-
- // 订单下单终端查询
- $order_terminal = input('order_terminal/d');
- if (!empty($order_terminal)) $where['a.order_terminal'] = $order_terminal;
- $this->assign('order_terminal', $order_terminal);
-
- // 商品类型查询
- $contains_virtual = input('contains_virtual/d');
- if (!empty($contains_virtual)) $where['a.contains_virtual'] = $contains_virtual;
- $this->assign('contains_virtual', $contains_virtual);
-
- //活动订单查询
- $act_type = input('act_type/d', 0);
- // 普通订单
- if (1 === intval($act_type)) {
- if (!empty($seckill)) $where['a.is_seckill_order'] = 0;
- if (!empty($pointsShop)) $where['a.points_shop_order'] = 0;
- }
- // 秒杀插件订单
- else if (2 === intval($act_type) && !empty($seckill)) {
- $where['a.is_seckill_order'] = ['gt', 0];
- }
- // 积分商城插件订单
- else if (3 === intval($act_type) && !empty($pointsShop)) {
- $where['a.points_shop_order'] = 1;
- }
-
- //时间检索条件
- $begin = strtotime(input('param.add_time_begin/s'));
- $end = input('param.add_time_end/s');
- !empty($end) && $end .= ' 23:59:59';
- $end = strtotime($end);
- // 时间检索
- if ($begin > 0 && $end > 0) {
- $where['a.add_time'] = array('between', "$begin, $end");
- } else if ($begin > 0) {
- $where['a.add_time'] = array('egt', $begin);
- } else if ($end > 0) {
- $where['a.add_time'] = array('elt', $end);
- }
-
- // 订单状态查询
- $order_status = input('order_status/s');
- if (!empty($order_status)) $where['a.order_status'] = (10 == $order_status) ? 0 : $order_status;
-
- // 分页查询
- $count = $this->shop_order_db->alias('a')->where($where)->count('order_id');
- $pageObj = new Page($count, config('paginate.list_rows'));
-
- // 订单主表数据查询
- $list = $this->shop_order_db->alias('a')
- ->field('a.*, b.username as u_username, b.nickname as u_nickname, b.mobile as u_mobile')
- ->where($where)
- ->join('__USERS__ b', 'a.users_id = b.users_id', 'LEFT')
- ->order('a.order_id desc')
- ->limit($pageObj->firstRow.','.$pageObj->listRows)
- ->select();
- if (empty($list) && !empty($order_code)) {
- // 通过商品名称查询订单号
- $where_1['product_name'] = ['LIKE', "%{$order_code}%"];
- $order_ids = $this->shop_order_details_db->where($where_1)->group('order_id')->column('order_id');
- // 重新查询订单主表
- unset($where['a.order_code']);
- $where['a.order_id'] = ['IN', $order_ids];
- // 分页查询
- $count = $this->shop_order_db->alias('a')->where($where)->count('order_id');
- $pageObj = new Page($count, config('paginate.list_rows'));
- // 订单主表数据查询
- $list = $this->shop_order_db->alias('a')
- ->field('a.*, b.username as u_username, b.nickname as u_nickname, b.mobile as u_mobile')
- ->where($where)
- ->join('__USERS__ b', 'a.users_id = b.users_id', 'LEFT')
- ->order('a.order_id desc')
- ->limit($pageObj->firstRow.','.$pageObj->listRows)
- ->select();
- }
-
- $order_ids = [];
- $OrderReminderID = [];
- foreach ($list as $key => $value) {
- array_push($order_ids, $value['order_id']);
- if (1 == $value['order_status']) array_push($OrderReminderID, $value['order_id']);
- }
-
- // 处理订单详情数据
- $where = [
- 'a.order_id' => ['IN', $order_ids]
- ];
- $DetailsData = $this->shop_order_details_db->alias('a')
- ->field('a.*, b.service_id, b.status')
- ->where($where)
- ->join('__SHOP_ORDER_SERVICE__ b', 'a.details_id = b.details_id && b.status NOT IN (3, 8, 9)', 'LEFT')
- ->order('details_id asc')
- ->select();
- $ArchivesData = get_archives_data($DetailsData, 'product_id');
- $OrderServiceStatus = Config::get('global.order_service_status');
- foreach ($DetailsData as $key => $value) {
- // 售后信息处理
- $value['service_id'] = !empty($value['service_id']) ? $value['service_id'] : 0;
- $value['status'] = !empty($value['status']) ? $value['status'] : 0;
- $value['status_name'] = !empty($value['status']) ? $OrderServiceStatus[$value['status']] : '';
- // 产品属性处理
- $value['data'] = !empty($value['data']) ? unserialize($value['data']) : [];
- $value['pointsGoodsBuyField'] = !empty($value['data']['pointsGoodsBuyField']) ? json_decode($value['data']['pointsGoodsBuyField'], true) : [];
- $value['data'] = htmlspecialchars_decode(htmlspecialchars_decode($value['data']['spec_value']));
- // 组合数据
- $value['data'] = explode('<br/>', $value['data']);
- $valueData = '';
- foreach ($value['data'] as $key_1 => $value_1) {
- $delimiter = '';//!empty($isMobile) ? ';' : '';
- if (!empty($value_1)) $valueData .= '<span>' . trim(strrchr($value_1, ':'),':') . '</span>' . $delimiter;
- }
- $value['data'] = $valueData;
- $value['arcurl'] = get_arcurl($ArchivesData[$value['product_id']]);
- $value['litpic'] = handle_subdir_pic(get_default_pic($value['litpic']));
- $DetailsData[$key] = $value;
- }
-
- // 把订单详情数据植入订单数据
- $defaultDetails = [
- 'details_id' => 0,
- 'order_id' => 0,
- 'users_id' => 0,
- 'product_id' => 0,
- 'product_name' => '',
- 'num' => 0,
- 'data' => '',
- 'product_price' => 0,
- 'prom_type' => 0,
- 'litpic' => get_default_pic(),
- 'apply_service' => 0,
- 'is_comment' => 0,
- 'lang' => 'cn',
- 'add_time' => 0,
- 'update_time' => 0,
- 'service_id' => 0,
- 'status' => 0,
- 'status_name' => '',
- 'arcurl' => '',
- ];
- // 把订单详情数据植入订单数据
- $DetailsDataGroup = group_same_key($DetailsData, 'order_id');
- foreach ($list as $key => $value) {
- // 处理会员昵称
- $value['u_nickname'] = !empty($value['u_nickname']) ? $value['u_nickname'] : $value['u_username'];
- // 处理订单详情数据
- $value['Details'] = $DetailsDataGroup[$value['order_id']];
- if (empty($value['Details'])) $value['Details'] = [$defaultDetails];
- // 商品条数
- $value['rowspan'] = count($value['Details']);
- // 添加时间
- $value['add_time'] = date('Y-m-d H:i:s', $value['add_time']);
- // 更新时间
- $value['update_time'] = date('Y-m-d H:i:s', $value['update_time']);
- // 重新赋值数据
- $list[$key] = $value;
- }
-
- // 存在积分商城订单则执行
- $pointsShopOrder = !empty($list) ? get_arr_column($list, 'points_shop_order') : [];
- if (!empty($pointsShopOrder) && in_array(1, $pointsShopOrder)) {
- $weappInfo = model('ShopPublicHandle')->getWeappPointsShop();
- if (!empty($weappInfo)) {
- $pointsShopLogic = new \weapp\PointsShop\logic\PointsShopLogic();
- $list = $pointsShopLogic->pointsShopOrderDataHandle($list);
- }
- }
-
- // 查询订单被提醒发货次数
- if (!empty($OrderReminderID)) {
- $field = 'order_id, count(action_id) as action_count';
- $group = 'order_id';
- $LogWhere = [
- 'action_desc' => '提醒成功!',
- 'order_id' => ['IN', $OrderReminderID]
- ];
- $LogData = $this->shop_order_log_db->field($field)->group($group)->where($LogWhere)->getAllWithIndex('order_id');
- }
-
- // // 计算单页总额
- // $total_money = $this->shop_order_db->alias('a')->where($where)->where('order_id','IN',$order_ids)->value("SUM(`order_amount`) as `total_money`");
- // /*查询已退还的总额*/
- // $list_order_id = get_arr_column($list, 'order_id');
- // $where_new = [
- // 'service_type' => 2,
- // 'status' => ['IN', [2, 4, 5, 7]],
- // 'order_id' => ['IN', $list_order_id]
- // ];
- // $refund_balance = Db::name('shop_order_service')->where($where_new)->value("SUM(`refund_balance`) as `refund_balance`");
- // /* END */
- // // 计算单页总额 - 已退还的总额
- // if (!empty($refund_balance)) $total_money = $total_money - $refund_balance;
- // $this->assign('total_money', $total_money);
-
-
- // 分页显示输出
- $pageStr = $pageObj->show();
- // 获取订单方式名称
- $pay_method_arr = Config::get('global.pay_method_arr');
- // 获取订单状态
- $admin_order_status_arr = Config::get('global.admin_order_status_arr');
-
- // 数据加载
- $this->assign('list', $list);
- $this->assign('page', $pageStr);
- $this->assign('pager', $pageObj);
- $this->assign('LogData', $LogData);
- $this->assign('pay_method_arr', $pay_method_arr);
- $this->assign('admin_order_status_arr', $admin_order_status_arr);
-
- // 是否开启文章付费
- $channelRow = Db::name('channeltype')->where('nid', 'in',['article','download'])->getAllWithIndex('nid');
- foreach ($channelRow as &$val){
- if (!empty($val['data'])) $val['data'] = json_decode($val['data'], true);
- }
- $this->assign('channelRow', $channelRow);
-
- // 是否开启货到付款
- $shopOpenOffline = 1;
- if (0 === intval($this->UsersConfigData['shop_open_offline']) || !isset($this->UsersConfigData['shop_open_offline'])) {
- $shopOpenOffline = 0;
- }
- $this->assign('shopOpenOffline', $shopOpenOffline);
-
- // 开启的商城商品类型
- $shopType = $this->UsersConfigData['shop_type'];
- $this->assign('shopType', $shopType);
-
- // 是否开启微信、支付宝支付
- $where = [
- 'status' => 1,
- 'pay_mark' => ['IN', ['wechat', 'alipay']]
- ];
- $payApiConfig = Db::name('pay_api_config')->where($where)->select();
- $openWeChat = $openAliPay = 1;
- foreach ($payApiConfig as $key => $value) {
- $payInfo = unserialize($value['pay_info']);
- if (!empty($payInfo) && isset($payInfo['is_open_wechat']) && 0 === intval($payInfo['is_open_wechat'])) {
- $openWeChat = 0;
- }
- if (!empty($payInfo) && isset($payInfo['is_open_alipay']) && 0 === intval($payInfo['is_open_alipay'])) {
- $openAliPay = 0;
- }
- }
- $this->assign('openWeChat', $openWeChat);
- $this->assign('openAliPay', $openAliPay);
-
- // 是否安装 可视化微信小程序(商城版),未安装开启则不显示小程序支付
- $where = [
- 'status' => 1,
- 'code' => 'DiyminiproMall'
- ];
- $openMall = Db::name('weapp')->where($where)->count();
- $this->assign('openMall', $openMall);
-
- // 如果安装手机端后台管理插件并且在手机端访问时执行
- if (is_dir('./weapp/Mbackend/') && !empty($isMobile)) {
- $mbPage = input('param.p/d', 1);
- $nullShow = intval($pageObj->totalPages) === intval($mbPage) ? 1 : 0;
- $this->assign('nullShow', $nullShow);
- if ($mbPage >= 2) {
- return $this->display('shop/order_list');
- } else {
- return $this->display('shop/index');
- }
- } else {
- return $this->fetch();
- }
- }
-
- /**
- * 订单详情
- */
- public function order_details()
- {
- $order_id = input('param.order_id/d');
- if (!empty($order_id)) {
- // 查询订单信息
- $this->GetOrderData($order_id);
- // 查询订单操作记录
- $Action = $this->shop_order_log_db->where('order_id',$order_id)->order('action_id desc')->select();
- // 操作记录数据处理
- foreach ($Action as $key => $value) {
- $value['action_note'] = str_replace('!', '', $value['action_note']);
- $value['action_note'] = str_replace('!', '', $value['action_note']);
- // 会员操作
- if (!empty($value['users_id'])) {
- $Action[$key]['action_note'] = '[买家] ' . $value['action_note'];
- $user = $this->users_db->field('username, nickname')->where('users_id', $value['users_id'])->find();
- $Action[$key]['action_users'] = !empty($user['nickname']) ? $user['nickname'] : $user['username'];
- }
- // 管理员操作
- else if (!empty($value['action_user'])) {
- $Action[$key]['action_note'] = '[商家] ' . $value['action_note'];
- $user_name = Db::name('admin')->where('admin_id', $value['action_user'])->getField('user_name');
- $Action[$key]['action_users'] = !empty($user_name) ? $user_name : '';
- }
- // 系统操作
- else {
- $Action[$key]['action_note'] = '[系统] ' . $value['action_note'];
- $Action[$key]['action_users'] = '自动操作';
- }
-
- $Action[$key]['action_desc'] = str_replace("!", "", $value['action_desc']);
- // 操作时,订单发货状态
- $Action[$key]['express_status'] = 1 == $value['express_status'] ? '已发货' : '未发货';
- // 操作时,订单付款状态
- $Action[$key]['pay_status'] = 1 == $value['pay_status'] ? '已支付' : '未支付';
- }
-
- $this->assign('Action', $Action);
-
- // 如果安装手机端后台管理插件并且在手机端访问时执行
- $isMobile = input('param.isMobile/d', 0);
- if (is_dir('./weapp/Mbackend/') && !empty($isMobile)) {
- return $this->display('shop/order_details');
- } else {
- return $this->fetch('order_details');
- }
- }else{
- $this->error('非法访问!');
- }
- }
-
- // 订单备注
- public function order_remarks()
- {
- if (IS_AJAX_POST) {
- $post = input('post.');
- if (!empty($post['order_id']) && !empty($post['order_remarks'])) {
- $admin_id = session('admin_info.admin_id');
- $admin_info = Db::name('admin')->where(['admin_id'=>$admin_id])->find();
- // 执行条件
- $where = [
- 'order_id' => intval($post['order_id'])
- ];
- // 查询订单备注信息
- $adminNote = Db::name('shop_order')->where($where)->getField('admin_note');
- if (empty($adminNote)) {
- $adminNote = [
- 'times' => date('Y-m-d H:i:s'),
- 'admin_id' => $admin_info['admin_id'],
- 'admin_name' => $admin_info['user_name'],
- 'remarks' => strval($post['order_remarks'])
- ];
- $update = [
- 'admin_note' => serialize([$adminNote]),
- 'update_time' => getTime()
- ];
- } else {
- // 解析原先的备注信息
- $adminNote = unserialize($adminNote);
- // 新的备注信息
- $adminNoteNew = [
- 'times' => date('Y-m-d H:i:s'),
- 'admin_id' => $admin_info['admin_id'],
- 'admin_name' => $admin_info['user_name'],
- 'remarks' => strval($post['order_remarks'])
- ];
- // 合并两个备注信息
- $adminNote = array_merge($adminNote, [$adminNoteNew]);
- $update = [
- 'admin_note' => serialize($adminNote),
- 'update_time' => getTime()
- ];
- }
- if (!empty($update)) $updateID = Db::name('shop_order')->where($where)->update($update);
- if (!empty($updateID)) $this->success('备注成功');
- }
- $this->error('操作失败,刷新重试!');
- }
-
- $order_id = input('param.order_id/d', 0);
- $this->assign('order_id', $order_id);
- $where = [
- 'order_id' => intval($order_id)
- ];
- $remarksList = Db::name('shop_order')->where($where)->getField('admin_note');
- $remarksList = !empty($remarksList) ? unserialize($remarksList) : [];
- krsort($remarksList);
- $this->assign('remarksList', $remarksList);
-
- return $this->fetch();
- }
-
- /**
- * 订单发货
- */
- public function order_send()
- {
- $order_id = input('param.order_id');
- if ($order_id) {
- // 查询订单信息
- $this->GetOrderData($order_id);
-
- $where = [
- 'is_choose' => 1,
- ];
- $express = $this->shop_express_db->where($where)->order('sort_order asc, express_id asc')->select();
- $this->assign('express', $express);
-
- // 如果安装手机端后台管理插件并且在手机端访问时执行
- $isMobile = input('param.isMobile/d', 0);
- if (is_dir('./weapp/Mbackend/') && !empty($isMobile)) {
- return $this->display('shop/order_send');
- } else {
- return $this->fetch('order_send');
- }
- }
- }
-
- /**
- * 订单发货操作
- */
- public function order_send_operating()
- {
- if (IS_POST) {
- $post = input('post.');
- // 参数强制转类型
- $post['order_id'] = intval($post['order_id']);
- $post['users_id'] = intval($post['users_id']);
- $post['prom_type'] = intval($post['prom_type']);
- $post['express_id'] = intval($post['express_id']);
-
- // 需要物流时必须选择快递
- if (isset($post['prom_type']) && 0 === $post['prom_type']) {
- if (empty($post['express_id']) || empty($post['express_name']) || empty($post['express_code'])) {
- $this->error('请选择快递公司');
- }
- }
-
- // 条件数组
- $Where = [
- 'order_id' => $post['order_id'],
- 'users_id' => $post['users_id'],
- 'lang' => $this->admin_lang,
- ];
-
- // 更新数组
- $UpdateData = [
- 'order_status' => 2,
- 'express_order' => $post['express_order'],
- 'express_name' => $post['express_name'],
- 'express_code' => $post['express_code'],
- 'express_time' => getTime(),
- 'consignee' => $post['consignee'],
- 'update_time' => getTime(),
- 'virtual_delivery' => $post['virtual_delivery'],
- ];
-
- // 订单操作记录逻辑
- $LogWhere = [
- 'order_id' => $post['order_id'],
- 'express_status' => 1,
- ];
- $LogData = $this->shop_order_log_db->where($LogWhere)->count();
- if (!empty($LogData)) {
- // 数据存在则表示为修改发货内容
- $OrderData = $this->shop_order_db->where($Where)->field('prom_type')->find();
- $Desc = '修改发货内容!';
- if (1 == $post['prom_type']) {
- // 提交的数据为虚拟订单
- if ($OrderData['prom_type'] != $post['prom_type']) {
- // 此处判断后,提交的订单类型和数据库中的订单类型不相同,表示普通订单修改为虚拟订单
- $Note = '管理员将普通订单修改为虚拟订单!';
- if (!empty($post['virtual_delivery'])) {
- // 若存在数据则拼装
- $Note .= '给买家回复:'.$post['virtual_delivery'];
- }
- } else {
- // 继续保持为虚拟订单修改
- $Note = '虚拟订单,无需物流。';
- if (!empty($post['virtual_delivery'])) {
- // 若存在数据则拼装
- $Note .= '给买家回复:'.$post['virtual_delivery'];
- }
- }
- } else {
- // 提交的数据为普通订单
- if ($OrderData['prom_type'] != $post['prom_type']) {
- // 这一段暂时无用,因为发货时,暂时无法选择将虚拟订单修改为普通订单
- $Note = '管理员将虚拟订单修改为普通订单!';
- if (!empty($post['virtual_delivery'])) {
- // 若存在数据则拼装
- $Note .= '给买家回复:'.$post['virtual_delivery'];
- }
- } else {
- // 继续保持为普通订单修改
- $Note = '使用'.$post['express_name'].'发货成功!';
- }
- }
- $UpdateData['prom_type'] = $post['prom_type'];
- } else {
- // 数据不存在则表示为初次发货,拼装发货内容
- $Desc = '发货成功!';
- $Note = '使用'.$post['express_name'].'发货成功!';
- if ('1' == $post['prom_type']) {
- // 若为虚拟订单,无需发货物流。
- $UpdateData['prom_type'] = $post['prom_type'];
- $Note = '虚拟订单,无需物流。';
- if (!empty($post['virtual_delivery'])) {
- // 若存在数据则拼装
- $Note .= '给买家回复:'.$post['virtual_delivery'];
- }
- }
- }
-
- // 配送单号
- if (empty($post['prom_type']) && empty($post['express_order'])) $this->error('配送单号不能为空');
-
- // 更新订单主表信息
- $IsOrder = $this->shop_order_db->where($Where)->update($UpdateData);
- if (!empty($IsOrder)) {
- // 更新订单明细表信息
- $Data['update_time'] = getTime();
- $this->shop_order_details_db->where('order_id', $post['order_id'])->update($Data);
-
- // 添加订单操作记录
- AddOrderAction($post['order_id'], 0, session('admin_id'), 2, 1, 1, $Desc, $Note);
-
- // 查询会员信息
- $Field = 'username, nickname, email, mobile';
- $Users = $this->users_db->field($Field)->where('users_id', $post['users_id'])->find();
-
- // 邮箱发送
- $SmtpConfig = tpCache('smtp');
- $Result['email'] = GetEamilSendData($SmtpConfig, $Users, $post, 2);
-
- // 手机发送
- $SmsConfig = tpCache('sms');
- $Result['mobile'] = GetMobileSendData($SmsConfig, $Users, $post, 2);
-
- // 发送站内信给会员
- $NickName = !empty($Users['nickname']) ? $Users['nickname'] : $Users['username'];
- SendNotifyMessage($UpdateData, 6, 0, $post['users_id'], $NickName);
-
- $this->success('发货成功', null, $Result);
- } else {
- $this->error('发货失败');
- }
- }
- }
- // 订单更新收货地址
- public function order_address()
- {
- if (IS_AJAX_POST) {
- $post = input('post.');
- // 判断数据
- if (empty($post['consignee'])) $this->error('请填写收货人姓名!');
- if (empty($post['mobile'])) $this->error('请填写收货人手机!');
- if (empty($post['province'])) $this->error('请选择省份!');
- if (empty($post['city'])) $this->error('请选择城市!');
- if (empty($post['district'])) $this->error('请选择县区!');
- if (empty($post['address'])) $this->error('请填写详细地址!');
-
- // 更新地址
- $where = [
- 'order_id' => intval($post['order_id']),
- ];
- $update = [
- 'consignee' => strval($post['consignee']),
- 'mobile' => strval($post['mobile']),
- 'province' => intval($post['province']),
- 'city' => intval($post['city']),
- 'district' => intval($post['district']),
- 'address' => strval($post['address']),
- 'update_time' => getTime()
- ];
- $updateID = Db::name('shop_order')->where($where)->update($update);
- if (!empty($updateID)) {
- // 添加订单操作记录
- AddOrderAction($post['order_id'], 0, session('admin_id'), 1, 0, 1, '修改地址!', '修改买家订单收货信息!');
- $this->success('更新成功');
- } else {
- $this->error('操作失败,刷新重试!');
- }
- }
-
- $order_id = input('param.order_id/d', 0);
- $this->assign('order_id', $order_id);
- $address = Db::name('shop_order')->field('consignee, mobile, province, city, district, address')->where($where)->find($order_id);
- $this->assign('address', $address);
- $provinceList = get_province_list();
- $this->assign('provinceList', $provinceList);
- $cityList = Db::name('region')->where('parent_id', $address['province'])->select();
- $this->assign('cityList', $cityList);
- $areaList = Db::name('region')->where('parent_id', $address['city'])->select();
- $this->assign('areaList', $areaList);
-
- return $this->fetch();
- }
-
- // 联动地址获取
- public function ajaxGetSpecifyRegion()
- {
- $parent_id = input('param.parent_id/d');
- $region = Db::name('region')->where("parent_id", $parent_id)->select();
- $html = '';
- if (!empty($region)) {
- // 拼装下拉选项
- foreach ($region as $value) {
- $html .= "<option value='{$value['id']}'>{$value['name']}</option>";
- }
- }
- $this->success('查询成功!', null, $html);
- }
-
- /**
- * 查询快递名字及Code
- */
- public function order_express()
- {
- // 查询条件
- $where = [];
- $keywords = input('keywords/s');
- if (!empty($keywords)) $where['express_name'] = ['LIKE', "%{$keywords}%"];
-
- // 分页查询
- $count = $this->shop_express_db->where($where)->count('express_id');
- $pageObj = new Page($count, 10);
-
- // 查询数据
- $ExpressData = $this->shop_express_db->where($where)
- ->order('sort_order asc,express_id asc')
- ->limit($pageObj->firstRow.','.$pageObj->listRows)
- ->select();
-
- // 计算选中个数
- $where['is_choose'] = 1;
- $selectNum = $this->shop_express_db->where($where)->count();
- $this->assign('selectNum', $selectNum);
-
- // 加载模板
- $pageStr = $pageObj->show();
- $select = input('param.select/d', 0);
- $this->assign('select', $select);
- $this->assign('pageStr', $pageStr);
- $this->assign('pageObj', $pageObj);
- $this->assign('ExpressData', $ExpressData);
- return $this->fetch('order_express');
- }
-
- // 全部选中/全部取消
- public function express_is_choose()
- {
- if (IS_AJAX_POST) {
- $is_choose = input('post.is_choose/d', 0);
- if (isset($is_choose) && $is_choose >= 0) {
- $where = [
- 'is_choose' => !empty($is_choose) ? 0 : 1
- ];
- $update = [
- 'is_choose' => $is_choose,
- 'update_time' => getTime(),
- ];
- $ResultID = $this->shop_express_db->where($where)->update($update);
- if (!empty($ResultID)) $this->success('操作成功');
- }
- }
- $this->error('操作失败');
- }
-
- /**
- * 管理员后台标记订单状态
- */
- public function order_mark_status()
- {
- if (IS_POST) {
- $post = input('post.');
- // 条件数组
- $Where = [
- 'order_id' => $post['order_id'],
- 'users_id' => $post['users_id'],
- 'lang' => $this->admin_lang,
- ];
-
- if ('ddsc' == $post['status_name']) {
- // 订单删除
- $IsDelete = $this->shop_order_db->where($Where)->delete();
- if (!empty($IsDelete)) {
- $Where = [
- 'order_id' => $post['order_id'],
- ];
- // 同步删除订单下的操作记录
- $this->shop_order_log_db->where($Where)->delete();
- // 同步删除订单下的产品
- $this->shop_order_details_db->where($Where)->delete();
- $this->success('删除成功!', url('Shop/index'));
- }else{
- $this->error('数据错误!');
- }
- }else{
- $OrderData = $this->shop_order_db->where($Where)->find();
-
- // 更新数组
- $UpdateData = [
- 'update_time' => getTime(),
- ];
-
- // 根据不同操作标记不同操作内容
- if ('yfk' == $post['status_name']) {
- // 订单标记为付款,追加更新数组
- $UpdateData['order_status'] = '1';
- $UpdateData['pay_time'] = getTime();
- // 管理员付款
- $UpdateData['pay_name'] = 'admin_pay';
- $UpdateData['wechat_pay_type'] = '';
-
- /*用于添加订单操作记录*/
- $order_status = '1'; // 订单状态
- $express_status = '0'; // 发货状态
- $pay_status = '1'; // 支付状态
- $action_desc = '付款成功!'; // 操作明细
- $action_note = '管理员确认订单付款!'; // 操作备注
- /*结束*/
-
- }else if ('ysh' == $post['status_name']) {
- // 如果后台【商城中心】-【商城配置】-【订单设置】-收货后可维权时间设置为0,则表示订单不允许申请维权
- $OrderData['allow_service'] = !empty($this->UsersConfigData['order_right_protect_time']) ? 0 : 1;
-
- // 订单确认收货,追加更新数组
- $UpdateData['order_status'] = '3';
- $UpdateData['confirm_time'] = getTime();
-
- /*用于添加订单操作记录*/
- $order_status = '3'; // 订单状态
- $express_status = '1'; // 发货状态
- $pay_status = '1'; // 支付状态
- $action_desc = '确认收货!'; // 操作明细
- $action_note = '管理员确认订单已收货!'; // 操作备注
- /*结束*/
-
- }else if ('gbdd' == $post['status_name']) {
- // 订单关闭,追加更新数组
- $UpdateData['order_status'] = '-1';
-
- /*用于添加订单操作记录*/
- $order_status = '-1'; // 订单状态
- if ('0' == $OrderData['order_status'] || '1' == $OrderData['order_status']) {
- $express_status = '0'; // 发货状态
- $pay_status = '0'; // 支付状态
- }else{
- $express_status = '1'; // 发货状态
- $pay_status = '1'; // 支付状态
- }
- $action_desc = '订单关闭!'; // 操作明细
- $action_note = '管理员关闭订单!'; // 操作备注
- /*结束*/
- }
-
- // 更新订单主表
- $IsOrder = $this->shop_order_db->where($Where)->update($UpdateData);
- if (!empty($IsOrder)) {
- // 更新订单明细表
- $Data['update_time'] = getTime();
- $this->shop_order_details_db->where('order_id',$post['order_id'])->update($Data);
-
- // 如果是关闭订单操作则执行还原产品库存
- if ('gbdd' == $post['status_name']) {
- $UpWhere = $this->shop_order_details_db->where('order_id',$post['order_id'])->field('product_id as aid,num,data')->find();
- // 读取规格值ID,拼装作为更新条件
- $UpWhere['spec_value_id'] = unserialize($UpWhere['data'])['spec_value_id'];
- // 更新数据
- $UpData['spec_stock'] = Db::raw('spec_stock+'.($UpWhere['num']));
- $UpData['spec_sales_num'] = Db::raw('spec_sales_num-'.($UpWhere['num']));
- // 清除多余num数据
- unset($UpWhere['num']);
- // 清除多余data数据
- unset($UpWhere['data']);
- // 更新库存及销量
- Db::name('product_spec_value')->where($UpWhere)->update($UpData);
- }
-
- // 添加订单操作记录
- AddOrderAction($post['order_id'], 0, session('admin_id'), $order_status, $express_status, $pay_status, $action_desc, $action_note);
-
- // 判断是否为虚拟商品
- if ('yfk' == $post['status_name'] && $OrderData['prom_type'] == 1) {
- PayModel::afterVirtualProductPay($Where);
- }
-
- // 确认收货则执行
- if ('ysh' == $post['status_name']) {
- // 如果安装了分销插件则执行
- if (is_dir('./weapp/DealerPlugin/')) {
- // 开启分销插件则执行
- $weappInfo = model('Weapp')->getWeappList('DealerPlugin');
- if (!empty($weappInfo['status']) && 1 == $weappInfo['status']) {
- // 调用分销逻辑层方法
- $dealerCommonLogic = new \weapp\DealerPlugin\logic\DealerCommonLogic;
- $dealerCommonLogic->dealerOrderSettlementExecute($post['order_id'], $post['users_id']);
- }
- }
- // 如果安装了秒杀插件则执行
- if (is_dir('./weapp/Seckill/')) {
- $SeckillRow = model('Weapp')->getWeappList('Seckill');
- //is_seckill_order 只有安装了秒杀插件 shop_order表才会有这个字段
- if (!empty($SeckillRow) && 1 == intval($SeckillRow['status']) && !empty($order['is_seckill_order'])) {
- // 调用秒杀逻辑层方法
- $weappSeckillLogic = new \weapp\Seckill\logic\SeckillLogic;
- $weappSeckillLogic->confirmOrderHandle($post['order_id'], $post['users_id']);
- }
- }
- }
- $this->success('操作成功!');
- }
- }
- }else{
- $this->error('非法访问!');
- }
- }
-
- // 手动关闭订单并退款
- public function order_manual_refund()
- {
- if (IS_AJAX_POST) {
- $post = input('post.');
- $OrderID = intval($post['order_id']);
- $RefundNote = trim($post['refund_note']);
- if (!empty($OrderID)) {
- $update = [
- 'order_id' => $OrderID,
- 'order_status' => '-1',
- 'manual_refund' => 1,
- 'refund_note' => $RefundNote,
- 'update_time' => getTime(),
- ];
- $ResultID = $this->shop_order_db->update($update);
- if (!empty($ResultID)) {
- // 如果安装了秒杀插件则执行
- if (is_dir('./weapp/Seckill/')) {
- $SeckillRow = model('Weapp')->getWeappList('Seckill');
- //is_seckill_order 只有安装了秒杀插件 shop_order表才会有这个字段
- if (!empty($SeckillRow) && 1 == intval($SeckillRow['status']) && !empty($order['is_seckill_order'])) {
- // 调用秒杀逻辑层方法
- $users_id = $this->shop_order_db->where('order_id',$OrderID)->value('users_id');
- $weappSeckillLogic = new \weapp\Seckill\logic\SeckillLogic;
- $weappSeckillLogic->cancelOrderHandle($OrderID, $users_id);
- }
- }
-
- // 添加订单操作记录
- AddOrderAction($OrderID, 0, session('admin_id'), '-1', 0, 1, '关闭并退款', '管理员手动关闭订单并自行退款');
-
- // 商品库存恢复
- $where = [
- 'order_id' => $OrderID,
- ];
- $shopOrder = $this->shop_order_db->where($where)->select();
- model('OrderPreHandle')->restoreGoodsStock($shopOrder);
-
- // 加添订单售后信息
- $this->adminAddOrderService($OrderID, $RefundNote);
-
- // 返回结束
- $this->success('操作完成');
- }
- }
- }
- $this->error('非法访问!');
- }
-
- // 加添订单售后信息
- public function adminAddOrderService($orderID = 0, $refundNote = '')
- {
- $where = [
- 'order_id' => $orderID,
- ];
- // 查询订单信息
- $order = Db::name('shop_order')->where($where)->find();
- $city = get_city_name($order['city']);
- $district = get_area_name($order['district']);
- $province = get_province_name($order['province']);
- $order['address'] = $province . ' ' . $city . ' ' . $district . ' ' . $order['address'];
- // 查询订单商品信息
- $details = $this->shop_order_details_db->where($where)->select();
- if (!empty($details)) {
- $times = getTime();
- foreach ($details as $key => $value) {
- // 商品规格信息
- $value['data'] = !empty($value['data']) ? unserialize($value['data']) : [];
- $product_spec = !empty($value['data']['spec_value']) ? htmlspecialchars_decode(htmlspecialchars_decode($value['data']['spec_value'])) : '';
- // 订单售后信息
- $insert = [
- 'service_type' => 2,
- 'users_id' => intval($order['users_id']),
- 'merchant_id' => intval($order['merchant_id']),
- 'order_id' => intval($order['order_id']),
- 'order_code' => strval($order['order_code']),
- 'details_id' => intval($value['details_id']),
- 'product_id' => intval($value['product_id']),
- 'product_name' => strval($value['product_name']),
- 'product_spec' => strval($product_spec),
- 'product_num' => intval($value['num']),
- 'product_img' => strval($value['litpic']),
- 'content' => '商家主动退款',
- 'address' => strval($order['address']),
- 'consignee' => $order['consignee'],
- 'mobile' => $order['mobile'],
- 'manual_refund'=> 1,
- 'manual_time' => $times,
- 'refund_note' => !empty($refundNote) ? $refundNote : '商家主动退款',
- 'refund_price' => unifyPriceHandle($value['product_price']),
- 'refund_code' => 'TK' . $times . rand(10, 99),
- 'status' => 7,
- 'add_time' => $times,
- 'update_time' => $times,
- ];
- $resultID = Db::name('shop_order_service')->insertGetId($insert);
- if (!empty($resultID)) {
- // 更新订单明细表中对应商品为申请服务
- $update = [
- 'apply_service' => 1,
- 'update_time' => getTime()
- ];
- $this->shop_order_details_db->where('details_id', $value['details_id'])->update($update);
-
- // 添加订单服务记录
- OrderServiceLog($resultID, $order['order_id'], 0, session('admin_id'), '商家主动退款');
- }
- }
- }
- }
-
- /*
- * 更新管理员备注
- */
- public function update_note()
- {
- if (IS_AJAX_POST) {
- $post = input('post.');
- if (!empty($post['order_id'])) {
- $UpdateData = [
- 'admin_note' => $post['admin_note'],
- 'update_time' => getTime(),
- ];
- $return = $this->shop_order_db->where('order_id',$post['order_id'])->update($UpdateData);
- if (!empty($return)) {
- $this->success('保存成功!');
- }
- }else{
- $this->error('非法访问!');
- }
- }else{
- $this->error('非法访问!');
- }
- }
-
- /*
- * 运费模板列表
- */
- public function shipping_template()
- {
- $Where = [
- 'a.level' => 1,
- ];
-
- $region_name = input('param.region_name');
- if (!empty($region_name)) {
- $Where['a.name'] = array('LIKE', "%{$region_name}%");
- }
-
- // 省份
- $Template = Db::name('region')->field('a.id, a.name, b.template_money, b.template_id')
- ->alias('a')
- ->join('__SHOP_SHIPPING_TEMPLATE__ b', 'a.id = b.province_id', 'LEFT')
- ->where($Where)
- ->getAllWithIndex('id');
- $this->assign('Template', $Template);
- // 统一配送
- $info = $this->shipping_template_db->where('province_id','100000')->find();
- $this->assign('info', $info);
-
- return $this->fetch('shipping_template');
- }
-
- // 订单批量删除
- public function order_del()
- {
- $order_id = input('del_id/a');
- $order_id = eyIntval($order_id);
- if (IS_AJAX_POST && !empty($order_id)) {
- // 条件数组
- $Where = [
- 'order_id' => ['IN', $order_id],
- 'lang' => $this->admin_lang,
- ];
- // 查询数据,存在adminlog日志
- $result = $this->shop_order_db->field('order_code')->where($Where)->select();
- $order_code_list = get_arr_column($result, 'order_code');
- // 删除订单列表数据
- $return = $this->shop_order_db->where($Where)->delete();
- if ($return) {
- // 同步删除订单下的产品
- $this->shop_order_details_db->where($Where)->delete();
- // 同步删除订单下的操作记录
- $this->shop_order_log_db->where($Where)->delete();
-
- adminLog('删除订单:'.implode(',', $order_code_list));
- $this->success('删除成功');
- }else{
- $this->error('删除失败');
- }
- }
- $this->error('参数有误');
- }
-
- /*
- * 查询会员订单数据并加载,无返回
- */
- function GetOrderData($order_id)
- {
- // 手机端后台管理插件特定使用参数
- $isMobile = input('param.isMobile/d', 0);
-
- // 获取订单数据
- $OrderData = $this->shop_order_db->find($order_id);
- $OrderData['add_time'] = date('Y-m-d H:i:s', $OrderData['add_time']);
- $OrderData['pay_time'] = !empty($OrderData['pay_time']) ? date('Y-m-d H:i:s', $OrderData['pay_time']) : 0;
- $OrderData['update_time'] = !empty($OrderData['update_time']) ? date('Y-m-d H:i:s', $OrderData['update_time']) : 0;
- $OrderData['express_time'] = !empty($OrderData['express_time']) ? date('Y-m-d H:i:s', $OrderData['express_time']) : 0;
- $OrderData['confirm_time'] = !empty($OrderData['confirm_time']) ? date('Y-m-d H:i:s', $OrderData['confirm_time']) : 0;
- $OrderData['order_terminal_name'] = '电脑端';
- if (!empty($OrderData['order_terminal']) && 2 === intval($OrderData['order_terminal'])) {
- $OrderData['order_terminal_name'] = '手机端';
- } else if (!empty($OrderData['order_terminal']) && 3 === intval($OrderData['order_terminal'])) {
- $OrderData['order_terminal_name'] = '微信小程序';
- }
-
- // 获取会员数据
- $UsersData = $this->users_db->find($OrderData['users_id']);
- !empty($UsersData) && $UsersData['head_pic'] = get_head_pic($UsersData['head_pic']);
- // 当前单条订单信息的会员ID,存入session,用于添加订单操作表
- session('OrderUsersId', $OrderData['users_id']);
-
- // 获取订单详细表数据
- $DetailsData = $this->shop_order_details_db->where('order_id',$OrderData['order_id'])->select();
-
- // 获取订单状态,后台专用
- $admin_order_status_arr = Config::get('global.admin_order_status_arr');
-
- // 获取订单方式名称
- $pay_method_arr = Config::get('global.pay_method_arr');
-
- // 处理订单主表的地址数据处理,显示中文名字
- $OrderData['country'] = '中国';
- $OrderData['province'] = get_province_name($OrderData['province']);
- $OrderData['city'] = get_city_name($OrderData['city']);
- $OrderData['district'] = get_area_name($OrderData['district']);
-
- $array_new = get_archives_data($DetailsData,'product_id');
- $OrderData['prom_type_virtual'] = false;
- // 处理订单详细表数据处理
- $total_num = 0;
- $OrderData['totalAmount'] = 0;
- foreach ($DetailsData as $key => $value) {
- $total_num += intval($value['num']);
- if ($value['prom_type'] == 1) {
- $OrderData['prom_type_virtual'] = true;
- }
- // 产品属性处理
- $value['data'] = !empty($value['data']) ? unserialize($value['data']) : [];
- $DetailsData[$key]['pointsGoodsBuyField'] = !empty($value['data']['pointsGoodsBuyField']) ? json_decode($value['data']['pointsGoodsBuyField'], true) : [];
- $value['data'] = htmlspecialchars_decode(htmlspecialchars_decode($value['data']['spec_value']));
- // 组合数据
- $value['data'] = explode('<br/>', $value['data']);
- $valueData = '';
- foreach ($value['data'] as $key_1 => $value_1) {
- $delimiter = '';//!empty($isMobile) ? ';' : '';
- if (!empty($value_1)) $valueData .= '<span>' . trim(strrchr($value_1, ':'),':') . '</span>' . $delimiter;
- }
- $DetailsData[$key]['product_spec'] = $value['data'] = $valueData;
-
- // // 规制值
- // $spec_value = !empty($ValueData['spec_value']) ? htmlspecialchars_decode($ValueData['spec_value']) : '';
- // $spec_value = htmlspecialchars_decode($spec_value);
- // // 旧参数
- // $attr_value = !empty($ValueData['attr_value']) ? htmlspecialchars_decode($ValueData['attr_value']) : '';
- // $attr_value = htmlspecialchars_decode($attr_value);
- // // 新参数
- // $attr_value_new = !empty($ValueData['attr_value_new']) ? htmlspecialchars_decode($ValueData['attr_value_new']) : '';
- // $attr_value_new = htmlspecialchars_decode($attr_value_new);
- // // 优先显示新参数
- // $attr_value = !empty($attr_value_new) ? $attr_value_new : $attr_value;
- // $DetailsData[$key]['data'] = $spec_value . $attr_value;
-
- // 产品内页地址
- $DetailsData[$key]['arcurl'] = get_arcurl($array_new[$value['product_id']]);
- // 小计
- $DetailsData[$key]['subtotal'] = unifyPriceHandle($value['product_price'] * $value['num']);
- // 合计金额
- $OrderData['totalAmount'] += $DetailsData[$key]['subtotal'];
- $OrderData['totalAmount'] = unifyPriceHandle($OrderData['totalAmount']);
- // 支持子目录
- $DetailsData[$key]['litpic'] = handle_subdir_pic($DetailsData[$key]['litpic']);
- }
-
- // 订单类型
- if (empty($OrderData['prom_type'])) {
- $OrderData['prom_type_name'] = '普通订单';
- }else{
- $OrderData['prom_type_name'] = '虚拟订单';
- }
- if (!empty($OrderData['is_seckill_order'])) $OrderData['prom_type_name'] = '秒杀订单';
- if (!empty($OrderData['points_shop_order'])) $OrderData['prom_type_name'] = '积分订单';
-
- // 移动端查询物流链接
- $MobileExpressUrl = "//m.kuaidi100.com/index_all.html?type=".$OrderData['express_code']."&postid=".$OrderData['express_order'];
- $this->assign('MobileExpressUrl', $MobileExpressUrl);
- // PC端查询物流链接
- $pcExpressUrl = "https://www.kuaidi100.com/chaxun?com=".$OrderData['express_code']."&nu=".$OrderData['express_order'];
- $this->assign('pcExpressUrl', $pcExpressUrl);
- // 管理员备注
- $adminNoteCount = !empty($OrderData['admin_note']) ? count(unserialize($OrderData['admin_note'])) : 0;
- $this->assign('adminNoteCount', $adminNoteCount);
-
- // 存在积分商城订单则执行
- if (!empty($OrderData['points_shop_order'])) {
- $weappInfo = model('ShopPublicHandle')->getWeappPointsShop();
- if (!empty($weappInfo)) {
- $list = !empty($OrderData) ? $OrderData : [];
- $list['Details'] = !empty($DetailsData) ? $DetailsData : [];
- $pointsShopLogic = new \weapp\PointsShop\logic\PointsShopLogic();
- $pointsShopLogic->pointsShopOrderDataHandle([$list], $OrderData, $DetailsData);
- }
- }
-
- // 加载数据
- $this->assign('OrderData', $OrderData);
- $this->assign('DetailsData', $DetailsData);
- $this->assign('UsersData', $UsersData);
- $this->assign('admin_order_status_arr', $admin_order_status_arr);
- $this->assign('pay_method_arr', $pay_method_arr);
- $this->assign('total_num', $total_num);
-
- // 核销订单记录信息
- $weappVerifyLog = [];
- if (!empty($this->weappInfo)) {
- $where = [
- 'users_id' => intval($OrderData['users_id']),
- 'order_id' => intval($OrderData['order_id']),
- ];
- $weappVerifyLog = Db::name('weapp_verify')->where($where)->find();
- $weappVerifyLog['verify_time'] = !empty($weappVerifyLog['verify_time']) ? date('Y-m-d H:i:s', $weappVerifyLog['verify_time']) : 0;
- }
- $this->assign('weappVerifyLog', $weappVerifyLog);
- }
-
- // ------------------------------------------------------------------------------------------------------
- // 以下所有代码都是产品规格处理逻辑 2019-07-08 陈风任
- // ------------------------------------------------------------------------------------------------------
- // 规格列表管理,包含新增、更新
- public function spec_index()
- {
- if (IS_AJAX_POST) {
- // 新增、更新
- $post = input('post.');
- // 当前时间戳
- $time = getTime();
- /*新增数据处理*/
- $post_new = [];
- foreach ($post['preset_new'] as $key => $value) {
- // 规格名称不允许为空
- $preset_name = $post['preset_name_'.$value][0];
- if (empty($preset_name)) continue;
- // 是否同步到已发布的商品规格
- $spec_sync = !empty($post['spec_sync_'.$value]) ? 1 : 0;
- // 排序号
- $sort_order = $post['sort_order_'.$value];
-
- // 拼装三维数组
- foreach ($post['preset_value_'.$value] as $kk => $vv) {
- if (empty($vv)) continue;
- $post_new[$key][$kk]['preset_mark_id'] = $value; // 标记ID,一整条规格信息中的唯一标识
- $post_new[$key][$kk]['preset_name'] = $preset_name;
- $post_new[$key][$kk]['preset_value'] = $vv;
- $post_new[$key][$kk]['spec_sync'] = $spec_sync;
- $post_new[$key][$kk]['sort_order'] = $sort_order;
- $post_new[$key][$kk]['lang'] = $this->admin_lang;
- $post_new[$key][$kk]['add_time'] = $time;
- $post_new[$key][$kk]['update_time'] = $time;
- }
- }
-
- // 三维数组降为二维数组
- $data_new = $this->ProductSpecLogic->ArrayDowngrade($post_new);
- /* END */
-
- /*原有数据处理*/
- $post_old = [];
- $spec_sync_where = $spec_sync_mark_data = $spec_sync_value_data = [];
- foreach ($post['preset_old'] as $key => $value) {
- // 规格名称不允许为空
- $preset_name = $post['preset_name_old_'.$value][0];
- if (empty($preset_name)) continue;
-
- // 是否同步到已发布的商品规格
- $spec_sync = !empty($post['spec_sync_'.$value]) ? 1 : 0;
-
- // 排序号
- $sort_order = $post['sort_order_'.$value];
-
- // 需要同步的规格名称
- if (!empty($spec_sync)) {
- array_push($spec_sync_where, $value);
- $spec_sync_mark_data[$value]['spec_name'] = $preset_name;
- }
-
- // 拼装三维数组
- foreach ($post['preset_value_old_'.$value] as $kk => $vv) {
- if (empty($vv)) continue;
- $preset_id = $post['preset_id_old_'.$value][$kk];
- // 如果ID是否为空
- if (!empty($preset_id)) {
- // 有ID则为更新
- $post_old[$key][$kk]['preset_id'] = $preset_id;
-
- // 需要同步的规格值
- if (!empty($spec_sync)) $spec_sync_value_data[$preset_id]['spec_value'] = $vv;
- } else {
- // 无ID则为新增
- $post_old[$key][$kk]['lang'] = $this->admin_lang;
- $post_old[$key][$kk]['add_time'] = $time;
- $post_old[$key][$kk]['preset_mark_id'] = $value; // 标记ID,一整条规格信息中的唯一标识
- }
- $post_old[$key][$kk]['preset_name'] = $preset_name;
- $post_old[$key][$kk]['preset_value'] = $vv;
- $post_old[$key][$kk]['spec_sync'] = $spec_sync;
- $post_old[$key][$kk]['sort_order'] = $sort_order;
- $post_old[$key][$kk]['update_time'] = $time;
- }
- }
- // 三维数组降为二维数组
- $data_old = $this->ProductSpecLogic->ArrayDowngrade($post_old);
- /* END */
-
- // 合并数组并且更新数据
- $UpData = array_merge($data_old, $data_new);
- model('ProductSpecPreset')->saveAll($UpData);
-
- /*执行同步数据*/
- if (!empty($spec_sync_where)) {
- $w_1['spec_mark_id'] = ['IN', $spec_sync_where];
- $f_1 = 'spec_id, spec_mark_id, spec_name, spec_value_id, spec_value';
- $SpecMarkData = Db::name('product_spec_data')->where($w_1)->field($f_1)->order('spec_mark_id asc')->select();
- foreach ($SpecMarkData as $key => $value) {
- $SpecMarkData[$key]['spec_name'] = $spec_sync_mark_data[$value['spec_mark_id']]['spec_name'];
- $SpecMarkData[$key]['spec_value'] = $spec_sync_value_data[$value['spec_value_id']]['spec_value'];
- }
- model('ProductSpecData')->saveAll($SpecMarkData);
- }
- /* END */
-
- $this->success('更新成功!');
- }
-
- // 查询规格数据
- $PresetData = $this->product_spec_preset_db->where('lang',$this->admin_lang)->order('sort_order asc, preset_id asc')->select();
- // 数组转化
- $ResultData = $this->ProductSpecLogic->GetPresetData($PresetData);
- // 获取预设规格中最大的标记MarkId
- $PresetMarkId = model('ProductSpecPreset')->GetMaxPresetMarkId();
- // 加载参数
- $this->assign('info', $ResultData);
- $this->assign('PresetMarkId', $PresetMarkId);
- return $this->fetch('spec_index');
- }
-
-
- // 规格列表管理,包含新增、更新
- public function spec_template()
- {
- if (IS_AJAX_POST) {
- // 新增、更新
- $post = input('post.');
- // 当前时间戳
- $time = getTime();
- /*新增数据处理*/
- $post_new = [];
- foreach ($post['preset_new'] as $key => $value) {
- // 规格名称不允许为空
- $preset_name = $post['preset_name_'.$value][0];
- if (empty($preset_name)) continue;
- // 是否同步到已发布的商品规格
- $spec_sync = !empty($post['spec_sync_'.$value]) ? 1 : 0;
- // 排序号
- $sort_order = $post['sort_order_'.$value];
-
- // 拼装三维数组
- foreach ($post['preset_value_'.$value] as $kk => $vv) {
- if (empty($vv)) continue;
- $post_new[$key][$kk]['preset_mark_id'] = $value; // 标记ID,一整条规格信息中的唯一标识
- $post_new[$key][$kk]['preset_name'] = $preset_name;
- $post_new[$key][$kk]['preset_value'] = $vv;
- $post_new[$key][$kk]['spec_sync'] = $spec_sync;
- $post_new[$key][$kk]['sort_order'] = $sort_order;
- $post_new[$key][$kk]['lang'] = $this->admin_lang;
- $post_new[$key][$kk]['add_time'] = $time;
- $post_new[$key][$kk]['update_time'] = $time;
- }
- }
-
- // 三维数组降为二维数组
- $data_new = $this->ProductSpecLogic->ArrayDowngrade($post_new);
- /* END */
-
- /*原有数据处理*/
- $post_old = [];
- $spec_sync_where = $spec_sync_mark_data = $spec_sync_value_data = [];
- foreach ($post['preset_old'] as $key => $value) {
- // 规格名称不允许为空
- $preset_name = $post['preset_name_old_'.$value][0];
- if (empty($preset_name)) continue;
-
- // 是否同步到已发布的商品规格
- $spec_sync = !empty($post['spec_sync_'.$value]) ? 1 : 0;
-
- // 排序号
- $sort_order = $post['sort_order_'.$value];
-
- // 需要同步的规格名称
- if (!empty($spec_sync)) {
- array_push($spec_sync_where, $value);
- $spec_sync_mark_data[$value]['spec_name'] = $preset_name;
- }
-
- // 拼装三维数组
- foreach ($post['preset_value_old_'.$value] as $kk => $vv) {
- if (empty($vv)) continue;
- $preset_id = $post['preset_id_old_'.$value][$kk];
- // 如果ID是否为空
- if (!empty($preset_id)) {
- // 有ID则为更新
- $post_old[$key][$kk]['preset_id'] = $preset_id;
-
- // 需要同步的规格值
- if (!empty($spec_sync)) $spec_sync_value_data[$preset_id]['spec_value'] = $vv;
- } else {
- // 无ID则为新增
- $post_old[$key][$kk]['lang'] = $this->admin_lang;
- $post_old[$key][$kk]['add_time'] = $time;
- $post_old[$key][$kk]['preset_mark_id'] = $value; // 标记ID,一整条规格信息中的唯一标识
- }
- $post_old[$key][$kk]['preset_name'] = $preset_name;
- $post_old[$key][$kk]['preset_value'] = $vv;
- $post_old[$key][$kk]['spec_sync'] = $spec_sync;
- $post_old[$key][$kk]['sort_order'] = $sort_order;
- $post_old[$key][$kk]['update_time'] = $time;
- }
- }
- // 三维数组降为二维数组
- $data_old = $this->ProductSpecLogic->ArrayDowngrade($post_old);
- /* END */
-
- // 合并数组并且更新数据
- $UpData = array_merge($data_old, $data_new);
- model('ProductSpecPreset')->saveAll($UpData);
-
- /*执行同步数据*/
- if (!empty($spec_sync_where)) {
- $w_1['spec_mark_id'] = ['IN', $spec_sync_where];
- $f_1 = 'spec_id, spec_mark_id, spec_name, spec_value_id, spec_value';
- $SpecMarkData = Db::name('product_spec_data')->where($w_1)->field($f_1)->order('spec_mark_id asc')->select();
- foreach ($SpecMarkData as $key => $value) {
- $SpecMarkData[$key]['spec_name'] = $spec_sync_mark_data[$value['spec_mark_id']]['spec_name'];
- $SpecMarkData[$key]['spec_value'] = $spec_sync_value_data[$value['spec_value_id']]['spec_value'];
- }
- model('ProductSpecData')->saveAll($SpecMarkData);
- }
- /* END */
-
- $this->success('更新成功!');
- }
-
- // 查询规格数据
- $PresetData = $this->product_spec_preset_db->where('lang',$this->admin_lang)->order('sort_order asc, preset_id asc')->select();
- // 数组转化
- $ResultData = $this->ProductSpecLogic->GetPresetData($PresetData);
- // 获取预设规格中最大的标记MarkId
- $PresetMarkId = model('ProductSpecPreset')->GetMaxPresetMarkId();
- // 加载参数
- $this->assign('info', $ResultData);
- $this->assign('PresetMarkId', $PresetMarkId);
- return $this->fetch('spec_template');
- }
-
- // 删除规格名称\规格值
- public function spec_delete()
- {
- if (IS_AJAX_POST) {
- $post = input('post.');
- $where = $this->ProductSpecLogic->GetDeleteSpecWhere($post);
- if (!empty($where)) {
- $result = $this->product_spec_preset_db->where($where)->delete();
- if (!empty($result)) {
- $this->success('删除成功!');
- }
- }
- $this->error('删除失败!');
- }
- }
-
- // 选中规格名称,追加html到页面展示
- public function spec_select()
- {
- if (IS_AJAX_POST) {
- $post = input('post.');
-
- // 当选中的规格大类大于等于三个则不允许再添加
- if (3 == count(session('spec_arr'))) $this->error('最多只能添加三种规格大类');
-
- // 获取预设规格标记ID数组
- $PresetMarkIdArray = $this->ProductSpecLogic->GetPresetMarkIdArray($post);
-
- // 拼装预设名称下拉选项
- if (!empty($PresetMarkIdArray)) {
- // 添加选中的规格数据
- model('ProductSpecData')->PresetSpecAddData($post);
- // 拼装更新预设名称下拉选项
- $Result = $this->ProductSpecLogic->GetPresetNameOption($PresetMarkIdArray, $post);
- } else {
- $this->error('最多只能添加三种规格大类!');
- }
-
- if (isset($post['aid']) && !empty($post['aid'])) {
- $ResultData = $this->ProductSpecLogic->GetPresetValueOption('', $post['spec_mark_id'], $post['aid'], 2);
- $PresetName = $ResultData['PresetName'];
- $PresetValueOption = $ResultData['PresetValueOption'];
- } else {
- // 拼装预设值下拉选项
- $PresetValue = $this->product_spec_preset_db->where('preset_mark_id','IN',$post['preset_mark_id'])->field('preset_id,preset_name,preset_value')->select();
- $PresetName = $PresetValue[0]['preset_name'];
- $PresetValueOption = $this->ProductSpecLogic->GetPresetValueOption($PresetValue);
- }
-
- if (isset($post['aid']) && !empty($post['aid'])) {
- // 结果返回
- $ReturnHtml = [
- 'preset_name' => $PresetName,
- 'preset_name_option' => $Result['Option'],
- 'spec_mark_id_arr' => $Result['MarkId'],
- 'preset_value_option' => $PresetValueOption,
- ];
- } else {
- // 结果返回
- $ReturnHtml = [
- 'preset_name' => $PresetName,
- 'preset_name_option' => $Result['Option'],
- 'preset_mark_id_arr' => $Result['MarkId'],
- 'preset_value_option' => $PresetValueOption,
- ];
- }
- $this->success('加载成功!', null, $ReturnHtml);
- }
- }
-
- // 当规格库更新后,调用此方式及时更新选择预设规格的下拉框信息及规格框信息
- public function update_spec_info()
- {
- if (IS_AJAX_POST) {
- $post = input('post.');
-
- // 拼装更新预设名称下拉选项
- $ResultData = $this->ProductSpecLogic->GetPresetNameOption($post['preset_mark_id_arr']);
-
- // 获取规格拼装后的html表格
- $ResultArray = $this->ProductSpecLogic->GetPresetSpecAssembly($post);
-
- // 结果返回
- if (isset($post['aid']) && !empty($post['aid'])) {
- $ReturnHtml = [
- 'HtmlTable' => $ResultArray['HtmlTable'],
- 'spec_name_option' => $ResultData['Option'],
- 'spec_mark_id_arr' => $ResultArray['PresetMarkIdArray'],
- ];
- }else{
- // 拼装更新预设名称下拉选项
- $where = [
- 'preset_mark_id' => ['IN', $post['preset_mark_id_arr']],
- ];
- $PresetData = $this->product_spec_preset_db->where($where)->order('preset_id asc')->select();
- $sessionData = session('spec_arr');
- foreach ($PresetData as $key => $value) {
- if (!empty($sessionData[$value['preset_mark_id']])) {
- if (in_array($value['preset_id'], $sessionData[$value['preset_mark_id']])) {
- unset($PresetData[$key]);
- }
- }
- }
-
- $PresetData = group_same_key($PresetData, 'preset_mark_id');
- $result = [];
- foreach ($PresetData as $key => $value) {
- $result[$key] .= "<option value='0'>选择规格值</option>";
- if(!empty($value)){
- foreach($value as $sub_value){
- $result[$key] .= "<option value='{$sub_value['preset_id']}'>{$sub_value['preset_value']}</option>";
- }
- }
- }
-
- $ReturnHtml = [
- 'HtmlTable' => $ResultArray['HtmlTable'],
- 'preset_name_option' => $ResultData['Option'],
- 'preset_mark_id_arr' => $ResultArray['PresetMarkIdArray'],
- 'preset_value_id' => explode(',', $post['preset_mark_id_arr']),
- 'preset_value_option' => $result,
- ];
- }
- $this->success('更新成功!', null, $ReturnHtml);
- }
- }
-
- // 获取或更新规格组合的数据
- // preset_id:预设值ID
- // preset_mark_id:预设参数标记ID,同一预设规格名称下的所有规格值统一使用,可理解为规格名称唯一ID。
- public function assemble_spec_data()
- {
- if (IS_AJAX_POST) {
- $post = input('post.');
-
- // 刷新或重新进入产品添加页则清除关于产品session
- if (isset($post['initialization']) && !empty($post['initialization'])) {
- session('spec_arr', null);
- $this->success('初始化完成');
- }
-
- // 若清除一整条规格信息则清除session中相应的数据并且重置规格名称下拉框选项
- $ResultArray = $this->ProductSpecLogic->GetResetPresetNameOption($post);
-
- // 删除单个规格值则清除session对应的值
- $ValueArray = $this->ProductSpecLogic->ClearSpecValueID($post);
-
- // 把session中的数据和提交的数据组合
- $SpecArray = $this->ProductSpecLogic->GetSessionPostArrayMerge($post);
- if (isset($SpecArray['error']) && !empty($SpecArray['error'])) $this->error($SpecArray['error']);
-
- // 获取规格拼装后的html表格
- if (isset($post['aid']) && !empty($post['aid'])) {
- // 编辑
- $HtmlTable = $this->ProductSpecLogic->SpecAssemblyEdit($SpecArray, $post['aid']);
- } else {
- // 新增
- $HtmlTable = $this->ProductSpecLogic->SpecAssembly($SpecArray);
- }
-
- if (!empty($ValueArray['Option'])) {
- // 删除规格值后的规格值下拉框
- $PresetValueOption = $ValueArray['Option'];
- $ResultValue['Value'] = null;
- } else {
- $ResultValue = model('ProductSpecPreset')->GetPresetNewData(session('spec_arr'), $post);
- // 获取新增规格值后的下拉框
- if (empty($post['aid'])) {
- $PresetValueOption = $this->ProductSpecLogic->GetPresetValueOption($ResultValue['Option']);
- } else {
- $PresetValueOption = $ResultValue['Option'];
- }
- }
-
- // 返回数据
- $ReturnData = [
- 'HtmlTable' => $HtmlTable,
- 'PresetNameOption' => $ResultArray['Option'],
- 'PresetMarkIdArray' => $ResultArray['MarkId'],
- 'SelectPresetValue' => $ResultValue['Value'],
- 'PresetValueOption' => $PresetValueOption,
- ];
- $this->success('加载成功!', null, $ReturnData);
- }
- }
-
- // 同步规格值到产品规格中,刷新规格值下拉框
- public function refresh_spec_value()
- {
- if (IS_AJAX_POST) {
- $post = input('post.');
- // 是否提交完整数据
- if (empty($post['spec_mark_id']) || empty($post['aid'])) $this->error('数据有误,同步失败,请刷新重试!');
-
- /*查询产品已选规格数据*/
- $where = [
- 'aid' => $post['aid'],
- 'spec_mark_id' => $post['spec_mark_id'],
- ];
- $SpecData = Db::name('product_spec_data')->where($where)->order('spec_value_id asc')->select();
- // 以规格值ID为键名
- $SpecData = group_same_key($SpecData, 'spec_value_id');
- /* END */
-
- /*查询规格库数据*/
- $where = [
- 'preset_mark_id' => $post['spec_mark_id'],
- ];
- $PresetData = $this->product_spec_preset_db->where($where)->order('preset_id asc')->select();
- /* END */
-
- // 初始化数组
- $AddData = $UpData = $SpecIds = $UpSpecWhere = $UpSpecName = [];
- // 数据处理
- foreach ($PresetData as $pd_k => $pd_v) {
- if (!empty($SpecData[$pd_v['preset_id']]) && $pd_v['preset_name'] != $SpecData[$pd_v['preset_id']][0]['spec_name']) {
- // 更新规格名称数组
- if (empty($UpSpecWhere) && empty($UpSpecName)) {
- $UpSpecWhere = [
- 'aid' => $post['aid'],
- 'spec_mark_id' => $pd_v['preset_mark_id'],
- ];
- $UpSpecName = [
- 'spec_name' => $pd_v['preset_name'],
- ];
- }
- }
-
- if (empty($SpecData[$pd_v['preset_id']])) {
- // 添加规格值数据
- $AddData[] = [
- 'aid' => $post['aid'],
- 'spec_mark_id' => $pd_v['preset_mark_id'],
- 'spec_name' => $pd_v['preset_name'],
- 'spec_value_id' => $pd_v['preset_id'],
- 'spec_value' => $pd_v['preset_value'],
- 'spec_is_select' => 0,
- 'lang' => $this->admin_lang,
- 'add_time' => getTime(),
- 'update_time' => getTime(),
- ];
- } else if (!empty($SpecData[$pd_v['preset_id']]) && $pd_v['preset_value'] != $SpecData[$pd_v['preset_id']][0]['spec_value']) {
- // 更新规格值数据
- $UpData[] = [
- 'spec_id' => $SpecData[$pd_v['preset_id']][0]['spec_id'],
- 'spec_mark_id' => $pd_v['preset_mark_id'],
- 'spec_name' => $pd_v['preset_name'],
- 'spec_value_id' => $pd_v['preset_id'],
- 'spec_value' => $pd_v['preset_value'],
- 'update_time' => getTime(),
- ];
- // 删除产品已选规格表中对应需要更新的规格值数据
- unset($SpecData[$pd_v['preset_id']]);
- } else {
- // 删除规格库中不存在的规格值数据
- unset($SpecData[$pd_v['preset_id']]);
- }
- }
-
- // 合并添加、编辑数据,统一处理
- $SaveData = array_merge($AddData, $UpData);
-
- /*处理需要删除的规格值数据*/
- if (!empty($SpecData)) {
- $DelIsSelect = 0;
- foreach ($SpecData as $key => $value) {
- $SpecIds[] = $value[0]['spec_id'];
- if (1 == $value[0]['spec_is_select']) {
- $DelIsSelect = 1;
- }
- $spec_mark_id = $value[0]['spec_mark_id'];
- }
- }
- /* END */
-
- $HtmlTable = $SpecMarks = '';
- if (!empty($SpecIds)) {
- // 删除废弃的规格值数据
- Db::name('product_spec_data')->where('spec_id', 'IN', $SpecIds)->delete();
- if (1 == $DelIsSelect) {
- session('spec_arr', null);
- $SpecWhere = [
- 'aid' => $post['aid'],
- 'lang' => $this->admin_lang,
- 'spec_is_select' => 1,// 已选中的
- ];
- $order = 'spec_value_id asc, spec_id asc';
- $product_spec_data = Db::name('product_spec_data')->where($SpecWhere)->order($order)->select();
- if (!empty($product_spec_data)) {
- $spec_arr_new = group_same_key($product_spec_data, 'spec_mark_id');
- $DelAllSpec = $spec_mark_id;
- foreach ($spec_arr_new as $key => $value) {
- $spec_mark_id_arr[] = $key;
- for ($i=0; $i<count($value); $i++) {
- $spec_arr_new[$key][$i] = $value[$i]['spec_value_id'];
- }
- if ($spec_mark_id == $key) {
- $DelAllSpec = 0;
- }
- }
-
- session('spec_arr', $spec_arr_new);
- $HtmlTable = $this->ProductSpecLogic->SpecAssemblyEdit($spec_arr_new, $post['aid']);
- $SpecMarks = implode(',', $spec_mark_id_arr);
- }
- }
- }
-
- if (!empty($SaveData)) {
- // 批量保存更新新规格
- model('ProductSpecData')->saveAll($SaveData);
- }
-
- if (!empty($UpSpecWhere) && !empty($UpSpecName)) {
- // 更新当前产品下对应的规格名称
- Db::name('product_spec_data')->where($UpSpecWhere)->update($UpSpecName);
- if (empty($UpData)) {
- $UpData[0] = [
- 'spec_name' => $UpSpecName['spec_name'],
- 'spec_mark_id' => $UpSpecWhere['spec_mark_id']
- ];
- }
- }
-
- $ValueOption = $this->ProductSpecLogic->GetPresetValueOption('', $post['spec_mark_id'], $post['aid']);
- $ResultData = [
- 'UpData' => $UpData,
- 'SpecIds' => $SpecIds,
- 'HtmlTable' => $HtmlTable,
- 'SpecMarks' => $SpecMarks,
- 'DelAllSpec' => $DelAllSpec,
- 'ValueOption' => $ValueOption,
- ];
- $this->success('同步成功,规格值已刷新!', null, $ResultData);
- }
- }
-
- // 新增产品时更新同步规格数据
- public function refresh_preset_value()
- {
- if (IS_AJAX_POST) {
- $post = input('post.');
- if (!empty($post)) {
- $HtmlTable = $DelAllPreset = $PresetData = $MarkData = '';
- if ((isset($post['mark_mark_ids']) && !empty($post['mark_mark_ids'])) || (isset($post['mark_preset_ids']) && !empty($post['mark_preset_ids']))) {
- if (!empty($post['mark_mark_ids'])) {
- $MarkData = $this->product_spec_preset_db->where('preset_mark_id', 'IN', $post['mark_mark_ids'])->field('preset_mark_id, preset_name')->select();
- }
- if (!empty($post['mark_preset_ids'])) {
- $PresetData = $this->product_spec_preset_db->where('preset_id', 'IN', $post['mark_preset_ids'])->field('preset_id, preset_value')->select();
- }
- } else {
- $DelAllPreset = 0;
- $spec_arr_ses = session('spec_arr');
- foreach ($spec_arr_ses[$post['preset_mark_id']] as $key => $value) {
- if ($value == $post['preset_id']) {
- unset($spec_arr_ses[$post['preset_mark_id']][$key]);
- }
- }
- if (empty($spec_arr_ses[$post['preset_mark_id']])) {
- unset($spec_arr_ses[$post['preset_mark_id']]);
- $count = $this->product_spec_preset_db->where('preset_mark_id', $post['preset_mark_id'])->count();
- if (empty($count)) {
- $DelAllPreset = 1;
- }
- }
- session('spec_arr',$spec_arr_ses);
- $HtmlTable = $this->ProductSpecLogic->SpecAssembly($spec_arr_ses);
- }
-
- $ResultData = [
- 'MarkData' => $MarkData,
- 'HtmlTable' => $HtmlTable,
- 'PresetData' => $PresetData,
- 'DelAllPreset' => $DelAllPreset,
- ];
- $this->success('同步成功!', null, $ResultData);
- }
- }
- }
-
- // 检查是否最新的购物车标签
- public function VerifyLatestTemplate()
- {
- // 验证最新模板
- $ResultData = VerifyLatestTemplate();
- if (empty($ResultData)) {
- // 更新开启多规格
- getUsersConfigData('shop', ['shop_open_spec' => 1]);
- // 返回提示
- $this->success('模板检测通过,规格已开启!');
- }else{
- if (5 == count($ResultData)) {
- $msg = '未检测到规格标签,请根据提示手工调用后再重新验证!';
- }else{
- $msg = '规格标签缺少变量:<br/><span style="color: red;">'.implode(', ', $ResultData).'</span><br/>请检查模板核实后再次验证!';
- }
- // 更新关闭多规格
- getUsersConfigData('shop', ['shop_open_spec' => 0]);
- // 返回提示
- $this->error($msg);
- }
- }
-
- // 暂时已废弃,暂时不清理删除代码
- public function FindSmptConfig() {
- $Smtp = tpCache('smtp');
- if (empty($Smtp['smtp_server']) || empty($Smtp['smtp_port']) || empty($Smtp['smtp_user']) || empty($Smtp['smtp_pwd']) || empty($Smtp['smtp_from_eamil'])) {
- $this->error('邮箱配置尚未配置完成,前往配置?', url('System/api_conf'));
- } else {
- // tpCache('smtp', [input('post.field') => 1]);
- $this->success('配置完成');
- }
- }
-
- // 未付款订单改价
- public function order_change_price()
- {
- if (IS_AJAX_POST) {
- $post = input('post.');
- if (empty($post['order_id']) || empty($post['order_amount'])) $this->error('操作错误,刷新重试');
- // 更新条件
- $where = [
- 'order_id' => $post['order_id'],
- 'order_status' => 0
- ];
- // 更新数据
- $Code = date('Ymd') . getTime() . rand(10, 100);
- $update = [
- 'order_code' => $Code,
- 'update_time' => getTime(),
- 'order_amount' => $post['order_amount']
- ];
- // 更新操作
- $ResultID = $this->shop_order_db->where($where)->update($update);
- // 更新后续操作
- if (!empty($ResultID)) {
- // 添加订单的操作记录
- $action_note = '应付金额改为:' . $post['order_amount'] . ',原价:' . $post['order_amount_old'];
- AddOrderAction($post['order_id'], 0, session('admin_id'), 0, 0, 0, '商家改价!', $action_note);
- $this->success('改价完成');
- } else {
- $this->error('改价失败,刷新重试');
- }
- }
- }
-
- /**
- * 营销功能
- * @return [type] [description]
- */
- public function market_index()
- {
- return $this->fetch();
- }
-
- //会员编辑 订单数列表
- public function users_edit_order_index()
- {
- // 初始化数组和条件
- $where = [
- 'a.lang' => $this->admin_lang,
- ];
-
- // 会员编辑专用 - 筛选
- $users_id = input('users_id/d');
- if (!empty($users_id)) {
- $where['a.users_id'] = $users_id;
- $where['a.order_status'] = 3;
- }
- // 订单号查询
- $order_code = input('order_code/s');
- if (!empty($order_code)) $where['a.order_code'] = ['LIKE', "%{$order_code}%"];
-
- // 分页查询
- $count = $this->shop_order_db->alias('a')->where($where)->count('order_id');
- $pageObj = new Page($count, config('paginate.list_rows'));
-
- // 订单主表数据查询
- $list = $this->shop_order_db->alias('a')
- ->field('a.*, b.username as u_username, b.nickname as u_nickname, b.mobile as u_mobile')
- ->where($where)
- ->join('__USERS__ b', 'a.users_id = b.users_id', 'LEFT')
- ->order('a.order_id desc')
- ->limit($pageObj->firstRow.','.$pageObj->listRows)
- ->select();
- if (empty($list) && !empty($order_code)) {
- // 通过商品名称查询订单号
- $where_1['product_name'] = ['LIKE', "%{$order_code}%"];
- $order_ids = $this->shop_order_details_db->where($where_1)->group('order_id')->column('order_id');
- // 重新查询订单主表
- unset($where['a.order_code']);
- $where['a.order_id'] = ['IN', $order_ids];
- // 分页查询
- $count = $this->shop_order_db->alias('a')->where($where)->count('order_id');
- $pageObj = new Page($count, config('paginate.list_rows'));
- // 订单主表数据查询
- $list = $this->shop_order_db->alias('a')
- ->field('a.*, b.username as u_username, b.nickname as u_nickname, b.mobile as u_mobile')
- ->where($where)
- ->join('__USERS__ b', 'a.users_id = b.users_id', 'LEFT')
- ->order('a.order_id desc')
- ->limit($pageObj->firstRow.','.$pageObj->listRows)
- ->select();
- }
-
- $order_ids = [];
- $OrderReminderID = [];
- foreach ($list as $key => $value) {
- array_push($order_ids, $value['order_id']);
- if (1 == $value['order_status']) array_push($OrderReminderID, $value['order_id']);
- }
-
- // 处理订单详情数据
- $where = [
- 'a.order_id' => ['IN', $order_ids]
- ];
- $DetailsData = $this->shop_order_details_db->alias('a')
- ->field('a.*, b.service_id, b.status')
- ->where($where)
- ->join('__SHOP_ORDER_SERVICE__ b', 'a.details_id = b.details_id', 'LEFT')
- ->order('details_id asc')
- ->select();
- $ArchivesData = get_archives_data($DetailsData, 'product_id');
- $OrderServiceStatus = Config::get('global.order_service_status');
- foreach ($DetailsData as $key => $value) {
- // 售后信息处理
- $value['service_id'] = !empty($value['service_id']) ? $value['service_id'] : 0;
- $value['status'] = !empty($value['status']) ? $value['status'] : 0;
- $value['status_name'] = !empty($value['status']) ? $OrderServiceStatus[$value['status']] : '';
- // 产品属性处理
- $value['data'] = unserialize($value['data']);
- $value['data'] = htmlspecialchars_decode(htmlspecialchars_decode($value['data']['spec_value']));
- // 组合数据
- $value['data'] = explode('<br/>', $value['data']);
- $valueData = '';
- foreach ($value['data'] as $key_1 => $value_1) {
- if (!empty($value_1)) $valueData .= '<span>' . trim(strrchr($value_1, ':'),':') . '</span>';
- }
- $value['data'] = $valueData;
- $value['arcurl'] = get_arcurl($ArchivesData[$value['product_id']]);
- $value['litpic'] = handle_subdir_pic(get_default_pic($value['litpic']));
- $DetailsData[$key] = $value;
- }
-
- // 把订单详情数据植入订单数据
- $DetailsDataGroup = group_same_key($DetailsData, 'order_id');
- foreach ($list as $key => $value) {
- // 处理会员昵称
- $value['u_nickname'] = !empty($value['u_nickname']) ? $value['u_nickname'] : $value['u_username'];
- // 处理订单详情数据
- $value['Details'] = $DetailsDataGroup[$value['order_id']];
- // 商品条数
- $value['rowspan'] = count($value['Details']);
- // 添加时间
- $value['add_time'] = date('Y-m-d H:i:s', $value['add_time']);
- // 更新时间
- $value['update_time'] = date('Y-m-d H:i:s', $value['update_time']);
- // 重新赋值数据
- $list[$key] = $value;
- }
-
- // 分页显示输出
- $pageStr = $pageObj->show();
-
- // 数据加载
- $this->assign('list', $list);
- $this->assign('page', $pageStr);
- $this->assign('pager', $pageObj);
-
- return $this->fetch('member/edit/order_index');
- }
- //前台改变产品类型,被取消的类型的商品将会统一下架处理,这里返回受影响的商品数量
- public function get_shop_type_arc()
- {
- $cancel_type = input('param.cancel_type/s');
- $cancel_type = explode(',',$cancel_type);
- $where_prom_type = [];
- if (in_array(0,$cancel_type)) $where_prom_type[] = 0;
- if (in_array(1,$cancel_type)) {
- $where_prom_type[] = 1;
- $where_prom_type[] = 2;
- $where_prom_type[] = 3;
- }
- if (in_array(2,$cancel_type)) $where_prom_type[] = 4;
- $where['channel'] = 2;
- $where['is_del'] = 0;
- $where['arcrank'] = ['>',-1];
- $where['prom_type'] = ['in',$where_prom_type];
- $count = Db::name('archives')->where($where)->count();
- $this->success('success','',$count);
- }
-
- // 订单确认核销
- public function verify()
- {
- if (IS_AJAX_POST && !empty($this->weappInfo)) {
- // 开启核销插件则执行
- if (!empty($this->weappInfo['status']) && 1 === intval($this->weappInfo['status'])) {
- // 调用核销逻辑层方法
- $post = input('post.');
- $verifyLogic = new \weapp\Verify\logic\VerifyLogic;
- $verifyLogic->verifyOrderConfirmHandle($post, $this->weappInfo);
- }
- $this->error('请先开启核销插件');
- }
- $this->error('请先安装核销插件');
- }
-
- public function shopOrderPreHandle()
- {
- if (IS_AJAX_POST) {
- model('OrderPreHandle')->eyou_shopOrderPreHandle(0, getUsersConfigData('all'), 'admin');
- $this->success('订单处理完成');
- }
- }
- }
|