* Date: 2019-3-20 */ namespace app\user\controller; use think\Db; use think\Config; use think\Page; use think\Cookie; use app\common\logic\ShopCommonLogic; class Shop extends Base { // 初始化 public function _initialize() { parent::_initialize(); $this->users_db = Db::name('users'); // 会员数据表 $this->users_money_db = Db::name('users_money'); // 会员金额明细表 $this->shop_cart_db = Db::name('shop_cart'); // 购物车表 $this->shop_order_db = Db::name('shop_order'); // 订单主表 $this->shop_order_details_db = Db::name('shop_order_details'); // 订单明细表 $this->shop_order_service_db = Db::name('shop_order_service'); // 订单售后服务表 $this->shop_address_db = Db::name('shop_address'); // 收货地址表 $this->archives_db = Db::name('archives'); // 产品表 $this->product_attr_db = Db::name('product_attr'); // 产品属性表 $this->product_attribute_db = Db::name('product_attribute'); // 产品属性标题表 $this->region_db = Db::name('region'); // 三级联动地址总表 $this->shipping_template_db = Db::name('shop_shipping_template'); // 运费模板表 $this->shop_model = model('Shop'); // 商城模型 $this->shop_common = new ShopCommonLogic(); // common商城业务层,前后台共用 // 订单中心是否开启 $redirect_url = ''; $shop_open = getUsersConfigData('shop.shop_open'); $web_users_switch = tpCache('web.web_users_switch'); if (empty($shop_open)) { // 订单功能关闭,立马跳到会员中心 $redirect_url = url('user/Users/index'); $msg = '商城中心尚未开启!'; } else if (empty($web_users_switch)) { // 前台会员中心已关闭,跳到首页 $redirect_url = ROOT_DIR.'/'; $msg = '会员中心尚未开启!'; } if (!empty($redirect_url)) { Db::name('users_menu')->where([ 'mca' => 'user/Shop/shop_centre', 'lang' => $this->home_lang, ])->update([ 'status' => 0, 'update_time' => getTime(), ]); $this->error($msg, $redirect_url); exit; } // --end } // 购物车列表 public function shop_cart_list() { // 数据由标签调取生成 return $this->fetch('users/shop_cart_list'); } // 订单管理列表,订单中心 public function shop_centre() { $result = []; // 应用搜索条件 $keywords = input('param.keywords/s'); // 订单状态搜索 $select_status = input('param.select_status'); // 查询订单是否为空 $result['data'] = $this->shop_model->GetOrderIsEmpty($this->users_id,$keywords,$select_status); // 是否移动端,1表示手机端,0表示PC端 $result['IsMobile'] = isMobile() ? 1 : 0; // 菜单名称 $result['title'] = Db::name('users_menu')->where([ 'mca' => 'user/Shop/shop_centre', 'lang' => $this->home_lang, ])->getField('title'); // 加载数据 $eyou = [ 'field' => $result, ]; $this->assign('eyou',$eyou); return $this->fetch('users/shop_centre'); } // 订单数据详情 public function shop_order_details() { if (IS_GET) { // 数据由标签调取生成 return $this->fetch('users/shop_order_details'); }else{ $this->error('非法访问!'); } } // 订单提交 public function shop_under_order($error = true) { if (empty($error)) { if ($this->usersTplVersion == 'v3') { $this->redirect(url('user/Shop/shop_cart_list')); } else { $this->error('您的购物车还没有商品!'); } } // 获取当前页面URL,存入session,若操作添加地址后返回当前页面 session($this->users_id.'_EyouShopOrderUrl', $this->request->url(true)); // 数据由标签调取生成 return $this->fetch('users/shop_under_order'); } // 购物车库存检测 public function cart_stock_detection() { if (IS_AJAX_POST) { // 购物车查询条件 $CartWhere = [ 'a.users_id' => $this->users_id, 'a.lang' => $this->home_lang, 'a.selected' => 1, ]; $list = $this->shop_cart_db->field('a.product_num, b.stock_count, c.spec_value_id, c.spec_stock,b.prom_type') ->alias('a') ->join('__ARCHIVES__ b', 'a.product_id = b.aid', 'LEFT') ->join('__PRODUCT_SPEC_VALUE__ c', 'a.spec_value_id = c.spec_value_id and a.product_id = c.aid', 'LEFT') ->where($CartWhere) ->order('a.add_time desc') ->select(); if (empty($list)) $this->error('请选择要购买的商品!'); $ExceedingStock = 0; // 处理商品库存检测 foreach ($list as $key => $value) { // 购物车商品存在规格并且库存不为空,则覆盖商品原来的库存 if (!empty($value['spec_value_id'])) { $value['stock_count'] = $value['spec_stock']; } // 检测是否有超出库存的产品 if (empty($value['product_num']) || $value['product_num'] > $value['stock_count']) { $ExceedingStock = 1; break; } // 若库存为空则清除这条数据 if (empty($value['stock_count'])) { unset($list[$key]); continue; } } $this->success('检测完成', null, $ExceedingStock); } } // 收货地址管理列表 public function shop_address_list() { // 将当前URL存入 session ,使用微信获取收货地址时需要验签加密 session($this->users_id.'_EyouShopAddAddress', $this->request->url(true)); // 获取当前页面URL,存入session,若操作添加地址后返回当前页面 session($this->users_id.'_EyouShopOrderUrl', $this->request->url(true)); // 指定返回上一级URL $gourl = input('param.gourl/s'); $gourl = urldecode($gourl); $this->assign('gourl', $gourl); $this->assign('add_addr_url', url("user/Shop/shop_get_wechat_addr")); // 收货地址列入的来源入口 $type = input('param.type/s'); $this->assign('type', $type); // 数据由标签调取生成 return $this->fetch('users/shop_address_list'); } // 取消订单 public function shop_order_cancel() { if (IS_AJAX_POST) { $order_id = input('param.order_id/d'); if (!empty($order_id)) { // 更新条件 $Where = [ 'order_id' => $order_id, 'users_id' => $this->users_id, 'lang' => $this->home_lang, ]; // 更新数据 $Data = [ 'order_status' => '-1', 'update_time' => getTime(), ]; // 更新订单主表 $return = $this->shop_order_db->where($Where)->update($Data); if (!empty($return)) { // 订单取消,还原单内产品数量 model('ProductSpecValue')->SaveProducSpecValueStock($order_id, $this->users_id); // 添加订单操作记录 AddOrderAction($order_id,$this->users_id,'0','0','0','0','订单取消!','会员关闭订单!'); $this->success('订单已取消!'); }else{ $this->error('操作失败!'); } } } } // 立即购买 public function shop_buy_now() { if (IS_AJAX_POST) { $param = input('param.'); $param['aid'] = intval($param['aid']); $param['num'] = intval($param['num']); // 商品是否已售罄 $this->IsSoldOut($param); // 数量不可为空 if (empty($param['num']) || 0 > $param['num']) { $this->error('请选择数量!'); } // 查询条件 $archives_where = [ 'arcrank' => array('egt','0'), //带审核稿件不查询 'aid' => $param['aid'], 'lang' => $this->home_lang, ]; $count = $this->archives_db->where($archives_where)->count(); // 跳转下单页 if (!empty($count)) { // 对ID和订单号加密,拼装url路径 $querydata = [ 'aid' => $param['aid'], 'product_num' => $param['num'], ]; /*若开启多规格则执行*/ if (!empty($this->usersConfig['shop_open_spec']) && !empty($param['spec_value_id'])) { $querydata['spec_value_id'] = $param['spec_value_id']; } /* END */ /*特定场景专用*/ $opencodetype = config('global.opencodetype'); if (1 == $opencodetype) { if (!empty($param['mini_id']) && intval($param['mini_id']) > 0) { $querydata['mini_id'] = intval($param['mini_id']); } } /*end*/ // 先 json_encode 后 md5 加密信息 $querystr = md5(json_encode($querydata)); // 存入 cookie cookie($querystr, $querydata); // 跳转链接 $url = urldecode(url('user/Shop/shop_under_order', ['querystr'=>$querystr])); $this->success('立即购买!',$url); }else{ $this->error('该商品不存在或已下架!'); } }else { $this->error('非法访问!'); } } // 添加购物车数据 public function shop_add_cart() { if (IS_AJAX_POST) { $param = input('param.'); $param['aid'] = intval($param['aid']); // 商品是否已售罄 $this->IsSoldOut($param); // 数量不可为空 if (empty($param['num']) || 0 > $param['num']) $this->error('请选择数量!'); // 查询条件 $archives_where = [ 'arcrank' => ['egt', 0], 'aid' => $param['aid'], 'lang' => $this->home_lang, ]; $count = $this->archives_db->where($archives_where)->count(); // 加入购物车处理 if (!empty($count)) { // 查询条件 $cart_where = [ 'users_id' => $this->users_id, 'product_id' => $param['aid'], 'lang' => $this->home_lang, ]; // 若开启多规格则执行 if (!empty($this->usersConfig['shop_open_spec']) && !empty($param['spec_value_id'])) { $cart_where['spec_value_id'] = $param['spec_value_id']; } $cartInfo = $this->shop_cart_db->field('product_num')->where($cart_where)->find(); if (!empty($cartInfo)) { // 购物车内已有相同产品,进行数量更新。 $data['product_num'] = $param['num'] + intval($cartInfo['product_num']); //与购物车数量进行叠加 $data['update_time'] = getTime(); $cart_id = $this->shop_cart_db->where($cart_where)->update($data); } else { // 购物车内还未有相同产品,进行添加。 $data['users_id'] = $this->users_id; $data['product_id'] = $param['aid']; $data['product_num'] = $param['num']; $data['spec_value_id'] = $param['spec_value_id']; $data['add_time'] = getTime(); $cart_id = $this->shop_cart_db->add($data); } if (!empty($cart_id)) { $this->success('加入购物车成功!', url('user/Shop/shop_cart_list'), ['code'=>1]); } else { $this->error('加入购物车失败!', null, ['code'=>-1]); } } else { $this->error('该商品不存在或已下架!', null, ['code'=>-1]); } } else { $this->error('非法访问!', null, ['code'=>-1]); } } // 统一修改购物车数量 // symbol 加或减数量或直接修改数量 public function cart_unified_algorithm(){ if (IS_AJAX_POST) { $aid = input('post.aid/d'); $symbol = input('post.symbol'); $num = input('post.num/d'); $spec_value_id = input('post.spec_value_id'); // 查询条件 $archives_where = [ 'arcrank' => array('egt','0'), 'aid' => $aid, 'lang' => $this->home_lang, ]; $archives_count = $this->archives_db->where($archives_where)->count(); if (!empty($archives_count)) { // 查询条件 $cart_where = [ 'users_id' => $this->users_id, 'product_id' => $aid, 'lang' => $this->home_lang, 'spec_value_id' => $spec_value_id, ]; // 判断追加查询条件,当减数量时,商品数量最少为1 if ('-' == $symbol) $cart_where['product_num'] = array('gt','1'); $product_num = $this->shop_cart_db->where($cart_where)->getField('product_num'); // 处理购物车产品数量 if (!empty($product_num)) { // 更新数组 if ('+' == $symbol) { $data['product_num'] = $product_num + 1; }else if ('-' == $symbol) { $data['product_num'] = $product_num - 1; }else if ('change' == $symbol) { $data['product_num'] = $num; } $data['update_time'] = getTime(); // 更新数据 $cart_id = $this->shop_cart_db->where($cart_where)->update($data); // 计算金额数量 $CaerWhere = [ 'a.users_id' => $this->users_id, 'a.lang' => $this->home_lang, 'a.selected' => 1, ]; $CartData = $this->shop_cart_db ->field('a.product_num, b.users_price, c.spec_price') ->alias('a') ->join('__ARCHIVES__ b', 'a.product_id = b.aid', 'LEFT') ->join('__PRODUCT_SPEC_VALUE__ c', 'a.spec_value_id = c.spec_value_id and a.product_id = c.aid', 'LEFT') ->where($CaerWhere) ->select(); $level_discount = $this->users['level_discount']; $discount_price = $level_discount / 100; $spec_price = $users_price = $num_new = 0; foreach ($CartData as $key => $value) { if (!empty($value['spec_price'])) { if (!empty($level_discount)) $value['spec_price'] = $value['spec_price'] * $discount_price; $spec_price += $value['product_num'] * $value['spec_price']; } else { if (!empty($level_discount)) $value['users_price'] = $value['users_price'] * $discount_price; $users_price += $value['product_num'] * $value['users_price']; } $num_new += $value['product_num']; } $CartData['num'] = $num_new; $CartData['price'] = unifyPriceHandle($spec_price + $users_price); if (empty($CartData['num']) && empty($CartData['price'])) { $CartData['num'] = '0'; $CartData['price'] = '0'; } $CartAmountVal = $this->shop_cart_db->where([ 'users_id' => $this->users_id,'lang' => $this->home_lang])->sum('product_num'); if (!empty($cart_id)) { $this->success('操作成功!', null, ['NumberVal'=>$CartData['num'], 'AmountVal'=>$CartData['price'], 'CartAmountVal'=>$CartAmountVal]); } } else { $this->error('商品数量最少为1', null, ['error'=>'0']); } } else { $this->error('该商品不存在或已下架!'); } } } // 删除购物车内的产品 public function cart_del() { if (IS_AJAX_POST) { $cart_id = input('post.cart_id/s'); if (!empty($cart_id)) { // 删除条件 $cart_where = [ 'cart_id' => ['IN', explode(',', $cart_id)], 'users_id' => $this->users_id, 'lang' => $this->home_lang, ]; // 删除数据 $return = $this->shop_cart_db->where($cart_where)->delete(); } if (!empty($return)) { // 计算购物车选中商品的总数总额 $CaerWhere = [ 'a.users_id' => $this->users_id, 'a.lang' => $this->home_lang, 'a.selected' => 1 ]; $CartData = $this->shop_cart_db ->field('a.product_num, b.users_price, c.spec_price') ->alias('a') ->join('__ARCHIVES__ b', 'a.product_id = b.aid', 'LEFT') ->join('__PRODUCT_SPEC_VALUE__ c', 'a.spec_value_id = c.spec_value_id and a.product_id = c.aid', 'LEFT') ->where($CaerWhere) ->select(); $level_discount = $this->users['level_discount']; $discount_price = $level_discount / 100; $spec_price = $users_price = $num_new = 0; foreach ($CartData as $key => $value) { if (!empty($value['spec_price'])) { if (!empty($level_discount)) $value['spec_price'] = $value['spec_price'] * $discount_price; $spec_price += $value['product_num'] * $value['spec_price']; } else { if (!empty($level_discount)) $value['users_price'] = $value['users_price'] * $discount_price; $users_price += $value['product_num'] * $value['users_price']; } $num_new += $value['product_num']; } $CartData['num'] = empty($num_new) ? 0 : $num_new; $CartData['price'] = unifyPriceHandle($spec_price + $users_price); $CartData['price'] = empty($CartData['price']) ? '0.00' : $CartData['price']; // 购物车是否还存在商品 $CartCount = $this->shop_cart_db->where(['users_id' => $this->users_id, 'lang' => $this->home_lang])->count(); // 购物车所有商品数量 $CartAmountVal = $this->shop_cart_db->where(['users_id' => $this->users_id,'lang' => $this->home_lang])->sum('product_num'); // 返回数据 $data = [ 'NumberVal' => $CartData['num'], 'AmountVal' => $CartData['price'], 'CartCount' => $CartCount, 'CartAmountVal' => $CartAmountVal, ]; $this->success('操作成功!', null, $data); } else { $this->error('删除失败!'); } } } // 删除全部选中的购物车商品 public function select_cart_del() { if (IS_AJAX_POST) { // 删除条件 $where = [ 'selected' => 1, 'users_id' => $this->users_id, 'lang' => $this->home_lang, ]; // 删除数据 $result = $this->shop_cart_db->where($where)->delete(true); if (!empty($result)) { $this->success('删除成功'); } else { $this->error('删除失败'); } } } // 移入收藏 public function move_to_collection() { if (IS_AJAX_POST) { $cart_id = input('post.cart_id'); if (!empty($cart_id)) { // 删除条件 $cart_where = [ 'cart_id' => $cart_id, 'users_id' => $this->users_id, 'lang' => $this->home_lang, ]; // 加入收藏 $aid = $this->shop_cart_db->where($cart_where)->value('product_id'); $row = Db::name('users_collection')->where(['users_id' => $this->users_id, 'aid' => $aid])->find(); if (empty($row)) { $archivesInfo = Db::name('archives')->field('aid,title,litpic,channel,typeid')->find($aid); if (!empty($archivesInfo)) { Db::name('users_collection')->add([ 'users_id' => $this->users_id, 'title' => $archivesInfo['title'], 'aid' => $aid, 'litpic' => $archivesInfo['litpic'], 'channel' => $archivesInfo['channel'], 'typeid' => $archivesInfo['typeid'], 'lang' => $this->home_lang, 'add_time' => getTime(), 'update_time' => getTime(), ]); } } // 删除数据 $return = $this->shop_cart_db->where($cart_where)->delete(); } if (!empty($return)) { // 计算购物车选中商品的总数总额 $CaerWhere = [ 'a.users_id' => $this->users_id, 'a.lang' => $this->home_lang, 'a.selected' => 1 ]; $CartData = $this->shop_cart_db ->field('a.product_num, b.users_price, c.spec_price') ->alias('a') ->join('__ARCHIVES__ b', 'a.product_id = b.aid', 'LEFT') ->join('__PRODUCT_SPEC_VALUE__ c', 'a.spec_value_id = c.spec_value_id and a.product_id = c.aid', 'LEFT') ->where($CaerWhere) ->select(); $level_discount = $this->users['level_discount']; $discount_price = $level_discount / 100; $spec_price = $users_price = $num_new = 0; foreach ($CartData as $key => $value) { if (!empty($value['spec_price'])) { if (!empty($level_discount)) $value['spec_price'] = $value['spec_price'] * $discount_price; $spec_price += $value['product_num'] * $value['spec_price']; } else { if (!empty($level_discount)) $value['users_price'] = $value['users_price'] * $discount_price; $users_price += $value['product_num'] * $value['users_price']; } $num_new += $value['product_num']; } $CartData['num'] = empty($num_new) ? 0 : $num_new; $CartData['price'] = unifyPriceHandle($spec_price + $users_price); $CartData['price'] = empty($CartData['price']) ? '0.00' : $CartData['price']; // 购物车是否还存在商品 $CartCount = $this->shop_cart_db->where(['users_id' => $this->users_id, 'lang' => $this->home_lang])->count(); // 返回数据 $data = [ 'NumberVal' => $CartData['num'], 'AmountVal' => $CartData['price'], 'CartCount' => $CartCount, ]; $this->success('操作成功!', null, $data); } else { $this->error('操作失败!'); } } } // 选中产品 public function cart_checked() { if (IS_AJAX_POST) { $cart_id = input('post.cart_id/s', ''); $selected = input('post.selected/d', 0); // 更新数组 if (!empty($selected)) { $selected = 0; } else { $selected = 1; } $update['selected'] = $selected; $update['update_time'] = getTime(); // 更新条件 if ('*' == $cart_id) { $where = [ 'product_num' => ['>', 0], 'users_id' => $this->users_id, 'lang' => $this->home_lang, ]; } else { $where = [ 'cart_id' => intval($cart_id), 'product_num' => ['>', 0], 'users_id' => $this->users_id, 'lang' => $this->home_lang, ]; } // 更新数据 $return = $this->shop_cart_db->where($where)->update($update); if (!empty($return)) { $this->success('操作成功!'); } else { $this->error('操作失败!'); } } } public function shop_wechat_pay_select() { $ReturnOrderData = session($this->users_id.'_ReturnOrderData'); if (empty($ReturnOrderData)) { $url = session($this->users_id.'_EyouShopOrderUrl'); $this->error('订单支付异常,请刷新重新下单~',$url); } $eyou = [ 'field' => $ReturnOrderData, ]; $this->assign('eyou',$eyou); return $this->fetch('users/shop_wechat_pay_select'); } /** * 快速下单支付流程 - 添加商品信息及计算价格等 * @return [type] [description] */ public function fastSubmitOrder() { $aid = input('post.aid_v507428/d'); $pay_code = input('post.pay_code_v507428/s'); // 支付方式 if (IS_POST && !empty($aid) && !empty($pay_code)) { $OrderData = []; $mini_id = input('post.mini_id_v507428/d'); !empty($mini_id) && $OrderData['mini_id'] = $mini_id; // 规格值 $spec_value_id = input('post.spec_value_id_v507428/s'); if (!empty($spec_value_id)) { $spec_value_id = preg_replace('/[^\d\_]/i', '', $spec_value_id); $spec_value_id = trim($spec_value_id, '_'); $OrderData['spec_value_id'] = "_{$spec_value_id}_"; } $ArchivesWhere = [ 'a.aid' => $aid, ]; if (!empty($spec_value_id)) $ArchivesWhere['b.spec_value_id'] = $spec_value_id; $field = 'a.aid, a.aid as product_id, a.title, a.litpic, a.users_price, a.stock_count, a.prom_type, a.attrlist_id, b.spec_price, b.spec_stock, b.spec_value_id, b.value_id'; $list = Db::name('archives')->field($field) ->alias('a') ->join('__PRODUCT_SPEC_VALUE__ b', 'a.aid = b.aid', 'LEFT') ->where($ArchivesWhere) ->limit('0, 1') ->select(); // 没有相应的产品 if (empty($list[0])) $this->error('订单生成失败,没有相应的商品!'); $list[0]['product_num'] = 1; $list[0]['under_order_type'] = 2; // 快速下单支付 // 生成订单之前的产品数据整理 $retData = $this->shop_model->handlerOrderData('fast', $OrderData, $list, $this->users); if (empty($retData['code'])) { $this->error($retData['msg']); } $OrderData = array_merge($OrderData, $retData['data']['OrderData']); $list = $retData['data']['list']; $OrderId = Db::name('shop_order')->insertGetId($OrderData); $OrderData['order_id'] = $OrderId; if (!empty($OrderId)) { // 生成订单之后的订单明细整理 $retData = $this->shop_model->handlerDetailsData('fast', $OrderData, $list, $this->users); if (empty($retData['code'])) { $this->error($retData['msg']); } $cart_ids = $retData['data']['cart_ids']; $OrderDetailsData = $retData['data']['OrderDetailsData']; $UpSpecValue = $retData['data']['UpSpecValue']; $DetailsId = Db::name('shop_order_details')->insertAll($OrderDetailsData); if (!empty($DetailsId)) { // 清理购物车中已下单的ID if (!empty($cart_ids)) Db::name('shop_cart')->where('cart_id', 'IN', $cart_ids)->delete(); // 产品库存、销量处理 $this->shop_model->ProductStockProcessing($UpSpecValue); // 添加订单操作记录 AddOrderAction($OrderId, $this->users_id); if (0 == $OrderData['payment_method']) { // 选择在线付款并且在手机微信端、小程序中则返回订单ID,订单号,订单交易类型 if (isMobile() && isWeixin()) { // $where = [ // 'pay_id' => 1, // 'pay_mark' => 'wechat' // ]; // $PayInfo = Db::name('pay_api_config')->where($where)->getField('pay_info'); // if (!empty($PayInfo)) $PayInfo = unserialize($PayInfo); // if (!empty($this->users['open_id']) && !empty($PayInfo) && 0 == $PayInfo['is_open_wechat']) { // $ReturnOrderData = [ // 'unified_id' => $OrderId, // 'unified_number' => $OrderData['order_code'], // 'transaction_type' => 2, // 订单支付购买 // 'order_total_amount' => $TotalAmount, // 'order_source' => 1, // 提交订单页 // 'is_gourl' => 1, // ]; // if ($this->users['users_money'] <= '0.00') { // // 余额为0 // $ReturnOrderData['is_gourl'] = 0; // $this->success('订单已生成!', null, $ReturnOrderData); // } else { // // 余额不为0 // $url = url('user/Shop/shop_wechat_pay_select'); // session($this->users_id.'_ReturnOrderData', $ReturnOrderData); // $this->success('订单已生成!', $url, $ReturnOrderData); // } // } else { // // 如果会员没有openid则跳转到支付页面进行支付 // // 在线付款时,跳转至付款页 // // 对ID和订单号加密,拼装url路径 // $Paydata = [ // 'order_id' => $OrderId, // 'order_code' => $OrderData['order_code'], // ]; // // 先 json_encode 后 md5 加密信息 // $Paystr = md5(json_encode($Paydata)); // // 存入 cookie // cookie($Paystr, $Paydata); // // 跳转链接 // $PaymentUrl = urldecode(url('user/Pay/pay_recharge_detail',['paystr'=>$Paystr])); // $this->success('订单已生成!', $PaymentUrl, ['is_gourl' => 1]); // } } else { if ('alipay' == $pay_code) { // 重要参数,支付宝配置信息 $PayInfo = Db::name('pay_api_config')->where([ 'pay_id' => 2, 'pay_mark' => 'alipay' ])->getField('pay_info'); if (empty($PayInfo)) $this->error('请先配置支付宝!'); $alipay = unserialize($PayInfo); $vars = [ 'unified_number' => $OrderData['order_code'], 'unified_amount' => $OrderData['order_amount'], 'transaction_type' => 2, ]; $PayApiLogic = new \app\user\logic\PayApiLogic; $retData = $PayApiLogic->UseAliPayPay(['transaction_type'=>2], $vars, $alipay, true); if (!empty($retData['alipay_url'])) { $PaymentUrl = $retData['alipay_url']; $this->redirect($PaymentUrl); } else { $this->error('调起支付宝页面失败!'); } } else if ('weipay' == $pay_code) { $vars = [ 'unified_number' => $OrderData['order_code'], 'transaction_type' => 2 ]; $data = [ 'url_qrcode' => url('user/PayApi/pay_wechat_png', $vars), 'pay_id' => 1, 'pay_mark' => 'wechat', 'unified_id' => $OrderId, 'unified_number' => $OrderData['order_code'], 'transaction_type' => 2, ]; $this->success('正在支付中', null, $data); } } } } } } $this->error('操作失败!'); } // 订单提交处理逻辑,添加商品信息及计算价格等 public function shop_payment_page() { if (IS_POST) { // 提交的订单信息判断 $post = input('post.'); if (empty($post)) $this->error('订单生成失败,商品数据有误'); // 物流类型 $post['logistics_type'] = !empty($post['logistics_type']) ? intval($post['logistics_type']) : 0; if (2 === intval($post['logistics_type'])) { if (empty($post['store_id'])) $this->error('请选择自提门店'); if (empty($post['buyer'])) $this->error('请输入用户姓名'); if (empty($post['phone'])) $this->error('请输入预留手机号'); if (!check_mobile($post['phone'])) $this->error('预留手机号格式不正确'); } $OrderData = []; // 产品ID是否存在 $Md5Value = !empty($post['Md5Value']) ? $post['Md5Value'] : null; if (!empty($Md5Value)) { $querystr = cookie($Md5Value); $aid = !empty($querystr['aid']) ? intval($querystr['aid']) : 0; $num = !empty($querystr['product_num']) ? intval($querystr['product_num']) : 0; $mini_id = !empty($querystr['mini_id']) ? intval($querystr['mini_id']) : 0; !empty($mini_id) && $OrderData['mini_id'] = $mini_id; $spec_value_id = !empty($querystr['spec_value_id']) ? $querystr['spec_value_id'] : ''; !empty($spec_value_id) && $OrderData['spec_value_id'] = $spec_value_id; $type = !empty($post['type']) ? intval($post['type']) : 0; $OrderData['order_md5'] = md5($aid.$spec_value_id); // 商品数量判断 if ($num <= 0) $this->error('订单生成失败,商品数量有误!'); // 订单来源判断 if ($type != 1) $this->error('订单生成失败,提交来源有误!'); // 立即购买查询条件 $where = [ 'a.aid' => $aid, ]; if (!empty($spec_value_id)) $where['b.spec_value_id'] = $spec_value_id; $field = 'a.aid, a.aid as product_id, a.title, a.litpic, a.users_price, a.users_discount_type, a.stock_count, a.prom_type, a.attrlist_id, b.spec_price, b.spec_stock, b.spec_value_id, b.value_id, c.spec_is_select, a.merchant_id, a.free_shipping'; $list = $this->archives_db->field($field) ->alias('a') ->join('__PRODUCT_SPEC_VALUE__ b', 'a.aid = b.aid', 'LEFT') ->join('__PRODUCT_SPEC_DATA__ c', 'a.aid = c.aid and b.spec_value_id = c.spec_value_id', 'LEFT') ->where($where) ->limit('0, 1') ->select(); $list[0]['product_num'] = $num; $list[0]['under_order_type'] = $type; if (empty($list[0]['spec_is_select'])) { $list[0]['spec_price'] = ''; $list[0]['spec_stock'] = ''; $list[0]['spec_value_id'] = ''; } } else { // 购物车查询条件 $where = [ 'a.users_id' => $this->users_id, 'a.selected' => 1, ]; $field = 'a.*, b.aid, b.title, b.litpic, b.users_price, b.users_discount_type, b.stock_count, b.prom_type, b.attrlist_id, c.spec_price, c.spec_stock, c.value_id, b.merchant_id, b.free_shipping'; $list = $this->shop_cart_db->field($field) ->alias('a') ->join('__ARCHIVES__ b', 'a.product_id = b.aid', 'LEFT') ->join('__PRODUCT_SPEC_VALUE__ c', 'a.spec_value_id = c.spec_value_id and a.product_id = c.aid', 'LEFT') ->where($where) ->select(); } // 没有相应的产品 if (empty($list)) $this->error('订单生成失败,没有相应的产品!'); // 生成订单之前的产品数据整理 $retData = $this->shop_model->handlerOrderData('normal', $OrderData, $list, $this->users, $post); if (empty($retData['code'])) $this->error($retData['msg']); // 判断下单商品是否有多个商家的商品,若多个商家一起下单则执行 $merchantID = count(array_unique(get_arr_column($list, 'merchant_id'))); if (intval($merchantID) > 1) { $multiMerchantLogic = new \app\user\logic\MultiMerchantLogic; $multiMerchantLogic->multiMerchantOrderHandle($retData['data']['list'], $post); } // 合并订单数据 $OrderData = array_merge($OrderData, $retData['data']['OrderData']); $list = $retData['data']['list']; // 订单物流类型(0:虚拟订单; 1:快递发货; 2:到店核销;) $OrderData['logistics_type'] = !empty($post['logistics_type']) ? intval($post['logistics_type']) : 1; $post['verifyShow'] = $post['deliveryShow'] = false; if (1 === intval($OrderData['logistics_type'])) { $post['deliveryShow'] = true; } else if (2 === intval($OrderData['logistics_type'])) { $post['verifyShow'] = true; } $AddrData = []; // 非虚拟订单则查询运费信息 if (empty($OrderData['prom_type']) && 1 === intval($OrderData['logistics_type'])) { // 没有选择收货地址 if (empty($post['addr_id'])) { // 在微信端并且不在小程序中 if (isWeixin() && !isWeixinApplets()) { // 跳转至收货地址添加选择页 if ('v3' == $this->usersTplVersion) { $get_addr_url = url('user/Shop/shop_add_address', ['type'=>'order']); } else { $get_addr_url = url('user/Shop/shop_get_wechat_addr'); } $is_gourl['is_gourl'] = 1; $this->success('101:选择添加地址方式', $get_addr_url, $is_gourl); } else { $paramNew['add_addr'] = 1; $paramNew['is_mobile'] = $this->is_mobile; if ('v3' == $this->usersTplVersion) { $paramNew['url'] = url('user/Shop/shop_add_address', ['type'=>'order']); } $this->error('101:订单生成失败,请添加收货地址', null, $paramNew); } } // 查询收货地址 $AddrWhere = [ 'addr_id' => $post['addr_id'], 'users_id' => $this->users_id, ]; $AddressData = $this->shop_address_db->where($AddrWhere)->find(); if (empty($AddressData)) { if (isWeixin() && !isWeixinApplets()) { // 跳转至收货地址添加选择页 if ('v3' == $this->usersTplVersion) { $get_addr_url = url('user/Shop/shop_add_address', ['type'=>'order']); } else { $get_addr_url = url('user/Shop/shop_get_wechat_addr'); } $is_gourl['is_gourl'] = 1; $this->success('102:选择添加地址方式', $get_addr_url, $is_gourl); } else { $paramNew['add_addr'] = 1; $paramNew['is_mobile'] = $this->is_mobile; if ('v3' == $this->usersTplVersion) { $paramNew['url'] = url('user/Shop/shop_add_address', ['type'=>'order']); } $this->error('102:订单生成失败,请添加收货地址', null, $paramNew); } } $shop_open_shipping = getUsersConfigData('shop.shop_open_shipping'); $template_money = 0; if (!empty($shop_open_shipping)) { // 通过省份获取运费模板中的运费价格 $template_money = $this->shipping_template_db->where('province_id', $AddressData['province'])->getField('template_money'); if (0 >= $template_money) { // 省份运费价格为0时,使用统一的运费价格,固定ID为100000 $template_money = $this->shipping_template_db->where('province_id', '100000')->getField('template_money'); } // 合计金额加上运费价格 $OrderData['order_total_amount'] += $template_money; $OrderData['order_amount'] += $template_money; } // 拼装数组 $AddrData = [ 'consignee' => $AddressData['consignee'], 'country' => $AddressData['country'], 'province' => $AddressData['province'], 'city' => $AddressData['city'], 'district' => $AddressData['district'], 'address' => $AddressData['address'], 'mobile' => $AddressData['mobile'], 'shipping_fee' => $template_money, ]; } // 存在收货地址则追加合并到主表数组 if (!empty($AddrData)) $OrderData = array_merge($OrderData, $AddrData); if (0 < $OrderData['order_amount']) { if (empty($post['payment_type'])) $this->error('网站支付配置未完善,购买服务暂停使用'); // 数据验证 $rule = ['payment_type' => 'require|token']; $message = ['payment_type.require' => '不可为空!']; $validate = new \think\Validate($rule, $message); if (!$validate->check($post)) $this->error('不可连续提交订单!'); } // 订单提交处理 -- 其他逻辑公共调用方法,部分逻辑改动不适合直接修改原文件时请在此方法做处理和兼容 $OrderData = model('ShopPublicHandle')->orderSubmitPublicHandle($OrderData, $this->usersConfig, $this->users_id, $post, $list); // // 如果后台【商城中心】-【商城配置】-【订单设置】-收货后可维权时间设置为0,则表示订单不允许申请维权 // if (empty($this->usersConfig['order_right_protect_time'])) $OrderData['allow_service'] = 1; // // 获取消费获得积分数据 // $OrderData['obtain_scores'] = getConsumObtainScores($OrderData, $this->usersConfig, true); // $OrderData['is_obtain_scores'] = !empty($OrderData['obtain_scores']) ? 0 : 1; // 添加订单及后续处理 $OrderId = $this->shop_order_db->insertGetId($OrderData); if (!empty($OrderId)) { $OrderId = intval($OrderId); $OrderData['order_id'] = $OrderId; // 订单创建后续处理 -- 其他逻辑公共调用方法,部分逻辑改动不适合直接修改原文件时请在此方法做处理和兼容 $OrderData = model('ShopPublicHandle')->orderCreatePublicHandle($OrderData, $this->usersConfig, $this->users_id, $post, $list); // 生成订单之后的订单明细整理 $retData = $this->shop_model->handlerDetailsData('normal', $OrderData, $list, $this->users); if (empty($retData['code'])) $this->error($retData['msg']); // 清理购物车中已下单的ID $cart_ids = $retData['data']['cart_ids']; // 产品库存、销量处理 $UpSpecValue = $retData['data']['UpSpecValue']; // 添加订单明细表 $OrderDetailsData = $retData['data']['OrderDetailsData']; $DetailsId = $this->shop_order_details_db->insertAll($OrderDetailsData); if (!empty($DetailsId)) { // 清理购物车中已下单的ID if (!empty($cart_ids)) $this->shop_cart_db->where('cart_id', 'IN', $cart_ids)->delete(); // 产品库存、销量处理 $this->shop_model->ProductStockProcessing($UpSpecValue); // 添加订单操作记录 AddOrderAction($OrderId, $this->users_id); // 统计销售额 eyou_statistics_data(2); eyou_statistics_data(3, $OrderData['order_amount']); // 第一版会员中心,清除下单的Cookie数据 if ($this->usersTplVersion == 'v1' && !empty($Md5Value)) Cookie::delete($Md5Value); // 0元下单逻辑 if (0 == floatval($OrderData['order_amount'])) { $pay_details = [ 'unified_id' => $OrderData['order_id'], 'unified_number' => $OrderData['order_code'], 'transaction_type' => 2, 'payment_amount' => $OrderData['order_amount'], ]; $returnData = pay_success_logic($this->users_id, $OrderData['order_code'], $pay_details, ''); if (is_array($returnData)) { if (1 == $returnData['code']) { $this->success($returnData['msg'], $returnData['url'], $returnData['data']); } else { $this->error($returnData['msg'], null, ['url'=>url('user/Shop/shop_centre')]); } } } // 在线支付 -- 根据版本调用支付 if (0 == $post['payment_method']) { // 手机微信端支付 if (isMobile() && isWeixin()) { // 选择在线付款并且在手机微信端、小程序中则返回订单ID,订单号,订单交易类型 $where = [ 'pay_id' => 1, 'pay_mark' => 'wechat' ]; $PayInfo = Db::name('pay_api_config')->where($where)->getField('pay_info'); if (!empty($PayInfo)) $PayInfo = unserialize($PayInfo); if ((!empty($this->users['open_id']) || 0 === intval($this->users['thirdparty'])) && !empty($PayInfo) && 0 === intval($PayInfo['is_open_wechat'])) { $payment_type = $post['payment_type']; if ('yezf_balance' == $payment_type) { // 余额支付 if ($this->users['users_money'] < $OrderData['order_amount']) { // 余额不足,支付失败 $this->error('余额不足,支付失败!', null, ['url' => url('user/Shop/shop_centre')]); } else { // 余额充足,进行支付 $ret = Db::name('users')->where(['users_id' => $this->users_id])->update([ 'users_money' => Db::raw('users_money-'.$OrderData['order_amount']), 'update_time' => getTime(), ]); if (false !== $ret) { $pay_details = [ 'unified_id' => $OrderData['order_id'], 'unified_number' => $OrderData['order_code'], 'transaction_type' => 2, 'payment_amount' => $OrderData['order_amount'], 'payment_type' => "余额支付", ]; $returnData = pay_success_logic($this->users_id, $OrderData['order_code'], $pay_details, 'balance', true, $this->users); if (is_array($returnData)) { if (1 == $returnData['code']) { $this->success($returnData['msg'], $returnData['url'], $returnData['data']); } else { $this->error($returnData['msg'], null, ['url'=>url('user/Shop/shop_centre')]); } } } } } else { // 微信内支付、小程序内支付 -- 微信端不存在支付宝支付 $ReturnOrderData = [ 'unified_id' => $OrderId, 'unified_number' => $OrderData['order_code'], 'transaction_type' => 2, // 订单支付购买 'order_source' => 1, // 提交订单页 'is_gourl' => 0, // 1, 'order_total_amount' => 0 // 好像没有用处了 ]; $this->success('订单已生成!', null, $ReturnOrderData); // if ($this->users['users_money'] <= '0.00' || $this->usersTplVersion == 'v3') { // // 余额为0 // $ReturnOrderData['is_gourl'] = 0; // $this->success('订单已生成!', null, $ReturnOrderData); // } else { // // 余额不为0 // $url = url('user/Shop/shop_wechat_pay_select'); // session($this->users_id.'_ReturnOrderData', $ReturnOrderData); // $this->success('订单已生成!', $url, $ReturnOrderData); // } } } else { // 执行如果会员没有openid则跳转到支付页面进行支付 $paydata = [ 'order_id' => $OrderId, 'order_code' => $OrderData['order_code'], ]; // 先 json_encode 后 md5 加密信息 $paystr = md5(json_encode($paydata)); // 存入 cookie cookie($paystr, $paydata); // 跳转链接 $this->success('订单已生成!', urldecode(url('user/Pay/pay_recharge_detail',['paystr'=>$paystr])), ['is_gourl' => 1]); } } // PC端支付、手机浏览器端支付 else { if (in_array($this->usersTplVersion, ['v2', 'v3', 'v4']) && isset($post['payment_type'])) { // 余额支付、微信支付、支付宝支付、其他第三方支付 $payment_type = $post['payment_type']; if ('yezf_balance' == $payment_type) { // 余额支付 if ($this->users['users_money'] < $OrderData['order_amount']) { $url = url('user/Shop/shop_centre'); $this->error('余额不足,支付失败!', null, ['url'=>$url]); } else { $ret = Db::name('users')->where(['users_id'=>$this->users_id])->update([ 'users_money' => Db::raw('users_money-'.$OrderData['order_amount']), 'update_time' => getTime(), ]); if (false !== $ret) { $pay_details = [ 'unified_id' => $OrderData['order_id'], 'unified_number' => $OrderData['order_code'], 'transaction_type' => 2, 'payment_amount' => $OrderData['order_amount'], 'payment_type' => "余额支付", ]; $returnData = pay_success_logic($this->users_id, $OrderData['order_code'], $pay_details, 'balance', true, $this->users); if (is_array($returnData)) { if (1 == $returnData['code']) { $this->success($returnData['msg'], $returnData['url'], $returnData['data']); } else { $this->error($returnData['msg'], null, ['url'=>url('user/Shop/shop_centre')]); } } } } } else if (in_array($payment_type, ['zxzf_wechat', 'zxzf_alipay', 'zxzf_Paypal', 'zxzf_UnionPay'])) { // 内置第三方在线支付 $payment_type_arr = explode('_', $payment_type); $pay_mark = !empty($payment_type_arr[1]) ? $payment_type_arr[1] : ''; $payApiRow = Db::name('pay_api_config')->where(['pay_mark' => $pay_mark, 'lang' => $this->home_lang])->find(); if (empty($payApiRow)) $this->error('请选择正确的支付方式!'); // 返回支付所需参数 $data = [ 'code' => 'order_status_0', 'pay_id' => $payApiRow['pay_id'], 'pay_mark' => $pay_mark, 'unified_id' => $OrderData['order_id'], 'unified_number' => $OrderData['order_code'], 'transaction_type' => 2, ]; $this->success('正在支付中', url('user/Shop/shop_centre'), $data); } } else { // 第一套模板 -- 执行跳转至订单支付页 $paydata = [ 'order_id' => $OrderId, 'order_code' => $OrderData['order_code'], ]; // 先 json_encode 后 md5 加密信息 $paystr = md5(json_encode($paydata)); // 存入 cookie cookie($paystr, $paydata); // 跳转链接 $this->success('订单已生成!', urldecode(url('user/Pay/pay_recharge_detail',['paystr'=>$paystr]))); } } } // 货到付款 -- 跳转订单列表页 else { // 再次添加一条订单操作记录 AddOrderAction($OrderId, $this->users_id, 0, 1, 0, 1, '货到付款', '会员选择货到付款,款项由快递代收'); // 邮箱发送 $SmtpConfig = tpCache('smtp'); $ReturnData['email'] = GetEamilSendData($SmtpConfig, $this->users, $OrderData, 1, 'delivery_pay'); // 手机发送 $SmsConfig = tpCache('sms'); $ReturnData['mobile'] = GetMobileSendData($SmsConfig, $this->users, $OrderData, 1, 'delivery_pay'); // 发送站内信给后台 $OrderData['pay_method'] = '货到付款'; SendNotifyMessage($OrderData, 5, 1, 0); // 返回结束 $ReturnData['is_gourl'] = 1; // 返回提示 $this->success('订单已生成!', urldecode(url('user/Shop/shop_centre')), $ReturnData); } } else { $this->error('订单生成失败,商品数据有误!'); } } else { $this->error('订单生成失败,商品数据有误!'); } } } public function to_split_goods() { if (IS_AJAX_POST) { $weappInfo = model('ShopPublicHandle')->getWeappVerifyInfo(); if (empty($weappInfo)) { $this->success('没有安装核销插件,直接进入购买'); } else if (1 !== intval($weappInfo['status'])) { $this->success('没有启用核销插件,直接进入购买'); } else if (0 === intval($weappInfo['data']['openVerify'])) { $this->success('没有开启核销功能,直接进入购买'); } } // 查询条件 $where = [ 'a.selected' => 1, 'a.users_id' => $this->users_id, 'a.lang' => $this->home_lang, 'b.arcrank' => array('egt','0'), ]; $field = 'a.*, b.aid, b.title, b.litpic, b.users_price, b.logistics_type, b.users_discount_type, b.stock_count, b.attrlist_id, b.is_del, c.spec_price, c.spec_stock'; $list = Db::name("shop_cart") ->field($field) ->alias('a') ->join('__ARCHIVES__ b', 'a.product_id = b.aid', 'LEFT') ->join('__PRODUCT_SPEC_VALUE__ c', 'a.spec_value_id = c.spec_value_id and a.product_id = c.aid', 'LEFT') ->where($where) ->order('a.selected desc, a.add_time desc') ->select(); $verify = $delivery = []; // 商品处理 foreach ($list as $key => $value) { // 图片处理 $value['litpic'] = !empty($value['litpic']) ? handle_subdir_pic($value['litpic']) : ''; // 购物车商品存在规格并且价格不为空,则覆盖商品原来的价格 if (!empty($value['spec_value_id']) && !empty($value['spec_price'])) $value['users_price'] = unifyPriceHandle($value['spec_price']); // 商品价格处理 $value['subtotal'] = 0; if (!empty($value['users_price'])) { // 计算小计 $value['subtotal'] = $value['users_price'] * $value['product_num']; $value['subtotal'] = unifyPriceHandle($value['subtotal']); } // 虚拟商品 if ('0' === $value['logistics_type']) { array_push($verify, $value); array_push($delivery, $value); } // 仅物流配送 else if ('1' === $value['logistics_type']) { array_push($delivery, $value); } // 仅到店核销 else if ('2' === $value['logistics_type']) { array_push($verify, $value); } // 物流配送 和 到店核销 else { $logisticsType = isset($value['logistics_type']) ? explode(',', $value['logistics_type']) : []; if (in_array(1, $logisticsType) && in_array(2, $logisticsType)) { array_push($verify, $value); array_push($delivery, $value); } } } if (IS_AJAX_POST) { if (empty($verify)) { $this->success('没有核销商品,直接进入购买'); } else if (empty($delivery)) { $this->success('没有实体商品,直接进入购买'); } else if ($verify === $delivery) { $this->success('数据相等'); } else { $this->error('数据不相等'); } } else { $result = [ 0 => [ 'amount' => 0, 'number' => 0, 'cart_ids' => '', 'list' => $delivery, 'name' => '快递发货', ], 1 => [ 'amount' => 0, 'number' => 0, 'cart_ids' => '', 'list' => $verify, 'name' => '到店核销', ], ]; foreach ($delivery as $key => $value) { // 合计数量 $result[0]['number'] += $value['product_num']; // 合计金额 $result[0]['amount'] += $value['subtotal']; $result[0]['amount'] = unifyPriceHandle($result[0]['amount']); // 购物车ID $result[0]['cart_ids'] .= !empty($key) ? ',' . $value['cart_id'] : $value['cart_id']; } $result[0]['submitBuyGoods'] = ' data-ids="'.$result[0]['cart_ids'].'" onclick="submitBuyGoods(this);" '; foreach ($verify as $key => $value) { // 合计数量 $result[1]['number'] += $value['product_num']; // 合计金额 $result[1]['amount'] += $value['subtotal']; $result[1]['amount'] = unifyPriceHandle($result[1]['amount']); // 购物车ID $result[1]['cart_ids'] .= !empty($key) ? ',' . $value['cart_id'] : $value['cart_id']; } $result[1]['submitBuyGoods'] = ' data-ids="'.$result[1]['cart_ids'].'" onclick="submitBuyGoods(this);" '; $this->assign('result', $result); return $this->fetch('users/shop_to_split_goods'); } } public function submitBuyGoods() { if (IS_AJAX_POST) { $ids = input('post.ids', ''); if (!empty($ids)) { $where = [ 'cart_id' => ['NOT IN', $ids], 'users_id' => $this->users_id, ]; $update = [ 'selected' => 0, 'update_time' => getTime() ]; Db::name("shop_cart")->where($where)->update($update); $this->success('数据正确', url('user/Shop/shop_under_order')); } $this->error('数据错误'); } } public function select_verify_store() { // 查询条件 $where = [ 'store_status' => 1, ]; $list = Db::name("weapp_verify_store")->where($where)->order('store_id desc')->select(); $regionList = get_region_list(); foreach ($list as $key => $value) { // 省市县区地址处理 $city = !empty($regionList[$value['store_city']]['name']) ? $regionList[$value['store_city']]['name'] : ''; $area = !empty($regionList[$value['store_area']]['name']) ? $regionList[$value['store_area']]['name'] : ''; $prov = !empty($regionList[$value['store_province']]['name']) ? $regionList[$value['store_province']]['name'] : ''; $value['prov_city_area'] = $prov . ' ' . $city . ' ' . $area; $list[$key] = $value; } $this->assign('list', $list); return $this->fetch('users/shop_select_verify_store'); } // 添加收货地址 public function shop_add_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['address'])) $this->error('请填写详细地址'); // 添加数据 $post['users_id'] = $this->users_id; $post['add_time'] = getTime(); $post['lang'] = $this->home_lang; if (isMobile() && isWeixin()) { // 在手机微信端、小程序中则把新增的收货地址设置为默认地址 if ('v3' == $this->usersTplVersion) { $post['is_default'] = !empty($post['is_default']) ? 1 : 0; } else { $post['is_default'] = 1;// 设置为默认地址 } } else { $post['is_default'] = !empty($post['is_default']) ? 1 : 0; } if (isset($post['is_default'])) $post['is_default'] = !empty($post['is_default']) ? 1 : 0; $addr_id = $this->shop_address_db->insertGetId($post); if (!empty($addr_id)) { // 把对应会员下的所有地址改为非默认 if (!empty($post['is_default'])) { $where = [ 'addr_id' => array('NEQ', $addr_id), 'users_id' => $this->users_id, 'lang' => $this->home_lang, ]; $update = [ 'is_default' => 1, 'update_time' => getTime() ]; $this->shop_address_db->where($where)->update($update); } // 如果是移动端(手机端、微信端)并且有v2x参数则执行 if ((isMobile() || isWeixin()) && !empty($post['v2x'])) { $url = session($this->users_id.'_EyouShopOrderUrl'); $this->success('添加成功', $url, ['url' => $url]); } if (!empty($post['type']) && 'list' == $post['type']) { $url = url('user/Shop/shop_address_list'); $this->success('添加成功', $url, ['url' => $url]); } // 根据地址ID查询相应的中文名字 $post['country'] = '中国'; $post['province'] = get_province_name($post['province']); $post['city'] = get_city_name($post['city']); $post['district'] = get_area_name($post['district']); $post['addr_id'] = $addr_id; $post['is_mobile'] = $this->is_mobile; $post['Info'] = $post['province'].' '.$post['city'].' '.$post['district']; $this->success('添加成功!', null, $post); } else { $this->error('数据有误!'); } } $types = input('param.type'); if ('list' == $types || 'order' == $types || 'order_new' == $types) { $Where = [ 'users_id' => $this->users_id, 'lang' => $this->home_lang, ]; $addr_num = $this->shop_address_db->where($Where)->count(); $eyou = [ 'field' => [ 'Province' => get_province_list(), 'types' => $types, 'addr_num' => $addr_num, ], ]; $this->assign('eyou',$eyou); }else{ $this->error('非法来源!'); } $this->assign('is_mobile', $this->is_mobile); $this->assign('add_addr_url', url("user/Shop/shop_get_wechat_addr")); // 将当前URL存入 session ,使用微信获取收货地址时需要验签加密 session($this->users_id.'_EyouShopAddAddress', $this->request->url(true)); return $this->fetch('users/shop_add_address'); } // 更新收货地址 public function shop_edit_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['address'])) $this->error('请填写详细地址'); // 更新条件及数据 $post['addr_id'] = intval($post['addr_id']); $post['users_id'] = $this->users_id; $post['update_time'] = getTime(); $post['lang'] = $this->home_lang; $post['country'] = (empty($post['country']) || $post['country'] == '中国') ? 0 : 1; if (isset($post['is_default'])) $post['is_default'] = !empty($post['is_default']) ? 1 : 0; $where = [ 'addr_id' => $post['addr_id'], 'users_id' => $this->users_id, 'lang' => $this->home_lang, ]; $addr_id = $this->shop_address_db->where($where)->update($post); if (!empty($addr_id)) { // 把对应会员下的所有地址改为非默认 if (isset($post['is_default']) && 1 == $post['is_default']) { $AddressWhere = [ 'addr_id' => array('NEQ',$post['addr_id']), 'users_id' => $this->users_id, 'lang' => $this->home_lang, ]; $data_new['is_default'] = 0;// 设置为非默认地址 $data_new['update_time'] = getTime(); $this->shop_address_db->where($AddressWhere)->update($data_new); } // 如果是移动端(手机端、微信端)并且有v2x参数则执行 if ((isMobile() || isWeixin()) && !empty($post['v2x'])) { $url = session($this->users_id.'_EyouShopOrderUrl'); $this->success('修改成功', $url, ['url' => $url]); } // 根据地址ID查询相应的中文名字 $post['country'] = '中国'; $post['province'] = get_province_name($post['province']); $post['city'] = get_city_name($post['city']); $post['district'] = get_area_name($post['district']); $this->success('修改成功', null, $post); } else { $this->error('数据有误!'); } } // 查询收货地址 $addr_id = input('param.addr_id/d', 0); $where = [ 'addr_id' => $addr_id, 'users_id' => $this->users_id, 'lang' => $this->home_lang, ]; $address = $this->shop_address_db->where($where)->find(); if (empty($address)) $this->error('数据有误!'); // 处理收货地址 if (in_array($this->usersTplVersion, ['v3']) || in_array($this->usersTpl2xVersion, ['v2.x'])) { $address['province_name'] = get_province_name($address['province']); $address['city_name'] = get_city_name($address['city']); $address['district_name'] = get_area_name($address['district']); } $address['country'] = '中国'; //国家 $address['Province'] = get_province_list(); // 省份 $address['City'] = $this->region_db->where('parent_id',$address['province'])->select(); // 城市 $address['District'] = $this->region_db->where('parent_id',$address['city'])->select(); // 县/区/镇 $address['onDelAddress'] = " onclick=\"DelAddress('{$addr_id}', this);\" "; $type = input('param.type/s', 'list'); $gourl = input('param.gourl/s', '', 'urldecode'); $delAddressUrl = url('Shop/shop_del_address', ['type'=>$type, 'gourl'=>$gourl]); $address['delAddressUrl'] = $delAddressUrl; $eyou = [ 'field' => $address, ]; $this->assign('eyou', $eyou); return $this->fetch('users/shop_edit_address'); } // 删除收货地址 public function shop_del_address() { if (IS_POST) { $addr_id = input('post.addr_id/d'); $Where = [ 'addr_id' => $addr_id, 'users_id' => $this->users_id, 'lang' => $this->home_lang, ]; $return = $this->shop_address_db->where($Where)->delete(); if ($return) { $gourl = ''; $type = input('param.type/s', 'list'); if ('order' == $type) { $gourl = input('param.gourl/s', '', 'urldecode'); } $url = url('Shop/shop_address_list', ['type'=>$type, 'gourl'=>$gourl]); $this->success('删除成功!', null, ['url'=>$url]); }else{ $this->error('删除失败!'); } } } // 更新收货地址,设置为默认地址 public function shop_set_default_address() { if (IS_AJAX_POST) { $post = input('post.'); // 更新条件及数据 $post['addr_id'] = intval($post['addr_id']); $post['users_id'] = $this->users_id; $post['is_default'] = '1'; //设置为默认 $post['add_time'] = getTime(); $post['lang'] = $this->home_lang; $AddrWhere = [ 'addr_id' => $post['addr_id'], 'users_id' => $this->users_id, 'lang' => $this->home_lang, ]; $addr_id = $this->shop_address_db->where($AddrWhere)->update($post); if (!empty($addr_id)) { // 把对应会员下的所有地址改为非默认 $AddressWhere = [ 'addr_id' => array('NEQ',$post['addr_id']), 'users_id' => $this->users_id, 'lang' => $this->home_lang, ]; $data['is_default'] = '0';// 设置为非默认 $data['update_time'] = getTime(); $this->shop_address_db->where($AddressWhere)->update($data); $this->success('设置成功!'); }else{ $this->error('数据有误!'); } } } // 查询运费 public function shop_inquiry_shipping() { if (IS_AJAX_POST) { $shop_open_shipping = getUsersConfigData('shop.shop_open_shipping'); if (empty($shop_open_shipping)) $this->success('未开启运费', '', 0); // 查询会员收货地址,获取省份 $addr_id = input('post.addr_id'); if ($this->usersTplVersion == 'v3') { // 第三套小米的会员中心 if (empty($addr_id)) { $addr_id = Db::name('shop_address')->where(['users_id'=>$this->users_id])->order('addr_id asc')->value('addr_id'); } } $where = [ 'addr_id' => $addr_id, 'users_id' => $this->users_id, 'lang' => $this->home_lang, ]; $province = $this->shop_address_db->where($where)->getField('province'); // 通过省份获取运费模板中的运费价格 $template_money = $this->shipping_template_db->where('province_id', $province)->getField('template_money'); if (0 == $template_money) { // 省份运费价格为0时,使用统一的运费价格,固定ID为100000 $template_money = $this->shipping_template_db->where('province_id', '100000')->getField('template_money'); } // 查询下单商品信息 $querystr = input('post.querystr/s', ''); $merchantID = 0; if (!empty($querystr)) { // 解析参数查询商品信息 $querystr = cookie($querystr); $aid = !empty($querystr['aid']) ? $querystr['aid'] : 0; $where = [ 'aid' => $aid ]; $archives = $this->archives_db->field('merchant_id, free_shipping')->where($where)->select(); $merchantID = count(array_unique(get_arr_column($archives, 'merchant_id'))); } else { $where = [ 'a.selected' => 1, 'a.users_id' => $this->users_id, ]; $field = 'b.merchant_id, b.free_shipping'; $archives = $this->shop_cart_db->alias('a')->field($field)->join('__ARCHIVES__ b', 'a.product_id = b.aid', 'LEFT')->where($where)->select(); $merchantID = count(array_unique(get_arr_column($archives, 'merchant_id'))); } if (intval($merchantID) >= 1) { // 处理查询出需要运费的商品数量 $merchantIDArr = []; $shippingFeeNum = 0; foreach ($archives as $key => $value) { if (!in_array($value['merchant_id'], $merchantIDArr)) { if (isset($value['free_shipping']) && 0 === intval($value['free_shipping'])) { $shippingFeeNum++; array_push($merchantIDArr, $value['merchant_id']); } } } $template_money = strval($template_money) * strval($shippingFeeNum); } $template_money = floatval($template_money); $this->success('查询成功!', '', $template_money); } else { $this->error('订单号错误'); } } // 联动地址获取 public function get_region_data() { $parent_id = input('param.parent_id/d', 0); $regionData = $this->region_db->where("parent_id", $parent_id)->select(); if (in_array($this->usersTpl2xVersion, ['v2.x']) || in_array($this->usersTplVersion, ['v3'])) { $this->success('查询成功!', null, $regionData); } else { $html = ''; if (!empty($regionData)) { // 拼装下拉选项 foreach($regionData as $value) { $html .= ""; } } echo json_encode($html); } } // 会员提醒收货 public function shop_order_remind() { if (IS_AJAX_POST) { $post = input('post.'); // 添加订单操作记录 AddOrderAction($post['order_id'],$this->users_id,'0','1','0','1','提醒成功!','会员提醒管理员及时发货!'); $this->success('提醒成功!'); }else{ $this->error('订单号错误'); } } // 会员确认收货 public function shop_member_confirm() { if (IS_AJAX_POST) { $post = input('post.'); $post['order_id'] = intval($post['order_id']); // 更新条件 $where = [ 'order_id' => $post['order_id'], 'users_id' => $this->users_id, 'lang' => $this->home_lang, ]; // 更新数据 $update = [ 'order_status' => 3, 'confirm_time' => getTime(), 'update_time' => getTime(), // 如果后台【商城中心】-【商城配置】-【订单设置】-收货后可维权时间设置为0,则表示订单不允许申请维权 'allow_service' => !empty($this->usersConfig['order_right_protect_time']) ? 0 : 1 ]; // 更新订单主表 $return = $this->shop_order_db->where($where)->update($update); if (!empty($return)) { // 查询订单是否存在多商家,存在多商家则执行 $shopOrder = $this->shop_order_db->where($where)->find(); if (!empty($shopOrder['merchant_id'])) { // 处理多商家订单金额结算 $multiMerchantLogic = new \app\user\logic\MultiMerchantLogic; $multiMerchantLogic->handleMultiMerchantOrderSettle($shopOrder); } // 更新数据 $update = [ 'update_time' => getTime(), ]; // 更新订单明细表 $this->shop_order_details_db->where($where)->update($update); // 添加订单操作记录 AddOrderAction($post['order_id'], $this->users_id, 0, 3, 1, 1, '确认收货', '会员已确认收到货物,订单完成'); // 如果安装了分销插件则执行 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'], $this->users_id); } } $this->success('会员确认收货'); }else{ $this->error('订单号错误'); } } } // 获取微信收货地址 public function shop_get_wechat_addr() { if (IS_AJAX_POST) { // 微信配置信息 $WeChatLoginConfig = !empty($this->usersConfig['wechat_login_config']) ? unserialize($this->usersConfig['wechat_login_config']) : []; $appid = !empty($WeChatLoginConfig['appid']) ? $WeChatLoginConfig['appid'] : ''; $appsecret = !empty($WeChatLoginConfig['appsecret']) ? $WeChatLoginConfig['appsecret'] : ''; if (empty($appid)) { $this->error('后台微信配置尚未配置AppId,不可以获取微信地址!'); }else if (empty($appsecret)) { $this->error('后台微信配置尚未配置AppSecret,不可以获取微信地址!'); } // 当前时间戳 $time = getTime(); // 微信access_token和jsapi_ticket信息 $WechatData = getUsersConfigData('wechat'); // access_token信息判断 $accesstoken = !empty($WechatData['wechat_token_value']) ? $WechatData['wechat_token_value'] : []; if (empty($accesstoken)) { // 如果配置表中的accesstoken为空则执行 // 获取公众号access_token,接口限制10万次/天 $return = $this->shop_model->GetWeChatAccessToken($appid,$appsecret); if (empty($return['status'])) { $this->error($return['prompt']); }else{ $accesstoken = $return['token']; } }else if ($time > ($WechatData['wechat_token_time']+7000)) { // 如果配置表中的时间超过过期时间则执行 // 获取公众号access_token,接口限制10万次/天 $return = $this->shop_model->GetWeChatAccessToken($appid,$appsecret); if (empty($return['status'])) { $this->error($return['prompt']); }else{ $accesstoken = $return['token']; } } // jsapi_ticket信息判断 $jsapi_ticket = !empty($WechatData['wechat_ticket_value']) ? $WechatData['wechat_ticket_value'] : []; if (empty($jsapi_ticket)) { // 获取公众号jsapi_ticket,接口限制500万次/天 $return = $this->shop_model->GetWeChatJsapiTicket($accesstoken); if (empty($return['status'])) { $this->error($return['prompt']); }else{ $jsapi_ticket = $return['ticket']; } }else if ($time > ($WechatData['wechat_ticket_time']+7000)) { // 获取公众号jsapi_ticket,接口限制500万次/天 $return = $this->shop_model->GetWeChatJsapiTicket($accesstoken); if (empty($return['status'])) { $this->error($return['prompt']); }else{ $jsapi_ticket = $return['ticket']; } } // <---- 加密参数开始 // 微信公众号jsapi_ticket // $jsapi_ticket = $jsapi_ticket; // 随机字符串 $noncestr = $this->shop_model->GetRandomString('16'); $noncestr = "$noncestr"; // 当前时间戳 $timestamp = time(); $timestamp = "$timestamp"; // 当前访问接口URL if ($this->usersTplVersion == 'v3') { $url = session($this->users_id . '_EyouShopAddAddress'); } else { $url = $this->request->url(true); } // 加密参数结束 -----> // 参数加密,顺序固定不可改变 $string = 'jsapi_ticket='.$jsapi_ticket.'&noncestr='.$noncestr.'×tamp='.$timestamp.'&url='.$url; $signature = SHA1($string); // 返回结果 $result = [ // 用于调试,不影响正常业务(如不需要,可直接清理) 'token' => $accesstoken, 'ticket' => $jsapi_ticket, 'url' => $url, // 传入接口调用参数(必须返回) 'appid' => $appid, 'timestamp' => $timestamp, 'noncestr' => $noncestr, 'signature' => $signature, ]; $this->success('数据获取!',null,$result); } $result = [ 'wechat_url' => url("user/Shop/shop_get_wechat_addr"), 'add_addr_url' => url("user/Shop/shop_add_address"), ]; $eyou = array( 'field' => $result, ); $this->assign('eyou', $eyou); return $this->fetch('users/shop_get_wechat_addr'); } // 添加微信的收货地址到数据库 public function add_wechat_addr() { if (IS_AJAX_POST) { $post = input('post.'); // 省 $province = $this->region_db->where('name',$post['provinceName'])->getField('id'); // 市 $city = $this->region_db->where('name',$post['cityName'])->getField('id'); // 县 $district = $this->region_db->where('name',$post['countryName'])->getField('id'); // 查询这个收货地址是否存在 $where = [ 'users_id' => $this->users_id, 'consignee' => $post['userName'], 'mobile' => $post['telNumber'], 'province' => $province, 'city' => $city, 'district' => $district, 'address' => $post['detailInfo'], 'lang' => $this->home_lang, ]; $return = $this->shop_address_db->where($where)->find(); if (!empty($return)) { $this->success('获取成功!',session($this->users_id.'_EyouShopOrderUrl')); }else{ $data = [ 'users_id' => $this->users_id, 'consignee' => $post['userName'], 'mobile' => $post['telNumber'], 'province' => $province, 'city' => $city, 'district' => $district, 'address' => $post['detailInfo'], 'is_default' => 1, // 设置为默认地址 'lang' => $this->home_lang, 'add_time' => getTime(), ]; if ($this->usersTplVersion == 'v3') $data['is_default'] = 0; $addr_id = $this->shop_address_db->add($data); if (!empty($addr_id)) { if ($this->usersTplVersion != 'v3') { // 把对应会员下的所有地址改为非默认 $AddressWhere = [ 'addr_id' => array('NEQ',$addr_id), 'users_id' => $this->users_id, 'lang' => $this->home_lang, ]; $data_new['is_default'] = '0';// 设置为非默认地址 $data_new['update_time'] = getTime(); $this->shop_address_db->where($AddressWhere)->update($data_new); } $this->success('获取成功!',session($this->users_id.'_EyouShopOrderUrl')); }else{ $this->success('获取失败,请刷新后重试!'); } } } } // 判断商品是否库存为0 private function IsSoldOut($param = array()) { if (!empty($param['aid'])) { if (!empty($param['spec_value_id'])) { $SpecWhere = [ 'aid' => $param['aid'], 'lang' => $this->home_lang, 'spec_stock' => ['>',0], 'spec_value_id' => $param['spec_value_id'], ]; $spec_stock = Db::name('product_spec_value')->where($SpecWhere)->getField('spec_stock'); if (empty($spec_stock)) { $data['code'] = -1; // 已售罄 $this->error('商品已售罄!', null, $data); } if ($spec_stock < $param['num']) { $data['code'] = -1; // 库存不足 $this->error('商品最大库存:'.$spec_stock, null, $data); } } else { $archives_where = [ 'arcrank' => array('egt','0'), //带审核稿件不查询 'aid' => $param['aid'], 'lang' => $this->home_lang, ]; $stock_count = $this->archives_db->where($archives_where)->getField('stock_count'); if (empty($stock_count)) { $data['code'] = -1; // 已售罄 $this->error('商品已售罄!', null, $data); } if ($stock_count < $param['num']) { $data['code'] = -1; // 库存不足 $this->error('商品最大库存:'.$stock_count, null, $data); } } } } // 申请退换货服务中转页 public function service_list() { $order_id = input('param.order_id/d', 0); if (empty($order_id)) $this->error('订单不存在!'); // 查询订单商品 $where = [ 'order_id' => $order_id, 'users_id' => $this->users_id, ]; $order_details = $this->shop_order_details_db->where($where)->select(); if (empty($order_details)) $this->error('订单不存在!'); // 查询订单商品售后 $order_service = $this->shop_order_service_db->where($where)->getAllWithIndex('details_id'); foreach ($order_details as $k => $v) { // 图片链接 $v['litpic'] = !empty($v['litpic']) ? handle_subdir_pic($v['litpic']) : ''; if (!empty($v['apply_service']) && !empty($order_service[$v['details_id']]['service_id'])) { // 售后链接 $v['name'] = '查看售后'; $v['url'] = url('user/Shop/after_service_details', ['service_id'=>$order_service[$v['details_id']]['service_id']]); } else { // 申请链接 $v['name'] = '申请售后'; $v['url'] = url('user/Shop/after_service_apply', ['details_id'=>$v['details_id']]); } // 获取订单商品规格列表(购买时的商品规格) $v['product_spec_list'] = model('ShopPublicHandle')->getOrderGoodsSpecList($v); // 覆盖原数据 $order_details[$k] = $v; } $eyou = [ 'field' => $order_details ]; $this->assign('eyou', $eyou); return $this->fetch('users/shop_after_service_list'); } /*------陈风任---2021-1-12---售后服务(退换货)------开始------*/ // 申请退换货服务 public function after_service_apply() { if (IS_AJAX_POST) { $post = input('post.'); if (empty($post)) $this->error('提交数据有误!'); if (empty($post['service_type'])) $this->error('请选择服务类型!'); if (empty($post['content'])) $this->error('请填写问题描述!'); if (empty($post['address'])) $this->error('请填写您的收货地址!'); if (empty($post['consignee'])) $this->error('请填写您的姓名!'); if (empty($post['mobile'])) $this->error('请填写您的手机号码!'); $time = getTime(); $post['order_id'] = intval($post['order_id']); $post['details_id'] = intval($post['details_id']); $post['product_id'] = intval($post['product_id']); $post['product_num'] = intval($post['product_num']); $post['service_type'] = intval($post['service_type']); $post['refund_price'] = unifyPriceHandle($post['refund_price']); // 查询订单详情信息 $details = $this->shop_model->GetOrderDetailsInfo($post['details_id'], $this->users_id); if (isset($details['code']) && 0 === intval($details['code'])) $this->error($details['msg']); // 组合添加数据 $data = [ 'users_id' => $this->users_id, 'merchant_id' => $details['merchant_id'], 'address' => $post['addrinfo'].' '.$post['address'], 'upload_img' => !empty($post['upload_img']) ? implode(',', $post['upload_img']) : '', 'refund_balance' => '', 'refund_point' => '', 'refund_code' => 'HH' . $time . rand(10,99), 'add_time' => $time, 'update_time' => $time, ]; if (2 === intval($post['service_type']) && !empty($post['refund_price'])) $data['refund_code'] = 'TK' . $time . rand(10,99); $insert = array_merge($post, $data); $resultID = $this->shop_order_service_db->insertGetId($insert); if (!empty($resultID)) { // 更新订单明细表中对应商品为申请服务 $update = [ 'apply_service' => 1, 'update_time' => getTime() ]; $this->shop_order_details_db->where('details_id', $post['details_id'])->update($update); // 添加订单服务记录 $LogNote = 1 == $post['service_type'] ? '用户提交换货申请,待审核!' : '用户提交退货申请,待审核!'; OrderServiceLog($resultID, $post['order_id'], $this->users_id, 0, $LogNote); // 返回结束 $this->success('已申请,待审核', url('user/Shop/after_service_details', ['service_id' => $resultID])); } else { $this->error('申请失败!'); } } $details_id = input('param.details_id/d'); if (empty($details_id)) $this->error('售后服务单不存在!'); // 查询订单中单个商品信息 $data = $this->shop_model->GetOrderDetailsInfo($details_id, $this->users_id); // 返回错误提示 if (!empty($data['msg']) && isset($data['code']) && 0 == $data['code']) $this->error($data['msg']); // 商户收货信息 $maddr = getUsersConfigData('addr'); // 如果存在商家ID则执行 if (!empty($data['merchant_id'])) { // 查询商家地址信息 $multiMerchantLogic = new \app\user\logic\MultiMerchantLogic; $maddr = $multiMerchantLogic->getMultiMerchantContact($data['merchant_id']); } $eyou = [ 'url' => url('user/Shop/after_service_apply', ['_ajax'=>1]), 'maddr' => $maddr, 'field' => $data ]; $this->assign('eyou', $eyou); return $this->fetch('users/shop_after_service_apply'); } // 退货换服务列表 public function after_service() { $order_code = input('param.order_code'); $status = input('param.status/s'); $keywords = input('param.keywords/s'); $ServiceInfo = $this->shop_model->GetAllServiceInfo($this->users_id, $order_code, $status, $keywords); $where = [ 'lang' => $this->home_lang, 'users_id' => $this->users_id ]; //处理中 $where['status'] = ['in',[1,2,3,4,5]]; $ServicingTotal = $this->shop_order_service_db->where($where)->count(); //已完成 $where['status'] = ['in',[6,7,8]]; $ServicedTotal = $this->shop_order_service_db->where($where)->count(); $eyou = [ 'field' => [ 'service' => $ServiceInfo['Service'], 'pageStr' => $ServiceInfo['pageStr'], 'ServicingTotal' => $ServicingTotal, 'ServicedTotal' => $ServicedTotal, ], ]; $this->assign('eyou', $eyou); return $this->fetch('users/shop_after_service'); } // 申请服务详情 public function after_service_details() { /*取消服务单*/ if (IS_AJAX_POST) { $param = input('param.'); if (empty($param['service_id'])) $this->error('请选择需要取消的服务单!'); $param['service_id'] = intval($param['service_id']); $param['details_id'] = intval($param['details_id']); /*取消服务单*/ $where = [ 'users_id' => $this->users_id, 'service_id' => $param['service_id'], ]; $update = [ 'status' => 8, 'update_time' => getTime(), ]; $ResultID = $this->shop_order_service_db->where($where)->update($update); /* END */ if (!empty($ResultID)) { /*更新订单明细表中对应商品为未申请服务*/ $where = [ 'users_id' => $this->users_id, 'details_id' => $param['details_id'] ]; $update = [ 'apply_service' => 0, 'update_time' => getTime() ]; $this->shop_order_details_db->where($where)->update($update); /* END */ /*添加记录单*/ $param['users_id'] = $this->users_id; $param['status'] = 8; $this->shop_common->AddOrderServiceLog($param, 1); /* END */ $this->success('取消成功!'); } else { $this->error('取消失败!'); } } /* END */ // 查询售后单详情 $service_id = input('param.service_id/d'); if (empty($service_id)) { $url = url('user/Shop/shop_centre'); $this->error('售后服务单不存在!', $url); } $details = $this->shop_model->GetServiceDetailsInfo($service_id, $this->users_id); // 商户收货信息 $maddr = getUsersConfigData('addr'); // 如果存在商家ID则执行 if (!empty($details['merchant_id'])) { // 查询商家地址信息 $multiMerchantLogic = new \app\user\logic\MultiMerchantLogic; $maddr = $multiMerchantLogic->getMultiMerchantContact($details['merchant_id']); } $expressList = Db::name('shop_express')->select(); // 加载模板 $eyou = [ 'maddr' => $maddr, 'field' => $details, 'ServiceUrl' => url('user/Shop/after_service_update', ['_ajax' => 1]), 'StatusArr' => [6, 7, 8], 'StatusLog' => $this->shop_model->GetOrderServiceLog($service_id, $this->users, $details['users_id']), 'ExpressList' => $expressList, ]; $this->assign('eyou', $eyou); return $this->fetch('users/shop_after_service_details'); } // 更新服务单状态 public function after_service_update() { if (IS_AJAX_POST) { if (empty($this->users_id)) $this->redirect('user/Login/login'); if ($this->usersTplVersion == 'v3') return $this->after_service_update_v3(); $post = input('post.'); if (empty($post['delivery']['cost'])) $post['delivery']['cost'] = 0; if (empty($post['delivery']['time'])) $post['delivery']['time'] = date('Y-m-d H:i:s'); // 查询条件 $where = [ 'users_id' => $this->users_id, 'service_id' => intval($post['service_id']), ]; // 更新数据 $update = [ 'status' => 4, 'users_delivery' => serialize($post['delivery']), 'update_time' => getTime(), ]; $resultID = $this->shop_order_service_db->where($where)->update($update); if (!empty($resultID)) { // 添加记录单 $post['users_id'] = $this->users_id; $this->shop_common->AddOrderServiceLog($post, 1); $this->success('操作成功'); } else { $this->error('操作失败'); } } } // 第三套模板 更新服务单状态 public function after_service_update_v3() { if (IS_AJAX_POST) { $post = input('post.'); // 查询条件 $where = [ 'users_id' => $this->users_id, 'service_id' => intval($post['service_id']), 'details_id' => intval($post['details_id']), ]; // 更新数据 $update = [ 'status' => 4, 'users_delivery' => serialize($post['delivery']), 'update_time' => getTime(), ]; $resultID = $this->shop_order_service_db->where($where)->update($update); if (!empty($resultID)) { // 添加记录单 $post['users_id'] = $this->users_id; $this->shop_common->AddOrderServiceLog($post, 1); $this->success('操作成功!'); } else { $this->error('操作失败!'); } } } /*------陈风任---2021-1-12---售后服务(退换货)------结束------*/ // 移动端订单列表瀑布流分页专业ajax加载接口 20210709大黄 public function ajax_shop_centre_page() { // 基础查询条件 $OrderWhere = [ 'users_id' => $this->users_id, 'lang' => $this->home_lang, ]; // 应用搜索条件 $keywords = input('param.keywords/s'); if (!empty($keywords)) $OrderWhere['order_code'] = ['LIKE', "%{$keywords}%"]; // 订单状态搜索 $select_status = input('param.select_status'); $pagesize = input('param.pagesize',10); if (!empty($select_status)) { if ('daifukuan' === $select_status) $select_status = 0; if (3 == $select_status) $OrderWhere['is_comment'] = 0; $OrderWhere['order_status'] = $select_status; } // 分页查询逻辑 $paginate_type = isMobile() ? 'usersmobile' : 'userseyou'; $query_get = input('get.'); $paginate = array( 'type' => $paginate_type, 'var_page' => config('paginate.var_page'), 'query' => $query_get, ); $pages = Db::name('shop_order') ->field("*") ->where($OrderWhere) ->order('add_time desc') ->paginate($pagesize, false, $paginate); $result['list'] = $pages->items(); $result['pages'] = $pages; // 搜索名称时,查询订单明细表商品名称 if (empty($result['list']) && !empty($keywords)) { $Data = model('Shop')->QueryOrderList($pagesize, $this->users_id, $keywords, $query_get); $result['list'] = $Data['list']; $result['pages'] = $Data['pages']; } /*规格值ID预处理*/ $SpecValueArray = Db::name('product_spec_value')->field('aid,spec_value_id')->select(); $SpecValueArray = group_same_key($SpecValueArray, 'aid'); $ReturnData = []; foreach ($SpecValueArray as $key => $value) { $ReturnData[$key] = []; foreach ($value as $kk => $vv) { array_push($ReturnData[$key], $vv['spec_value_id']); } } /* END */ if (!empty($result['list'])) { // 订单数据处理 $controller_name = 'Product'; // 获取当前链接及参数,用于手机端查询快递时返回页面 $OrderIds = []; $ReturnUrl = request()->url(true); foreach ($result['list'] as $key => $value) { $DetailsWhere['a.users_id'] = $value['users_id']; $DetailsWhere['a.order_id'] = $value['order_id']; // 查询订单明细表数据 $result['list'][$key]['details'] = Db::name('shop_order_details')->alias('a') ->field('a.*, b.service_id, c.is_del') ->join('__SHOP_ORDER_SERVICE__ b', 'a.details_id = b.details_id', 'LEFT') ->join('__ARCHIVES__ c', 'a.product_id = c.aid', 'LEFT') ->order('a.product_price desc, a.product_name desc') ->where($DetailsWhere) ->select(); $array_new = get_archives_data($result['list'][$key]['details'], 'product_id'); foreach ($result['list'][$key]['details'] as $kk => $vv) { // 产品规格处理 $spec_data = unserialize($vv['data']); if (!in_array($vv['order_id'], $OrderIds) && 0 == $value['order_status']) { if (!empty($spec_data['spec_value_id'])) { $spec_value_id = $spec_data['spec_value_id']; if (!in_array($spec_value_id, $ReturnData[$vv['product_id']])) { // 用于更新订单数据 array_push($OrderIds, $vv['order_id']); // 修改循环内的订单状态进行逻辑计算 $value['order_status'] = 4; // 修改主表数据,确保输出数据正确 $result['list'][$key]['order_status'] = 4; // 用于追加订单操作记录 $OrderIds_[]['order_id'] = $vv['order_id']; } } } $product_spec_list = []; if (!empty($spec_data['spec_value'])) { $spec_value_arr = explode('
', htmlspecialchars_decode($spec_data['spec_value'])); foreach ($spec_value_arr as $sp_key => $sp_val) { $sp_arr = explode(':', $sp_val); if (trim($sp_arr[0]) && !empty($sp_arr[0])) { $product_spec_list[] = [ 'name' => !empty($sp_arr[0]) ? trim($sp_arr[0]) : '', 'value' => !empty($sp_arr[1]) ? trim($sp_arr[1]) : '', ]; } } } $result['list'][$key]['details'][$kk]['product_spec_list'] = $product_spec_list; // 产品内页地址 if (!empty($array_new[$vv['product_id']]) && 0 == $vv['is_del']) { // 商品存在 $arcurl = urldecode(arcurl('home/'.$controller_name.'/view', $array_new[$vv['product_id']])); $has_deleted = 0; $msg_deleted = ''; } else { // 商品不存在 $arcurl = urldecode(url('home/View/index', ['aid'=>$vv['product_id']])); $has_deleted = 1; $msg_deleted = '[商品已停售]'; } $result['list'][$key]['details'][$kk]['arcurl'] = $arcurl; $result['list'][$key]['details'][$kk]['has_deleted'] = $has_deleted; $result['list'][$key]['details'][$kk]['msg_deleted'] = $msg_deleted; $result['list'][$key]['details'][$kk]['product_price'] = floatval($vv['product_price']); // 图片处理 $result['list'][$key]['details'][$kk]['litpic'] = handle_subdir_pic(get_default_pic($vv['litpic'])); // 申请退换货 $result['list'][$key]['details'][$kk]['ApplyService'] = urldecode(url('user/Shop/after_service_apply', ['details_id' => $vv['details_id']])); // 查看售后详情单 $result['list'][$key]['details'][$kk]['ViewAfterSale'] = urldecode(url('user/Shop/after_service_details', ['service_id' => $vv['service_id']])); // 商品评价 $result['list'][$key]['details'][$kk]['CommentProduct'] = urldecode(url('user/ShopComment/product', ['details_id' => $vv['details_id']])); } if (empty($value['order_status'])) { // 付款地址处理,对ID和订单号加密,拼装url路径 $Paydata = [ 'order_id' => $value['order_id'], 'order_code' => $value['order_code'] ]; // 先 json_encode 后 md5 加密信息 $Paystr = md5(json_encode($Paydata)); // 清除之前的 cookie Cookie::delete($Paystr); // 存入 cookie cookie($Paystr, $Paydata); // 跳转链接 $result['list'][$key]['PaymentUrl'] = urldecode(url('user/Pay/pay_recharge_detail',['paystr'=>$Paystr])); } // 封装取消订单JS $result['list'][$key]['CancelOrder'] = " onclick=\"CancelOrder('{$value['order_id']}');\" "; // 获取订单状态 $order_status_arr = Config::get('global.order_status_arr'); $result['list'][$key]['order_status_name'] = $order_status_arr[$value['order_status']]; // 获取订单支付方式名称 $pay_method_arr = Config::get('global.pay_method_arr'); if (!empty($value['payment_method']) && !empty($value['pay_name'])) { $result['list'][$key]['pay_name'] = !empty($pay_method_arr[$value['pay_name']]) ? $pay_method_arr[$value['pay_name']] : '第三方支付'; } else { if (!empty($value['pay_name'])) { $result['list'][$key]['pay_name'] = !empty($pay_method_arr[$value['pay_name']]) ? $pay_method_arr[$value['pay_name']] : '第三方支付'; } else { $result['list'][$key]['pay_name'] = '在线支付'; } } // 封装订单查询详情链接 $result['list'][$key]['OrderDetailsUrl'] = urldecode(url('user/Shop/shop_order_details',['order_id'=>$value['order_id']])); // 封装订单催发货JS $result['list'][$key]['OrderRemind'] = " onclick=\"OrderRemind('{$value['order_id']}','{$value['order_code']}');\" "; // 封装确认收货JS $result['list'][$key]['Confirm'] = " onclick=\"Confirm('{$value['order_id']}','{$value['order_code']}');\" "; //售后 $result['list'][$key]['ServiceList'] = urldecode(url('user/Shop/service_list', ['order_id' => $value['order_id']])); //评价 $result['list'][$key]['AddProduct'] = urldecode(url('user/ShopComment/comment_list', ['order_id' => $value['order_id']])); // 封装查询物流链接 $result['list'][$key]['LogisticsInquiry'] = $MobileExpressUrl = ''; if (('2' == $value['order_status'] || '3' == $value['order_status']) && empty($value['prom_type'])) { // 物流查询接口 if (isMobile()) { $ExpressUrl = "https://m.kuaidi100.com/index_all.html?type=".$value['express_code']."&postid=".$value['express_order']."&callbackurl=".$ReturnUrl; } else { $ExpressUrl = "https://www.kuaidi100.com/chaxun?com=".$value['express_code']."&nu=".$value['express_order']; } // 微信端、小程序使用跳转方式进行物流查询 $result['list'][$key]['MobileExpressUrl'] = $ExpressUrl; // PC端,手机浏览器使用弹框方式进行物流查询 $result['list'][$key]['LogisticsInquiry'] = " onclick=\"LogisticsInquiry('{$ExpressUrl}');\" "; } $result['list'][$key]['order_amount'] = floatval($value['order_amount']); $result['list'][$key]['order_total_amount'] = floatval($value['order_total_amount']); $result['list'][$key]['shipping_fee'] = is_numeric($value['shipping_fee']) ? floatval($value['shipping_fee']) : $value['shipping_fee']; // 默认为空 $result['list'][$key]['hidden'] = ''; } // 更新产品规格异常的订单,更新为订单过期 if (!empty($OrderIds)) { // 更新订单 $UpData = [ 'order_status' => 4, 'update_time' => getTime() ]; Db::name('shop_order')->where('order_id', 'IN', $OrderIds)->update($UpData); // 追加订单操作记录 AddOrderAction($OrderIds_, $this->users_id, 0, 4, 0, 0, '订单过期!', '规格更新后部分产品规格不存在,订单过期!'); } // 传入JS参数 $data['shop_order_cancel'] = url('user/Shop/shop_order_cancel', ['_ajax'=>1], true, false, 1, 1, 0); $data['shop_member_confirm'] = url('user/Shop/shop_member_confirm'); $data['shop_order_remind'] = url('user/Shop/shop_order_remind'); $data_json = json_encode($data); $version = getCmsVersion(); // 循环中第一个数据带上JS代码加载 $result['list'][0]['hidden'] = << var d62a4a8743a94dc0250be0c53f833b = {$data_json}; EOF; $this->success('请求成功!','',$result); }else{ $this->error('暂无数据!'); } } }