jh-admin/addon/cardservice/shop/controller/Card.php

502 lines
26 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
/**
* SaaSMall商城系统 - 团队十年电商经验汇集巨献!
* =========================================================
* Copy right 2019-2029 成都SAAS云科技有限公司, 保留所有权利。
* ----------------------------------------------
* 官方网址: https://www.gobuysaas.com
* =========================================================
*/
namespace addon\cardservice\shop\controller;
use addon\cardservice\model\CardGoods;
use addon\cardservice\model\MemberCard as MemberCardModel;
use addon\form\model\Form;
use addon\aliapp\model\MinCode;
use addon\cardservice\model\AliGoodsTemplate;
use app\model\goods\Goods as GoodsModel;
use app\model\goods\GoodsService as GoodsServiceModel;
use app\model\store\Store as StoreModel;
use app\model\web\Config as ConfigModel;
use app\shop\controller\BaseShop;
/**
* 虚拟商品
* Class Virtualgoods
* @package app\shop\controller
*/
class Card extends BaseShop
{
protected $replace = [
'ADDON_CARDSERVICE_CSS' => __ROOT__ . '/addon/cardservice/shop/view/public/css',
'ADDON_CARDSERVICE_JS' => __ROOT__ . '/addon/cardservice/shop/view/public/js',
'ADDON_CARDSERVICE_IMG' => __ROOT__ . '/addon/cardservice/shop/view/public/img',
];
/**
* 添加商品
* @return mixed
*/
public function addGoods()
{
if (request()->isAjax()) {
$category_id = input("category_id", 0);// 分类id
$category_json = json_encode($category_id);//分类字符串
$category_id = '';
$data = [
'goods_name' => input("goods_name", ""),// 商品名称,
'goods_attr_class' => input("goods_attr_class", ""),// 商品类型id,
'goods_attr_name' => input("goods_attr_name", ""),// 商品类型名称,
'is_limit' => input("is_limit", "0"),// 商品是否限购,
'limit_type' => input("limit_type", "1"),// 商品限购类型,
'site_id' => $this->site_id,
'category_id' => $category_id,
'category_json' => $category_json,
'goods_image' => input("goods_image", ""),// 商品主图路径
'goods_content' => input("goods_content", ""),// 商品详情
'goods_state' => input("goods_state", ""),// 商品状态1.正常0下架
'price' => input("price", 0),// 商品价格取第一个sku
'renew_price' => input("renew_price", 0), // 续费价格
'market_price' => input("market_price", 0),// 市场价格取第一个sku
'cost_price' => input("cost_price", 0),// 成本价取第一个sku
'sku_no' => input("sku_no", ""),// 商品sku编码
'weight' => input("weight", ""),// 重量
'volume' => input("volume", ""),// 体积
'goods_stock' => input("goods_stock", 0),// 商品库存(总和)
'goods_stock_alarm' => input("goods_stock_alarm", 0),// 库存预警
'goods_spec_format' => input("goods_spec_format", ""),// 商品规格格式
'goods_attr_format' => input("goods_attr_format", ""),// 商品参数格式
'introduction' => input("introduction", ""),// 促销语
'keywords' => input("keywords", ""),// 关键词
'unit' => input("unit", ""),// 单位
'sort' => input("sort", 0),// 排序,
'video_url' => input("video_url", ""),// 视频
'goods_sku_data' => input("goods_sku_data", ""),// SKU商品数据
'goods_service_ids' => input("goods_service_ids", ''),// 商品服务id集合
'label_id' => input("label_id", ''),// 商品分组id
'brand_id' => input("brand_id", 0),//品牌id
'virtual_sale' => input("virtual_sale", 0),// 虚拟销量
'max_buy' => input("max_buy", 0),// 限购
'min_buy' => input("min_buy", 0),// 起售
'recommend_way' => input('recommend_way', 0), // 推荐方式1新品2精品3推荐
'timer_on' => strtotime(input('timer_on', 0)),//定时上架
'timer_off' => strtotime(input('timer_off', 0)),//定时下架
'is_consume_discount' => input('is_consume_discount', 0),//是否参与会员折扣
'qr_id' => input('qr_id', 0),// 社群二维码id
'template_id' => input('template_id', 0), // 商品海报id
'sale_show' => input('sale_show', 0),//
'stock_show' => input('stock_show', 0),//
'market_price_show' => input('market_price_show', 0),//
'barrage_show' => input('barrage_show', 0),//
'form_id' => input('form_id', 0),
'sale_channel' => input('sale_channel', 'all'),
'sale_store' => input('sale_store', 'all'),
'card_type' => input('card_type', ''),
'validity_type' => input('validity_type', 0),
'discount_goods_type' => input('discount_goods_type', 'all'),
'discount' => input('discount', 0),
'common_num' => input('common_num', 0),
'relation_goods' => input('relation_goods', '[]'),
'is_unify_pirce' => input('is_unify_pirce', 1),
'is_cloud_zmxx' => input('is_cloud_zmxx', 0),
'discount_type' => input('discount_type', 1),
'cloud_card_type' => input('cloud_card_type', 'discount_week'),
'downPaymentPeriods' => input('downPaymentPeriods', 0),
'downPayment' => input('downPayment', 0),
'downPaymentDate' => input('downPaymentDate', 0),
'perPeriodPriceArray' => input('perPeriodPriceArray'),
'use_rule' => input('use_rule'),
'periods' => input('periods'),
'card_template_id' => input('card_template_id', ''),
'change_type' => input('change_type', ''),
'least_period' => input('least_period', 0),
'is_alipay_public' => input('is_alipay_public', 0),
'alipay_cat_id' => input('alipay_cat_id', 0),
'is_zmxx' => 0,
];
if ($data['is_cloud_zmxx'] && !$data['use_rule']) return error(-1, '使用规则不能为空');
if ($data['is_cloud_zmxx'] && !$data['periods']) return error(-1, '请输入扣款次数');
if ($data['is_cloud_zmxx']) {
$data['is_zmxx'] = 1;
$periods = $data['periods'] ?: $data['common_num'];
$num_price = $data['price'] / $periods;
$market_price = $data['market_price'] / $data['periods'];
$data['average_original_price'] = $market_price;
$data['average_discount_price'] = $num_price;
if ($data['discount_type'] == 1) {
if ($num_price < $data['downPayment']) return error(-1, '前期优惠价格必须小于平均优惠价格');
} else {
$downPaymentPeriods = str_replace('', ',', $data['downPaymentPeriods']);
$PaymentPeriods = explode(',', $downPaymentPeriods);
if (count($PaymentPeriods) >= $data['periods']) return error(-1, '后期优惠次数不能大于总次数');
$current = current($PaymentPeriods);
while ($next = next($PaymentPeriods)) {
if ($next > $current) {
return error(-1, '后期优惠价格必须小于或者等与前一期价格');
}
$current = $next;
}
}
}
if ($data['validity_type'] == 1) {
$data['validity_day'] = input("validity_day", 0);
} else if ($data['validity_type'] == 2) {
$data['validity_time'] = strtotime(input("validity_time", ''));
}
$virtual_goods_model = new CardGoods();
$res = $virtual_goods_model->addGoods($data);
return $res;
} else {
$virtual_goods_model = new CardGoods();
// 商品服务
$goods_service_model = new GoodsServiceModel();
$service_list = $goods_service_model->getServiceList([['site_id', '=', $this->site_id]], 'id,service_name,icon')['data'];
$this->assign("service_list", $service_list);
//商品默认排序值
$config_model = new ConfigModel();
$sort_config = $config_model->getGoodsSort($this->site_id);
$sort_config = $sort_config['data']['value'];
$this->assign("sort_config", $sort_config);
//获取商品海报
$poster_list = event('PosterTemplate', ['site_id' => $this->site_id], true);
if (!empty($poster_list)) {
$poster_list = $poster_list['data'];
}
$this->assign('poster_list', $poster_list);
$this->assign('virtualcard_exit', addon_is_exit('virtualcard', $this->site_id));
$form_is_exit = addon_is_exit('form', $this->site_id);
if ($form_is_exit) {
$form_list = (new Form())->getFormList([['site_id', '=', $this->site_id], ['form_type', '=', 'goods'], ['is_use', '=', 1]], 'id desc', 'id, form_name')['data'];
$this->assign('form_list', $form_list);
}
$this->assign('form_is_exit', $form_is_exit);
$this->assign('all_goodsclass', event('GoodsClass'));
$this->assign('goods_class', $virtual_goods_model->getGoodsClass());
$this->assign('card_type', $virtual_goods_model->getCardType());
$this->assign('store_is_exit', addon_is_exit('store', $this->site_id));
return $this->fetch("card/add_goods", [], $this->replace);
}
}
/**
* 编辑商品
* @return mixed
*/
public function editGoods()
{
$virtual_goods_model = new CardGoods();
if (request()->isAjax()) {
$category_id = input("category_id", 0);// 分类id
$category_json = json_encode($category_id);//分类字符串
$category_id = '';
$data = [
'goods_id' => input("goods_id", 0),// 商品id
'goods_name' => input("goods_name", ""),// 商品名称,
'goods_attr_class' => input("goods_attr_class", ""),// 商品类型id,
'goods_attr_name' => input("goods_attr_name", ""),// 商品类型名称,
'is_limit' => input("is_limit", "0"),// 商品是否限购,
'limit_type' => input("limit_type", "1"),// 商品限购类型,
'site_id' => $this->site_id,
'category_id' => $category_id,
'category_json' => $category_json,
'goods_image' => input("goods_image", ""),// 商品主图路径
'goods_content' => input("goods_content", ""),// 商品详情
'goods_state' => input("goods_state", ""),// 商品状态1.正常0下架
'price' => input("price", 0),// 商品价格取第一个sku
'renew_price' => input("renew_price", 0), // 续费价格
'market_price' => input("market_price", 0),// 市场价格取第一个sku
'cost_price' => input("cost_price", 0),// 成本价取第一个sku
'sku_no' => input("sku_no", ""),// 商品sku编码
'weight' => input("weight", ""),// 重量
'volume' => input("volume", ""),// 体积
'goods_stock' => input("goods_stock", 0),// 商品库存(总和)
'goods_stock_alarm' => input("goods_stock_alarm", 0),// 库存预警
'goods_spec_format' => input("goods_spec_format", ""),// 商品规格格式
'goods_attr_format' => input("goods_attr_format", ""),// 商品参数格式
'introduction' => input("introduction", ""),// 促销语
'keywords' => input("keywords", ""),// 关键词
'unit' => input("unit", ""),// 单位
'sort' => input("sort", 0),// 排序,
'video_url' => input("video_url", ""),// 视频
'goods_sku_data' => input("goods_sku_data", ""),// SKU商品数据
'goods_service_ids' => input("goods_service_ids", ''),// 商品服务id集合
'label_id' => input("label_id", ''),// 商品分组id
'brand_id' => input("brand_id", 0),//品牌id
'virtual_sale' => input("virtual_sale", 0),// 虚拟销量
'max_buy' => input("max_buy", 0),// 限购
'min_buy' => input("min_buy", 0),// 起售
'recommend_way' => input('recommend_way', 0), // 推荐方式1新品2精品3推荐
'timer_on' => strtotime(input('timer_on', 0)),//定时上架
'timer_off' => strtotime(input('timer_off', 0)),//定时下架
'spec_type_status' => input('spec_type_status', 0),
'is_consume_discount' => input('is_consume_discount', 0),//是否参与会员折扣
'qr_id' => input('qr_id', 0),// 社群二维码id
'template_id' => input('template_id', 0), // 商品海报id
'sale_show' => input('sale_show', 0),//
'stock_show' => input('stock_show', 0),//
'cloud_card_type' => input('cloud_card_type', 'discount_week'),
'market_price_show' => input('market_price_show', 0),//
'barrage_show' => input('barrage_show', 0),//
'form_id' => input('form_id', 0),
'sale_channel' => input('sale_channel', 'all'),
'sale_store' => input('sale_store', 'all'),
'validity_type' => input('validity_type', 0),
'discount_goods_type' => input('discount_goods_type', 'all'),
'is_cloud_zmxx' => input('is_cloud_zmxx', 0),
'discount' => input('discount', 0),
'common_num' => input('common_num', 0),
'relation_goods' => input('relation_goods', '[]'),
'is_unify_pirce' => input('is_unify_pirce', 1),
'discount_type' => input('discount_type', 1),
'downPaymentPeriods' => input('downPaymentPeriods', 0),
'downPayment' => input('downPayment', 0),
'downPaymentDate' => input('downPaymentDate', 0),
'perPeriodPriceArray' => input('perPeriodPriceArray'),
'periods' => input('periods', 1),
'card_template_id' => input('card_template_id', ''),
'change_type' => input('change_type', ''),
'least_period' => input('least_period', 0),
'is_alipay_public' => input('is_alipay_public', 0),
'alipay_cat_id' => input('alipay_cat_id', 0),
'use_rule' => input('use_rule'),
];
if ($data['is_cloud_zmxx'] && !$data['periods']) return error(-1, '请输入扣款次数');
$periods = $data['periods'] ?: $data['common_num']?:1;
$num_price = $data['price'] / (int)$periods;
if ($data['discount_type'] == 1) {
if ($num_price < $data['downPayment']) return error(-1, '前期优惠价格必须小于平均优惠价格');
} else if ($data['discount_type'] == 2) {
$downPaymentPeriods = str_replace('', ',', $data['downPaymentPeriods']);//预防有中文半角
$PaymentPeriods = explode(',', $downPaymentPeriods);
if (count($PaymentPeriods) >= $data['periods']) return error(-1, '后期优惠次数不能大于总次数');
$current = current($PaymentPeriods);
while ($next = next($PaymentPeriods)) {
if ($next > $current) {
return error(-1, '后期优惠价格必须小于或者等与前一期价格');
}
$current = $next;
}
}
$market_price = $data['market_price'] / $data['periods'];
$data['average_original_price'] = $market_price;
$data['average_discount_price'] = $num_price;
if ($data['validity_type'] == 1) {
$data['validity_day'] = input("validity_day", 0);
} else if ($data['validity_type'] == 2) {
$data['validity_time'] = strtotime(input("validity_time", ''));
}
$res = $virtual_goods_model->editGoods($data);
return $res;
} else {
$goods_model = new GoodsModel();
$goods_id = input("goods_id", 0);
$goods_info = $virtual_goods_model->editGetGoodsInfo(['goods_id' => $goods_id, 'site_id' => $this->site_id])['data'];
if (empty($goods_info)) $this->error('未获取到商品信息');
$goods_sku_list = $goods_model->getGoodsSkuList([['goods_id', '=', $goods_id], ['site_id', '=', $this->site_id]], "sku_id,sku_name,sku_no,sku_spec_format,price,market_price,cost_price,stock,virtual_indate,sku_image,sku_images,goods_spec_format,spec_name,stock_alarm,is_default", '')['data'];
$goods_info['sku_list'] = $goods_sku_list;
$this->assign("goods_info", $goods_info);
// 商品服务
$goods_service_model = new GoodsServiceModel();
$service_list = $goods_service_model->getServiceList([['site_id', '=', $this->site_id]], 'id,service_name,icon')['data'];
$this->assign("service_list", $service_list);
//获取商品海报
$poster_list = event('PosterTemplate', ['site_id' => $this->site_id], true);
if (!empty($poster_list)) {
$poster_list = $poster_list['data'];
}
$this->assign('poster_list', $poster_list);
$form_is_exit = addon_is_exit('form', $this->site_id);
if ($form_is_exit) {
$form_list = (new Form())->getFormList([['site_id', '=', $this->site_id], ['form_type', '=', 'goods'], ['is_use', '=', 1]], 'id desc', 'id, form_name')['data'];
$this->assign('form_list', $form_list);
}
$this->assign('form_is_exit', $form_is_exit);
$store_is_exit = addon_is_exit('store', $this->site_id);
if ($store_is_exit && $goods_info['sale_store'] != 'all') {
$store_list = (new StoreModel())->getStoreList([['site_id', '=', $this->site_id], ['store_id', 'in', $goods_info['sale_store']]], 'store_id,store_name,status,address,full_address,is_frozen');
$this->assign('store_list', $store_list['data']);
}
$this->assign('store_is_exit', $store_is_exit);
$this->assign('card_type', $virtual_goods_model->getCardType());
return $this->fetch("card/edit_goods", [], $this->replace);
}
}
public function goodscard()
{
$goods_id = input('goods_id', 0);
$model = new MemberCardModel();
if (request()->isAjax()) {
$page_index = input('page', 1);
$page_size = input('page_size', PAGE_LIST_ROWS);
$search_text = input('search_text', '');
$condition = [
['mgc.site_id', '=', $this->site_id],
['mgc.goods_id', '=', $goods_id],
];
if (!empty($search_text)) {
$condition[] = ['m.nickname', 'like', '%' . $search_text . '%'];
}
$field = 'mgc.*, g.goods_name,g.price,g.goods_image,m.username,m.nickname,m.headimg';
$join = [
['goods g', 'mgc.goods_id = g.goods_id', 'inner'],
['member m', 'mgc.member_id = m.member_id', 'left'],
];
$list = $model->getCardPageList($condition, $field, 'mgc.create_time desc', $page_index, $page_size, 'mgc', $join);
return $list;
} else {
$this->assign('goods_id', $goods_id);
$goods_model = new GoodsModel();
$goods_info = $goods_model->getGoodsInfo([['goods_id', '=', $goods_id], ['site_id', '=', $this->site_id]], 'goods_id, goods_name,goods_image,price,goods_state,goods_stock,sale_num');
$this->assign('goods_info', $goods_info['data']);
$card_stat = $model->getCardInfo([['goods_id', '=', $goods_id], ['site_id', '=', $this->site_id]], 'sum(total_num) as total_num, sum(total_use_num) as total_use_num')['data'] ?? [];
$this->assign('total_num', $card_stat['total_num'] ?? 0);
$this->assign('total_use_num', $card_stat['total_use_num'] ?? 0);
$card_info = $model->getCardSelect([['goods_id', '=', $goods_id], ['site_id', '=', $this->site_id]])['data'] ?? [];
$this->assign('card_info', $card_info);
return $this->fetch('card/goods_card');
}
}
public function membergoodscard()
{
$member_id = input('member_id', 0);
if (request()->isAjax()) {
$page_index = input('page', 1);
$page_size = input('page_size', PAGE_LIST_ROWS);
$search_text = input('search_text', '');
$condition = [
['mgc.site_id', '=', $this->site_id],
['mgc.member_id', '=', $member_id],
];
if (!empty($search_text)) {
$condition[] = ['g.goods_name', 'like', '%' . $search_text . '%'];
}
$model = new MemberCardModel();
$card_goods = new CardGoods();
$field = 'mgc.*, g.goods_name,g.price,g.goods_image,m.username,m.nickname,m.headimg';
$join = [
['goods g', 'mgc.goods_id = g.goods_id', 'inner'],
['member m', 'mgc.member_id = m.member_id', 'left'],
];
$list = $model->getCardPageList($condition, $field, 'mgc.create_time desc', $page_index, $page_size, 'mgc', $join);
foreach ($list['data']['list'] as $k => $v) {
$list['data']['list'][$k]['card_type_name'] = $card_goods->getCardType($v['card_type'])['title'];
}
return $list;
} else {
$this->assign('member_id', $member_id);
return $this->fetch('card/member_goods_card');
}
}
public function detail()
{
$card_id = input('card_id', 0);
$model = new MemberCardModel();
$card_goods = new CardGoods();
$condition = [
['mgc.card_id', '=', $card_id],
['mgc.site_id', '=', $this->site_id],
];
$field = 'mgc.*, g.goods_name,g.price,g.goods_image,m.username,m.nickname,m.headimg';
$join = [
['goods g', 'mgc.goods_id = g.goods_id', 'inner'],
['member m', 'mgc.member_id = m.member_id', 'left'],
];
$detail = $model->getCardInfo($condition, $field, 'mgc', $join)['data'] ?? [];
$detail['card_type_name'] = $card_goods->getCardType($detail['card_type'])['title'];
$this->assign('detail', $detail);
$condition = [];
$condition[] = ['mgc.card_id', '=', $card_id];
$condition[] = ['g.goods_state', '=', 1];
$condition[] = ['g.is_delete', '=', 0];
$field = 'mgc.*, g.sku_name';
$join = [
['goods_sku g', 'mgc.sku_id = g.sku_id', 'left'],
];
$item_list = $model->getCartItemList($condition, $field, 'mgc.item_id asc', 'mgc', $join)['data'] ?? [];
$this->assign('item_list', $item_list);
return $this->fetch('card/detail');
}
public function getCardItem()
{
if (request()->isAjax()) {
$page_index = input('page', 1);
$page_size = input('page_size', PAGE_LIST_ROWS);
$card_id = input('card_id', 0);
$condition = [];
$condition[] = ['mgc.site_id', '=', $this->site_id];
$condition[] = ['mgc.card_id', '=', $card_id];
$condition[] = ['g.goods_state', '=', 1];
$condition[] = ['g.is_delete', '=', 0];
$alias = 'mgc';
$field = 'mgc.*, g.goods_name,g.price,g.goods_image,g.introduction,m.nickname,m.headimg,m.mobile';
$join = [
['goods g', 'mgc.goods_id = g.goods_id', 'inner'],
['member m', 'mgc.member_id = m.member_id', 'left'],
];
$model = new MemberCardModel();
$card_goods = new CardGoods();
$list = $model->getCartItemPageList($condition, $field, 'mgc.item_id asc', $page_index, $page_size, $alias, $join);
foreach ($list['data']['list'] as $k => $v) {
$list['data']['list'][$k]['card_type_name'] = $card_goods->getCardType($v['card_type'])['title'];
}
return $list;
}
}
public function records()
{
if (request()->isAjax()) {
$page_index = input('page', 1);
$page_size = input('page_size', PAGE_LIST_ROWS);
$card_id = input('card_id', 0);
$item_id = input('item_id', 0);
$condition = [];
$condition[] = ['cr.site_id', '=', $this->site_id];
if (!empty($item_id)) {
$condition[] = ['cr.card_item_id', '=', $item_id];
}
if (!empty($card_id)) {
$condition[] = ['cr.card_id', '=', $card_id];
}
$alias = 'cr';
$prefix = config('database.connections.mysql.prefix');
$field = 'cr.*, sku.sku_name,sku.sku_image,sku.sku_images,sku.price,ci.num as item_num,
IF(cr.type = \'order\', (select order_id from `' . $prefix . 'order_goods` og where og.order_goods_id = cr.relation_id), 0) as order_id, s.store_name';
$join = [
['member_goods_card_item ci', 'ci.item_id = cr.card_item_id', 'left'],
['goods_sku sku', 'ci.sku_id = sku.sku_id', 'left'],
['store s', 'cr.store_id = s.store_id', 'left'],
];
$model = new MemberCardModel();
$list = $model->getMemberCardRecordsPageList($condition, $field, 'cr.create_time desc', $page_index, $page_size, $alias, $join);
return $list;
}
}
}