get('q');
$admin_user = Admin::user();
if($admin_user->isAdministrator()){
return WxShopGoods::where('name', 'like', "%$q%")->paginate(null, ['id', 'name as text']);
}else{
if(_empty_($admin_user->uid)){
return WxShopGoods::where('name', 'like', "%$q%")->paginate(null, ['id', 'name as text']);
}else{
return WxShopGoods::where('user_id', $admin_user->uid)->where('name', 'like', "%$q%")->paginate(null, ['id', 'name as text']);
}
}
}
/**
* Make a grid builder.
*
* @return Grid
*/
protected function grid()
{
$admin_user = Admin::user();
$classfyids = WxShopClassify::where('depth', 3)->pluck('name', 'id')->toArray();
$classfyids[0] = '未分类';
$app_coin_name = Settings::get('app_coin_name', '硬币');
return Grid::make(new WxShopGoods(), function (Grid $grid) use ($classfyids, $app_coin_name, $admin_user){
global $__MINI_GLOBAL_IS_ADMIN_SUPER__;
$grid->simplePaginate();
if(!$admin_user->isAdministrator()){
if(_empty_($admin_user->uid)){
$grid->model()->where('id', '<', -1);
}else{
$grid->model()->where('user_id', $admin_user->uid);
}
}
$grid->quickSearch(['id', 'name'])->placeholder('搜索商品ID,名字...');
$grid->model()->orderBy('id', 'desc');
$grid->column('id')->sortable();
$grid->column('user', '商家')->display(function ($v){
if(_empty_($v)){
return '系统自营';
}
return '
'.$v->user_name. '';
});
$grid->column('name')->limit(20);
$grid->column('type')->using(FieldUtils::getShopGoodTypes())->sortable();
// $grid->column('pic');
// $grid->column('tag');
// $grid->column('intro');
$grid->column('vip_price')->display(function ($v) use ($app_coin_name){
if($this->credit_type == 1){
return '¥'.$v;
}else{
return $v.$app_coin_name;
}
})->sortable();
$grid->column('price')->display(function ($v) use ($app_coin_name){
if($this->credit_type == 1){
return '¥'.$v;
}else{
return $v.$app_coin_name;
}
})->sortable();
// $grid->column('content');
$grid->column('views')->sortable()->editable();
$grid->column('buys')->sortable()->editable();
$grid->column('can_purchase_times', '限购次数')->sortable()->editable();
$grid->column('rest_stock', '剩余库存')->display(function (){
return WxShopGoodsProduct::where('goods_id', $this->id)->sum('stock');
});
// $grid->column('sku');
// $grid->column('service_id');
$grid->column('sort')->editable();
// $grid->column('is_inspiration','灵感')->switch()->sortable();
$grid->column('state')->switch()->sortable();
if($__MINI_GLOBAL_IS_ADMIN_SUPER__){
$grid->column('classify_id')->sortable()->select($classfyids);
$grid->column('collect_from_url')->display(function ($v){
if(_empty_($v)){
return '';
}
return '链接';
});
}
// $grid->column('created_at');
// $grid->column('updated_at')->sortable();
$grid->filter(function (Grid\Filter $filter) use ($classfyids){
$filter->equal('id');
$filter->equal('type')->multipleSelect(FieldUtils::getShopGoodTypes());
// $filter->equal('classify_id')->multipleSelect($classfyids);
$filter->like('name');
$filter->equal('classify_id')->multipleSelect($classfyids);
});
$grid->batchActions(function ($batch) {
$batch->add(new GoodsTransferAction());
});
global $__MINI_GLOBAL_IS_ADMIN_SUPER__;
if($__MINI_GLOBAL_IS_ADMIN_SUPER__){
$grid->tools([
new ShopContactButton(),
]);
}
});
}
/**
* Make a show builder.
*
* @param mixed $id
*
* @return Show
*/
protected function detail($id)
{
return Show::make($id, new WxShopGoods(), function (Show $show) {
$show->field('id');
$show->field('name');
$show->field('type');
// $show->field('pic');
// $show->field('tag');
$show->field('intro');
$show->field('vip_price');
$show->field('price');
$show->field('credit_type');
$show->field('content');
$show->field('views');
$show->field('buys');
$show->field('sort');
$show->field('sku');
$show->field('guest_present');
$show->field('service_time_start');
$show->field('service_time_end');
$show->field('url');
$show->field('download_version');
$show->field('question_id');
$show->field('can_purchase_times');
$show->field('users_ledger');
$show->field('classify_id');
// $show->field('service_id');
$show->field('state');
$show->field('collect_from_url');
$show->field('last_sales_at');
$show->field('created_at');
$show->field('updated_at');
});
}
/**
* Make a form builder.
*
* @return Form
*/
protected function form()
{
$app_coin_name = Settings::get('app_coin_name', '硬币');
return Form::make(new WxShopGoods(), function (Form $form) use ($app_coin_name){
global $__MINI_GLOBAL_IS_ADMIN_SUPER__,$__MINI_GLOBAL_CURRENT_USER_ID__;
$modle = $form->model();
$res11 = __system__paycode__tip__(11);
Tooltip::make('.mini_global_admin_open_not_support_tip')
->bottom()
->title($res11['tip']);
$form->display('id');
$form->text('name','商品名称')->required();
if($form->isCreating()){
$form->radio('credit_type', '货币')->options([ 0=> $app_coin_name, 1 => '余额/人民币'])->default(1)->required();
}else{
$form->html(function () use ($modle, $app_coin_name){
return '
编辑模式不可更改货币类型,当前商品货币为:'.($modle->credit_type == 1 ? '余额/人民币' : $app_coin_name).'
';
}, '');
}
$form->text('vip_price','商品VIP价格')->required();
$form->text('price','商品价格')->required();
$form->textarea('intro','商品介绍');
$options = AdminUtils::get_admin_user_shop_classifys();
if(_empty_($options)){
$form->html(function () use ($modle, $app_coin_name, $__MINI_GLOBAL_IS_ADMIN_SUPER__){
if($__MINI_GLOBAL_IS_ADMIN_SUPER__){
return '!!! 当前没有第三层级的商品分类,无法新增商品
';
}else{
return '!!! 当前后台账号无绑定的店铺id,无法新增商品,可联系超级管理员将你的后台账号角色变更为:商城管理员(标识:enterprise_admin)
';
}
}, '');
}else{
$form->select('classify_id','商品分类')->options($options);
}
if($__MINI_GLOBAL_IS_ADMIN_SUPER__){
$form->tags('tag','话题')
->options(['上新','活动','折扣','预售','会员','推荐','特价','京东','淘宝','拼多多', '抖音', '限时', '性价比', '虚拟物品'])
->help('使用,隔开 建议添加1~3个话题');
}
$form->multipleSelect('service_id','服务')
->options(WxShopService::pluck('name','id'));
$form->multipleImage('pic', '图片')->uniqueName()->url('files/uploads')->uniqueName()
->autoUpload()->sortable();
$sku_params = [];
$form->sku('sku', json_encode($sku_params))->display(true)->customFormat(function ($value) use ($form){
if($value){
// 这里是给sku喂数据, 数据格式为
$data = (new WxShopGoods())->where('id',$form->getKey())->value('sku');
if($data){
if($form->isEditing()){
$goods_id = $form->model()->id;
$data = json_decode($data, true);
if($data){
$sku_arr = $data['sku'];
$attrs_arr = $data['attrs'];
if($sku_arr){
for ($i = 0; $i < count($sku_arr); $i++){
$attr_arr = [];
foreach (array_keys($sku_arr[0]) as $key){
if($key == 'pic' || $key == 'stock' || $key == 'vip_price' || $key == 'price'){
continue;
}
$attr_arr[] = $key;
}
$attr_key = '';
if($attr_arr){
foreach ($attr_arr as $attr){
if(!_empty_($attr_key)){
$attr_key .= '_';
}
$attr_key .= $sku_arr[$i][$attr];
}
}
$stock = WxShopGoodsProduct::where('goods_id', $goods_id)->where('param_value', $attr_key )->value('stock');
$data['sku'][$i]['stock'] = $stock;
}
}
}
}
}
return json_encode($data);
}
return null;
});
$form->radio('type')->default(0)->options(FieldUtils::getShopGoodTypes())->when(0, function (Form $form) use ($sku_params) {
})->when(1, function (Form $form){
$form->url('url')->help('普通商品留空,淘客链接填在这里,存在链接的商品无法被购买');
})->when(2, function (Form $form) use ($res11, $modle){
if($form->isCreating()){
$form->textarea('paid_content1', '虚拟付费内容')->help($res11['text'].'用户支付的订单中包含虚拟物品时,订单会增加一个按钮[查看虚拟物品],如果该次订单全部都是虚拟物品,则会自动改变订单为【已发货】状态');
}else{
$form->textarea('paid_content1', '虚拟付费内容')->help($res11['text'].'用户支付的订单中包含虚拟物品时,订单会增加一个按钮[查看虚拟物品],如果该次订单全部都是虚拟物品,则会自动改变订单为【已发货】状态')->value($modle->paid_content);
}
})->when(3, function (Form $form) use ($res11){
$form->url('download_url')->help($res11['text'].'https://开头可访问地址');
$form->text('download_version')->help('编辑修改版本号后,会通知已经购买过的用户');
})->when(4, function (Form $form) use ($res11, $modle){
$form->html(function (){
return '卡密一行一个,每次用户购买后,若卡密全部消耗完毕,则会发送消息提示管理员,并下架该商品
';
}, '');
if($form->isCreating()) {
$form->textarea('paid_content2', '卡密')->help($res11['text'] . '用户支付的订单中包含虚拟物品时,订单会增加一个按钮[查看卡密],如果该次订单全部都是虚拟物品,则会自动改变订单为【已发货】状态');
}else{
$form->textarea('paid_content2', '卡密')->help($res11['text'] . '用户支付的订单中包含虚拟物品时,订单会增加一个按钮[查看卡密],如果该次订单全部都是虚拟物品,则会自动改变订单为【已发货】状态')->value($modle->paid_content);
}
})->when(5, function (Form $form) use ($res11, $modle, $__MINI_GLOBAL_CURRENT_USER_ID__,$__MINI_GLOBAL_IS_ADMIN_SUPER__){
if($__MINI_GLOBAL_IS_ADMIN_SUPER__){
$arr = WxShopContact::pluck('address_name', 'id');
}else{
$arr = WxShopContact::where('user_id', $__MINI_GLOBAL_CURRENT_USER_ID__)->pluck('address_name', 'id');
}
$form->select('contact_id')->options($arr)->help('若没有地址可选,请去前端【我->左侧栏->管理店铺->经营地址->去添加】');
$form->text('scanners')->help('输入员工在前端的uid,多个用英文逗号隔开');
})->required();
if(__system_is_model_enable('laradocs', 'dcat-neditor')){
$form->neditor('content');
}else{
$form->editor('content');
}
if($__MINI_GLOBAL_IS_ADMIN_SUPER__){
$form->multipleSelectTable('question_id')
->title('帮助问题库')
->max(1)
->from(QuestionRender::make())
->model(WxQuestion::class, 'id', 'title', 'selectTable:WxShopGoodsController:question_id');
}
$form->number('can_purchase_times')->help('若每人限购一次,已经购买的用户不会在商品详情页显示[加入购物车]')->default(0);
$res23 = __system__paycode__tip__(23);
Tooltip::make('.mini_global_admin_open_not_support_tip')
->bottom()
->title($res23['tip']);
$users_ledger_flag = false;
if(!$__MINI_GLOBAL_IS_ADMIN_SUPER__){
$users_ledger_flag = true;
}else{
$users_ledger_flag = true;
}
if($users_ledger_flag){
$form->html(function () use ($res23){
return ''.$res23['text'].'注意:
1、是根据订单价格分账,所以请自己计算好利润,用户下单后,分账用户获得的分账会进入冻结中,在确认收货后,会自动解冻。
2、请勿随意设置百分比,因为我们所有商品都是自营,用户分账剩下的才是平台所得,如果你设置分账总和超过100,那么平台会亏损
3、若用户退款,则冻结的余额会被删除
';
}, '');
$form->table('users_ledger','分账用户', function (NestedForm $table) {
$table->select('user_id', '用户')->options(function ($id) {
if($id){
$user = \App\Models\User\WxUser::find($id);
if ($user) {
return [$user->id => $user->user_name];
}
}
})->ajax('select/users')->required();
$table->rate('rate', '百分比');
});
$form->divider();
}
$form->text('guest_present')->help('填嘉宾的用户id,用英文逗号隔开');
// $form->multipleSelect('guest_present')->options(function ($ids) {
// if($ids){
// $res = [];
// foreach ($ids as $id){
// $user = \App\Models\User\WxUser::find($id);
// if ($user) {
// $res[$user->id] = $user->user_name;
// }
// }
// return $res;
// }
// })->ajax('select/users')->help('在商品详情页可以展示几个用户');
$form->divider();
$form->html(function () use ($res23){
return '时间仅仅起提示作用,为用户展示您的服务时间,无实际作用,一般与核销一同使用
';
}, '');
$form->dateRange('service_date_start', 'service_date_end', '服务日期')->help('如果您的服务日期是每天,则留空,如果不是日期范围,而是具体的某一天,则只用配置开始日期');
$form->timeRange('service_time_start', 'service_time_end', '服务时间')->help('如果您的服务时间是全天,则留空');
$form->divider();
if($__MINI_GLOBAL_IS_ADMIN_SUPER__){
$form->text('views')->default(0);
$form->text('buys')->default(0);
$form->number('sort');
}
// $form->switch('is_inspiration');
$form->switch('state')->default(1);
$form->datetime('last_sales_at')->default('2099-01-01 00:00:00');
if ($form->isEditing()) {
$id = $form->getKey();
$form->action('shop/save_goods/'.$id);
}else{
$form->action('shop/add_goods');
}
});
}
function isValidDateTime($dateTime) {
$format = 'Y-m-d H:i:s';
$d = DateTime::createFromFormat($format, $dateTime);
return $d && $d->format($format) == $dateTime;
}
public function safe_add(Request $request){
global $__MINI_GLOBAL_IS_ADMIN_SUPER__;
$__MINI_GLOBAL_IS_ADMIN_SUPER__ = true;
$collect_from_url = _empty_default_($request->collect_from_url, '');
if(_empty_($collect_from_url)){
return JsonResponse::make()->warning('未提交collect_from_url字段值');
}
$exists = WxShopGoods::where('collect_from_url', $collect_from_url)->first();
if($exists){
return JsonResponse::make()->warning('collect_from_url已经存在对应的商品,商品id为:'.$exists->id);
}
return $this->add($request);
}
public function add(Request $request){
global $__MINI_GLOBAL_IS_ADMIN_SUPER__,$__MINI_GLOBAL_CURRENT_USER_ID__;
$input = $request->all();
$collect_from_url = _empty_default_($request->collect_from_url, '');
if(_empty_($input['last_sales_at'])){
$input['last_sales_at'] = '2099-01-01 00:00:00';
}
if($this->isValidDateTime($input['last_sales_at'])){
}else{
$input['last_sales_at'] = '2099-01-01 00:00:00';
}
if($input['type'] == 2 || $input['type'] == 4){
if($input['type'] == 2){
$input['paid_content'] = $input['paid_content1'];
}else if($input['type'] == 4){
$input['paid_content'] = $input['paid_content2'];
}
}else{
$input['paid_content'] = '';
}
foreach (['service_date_start','service_date_end','service_time_start','service_time_end'] as $key){
if(_empty_($input[$key])){
$input[$key] = null;
}
}
if($input['service_date_end']){
if($input['service_date_start'] >= $input['service_date_end']){
$input['service_date_end'] = null;
$input['service_date_start'] = null;
}
}
if(_empty_($input['service_date_start'])){
$input['service_date_end'] = null;
}
if(_empty_($input['service_time_start']) || $input['service_time_start'] > $input['service_time_end']){
$input['service_time_end'] = null;
$input['service_time_start'] = null;
}
$guest_present = _empty_default_($input['guest_present'], '');
if(is_string($guest_present)){
$guest_present = explode(',', $guest_present);
}
if(is_array($guest_present)){
$guest_present = array_values($guest_present);
if($guest_present){
if(_empty_(end($guest_present))){
array_pop($guest_present);
}
foreach ($guest_present as $gid){
if(!(WxUser::where('id', $gid)->exists())){
return JsonResponse::make()->error('您配置的嘉宾不存在');
}
}
}else{
$guest_present = [];
}
}else{
$guest_present = [];
}
if(_empty_($guest_present)){
$guest_present = [];
}
if($input['type'] == 5){
if(_empty_(_array_key($input, 'contact_id', 0))){
return JsonResponse::make()->error('核销类商品必须添加经营地址');
}
if(!$__MINI_GLOBAL_IS_ADMIN_SUPER__){
if(WxShopContact::where('id', $input['contact_id'])->value('user_id') != $__MINI_GLOBAL_CURRENT_USER_ID__){
return JsonResponse::make()->error('您添加的经营地址不属于您');
}
}
if(!_empty_(_array_key($input, 'scanners', ''))){
$input['scanners'] = trim($input['scanners'], ',');
$scanners_arr = explode(',', $input['scanners']);
foreach ($scanners_arr as $scanner){
if(!(WxUser::where('id', $scanner)->exists())){
return JsonResponse::make()->error('您添加的核销员,uid为'.$scanner.'实际不存在');
}
}
}
}else{
$input['contact_id'] = null;
$input['scanners'] = '';
}
if($__MINI_GLOBAL_IS_ADMIN_SUPER__){
$tag = $input['tag'];
unset($tag[count($tag)-1]);
}else{
$tag = [];
}
$service = $input['service_id'];
unset($service[count($service)-1]);
$options = AdminUtils::get_admin_user_shop_classifys();
if(_empty_($options)){
if($__MINI_GLOBAL_IS_ADMIN_SUPER__){
return JsonResponse::make()->error('当前没有第3层级的商品分类,无法新增商品');
}else{
return JsonResponse::make()->error('当前后台账号无绑定的店铺,无法新增商品');
}
}else if(!in_array(_array_key($input, 'classify_id', 0), array_keys($options))){
return JsonResponse::make()->error('店铺的经营分类未包含当前所选的商品分类');
}
if(!$__MINI_GLOBAL_IS_ADMIN_SUPER__){
$shop = AdminUtils::get_admin_shop();
if($shop->margin_rest < $shop->margin_least){
return JsonResponse::make()->error('您店铺的保证金不足,无法发布新商品');
}
}
$users_ledger_flag = false;
if(!$__MINI_GLOBAL_IS_ADMIN_SUPER__){
$users_ledger_flag = true;
}else{
$users_ledger_flag = true;
}
if($users_ledger_flag){
$users_ledger = AdminUtils::_table_data($request->input('users_ledger'));
}else{
$users_ledger = '[]';
}
$credit_type = $input['credit_type'] == 1 ? 1 : 0;
DB::beginTransaction();
try {
// todo:
$GoodsModel = new WxShopGoods();
$GoodsModel->type = $input['type'];
if(!$__MINI_GLOBAL_IS_ADMIN_SUPER__){
if($__MINI_GLOBAL_CURRENT_USER_ID__ > 0){
$GoodsModel->user_id = $__MINI_GLOBAL_CURRENT_USER_ID__;
$GoodsModel->shop_id = WxUser::where('id', $__MINI_GLOBAL_CURRENT_USER_ID__)->value('shop_id');
}
}
$GoodsModel->name = $input['name'];
$GoodsModel->pic = $input['pic'];
$GoodsModel->vip_price = $credit_type == 1 ? $input['vip_price'] : (int)$input['vip_price'];
$GoodsModel->price = $credit_type == 1 ? $input['price'] : (int)$input['price'];
$GoodsModel->credit_type = $credit_type;
$GoodsModel->classify_id = $input['classify_id'];
$GoodsModel->content = $input['content'];
$GoodsModel->views = $__MINI_GLOBAL_IS_ADMIN_SUPER__ ? ($input['views'] ?: 0) : 0;
$GoodsModel->buys = $__MINI_GLOBAL_IS_ADMIN_SUPER__ ? ($input['buys'] ?: 0 ) : 0;
$GoodsModel->state = $input['state'];
$GoodsModel->sku = $input['sku'];
$GoodsModel->contact_id = $input['contact_id'];
$GoodsModel->scanners = $input['scanners'];
$GoodsModel->url = $input['url'];
$GoodsModel->download_version = $input['download_version'];
$GoodsModel->download_url = $input['download_url'];
$GoodsModel->question_id = $__MINI_GLOBAL_IS_ADMIN_SUPER__ ? $input['question_id'] : 0;
$GoodsModel->can_purchase_times = $input['type'] == 1 ? 0 : $input['can_purchase_times'];
$GoodsModel->paid_content = $input['paid_content'];
$GoodsModel->intro = $input['intro'];
$GoodsModel->service_id = json_encode($service);
if($users_ledger){
$GoodsModel->users_ledger = $users_ledger;
}
$GoodsModel->tag = json_encode($tag);
$GoodsModel->last_sales_at = $input['last_sales_at'];
if($guest_present){
$GoodsModel->guest_present = implode(',', $guest_present);
}
if(!_empty_($input['service_date_start'])){
$GoodsModel->service_date_start = $input['service_date_start'];
}
if(!_empty_($input['service_date_end'])){
$GoodsModel->service_date_end = $input['service_date_end'];
}
if(!_empty_($input['service_time_start'])){
$GoodsModel->service_time_start = $input['service_time_start'];
}
if(!_empty_($input['service_time_end'])){
$GoodsModel->service_time_end = $input['service_time_end'];
}
if($collect_from_url){
$GoodsModel->collect_from_url = $collect_from_url;
}
$GoodsModel->save();
$goods_id = $GoodsModel->id;
// 保存产品
$params = json_decode($input['sku'],true);
$sku = $params['sku'];
$attrs = $params['attrs'];
$attrsArr = array_values($attrs);
$attrsArr = $this->brush([],$attrsArr);
$productData = [];
foreach ($attrsArr as $k=>$v){
if($credit_type == 1){
if(_empty_($sku[$k]['vip_price']) || _empty_($sku[$k]['price'])){
DB::rollBack();
return JsonResponse::make()->error('SKU未设置价格!');
}
}else{
if(_empty_((int)$sku[$k]['vip_price']) || _empty_((int)$sku[$k]['price'])){
DB::rollBack();
return JsonResponse::make()->error('SKU未设置价格!');
}
}
$productData[] = [
'goods_id' => $goods_id,
'vip_price'=>$credit_type == 1 ? $sku[$k]['vip_price'] : (int)$sku[$k]['vip_price'],
'price'=>$credit_type == 1 ? $sku[$k]['price'] : (int)$sku[$k]['price'],
'stock'=>$sku[$k]['stock'],
'pic'=>$sku[$k]['pic'] ?? $input['pic'],
'param_value'=>$v,
'created_at'=>date('Y-m-d H:i:s'),
'credit_type' => $credit_type
];
}
(new WxShopGoodsProduct())->batchAdd($productData);
DB::commit();
return JsonResponse::make()->success('成功!')->redirect('shop/goods');
} catch (\Exception $e) {
DB::rollBack();
_logger_(__file__, __line__, $e->getMessage());
return JsonResponse::make()->error('保存出错!');
}
}
public function delte_goods_product($goods_id){
$product_ids = WxShopGoodsProduct::where('goods_id',$goods_id)->pluck('id')->toArray();
if(_empty_($product_ids)){
$product_ids = [];
}
$app_luck_draw = Settings::get('app_luck_draw', []);
if($app_luck_draw){
$luck_draw_flag = false;
$luck_dray_names = [];
$app_luck_draw_new = [];
$app_luck_draw_disable = [];
for ($i = 0; $i < count($app_luck_draw); $i ++){
if($app_luck_draw[$i]['type'] == 3){
if(in_array(_array_key($app_luck_draw[$i], 'product', 0), $product_ids)){
$luck_draw_flag = true;
$luck_dray_names[] = $app_luck_draw[$i]['name'];
$app_luck_draw[$i]['product'] = '';
$app_luck_draw_disable[] = $app_luck_draw[$i];
continue;
}
}
$app_luck_draw_new[] = $app_luck_draw[$i];
}
if($luck_draw_flag){
Settings::set('app_luck_draw', json_encode($app_luck_draw_new), true);
UserUtils::assistant_notice('admin', '你配置的抽奖转盘中,存在商品规格['.implode(',',$luck_dray_names).']失效,原因是你修改了原商品,需要你在后台重新配置,原配置请看下方提示, 点击可前往抽奖页面');
foreach ($app_luck_draw_disable as $item){
UserUtils::assistant_notice('admin', 'id: '.$item['id'].'
'. '图片:'.$item['img'].'
'. '奖项名称:'.$item['name'].'
'. '权重:'.$item['weight'].'
'. '奖励类型:'.$item['type'].'
'. '奖励数量:'.$item['num']);
}
}
}
WxShopGoodsProduct::where('goods_id',$goods_id)->delete();
WxShopCart::where('goods_id', $goods_id)->where('state', 0)->update(['state'=>3]);
}
public function safe_save(Request $request,$goods_id){
global $__MINI_GLOBAL_IS_ADMIN_SUPER__;
$__MINI_GLOBAL_IS_ADMIN_SUPER__ = true;
return $this->save($request, $goods_id);
}
public function save(Request $request,$goods_id){
global $__MINI_GLOBAL_IS_ADMIN_SUPER__,$__MINI_GLOBAL_CURRENT_USER_ID__;
$input = $request->all();
if(_empty_($input['last_sales_at'])){
$input['last_sales_at'] = '2099-01-01 00:00:00';
}
if($this->isValidDateTime($input['last_sales_at'])){
}else{
$input['last_sales_at'] = '2099-01-01 00:00:00';
}
if($input['type'] == 2 || $input['type'] == 4){
if($input['type'] == 2){
$input['paid_content'] = $input['paid_content1'];
}else if($input['type'] == 4){
$input['paid_content'] = $input['paid_content2'];
}
}else{
$input['paid_content'] = '';
}
foreach (['service_date_start','service_date_end','service_time_start','service_time_end'] as $key){
if(_empty_($input[$key])){
$input[$key] = null;
}
}
if($input['service_date_end']){
if($input['service_date_start'] >= $input['service_date_end']){
$input['service_date_end'] = null;
$input['service_date_start'] = null;
}
}
if(_empty_($input['service_date_start'])){
$input['service_date_end'] = null;
}
if(_empty_($input['service_time_start']) || $input['service_time_start'] > $input['service_time_end']){
$input['service_time_end'] = null;
$input['service_time_start'] = null;
}
$guest_present = _empty_default_($input['guest_present'], []);
if(is_string($guest_present)){
$guest_present = explode(',', $guest_present);
}
if(is_array($guest_present)){
$guest_present = array_values($guest_present);
if($guest_present){
if(_empty_(end($guest_present))){
array_pop($guest_present);
}
foreach ($guest_present as $gid){
if(!(WxUser::where('id', $gid)->exists())){
return JsonResponse::make()->error('您配置的嘉宾不存在');
}
}
}else{
$guest_present = [];
}
}else{
$guest_present = [];
}
if(_empty_($guest_present)){
$guest_present = [];
}
if($input['type'] == 5){
if(_empty_(_array_key($input, 'contact_id', 0))){
return JsonResponse::make()->error('核销类商品必须添加经营地址');
}
if(!$__MINI_GLOBAL_IS_ADMIN_SUPER__){
if(WxShopContact::where('id', $input['contact_id'])->value('user_id') != $__MINI_GLOBAL_CURRENT_USER_ID__){
return JsonResponse::make()->error('您添加的经营地址不属于您');
}
}
if(!_empty_(_array_key($input, 'scanners', ''))){
$scanners_arr = explode(',', $input['scanners']);
foreach ($scanners_arr as $scanner){
if(!(WxUser::where('id', $scanner)->exists())){
return JsonResponse::make()->error('您添加的核销员,uid为'.$scanner.'实际不存在');
}
}
}
}else{
$input['contact_id'] = null;
}
$options = AdminUtils::get_admin_user_shop_classifys();
if(_empty_($options)){
if($__MINI_GLOBAL_IS_ADMIN_SUPER__){
return JsonResponse::make()->error('当前没有第3层级的商品分类,无法新增商品');
}else{
return JsonResponse::make()->error('当前后台账号无绑定的店铺,无法新增商品');
}
}else if(!in_array($input['classify_id'], array_keys($options))){
return JsonResponse::make()->error('店铺的经营分类未包含当前所选的商品分类');
}
if($request['_method']){
if($__MINI_GLOBAL_IS_ADMIN_SUPER__){
$tag = $input['tag'];
unset($tag[count($tag)-1]);
}else{
$tag = [];
}
$users_ledger_flag = false;
if(!$__MINI_GLOBAL_IS_ADMIN_SUPER__){
$users_ledger_flag = true;
}else{
$users_ledger_flag = true;
}
if($users_ledger_flag){
$users_ledger = AdminUtils::_table_data(_array_key($input, 'users_ledger', []));
}else{
$users_ledger = '[]';
}
DB::beginTransaction();
$WxShopGoods = WxShopGoods::find($goods_id);
$credit_type = $WxShopGoods->credit_type;
if(!$__MINI_GLOBAL_IS_ADMIN_SUPER__){
if($__MINI_GLOBAL_CURRENT_USER_ID__ != $WxShopGoods->user_id){
return JsonResponse::make()->error('你不是当前商品的发布者');
}
}
try {
// todo:
// 删除原有产品
$this->delte_goods_product($goods_id);
$updates = [
'type' => $input['type'],
'name'=>$input['name'],
'pic'=>$input['pic'],
'vip_price'=>$input['vip_price'],
'price'=>$input['price'],
'intro'=>$input['intro'],
'content'=>$input['content'],
'paid_content'=>$input['paid_content'],
'state'=>$input['state'],
'sku'=>$input['sku'],
'contact_id' => $input['contact_id'],
'scanners' => $input['scanners'],
'url'=>$input['url'],
'download_version'=>$input['download_version'],
'download_url'=>$input['download_url'],
'question_id'=>$__MINI_GLOBAL_IS_ADMIN_SUPER__ ? $input['question_id'] : 0,
'can_purchase_times'=>$input['can_purchase_times'],
'tag'=> json_encode($tag),
'classify_id'=>$input['classify_id'],
'service_id'=>$input['service_id'],
'users_ledger' => $users_ledger,
'last_sales_at' => $input['last_sales_at'],
];
if($__MINI_GLOBAL_IS_ADMIN_SUPER__){
$updates['views'] = $input['views'];
$updates['buys'] = $input['buys'];
}
if($guest_present){
$updates['guest_present'] = implode(',', $guest_present);
}
if(!_empty_($input['service_date_start'])){
$updates['service_date_start'] = $input['service_date_start'];
}
if(!_empty_($input['service_date_end'])){
$updates['service_date_end'] = $input['service_date_end'];
}
if(!_empty_($input['service_time_start'])){
$updates['service_time_start'] = $input['service_time_start'];
}
if(!_empty_($input['service_time_end'])){
$updates['service_time_end'] = $input['service_time_end'];
}
// 更新商品
(new WxShopGoods())->where('id',$goods_id)
->update($updates);
$params = json_decode($input['sku'],true);
$sku = $params['sku'];
$attrs = $params['attrs'];
$attrsArr = array_values($attrs);
$attrsArr = $this->brush([],$attrsArr);
$productData = [];
foreach ($attrsArr as $k=>$v){
if(_empty_($sku[$k]['vip_price']) || _empty_($sku[$k]['price'])){
DB::rollBack();
return JsonResponse::make()->error('SKU未设置价格!');
}
$productData[] = [
'goods_id' => $goods_id,
'vip_price'=>$sku[$k]['vip_price'],
'price'=>$sku[$k]['price'],
'stock'=>$sku[$k]['stock'],
'pic'=>$sku[$k]['pic'],
'param_value'=>$v,
'created_at'=>date('Y-m-d H:i:s'),
'credit_type' => $credit_type
];
}
(new WxShopGoodsProduct())->batchAdd($productData);
DB::commit();
return JsonResponse::make()->success('成功!')->redirect('shop/goods');
} catch (\Exception $e) {
DB::rollBack();
_logger_(__file__, __line__, $e->getMessage());
return JsonResponse::make()->error('保存失败!');
}
}
}
public function brush($res = [], $arr = [])
{
if (_empty_($res)) $res = (array)array_shift($arr);
if (_empty_($arr)) return $res;
$current = array_shift($arr); # 接下来要参与计算的一组属性
$last = [];
foreach ($res as $row => $row_val) { # 循环上一次已经算出的集合
foreach ($current as $col => $col_val) {
$last[] = $row_val . '_' . $col_val;
}
}
return $this->brush($last,$arr); # 递归处理, 直到$arr滚到最后一组属性
}
/**
* 上传商品规格图片
*
* @param Request $request
*
* @return string[]
*/
public function skuImage(Request $request)
{
if ($request->hasFile('file')) {
$file = $request->file('file');
$path = UploadHandler::handle($file);
return ['url' => $path['url']];
// // 返回格式
// $disk = Storage::disk('cosv5');
// $url = 'sku';
// $res = $disk->put($url, $file);
// return ['url' => config('filesystems.disks.cosv5.cdn') .'/'. $res];
}
return [];
}
}