* 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 {
private $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;
}
public function home()
{
$this->redirect(url('Statistics/index'));
exit;
}
/**
* 商城设置
*/
public function conf(){
if (IS_POST) {
$post = input('post.');
if (!empty($post)) {
/*邮件提醒*/
$smtp['smtp_shop_order_pay'] = !empty($post['smtp_shop_order_pay']) ? 1 : 0;
$smtp['smtp_shop_order_send'] = !empty($post['smtp_shop_order_send']) ? 1 : 0;
tpCache('smtp', $smtp);
unset($post['smtp_shop_order_pay']);
unset($post['smtp_shop_order_send']);
/*END*/
$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);
}
$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()
{
// 初始化数组和条件
$list = array();
$Where = [
'lang' => $this->admin_lang,
];
// 订单号查询
$order_code = input('order_code/s');
if (!empty($order_code)) $Where['order_code'] = array('LIKE', "%{$order_code}%");
// 订单状态查询
$order_status = input('order_status/s');
if (!empty($order_status)) $Where['order_status'] = 10 == $order_status ? 0 : $order_status;
// 查询满足要求的总记录数
$count = $this->shop_order_db->where($Where)->count('order_id');
// 实例化分页类 传入总记录数和每页显示的记录数
$pageObj = new Page($count, config('paginate.list_rows'));
// 订单主表数据查询
$list = $this->shop_order_db->where($Where)
->order('order_id desc')
->limit($pageObj->firstRow.','.$pageObj->listRows)
->select();
// 分页显示输出
$pageStr = $pageObj->show();
// 获取订单状态
$admin_order_status_arr = Config::get('global.admin_order_status_arr');
// 获取订单方式名称
$pay_method_arr = Config::get('global.pay_method_arr');
// 订单状态筛选数组
$OrderStatus = array(
0 => array(
'order_status' => '1',
'status_name' => '待发货',
),
1 => array(
'order_status' => '2',
'status_name' => '已发货',
),
2 => array(
'order_status' => '3',
'status_name' => '已完成',
),
);
// 数据加载
$this->assign('pageObj', $pageObj);
$this->assign('list', $list);
$this->assign('pageStr', $pageStr);
$this->assign('admin_order_status_arr',$admin_order_status_arr);
$this->assign('pay_method_arr',$pay_method_arr);
$this->assign('OrderStatus', $OrderStatus);
/*检测是否存在订单中心模板*/
if ('v1.0.1' > getVersion('version_themeshop') && !empty($this->UsersConfigData['shop_open'])) {
$is_syn_theme_shop = 1;
} else {
$is_syn_theme_shop = 0;
}
$this->assign('is_syn_theme_shop',$is_syn_theme_shop);
/*--end*/
return $this->fetch();
}
/**
* 订单详情
*/
public function order_details()
{
$order_id = input('param.order_id');
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) {
if ('0' == $value['action_user']) {
// 若action_user为0,表示会员操作,根据订单号中的ID获取会员名。
$username = $this->users_db->field('username')->where('users_id',$value['users_id'])->find();
$Action[$key]['username'] = '会 员: '.$username['username'];
}else{
// 若action_user不为0,表示管理员操作,根据ID获取管理员名。
$user_name = Db::name('admin')->field('user_name')->where('admin_id',$value['action_user'])->find();
$Action[$key]['username'] = '管理员: '.$user_name['user_name'];
}
// 操作时,订单发货状态
$Action[$key]['express_status'] = '未发货';
if ('1' == $value['express_status']) {
$Action[$key]['express_status'] = '已发货';
}
// 操作时,订单付款状态
$Action[$key]['pay_status'] = '未支付';
if ('1' == $value['pay_status']) {
$Action[$key]['pay_status'] = '已支付';
}
}
$this->assign('Action', $Action);
return $this->fetch('order_details');
}else{
$this->error('非法访问!');
}
}
/**
* 订单发货
*/
public function order_send()
{
$order_id = input('param.order_id');
if ($order_id) {
// 查询订单信息
$this->GetOrderData($order_id);
return $this->fetch('order_send');
}
}
/**
* 订单发货操作
*/
public function order_send_operating()
{
if (IS_POST) {
$post = input('post.');
// 条件数组
$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(),
'note' => $post['note'],
'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);
$this->success('发货成功', null, $Result);
} else {
$this->error('发货失败');
}
}
}
/**
* 查询快递名字及Code
*/
public function order_express()
{
$ExpressData = array();
$Where = array();
$keywords = input('keywords/s');
if (!empty($keywords)) {
$Where['express_name'] = array('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();
$pageStr = $pageObj->show();
$this->assign('ExpressData', $ExpressData);
$this->assign('pageStr', $pageStr);
$this->assign('pageObj', $pageObj);
return $this->fetch('order_express');
}
/**
* 管理员后台标记订单状态
*/
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)) {
// 同步删除订单下的产品
$this->shop_order_details_db->where($Where)->delete();
// 同步删除订单下的操作记录
$this->shop_order_log_db->where($Where)->delete();
$this->success('删除成功!');
}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';
/*用于添加订单操作记录*/
$order_status = '1'; // 订单状态
$express_status = '0'; // 发货状态
$pay_status = '1'; // 支付状态
$action_desc = '付款成功!'; // 操作明细
$action_note = '管理员确认订单付款!'; // 操作备注
/*结束*/
}else if ('ysh' == $post['status_name']) {
// 订单确认收货,追加更新数组
$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);
}
$this->success('操作成功!');
}
}
}else{
$this->error('非法访问!');
}
}
/*
* 更新管理员备注
*/
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 = M('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)
{
// 获取订单数据
$OrderData = $this->shop_order_db->find($order_id);
// 获取会员数据
$UsersData = $this->users_db->find($OrderData['users_id']);
// 当前单条订单信息的会员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;
// 处理订单详细表数据处理
foreach ($DetailsData as $key => $value) {
if ($value['prom_type'] == 1) {
$OrderData['prom_type_virtual'] = true;
}
// 产品属性处理
$ValueData = unserialize($value['data']);
// 规制值
$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'] = $value['product_price'] * $value['num'];
$DetailsData[$key]['litpic'] = handle_subdir_pic($DetailsData[$key]['litpic']); // 支持子目录
}
// 订单类型
if (empty($OrderData['prom_type'])) {
$OrderData['prom_type_name'] = '普通订单';
}else{
$OrderData['prom_type_name'] = '虚拟订单';
}
// 移动端查询物流链接
$MobileExpressUrl = "//m.kuaidi100.com/index_all.html?type=".$OrderData['express_code']."&postid=".$OrderData['express_order'];
// 加载数据
$this->assign('MobileExpressUrl', $MobileExpressUrl);
$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);
}
// 检测并第一次从官方同步订单中心的前台模板
public function ajax_syn_theme_shop()
{
$msg = '下载订单中心模板包异常,请第一时间联系技术支持,排查问题!';
$shopLogic = new ShopLogic;
$data = $shopLogic->syn_theme_shop();
if (true !== $data) {
if (1 <= intval($data['code'])) {
$this->success('初始化成功!', url('Shop/index'));
} else {
if (is_array($data)) {
$msg = $data['msg'];
}
}
}
getUsersConfigData('shop', ['shop_open' => 0]);
$this->error($msg);
}
// ------------------------------------------------------------------------------------------------------
// 以下所有代码都是产品规格处理逻辑 2019-07-08 陈风任
// ------------------------------------------------------------------------------------------------------
// 规格列表管理,包含新增、更新
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;
// 排序号
$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]['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 = [];
foreach ($post['preset_old'] as $key => $value) {
// 规格名称不允许为空
$preset_name = $post['preset_name_old_'.$value][0];
if (empty($preset_name)) continue;
// 排序号
$sort_order = $post['sort_order_'.$value];
// 拼装三维数组
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;
}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]['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);
$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] .= "";
if(!empty($value)){
foreach($value as $sub_value){
$result[$key] .= "";
}
}
}
$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; $iProductSpecLogic->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 = '规格标签缺少变量:
'.implode(', ', $ResultData).'
请检查模板核实后再次验证!';
}
// 更新关闭多规格
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/smtp'));
} else {
// tpCache('smtp', [input('post.field') => 1]);
$this->success('配置完成');
}
}
}