初始上传
This commit is contained in:
474
addon/cardservice/shop/controller/Card.php
Executable file
474
addon/cardservice/shop/controller/Card.php
Executable file
@@ -0,0 +1,474 @@
|
||||
<?php
|
||||
/**
|
||||
* Niushop商城系统 - 团队十年电商经验汇集巨献!
|
||||
* =========================================================
|
||||
* Copy right 2019-2029 杭州牛之云科技有限公司, 保留所有权利。
|
||||
* ----------------------------------------------
|
||||
* 官方网址: https://www.niushop.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\supply\model\Supplier as SupplierModel;
|
||||
use app\model\goods\Goods as GoodsModel;
|
||||
use app\model\goods\GoodsBrand as GoodsBrandModel;
|
||||
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;
|
||||
use think\App;
|
||||
|
||||
|
||||
/**
|
||||
* 虚拟商品
|
||||
* Class Virtualgoods
|
||||
* @package app\shop\controller
|
||||
*/
|
||||
class Card extends BaseShop
|
||||
{
|
||||
|
||||
public function __construct(App $app = null)
|
||||
{
|
||||
$this->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',
|
||||
];
|
||||
parent::__construct($app);
|
||||
}
|
||||
|
||||
/**
|
||||
* 添加商品
|
||||
* @return mixed
|
||||
*/
|
||||
public function addGoods()
|
||||
{
|
||||
if (request()->isJson()) {
|
||||
|
||||
$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_price' => input('is_unify_price', 1),
|
||||
'supplier_id' => input('supplier_id', 0)
|
||||
];
|
||||
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);
|
||||
|
||||
// 商品品牌
|
||||
$goods_brand_model = new GoodsBrandModel();
|
||||
$brand_list = $goods_brand_model->getBrandList([ [ 'site_id', '=', $this->site_id ] ], 'brand_id,brand_name', 'sort asc')[ 'data' ];
|
||||
$this->assign('brand_list', $brand_list);
|
||||
|
||||
//商品默认排序值
|
||||
$config_model = new ConfigModel();
|
||||
$sort_config = $config_model->getGoodsSort($this->site_id)[ '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));
|
||||
|
||||
$is_install_supply = addon_is_exit('supply');
|
||||
if ($is_install_supply) {
|
||||
$supplier_model = new SupplierModel();
|
||||
$supplier_list = $supplier_model->getSupplyList([ [ 'supplier_site_id', '=', $this->site_id ] ], 'supplier_id,title', 'supplier_id desc')['data'];
|
||||
$this->assign('supplier_list', $supplier_list);
|
||||
}
|
||||
$this->assign('is_install_supply', $is_install_supply);
|
||||
|
||||
return $this->fetch('card/add_goods');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 编辑商品
|
||||
* @return mixed
|
||||
*/
|
||||
public function editGoods()
|
||||
{
|
||||
$virtual_goods_model = new CardGoods();
|
||||
if (request()->isJson()) {
|
||||
|
||||
$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),//
|
||||
'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'),
|
||||
'discount' => input('discount', 0),
|
||||
'common_num' => input('common_num', 0),
|
||||
'relation_goods' => input('relation_goods', '[]'),
|
||||
'is_unify_price' => input('is_unify_price', 1),
|
||||
'supplier_id' => input('supplier_id', 0)
|
||||
];
|
||||
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('未获取到商品数据', href_url('shop/goods/lists'));
|
||||
|
||||
$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);
|
||||
|
||||
// 商品品牌
|
||||
$goods_brand_model = new GoodsBrandModel();
|
||||
$brand_list = $goods_brand_model->getBrandList([ [ 'site_id', '=', $this->site_id ] ], 'brand_id,brand_name', 'sort asc')[ 'data' ];
|
||||
$this->assign('brand_list', $brand_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());
|
||||
|
||||
$is_install_supply = addon_is_exit('supply');
|
||||
if ($is_install_supply) {
|
||||
$supplier_model = new SupplierModel();
|
||||
$supplier_list = $supplier_model->getSupplyList([ [ 'supplier_site_id', '=', $this->site_id ] ], 'supplier_id,title', 'supplier_id desc')['data'];
|
||||
$this->assign('supplier_list', $supplier_list);
|
||||
}
|
||||
$this->assign('is_install_supply', $is_install_supply);
|
||||
|
||||
return $this->fetch('card/edit_goods');
|
||||
}
|
||||
}
|
||||
|
||||
public function goodscard()
|
||||
{
|
||||
$goods_id = input('goods_id', 0);
|
||||
$model = new MemberCardModel();
|
||||
if (request()->isJson()) {
|
||||
$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()->isJson()) {
|
||||
$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()->isJson()) {
|
||||
$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()->isJson()) {
|
||||
$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;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
464
addon/cardservice/shop/controller/Reserve.php
Executable file
464
addon/cardservice/shop/controller/Reserve.php
Executable file
@@ -0,0 +1,464 @@
|
||||
<?php
|
||||
/**
|
||||
* Niushop商城系统 - 团队十年电商经验汇集巨献!
|
||||
* =========================================================
|
||||
* Copy right 2019-2029 上海牛之云网络科技有限公司, 保留所有权利。
|
||||
* ----------------------------------------------
|
||||
* 官方网址: https://www.niushop.com
|
||||
* 这不是一个自由软件!您只能在不用于商业目的的前提下对程序代码进行修改和使用。
|
||||
* 任何企业和个人不允许对程序代码以任何形式任何目的再发布。
|
||||
* =========================================================
|
||||
*/
|
||||
|
||||
namespace addon\cardservice\shop\controller;
|
||||
|
||||
use addon\cardservice\model\Reserve as ReserveModel;
|
||||
use app\dict\goods\GoodsDict;
|
||||
use app\model\store\Store as StoreModel;
|
||||
use app\model\goods\Goods as GoodsModel;
|
||||
use app\model\system\User;
|
||||
use app\model\system\UserGroup;
|
||||
use app\shop\controller\BaseShop;
|
||||
use think\App;
|
||||
|
||||
|
||||
class Reserve extends BaseShop
|
||||
{
|
||||
|
||||
public function __construct(App $app = null)
|
||||
{
|
||||
$this->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',
|
||||
];
|
||||
parent::__construct($app);
|
||||
}
|
||||
|
||||
/**
|
||||
* 预约看板
|
||||
* @return mixed
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
$this->assign('reserve_state', ( new ReserveModel )->reserve_state);
|
||||
|
||||
$data = $this->getReserveByWeek();
|
||||
$this->assign('data', $data[ 'data' ]);
|
||||
$store_model = new StoreModel();
|
||||
$store_list = $store_model->getStoreList([ [ 'site_id', '=', $this->site_id ], [ 'status', '=', 1 ] ])[ 'data' ] ?? [];
|
||||
$this->assign('store_list', $store_list);
|
||||
return $this->fetch('reserve/index');
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取一周内的时间段
|
||||
* @param $length
|
||||
* @return array
|
||||
*/
|
||||
public function getWeekDay($length = 0)
|
||||
{
|
||||
$first_day = mktime(0, 0, 0, date("m"), date("d") - date("w") + 1, date("Y"));
|
||||
$first_day = strtotime($length . ' week', $first_day);
|
||||
|
||||
$week = [ '周日', '周一', '周二', '周三', '周四', '周五', '周六' ];
|
||||
$data = [];
|
||||
for ($i = 0; $i < 7; $i++) {
|
||||
$time = strtotime("+ {$i} day", $first_day);
|
||||
$data[] = [
|
||||
'start' => $time,
|
||||
'end' => strtotime(date('Y-m-d 23:59:59', $time)),
|
||||
'date' => date('m/d', $time),
|
||||
'w' => date('w', $time),
|
||||
'week' => $week[date('w', $time)],
|
||||
'currday' => date('Y-m-d', $time) == date('Y-m-d') ? 1 : 0
|
||||
];
|
||||
}
|
||||
return success(0, '', $data);
|
||||
}
|
||||
|
||||
public function getMonthDays()
|
||||
{
|
||||
if (request()->isJson()) {
|
||||
$reserve_model = new ReserveModel();
|
||||
$year = input('year', '');
|
||||
$month = input('month', '');
|
||||
$days_data = $reserve_model->getMonthDays($year, $month)[ 'data' ];
|
||||
return success(0, '', $days_data);
|
||||
}
|
||||
}
|
||||
|
||||
public function getReserveByWeek()
|
||||
{
|
||||
$reserve_model = new ReserveModel();
|
||||
|
||||
$length = input('length', 0);
|
||||
$data = $this->getWeekDay($length)[ 'data' ];
|
||||
foreach ($data as $wk => $w_item) {
|
||||
$field = 'noy.reserve_id,noy.reserve_state,noy.reserve_time,nm.nickname,noy.reserve_item';
|
||||
$list = $reserve_model->getReservePageList([
|
||||
[ 'noy.site_id', '=', $this->site_id ],
|
||||
[ 'noy.reserve_time', 'between', [ $w_item[ 'start' ], $w_item[ 'end' ] ] ]
|
||||
], 1, PAGE_LIST_ROWS, 'noy.create_time desc', $field);
|
||||
$data[ $wk ][ 'data' ] = $list[ 'data' ];
|
||||
}
|
||||
|
||||
return success(0, '', $data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取预约周数据
|
||||
* @return array
|
||||
*/
|
||||
public function getReserveWeekData()
|
||||
{
|
||||
if (request()->isJson()) {
|
||||
$reserve_model = new ReserveModel();
|
||||
$week_offset = input('week_offset', 0);
|
||||
$days_data = $reserve_model->getWeekDays($week_offset)[ 'data' ];
|
||||
$res = $reserve_model->getReserveDataByDays([
|
||||
'days_data' => $days_data,
|
||||
'query_num' => 4,
|
||||
'site_id' => $this->site_id,
|
||||
]);
|
||||
return $res;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取预约月数据
|
||||
* @return array
|
||||
*/
|
||||
public function getYuYueMonthData()
|
||||
{
|
||||
if (request()->isJson()) {
|
||||
$reserve_model = new ReserveModel();
|
||||
$year = input('year', date('Y'));
|
||||
$month = input('year', date('m'));
|
||||
$days_data = $reserve_model->getMonthDays($year, $month)[ 'data' ];
|
||||
$res = $reserve_model->getReserveDataByDays([
|
||||
'days_data' => $days_data,
|
||||
'query_num' => 3,
|
||||
'site_id' => $this->site_id,
|
||||
]);
|
||||
return $res;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 添加预约
|
||||
* @return mixed
|
||||
*/
|
||||
public function addReserve()
|
||||
{
|
||||
$reserve_model = new ReserveModel();
|
||||
if (request()->isJson()) {
|
||||
return $reserve_model->addReserve([
|
||||
'site_id' => $this->site_id,
|
||||
'app_module' => $this->app_module,
|
||||
'member_id' => input('member_id'),
|
||||
'goods' => json_decode(input('goods'), true),
|
||||
'store_id' => input('store_id'),
|
||||
'date' => input('date'),
|
||||
'time' => input('time'),
|
||||
'remark' => input('remark', ''),
|
||||
'source' => 'store'
|
||||
]);
|
||||
}
|
||||
|
||||
$service_model = new GoodsModel();
|
||||
$condition = [
|
||||
[ 'g.site_id', '=', $this->site_id ],
|
||||
[ 'g.goods_state', '=', 1 ],
|
||||
[ 'g.goods_class', '=', GoodsDict::service ]
|
||||
];
|
||||
$service = $service_model->getGoodsList($condition, 'g.goods_id,g.sku_id,g.goods_name,g.price,sku.service_length', 'g.create_time desc'
|
||||
, 0, 'g', [
|
||||
[ 'goods_sku sku', 'sku.goods_id=g.goods_id', 'inner' ]
|
||||
]);
|
||||
$this->assign('service', $service[ 'data' ]);
|
||||
|
||||
$store_model = new StoreModel();
|
||||
$store_list = $store_model->getStoreList([ [ 'site_id', '=', $this->site_id ], [ 'status', '=', 1 ] ])[ 'data' ] ?? [];
|
||||
$this->assign('store_list', $store_list);
|
||||
|
||||
$config = $reserve_model->getReserveConfig($this->site_id, $store_list[ 0 ][ 'store_id' ]);
|
||||
$this->assign('config', $config[ 'data' ][ 'value' ]);
|
||||
|
||||
$user_model = new User();
|
||||
$user_list = $user_model->getUserList([ [ 'site_id', '=', $this->site_id ], [ 'app_module', '=', 'servicer' ], [ 'status', '=', 1 ] ])[ 'data' ] ?? [];
|
||||
$this->assign('user_list', $user_list);
|
||||
|
||||
return $this->fetch('reserve/add_reserve');
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改预约
|
||||
* @return mixed|void
|
||||
*/
|
||||
public function updateReserve()
|
||||
{
|
||||
$model = new ReserveModel();
|
||||
|
||||
if (request()->isJson()) {
|
||||
$reserve_id = input('reserve_id', 0);
|
||||
return $model->editReserve([
|
||||
'site_id' => $this->site_id,
|
||||
'app_module' => $this->app_module,
|
||||
'reserve_id' => $reserve_id,
|
||||
'store_id' => input('store_id'),
|
||||
'goods' => json_decode(input('goods'), true),
|
||||
'date' => input('date'),
|
||||
'time' => input('time'),
|
||||
'remark' => input('remark', '')
|
||||
]);
|
||||
} else {
|
||||
$reserve_id = input('id', 0);
|
||||
// 查询预约信息
|
||||
$info = $model->getReserveInfo([
|
||||
[ 'reserve_id', '=', $reserve_id ],
|
||||
[ 'oy.site_id', '=', $this->site_id ]
|
||||
], 'oy.*, nm.headimg, nm.nickname, nm.mobile, os.store_name', 'oy', [
|
||||
[ 'member nm', 'oy.member_id = nm.member_id', 'left' ],
|
||||
[ 'store os', 'oy.store_id = os.store_id', 'left' ]
|
||||
])[ 'data' ];
|
||||
|
||||
if (empty($info)) {
|
||||
$this->error('未获取到预约信息');
|
||||
return;
|
||||
}
|
||||
$info[ 'item' ] = $model->getReserveItemList([
|
||||
[
|
||||
'oyi.reserve_id', '=', $reserve_id
|
||||
],
|
||||
|
||||
], 'g.goods_name,sku.service_length,g.goods_id,g.sku_id,g.price,ys.username,oyi.reserve_user_id', 'reserve_item_id desc', 'oyi',
|
||||
[
|
||||
[ 'goods g', 'g.sku_id = oyi.reserve_goods_sku_id', 'right' ],
|
||||
[ 'goods_sku sku', 'sku.sku_id = oyi.reserve_goods_sku_id', 'right' ],
|
||||
[ 'user ys', 'oyi.reserve_user_id = ys.uid', 'left' ]
|
||||
])[ 'data' ];
|
||||
|
||||
$this->assign('info', $info);
|
||||
|
||||
// 查询预约配置
|
||||
$config = $model->getReserveConfig($this->site_id, $info[ 'store_id' ]);
|
||||
$this->assign('config', $config[ 'data' ][ 'value' ]);
|
||||
|
||||
// 查询可预约服务
|
||||
$service_model = new GoodsModel();
|
||||
$condition = [
|
||||
[ 'g.site_id', '=', $this->site_id ],
|
||||
[ 'g.goods_state', '=', 1 ],
|
||||
[ 'g.goods_class', '=', GoodsDict::service ]
|
||||
];
|
||||
$service = $service_model->getGoodsList($condition, 'g.goods_id,g.sku_id,g.goods_name,g.price,sku.service_length', 'g.create_time desc'
|
||||
, 0, 'g', [
|
||||
[ 'goods_sku sku', 'sku.goods_id=g.goods_id', 'inner' ]
|
||||
]);
|
||||
$this->assign('service', $service[ 'data' ]);
|
||||
|
||||
$store_model = new StoreModel();
|
||||
$store_list = $store_model->getStoreList([ [ 'site_id', '=', $this->site_id ], [ 'status', '=', 1 ] ])[ 'data' ] ?? [];
|
||||
$this->assign('store_list', $store_list);
|
||||
|
||||
$user_model = new User();
|
||||
$user_list = $user_model->getUserList([ [ 'site_id', '=', $this->site_id ], [ 'app_module', '=', 'servicer' ], [ 'status', '=', 1 ] ])[ 'data' ] ?? [];
|
||||
$this->assign('user_list', $user_list);
|
||||
|
||||
return $this->fetch('reserve/add_reserve');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 预约列表
|
||||
*/
|
||||
public function lists()
|
||||
{
|
||||
$reserve_model = new ReserveModel();
|
||||
if (request()->isJson()) {
|
||||
$page = input('page', 1);
|
||||
$page_size = input('page_size', PAGE_LIST_ROWS);
|
||||
$search_text = input('search_text', '');
|
||||
$reserve_state = input('reserve_state', 'all');
|
||||
$start = input('start_time', 0);
|
||||
$end = input('end_time', 0);
|
||||
$store_id = !empty(input('store_id', 0)) ? input('store_id', 0) : $this->store_id;
|
||||
|
||||
$condition = [
|
||||
[ 'noy.site_id', '=', $this->site_id ]
|
||||
];
|
||||
if ($reserve_state != 'all') {
|
||||
$condition[] = [ 'noy.reserve_state', '=', $reserve_state ];
|
||||
}
|
||||
if (!empty($search_text)) {
|
||||
$condition[] = [ 'nm.mobile|nm.nickname', 'like', '%' . $search_text . '%' ];
|
||||
}
|
||||
if (!empty($store_id)) {
|
||||
$condition[] = [ 'noy.store_id', 'in', $store_id ];
|
||||
}
|
||||
if ($start && $end) {
|
||||
$condition[] = [ 'noy.reserve_time', 'between', [ $start, $end ] ];
|
||||
} else {
|
||||
if ($start && !$end) {
|
||||
$condition[] = [ 'noy.reserve_time', '>=', $start ];
|
||||
} else {
|
||||
if (!$start && $end) {
|
||||
$condition[] = [ 'noy.reserve_time', '<=', $end ];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$field = 'noy.store_id, noy.member_id, noy.remark, noy.reserve_id, noy.reserve_name, noy.reserve_state_name, noy.reserve_state, noy.reserve_time, noy.reserve_item, noy.create_time, noy.source, nm.headimg, nm.nickname, nm.mobile, os.store_name';
|
||||
$result = $reserve_model->getReservePageList($condition, $page, $page_size, 'noy.create_time desc', $field);
|
||||
return $result;
|
||||
} else {
|
||||
$this->assign('reserve_state', $reserve_model->reserve_state);
|
||||
|
||||
$start_time = input('start_time', '');
|
||||
$end_time = input('end_time', '');
|
||||
$this->assign('start_time', $start_time);
|
||||
$this->assign('end_time', $end_time);
|
||||
|
||||
$store_model = new StoreModel();
|
||||
$store_list = $store_model->getStoreList([ [ 'site_id', '=', $this->site_id ], [ 'status', '=', 1 ] ])[ 'data' ] ?? [];
|
||||
|
||||
$this->assign('store_list', $store_list);
|
||||
return $this->fetch('reserve/lists');
|
||||
}
|
||||
}
|
||||
|
||||
public function servicerList()
|
||||
{
|
||||
if (request()->isJson()) {
|
||||
$store_id = !empty(input('store_id', 0)) ? input('store_id', 0) : $this->store_id;
|
||||
$condition = [
|
||||
[ 'u.site_id', '=', $this->site_id ],
|
||||
];
|
||||
$condition[] = [ 'ug.store_id', '=', $store_id ];
|
||||
|
||||
$user_model = new UserGroup();
|
||||
$result = $user_model->getUserList($condition, 'u.username,u.status,u.uid,u.group_name', 'u.uid desc', 'ug', [
|
||||
[ 'user u', 'ug.uid=u.uid', 'left' ]
|
||||
]);
|
||||
return $result;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 预约设置
|
||||
* @return mixed
|
||||
*/
|
||||
public function getConfig()
|
||||
{
|
||||
if (request()->isJson()) {
|
||||
$model = new ReserveModel();
|
||||
$store_id = input('store_id', 0);
|
||||
$config = $model->getReserveConfig($this->site_id, $store_id);
|
||||
return $config;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 确认预约
|
||||
* @return array
|
||||
*/
|
||||
public function confirm()
|
||||
{
|
||||
if (request()->isJson()) {
|
||||
$reserve_id = input('reserve_id', 0);
|
||||
$reserve_model = new ReserveModel();
|
||||
return $reserve_model->confirmReserve($reserve_id, $this->site_id);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 取消预约
|
||||
* @return array
|
||||
*/
|
||||
public function cancel()
|
||||
{
|
||||
if (request()->isJson()) {
|
||||
$reserve_id = input('reserve_id', 0);
|
||||
$reserve_model = new ReserveModel();
|
||||
return $reserve_model->cancelReserve($reserve_id, $this->site_id);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除预约
|
||||
* @return array
|
||||
*/
|
||||
public function deleteReserve()
|
||||
{
|
||||
if (request()->isJson()) {
|
||||
$reserve_id = input('reserve_id', 0);
|
||||
$reserve_model = new ReserveModel();
|
||||
return $reserve_model->deleteReserve($reserve_id, $this->site_id);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 确认到店
|
||||
* @return array
|
||||
*/
|
||||
public function confirmToStore()
|
||||
{
|
||||
if (request()->isJson()) {
|
||||
$reserve_id = input('reserve_id', 0);
|
||||
$reserve_model = new ReserveModel();
|
||||
return $reserve_model->confirmToStore($reserve_id, $this->site_id);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 确认完成
|
||||
* @return array
|
||||
*/
|
||||
public function complete()
|
||||
{
|
||||
if (request()->isJson()) {
|
||||
$reserve_id = input('reserve_id', 0);
|
||||
$reserve_model = new ReserveModel();
|
||||
return $reserve_model->confirmComplete($reserve_id, $this->site_id);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 预约详情
|
||||
* @return mixed|void
|
||||
*/
|
||||
public function detail()
|
||||
{
|
||||
$reserve_id = input('id', 0);
|
||||
|
||||
$model = new ReserveModel();
|
||||
|
||||
$info = $model->getReserveInfo([
|
||||
[ 'reserve_id', '=', $reserve_id ],
|
||||
[ 'oy.site_id', '=', $this->site_id ]
|
||||
], 'oy.*, nm.headimg, nm.nickname, nm.mobile,os.store_name', 'oy', [
|
||||
[ 'member nm', 'oy.member_id = nm.member_id', 'left' ],
|
||||
[ 'store os', 'oy.store_id = os.store_id', 'left' ]
|
||||
])[ 'data' ];
|
||||
|
||||
if (empty($info)) {
|
||||
$this->error('未获取到预约信息');
|
||||
return;
|
||||
}
|
||||
|
||||
$info[ 'item' ] = $model->getReserveItemList([
|
||||
[
|
||||
'oyi.reserve_id', '=', $reserve_id
|
||||
]
|
||||
], 'g.goods_name,sku.service_length,g.goods_id,g.sku_id,g.price,ys.username,oyi.reserve_user_id', 'reserve_item_id desc', 'oyi',
|
||||
[
|
||||
[ 'goods g', 'g.sku_id = oyi.reserve_goods_sku_id', 'right' ],
|
||||
[ 'goods_sku sku', 'sku.sku_id = oyi.reserve_goods_sku_id', 'right' ],
|
||||
[ 'user ys', 'oyi.reserve_user_id = ys.uid', 'left' ]
|
||||
])[ 'data' ];
|
||||
|
||||
$this->assign('info', $info);
|
||||
return $this->fetch('reserve/detail');
|
||||
}
|
||||
}
|
||||
267
addon/cardservice/shop/controller/Service.php
Executable file
267
addon/cardservice/shop/controller/Service.php
Executable file
@@ -0,0 +1,267 @@
|
||||
<?php
|
||||
/**
|
||||
* Niushop商城系统 - 团队十年电商经验汇集巨献!
|
||||
* =========================================================
|
||||
* Copy right 2019-2029 杭州牛之云科技有限公司, 保留所有权利。
|
||||
* ----------------------------------------------
|
||||
* 官方网址: https://www.niushop.com
|
||||
* =========================================================
|
||||
*/
|
||||
|
||||
namespace addon\cardservice\shop\controller;
|
||||
|
||||
use addon\cardservice\model\ServiceGoods;
|
||||
use addon\form\model\Form;
|
||||
use app\model\goods\Goods;
|
||||
use app\model\goods\Goods as GoodsModel;
|
||||
use app\model\goods\GoodsService as GoodsServiceModel;
|
||||
use app\model\store\Store as StoreModel;
|
||||
use app\model\system\User;
|
||||
use app\model\web\Config as ConfigModel;
|
||||
use app\shop\controller\BaseShop;
|
||||
use think\App;
|
||||
|
||||
|
||||
/**
|
||||
* 服务项目商品
|
||||
* Class Service
|
||||
* @package addon\cardservice\shop\controller
|
||||
*/
|
||||
class Service extends BaseShop
|
||||
{
|
||||
|
||||
public function __construct(App $app = null)
|
||||
{
|
||||
$this->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',
|
||||
];
|
||||
parent::__construct($app);
|
||||
}
|
||||
|
||||
/**
|
||||
* 添加商品
|
||||
* @return mixed
|
||||
*/
|
||||
public function addGoods()
|
||||
{
|
||||
if (request()->isJson()) {
|
||||
|
||||
$category_id = input("category_id", 0);// 分类id
|
||||
$category_json = json_encode($category_id);//分类字符串
|
||||
$category_id = ',' . implode(',', $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)
|
||||
'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
|
||||
'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'),
|
||||
'is_unify_price' => input('is_unify_price', '1'),
|
||||
'verify_validity_type' => input("verify_validity_type", 0),// 服务有效期类型
|
||||
'is_reserve' => input('is_reserve', 0),
|
||||
'service_mode' => input('service_mode', ''),
|
||||
'service_price_way' => input('service_price_way', '')
|
||||
];
|
||||
|
||||
if ($data[ 'verify_validity_type' ] == 1) {
|
||||
$data[ 'virtual_indate' ] = input("virtual_indate", 0);
|
||||
} else if ($data[ 'verify_validity_type' ] == 2) {
|
||||
$data[ 'virtual_indate' ] = strtotime(input("virtual_time", ''));
|
||||
}
|
||||
|
||||
$service_goods_model = new ServiceGoods();
|
||||
$res = $service_goods_model->addGoods($data);
|
||||
return $res;
|
||||
} else {
|
||||
// 商品服务
|
||||
$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)[ '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', ( new ServiceGoods() )->getGoodsClass());
|
||||
|
||||
$this->assign('store_is_exit', addon_is_exit('store', $this->site_id));
|
||||
|
||||
return $this->fetch("service/add_goods");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 编辑商品
|
||||
* @return mixed
|
||||
*/
|
||||
public function editGoods()
|
||||
{
|
||||
$service_goods_model = new ServiceGoods();
|
||||
if (request()->isJson()) {
|
||||
|
||||
$category_id = input("category_id", 0);// 分类id
|
||||
$category_json = json_encode($category_id);//分类字符串
|
||||
$category_id = ',' . implode(',', $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)
|
||||
'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
|
||||
'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),//
|
||||
'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'),
|
||||
'is_unify_price' => input('is_unify_price', '1'),
|
||||
'verify_validity_type' => input("verify_validity_type", 0),
|
||||
'is_reserve' => input('is_reserve', 0),
|
||||
'service_mode' => input('service_mode', ''),
|
||||
'service_price_way' => input('service_price_way', '')
|
||||
];
|
||||
if ($data[ 'verify_validity_type' ] == 1) {
|
||||
$data[ 'virtual_indate' ] = input("virtual_indate", 0);
|
||||
} else if ($data[ 'verify_validity_type' ] == 2) {
|
||||
$data[ 'virtual_indate' ] = strtotime(input("virtual_time", ''));
|
||||
}
|
||||
$res = $service_goods_model->editGoods($data);
|
||||
return $res;
|
||||
} else {
|
||||
|
||||
$goods_model = new GoodsModel();
|
||||
$goods_id = input("goods_id", 0);
|
||||
$goods_info = $service_goods_model->getGoodsInfo([ [ '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,service_length", '')[ '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);
|
||||
|
||||
return $this->fetch("service/edit_goods");
|
||||
}
|
||||
}
|
||||
}
|
||||
282
addon/cardservice/shop/controller/Servicecategory.php
Executable file
282
addon/cardservice/shop/controller/Servicecategory.php
Executable file
@@ -0,0 +1,282 @@
|
||||
<?php
|
||||
/**
|
||||
* Niushop商城系统 - 团队十年电商经验汇集巨献!
|
||||
* =========================================================
|
||||
* Copy right 2019-2029 杭州牛之云科技有限公司, 保留所有权利。
|
||||
* ----------------------------------------------
|
||||
* 官方网址: https://www.niushop.com
|
||||
* =========================================================
|
||||
*/
|
||||
|
||||
namespace addon\cardservice\shop\controller;
|
||||
|
||||
use app\model\goods\ServiceCategory as ServiceCategoryModel;
|
||||
use app\shop\controller\BaseShop;
|
||||
use think\App;
|
||||
|
||||
/**
|
||||
* 项目分类管理 控制器
|
||||
*/
|
||||
class Servicecategory extends BaseShop
|
||||
{
|
||||
public function __construct(App $app = null)
|
||||
{
|
||||
$this->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',
|
||||
];
|
||||
parent::__construct($app);
|
||||
}
|
||||
|
||||
/**
|
||||
* 服务分类列表
|
||||
*/
|
||||
public function lists()
|
||||
{
|
||||
$goods_category_model = new ServiceCategoryModel();
|
||||
$condition[] = [ 'site_id', '=', $this->site_id ];
|
||||
$field = 'category_id,category_name,short_name,pid,level,is_show,sort,image,category_id_1,category_id_2,category_id_3';
|
||||
$order = 'pid asc,category_id asc';
|
||||
$list = $goods_category_model->getCategoryTree($condition, $field);
|
||||
if (request()->isJson()) return $list;
|
||||
$list = $list[ 'data' ];
|
||||
$this->assign("list", $list);
|
||||
return $this->fetch('category/lists');
|
||||
}
|
||||
|
||||
/**
|
||||
* 服务分类添加
|
||||
*/
|
||||
public function addCategory()
|
||||
{
|
||||
$goods_category_model = new ServiceCategoryModel();
|
||||
if (request()->isJson()) {
|
||||
|
||||
$category_name = input('category_name', ''); // 分类名称
|
||||
$short_name = input('short_name', ''); // 简称
|
||||
$pid = input('pid', 0); //默认添加的服务分类为顶级
|
||||
$level = input('level', 1); // 层级
|
||||
$is_show = input('is_show', ''); // 是否显示
|
||||
$image = input('image', ''); // 分类图片
|
||||
$image_adv = input('image_adv', ''); // 分类广告图片
|
||||
$category_id_1 = input('category_id_1', 0); // 一级分类id
|
||||
$category_id_2 = input('category_id_2', 0); // 二级分类id
|
||||
$category_full_name = input('category_full_name', ''); // 组装名称
|
||||
$link_url = input('link_url', '');// 广告链接
|
||||
|
||||
$data = [
|
||||
'site_id' => $this->site_id,
|
||||
'category_name' => $category_name,
|
||||
'short_name' => $short_name,
|
||||
'pid' => $pid,
|
||||
'level' => $level,
|
||||
'is_show' => $is_show,
|
||||
'image' => $image,
|
||||
'image_adv' => $image_adv,
|
||||
'category_id_1' => $category_id_1,
|
||||
'category_id_2' => $category_id_2,
|
||||
'category_full_name' => $category_full_name,
|
||||
'link_url' => $link_url
|
||||
];
|
||||
$res = $goods_category_model->addCategory($data);
|
||||
if (!empty($res[ 'data' ])) {
|
||||
|
||||
//修改category_id_
|
||||
$update_data = [
|
||||
'category_id' => $res[ 'data' ],
|
||||
'category_id_' . $level => $res[ 'data' ],
|
||||
'site_id' => $this->site_id
|
||||
];
|
||||
$goods_category_model->editCategory($update_data);
|
||||
|
||||
}
|
||||
return $res;
|
||||
} else {
|
||||
return $this->fetch('category/add_category');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 服务分类编辑
|
||||
*/
|
||||
public function editCategory()
|
||||
{
|
||||
$goods_category_model = new ServiceCategoryModel();
|
||||
if (request()->isJson()) {
|
||||
$category_id = input('category_id', '');// 分类id
|
||||
$category_name = input('category_name', '');// 分类名称
|
||||
$short_name = input('short_name', '');// 简称
|
||||
$pid = input('pid', 0);//默认添加的服务分类为顶级
|
||||
$level = input('level', 1);// 层级
|
||||
$is_show = input('is_show', 0);// 是否显示
|
||||
$image = input('image', '');// 分类图片
|
||||
$image_adv = input('image_adv', '');// 分类广告图片
|
||||
$link_url = input('link_url', '');// 广告链接
|
||||
$data = [
|
||||
'site_id' => $this->site_id,
|
||||
'category_id' => $category_id,
|
||||
'category_name' => $category_name,
|
||||
'short_name' => $short_name,
|
||||
'pid' => $pid,
|
||||
'level' => $level,
|
||||
'is_show' => $is_show,
|
||||
'image' => $image,
|
||||
'image_adv' => $image_adv,
|
||||
'link_url' => $link_url
|
||||
];
|
||||
$this->addLog("编辑服务分类:" . $category_name);
|
||||
$res = $goods_category_model->editCategory($data);
|
||||
|
||||
return $res;
|
||||
} else {
|
||||
|
||||
$category_id = input('category_id', '');// 分类id
|
||||
|
||||
if (empty($category_id)) {
|
||||
$this->error("缺少参数category_id");
|
||||
}
|
||||
|
||||
$goods_category_info = $goods_category_model->getCategoryInfo([ [ 'category_id', '=', $category_id ], [ 'site_id', '=', $this->site_id ] ])[ 'data' ];
|
||||
if (empty($goods_category_info)) $this->error('未获取到分类数据', href_url('shop/category/lists'));
|
||||
|
||||
$this->assign("goods_category_info", $goods_category_info);
|
||||
|
||||
//父级
|
||||
$goods_category_parent_info = $goods_category_model->getCategoryInfo([ [ 'category_id', '=', $goods_category_info[ 'pid' ] ], [ 'site_id', '=', $this->site_id ] ], 'category_name');
|
||||
$this->assign("goods_category_parent_info", $goods_category_parent_info[ 'data' ]);
|
||||
|
||||
$condition = [];
|
||||
$condition[] = [ 'site_id', '=', $this->site_id ];
|
||||
$condition[] = [ 'category_id', '<>', $category_id ];
|
||||
$field = 'category_id,category_name,short_name,pid,level,is_show,sort,image,category_id_1,category_id_2,category_id_3';
|
||||
$list = $goods_category_model->getCategoryTree($condition, $field);
|
||||
$this->assign("list", $list[ 'data' ]);
|
||||
return $this->fetch('category/edit_category');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 服务分类删除
|
||||
*/
|
||||
public function deleteCategory()
|
||||
{
|
||||
if (request()->isJson()) {
|
||||
$category_id = input('category_id', '');// 分类id
|
||||
$goods_category_model = new ServiceCategoryModel();
|
||||
$res = $goods_category_model->deleteCategory($category_id, $this->site_id);
|
||||
$this->addLog("删除服务分类id:" . $category_id);
|
||||
return $res;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取服务分类列表
|
||||
* @return \multitype
|
||||
*/
|
||||
public function getCategoryList()
|
||||
{
|
||||
$pid = input('pid', 0);// 上级id
|
||||
$level = input('level', 0);// 层级
|
||||
$goods_category_model = new ServiceCategoryModel();
|
||||
if (!empty($level)) {
|
||||
$condition = [
|
||||
[ 'level', '=', $level ]
|
||||
];
|
||||
} else {
|
||||
$condition = [
|
||||
[ 'pid', '=', $pid ]
|
||||
];
|
||||
}
|
||||
$condition[] = [ 'site_id', '=', $this->site_id ];
|
||||
$list = $goods_category_list = $goods_category_model->getCategoryList($condition, 'category_id,category_name,pid,level,category_id_1,category_id_2,category_id_3', 'sort asc,category_id desc');
|
||||
return $list;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取服务分类信息
|
||||
* @return \multitype
|
||||
*/
|
||||
public function getCategoryInfo()
|
||||
{
|
||||
$category_id = input('category_id', '');// 分类id
|
||||
$goods_category_model = new ServiceCategoryModel();
|
||||
$condition = [
|
||||
[ 'category_id', '=', $category_id ]
|
||||
];
|
||||
$res = $goods_category_model->getCategoryInfo($condition, 'category_name');
|
||||
return $res;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 获取服务分类
|
||||
* @return \multitype
|
||||
*/
|
||||
public function getCategoryByParent()
|
||||
{
|
||||
$pid = input('pid', 0);// 上级id
|
||||
$level = input('level', 0);// 层级
|
||||
$goods_category_model = new ServiceCategoryModel();
|
||||
if (!empty($level)) {
|
||||
$condition[] = [ 'level', '=', $level ];
|
||||
}
|
||||
if (!empty($pid)) {
|
||||
$condition[] = [ 'pid', '=', $pid ];
|
||||
}
|
||||
$condition[] = [ 'site_id', '=', $this->site_id ];
|
||||
$list = $goods_category_list = $goods_category_model->getCategoryByParent($condition, 'category_id,category_name,pid,level,category_id_1,category_id_2,category_id_3');
|
||||
return $list;
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改服务分类排序
|
||||
*/
|
||||
public function modifySort()
|
||||
{
|
||||
if (request()->isJson()) {
|
||||
$sort = input('sort', 0);
|
||||
$category_id = input('category_id', 0);
|
||||
$category_sort_array = input('category_sort_array', '');
|
||||
$goods_category_model = new ServiceCategoryModel();
|
||||
if (!empty($category_sort_array)) {
|
||||
$category_sort_array = json_decode($category_sort_array, true);
|
||||
foreach ($category_sort_array as $k => $v) {
|
||||
$res = $goods_category_model->modifyGoodsCategorySort($v[ 'sort' ], $v[ 'category_id' ], $this->site_id);
|
||||
}
|
||||
} else {
|
||||
$res = $goods_category_model->modifyGoodsCategorySort($sort, $category_id, $this->site_id);
|
||||
}
|
||||
return $res;
|
||||
}
|
||||
}
|
||||
|
||||
public function checkEditCategory()
|
||||
{
|
||||
if (request()->isJson()) {
|
||||
$pid = input('pid', 0);
|
||||
$category_id = input('category_id', 0);
|
||||
$goods_category_model = new ServiceCategoryModel();
|
||||
$res = $goods_category_model->checkEditCategory([
|
||||
'pid' => $pid,
|
||||
'category_id' => $category_id,
|
||||
'site_id' => $this->site_id
|
||||
]);
|
||||
return $res;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 显示/隐藏
|
||||
* @return array
|
||||
*/
|
||||
public function modifyShow(){
|
||||
$category_id = input('id','');
|
||||
$is_show = input('is_show',0);
|
||||
|
||||
$goods_category_model = new ServiceCategoryModel();
|
||||
return $goods_category_model->modifyCategoryShow($category_id,$is_show);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
764
addon/cardservice/shop/view/card/add_goods.html
Executable file
764
addon/cardservice/shop/view/card/add_goods.html
Executable file
@@ -0,0 +1,764 @@
|
||||
<link rel="stylesheet" href="__STATIC__/ext/video/video.css">
|
||||
<link rel="stylesheet" type="text/css" href="__STATIC__/ext/searchable_select/searchable_select.css" />
|
||||
<link rel="stylesheet" type="text/css" href="__STATIC__/ext/layui/extend/cascader/cascader.css"/>
|
||||
<link rel="stylesheet" type="text/css" href="SHOP_CSS/goods_edit.css?time=20250527" />
|
||||
<link rel="stylesheet" type="text/css" href="ADDON_CARDSERVICE_CSS/card_goods_edit.css" />
|
||||
|
||||
<div class="layui-form">
|
||||
<div class="layui-tab layui-tab-brief" lay-filter="goods_tab">
|
||||
<ul class="layui-tab-title">
|
||||
<li class="layu1i-this" lay-id="basic">基础设置</li>
|
||||
<li lay-id="price-stock">价格库存</li>
|
||||
<li lay-id="detail">卡项详情</li>
|
||||
<li lay-id="senior">高级设置</li>
|
||||
</ul>
|
||||
<div class="layui-tab-content">
|
||||
<!-- 基础设置 -->
|
||||
<div class="layui-tab-item layui-show">
|
||||
|
||||
<!-- 卡项类型 -->
|
||||
<div class="layui-card card-common card-brief head">
|
||||
<div class="layui-card-header">
|
||||
<span class="card-title">商品类型</span>
|
||||
</div>
|
||||
|
||||
<div class="layui-card-body commodity-type-box" >
|
||||
{foreach name="all_goodsclass" item="vo"}
|
||||
<div class="commodity-type-item {if $vo.goods_class eq $goods_class.id}border-color{/if}" onclick="location.hash = ns.hash('{$vo.add_url}')">
|
||||
<span>{$vo.goods_class_name}</span>
|
||||
<span>{$vo.is_virtual ? '(无需物流)' : '(需要物流)'}</span>
|
||||
</div>
|
||||
{/foreach}
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="layui-card card-common card-brief head">
|
||||
<div class="layui-card-header">
|
||||
<span class="card-title">基础信息</span>
|
||||
</div>
|
||||
|
||||
<div class="layui-card-body">
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label"><span class="required">*</span>卡项类型:</label>
|
||||
<div class="layui-input-block card-type">
|
||||
{foreach name="card_type" item="vo" index="index"}
|
||||
<div class="card-type-item {if $index == 1}active{/if}" data-value="{$vo.type}">
|
||||
<div class="title">{$vo.title}</div>
|
||||
<div class="desc">{$vo.desc}</div>
|
||||
<i class="iconfont iconxuanzhongjiaobiao text-color"></i>
|
||||
</div>
|
||||
{/foreach}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label"><span class="required">*</span>卡项名称:</label>
|
||||
<div class="layui-input-inline">
|
||||
<input name="goods_name" type="text" placeholder="请输入卡项名称,不能超过60个字符" maxlength="60" autocomplete="off" lay-verify="goods_name" class="layui-input len-long">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">促销语:</label>
|
||||
<div class="layui-input-inline">
|
||||
<textarea class="layui-textarea len-long" name="introduction" maxlength="100" lay-verify="introduction" placeholder="请输入促销语,不能超过100个字符"></textarea>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">关键词:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="keywords" placeholder="卡项关键词用于SEO搜索,不能超过100个字符" maxlength="100" autocomplete="off" class="layui-input len-long">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item goods-image-wrap">
|
||||
<label class="layui-form-label"><span class="required">*</span>卡项主图:</label>
|
||||
<div class="layui-input-block">
|
||||
<!--卡项主图项-->
|
||||
<div class="js-goods-image"></div>
|
||||
</div>
|
||||
<div class="word-aux">第一张图片将作为卡项主图,支持同时上传多张图片,多张图片之间可随意调整位置;</div>
|
||||
<div class="word-aux">支持jpg、gif、png格式上传或从图片空间中选择,建议使用尺寸800x800像素以上、大小不超过1M的正方形图片;</div>
|
||||
<div class="word-aux">上传后的图片将会自动保存在图片空间的默认分类中,最多上传10张(至少1张)</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">卡项视频:</label>
|
||||
<div class="layui-input-block">
|
||||
|
||||
<div class="video-thumb">
|
||||
<video id="goods_video" class="video-js vjs-big-play-centered" controls="" poster="SHOP_IMG/goods_video_preview.png" preload="auto"></video>
|
||||
</div>
|
||||
<div id="videoUpload2" class="up-video " title="卡项视频" >
|
||||
<span class="delete-video hide" onclick="deleteVideo()"><img class="del-img" src="SHOP_IMG/delete.png">删除</span>
|
||||
<span class="replace-video hide js-add-goods-video" ><img class="up-img" src="SHOP_IMG/upload.png">上传视频</span>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label"></label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="video_url" placeholder="在此输入外链视频地址" autocomplete="off" class="layui-input len-long">
|
||||
</div>
|
||||
<div class="file-title word-aux">
|
||||
<div>注意事项:</div>
|
||||
<ul>
|
||||
<li>1、检查upload文件夹是否有读写权限。</li>
|
||||
<li>2、PHP默认上传限制为2MB,需要在php.ini配置文件中修改“post_max_size”和“upload_max_filesize”的大小。</li>
|
||||
<li>3、视频支持手动输入外链视频地址或者上传本地视频文件</li>
|
||||
<li>4、必须上传.mp4视频格式</li>
|
||||
<li>5、视频文件大小不能超过500MB</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card-type-content discountcard" style="display: none">
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label"><span class="required">*</span>适用商品:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="radio" name="discount_goods_type" value="all" title="全部商品" checked lay-filter="discount_goods_type">
|
||||
<input type="radio" name="discount_goods_type" value="part" title="部分商品" lay-filter="discount_goods_type">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item discount-goods all">
|
||||
<label class="layui-form-label"><span class="required">*</span>折扣卡折扣:</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="number" name="discount" placeholder="0" class="layui-input len-short" lay-verify="common_discount" autocomplete="off">
|
||||
</div>
|
||||
<div class="layui-form-mid layui-word-aux">%</div>
|
||||
<div class="layui-form-mid word-aux">购卡后购买商品或服务时可享折扣 1-99之间</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item discount-goods part" style="display: none">
|
||||
<label class="layui-form-label"></label>
|
||||
<div class="layui-input-block">
|
||||
<button class="layui-btn add-relation-goods">选择商品</button>
|
||||
<div class="relation-goods-table discountcard" lay-verify="relation_discount_goods">
|
||||
<table id="relationDiscountGoods"></table>
|
||||
</div>
|
||||
</div>
|
||||
<div class="word-aux batch-set">
|
||||
<div class="batch-set-wrap">
|
||||
<span>批量操作:</span>
|
||||
<div class="set-item">
|
||||
<a href="javascript:;" class="text-color set">可享受折扣</a>
|
||||
</div>
|
||||
<div class="set-content-wrap">
|
||||
<input type="number" placeholder="0" class="layui-input len-short value" autocomplete="off" data-type="discount">
|
||||
<button class="layui-btn confirm">确认</button>
|
||||
<button class="layui-btn layui-btn-primary cancel">取消</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item card-type-content oncecard timecard commoncard">
|
||||
<label class="layui-form-label"><span class="required">*</span>卡项内容:</label>
|
||||
<div class="layui-input-block">
|
||||
<a href="javascript:;" class="text-color add-relation-goods" data-goods-class="4">添加卡项项目</a>
|
||||
<a href="javascript:;" class="text-color add-relation-goods" data-goods-class="1">添加实物商品</a>
|
||||
<div class="relation-goods-table oncecard" lay-verify="relation_goods">
|
||||
<table id="relationGoods"></table>
|
||||
</div>
|
||||
</div>
|
||||
<div class="word-aux batch-set">
|
||||
<div class="batch-set-wrap">
|
||||
<span>批量操作:</span>
|
||||
<div class="set-item">
|
||||
<a href="javascript:;" class="text-color set">可用次数</a>
|
||||
</div>
|
||||
<div class="set-content-wrap">
|
||||
<input type="number" placeholder="0" class="layui-input len-short value" autocomplete="off" data-type="num">
|
||||
<button class="layui-btn confirm">确认</button>
|
||||
<button class="layui-btn layui-btn-primary cancel">取消</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item card-type-content commoncard" style="display: none">
|
||||
<label class="layui-form-label"><span class="required">*</span>可用次数/数量:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="common_num" placeholder="0" lay-verify="common_num" class="layui-input len-short" autocomplete="off">
|
||||
</div>
|
||||
<div class="layui-form-mid word-aux">卡项内项目/商品总的可用次数</div>
|
||||
</div>
|
||||
|
||||
{notempty name="$service_list"}
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">卡项服务:</label>
|
||||
<div class="layui-input-block">
|
||||
{foreach name="$service_list" item="vo"}
|
||||
<input type="checkbox" name="goods_service_ids" value="{$vo.id}" title="{$vo.service_name}" lay-skin="primary">
|
||||
{/foreach}
|
||||
</div>
|
||||
</div>
|
||||
{/notempty}
|
||||
|
||||
<div class="layui-form-item goods_state">
|
||||
<label class="layui-form-label"><span class="required">*</span>是否上架:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="radio" name="goods_state" value="1" title="立刻上架" checked lay-filter="goods_state">
|
||||
<input type="radio" name="goods_state" value="0" title="放入仓库" lay-filter="goods_state">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">定时下架:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="radio" name="timer_off_status" value="1" title="启用" lay-filter="timer_off">
|
||||
<input type="radio" name="timer_off_status" value="2" title="不启用" lay-filter="timer_off" checked>
|
||||
</div>
|
||||
<div class="word-aux">启用定时下架后,到达设定时间,此卡项将自动下架。</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item timer_off" style="display: none;">
|
||||
<label class="layui-form-label"></label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" id="timer_off" name="timer_off" class="layui-input len-mid" autocomplete="off" readonly>
|
||||
<i class=" iconrili iconfont calendar"></i>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{if addon_is_exit('cashier') == 1}
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">销售渠道:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="radio" name="sale_channel" value="all" title="线上线下销售" checked>
|
||||
<input type="radio" name="sale_channel" value="online" title="线上销售">
|
||||
<input type="radio" name="sale_channel" value="offline" title="线下销售">
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
{if $store_is_exit}
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">适用门店:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="radio" name="sale_store" value="all" title="全部门店" checked lay-filter="sale_store">
|
||||
<input type="radio" name="sale_store" value="" title="部分门店" lay-filter="sale_store">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item sale-store-select" style="display: none" lay-verify="sale_store">
|
||||
<label class="layui-form-label"></label>
|
||||
<div class="layui-input-block">
|
||||
<button class="layui-btn select-store">选择门店</button>
|
||||
<div style="width: 700px">
|
||||
<table class="layui-table" lay-skin="nob">
|
||||
<colgroup>
|
||||
<col width="30%">
|
||||
<col width="60%">
|
||||
<col width="10%">
|
||||
</colgroup>
|
||||
<tr>
|
||||
<th>门店名称</th>
|
||||
<th>门店地址</th>
|
||||
<th>操作</th>
|
||||
</tr>
|
||||
<tbody class="sale-store"></tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">卡项有效期:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="radio" name="validity_type" value="0" title="永久" checked lay-filter="validity_type">
|
||||
<input type="radio" name="validity_type" value="1" title="购买后几日有效" lay-filter="validity_type">
|
||||
<input type="radio" name="validity_type" value="2" title="指定过期日期" lay-filter="validity_type">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item validity-type validity-type-1 layui-hide">
|
||||
<label class="layui-form-label"><span class="required">*</span>有效期:</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="validity_day" placeholder="0" class="layui-input len-short" lay-verify="validity_day" autocomplete="off">
|
||||
</div>
|
||||
<div class="layui-form-mid layui-word-aux">天</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item validity-type validity-type-2 layui-hide">
|
||||
<label class="layui-form-label"><span class="required">*</span>有效期:</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" id="validity_time" name="validity_time" class="layui-input len-mid" lay-verify="validity_time" autocomplete="off" readonly>
|
||||
<i class=" iconrili iconfont calendar"></i>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{if $store_is_exit}
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">是否统一售价:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="radio" name="is_unify_price" value="1" title="是" checked >
|
||||
<input type="radio" name="is_unify_price" value="0" title="否" >
|
||||
</div>
|
||||
<div class="word-aux">价格设置之后门店不能修改价格,门店按照平台设置的价格售卖</div>
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<!-- 价格库存 -->
|
||||
<div class="layui-tab-item">
|
||||
<div class="layui-form-item layui-hide">
|
||||
<label class="layui-form-label">启用多规格:</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="checkbox" value="1" lay-skin="switch" name="spec_type" lay-filter="spec_type" lay-verify="spec_type">
|
||||
<input type="hidden" id="spec_type_status" value="0">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 单规格 -->
|
||||
<div class="js-single-spec">
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label"><span class="required">*</span>开卡价格:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="price" placeholder="0.00" lay-verify="price" class="layui-input len-short" autocomplete="off">
|
||||
<div class="layui-form-mid">元</div>
|
||||
</div>
|
||||
<div class="word-aux">卡项购买价格</div>
|
||||
</div>
|
||||
|
||||
<!--<div class="layui-form-item">
|
||||
<label class="layui-form-label"><span class="required">*</span>续费价格:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="renew_price" placeholder="0.00" lay-verify="renew_price" class="layui-input len-short" autocomplete="off">
|
||||
<div class="layui-form-mid">元</div>
|
||||
</div>
|
||||
<div class="word-aux">卡项续费价格</div>
|
||||
</div>-->
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">划线价:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="market_price" placeholder="0.00" lay-verify="market_price" class="layui-input len-short" autocomplete="off">
|
||||
<div class="layui-form-mid">元</div>
|
||||
</div>
|
||||
<div class="word-aux">卡项没有优惠活动显示的划线价格,如果卡项有折扣等优惠活动划线价显示销售价</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">成本价:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="cost_price" placeholder="0.00" class="layui-input len-short" lay-verify="cost_price" autocomplete="off">
|
||||
<div class="layui-form-mid">元</div>
|
||||
</div>
|
||||
<div class="word-aux">成本价将不会对前台会员展示,用于商家统计使用</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">卡项编码:</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="sku_no" placeholder="请输入卡项编码" maxlength="50" class="layui-input len-long" autocomplete="off">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<!-- 多规格 -->
|
||||
<div class="js-more-spec">
|
||||
|
||||
<!--规格项/规格值-->
|
||||
<div class="spec-edit-list"></div>
|
||||
|
||||
<div class="layui-form-item js-add-spec">
|
||||
<label class="layui-form-label"></label>
|
||||
<div class="layui-input-inline">
|
||||
<button class="layui-btn" type="button">添加规格</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item batch-operation-sku">
|
||||
<label class="layui-form-label">批量操作:</label>
|
||||
<div class="layui-input-inline">
|
||||
<span class="text-color" data-field="spec_name">副标题</span>
|
||||
<span class="text-color" data-field="price" data-verify="price">销售价</span>
|
||||
<span class="text-color" data-field="market_price" data-verify="market_price">划线价</span>
|
||||
<span class="text-color" data-field="cost_price" data-verify="cost_price">成本价</span>
|
||||
<span class="text-color" data-field="stock" data-verify="stock">库存</span>
|
||||
<span class="text-color" data-field="stock_alarm" data-verify="stock_alarm">库存预警</span>
|
||||
<span class="text-color" data-field="sku_no" data-verify="">卡项编码</span>
|
||||
<input type="text" class="layui-input len-short" name="batch_operation_sku" autocomplete="off" />
|
||||
<button class="layui-btn confirm" type="button">确定</button>
|
||||
<button class="layui-btn layui-btn-primary cancel" type="button">取消</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!--sku列表-->
|
||||
<div class="layui-form-item sku-table">
|
||||
<label class="layui-form-label"></label>
|
||||
<div class="layui-input-block"></div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item js-goods-stock-wrap">
|
||||
<label class="layui-form-label"><span class="required">*</span>库存:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="number" name="goods_stock" placeholder="0" lay-verify="goods_stock" class="layui-input len-short" autocomplete="off">
|
||||
<div class="layui-form-mid">件</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item js-goods-stock-wrap">
|
||||
<label class="layui-form-label">库存预警:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="number" name="goods_stock_alarm" placeholder="0" lay-verify="goods_stock_alarm" class="layui-input len-short" autocomplete="off">
|
||||
<div class="layui-form-mid">件</div>
|
||||
</div>
|
||||
<div class="word-aux">卡项库存少于预警数量,卡项列表库存数量标红显示,0为不预警。</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item js-goods-stock-wrap">
|
||||
<label class="layui-form-label">服务时长:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="number" name="service_length" placeholder="0" lay-verify="service_length" class="layui-input len-short" autocomplete="off">
|
||||
<div class="layui-form-mid">分钟</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item ">
|
||||
<label class="layui-form-label">虚拟销量:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="number" name="virtual_sale" placeholder="0" lay-verify="virtual_sale" class="layui-input len-short" autocomplete="off">
|
||||
<div class="layui-form-mid">件</div>
|
||||
</div>
|
||||
<div class="word-aux">该设置不计入卡项统计数据</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item is_limit">
|
||||
<label class="layui-form-label">是否限购:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="radio" name="is_limit" value="0" title="否" lay-filter="is_limit" checked>
|
||||
<input type="radio" name="is_limit" value="1" title="是" lay-filter="is_limit">
|
||||
</div>
|
||||
<div class="word-aux">启用限购后,购买卡项时,会对该卡项购买量做限制判断。</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">起售:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="number" name="min_buy" placeholder="" lay-verify="min_buy" class="layui-input len-short" autocomplete="off">
|
||||
<div class="layui-form-mid">件</div>
|
||||
</div>
|
||||
<div class="word-aux">起售数量超出卡项库存时,买家无法购买该卡项</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">会员等级折扣:</label>
|
||||
<div class="layui-input-block">
|
||||
<div class="layui-input-inline">
|
||||
<input type="radio" name="is_consume_discount" value="1" title="参与" checked>
|
||||
<input type="radio" name="is_consume_discount" value="0" title="不参与">
|
||||
</div>
|
||||
</div>
|
||||
<div class="word-aux">按照默认会员等级折扣优惠</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 卡项详情 -->
|
||||
<div class="layui-tab-item">
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label sm"></label>
|
||||
<div class="layui-input-inline special-length">
|
||||
<script id="editor" type="text/plain" style="width:100%;height:500px;"></script>
|
||||
</div>
|
||||
</div>
|
||||
<script type="text/javascript" charset="utf-8" src="__STATIC__/ext/ueditor/ueditor.config.js"></script>
|
||||
<script type="text/javascript" charset="utf-8" src="__STATIC__/ext/ueditor/ueditor.all.js"> </script>
|
||||
<script type="text/javascript" charset="utf-8" src="__STATIC__/ext/ueditor/lang/zh-cn/zh-cn.js"></script>
|
||||
</div>
|
||||
|
||||
<div class="layui-tab-item layui-card card-common card-brief head">
|
||||
<div class="layui-card-header">
|
||||
<span class="card-title">高级设置</span>
|
||||
</div>
|
||||
|
||||
<div class="layui-card-body">
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">排序:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="number" name="sort" class="layui-input len-short" value="{$sort_config['default_value']}" placeholder="0" autocomplete="off">
|
||||
</div>
|
||||
<div class="word-aux">卡项默认排序号为0,数字越大,排序越靠前,数字重复,则最新添加的靠前。</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">卡项详情显示库存:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="radio" name="stock_show" value="1" title="显示" checked >
|
||||
<input type="radio" name="stock_show" value="0" title="隐藏" >
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">划线价显示:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="radio" name="market_price_show" value="1" title="显示" checked>
|
||||
<input type="radio" name="market_price_show" value="0" title="隐藏" >
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">卡项详情显示弹幕:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="radio" name="barrage_show" value="1" title="显示" checked>
|
||||
<input type="radio" name="barrage_show" value="0" title="隐藏" >
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">卡项详情显示销量:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="radio" name="sale_show" value="1" title="显示" checked>
|
||||
<input type="radio" name="sale_show" value="0" title="隐藏" >
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">卡项海报:</label>
|
||||
<div class="layui-input-inline">
|
||||
<select name="template_id" lay-search="" lay-verify="">
|
||||
<option value="">请选择卡项海报</option>
|
||||
{foreach name="$poster_list" item="vo"}
|
||||
<option value="{$vo['template_id']}">{$vo['poster_name']}</option>
|
||||
{/foreach}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{if $form_is_exit}
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">卡项表单:</label>
|
||||
<div class="layui-input-block len-mid">
|
||||
<select name="form_id">
|
||||
<option value="0">请选择卡项表单</option>
|
||||
{foreach name="$form_list" item="vo"}
|
||||
<option value="{$vo.id}">{$vo.form_name}</option>
|
||||
{/foreach}
|
||||
</select>
|
||||
</div>
|
||||
<div class="word-aux">
|
||||
<a href="{:href_url('form://shop/form/addform?form_type=goods')}" class="text-color" target="_blank">创建卡项表单</a>
|
||||
<a href="javascript:;" onclick="refreshFormList()" class="text-color">刷新</a>
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="fixed-btn">
|
||||
<button class="layui-btn layui-btn-primary border-color text-color js-prev" lay-filter="prev">上一步</button>
|
||||
<button class="layui-btn js-save" lay-submit="" lay-filter="save">保存</button>
|
||||
<button class="layui-btn layui-btn-primary border-color text-color js-next" lay-submit="" lay-filter="next">下一步</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!--规格项模板-->
|
||||
<script type="text/html" id="specTemplate">
|
||||
{{# for(var i=0;i<d.list.length;i++){ }}
|
||||
<div class="spec-item" data-index="{{i}}">
|
||||
<div class="layui-form-item spec">
|
||||
<label class="layui-form-label">规格项{{i+1}}:</label>
|
||||
<div class="layui-input-inline">
|
||||
<select name="spec_item">
|
||||
<option value="0"></option>
|
||||
{{# if(d.list[i].spec_name != ''){ }}
|
||||
<option value="{{d.list[i].spec_id}}" data-attr-name="{{d.list[i].spec_name}}" selected>{{d.list[i].spec_name}}</option>
|
||||
{{# }else{ }}
|
||||
{{# } }}
|
||||
</select>
|
||||
<i class="layui-icon layui-icon-close" data-index="{{i}}"></i>
|
||||
</div>
|
||||
|
||||
{{# if(i==0){ }}
|
||||
<div class="layui-input-inline">
|
||||
{{# if(d.add_spec_img){ }}
|
||||
<input type="checkbox" name="add_spec_img" title="添加规格图片" lay-skin="primary" lay-filter="add_spec_img" checked>
|
||||
{{# }else{ }}
|
||||
<input type="checkbox" name="add_spec_img" title="添加规格图片" lay-skin="primary" lay-filter="add_spec_img">
|
||||
{{# } }}
|
||||
</div>
|
||||
{{# } }}
|
||||
</div>
|
||||
|
||||
{{# if(d.list[i].spec_name != ''){ }}
|
||||
<div class="layui-form-item spec-value">
|
||||
{{# }else{ }}
|
||||
<div class="layui-form-item spec-value" style="display:none;">
|
||||
{{# } }}
|
||||
<label class="layui-form-label"></label>
|
||||
<div class="layui-input-block spec-value">
|
||||
{{# if(d.list[i].value.length){ }}
|
||||
<ul>
|
||||
{{# for(var j=0;j<d.list[i].value.length;j++){ }}
|
||||
<li data-index="{{j}}" data-parent-index="{{i}}" >
|
||||
{{# if(i==0 && d.add_spec_img){ }}
|
||||
<div class="img-wrap">
|
||||
{{# if(d.list[i].value[j].image){ }}
|
||||
<img src="{{ns.img(d.list[i].value[j].image)}}" alt="">
|
||||
{{# }else{ }}
|
||||
<img src="SHOP_IMG/goods_spec_value_empty.png" alt="">
|
||||
{{# } }}
|
||||
</div>
|
||||
{{# } }}
|
||||
<span title="双击可编辑规格值" ondblclick="$(this).attr('contenteditable',true);$(this).focus()" class="spec-txt" data-spec_value_name="{{d.list[i].value[j].spec_value_name}}" data-parent-index="{{i}}" data-index="{{j}}">{{d.list[i].value[j].spec_value_name}}</span>
|
||||
<i class="layui-icon layui-icon-close" data-parent-index="{{i}}" data-index="{{j}}"></i>
|
||||
</li>
|
||||
{{# } }}
|
||||
</ul>
|
||||
{{# } }}
|
||||
|
||||
<a class="text-color" href="javascript:;" data-index="{{i}}">+添加规格值</a>
|
||||
|
||||
<div class="add-spec-value-popup" data-index="{{i}}">
|
||||
<select name="spec_value_item"></select>
|
||||
<button class="layui-btn layui-btn-primary border-color text-color js-cancel-spec-value">取消</button>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
{{# } }}
|
||||
</script>
|
||||
|
||||
<!--SKU列表模板-->
|
||||
<script type="text/html" id="skuTableTemplate">
|
||||
{{# if(d.skuList.length){ }}
|
||||
<table class="layui-table">
|
||||
<colgroup></colgroup>
|
||||
<thead>
|
||||
<tr>
|
||||
{{# if(d.showSpecName){ }}
|
||||
<th colspan="{{d.colSpan}}" style="min-width: 60px;">卡项规格</th>
|
||||
{{# } }}
|
||||
<th rowspan="{{d.rowSpan}}">SKU图片</th>
|
||||
<th rowspan="{{d.rowSpan}}">副标题</th>
|
||||
<th rowspan="{{d.rowSpan}}"><span class="required">*</span>销售价</th>
|
||||
<th rowspan="{{d.rowSpan}}">划线价</th>
|
||||
<th rowspan="{{d.rowSpan}}">成本价</th>
|
||||
<th rowspan="{{d.rowSpan}}"><span class="required">*</span>库存</th>
|
||||
<th rowspan="{{d.rowSpan}}">库存预警</th>
|
||||
<th rowspan="{{d.rowSpan}}">服务时长</th>
|
||||
<th rowspan="{{d.rowSpan}}">商品编码(多个编码以英文逗号分割)</th>
|
||||
<th rowspan="{{d.rowSpan}}" style="white-space: nowrap;">默认展示</th>
|
||||
</tr>
|
||||
{{# if(d.colSpan>1){ }}
|
||||
<tr>
|
||||
{{# for(var i=0;i<d.specList.length;i++){ }}
|
||||
{{# if(d.specList[i].spec_name && d.specList[i].value.length> 0){ }}
|
||||
<th>{{d.specList[i].spec_name}}</th>
|
||||
{{# } }}
|
||||
{{# } }}
|
||||
</tr>
|
||||
{{# } }}
|
||||
</thead>
|
||||
<tbody>
|
||||
{{# for(var i=0;i<d.skuList.length;i++){ }}
|
||||
<tr>
|
||||
<td class="sku_imgs" id="sku_img_{{i}}" style="width: 130px;">
|
||||
{{# for(var j=0;j<d.skuList[i].sku_images_arr.length;j++){ }}
|
||||
<div class="img-wrap" data-index="{{j}}" data-parent-index="{{i}}">
|
||||
<a href="javascript:void(0)">
|
||||
<img src="{{ns.img(d.skuList[i].sku_images_arr[j])}}" layer-src />
|
||||
</a>
|
||||
<div class="operation">
|
||||
<i title="图片预览" class="iconfont iconreview js-preview"></i>
|
||||
<i title="删除图片" class="layui-icon layui-icon-delete js-delete"></i>
|
||||
</div>
|
||||
</div>
|
||||
{{# } }}
|
||||
{{# if(d.skuList[i].sku_images_arr.length<d.goods_sku_max){ }}
|
||||
<div class="upload-sku-img" data-index="{{i}}"><i class="layui-icon layui-icon-add-1"></i></div>
|
||||
{{# } }}
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" name="spec_name" placeholder="副标题" maxlength="100" value="{{d.skuList[i].spec_name}}" class="layui-input" autocomplete="off" data-index="{{i}}">
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" name="price" placeholder="销售价" lay-verify="sku_price" value="{{d.skuList[i].price}}" class="layui-input" autocomplete="off" data-index="{{i}}">
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" name="market_price" placeholder="划线价" value="{{d.skuList[i].market_price}}" lay-verify="sku_market_price" class="layui-input" autocomplete="off" data-index="{{i}}">
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" name="cost_price" placeholder="成本价" value="{{d.skuList[i].cost_price}}" lay-verify="sku_cost_price" class="layui-input" autocomplete="off" data-index="{{i}}">
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" name="stock" placeholder="库存" value="{{d.skuList[i].stock}}" lay-verify="sku_stock" class="layui-input" autocomplete="off" data-index="{{i}}">
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" name="stock_alarm" placeholder="库存预警" value="{{d.skuList[i].stock_alarm}}" lay-verify="sku_stock_alarm" class="layui-input" autocomplete="off" data-index="{{i}}">
|
||||
</td>
|
||||
<td>
|
||||
<input type="number" name="service_length" placeholder="服务时长" value="{{d.skuList[i].service_length}}" maxlength="50" class="layui-input" autocomplete="off" data-index="{{i}}" lay-verify="service_length">
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" name="sku_no" placeholder="商品编码" value="{{d.skuList[i].sku_no}}" maxlength="50" class="layui-input" autocomplete="off" data-index="{{i}}">
|
||||
</td>
|
||||
<td style="min-width: 40px;">
|
||||
{{# if(d.skuList[i].is_default == 1) { }}
|
||||
<input type="checkbox" data-index="{{i}}" name="is_default" lay-filter="is_default" lay-skin="switch" checked>
|
||||
{{# }else { }}
|
||||
<input type="checkbox" data-index="{{i}}" name="is_default" lay-filter="is_default" lay-skin="switch">
|
||||
{{# } }}
|
||||
</td>
|
||||
</tr>
|
||||
{{# } }}
|
||||
|
||||
</tbody>
|
||||
</table>
|
||||
{{# } }}
|
||||
<div class="word-aux text-color" style="margin: 10px 0 0 0;">默认展示,是多规格卡项在客户访问卡项时,默认显示的卡项规格</div>
|
||||
</script>
|
||||
|
||||
<!--卡项主图列表-->
|
||||
<script type="text/html" id="goodsImage">
|
||||
{{# if(d.list.length){ }}
|
||||
{{# for(var i=0;i<d.list.length;i++){ }}
|
||||
<div class="item upload_img_square_item" data-index="{{i}}">
|
||||
<div class="img-wrap">
|
||||
<img src="{{ns.img(d.list[i],'small')}}" layer-src="{{ns.img(d.list[i],'big')}}">
|
||||
</div>
|
||||
<div class="operation">
|
||||
<i title="图片预览" class="iconfont iconreview js-preview"></i>
|
||||
<i title="删除图片" class="layui-icon layui-icon-delete js-delete" data-index="{{i}}"></i>
|
||||
<div class="replace_img" data-index="{{i}}">点击替换</div>
|
||||
</div>
|
||||
</div>
|
||||
{{# } }}
|
||||
{{# if(d.list.length < d.max){ }}
|
||||
<div class="item js-add-goods-image upload_img_square">+</div>
|
||||
{{# } }}
|
||||
{{# }else{ }}
|
||||
<div class="item js-add-goods-image upload_img_square">+</div>
|
||||
{{# } }}
|
||||
</script>
|
||||
|
||||
<script>
|
||||
var relationGoods = [];
|
||||
</script>
|
||||
<script src="__STATIC__/ext/drag-arrange.js"></script>
|
||||
<script src="__STATIC__/ext/video/videojs-ie8.min.js"></script>
|
||||
<script src="__STATIC__/ext/video/video.min.js"></script>
|
||||
<script src="__STATIC__/ext/searchable_select/searchable_select.js"></script>
|
||||
<script src="SHOP_JS/goods_edit_common.js?time=20250527"></script>
|
||||
<script src="ADDON_CARDSERVICE_JS/card_goods_edit.js?v=1"></script>
|
||||
247
addon/cardservice/shop/view/card/detail.html
Executable file
247
addon/cardservice/shop/view/card/detail.html
Executable file
@@ -0,0 +1,247 @@
|
||||
<style>
|
||||
.card-common {margin-top: 15px;margin-bottom: 0;box-shadow: initial;}
|
||||
.card-common .layui-card-body{padding-top: 0;}
|
||||
.promotion-view{display:flex;flex-wrap:wrap}
|
||||
.promotion-view-item{width:33.3%;padding-right:10px;box-sizing:border-box;line-height:30px}
|
||||
.promotion-view-item-line{padding-right:10px;box-sizing:border-box;line-height:30px;overflow: hidden;width: 100%}
|
||||
.promotion-view-item-custom-label{float:left}
|
||||
.promotion-view-item-custom-box{float:left}
|
||||
.promotion-stat-view{display:flex;flex-wrap:wrap}
|
||||
.promotion-stat-view .promotion-stat-item{width:25%;padding:0 15px 10px 15px;box-sizing:border-box}
|
||||
.promotion-stat-view .promotion-stat-item .promotion-stat-item-title{color:#909399;font-size:14px;margin-top:5px}
|
||||
.promotion-stat-view .promotion-stat-item .promotion-stat-item-value{color:#303133;font-size:26px;margin-top:10px}
|
||||
.todo-list .promotion-stat-item{flex:1;width:0;cursor:pointer}
|
||||
.layui-layout-admin .layui-body .body-content {background: 0 0;padding: 0;}
|
||||
.gift-card-goods span{cursor: pointer; color: var(--base-color);}
|
||||
.layui-tab-title{margin-bottom: 15px;}
|
||||
.layui-layout-admin .single-filter-box.top {padding-top: 0 !important;}
|
||||
.add-way .add-way-item{display: flex;margin: 8px 0;align-items: center;}
|
||||
.add-way .add-way-item input{margin: 0 10px;}
|
||||
.add-way .add-way-item .layui-form-radio{margin-right: 0;}
|
||||
.disabled-click{pointer-events: none;color: #999 !important;}
|
||||
#addFile{margin-left: 10px; cursor: pointer;color: var(--base-color);}
|
||||
.card-goods .layui-table{margin-bottom: 0;margin-top: 0;}
|
||||
#card_right_type_goods #goods{border: 0;}
|
||||
.card-goods .layui-table .goods-title{display: flex;align-items: center;}
|
||||
.card-goods .layui-table .goods-title .goods-img{width: 55px;height: 55px;line-height: 55px;flex-shrink: 0;margin-right: 10px;}
|
||||
.card-goods .layui-table .goods-title .goods-img img{max-width: 100%;max-height: 100%;}
|
||||
.card-goods .layui-table-body{overflow: auto;max-height: 425px;margin-bottom: 15px;border-bottom: 1px solid #e6e6e6;}
|
||||
.card-goods .layui-table-body .layui-table{border: none;}
|
||||
.card-goods .layui-table-body tbody tr:last-of-type td{border: none;}
|
||||
.card-goods .layui-table-head tr th:last-of-type{text-align: right;}
|
||||
.card-goods .layui-table-body tr td:last-of-type{text-align: right;}
|
||||
.card-tab{margin-bottom: 15px;margin-top: 15px;}
|
||||
/* 商品列表 */
|
||||
.shop-information-table > p{padding-left: 5px;padding-bottom: 5px;}
|
||||
.shop-information-table table {width: 100%;border: 1px solid rgb(238,238,238);}
|
||||
.shop-information-table .table-body {max-height: 400px;overflow: auto;}
|
||||
.table-trOne{height: 48px;background:rgb(245,245,245) ;}
|
||||
.shop-information-table th{text-align: left;padding-left:28px;box-sizing: border-box;font-weight: 500;color:#333333;}
|
||||
.shop-information-table th:last-child{border:none;}
|
||||
.table-trTow{width:100%;height:60px;border-top:1px solid rgb(238,238,238);}
|
||||
.table-trTow>td{text-align: left;padding-left:28px;box-sizing: border-box;font-weight: 500;color:#333333;border-right:1px solid rgb(238,238,238);}
|
||||
.table-trTow>td:nth-child(5){color:var(--base-color)}
|
||||
.layui-tab-content {
|
||||
padding: 0;
|
||||
}
|
||||
.layui-layout-admin .screen {
|
||||
margin-bottom: 15px;
|
||||
}
|
||||
</style>
|
||||
|
||||
<div class="layui-card card-common card-brief">
|
||||
<div class="layui-card-header">
|
||||
<span class="card-title">基本信息</span>
|
||||
</div>
|
||||
<div class="layui-card-body">
|
||||
<div class="promotion-view">
|
||||
<div class="promotion-view-item">
|
||||
<label>卡项名称:</label>
|
||||
<span>{$detail.goods_name}</span>
|
||||
</div>
|
||||
<div class="promotion-view-item grouping">
|
||||
<label>价格:</label>
|
||||
<span>¥{$detail.price}</span>
|
||||
</div>
|
||||
<div class="promotion-view-item grouping">
|
||||
<label>所属会员:</label>
|
||||
<span>{$detail.nickname}</span>
|
||||
</div>
|
||||
<div class="promotion-view-item grouping">
|
||||
<label>卡类型:</label>
|
||||
<span>{$detail.card_type_name}</span>
|
||||
</div>
|
||||
<div class="promotion-view-item grouping">
|
||||
<label>总次数/已使用:</label>
|
||||
<span>{if $detail.card_type == "timecard"}不限{else/}{$detail.total_num} {/if}/{$detail.total_use_num}</span>
|
||||
</div>
|
||||
|
||||
<div class="promotion-view-item grouping">
|
||||
<label>获取时间:</label>
|
||||
<span>{:date('Y-m-d H:i:s',$detail.create_time)}</span>
|
||||
</div>
|
||||
<div class="promotion-view-item grouping">
|
||||
<label>过期时间:</label>
|
||||
{if $detail.end_time > 0}
|
||||
<span>{:date('Y-m-d H:i:s',$detail.end_time)}</span>
|
||||
{else /}
|
||||
<span>永久有效</span>
|
||||
{/if}
|
||||
</div>
|
||||
<div class="promotion-view-item grouping">
|
||||
<label>卡状态:</label>
|
||||
{$detail.status == 1 ? '正常' : '已失效'}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-card card-common card-brief">
|
||||
<div class="layui-card-header">
|
||||
<span class="card-title">卡项商品</span>
|
||||
</div>
|
||||
<div class="layui-card-body layui-tab layui-tab-brief" lay-filter="edit_user_tab">
|
||||
<ul class="layui-tab-title">
|
||||
<li class="layui-this" lay-id="basic_info">商品信息</li>
|
||||
<li lay-id="basic_info">使用记录</li>
|
||||
|
||||
</ul>
|
||||
<div class="layui-tab-content">
|
||||
|
||||
<div class="layui-tab-item layui-show">
|
||||
<table id="data_list" lay-filter="data_list"></table>
|
||||
</div>
|
||||
<div class="layui-tab-item">
|
||||
<table id="recrods_list" lay-filter="recrods_list"></table>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 工具栏操作 -->
|
||||
<script type="text/html" id="operation">
|
||||
<div class="table-btn">
|
||||
<a class="layui-btn" lay-event="order">查看订单</a>
|
||||
</div>
|
||||
</script>
|
||||
<script type="text/html" id="memberInfo">
|
||||
<div class='table-title'>
|
||||
<div class='title-pic'>
|
||||
<img layer-src src="{{ns.img(d.headimg)}}" onerror="this.src = '{:img('public/static/img/default_img/head.png')}' ">
|
||||
</div>
|
||||
<div class='title-content' onclick="location.hash = ns.hash('shop/member/editmember?member_id={{d.member_id}}')">
|
||||
<p class="layui-elip">{{d.nickname}}</p>
|
||||
<p class="layui-elip">{{d.mobile}}</p>
|
||||
</div>
|
||||
</div>
|
||||
</script>
|
||||
<script type="text/html" id="operation">
|
||||
<div class="table-btn">
|
||||
{{# if(d.status == 'to_activate'){ }}
|
||||
<a class="layui-btn" lay-event="delete">删除</a>
|
||||
{{# } }}
|
||||
{{# if(d.status != 'to_activate'){ }}
|
||||
<a class="layui-btn" lay-event="info">详情</a>
|
||||
{{# } }}
|
||||
</div>
|
||||
</script>
|
||||
<script>
|
||||
var table,element,form,laytpl,repeat_flag=false,records_table;
|
||||
layui.use(['form', 'element', 'laytpl','laydate'], function () {
|
||||
laytpl = layui.laytpl;
|
||||
element = layui.element;
|
||||
form = layui.form;
|
||||
form.render();
|
||||
|
||||
table = new Table({
|
||||
elem: '#data_list',
|
||||
url: ns.url("cardservice://shop/card/getcarditem", {'card_id':"{$detail['card_id']}"}),
|
||||
cols: [
|
||||
[{
|
||||
field: 'goods_name',
|
||||
title: '商品名称',
|
||||
unresize: 'false',
|
||||
width: '50%',
|
||||
}, {
|
||||
field: '',
|
||||
title: '总次数',
|
||||
unresize: 'false',
|
||||
templet: function (data) {
|
||||
var totalNum = data.card_type == 'timecard' ? '不限' : data.num;
|
||||
return totalNum;
|
||||
}
|
||||
}, {
|
||||
field: '',
|
||||
title: '已使用',
|
||||
unresize: 'false',
|
||||
templet: function (data) {
|
||||
return data.use_num;
|
||||
}
|
||||
}]
|
||||
]
|
||||
});
|
||||
|
||||
records_table = new Table({
|
||||
elem: '#recrods_list',
|
||||
url: ns.url("cardservice://shop/card/records", {'card_id':"{$detail['card_id']}"}),
|
||||
cols: [
|
||||
[{
|
||||
field: 'sku_name',
|
||||
title: '卡项名称',
|
||||
unresize: 'false',
|
||||
width: '20%',
|
||||
},{
|
||||
field: 'store_name',
|
||||
title: '使用门店',
|
||||
unresize: 'false',
|
||||
width: '15%',
|
||||
}, {
|
||||
field: '',
|
||||
title: '使用次数',
|
||||
unresize: 'false',
|
||||
width: '15%',
|
||||
templet: function (data) {
|
||||
return data.num;
|
||||
}
|
||||
}, {
|
||||
title: '使用时间',
|
||||
unresize: 'false',
|
||||
width: '15%',
|
||||
templet: function (data) {
|
||||
return ns.time_to_date(data.create_time);
|
||||
}
|
||||
}, {
|
||||
title: '操作',
|
||||
toolbar: '#operation',
|
||||
unresize: 'false',
|
||||
align : 'right'
|
||||
}]
|
||||
]
|
||||
});
|
||||
|
||||
/**
|
||||
* 监听工具栏操作
|
||||
*/
|
||||
records_table.tool(function(obj) {
|
||||
var data = obj.data;
|
||||
switch (obj.event) {
|
||||
case 'order':
|
||||
window.open(ns.href("shop/order/detail?order_id=" + data.order_id));
|
||||
break;
|
||||
}
|
||||
});
|
||||
|
||||
/**
|
||||
* 搜索功能
|
||||
*/
|
||||
form.on('submit(search)', function (data) {
|
||||
records_table.reload({
|
||||
page: {curr: 1},
|
||||
where: data.field
|
||||
});
|
||||
return false;
|
||||
});
|
||||
|
||||
})
|
||||
</script>
|
||||
857
addon/cardservice/shop/view/card/edit_goods.html
Executable file
857
addon/cardservice/shop/view/card/edit_goods.html
Executable file
@@ -0,0 +1,857 @@
|
||||
<link rel="stylesheet" href="__STATIC__/ext/video/video.css">
|
||||
<link rel="stylesheet" type="text/css" href="__STATIC__/ext/searchable_select/searchable_select.css" />
|
||||
<link rel="stylesheet" type="text/css" href="__STATIC__/ext/layui/extend/cascader/cascader.css"/>
|
||||
<link rel="stylesheet" type="text/css" href="SHOP_CSS/goods_edit.css?time=20250527" />
|
||||
<link rel="stylesheet" type="text/css" href="ADDON_CARDSERVICE_CSS/card_goods_edit.css" />
|
||||
|
||||
<div class="layui-form">
|
||||
<div class="layui-tab layui-tab-brief" lay-filter="goods_tab">
|
||||
<ul class="layui-tab-title">
|
||||
<li class="layu1i-this" lay-id="basic">基础设置</li>
|
||||
<li lay-id="price-stock">价格库存</li>
|
||||
<li lay-id="detail">卡项详情</li>
|
||||
<li lay-id="senior">高级设置</li>
|
||||
</ul>
|
||||
<div class="layui-tab-content">
|
||||
<!-- 基础设置 -->
|
||||
<div class="layui-tab-item layui-show">
|
||||
<div class="layui-card card-common card-brief head">
|
||||
<div class="layui-card-header">
|
||||
<span class="card-title">基础信息</span>
|
||||
</div>
|
||||
|
||||
<div class="layui-card-body">
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label"><span class="required">*</span>卡项类型:</label>
|
||||
<div class="layui-input-block card-type">
|
||||
{foreach name="card_type" item="vo" index="index"}
|
||||
{if $vo.type eq $goods_info.card_type}
|
||||
<div class="card-type-item active" data-value="{$vo.type}">
|
||||
<div class="title">{$vo.title}</div>
|
||||
<div class="desc">{$vo.desc}</div>
|
||||
<i class="iconfont iconxuanzhongjiaobiao text-color"></i>
|
||||
</div>
|
||||
{/if}
|
||||
{/foreach}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label"><span class="required">*</span>卡项名称:</label>
|
||||
<div class="layui-input-inline">
|
||||
<input name="goods_name" type="text" value="{$goods_info['goods_name']}" placeholder="请输入卡项名称,不能超过60个字符" maxlength="60" autocomplete="off" lay-verify="goods_name" class="layui-input len-long">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">促销语:</label>
|
||||
<div class="layui-input-inline">
|
||||
<textarea class="layui-textarea len-long" name="introduction" maxlength="100" lay-verify="introduction" placeholder="请输入促销语,不能超过100个字符">{$goods_info['introduction']}</textarea>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">关键词:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="keywords" value="{$goods_info['keywords']}" placeholder="卡项关键词用于SEO搜索,不能超过100个字符" maxlength="100" autocomplete="off" class="layui-input len-long">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item goods-image-wrap">
|
||||
<label class="layui-form-label"><span class="required">*</span>卡项主图:</label>
|
||||
<div class="layui-input-block">
|
||||
<!--卡项主图项-->
|
||||
<div class="js-goods-image"></div>
|
||||
</div>
|
||||
<div class="word-aux">第一张图片将作为卡项主图,支持同时上传多张图片,多张图片之间可随意调整位置;</div>
|
||||
<div class="word-aux">支持jpg、gif、png格式上传或从图片空间中选择,建议使用尺寸800x800像素以上、大小不超过1M的正方形图片;</div>
|
||||
<div class="word-aux">上传后的图片将会自动保存在图片空间的默认分类中,最多上传10张(至少1张)</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">卡项视频:</label>
|
||||
<div class="layui-input-block">
|
||||
<div class="video-thumb">
|
||||
<video id="goods_video" class="video-js vjs-big-play-centered" controls="" poster="SHOP_IMG/goods_video_preview.png" preload="auto"></video>
|
||||
</div>
|
||||
<div id="videoUpload2" class="up-video " title="卡项视频" >
|
||||
<span class="delete-video hide" onclick="deleteVideo()"><img class="del-img" src="SHOP_IMG/delete.png">删除</span>
|
||||
<span class=" replace-video hide js-add-goods-video" ><img class="up-img" src="SHOP_IMG/upload.png">上传视频</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label"></label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="video_url" placeholder="在此输入外链视频地址" value="{$goods_info['video_url']}" autocomplete="off" class="layui-input len-long">
|
||||
</div>
|
||||
<div class="file-title word-aux">
|
||||
<div>注意事项:</div>
|
||||
<ul>
|
||||
<li>1、检查upload文件夹是否有读写权限。</li>
|
||||
<li>2、PHP默认上传限制为2MB,需要在php.ini配置文件中修改“post_max_size”和“upload_max_filesize”的大小。</li>
|
||||
<li>3、视频支持手动输入外链视频地址或者上传本地视频文件</li>
|
||||
<li>4、必须上传.mp4视频格式</li>
|
||||
<li>5、视频文件大小不能超过500MB</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card-type-content discountcard" {if $goods_info.card_type neq 'discountcard'}style="display: none"{/if}>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label"><span class="required">*</span>适用商品:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="radio" name="discount_goods_type" value="all" title="全部商品" {if $goods_info.discount_goods_type eq 'all'}checked{/if} lay-filter="discount_goods_type">
|
||||
<input type="radio" name="discount_goods_type" value="part" title="部分商品" {if $goods_info.discount_goods_type eq 'part'}checked{/if} lay-filter="discount_goods_type">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item discount-goods all">
|
||||
<label class="layui-form-label"><span class="required">*</span>折扣卡折扣:</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="number" name="discount" value="{$goods_info.discount}" placeholder="0" class="layui-input len-short" lay-verify="common_discount" autocomplete="off">
|
||||
</div>
|
||||
<div class="layui-form-mid layui-word-aux">%</div>
|
||||
<div class="layui-form-mid word-aux">购卡后购买商品或服务时可享折扣 1-99之间</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item discount-goods part" {if $goods_info.discount_goods_type eq 'all'}style="display: none"{/if}>
|
||||
<label class="layui-form-label"></label>
|
||||
<div class="layui-input-block">
|
||||
<button class="layui-btn add-relation-goods">选择商品</button>
|
||||
<div class="relation-goods-table discountcard" lay-verify="relation_discount_goods">
|
||||
<table id="relationDiscountGoods"></table>
|
||||
</div>
|
||||
</div>
|
||||
<div class="word-aux batch-set">
|
||||
<div class="batch-set-wrap">
|
||||
<span>批量操作:</span>
|
||||
<div class="set-item">
|
||||
<a href="javascript:;" class="text-color set">可享受折扣</a>
|
||||
</div>
|
||||
<div class="set-content-wrap">
|
||||
<input type="number" placeholder="0" class="layui-input len-short value" autocomplete="off" data-type="discount">
|
||||
<button class="layui-btn confirm">确认</button>
|
||||
<button class="layui-btn layui-btn-primary cancel">取消</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item card-type-content oncecard timecard commoncard" {if $goods_info.card_type eq 'discountcard'}style="display: none"{/if}>
|
||||
<label class="layui-form-label"><span class="required">*</span>卡项内容:</label>
|
||||
<div class="layui-input-block">
|
||||
<a href="javascript:;" class="text-color add-relation-goods" data-goods-class="4">添加卡项项目</a>
|
||||
<a href="javascript:;" class="text-color add-relation-goods" data-goods-class="1">添加实物商品</a>
|
||||
<div class="relation-goods-table oncecard" lay-verify="relation_goods">
|
||||
<table id="relationGoods"></table>
|
||||
</div>
|
||||
</div>
|
||||
<div class="word-aux batch-set">
|
||||
<div class="batch-set-wrap">
|
||||
<span>批量操作:</span>
|
||||
<div class="set-item">
|
||||
<a href="javascript:;" class="text-color set">可用次数</a>
|
||||
</div>
|
||||
<div class="set-content-wrap">
|
||||
<input type="number" placeholder="0" class="layui-input len-short value" autocomplete="off" data-type="num">
|
||||
<button class="layui-btn confirm">确认</button>
|
||||
<button class="layui-btn layui-btn-primary cancel">取消</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item card-type-content commoncard" {if $goods_info.card_type neq 'commoncard'}style="display: none"{/if}>
|
||||
<label class="layui-form-label"><span class="required">*</span>可用次数/数量:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="common_num" value="{$goods_info.common_num}" placeholder="0" lay-verify="common_num" class="layui-input len-short" autocomplete="off">
|
||||
</div>
|
||||
<div class="layui-form-mid word-aux">卡项内项目/商品总的可用次数</div>
|
||||
</div>
|
||||
|
||||
{notempty name="$service_list"}
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">卡项服务:</label>
|
||||
<div class="layui-input-block">
|
||||
{foreach name="$service_list" item="vo"}
|
||||
<input type="checkbox" name="goods_service_ids" value="{$vo.id}" title="{$vo.service_name}" lay-skin="primary" {if strpos($goods_info['goods_service_ids'],(string)$vo['id'])>-1}checked{/if}>
|
||||
{/foreach}
|
||||
</div>
|
||||
</div>
|
||||
{/notempty}
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">商品品牌:</label>
|
||||
<div class="layui-input-inline">
|
||||
<select name="brand_id" lay-search="" lay-filter="brand_id">
|
||||
<option value="">请选择商品品牌</option>
|
||||
{foreach name="$brand_list" item="vo"}
|
||||
<option value="{$vo['brand_id']}" {if $goods_info['brand_id'] == $vo['brand_id'] }selected{/if}>{$vo['brand_name']}</option>
|
||||
{/foreach}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{if $is_install_supply}
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">供应商:</label>
|
||||
<div class="layui-input-inline">
|
||||
<select name="supplier_id" lay-search="" lay-verify="supplier_id">
|
||||
<option value="">请选择供应商</option>
|
||||
{foreach name="$supplier_list" item="vo"}
|
||||
<option value="{$vo['supplier_id']}" {if $goods_info['supplier_id']==$vo['supplier_id'] }selected{/if}>{$vo['title']}</option>
|
||||
{/foreach}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
<div class="layui-form-item goods_state">
|
||||
<label class="layui-form-label"><span class="required">*</span>是否上架:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="radio" name="goods_state" value="1" title="立刻上架" lay-filter="goods_state" {if $goods_info['goods_state'] == 1 }checked{/if}>
|
||||
<input type="radio" name="goods_state" value="0" title="放入仓库" lay-filter="goods_state" {if $goods_info['goods_state'] == 0 }checked{/if}>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{if $goods_info['goods_state'] == 0}
|
||||
<div class="layui-form-item timer_on">
|
||||
<label class="layui-form-label">定时上架:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="radio" name="timer_on_status" class="timer_on_status_true" value="1" title="启用" lay-filter="timer_on" {if $goods_info['timer_on'] > 0} checked {/if}>
|
||||
<input type="radio" name="timer_on_status" value="2" title="不启用" lay-filter="timer_on" {if $goods_info['timer_on'] == 0} checked {/if}>
|
||||
</div>
|
||||
<div class="word-aux">启用定时上架后,到达设定时间,此卡项将自动上架。</div>
|
||||
</div>
|
||||
{if $goods_info['timer_on'] > 0}
|
||||
<div class="layui-form-item timer_on_time">
|
||||
<label class="layui-form-label"></label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" id="timer_on" name="timer_on" value="{:date('Y-m-d H:i:s',$goods_info['timer_on'])}" lay-verify="required" class="layui-input len-mid" autocomplete="off" readonly>
|
||||
<i class=" iconrili iconfont calendar"></i>
|
||||
</div>
|
||||
</div>
|
||||
{else/}
|
||||
<div class="layui-form-item timer_on_time layui-hide">
|
||||
<label class="layui-form-label"></label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" id="timer_on" name="timer_on" lay-verify="" class="layui-input len-mid" autocomplete="off" readonly>
|
||||
<i class=" iconrili iconfont calendar"></i>
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
{/if}
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">定时下架:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="radio" name="timer_off_status" value="1" title="启用" lay-filter="timer_off" {if $goods_info['timer_off'] > 0} checked {/if}>
|
||||
<input type="radio" name="timer_off_status" value="2" title="不启用" lay-filter="timer_off" {if $goods_info['timer_off'] == 0} checked {/if}>
|
||||
</div>
|
||||
<div class="word-aux">启用定时下架后,到达设定时间,此卡项将自动下架。</div>
|
||||
</div>
|
||||
|
||||
{if $goods_info['timer_off'] > 0}
|
||||
<div class="layui-form-item timer_off">
|
||||
<label class="layui-form-label"></label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" id="timer_off" name="timer_off" value="{:date('Y-m-d H:i:s',$goods_info['timer_off'])}" lay-verify="required" class="layui-input len-mid" autocomplete="off" readonly>
|
||||
<i class=" iconrili iconfont calendar"></i>
|
||||
</div>
|
||||
</div>
|
||||
{else/}
|
||||
<div class="layui-form-item timer_off" style="display:none">
|
||||
<label class="layui-form-label"></label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" id="timer_off" name="timer_off" lay-verify="" class="layui-input len-mid" autocomplete="off" readonly>
|
||||
<i class=" iconrili iconfont calendar"></i>
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
{if addon_is_exit('cashier') == 1}
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">销售渠道:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="radio" name="sale_channel" value="all" title="线上线下销售" {if $goods_info.sale_channel eq 'all'}checked{/if}>
|
||||
<input type="radio" name="sale_channel" value="online" title="线上销售" {if $goods_info.sale_channel eq 'online'}checked{/if}>
|
||||
<input type="radio" name="sale_channel" value="offline" title="线下销售" {if $goods_info.sale_channel eq 'offline'}checked{/if}>
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
{if $store_is_exit}
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">适用门店:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="radio" name="sale_store" value="all" title="全部门店" {if $goods_info.sale_store eq 'all'}checked{/if} lay-filter="sale_store">
|
||||
<input type="radio" name="sale_store" value="" title="部分门店" {if $goods_info.sale_store neq 'all'}checked{/if} lay-filter="sale_store">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item sale-store-select" {if $goods_info.sale_store eq 'all'}style="display: none"{/if} lay-verify="sale_store">
|
||||
<label class="layui-form-label"></label>
|
||||
<div class="layui-input-block">
|
||||
<button class="layui-btn select-store">选择门店</button>
|
||||
<div style="width: 700px">
|
||||
<table class="layui-table" lay-skin="nob">
|
||||
<colgroup>
|
||||
<col width="30%">
|
||||
<col width="60%">
|
||||
<col width="10%">
|
||||
</colgroup>
|
||||
<tr>
|
||||
<th>门店名称</th>
|
||||
<th>门店地址</th>
|
||||
<th>操作</th>
|
||||
</tr>
|
||||
<tbody class="sale-store">
|
||||
{if isset($store_list) && !empty($store_list)}
|
||||
{foreach name="$store_list" item="vo"}
|
||||
<tr data-store="{$vo.store_id}">
|
||||
<td>{$vo.store_name}</td>
|
||||
<td>{$vo.full_address}{$vo.address}</td>
|
||||
<td><a href="javascript:;" class="del">删除</a></td>
|
||||
</tr>
|
||||
{/foreach}
|
||||
{/if}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">卡项有效期:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="radio" name="validity_type" value="0" title="永久" {if $goods_info.validity_type eq 0}checked{/if} lay-filter="validity_type">
|
||||
<input type="radio" name="validity_type" value="1" title="购买后几日有效" {if $goods_info.validity_type eq 1}checked{/if} lay-filter="validity_type">
|
||||
<input type="radio" name="validity_type" value="2" title="指定过期日期" {if $goods_info.validity_type eq 2}checked{/if} lay-filter="validity_type">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item validity-type validity-type-1 {if $goods_info.validity_type neq 1}layui-hide{/if}">
|
||||
<label class="layui-form-label"><span class="required">*</span>有效期:</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="validity_day" placeholder="0" class="layui-input len-short" value="{$goods_info.validity_day}" lay-verify="validity_day" autocomplete="off">
|
||||
</div>
|
||||
<div class="layui-form-mid layui-word-aux">天</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item validity-type validity-type-2 {if $goods_info.validity_type neq 2}layui-hide{/if}">
|
||||
<label class="layui-form-label"><span class="required">*</span>有效期:</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" id="validity_time" name="validity_time" class="layui-input len-mid" value="{$goods_info.validity_time ? time_to_date($goods_info.validity_time) : ''}" lay-verify="validity_time" autocomplete="off" readonly>
|
||||
<i class=" iconrili iconfont calendar"></i>
|
||||
</div>
|
||||
</div>
|
||||
{if $store_is_exit}
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">是否统一售价:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="radio" name="is_unify_price" value="1" title="是" {if $goods_info.is_unify_price eq '1'}checked{/if} >
|
||||
<input type="radio" name="is_unify_price" value="0" title="否" {if $goods_info.is_unify_price eq '0'}checked{/if}>
|
||||
</div>
|
||||
<div class="word-aux">价格设置之后门店不能修改价格,门店按照平台设置的价格售卖</div>
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<!-- 价格库存 -->
|
||||
<div class="layui-tab-item">
|
||||
<div class="layui-form-item layui-hide">
|
||||
<label class="layui-form-label">启用多规格:</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="checkbox" value="1" lay-skin="switch" name="spec_type" lay-filter="spec_type" lay-verify="spec_type" {notempty name="$goods_info['goods_spec_format']" }checked{/notempty}>
|
||||
<input type="hidden" id="spec_type_status" {if empty($goods_info['goods_spec_format'])} value="0" {else/} value="1" {/if}>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 单规格 -->
|
||||
<div class="js-single-spec" {notempty name="$goods_info['goods_spec_format']" }style="display:none;"{/notempty}>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label"><span class="required">*</span>开卡价格:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="price" value="{$goods_info['price']}" placeholder="0.00" lay-verify="price" class="layui-input len-short" autocomplete="off">
|
||||
<div class="layui-form-mid">元</div>
|
||||
</div>
|
||||
<div class="word-aux">卡项购买价格</div>
|
||||
</div>
|
||||
|
||||
<!--<div class="layui-form-item">
|
||||
<label class="layui-form-label"><span class="required">*</span>续费价格:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="renew_price" value="{$goods_info['renew_price']}" placeholder="0.00" lay-verify="renew_price" class="layui-input len-short" autocomplete="off">
|
||||
<div class="layui-form-mid">元</div>
|
||||
</div>
|
||||
<div class="word-aux">卡项续费价格</div>
|
||||
</div>-->
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">划线价:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="market_price" value="{$goods_info['market_price']}" placeholder="0.00" lay-verify="market_price" class="layui-input len-short" autocomplete="off">
|
||||
<div class="layui-form-mid">元</div>
|
||||
</div>
|
||||
<div class="word-aux">卡项没有优惠活动显示的划线价格,如果卡项有折扣等优惠活动划线价显示销售价</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">成本价:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="cost_price" value="{$goods_info['cost_price']}" placeholder="0.00" class="layui-input len-short" lay-verify="cost_price" autocomplete="off">
|
||||
<div class="layui-form-mid">元</div>
|
||||
</div>
|
||||
<div class="word-aux">成本价将不会对前台会员展示,用于商家统计使用</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">卡项编码:</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="sku_no" value="{$goods_info['sku_list'][0]['sku_no']}" placeholder="请输入卡项编码" maxlength="50" class="layui-input len-long" autocomplete="off">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<!-- 多规格 -->
|
||||
<div class="js-more-spec" {notempty name="$goods_info['goods_spec_format']" }style="display:block;"{/notempty}>
|
||||
|
||||
<!--规格项/规格值-->
|
||||
<div class="spec-edit-list"></div>
|
||||
|
||||
<div class="layui-form-item js-add-spec">
|
||||
<label class="layui-form-label"></label>
|
||||
<div class="layui-input-inline">
|
||||
<button class="layui-btn" type="button">添加规格</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item batch-operation-sku">
|
||||
<label class="layui-form-label">批量操作:</label>
|
||||
<div class="layui-input-inline">
|
||||
<span class="text-color" data-field="spec_name">副标题</span>
|
||||
<span class="text-color" data-field="price" data-verify="price">销售价</span>
|
||||
<span class="text-color" data-field="market_price" data-verify="market_price">划线价</span>
|
||||
<span class="text-color" data-field="cost_price" data-verify="cost_price">成本价</span>
|
||||
<span class="text-color" data-field="stock" data-verify="stock">库存</span>
|
||||
<span class="text-color" data-field="stock_alarm" data-verify="stock_alarm">库存预警</span>
|
||||
<span class="text-color" data-field="sku_no" data-verify="">卡项编码</span>
|
||||
<input type="text" class="layui-input len-short" name="batch_operation_sku" autocomplete="off" />
|
||||
<button class="layui-btn confirm" type="button">确定</button>
|
||||
<button class="layui-btn layui-btn-primary cancel" type="button">取消</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!--编辑时用到的SKU列表-->
|
||||
<div class="js-edit-sku-list">
|
||||
{foreach name="$goods_info['sku_list']" item="vo" key="k"}
|
||||
<div data-index="{$k}">
|
||||
<input type="hidden" name="edit_sku_id" value="{$vo['sku_id']}" />
|
||||
<input type="hidden" name="edit_spec_name" value="{$vo['spec_name']}" />
|
||||
<input type="hidden" name="edit_sku_no" value="{$vo['sku_no']}" />
|
||||
<input type="hidden" name="edit_sku_spec_format" value="{$vo['sku_spec_format']}" />
|
||||
<input type="hidden" name="edit_price" value="{$vo['price']}" />
|
||||
<input type="hidden" name="edit_market_price" value="{$vo['market_price']}" />
|
||||
<input type="hidden" name="edit_cost_price" value="{$vo['cost_price']}" />
|
||||
<input type="hidden" name="edit_stock" value="{$vo['stock']}" />
|
||||
<input type="hidden" name="edit_stock_alarm" value="{$vo['stock_alarm']}" />
|
||||
<input type="hidden" name="edit_sku_image" value="{$vo['sku_image']}" />
|
||||
<input type="hidden" name="edit_sku_images" value="{$vo['sku_images']}" />
|
||||
<input type="hidden" name="edit_is_default" value="{$vo['is_default']}" />
|
||||
</div>
|
||||
{/foreach}
|
||||
</div>
|
||||
|
||||
<!--sku列表-->
|
||||
<div class="layui-form-item sku-table">
|
||||
<label class="layui-form-label"></label>
|
||||
<div class="layui-input-block"></div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item js-goods-stock-wrap" {notempty name="$goods_info['goods_spec_format']" }style="display:none;"{/notempty}>
|
||||
<label class="layui-form-label"><span class="required">*</span>库存:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="number" name="goods_stock" value="{$goods_info['goods_stock']}" placeholder="0" lay-verify="goods_stock" class="layui-input len-short" autocomplete="off" {notempty name="$goods_info['goods_spec_format']" }disabled{/notempty}>
|
||||
<div class="layui-form-mid">件</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item js-goods-stock-wrap" {notempty name="$goods_info['goods_spec_format']" }style="display:none;"{/notempty}>
|
||||
<label class="layui-form-label">库存预警:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="number" name="goods_stock_alarm" value="{$goods_info['goods_stock_alarm']}" placeholder="0" lay-verify="goods_stock_alarm" class="layui-input len-short" autocomplete="off">
|
||||
<div class="layui-form-mid">件</div>
|
||||
</div>
|
||||
<div class="word-aux">卡项库存少于预警数量,卡项列表库存数量标红显示,0为不预警。</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">虚拟销量:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="number" name="virtual_sale" placeholder="0" value="{$goods_info['virtual_sale']}" lay-verify="virtual_sale" class="layui-input len-short" autocomplete="off">
|
||||
<div class="layui-form-mid">件</div>
|
||||
</div>
|
||||
<div class="word-aux">该设置不计入卡项统计数据</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item is_limit">
|
||||
<label class="layui-form-label">是否限购:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="radio" name="is_limit" value="0" title="否" lay-filter="is_limit" {if $goods_info['is_limit'] == 0} checked {/if}>
|
||||
<input type="radio" name="is_limit" value="1" title="是" lay-filter="is_limit" {if $goods_info['is_limit'] == 1} checked {/if}>
|
||||
</div>
|
||||
<div class="word-aux">启用限购后,购买卡项时,会对该卡项购买量做限制判断。</div>
|
||||
</div>
|
||||
|
||||
{if $goods_info['is_limit'] == 1}
|
||||
<div class="layui-form-item limit_type" >
|
||||
<label class="layui-form-label">限购类型:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="radio" name="limit_type" class="limit_type" value="1" title="单次限购" lay-filter="limit_type" {if $goods_info['limit_type'] == 1 } checked {/if}>
|
||||
<input type="radio" name="limit_type" class="limit_type" value="2" title="长期限购" lay-filter="limit_type" {if $goods_info['limit_type'] == 2} checked {/if}>
|
||||
<input type="number" name="max_buy" placeholder="" lay-verify="max_buy" value="{$goods_info['max_buy']}" class="layui-input len-short" autocomplete="off">
|
||||
<div class="layui-form-mid"> 件</div>
|
||||
</div>
|
||||
<div class="word-aux">单次限购是针对于每次下单不能超过限购数量,长期限购是针对于会员账号购买这个卡项的总数不能超过限购数量。</div>
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">起售:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="number" name="min_buy" placeholder="" lay-verify="min_buy" value="{$goods_info['min_buy']}" class="layui-input len-short" autocomplete="off">
|
||||
<div class="layui-form-mid">件</div>
|
||||
</div>
|
||||
<div class="word-aux">起售数量超出卡项库存时,买家无法购买该卡项</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">会员等级折扣:</label>
|
||||
<div class="layui-input-block">
|
||||
<div class="layui-input-inline">
|
||||
<input type="radio" name="is_consume_discount" value="1" title="参与" {if $goods_info['is_consume_discount'] > 0} checked {/if}>
|
||||
<input type="radio" name="is_consume_discount" value="0" title="不参与" {if $goods_info['is_consume_discount'] == 0} checked {/if}>
|
||||
</div>
|
||||
</div>
|
||||
<div class="word-aux">如果该卡项未单独配置过优惠规则,则按照默认会员等级折扣优惠</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 卡项详情 -->
|
||||
<div class="layui-tab-item">
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label sm"></label>
|
||||
<div class="layui-input-inline special-length">
|
||||
<input type="hidden" name="goods_content" value="{$goods_info['goods_content']}" />
|
||||
<script id="editor" type="text/plain" style="width:100%;height:500px;"></script>
|
||||
</div>
|
||||
</div>
|
||||
<script type="text/javascript" charset="utf-8" src="__STATIC__/ext/ueditor/ueditor.config.js"></script>
|
||||
<script type="text/javascript" charset="utf-8" src="__STATIC__/ext/ueditor/ueditor.all.js"> </script>
|
||||
<script type="text/javascript" charset="utf-8" src="__STATIC__/ext/ueditor/lang/zh-cn/zh-cn.js"></script>
|
||||
</div>
|
||||
|
||||
<div class="layui-tab-item layui-card card-common card-brief head">
|
||||
<div class="layui-card-header">
|
||||
<span class="card-title">高级设置</span>
|
||||
</div>
|
||||
|
||||
<div class="layui-card-body">
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">排序:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="number" name="sort" value="{$goods_info['sort']}" class="layui-input len-short" placeholder="0" autocomplete="off">
|
||||
</div>
|
||||
<div class="word-aux">卡项默认排序号为0,数字越大,排序越靠前,数字重复,则最新添加的靠前。</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">卡项详情显示库存:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="radio" name="stock_show" value="1" title="显示" {if $goods_info['stock_show'] > 0} checked {/if}>
|
||||
<input type="radio" name="stock_show" value="0" title="隐藏" {if $goods_info['stock_show'] == 0} checked {/if}>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">划线价显示:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="radio" name="market_price_show" value="1" title="显示" {if $goods_info['market_price_show'] > 0} checked {/if}>
|
||||
<input type="radio" name="market_price_show" value="0" title="隐藏" {if $goods_info['market_price_show'] == 0} checked {/if}>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">卡项详情显示弹幕:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="radio" name="barrage_show" value="1" title="显示" {if $goods_info['barrage_show'] > 0} checked {/if}>
|
||||
<input type="radio" name="barrage_show" value="0" title="隐藏" {if $goods_info['barrage_show'] == 0} checked {/if}>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">卡项详情显示销量:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="radio" name="sale_show" value="1" title="显示" {if $goods_info['sale_show'] > 0} checked {/if}>
|
||||
<input type="radio" name="sale_show" value="0" title="隐藏" {if $goods_info['sale_show'] == 0} checked {/if}>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">卡项海报:</label>
|
||||
<div class="layui-input-inline">
|
||||
<select name="template_id" lay-search="" lay-verify="">
|
||||
<option value="">请选择卡项海报</option>
|
||||
{foreach name="$poster_list" item="vo"}
|
||||
<option value="{$vo['template_id']}" {if $goods_info.template_id == $vo.template_id} selected {/if}>{$vo['poster_name']}</option>
|
||||
{/foreach}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{if $form_is_exit}
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">卡项表单:</label>
|
||||
<div class="layui-input-block len-mid">
|
||||
<select name="form_id">
|
||||
<option value="0">请选择卡项表单</option>
|
||||
{foreach name="$form_list" item="vo"}
|
||||
<option value="{$vo.id}" {if $goods_info.form_id == $vo.id} selected {/if}>{$vo.form_name}</option>
|
||||
{/foreach}
|
||||
</select>
|
||||
</div>
|
||||
<div class="word-aux">
|
||||
<a href="{:href_url('form://shop/form/addform?form_type=goods')}" class="text-color" target="_blank">创建卡项表单</a>
|
||||
<a href="javascript:;" onclick="refreshFormList()" class="text-color">刷新</a>
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<input type="hidden" name="goods_id" value="{$goods_info['goods_id']}" />
|
||||
<input type="hidden" name="goods_spec_format" value="{$goods_info['goods_spec_format']}" />
|
||||
<input type="hidden" name="goods_image" value="{$goods_info['goods_image']}" />
|
||||
<input type="hidden" name="goods_attr_format" value="{$goods_info['goods_attr_format']}" />
|
||||
<input type="hidden" name="relation_goods" value="{$goods_info['relation_goods']|json_encode}" />
|
||||
<input type="hidden" name="has_stock_records" value='{$has_stock_records ?? 0}' />
|
||||
|
||||
<div class="fixed-btn">
|
||||
<button class="layui-btn layui-btn-primary border-color text-color js-prev" lay-filter="prev">上一步</button>
|
||||
<button class="layui-btn js-save" lay-submit="" lay-filter="save">保存</button>
|
||||
<button class="layui-btn layui-btn-primary border-color text-color js-next" lay-submit="" lay-filter="next">下一步</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!--规格项模板-->
|
||||
<script type="text/html" id="specTemplate">
|
||||
{{# for(var i=0;i<d.list.length;i++){ }}
|
||||
<div class="spec-item" data-index="{{i}}">
|
||||
<div class="layui-form-item spec">
|
||||
<label class="layui-form-label">规格项{{i+1}}:</label>
|
||||
<div class="layui-input-inline">
|
||||
<select name="spec_item">
|
||||
<option value="0"></option>
|
||||
{{# if(d.list[i].spec_name != ''){ }}
|
||||
<option value="{{d.list[i].spec_id}}" data-attr-name="{{d.list[i].spec_name}}" selected>{{d.list[i].spec_name}}</option>
|
||||
{{# }else{ }}
|
||||
{{# } }}
|
||||
</select>
|
||||
<i class="layui-icon layui-icon-close" data-index="{{i}}"></i>
|
||||
</div>
|
||||
|
||||
{{# if(i==0){ }}
|
||||
<div class="layui-input-inline">
|
||||
{{# if(d.add_spec_img){ }}
|
||||
<input type="checkbox" name="add_spec_img" title="添加规格图片" lay-skin="primary" lay-filter="add_spec_img" checked>
|
||||
{{# }else{ }}
|
||||
<input type="checkbox" name="add_spec_img" title="添加规格图片" lay-skin="primary" lay-filter="add_spec_img">
|
||||
{{# } }}
|
||||
</div>
|
||||
{{# } }}
|
||||
</div>
|
||||
|
||||
{{# if(d.list[i].spec_name != ''){ }}
|
||||
<div class="layui-form-item spec-value">
|
||||
{{# }else{ }}
|
||||
<div class="layui-form-item spec-value" style="display:none;">
|
||||
{{# } }}
|
||||
<label class="layui-form-label"></label>
|
||||
<div class="layui-input-block spec-value">
|
||||
{{# if(d.list[i].value.length){ }}
|
||||
<ul>
|
||||
{{# for(var j=0;j<d.list[i].value.length;j++){ }}
|
||||
<li data-index="{{j}}" data-parent-index="{{i}}" >
|
||||
{{# if(i==0 && d.add_spec_img){ }}
|
||||
<div class="img-wrap">
|
||||
{{# if(d.list[i].value[j].image){ }}
|
||||
<img src="{{ns.img(d.list[i].value[j].image)}}" alt="">
|
||||
{{# }else{ }}
|
||||
<img src="SHOP_IMG/goods_spec_value_empty.png" alt="">
|
||||
{{# } }}
|
||||
</div>
|
||||
{{# } }}
|
||||
|
||||
<span title="双击可编辑规格值" ondblclick="$(this).attr('contenteditable',true);$(this).focus()" class="spec-txt" data-spec_value_name="{{d.list[i].value[j].spec_value_name}}" data-parent-index="{{i}}" data-index="{{j}}">{{d.list[i].value[j].spec_value_name}}</span>
|
||||
<!--{{1# if(d.list[i].value[j].is_delete === undefined){ }}-->
|
||||
<i class="layui-icon layui-icon-close" data-parent-index="{{i}}" data-index="{{j}}"></i>
|
||||
<!--{{1# } }}-->
|
||||
</li>
|
||||
{{# } }}
|
||||
</ul>
|
||||
{{# } }}
|
||||
|
||||
<a class="text-color" href="javascript:;" data-index="{{i}}">+添加规格值</a>
|
||||
|
||||
<div class="add-spec-value-popup" data-index="{{i}}">
|
||||
<select name="spec_value_item"></select>
|
||||
<button class="layui-btn layui-btn-primary border-color text-color js-cancel-spec-value">取消</button>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
{{# } }}
|
||||
</script>
|
||||
|
||||
<!--SKU列表模板-->
|
||||
<script type="text/html" id="skuTableTemplate">
|
||||
{{# if(d.skuList.length){ }}
|
||||
<table class="layui-table">
|
||||
<colgroup></colgroup>
|
||||
<thead>
|
||||
<tr>
|
||||
{{# if(d.showSpecName){ }}
|
||||
<th colspan="{{d.colSpan}}" style="min-width: 60px;">卡项规格</th>
|
||||
{{# } }}
|
||||
<th rowspan="{{d.rowSpan}}">SKU图片</th>
|
||||
<th rowspan="{{d.rowSpan}}">副标题</th>
|
||||
<th rowspan="{{d.rowSpan}}"><span class="required">*</span>销售价</th>
|
||||
<th rowspan="{{d.rowSpan}}">划线价</th>
|
||||
<th rowspan="{{d.rowSpan}}">成本价</th>
|
||||
<th rowspan="{{d.rowSpan}}"><span class="required">*</span>库存</th>
|
||||
<th rowspan="{{d.rowSpan}}">库存预警</th>
|
||||
<th rowspan="{{d.rowSpan}}">服务时长</th>
|
||||
<th rowspan="{{d.rowSpan}}">商品编码(多个编码以英文逗号分割)</th>
|
||||
<th rowspan="{{d.rowSpan}}" style="white-space: nowrap;">默认展示</th>
|
||||
</tr>
|
||||
{{# if(d.colSpan>1){ }}
|
||||
<tr>
|
||||
{{# for(var i=0;i<d.specList.length;i++){ }}
|
||||
{{# if(d.specList[i].spec_name && d.specList[i].value.length> 0){ }}
|
||||
<th>{{d.specList[i].spec_name}}</th>
|
||||
{{# } }}
|
||||
{{# } }}
|
||||
</tr>
|
||||
{{# } }}
|
||||
</thead>
|
||||
<tbody>
|
||||
{{# for(var i=0;i<d.skuList.length;i++){ }}
|
||||
<tr>
|
||||
<td class="sku_imgs" id="sku_img_{{i}}" style="width: 130px;">
|
||||
{{# for(var j=0;j<d.skuList[i].sku_images_arr.length;j++){ }}
|
||||
<div class="img-wrap" data-index="{{j}}" data-parent-index="{{i}}">
|
||||
<a href="javascript:void(0)">
|
||||
<img src="{{ns.img(d.skuList[i].sku_images_arr[j])}}" layer-src />
|
||||
</a>
|
||||
<div class="operation">
|
||||
<i title="图片预览" class="iconfont iconreview js-preview"></i>
|
||||
<i title="删除图片" class="layui-icon layui-icon-delete js-delete"></i>
|
||||
</div>
|
||||
</div>
|
||||
{{# } }}
|
||||
{{# if(d.skuList[i].sku_images_arr.length<d.goods_sku_max){ }}
|
||||
<div class="upload-sku-img" data-index="{{i}}"><i class="layui-icon layui-icon-add-1"></i></div>
|
||||
{{# } }}
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" name="spec_name" placeholder="副标题" maxlength="100" value="{{d.skuList[i].spec_name}}" class="layui-input" autocomplete="off" data-index="{{i}}">
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" name="price" placeholder="销售价" lay-verify="sku_price" value="{{d.skuList[i].price}}" class="layui-input" autocomplete="off" data-index="{{i}}">
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" name="market_price" placeholder="划线价" value="{{d.skuList[i].market_price}}" lay-verify="sku_market_price" class="layui-input" autocomplete="off" data-index="{{i}}">
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" name="cost_price" placeholder="成本价" value="{{d.skuList[i].cost_price}}" lay-verify="sku_cost_price" class="layui-input" autocomplete="off" data-index="{{i}}">
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" name="stock" placeholder="库存" value="{{d.skuList[i].stock}}" lay-verify="sku_stock" class="layui-input" autocomplete="off" data-index="{{i}}">
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" name="stock_alarm" placeholder="库存预警" value="{{d.skuList[i].stock_alarm}}" lay-verify="sku_stock_alarm" class="layui-input" autocomplete="off" data-index="{{i}}">
|
||||
</td>
|
||||
<td>
|
||||
<input type="number" name="service_length" placeholder="服务时长" value="{{d.skuList[i].service_length}}" maxlength="50" class="layui-input" autocomplete="off" data-index="{{i}}" lay-verify="verify_num">
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" name="sku_no" placeholder="商品编码" value="{{d.skuList[i].sku_no}}" maxlength="50" class="layui-input" autocomplete="off" data-index="{{i}}">
|
||||
</td>
|
||||
<td style="min-width: 40px;">
|
||||
{{# if(d.skuList[i].is_default == 1) { }}
|
||||
<input type="checkbox" data-index="{{i}}" name="is_default" lay-filter="is_default" lay-skin="switch" checked>
|
||||
{{# }else { }}
|
||||
<input type="checkbox" data-index="{{i}}" name="is_default" lay-filter="is_default" lay-skin="switch">
|
||||
{{# } }}
|
||||
</td>
|
||||
</tr>
|
||||
{{# } }}
|
||||
|
||||
</tbody>
|
||||
</table>
|
||||
{{# } }}
|
||||
<div class="word-aux text-color" style="margin: 10px 0 0 0;">默认展示,是多规格卡项在客户访问卡项时,默认显示的卡项规格</div>
|
||||
</script>
|
||||
|
||||
<!--卡项主图列表-->
|
||||
<script type="text/html" id="goodsImage">
|
||||
{{# if(d.list.length){ }}
|
||||
{{# for(var i=0;i<d.list.length;i++){ }}
|
||||
<div class="item upload_img_square_item" data-index="{{i}}">
|
||||
<div class="img-wrap">
|
||||
<img src="{{ns.img(d.list[i],'small')}}" layer-src="{{ns.img(d.list[i],'big')}}">
|
||||
</div>
|
||||
<div class="operation">
|
||||
<i title="图片预览" class="iconfont iconreview js-preview"></i>
|
||||
<i title="删除图片" class="layui-icon layui-icon-delete js-delete" data-index="{{i}}"></i>
|
||||
<div class="replace_img" data-index="{{i}}">点击替换</div>
|
||||
</div>
|
||||
</div>
|
||||
{{# } }}
|
||||
{{# if(d.list.length < d.max){ }}
|
||||
<div class="item js-add-goods-image upload_img_square">+</div>
|
||||
{{# } }}
|
||||
{{# }else{ }}
|
||||
<div class="item js-add-goods-image upload_img_square">+</div>
|
||||
{{# } }}
|
||||
</script>
|
||||
|
||||
<script>
|
||||
{notempty name="$goods_info.relation_goods"}
|
||||
var relationGoods = {:json_encode($goods_info.relation_goods)};
|
||||
{else/}
|
||||
var relationGoods = [];
|
||||
{/notempty}
|
||||
</script>
|
||||
<script src="__STATIC__/ext/drag-arrange.js"></script>
|
||||
<script src="__STATIC__/ext/video/videojs-ie8.min.js"></script>
|
||||
<script src="__STATIC__/ext/video/video.min.js"></script>
|
||||
<script src="__STATIC__/ext/searchable_select/searchable_select.js"></script>
|
||||
<script src="SHOP_JS/goods_edit_common.js?time=20250527"></script>
|
||||
<script src="ADDON_CARDSERVICE_JS/card_goods_edit.js?v=1"></script>
|
||||
|
||||
296
addon/cardservice/shop/view/card/goods_card.html
Executable file
296
addon/cardservice/shop/view/card/goods_card.html
Executable file
@@ -0,0 +1,296 @@
|
||||
<style>
|
||||
.screen{margin-bottom: 15px;}
|
||||
.contraction span {
|
||||
cursor: pointer;
|
||||
display: inline-block;
|
||||
width: 17px;
|
||||
height: 17px;
|
||||
text-align: center;
|
||||
line-height: 14px;
|
||||
user-select: none;
|
||||
}
|
||||
.card-list {
|
||||
overflow: hidden;
|
||||
padding: 0 45px;
|
||||
}
|
||||
.card-list li .img-wrap {
|
||||
vertical-align: middle;
|
||||
margin-right: 8px;
|
||||
width: 80px;
|
||||
height: 80px;
|
||||
text-align: center;
|
||||
border: 1px solid #e2e2e2;
|
||||
}
|
||||
.card-list li .img-wrap img {
|
||||
max-width: 100%;
|
||||
max-height: 100%;
|
||||
}
|
||||
.card-list li .info-wrap{
|
||||
flex: 1;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
.card-list li .name-wrap{
|
||||
flex: 1;
|
||||
}
|
||||
.card-list li .info-wrap span.sku-name {
|
||||
-webkit-line-clamp: 2;
|
||||
margin-bottom: 5px;
|
||||
line-height: 1.3;
|
||||
margin-top: 0;
|
||||
color: #333;
|
||||
font-size: 14px;
|
||||
}
|
||||
.card-list li .info-wrap span {
|
||||
display: -webkit-box;
|
||||
margin-top: 5px;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
white-space: normal;
|
||||
word-break: break-all;
|
||||
-webkit-box-orient: vertical;
|
||||
-webkit-line-clamp: 1;
|
||||
line-height: 1;
|
||||
font-size: 12px;
|
||||
}
|
||||
.card-list li {
|
||||
float: left;
|
||||
display: flex;
|
||||
padding: 10px;
|
||||
margin-right: 10px;
|
||||
margin-bottom: 10px;
|
||||
border: 1px solid #EFEFEF;
|
||||
width: 294px;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.table-title .title-content p{overflow: hidden;text-overflow:ellipsis;white-space: nowrap;}
|
||||
.goods-box{
|
||||
display: flex;
|
||||
padding: 10px;
|
||||
justify-content: space-between;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
.goods-box .goods-info{
|
||||
width: 700px;
|
||||
}
|
||||
.goods-box .goods-info .goods-content{
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
}
|
||||
.goods-box .goods-info .goods-name{
|
||||
text-overflow: ellipsis;
|
||||
display: -webkit-box;
|
||||
-webkit-line-clamp: 2;
|
||||
-webkit-box-orient: vertical;
|
||||
display: -moz-box;
|
||||
-moz-line-clamp: 2;
|
||||
-moz-box-orient: vertical;
|
||||
|
||||
overflow-wrap: break-word;
|
||||
word-break: break-all;
|
||||
white-space: normal;
|
||||
overflow: hidden;
|
||||
height: 38px;
|
||||
}
|
||||
.goods-box .goods-img{
|
||||
margin-right: 15px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
.goods-box .goods-img img{
|
||||
width: 80px;
|
||||
max-height: 80px;
|
||||
}
|
||||
.goods-box .box-left{
|
||||
display: flex;
|
||||
}
|
||||
.goods-box .box-right{
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
.user-detail{
|
||||
cursor: pointer;
|
||||
}
|
||||
.table-title .title-content{
|
||||
overflow: unset;
|
||||
}
|
||||
</style>
|
||||
|
||||
<!--商品信息-->
|
||||
<div class="goods-box">
|
||||
<div class="box-left">
|
||||
<div class="goods-img">
|
||||
<img src="{:img(explode(',', $goods_info['goods_image'])[0])}">
|
||||
</div>
|
||||
<div class="goods-info">
|
||||
<div class="goods-name">{$goods_info['goods_name']}</div>
|
||||
<div class="goods-content">
|
||||
<div>卡类型:{$card_info.card_type_name}</div>
|
||||
<div>价格:{$goods_info['price']}</div>
|
||||
<div>库存:{$goods_info['goods_stock']}</div>
|
||||
<div>销量:{$goods_info['sale_num']}</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="box-right">
|
||||
<button class="layui-btn layui-btn-primary" onclick="location.hash='{:hash_url('shop/goods/lists')}'">返回</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 搜索框 -->
|
||||
<div class="screen layui-collapse" lay-filter="selection_panel">
|
||||
<div class="layui-colla-item">
|
||||
<form class="layui-colla-content layui-form layui-show">
|
||||
<div class="layui-form-item">
|
||||
<div class="layui-inline">
|
||||
<label class="layui-form-label">购买人:</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="search_text" placeholder="请输入购买人名称" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-row">
|
||||
<button class="layui-btn" lay-submit lay-filter="search">筛选</button>
|
||||
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 列表 -->
|
||||
<table id="card_list" lay-filter="card_list"></table>
|
||||
|
||||
<!-- 工具栏操作 -->
|
||||
<script type="text/html" id="operation">
|
||||
<div class="table-btn">
|
||||
<a class="layui-btn" lay-event="order">订单</a>
|
||||
<a class="layui-btn" lay-event="detail">详情</a>
|
||||
</div>
|
||||
</script>
|
||||
|
||||
<script type="text/html" id="userdetail">
|
||||
<div class='table-title user-detail' onclick="memberDetail({{d.member_id}})">
|
||||
<div class='title-pic'>
|
||||
<img layer-src src="{{ns.img(d.headimg)}}" onerror="this.src = '{:img('public/static/img/default_img/head.png')}' ">
|
||||
</div>
|
||||
<div class='title-content'>{{d.nickname}}</div>
|
||||
</div>
|
||||
</script>
|
||||
|
||||
<script type="text/html" id="goodsDetail">
|
||||
<div class="table-title">
|
||||
<div class=" table-title">
|
||||
<div class="title-pic"><img src="{{ns.img(d.goods_image.split(',')[0], 'mid')}}"></div>
|
||||
<div class="title-content">
|
||||
<p title="{{ d.sku_name }}">{{ d.goods_name }}</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</script>
|
||||
|
||||
<script>
|
||||
var laytpl;
|
||||
$(function () {
|
||||
layui.use(['form', 'laydate','laytpl'], function () {
|
||||
laytpl = layui.laytpl;
|
||||
var table,
|
||||
form = layui.form,
|
||||
laydate = layui.laydate;
|
||||
form.render();
|
||||
|
||||
//渲染时间
|
||||
laydate.render({
|
||||
elem: '#start_time',
|
||||
type: 'datetime'
|
||||
});
|
||||
|
||||
laydate.render({
|
||||
elem: '#end_time',
|
||||
type: 'datetime'
|
||||
});
|
||||
|
||||
/**
|
||||
* 加载表格
|
||||
*/
|
||||
table = new Table({
|
||||
elem: '#card_list',
|
||||
url: ns.url("cardservice://shop/card/goodscard"), //数据接口
|
||||
where: {goods_id:"{$goods_id}"},
|
||||
cols: [
|
||||
[{
|
||||
field: 'nickname',
|
||||
title: '买家信息',
|
||||
templet: '#userdetail'
|
||||
},
|
||||
{
|
||||
title: '总次数/已使用',
|
||||
templet: function (data) {
|
||||
var totalNum = data.card_type == 'timecard' ? '不限' : data.total_num;
|
||||
return totalNum + '/' + data.total_use_num;
|
||||
}
|
||||
},{
|
||||
title: '创建时间',
|
||||
width: '15%',
|
||||
templet: function (data) {
|
||||
return ns.time_to_date(data.create_time)
|
||||
}
|
||||
},{
|
||||
title: '到期时间',
|
||||
width: '15%',
|
||||
templet: function (data) {
|
||||
if (data.end_time > 0) {
|
||||
return ns.time_to_date(data.end_time);
|
||||
} else {
|
||||
return '永久有效';
|
||||
}
|
||||
}
|
||||
}, {
|
||||
title: '操作',
|
||||
toolbar: '#operation',
|
||||
unresize: 'false',
|
||||
align : 'right'
|
||||
}]
|
||||
]
|
||||
});
|
||||
|
||||
/**
|
||||
* 监听工具栏操作
|
||||
*/
|
||||
table.tool(function(obj) {
|
||||
var data = obj.data;
|
||||
switch (obj.event) {
|
||||
case 'order':
|
||||
window.open(ns.href("shop/order/detail?order_id=" + data.order_id));
|
||||
break;
|
||||
case 'detail':
|
||||
window.open(ns.href("cardservice://shop/card/detail?card_id=" + data.card_id));
|
||||
break;
|
||||
}
|
||||
});
|
||||
|
||||
/**
|
||||
* 搜索功能
|
||||
*/
|
||||
form.on('submit(search)', function (data) {
|
||||
table.reload({
|
||||
page: {
|
||||
curr: 1
|
||||
},
|
||||
where: data.field
|
||||
});
|
||||
return false;
|
||||
});
|
||||
|
||||
//批量导出
|
||||
form.on('submit(export_card)', function (data) {
|
||||
location.href = ns.url("shop/card/exportVerify?request_mode=download", data.field);
|
||||
return false;
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
function memberDetail(member_id){
|
||||
window.open(ns.href("shop/member/editmember", {'member_id':member_id}))
|
||||
}
|
||||
</script>
|
||||
123
addon/cardservice/shop/view/card/member_goods_card.html
Executable file
123
addon/cardservice/shop/view/card/member_goods_card.html
Executable file
@@ -0,0 +1,123 @@
|
||||
<!-- 搜索框 -->
|
||||
<div class="single-filter-box" style="margin:15px 0;">
|
||||
|
||||
<div class="layui-form">
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="search_text" placeholder="请输入商品名称" class="layui-input" autocomplete="off">
|
||||
<button type="button" class="layui-btn layui-btn-primary" lay-filter="goods_card_search" lay-submit>
|
||||
<i class="layui-icon"></i>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 列表 -->
|
||||
<table id="card_list" lay-filter="card_list"></table>
|
||||
|
||||
<!-- 商品 -->
|
||||
<script type="text/html" id="goodsCardInfo">
|
||||
<div class="table-title">
|
||||
<div class="title-pic">
|
||||
{{# if(d.goods_image){ }}
|
||||
<img layer-src src="{{ns.img(d.goods_image.split(',')[0],'small')}}"/>
|
||||
{{# } }}
|
||||
</div>
|
||||
<div class="title-content">
|
||||
<a href="javascript:;" class="multi-line-hiding text-color-sub">{{d.goods_name}}</a>
|
||||
</div>
|
||||
</div>
|
||||
</script>
|
||||
|
||||
<!-- 工具栏操作 -->
|
||||
<script type="text/html" id="goods_card_operation">
|
||||
<div class="table-btn">
|
||||
<a class="layui-btn" lay-event="detail">详情</a>
|
||||
</div>
|
||||
</script>
|
||||
<script>
|
||||
var form, goods_card_table, laytpl;
|
||||
layui.use(['form', 'laytpl'], function () {
|
||||
form = layui.form;
|
||||
laytpl = layui.laytpl;
|
||||
form.render();
|
||||
|
||||
goods_card_table = new Table({
|
||||
elem: '#card_list',
|
||||
url: ns.url("cardservice://shop/card/membergoodscard"),
|
||||
async: false,
|
||||
where: {'member_id': "{$member_id}"},
|
||||
parseData: function (res) {
|
||||
return {
|
||||
"code": res.code,
|
||||
"msg": res.message,
|
||||
"count": res.data.count,
|
||||
"data": res.data.list,
|
||||
};
|
||||
},
|
||||
cols: [
|
||||
[{
|
||||
title: '商品',
|
||||
unresize: 'false',
|
||||
width: '25%',
|
||||
templet: '#goodsCardInfo'
|
||||
}, {
|
||||
field: 'card_code',
|
||||
title: '卡号',
|
||||
unresize: 'false',
|
||||
width: '15%',
|
||||
align: 'left',
|
||||
}, {
|
||||
field: 'card_type_name',
|
||||
title: '卡类型',
|
||||
unresize: 'false',
|
||||
width: '10%',
|
||||
align: 'left',
|
||||
}, {
|
||||
field: '',
|
||||
title: '总次数/已使用',
|
||||
templet: function (data) {
|
||||
return data.total_num + '/' + data.total_use_num;
|
||||
}
|
||||
}, {
|
||||
title: '创建时间',
|
||||
width: '15%',
|
||||
templet: function (data) {
|
||||
return ns.time_to_date(data.create_time)
|
||||
}
|
||||
}, {
|
||||
title: '到期时间',
|
||||
width: '15%',
|
||||
templet: function (data) {
|
||||
return data.end_time > 0 ? ns.time_to_date(data.end_time) : '永久有效';
|
||||
}
|
||||
}, {
|
||||
title: '操作',
|
||||
toolbar: '#goods_card_operation',
|
||||
unresize: 'false',
|
||||
align: 'right'
|
||||
}]
|
||||
]
|
||||
});
|
||||
|
||||
goods_card_table.tool(function (obj) {
|
||||
var data = obj.data;
|
||||
switch (obj.event) {
|
||||
case 'detail':
|
||||
window.open(ns.href("cardservice://shop/card/detail?card_id=" + data.card_id))
|
||||
break;
|
||||
}
|
||||
});
|
||||
|
||||
/**
|
||||
* 搜索功能
|
||||
*/
|
||||
form.on('submit(goods_card_search)', function (data) {
|
||||
goods_card_table.reload({
|
||||
page: {
|
||||
curr: 1
|
||||
},
|
||||
where: data.field
|
||||
});
|
||||
});
|
||||
});
|
||||
</script>
|
||||
145
addon/cardservice/shop/view/category/add_category.html
Executable file
145
addon/cardservice/shop/view/category/add_category.html
Executable file
@@ -0,0 +1,145 @@
|
||||
<style>
|
||||
.layui-input-inline.js-pid a{margin-left: 20px;}
|
||||
.link-url-show{margin-right: 10px}
|
||||
.click-link{height: 34px;line-height: 34px;display: inline-block;white-space: nowrap;text-align: center;border-radius: 2px;cursor: pointer;padding: 0 16px;border: 1px solid #C9C9C9;background-color: #fff;color: #555;}
|
||||
</style>
|
||||
|
||||
<form class="layui-form form-wrap">
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label"><span class="required">*</span>分类名称:</label>
|
||||
<div class="layui-input-block len-long">
|
||||
<input name="category_name" type="text" placeholder="请输入分类名称" maxlength="30" lay-verify="required" class="layui-input" autocomplete="off">
|
||||
</div>
|
||||
<div class="word-aux">
|
||||
<p>分类名称最长不超过30个字符</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item layui-hide">
|
||||
<label class="layui-form-label">上级分类:</label>
|
||||
<div class="layui-input-block js-pid">
|
||||
<span class="input-text">顶级分类</span>
|
||||
<input type="hidden" name="pid" value="0">
|
||||
<input type="hidden" name="level" value="1">
|
||||
<input type="hidden" name="category_id_1" value="0">
|
||||
<input type="hidden" name="category_id_2" value="0">
|
||||
<a class="text-color" href="javascript:selectedCategoryPopup();">选择分类</a>
|
||||
</div>
|
||||
<div class="word-aux">
|
||||
<p>如果选择上级分类,那么新增的分类则为被选择上级分类的子分类,不选择上级分类默认为顶级分类</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">分类图片:</label>
|
||||
<div class="layui-input-block">
|
||||
<div class="upload-img-block">
|
||||
<div class="upload-img-box">
|
||||
<div class="upload-default" id="imgUpload">
|
||||
<div class="upload">
|
||||
<i class="iconfont iconshangchuan"></i>
|
||||
<p>点击上传</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="operation">
|
||||
<div>
|
||||
<i title="图片预览" class="iconfont iconreview js-preview" style="margin-right: 20px;"></i>
|
||||
<i title="删除图片" class="layui-icon layui-icon-delete js-delete"></i>
|
||||
</div>
|
||||
|
||||
<div class="replace_img js-replace">点击替换</div>
|
||||
</div>
|
||||
<input type="hidden" name="image">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="word-aux">
|
||||
<p>建议图片尺寸:不能大于100k。图片格式:jpg、png、jpeg。</p>
|
||||
</div>
|
||||
<a id="imageUploadAction"></a>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">分类广告图:</label>
|
||||
<div class="layui-input-block">
|
||||
<div class="upload-img-block">
|
||||
<div class="upload-img-box">
|
||||
<div class="upload-default" id="imgUploadAdv">
|
||||
<div class="upload">
|
||||
<i class="iconfont iconshangchuan"></i>
|
||||
<p>点击上传</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="operation">
|
||||
<div>
|
||||
<i title="图片预览" class="iconfont iconreview js-preview" style="margin-right: 20px;"></i>
|
||||
<i title="删除图片" class="layui-icon layui-icon-delete js-delete"></i>
|
||||
</div>
|
||||
<div class="replace_img js-replace">点击替换</div>
|
||||
</div>
|
||||
<input type="hidden" name="image_adv" value="">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="word-aux">
|
||||
<p>该图片只对一级使用, 建议图片尺寸:550px * 250px。图片格式:jpg、png、jpeg。</p>
|
||||
</div>
|
||||
<a id="imageAdvUploadAction"></a>
|
||||
</div>
|
||||
<div class="layui-form-item link-url-show-wrap">
|
||||
<label class="layui-form-label">广告链接:</label>
|
||||
<div class="layui-input-block">
|
||||
<input name="link_url" type="hidden" class="layui-input len-long" autocomplete="off">
|
||||
<a class="click-link" onclick="selectedLink()">选择链接</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">是否显示</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="radio" name="is_show" value="0" title="显示" checked="">
|
||||
<input type="radio" name="is_show" value="-1" title="不显示">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-row">
|
||||
<button class="layui-btn bg-color" lay-submit lay-filter="save">保存</button>
|
||||
<button type="reset" class="layui-btn layui-btn-primary" onclick="backCardServiceCategoryList()">返回</button>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
<script type="text/html" id="selectedCategory">
|
||||
|
||||
<form class="layui-form">
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label sm">一级分类</label>
|
||||
<div class="layui-input-block len-mid">
|
||||
<select name="category_id_1" lay-filter="category_id_1">
|
||||
<option value="0" data-level="0">顶级分类</option>
|
||||
{{# for(var i=0;i<d.category_list_1.length;i++){ }}
|
||||
{{# if(d.category_id_1 ==d.category_list_1[i].category_id){ }}
|
||||
<option value="{{ d.category_list_1[i].category_id }}" data-level="{{d.category_list_1[i].level}}" selected>{{ d.category_list_1[i].category_name }}</option>
|
||||
{{# }else{ }}
|
||||
<option value="{{ d.category_list_1[i].category_id }}" data-level="{{d.category_list_1[i].level}}">{{ d.category_list_1[i].category_name }}</option>
|
||||
{{# } }}
|
||||
{{# } }}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label sm">二级分类</label>
|
||||
<div class="layui-input-block len-mid">
|
||||
<select name="category_id_2" lay-filter="category_id_2"></select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-row sm">
|
||||
<button class="layui-btn bg-color" lay-submit lay-filter="save_pid">保存</button>
|
||||
</div>
|
||||
|
||||
</form>
|
||||
</script>
|
||||
|
||||
<script src="ADDON_CARDSERVICE_JS/edit_category.js"></script>
|
||||
266
addon/cardservice/shop/view/category/edit_category.html
Executable file
266
addon/cardservice/shop/view/category/edit_category.html
Executable file
@@ -0,0 +1,266 @@
|
||||
<style>
|
||||
.js-pid a{
|
||||
margin-left: 20px;
|
||||
}
|
||||
.form-wrap {
|
||||
margin-top: 0;
|
||||
}
|
||||
.link-url-show{margin-right: 10px}
|
||||
.click-link{height: 34px;line-height: 34px;display: inline-block;white-space: nowrap;text-align: center;border-radius: 2px;cursor: pointer;padding: 0 16px;border: 1px solid #C9C9C9;background-color: #fff;color: #555;}
|
||||
.goods-category-list .layui-table td{border-left: 0;border-right: 0;}
|
||||
.goods-category-list .layui-table .switch{font-size: 16px;cursor: pointer;width: 12px;line-height: 1;display: inline-block;text-align: center;vertical-align: middle;}
|
||||
.goods-category-list .layui-table img{width: 40px;}
|
||||
/* 分类样式*/
|
||||
.table_div{color:#666}
|
||||
.table_head{display: flex;font-weight: bold;background-color: #F7F7F7;}
|
||||
.table_head li{height: 50px;line-height: 50px;border: 0;padding: 0 15px;font-size: 14px;font-weight: 400;color: #333;}
|
||||
.table_head .operate{text-align: right;}
|
||||
.table_head li:first-child{padding-right: 0;}
|
||||
.table_tr{display: flex;border-bottom: 1px solid #e6e6e6;background: #fff;align-items: center;}
|
||||
.table_tr .table_td{position: relative;padding: 5px 15px;font-size: 14px;display: flex;align-items: center;}
|
||||
.table_tr .table_td span{cursor: pointer;}
|
||||
.table_tr .table_td span>img{width:12px;height:12px}
|
||||
.table_tr .table_td span>img.rotate{transform:rotate(90deg);}
|
||||
.table_tr .table_td .img-box{width:30px;height:30px;line-height: 30px;}
|
||||
.table_tr .table_td:first-child{padding-right:0}
|
||||
.table_tr .table-btn{display: flex;flex-wrap: wrap;justify-content: flex-end;}
|
||||
.table_tr .layui-btn{display: flex;justify-content: center;align-items: center;height: 23px;border-radius: 50px;background-color: transparent;color: var(--base-color);text-align: center;padding: 2px 0;margin: 5px 0 5px 10px;position: relative;}
|
||||
.table_two_div{display: none;}
|
||||
.table_three{display: none;}
|
||||
.empty_switch{display: inline-block;width:30px;height:25px;padding-right:15px;}
|
||||
.js-switch{display: inline-block;width:30px;text-align: center;}
|
||||
.table_move{float:left;margin-right: 10px;}
|
||||
.table_moves{float:left;margin-right: 10px;}
|
||||
.tables_move{float:left;margin-right: 20px;padding-left: 70px;}
|
||||
.select-category .layui-layer-content{overflow: auto!important;}
|
||||
.table_three .table_td.checkbox{
|
||||
padding-left: 70px;
|
||||
}
|
||||
</style>
|
||||
|
||||
<form class="layui-form form-wrap">
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label"><span class="required">*</span>分类名称:</label>
|
||||
<div class="layui-input-block">
|
||||
<input name="category_name" type="text" value="{$goods_category_info['category_name']}" placeholder="请输入分类名称" maxlength="30" lay-verify="required" class="layui-input len-long" autocomplete="off">
|
||||
</div>
|
||||
<div class="word-aux">
|
||||
<p>分类名称最长不超过30个字符</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item layui-hide">
|
||||
<label class="layui-form-label">上级分类:</label>
|
||||
<div class="layui-input-block len-mid js-pid">
|
||||
{if $goods_category_info['pid'] == 0}
|
||||
<span class="input-text">顶级分类</span>
|
||||
{else/}
|
||||
<span class="input-text">{$goods_category_parent_info['category_name']}</span>
|
||||
{/if}
|
||||
<input type="hidden" name="pid" value="{$goods_category_info['pid']}">
|
||||
<input type="hidden" name="level" value="{$goods_category_info['level']}">
|
||||
<input type="hidden" name="category_id_1" value="{$goods_category_info['category_id_1']}">
|
||||
<input type="hidden" name="category_id_2" value="{$goods_category_info['category_id_2']}">
|
||||
<input type="hidden" name="category_id_3" value="{$goods_category_info['category_id_3']}">
|
||||
<input type="hidden" name="category_name_1" value="">
|
||||
<a class="text-color" href="javascript:selectedCategoryPopup();">选择分类</a>
|
||||
</div>
|
||||
<div class="word-aux">
|
||||
{if $goods_category_info['level'] == 1}
|
||||
<p>注意:顶级分类不能修改</p>
|
||||
{elseif $goods_category_info['level'] == 2}
|
||||
<p>注意:二级分类可以修改一级分类</p>
|
||||
{elseif $goods_category_info['level'] == 3}
|
||||
<p>注意:三级分类可以修改二级分类</p>
|
||||
{/if}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">分类图片:</label>
|
||||
<div class="layui-input-block">
|
||||
<div class="upload-img-block">
|
||||
<div class="upload-img-box {notempty name="$goods_category_info['image']"}hover{/notempty}">
|
||||
<div class="upload-default" id="imgUpload">
|
||||
{notempty name="$goods_category_info['image']"}
|
||||
<div id="preview_imgUpload" class="preview_img">
|
||||
<img layer-src src="{:img($goods_category_info['image'])}" class="img_prev"/>
|
||||
</div>
|
||||
{else/}
|
||||
<div class="upload">
|
||||
<i class="iconfont iconshangchuan"></i>
|
||||
<p>点击上传</p>
|
||||
</div>
|
||||
{/notempty}
|
||||
</div>
|
||||
<div class="operation">
|
||||
<div>
|
||||
<i title="图片预览" class="iconfont iconreview js-preview" style="margin-right: 20px;"></i>
|
||||
<i title="删除图片" class="layui-icon layui-icon-delete js-delete"></i>
|
||||
</div>
|
||||
|
||||
<div class="replace_img js-replace">点击替换</div>
|
||||
</div>
|
||||
<input type="hidden" name="image" value="{$goods_category_info['image']}">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="word-aux">
|
||||
<p>建议图片尺寸:不能大于100k。图片格式:jpg、png、jpeg。</p>
|
||||
</div>
|
||||
<a id="imageUploadAction"></a>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">分类广告图:</label>
|
||||
<div class="layui-input-block">
|
||||
<div class="upload-img-block ">
|
||||
<div class="upload-img-box {notempty name="$goods_category_info['image_adv']"} hover {/notempty}" >
|
||||
<div class="upload-default" id="imgUploadAdv">
|
||||
{notempty name="$goods_category_info['image_adv']"}
|
||||
<div id="preview_imgUploadAdv" class="preview_img">
|
||||
<img layer-src src="{:img($goods_category_info['image_adv'])}" class="img_prev"/>
|
||||
</div>
|
||||
{else/}
|
||||
<div class="upload">
|
||||
<i class="iconfont iconshangchuan"></i>
|
||||
<p>点击上传</p>
|
||||
</div>
|
||||
{/notempty}
|
||||
</div>
|
||||
<div class="operation">
|
||||
<div>
|
||||
<i title="图片预览" class="iconfont iconreview js-preview" style="margin-right: 20px;"></i>
|
||||
<i title="删除图片" class="layui-icon layui-icon-delete js-delete"></i>
|
||||
</div>
|
||||
|
||||
<div class="replace_img js-replace">点击替换</div>
|
||||
</div>
|
||||
<input type="hidden" name="image_adv" value="{$goods_category_info['image_adv']}">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="word-aux">
|
||||
<p>该图片只对一级使用, 建议图片尺寸:550px * 250px。图片格式:jpg、png、jpeg。</p>
|
||||
</div>
|
||||
<a id="imageAdvUploadAction"></a>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item link-url-show-wrap">
|
||||
<label class="layui-form-label">广告链接:</label>
|
||||
<div class="layui-input-block">
|
||||
<input name="link_url" type="hidden" class="layui-input len-long" autocomplete="off" value="{$goods_category_info.link_url}">
|
||||
<a class="click-link" onclick="selectedLink()">选择链接</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">是否显示</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="radio" name="is_show" value="0" title="显示" {if $goods_category_info['is_show'] == 0} checked="" {/if}>
|
||||
<input type="radio" name="is_show" value="-1" title="不显示" {if $goods_category_info['is_show'] == -1} checked="" {/if}>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<input type="hidden" id="category_id" name="category_id" value="{$goods_category_info['category_id']}">
|
||||
<input type="hidden" name="category_full_name" value="{$goods_category_info['category_full_name']}">
|
||||
|
||||
<div class="form-row">
|
||||
<button class="layui-btn" lay-submit lay-filter="save">保存</button>
|
||||
<button type="reset" class="layui-btn layui-btn-primary" onclick="backCardServiceCategoryList()">返回</button>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
<script type="text/html" id="selectedCategory">
|
||||
<div class="goods-category-list layui-form">
|
||||
<div class="table_div" >
|
||||
<ul class="table_head">
|
||||
<li style="width:60px"></li>
|
||||
<li style="flex:6">分类名称</li>
|
||||
<li style="flex:2">是否显示</li>
|
||||
</ul>
|
||||
<div class="table_body">
|
||||
{if condition="$list"}
|
||||
{foreach name="$list" item="vo" key="index"}
|
||||
<li class="table_one" data-index="{$index}" data-sort="{$vo['sort']}" data-cateid="{$vo['category_id']}">
|
||||
<div class="table_tr">
|
||||
<div class="table_td" style="width:60px">
|
||||
<div class="table_move">
|
||||
<input type="checkbox" name="category_id" title="" lay-skin="primary" data-name="{$vo['category_name']}" value="{$vo['category_id']}" data-category-id="{$vo['category_id']}" data-level="{$vo['level']}" data-open="0" lay-filter="category">
|
||||
</div>
|
||||
{notempty name="$vo['child_list']"}
|
||||
<span class="switch text-color js-switch" data-category-id="{$vo['category_id']}" data-level="{$vo['level']}" data-open="0">
|
||||
+
|
||||
</span>
|
||||
|
||||
{/notempty}
|
||||
</div>
|
||||
<div class="table_td" style="flex:6">{$vo['category_name']}</div>
|
||||
|
||||
<div class="table_td" style="flex:2">
|
||||
{if $vo['is_show'] == 0} 显示 {else /} 不显示 {/if}
|
||||
</div>
|
||||
|
||||
</div>
|
||||
{notempty name="$vo['child_list']"}
|
||||
<div class="table_two_div">
|
||||
{foreach name="$vo['child_list']" item="second"}
|
||||
|
||||
<div class="table_two" data-index="{$index}" data-sort="{$second['sort']}" data-cateid="{$second['category_id']}">
|
||||
|
||||
<div class="table_tr">
|
||||
<div class="table_td" style="width: 36px">
|
||||
</div>
|
||||
<div class="table_td" style="flex:6.4">
|
||||
<div class="table_move">
|
||||
<input type="checkbox" name="category_id" title="" lay-skin="primary" value="{$second['category_id']}" data-category-id="{$second['category_id']}" data-level="{$second['level']}" data-open="0" data-name="{$second['category_name']}" lay-filter="category">
|
||||
</div>
|
||||
<!-- <span class="switch text-color empty_switch" > </span>-->
|
||||
<span>{$second['category_name']}</span>
|
||||
</div>
|
||||
|
||||
<div class="table_td" style="flex:2">
|
||||
{if $second['is_show'] == 0} 显示 {else /} 不显示 {/if}
|
||||
</div>
|
||||
|
||||
</div>
|
||||
{notempty name="$second['child_list']"}
|
||||
|
||||
<div class="table_three layui-hide">
|
||||
{foreach name="$second['child_list']" item="third"}
|
||||
<div class="table_tr table_three_tr" data-sort="{$third['sort']}" data-cateid="{$third['category_id']}">
|
||||
<div class="table_td" style="width: 36px">
|
||||
</div>
|
||||
<div class="table_td checkbox" style="flex:5.5">
|
||||
<input type="checkbox" name="category_id" title="" lay-skin="primary" data-name="{$third['category_name']}" value="{$third['category_id']}" data-category-id="{$third['category_id']}" data-level="{$third['level']}" data-open="0">
|
||||
<div>{$third['category_name']}</div>
|
||||
</div>
|
||||
|
||||
<div class="table_td" style="flex:2">
|
||||
{if $third['is_show'] == 0} 显示 {else /} 不显示 {/if}
|
||||
</div>
|
||||
|
||||
</div>
|
||||
{/foreach}
|
||||
|
||||
</div>
|
||||
{/notempty}
|
||||
</div>
|
||||
{/foreach}
|
||||
</div>
|
||||
{/notempty}
|
||||
</li>
|
||||
|
||||
{/foreach}
|
||||
{else/}
|
||||
<div class="table_tr">
|
||||
<div class="table_td" style="flex:1;text-align: center;">暂无数据</div>
|
||||
</div>
|
||||
{/if}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</script>
|
||||
|
||||
<script src="ADDON_CARDSERVICE_JS/edit_category.js"></script>
|
||||
368
addon/cardservice/shop/view/category/lists.html
Executable file
368
addon/cardservice/shop/view/category/lists.html
Executable file
@@ -0,0 +1,368 @@
|
||||
<style>
|
||||
.table_body{font-family: arial;-webkit-user-select: none;-moz-user-select: none;-ms-user-select: none;user-select: none;}
|
||||
.goods-category-list .layui-table td{border-left: 0;border-right: 0;}
|
||||
.goods-category-list .layui-table .switch{font-size: 16px;cursor: pointer;width: 12px;line-height: 1;display: inline-block;text-align: center;vertical-align: middle;}
|
||||
.goods-category-list .layui-table img{width: 40px;}
|
||||
/* 分类样式*/
|
||||
.table_div{color:#666}
|
||||
.table_head{display: flex;font-weight: bold;background-color: #F7F7F7;}
|
||||
.table_head li{height: 50px;line-height: 50px;border: 0;padding: 0 15px;font-size: 14px;font-weight: 400;color: #333;}
|
||||
.table_head .operate{text-align: right;}
|
||||
.table_head li:first-child{padding-right: 0;}
|
||||
.table_tr{display: flex;border-bottom: 1px solid #e6e6e6;background: #fff;align-items: center;}
|
||||
.table_tr .table_td{position: relative;padding: 5px 15px;font-size: 14px;}
|
||||
.table_tr .table_td span{cursor: pointer;}
|
||||
.table_tr .table_td span>img{width:12px;height:12px}
|
||||
.table_tr .table_td span>img.rotate{transform:rotate(90deg);}
|
||||
.table_tr .table_td .img-box{width:30px;height:30px;line-height: 30px;}
|
||||
.table_tr .table_td:first-child{padding-right:0}
|
||||
.table_tr .table-btn{display: flex;flex-wrap: wrap;justify-content: flex-end;}
|
||||
.table_tr .layui-btn{display: flex;justify-content: center;align-items: center;height: 23px;border-radius: 50px;background-color: transparent;color: var(--base-color);text-align: center;padding: 2px 0;margin: 5px 0 5px 10px;position: relative;}
|
||||
.table_two_div{display: none;}
|
||||
.table_three{display: none;}
|
||||
.empty_switch{display: inline-block;width:30px;height:25px;padding-right:15px;}
|
||||
.js-switch{display: inline-block;height:30px;width:30px;text-align: center;}
|
||||
.table_move{cursor: move;float:left;margin-right: 10px;}
|
||||
.table_moves{cursor: move;float:left;margin-right: 10px;}
|
||||
.tables_move{cursor: move;float:left;margin-right: 20px;padding-left: 70px;}
|
||||
</style>
|
||||
|
||||
<div class="single-filter-box">
|
||||
<button class="layui-btn" onclick="addCategory()">添加项目分类</button>
|
||||
</div>
|
||||
|
||||
<div class="goods-category-list">
|
||||
<div class="table_div" >
|
||||
<ul class="table_head">
|
||||
<li style="width:60px"></li>
|
||||
<li style="flex:6">分类名称</li>
|
||||
<li style="flex:2">图片</li>
|
||||
<!-- <li style="flex:2">排序</li> -->
|
||||
<li style="flex:2">是否显示</li>
|
||||
<li class="operate" style="flex:2">操作</li>
|
||||
</ul>
|
||||
<div class="table_body">
|
||||
{if condition="$list"}
|
||||
{foreach name="$list" item="vo" key="index"}
|
||||
<li class="table_one" data-index="{$index}" data-sort="{$vo['sort']}" data-cateid="{$vo['category_id']}">
|
||||
<div class="table_tr">
|
||||
<div class="table_td" style="width:60px">
|
||||
<div class="table_move iconfont icontuodong"></div>
|
||||
{notempty name="$vo['child_list']"}
|
||||
<span class="switch text-color js-switch" data-category-id="{$vo['category_id']}" data-level="{$vo['level']}" data-open="0">+</span>
|
||||
{/notempty}
|
||||
</div>
|
||||
<div class="table_td" style="flex:6">{$vo['category_name']}</div>
|
||||
<div class="table_td" style="flex:2">
|
||||
{notempty name="$vo['image']"}
|
||||
<div class="img-box">
|
||||
<img layer-src src="{:img($vo['image'])}"/>
|
||||
</div>
|
||||
{/notempty}
|
||||
</div>
|
||||
<!-- <div class="table_td" style="flex:2">
|
||||
<input type="number" class="layui-input len-short" value="{$vo['sort']}" onchange="editSort('{$vo.category_id}')" id="category_sort{$vo.category_id}">
|
||||
</div> -->
|
||||
<!-- <div class="table_td" style="flex:2">-->
|
||||
<!-- {if $vo['is_show'] == 0} 显示 {else /} 不显示 {/if}-->
|
||||
<!-- </div>-->
|
||||
|
||||
<div class="table_td layui-form" style="flex:2">
|
||||
<input type="checkbox" name="is_show" value="{$vo['category_id']}" lay-skin="switch" lay-text="" lay-filter="is_show" {if $vo['is_show'] == 0} checked {/if}>
|
||||
</div>
|
||||
<div class="table_td" style="flex:2">
|
||||
<div class="table-btn">
|
||||
<a class="layui-btn" href="{:href_url('cardservice://shop/servicecategory/editcategory',['category_id'=>$vo['category_id']])}">编辑</a>
|
||||
<a class="layui-btn" href="javascript:deleteCategory({$vo['category_id']});">删除</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{notempty name="$vo['child_list']"}
|
||||
<div class="table_two_div">
|
||||
{foreach name="$vo['child_list']" item="second"}
|
||||
|
||||
<div class="table_two" data-index="{$index}" data-sort="{$second['sort']}" data-cateid="{$second['category_id']}">
|
||||
|
||||
<div class="table_tr">
|
||||
<div class="table_td" style="width: 36px">
|
||||
</div>
|
||||
<div class="table_td" style="flex:6.2">
|
||||
<div class="table_moves iconfont icontuodong"></div>
|
||||
{notempty name="$second['child_list']"}
|
||||
<span class="switch text-color js-switch" data-category-id="{$second['category_id']}" data-level="{$second['level']}" data-open="0" style="padding-right: 15px;">+</span>
|
||||
{else /}
|
||||
<span class="switch text-color empty_switch" > </span>
|
||||
{/notempty}
|
||||
<span>{$second['category_name']}</span>
|
||||
</div>
|
||||
<div class="table_td" style="flex:2">
|
||||
{notempty name="$second['image']"}
|
||||
<div class="img-box">
|
||||
<img layer-src src="{:img($second['image'])}"/>
|
||||
</div>
|
||||
{/notempty}
|
||||
</div>
|
||||
<!-- <div class="table_td" style="flex:2">
|
||||
<input type="number" class="layui-input len-short" value="{$second['sort']}" onchange="editSort('{$second.category_id}')" id="category_sort{$second.category_id}">
|
||||
</div> -->
|
||||
<div class="table_td" style="flex:2">
|
||||
{if $second['is_show'] == 0} 显示 {else /} 不显示 {/if}
|
||||
</div>
|
||||
<div class="table_td" style="flex:2">
|
||||
<div class="table-btn">
|
||||
<a class="layui-btn" href="{:href_url('cardservice://shop/servicecategory/editcategory',['category_id'=>$second['category_id']])}">编辑</a>
|
||||
<a class="layui-btn" href="javascript:deleteCategory({$second['category_id']});">删除</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{notempty name="$second['child_list']"}
|
||||
|
||||
<div class="table_three">
|
||||
{foreach name="$second['child_list']" item="third"}
|
||||
<div class="table_tr table_three_tr" data-sort="{$third['sort']}" data-cateid="{$third['category_id']}">
|
||||
<div class="table_td" style="width: 36px">
|
||||
</div>
|
||||
<div class="table_td" style="flex:6.2">
|
||||
<div class="tables_move iconfont icontuodong"></div>
|
||||
<div>{$third['category_name']}</div>
|
||||
</div>
|
||||
<div class="table_td" style="flex:2">
|
||||
{notempty name="$third['image']"}
|
||||
<div class="img-box">
|
||||
<img layer-src src="{:img($third['image'])}"/>
|
||||
</div>
|
||||
{/notempty}
|
||||
</div>
|
||||
<!-- <div class="table_td" style="flex:2">
|
||||
<input type="number" class="layui-input len-short" value="{$second['sort']}" onchange="editSort('{$second.category_id}')" id="category_sort{$second.category_id}">
|
||||
</div> -->
|
||||
<div class="table_td" style="flex:2">
|
||||
{if $third['is_show'] == 0} 显示 {else /} 不显示 {/if}
|
||||
</div>
|
||||
<div class="table_td" style="flex:2">
|
||||
<div class="table-btn">
|
||||
<a class="layui-btn" href="{:href_url('cardservice://shop/servicecategory/editcategory',['category_id'=>$third['category_id']])}">编辑</a>
|
||||
<a class="layui-btn" href="javascript:deleteCategory({$third['category_id']});">删除</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{/foreach}
|
||||
|
||||
</div>
|
||||
{/notempty}
|
||||
</div>
|
||||
{/foreach}
|
||||
</div>
|
||||
{/notempty}
|
||||
</li>
|
||||
|
||||
{/foreach}
|
||||
{else/}
|
||||
<div class="table_tr">
|
||||
<div class="table_td" style="flex:1;text-align: center;">暂无数据</div>
|
||||
</div>
|
||||
{/if}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script src="STATIC_EXT/drag-arrange.js"></script>
|
||||
<script src="STATIC_EXT/diyview/js/ddsort.js"></script>
|
||||
<script>
|
||||
|
||||
|
||||
var form;
|
||||
layui.use(['form'], function(){
|
||||
|
||||
form = layui.form;
|
||||
form.on('switch(is_show)', function(data){
|
||||
|
||||
$.ajax({
|
||||
url: ns.url("cardservice://shop/servicecategory/modifyShow"),
|
||||
data: {id:data.value,is_show:data.elem.checked ? 0 : -1},
|
||||
dataType: 'JSON',
|
||||
type: 'POST',
|
||||
async: false,
|
||||
success: function (res) {
|
||||
layer.msg(res.message);
|
||||
}
|
||||
});
|
||||
|
||||
console.log(data.elem); // 获取当前 checkbox 的 DOM 对象
|
||||
console.log(data.elem.checked); // 获取当前 checkbox 的选中状态,true 或 false
|
||||
console.log(data.value); // 获取当前 checkbox 的 value 值,即 name 属性的值或者自定义的 value 值(如果有的话)
|
||||
console.log(data.othis); // 获取当前 checkbox 的 jQuery 对象
|
||||
});
|
||||
form.render();
|
||||
});
|
||||
|
||||
|
||||
$(function() {
|
||||
var tempPos = '';
|
||||
$('li').arrangeable({
|
||||
dragSelector: '.table_move',
|
||||
callback:function(e){
|
||||
var temparr = [];
|
||||
$('.table_one').each(function(index,item){
|
||||
var tempObj = {};
|
||||
tempObj.category_id = item.getAttribute('data-cateid');
|
||||
tempObj.sort = index;
|
||||
temparr.push(tempObj)
|
||||
})
|
||||
setTimeout(function(){
|
||||
$.ajax({
|
||||
url: ns.url("cardservice://shop/servicecategory/modifySort"),
|
||||
data: {category_sort_array : JSON.stringify(temparr)},
|
||||
dataType: 'JSON',
|
||||
type: 'POST',
|
||||
async: false,
|
||||
success: function (res) {
|
||||
layer.msg(res.message);
|
||||
}
|
||||
});
|
||||
},100);
|
||||
}
|
||||
});
|
||||
$('.table_two').arrangeable({
|
||||
dragSelector: '.table_moves',
|
||||
callback:function(e){
|
||||
var temparrs = [];
|
||||
$('.table_two').each(function(index,item){
|
||||
var tempObjs = {};
|
||||
tempObjs.category_id = item.getAttribute('data-cateid');
|
||||
tempObjs.sort = index;
|
||||
temparrs.push(tempObjs)
|
||||
});
|
||||
setTimeout(function(){
|
||||
$.ajax({
|
||||
url: ns.url("cardservice://shop/servicecategory/modifySort"),
|
||||
data: {category_sort_array : JSON.stringify(temparrs)},
|
||||
dataType: 'JSON',
|
||||
type: 'POST',
|
||||
async: false,
|
||||
success: function (res) {
|
||||
layer.msg(res.message);
|
||||
}
|
||||
});
|
||||
},100);
|
||||
}
|
||||
});
|
||||
$('.table_three_tr').arrangeable({
|
||||
dragSelector: '.tables_move',
|
||||
callback:function(e){
|
||||
var temparres = [];
|
||||
$('.table_three_tr').each(function(index,item){
|
||||
var tempObjes = {};
|
||||
tempObjes.category_id = item.getAttribute('data-cateid');
|
||||
tempObjes.sort = index;
|
||||
temparres.push(tempObjes)
|
||||
});
|
||||
setTimeout(function(){
|
||||
$.ajax({
|
||||
url: ns.url("cardservice://shop/servicecategory/modifySort"),
|
||||
data: {category_sort_array : JSON.stringify(temparres)},
|
||||
dataType: 'JSON',
|
||||
type: 'POST',
|
||||
async: false,
|
||||
success: function (res) {
|
||||
layer.msg(res.message);
|
||||
}
|
||||
});
|
||||
},100);
|
||||
}
|
||||
});
|
||||
});
|
||||
// var tempPos = '';
|
||||
// bindDragSort('.table_body' ,'.table_one');
|
||||
// bindDragSort('.table_two_div' ,'.table_two');
|
||||
// bindDragSort('.table_three' ,'.table_tr');
|
||||
// function bindDragSort(paremtElem,childElem){
|
||||
// $(paremtElem ).DDSort({
|
||||
// target: childElem,
|
||||
// floatStyle: {
|
||||
// 'border': '1px solid #ccc',
|
||||
// 'background-color': '#fff'
|
||||
// },
|
||||
// down:function(e){
|
||||
// tempPos = $(this).data('sort');
|
||||
// },
|
||||
// up:function(e){
|
||||
// var index = $(this).index(),self = $(this);
|
||||
// if(index != tempPos){
|
||||
// var temparr = [];
|
||||
// $(childElem).each(function(index,item){
|
||||
// var tempObj = {};
|
||||
// tempObj.category_id = item.getAttribute('data-cateid');
|
||||
// tempObj.sort = index;
|
||||
// temparr.push(tempObj)
|
||||
// })
|
||||
// setTimeout(function(){
|
||||
// $.ajax({
|
||||
// url: ns.url("cardservice://shop/servicecategory/modifySort"),
|
||||
// data: {category_sort_array : JSON.stringify(temparr)},
|
||||
// dataType: 'JSON',
|
||||
// type: 'POST',
|
||||
// async: false,
|
||||
// success: function (res) {
|
||||
// self.data('sort',index)
|
||||
// layer.msg(res.message);
|
||||
// }
|
||||
// });
|
||||
// },100);
|
||||
// }
|
||||
//
|
||||
// }
|
||||
// });
|
||||
// }
|
||||
|
||||
$(function () {
|
||||
loadImgMagnify(); //图片放大
|
||||
|
||||
//展开收齐点击事件
|
||||
$(".js-switch").click(function (event) {
|
||||
event.stopPropagation();
|
||||
var category_id = $(this).attr("data-category-id");
|
||||
var level = $(this).attr("data-level");
|
||||
var open = parseInt($(this).attr("data-open").toString());
|
||||
if(open){
|
||||
$(".goods-category-list .layui-table tr[data-category-id-"+ level+"='" + category_id + "']").hide();
|
||||
// $(this).children("img").removeClass('rotate');
|
||||
$(this).text("+");
|
||||
if(level == 1) $(this).parents('.table_tr').siblings('.table_two_div').hide();
|
||||
else if(level == 2) $(this).parents('.table_tr').siblings('.table_three').hide();
|
||||
|
||||
}else{
|
||||
$(".goods-category-list .layui-table tr[data-category-id-"+ level+"='" + category_id + "']").show();
|
||||
$(this).text("-");
|
||||
// $(this).children("img").addClass('rotate');
|
||||
if(level == 1) $(this).parents('.table_tr').siblings('.table_two_div').show();
|
||||
else if(level == 2) $(this).parents('.table_tr').siblings('.table_three').show();
|
||||
|
||||
}
|
||||
$(this).attr("data-open", (open ? 0 : 1));
|
||||
|
||||
});
|
||||
});
|
||||
|
||||
function deleteCategory(category_id) {
|
||||
layer.confirm('确认要删除该分类吗,请谨慎操作', function(index) {
|
||||
$.ajax({
|
||||
url: ns.url("cardservice://shop/servicecategory/deleteCategory"),
|
||||
data: {category_id : category_id},
|
||||
dataType: 'JSON',
|
||||
type: 'POST',
|
||||
async: false,
|
||||
success: function (res) {
|
||||
layer.msg(res.message);
|
||||
layer.close(index);
|
||||
if (res.code == 0) {
|
||||
listenerHash(); // 刷新页面
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
function addCategory() {
|
||||
location.hash = ns.hash("cardservice://shop/servicecategory/addcategory");
|
||||
}
|
||||
</script>
|
||||
242
addon/cardservice/shop/view/public/css/add_reserve.css
Executable file
242
addon/cardservice/shop/view/public/css/add_reserve.css
Executable file
@@ -0,0 +1,242 @@
|
||||
html,body,.main-wrap {
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
background: #fff;
|
||||
}
|
||||
.main-wrap {
|
||||
padding: 20px;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
.error {
|
||||
font-size: 12px;
|
||||
color: #f00;
|
||||
line-height: 1;
|
||||
margin-top: 10px;
|
||||
display: none;
|
||||
margin-left: 130px;
|
||||
}
|
||||
.layui-input-inline i {
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
right: 10px;
|
||||
transform: translateY(-50%);
|
||||
}
|
||||
.search-wrap {
|
||||
position: relative;
|
||||
}
|
||||
.search-wrap i {
|
||||
border-left: 1px solid #E6E6E6;
|
||||
line-height: 30px;
|
||||
padding-left: 10px;
|
||||
cursor: pointer;
|
||||
}
|
||||
.layui-form-label {
|
||||
width: 130px;
|
||||
}
|
||||
.word-aux {
|
||||
margin-left: 130px!important;
|
||||
}
|
||||
.layui-form-label + .layui-input-block {
|
||||
margin-left: 130px;
|
||||
}
|
||||
.select-time .time-wrap {
|
||||
width: 330px;
|
||||
padding: 15px;
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
.select-time .no-today {
|
||||
display: none;
|
||||
}
|
||||
.select-time .time-item {
|
||||
height: 30px;
|
||||
line-height: 30px;
|
||||
width: 60px;
|
||||
cursor: pointer;
|
||||
}
|
||||
.select-time .time-item:hover,.select-time .time-item.active {
|
||||
color: var(--base-color);
|
||||
}
|
||||
.select-time .time-item.no-select {
|
||||
color: #999;
|
||||
cursor: not-allowed;
|
||||
}
|
||||
.align-center {
|
||||
text-align: center!important;
|
||||
}
|
||||
.service-item,.servicer-item {
|
||||
display: flex;
|
||||
border: 1px solid #E6E6E6;
|
||||
align-items: center;
|
||||
cursor: pointer;
|
||||
height: 52px;
|
||||
}
|
||||
.service-item .iconfont, .servicer-item .iconfont {
|
||||
margin-right: 5px;
|
||||
}
|
||||
.service-item .info, .servicer-item .info {
|
||||
flex: 1;
|
||||
padding: 6px 10px;
|
||||
}
|
||||
.service-item .info .desc, .servicer-item .info .desc{
|
||||
font-size: 12px;
|
||||
color: #999;
|
||||
}
|
||||
.service-item .info .title, .servicer-item .info .title {
|
||||
width: 100%;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
}
|
||||
.select-service {
|
||||
width: 660px;
|
||||
height: 240px;
|
||||
box-sizing: border-box;
|
||||
padding: 15px;
|
||||
}
|
||||
.select-service .service-wrap {
|
||||
overflow-y: scroll;
|
||||
height: 100%;
|
||||
}
|
||||
.select-service .service-wrap .empty {
|
||||
line-height: 200px;
|
||||
text-align: center;
|
||||
width: 100%;
|
||||
}
|
||||
.select-service .service-wrap::-webkit-scrollbar {
|
||||
width: 6px;
|
||||
height: 6px;
|
||||
background-color: transparent;
|
||||
}
|
||||
.select-service .service-wrap::-webkit-scrollbar-button {
|
||||
display: none;
|
||||
}
|
||||
.select-service .service-wrap::-webkit-scrollbar-thumb {
|
||||
border-radius: .06rem;
|
||||
box-shadow: inset 0 0 .06rem rgba(45,43,43,.45);
|
||||
background-color: #ddd;
|
||||
}
|
||||
.select-service .service-wrap::-webkit-scrollbar-track {
|
||||
background-color: transparent;
|
||||
}
|
||||
.select-service .service-wrap .flex-wrap{
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
.select-service .service-wrap .item {
|
||||
margin: 0 8px 8px 0;
|
||||
background: #eee;
|
||||
padding: 8px;
|
||||
width: 186px;
|
||||
cursor: pointer;
|
||||
transition: all .3s;
|
||||
}
|
||||
.select-service .service-wrap .item:hover{
|
||||
background: #fff5ed;
|
||||
}
|
||||
.select-service .service-wrap .item:nth-child(3n+3) {
|
||||
margin-right: 0;
|
||||
}
|
||||
.select-service .service-wrap .title{
|
||||
width: 100%;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
}
|
||||
.select-service .service-wrap .desc {
|
||||
font-size: 12px;
|
||||
color: #999;
|
||||
}
|
||||
.save-wrap {
|
||||
position: fixed;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
background: #fff;
|
||||
height: 50px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
border-top: 1px solid #eee;
|
||||
width: 100%;
|
||||
}
|
||||
.member-info {
|
||||
display: inline-flex;
|
||||
padding: 10px;
|
||||
border: 1px solid #e6e6e6;
|
||||
min-width: 300px;
|
||||
max-width: 590px;
|
||||
}
|
||||
.member-info img {
|
||||
width: 50px;
|
||||
height: 50px;
|
||||
}
|
||||
.member-info .info {
|
||||
flex: 1;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
padding-left: 10px;
|
||||
justify-content: space-around;
|
||||
}
|
||||
.member-info .info div {
|
||||
line-height: 1;
|
||||
}
|
||||
.member-info .info span{
|
||||
margin-right: 10px;
|
||||
}
|
||||
.select-servicer {
|
||||
width: 150px;
|
||||
height: 240px;
|
||||
box-sizing: border-box;
|
||||
padding: 15px 10px;
|
||||
overflow-y: scroll;
|
||||
}
|
||||
.select-servicer .select-item {
|
||||
width: 100%;
|
||||
height: 40px;
|
||||
line-height: 40px;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
padding: 0 10px;
|
||||
background: #f5f5f5;
|
||||
cursor: pointer;
|
||||
margin-bottom: 10px;
|
||||
transition: all .3s;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
.select-servicer .select-item:hover {
|
||||
background: #fff5ed;
|
||||
}
|
||||
.select-servicer::-webkit-scrollbar {
|
||||
width: 6px;
|
||||
height: 6px;
|
||||
background-color: transparent;
|
||||
}
|
||||
.select-servicer::-webkit-scrollbar-button {
|
||||
display: none;
|
||||
}
|
||||
.select-servicer::-webkit-scrollbar-thumb {
|
||||
border-radius: .06rem;
|
||||
box-shadow: inset 0 0 .06rem rgba(45,43,43,.45);
|
||||
background-color: #ddd;
|
||||
}
|
||||
.select-servicer::-webkit-scrollbar-track {
|
||||
background-color: transparent;
|
||||
}
|
||||
|
||||
.layui-dropdown {
|
||||
position: absolute;
|
||||
left: -999999px;
|
||||
top: -999999px;
|
||||
z-index: 66666666;
|
||||
margin: 5px 0;
|
||||
min-width: 100px
|
||||
}
|
||||
|
||||
.layui-dropdown:before {
|
||||
content: "";
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
height: 6px;
|
||||
left: 0;
|
||||
top: -6px
|
||||
}
|
||||
68
addon/cardservice/shop/view/public/css/card_goods_edit.css
Executable file
68
addon/cardservice/shop/view/public/css/card_goods_edit.css
Executable file
@@ -0,0 +1,68 @@
|
||||
.card-type {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
.card-type .card-type-item {
|
||||
padding: 15px;
|
||||
border: 1px solid #ddd;
|
||||
line-height: 1;
|
||||
margin: 0 10px 10px 0;
|
||||
/*border-radius: 4px;*/
|
||||
cursor: pointer;
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
width: 285px;
|
||||
}
|
||||
.card-type .card-type-item:hover,.card-type .card-type-item.active {
|
||||
border-color: var(--base-color);
|
||||
color: var(--base-color);
|
||||
}
|
||||
.card-type .card-type-item .title{
|
||||
font-size: 14px;
|
||||
font-weight: bold;
|
||||
}
|
||||
.card-type .card-type-item .desc{
|
||||
margin-top: 8px;
|
||||
color: #999;
|
||||
}
|
||||
.card-type .card-type-item .iconfont {
|
||||
position: absolute;
|
||||
right: 0;
|
||||
display: none;
|
||||
}
|
||||
.card-type .card-type-item.active .iconfont {
|
||||
display: block;
|
||||
}
|
||||
.relation-goods-table {
|
||||
margin-right: 50px;
|
||||
max-width: 800px;
|
||||
}
|
||||
.relation-goods-table .layui-table-body {
|
||||
max-height: 300px;
|
||||
}
|
||||
.relation-goods-table .table-bottom{
|
||||
display: none;
|
||||
}
|
||||
.relation-goods-table .len-short {
|
||||
width: 80px!important;
|
||||
}
|
||||
.relation-goods-table .layui-table-view {
|
||||
margin-top: 10px;
|
||||
}
|
||||
.card-type-content .batch-set {
|
||||
font-size: 14px;
|
||||
display: none;
|
||||
}
|
||||
.card-type-content .batch-set .batch-set-wrap{
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
.card-type-content .batch-set .len-short {
|
||||
width: 80px!important;
|
||||
}
|
||||
.card-type-content .batch-set .set-content-wrap {
|
||||
display: none;
|
||||
}
|
||||
.card-type-content .batch-set .layui-btn+.layui-btn{
|
||||
margin-left: 0;
|
||||
}
|
||||
337
addon/cardservice/shop/view/public/css/reserve_index.css
Executable file
337
addon/cardservice/shop/view/public/css/reserve_index.css
Executable file
@@ -0,0 +1,337 @@
|
||||
.layui-body {
|
||||
padding-bottom: 0!important;
|
||||
}
|
||||
.uni-flex {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
}
|
||||
.uni-flex-item {
|
||||
flex: 1;
|
||||
}
|
||||
.uni-row {
|
||||
flex-direction: row;
|
||||
}
|
||||
.uni-column {
|
||||
flex-direction: column;
|
||||
}
|
||||
.panel-head {
|
||||
align-items: center;
|
||||
}
|
||||
.panel-head button {
|
||||
margin: 0 10px 0 0;
|
||||
}
|
||||
.panel-head .status {
|
||||
align-items: center;
|
||||
}
|
||||
.panel-head .status div {
|
||||
line-height: 1;
|
||||
}
|
||||
.panel-head .status .color {
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
margin: 0 10px 0 30px;
|
||||
}
|
||||
|
||||
.stay-confirm {
|
||||
background: #8558FA;
|
||||
border-color: #8558FA;
|
||||
}
|
||||
|
||||
.stay-tostore {
|
||||
background: #1475FA;
|
||||
border-color: #1475FA;
|
||||
}
|
||||
|
||||
.arrived-store {
|
||||
background: #FA5B14;
|
||||
border-color: #FA5B14;
|
||||
}
|
||||
|
||||
.completed {
|
||||
background-color: #10C610;
|
||||
border-color: #10C610;
|
||||
}
|
||||
|
||||
.cancelled {
|
||||
background-color: #E6E6E6;
|
||||
border-color: #E6E6E6;
|
||||
}
|
||||
|
||||
.panel-body {
|
||||
margin-top: 20px;
|
||||
position: relative;
|
||||
}
|
||||
.panel-body .time-type{
|
||||
position:absolute;
|
||||
top:14px;
|
||||
right:0px;
|
||||
display:flex;
|
||||
flex-direction: row;
|
||||
}
|
||||
.panel-body .time-type span{
|
||||
width:32px;
|
||||
line-height:32px;
|
||||
text-align: center;
|
||||
border:1px solid #E6E6E6;
|
||||
font-size:14px;
|
||||
cursor: pointer;
|
||||
}
|
||||
.panel-body .time-type span:nth-child(1){
|
||||
border-right:none;
|
||||
}
|
||||
.panel-body .time-type span:nth-child(2){
|
||||
border-left:none;
|
||||
}
|
||||
.panel-body .time-type span.on{
|
||||
background: #8558FA;
|
||||
border-color:#8558FA;
|
||||
color:#fff;
|
||||
}
|
||||
.panel-body .time-data{
|
||||
height:100%;
|
||||
}
|
||||
.panel-body .head > div, .panel-body .body > div {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
flex: 1;
|
||||
border-right: 1px solid #E6E6E6;
|
||||
}
|
||||
.panel-body .head > div:last-child, .panel-body .body > div:last-child {
|
||||
border-right: 0;
|
||||
}
|
||||
.panel-body .head {
|
||||
height: 60px;
|
||||
border: 1px solid #E6E6E6;
|
||||
}
|
||||
.panel-body .head button {
|
||||
font-size: 12px;
|
||||
padding: 0 10px;
|
||||
}
|
||||
.panel-body .head span {
|
||||
font-size: 12px;
|
||||
margin-left: 5px;
|
||||
}
|
||||
.panel-body .body {
|
||||
height: 50vh;
|
||||
border: 1px solid #E6E6E6;
|
||||
border-top:none;
|
||||
}
|
||||
.panel-body .time-wrap {
|
||||
font-size: 18px;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
height: 60px;
|
||||
}
|
||||
.panel-body .time-wrap .date{
|
||||
flex: unset;
|
||||
margin: 0 20px;
|
||||
border: none;
|
||||
}
|
||||
.panel-body .time-wrap .iconfont {
|
||||
font-size: 18px;
|
||||
cursor: pointer;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.panel-body .prev,.panel-body .next {
|
||||
cursor: pointer;
|
||||
}
|
||||
.panel-body .body > div {
|
||||
height: 100%;
|
||||
}
|
||||
.panel-body .body .common-scrollbar {
|
||||
overflow-y: scroll;
|
||||
}
|
||||
.panel-body .body .iconqianhou1, .panel-body .body .iconqianhou2 {
|
||||
font-size: 0.28rem;
|
||||
color: #E6E6E6;
|
||||
}
|
||||
.panel-body .body .box {
|
||||
width: 100%;
|
||||
}
|
||||
.panel-body .body .panel-item {
|
||||
width: calc(100% - 20px);
|
||||
margin: 20px 10px 0 10px;
|
||||
padding: 10px;
|
||||
border-width: 4px 1px 1px 1px;
|
||||
border-style: solid;
|
||||
box-sizing: border-box;
|
||||
border-radius: 4px;
|
||||
background-color: #fff !important;
|
||||
}
|
||||
.panel-body .body .panel-item:last-child {
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
.panel-body .body .common-scrollbar {
|
||||
display: block;
|
||||
}
|
||||
.panel-body .body .username {
|
||||
font-size: 14px;
|
||||
line-height: 1;
|
||||
}
|
||||
.panel-body .body .time {
|
||||
color: #fff;
|
||||
font-size: 12px;
|
||||
padding: 5px;
|
||||
line-height: 1;
|
||||
width: auto;
|
||||
display: inline-block;
|
||||
margin-top: 10px;
|
||||
border-radius: 2px;
|
||||
}
|
||||
.panel-body .body .service {
|
||||
margin-top: 10px;
|
||||
line-height: 1;
|
||||
overflow: hidden;
|
||||
white-space: nowrap;
|
||||
text-overflow: ellipsis;
|
||||
}
|
||||
.panel-body .body .action {
|
||||
text-align: right;
|
||||
margin-top: 5px;
|
||||
}
|
||||
.panel-body .body .action:after{
|
||||
clear: both;
|
||||
}
|
||||
.panel-body .body .action .iconfont {
|
||||
font-size: 14px;
|
||||
color: #E6E6E6;
|
||||
cursor: pointer;
|
||||
border: 1.5px solid #ccc;
|
||||
border-radius: 50%;
|
||||
padding: 2px;
|
||||
}
|
||||
.common-scrollbar {
|
||||
overflow-y: scroll;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
.common-scrollbar::-webkit-scrollbar {
|
||||
width: 6px;
|
||||
height: 6px;
|
||||
background-color: rgba(0, 0, 0, 0);
|
||||
}
|
||||
.common-scrollbar::-webkit-scrollbar-button {
|
||||
display: none;
|
||||
}
|
||||
.common-scrollbar::-webkit-scrollbar-thumb {
|
||||
border-radius: 6px;
|
||||
box-shadow: inset 0 0 6px rgba(45, 43, 43, 0.45);
|
||||
background-color: #ddd;
|
||||
}
|
||||
.common-scrollbar::-webkit-scrollbar-track {
|
||||
background-color: transparent;
|
||||
}
|
||||
|
||||
.panel-body .month-table .table-tr{
|
||||
display:flex;
|
||||
flex-direction: row;
|
||||
border:1px solid #E6E6E6;
|
||||
border-bottom:none;
|
||||
}
|
||||
.panel-body .month-table .table-body .table-tr:last-child{
|
||||
border-bottom:1px solid #E6E6E6;
|
||||
}
|
||||
.panel-body .month-table .table-tr .table-td{
|
||||
width:100%;
|
||||
border-right:1px solid #E6E6E6;
|
||||
}
|
||||
.panel-body .month-table .table-tr .table-td:last-child{
|
||||
border-right: none;
|
||||
}
|
||||
.panel-body .month-table .table-head .table-td{
|
||||
text-align: center;
|
||||
line-height:40px;
|
||||
}
|
||||
.panel-body .month-table .table-body .table-td{
|
||||
text-align: left;
|
||||
}
|
||||
.panel-body .month-table .table-body .table-td .top{
|
||||
border-bottom:1px solid #E6E6E6;
|
||||
line-height: 26px;
|
||||
text-indent: 8px;
|
||||
}
|
||||
.panel-body .month-table .table-body .table-td.not-curr-month .top{
|
||||
color:#909399;
|
||||
}
|
||||
.panel-body .month-table .table-body .table-td .bottom{
|
||||
height:78px;
|
||||
}
|
||||
.panel-body .month-table .table-body .table-td .bottom .item-box{
|
||||
position: relative;
|
||||
}
|
||||
.panel-body .month-table .table-body .table-td .bottom .item{
|
||||
display:flex;
|
||||
flex-direction: row;
|
||||
align-items: center;
|
||||
cursor: pointer;
|
||||
}
|
||||
.panel-body .month-table .table-body .table-td .bottom .item span:first-child{
|
||||
display:block;
|
||||
width:4px;
|
||||
height:4px;
|
||||
min-width: 4px;
|
||||
border-radius: 50%;
|
||||
/*background: #60BECA;*/
|
||||
margin:0 6px;
|
||||
}
|
||||
.panel-body .month-table .table-body .table-td .bottom .item span:last-child{
|
||||
display: -webkit-box;
|
||||
-webkit-box-orient: vertical;
|
||||
-webkit-line-clamp: 1;
|
||||
overflow: hidden;
|
||||
}
|
||||
.panel-body .month-table .table-body .table-td .bottom .item-box .detail-card{
|
||||
position: absolute;
|
||||
bottom:25px;
|
||||
left:30px;
|
||||
border:1px solid #ccc;
|
||||
width:150px;
|
||||
padding:8px 8px;
|
||||
background: #fff;
|
||||
z-index:1;
|
||||
border-radius: 3px;
|
||||
display:none;
|
||||
}
|
||||
.panel-body .month-table .table-body .table-td .bottom .item-box .detail-card:after {
|
||||
position: absolute;
|
||||
left: 40px;
|
||||
bottom: -6px;
|
||||
width: 10px;
|
||||
height: 10px;
|
||||
margin-top: -2px;
|
||||
border-right: 1px solid #ccc;
|
||||
border-bottom: 1px solid #ccc;
|
||||
-webkit-transform: rotate(45deg);
|
||||
content: '';
|
||||
background: #ffffff;
|
||||
}
|
||||
.panel-body .month-table .table-body .table-td .bottom .item-box .detail-card .time{
|
||||
display:inline-block;
|
||||
color:#fff;
|
||||
padding:2px 5px;
|
||||
border-radius: 2px;
|
||||
margin-top:2px;
|
||||
margin-bottom:2px;
|
||||
}
|
||||
.panel-body .month-table .table-body .table-td .bottom .item-box .detail-card .state{
|
||||
text-align: right;
|
||||
margin-top:2px;
|
||||
}
|
||||
|
||||
.panel-body .month-table .table-body .table-td .bottom .item-box .detail-card .service{
|
||||
display: -webkit-box;
|
||||
-webkit-box-orient: vertical;
|
||||
-webkit-line-clamp: 2;
|
||||
overflow: hidden;
|
||||
}
|
||||
.panel-body .month-table .table-body .table-td .bottom .item-box:hover .detail-card{
|
||||
display: block;
|
||||
}
|
||||
.panel-body .month-table .table-body .table-td .bottom .more{
|
||||
text-indent: 6px;
|
||||
cursor: pointer;
|
||||
}
|
||||
.panel-body .month-table .table-body .table-td .bottom .more a{
|
||||
color:#8558FA;
|
||||
}
|
||||
BIN
addon/cardservice/shop/view/public/img/zone_preview.png
Executable file
BIN
addon/cardservice/shop/view/public/img/zone_preview.png
Executable file
Binary file not shown.
|
After Width: | Height: | Size: 146 KiB |
347
addon/cardservice/shop/view/public/js/card_goods_edit.js
Executable file
347
addon/cardservice/shop/view/public/js/card_goods_edit.js
Executable file
@@ -0,0 +1,347 @@
|
||||
requestAdd = 'cardservice://shop/card/addGoods';
|
||||
requestEdit = 'cardservice://shop/card/editGoods';
|
||||
goodsTag = '卡项';
|
||||
|
||||
var relationGoods = [];
|
||||
|
||||
// 追加刷新商品sku数据
|
||||
appendRefreshGoodsSkuData = {
|
||||
service_length: 0
|
||||
};
|
||||
|
||||
// 追加单规格数据
|
||||
function appendSingleGoodsData(data) {
|
||||
return {
|
||||
service_length: data.field.service_length
|
||||
};
|
||||
}
|
||||
|
||||
// 追加保存数据
|
||||
function appendSaveData(data) {
|
||||
var card_type = $('.card-type-item.active').attr('data-value');
|
||||
if (card_type == 'oncecard') {
|
||||
relationGoods.forEach(function (item, index) {
|
||||
item.num = $('.relation-goods-table.oncecard .layui-table-body tr:eq(' + index + ') .num').val();
|
||||
})
|
||||
} else {
|
||||
relationGoods.forEach(function (item, index) {
|
||||
item.discount = $('.relation-goods-table.discountcard .layui-table-body tr:eq(' + index + ') .discount').val();
|
||||
})
|
||||
}
|
||||
return {
|
||||
card_type: card_type,
|
||||
validity_type: $('[name="validity_type"]:checked').val(),
|
||||
relation_goods: JSON.stringify(relationGoods) // 卡项参数格式
|
||||
};
|
||||
}
|
||||
|
||||
// 编辑初始化数据回调
|
||||
function initEditDataCallBack() {
|
||||
relationGoods = $('[name="relation_goods"]').val() ? JSON.parse($('[name="relation_goods"]').val()) : [];
|
||||
}
|
||||
|
||||
$(function () {
|
||||
|
||||
layui.use(['element', 'laytpl', 'form', 'laydate', 'table'], function () {
|
||||
form = layui.form;
|
||||
element = layui.element;
|
||||
laytpl = layui.laytpl;
|
||||
laydate = layui.laydate;
|
||||
laytable = layui.table;
|
||||
form.render();
|
||||
|
||||
var time = new Date();
|
||||
var currentTime = time.toLocaleDateString + " " + time.getHours() + ":" + time.getMinutes() + ":" + time.getSeconds();
|
||||
//卡项有效期
|
||||
laydate.render({
|
||||
elem: '#validity_time', //指定元素
|
||||
type: 'datetime',
|
||||
min: currentTime
|
||||
});
|
||||
|
||||
//核销有效期类型
|
||||
form.on('radio(validity_type)', function (data) {
|
||||
var value = parseInt(data.value);
|
||||
$('.validity-type').addClass('layui-hide');
|
||||
$('.validity-type.validity-type-' + value).removeClass('layui-hide');
|
||||
});
|
||||
|
||||
// 选择卡项类型
|
||||
$('.card-type-item').click(function () {
|
||||
if ($(this).hasClass('active')) return;
|
||||
var value = $(this).attr('data-value');
|
||||
$(this).addClass('active').siblings('.card-type-item').removeClass('active');
|
||||
$('.card-type-content').hide();
|
||||
$('.card-type-content.' + value).show();
|
||||
fetchRelationGoods();
|
||||
});
|
||||
|
||||
// 选择关联商品
|
||||
$('.add-relation-goods').click(function () {
|
||||
var skuids = [];
|
||||
relationGoods.forEach(function (item) {
|
||||
skuids.push(item.sku_id)
|
||||
});
|
||||
var select_goods_class = $(this).data('goods-class');
|
||||
goodsSelect(function (data) {
|
||||
var skuList = [];
|
||||
|
||||
for (var key in data) {
|
||||
for (var sku in data[key].selected_sku_list) {
|
||||
var item = data[key].selected_sku_list[sku];
|
||||
skuList.push(item);
|
||||
}
|
||||
}
|
||||
relationGoods = skuList;
|
||||
fetchRelationGoods();
|
||||
|
||||
}, skuids, {mode: 'sku', goods_class: select_goods_class ?? '1,4'});
|
||||
});
|
||||
|
||||
function fetchRelationGoods() {
|
||||
var cardType = $('.card-type-item.active').attr('data-value');
|
||||
var elem = cardType == 'discountcard' ? '#relationDiscountGoods' : '#relationGoods';
|
||||
var cols = [
|
||||
{
|
||||
field: 'sku_name',
|
||||
title: '商品/项目名称',
|
||||
width: '35%'
|
||||
},
|
||||
{
|
||||
field: 'goods_class_name',
|
||||
title: '商品类型',
|
||||
},
|
||||
{
|
||||
field: 'sex',
|
||||
title: '售价',
|
||||
width: '15%',
|
||||
align: 'right',
|
||||
templet: function (data) {
|
||||
return '¥' + data.price;
|
||||
}
|
||||
},
|
||||
{
|
||||
title: '操作',
|
||||
align: 'right',
|
||||
templet: function (data) {
|
||||
return `<a href="javascript:;" class="text-color delete">删除</a>`;
|
||||
}
|
||||
}
|
||||
];
|
||||
switch (cardType) {
|
||||
case 'oncecard':
|
||||
cols.splice(2, 0, {
|
||||
title: '可用次数/数量',
|
||||
align: 'center',
|
||||
templet: function (data) {
|
||||
return `<input type="text" placeholder="0" lay-verify="use_num" value="` + (data.num ? data.num : '') + `" class="layui-input len-short num" autocomplete="off">`;
|
||||
}
|
||||
});
|
||||
break;
|
||||
case 'discountcard':
|
||||
cols.splice(2, 0, {
|
||||
title: '可享折扣',
|
||||
align: 'center',
|
||||
templet: function (data) {
|
||||
return `<input type="text" placeholder="0" lay-verify="discount" value="` + (data.discount ? data.discount : '') + `" class="layui-input len-short discount" autocomplete="off"> %`;
|
||||
}
|
||||
});
|
||||
break;
|
||||
}
|
||||
var _table = laytable.render({
|
||||
elem: elem,
|
||||
data: relationGoods,
|
||||
cols: [cols],
|
||||
skin: 'nob',
|
||||
done: function () {
|
||||
if (cardType == 'oncecard' || cardType == 'discountcard') $('.card-type-content .batch-set').show();
|
||||
else $('.card-type-content .batch-set').hide();
|
||||
$('body').off('click', '.relation-goods-table .delete').on('click', '.relation-goods-table .delete', function () {
|
||||
$(this).parents('tr').remove();
|
||||
relationGoods.splice($(this).parents('tr').index(), 1);
|
||||
})
|
||||
}
|
||||
});
|
||||
if (!relationGoods.length) {
|
||||
$(elem).next('.layui-table-view').remove();
|
||||
$('.card-type-content .batch-set').hide();
|
||||
}
|
||||
}
|
||||
|
||||
fetchRelationGoods();
|
||||
|
||||
// 关联商品批量设置
|
||||
$('.batch-set .set').click(function () {
|
||||
var parents = $(this).parents('.batch-set');
|
||||
parents.find('.set-item').hide();
|
||||
parents.find('.set-content-wrap').show();
|
||||
});
|
||||
|
||||
$('.batch-set .cancel').click(function () {
|
||||
var parents = $(this).parents('.batch-set');
|
||||
parents.find('.value').val('');
|
||||
parents.find('.set-item').show();
|
||||
parents.find('.set-content-wrap').hide();
|
||||
});
|
||||
|
||||
$('.batch-set .confirm').click(function () {
|
||||
var parents = $(this).parents('.batch-set');
|
||||
var value = parents.find('.value').val();
|
||||
var type = parents.find('.value').attr('data-type');
|
||||
|
||||
if (!regExp.required.test(value)) {
|
||||
layer.msg('请输入要设置的值');
|
||||
return;
|
||||
}
|
||||
if (type == 'num') {
|
||||
if (!regExp.number.test(value)) {
|
||||
layer.msg('可用次数格式错误');
|
||||
return;
|
||||
}
|
||||
if (parseInt(value) < 1) {
|
||||
layer.msg('可用次数不能小于等于0');
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (type == 'discount') {
|
||||
if (!regExp.number.test(value)) {
|
||||
layer.msg('折扣格式错误');
|
||||
return;
|
||||
}
|
||||
if (parseInt(value) < 1 || parseInt(value) > 99) {
|
||||
layer.msg('折扣需在[1-99]之间设置');
|
||||
return;
|
||||
}
|
||||
}
|
||||
// 批量设置值
|
||||
$(this).parents('.layui-form-item').find('.' + type).val(value);
|
||||
|
||||
parents.find('.value').val('');
|
||||
parents.find('.set-item').show();
|
||||
parents.find('.set-content-wrap').hide();
|
||||
});
|
||||
|
||||
form.on('radio(discount_goods_type)', function (data) {
|
||||
$('.discount-goods').hide();
|
||||
$('.discount-goods.' + data.value).show();
|
||||
});
|
||||
|
||||
form.verify({
|
||||
//销售价
|
||||
price: function (value) {
|
||||
if (!$("input[name='spec_type']").is(":checked")) {
|
||||
if (value.length == 0) {
|
||||
element.tabChange('goods_tab', "price-stock");
|
||||
return "请输入卡项开卡价";
|
||||
}
|
||||
if (isNaN(value) || !regExp.digit.test(value)) {
|
||||
element.tabChange('goods_tab', "price-stock");
|
||||
return '[卡项开卡价]格式输入错误';
|
||||
}
|
||||
|
||||
}
|
||||
},
|
||||
renew_price: function (value) {
|
||||
if (value.length == 0) {
|
||||
element.tabChange('goods_tab', "price-stock");
|
||||
return "请输入卡项续费价";
|
||||
}
|
||||
if (isNaN(parseInt(value)) || !regExp.digit.test(value)) {
|
||||
element.tabChange('goods_tab', "price-stock");
|
||||
return '[卡项续费价]格式输入错误';
|
||||
}
|
||||
},
|
||||
//有效期
|
||||
validity_day: function (value) {
|
||||
var verify_validity_type = $('[name="validity_type"]:checked').val();
|
||||
if (verify_validity_type == 1) {
|
||||
if (isNaN(value) || !regExp.number.test(value)) {
|
||||
element.tabChange('goods_tab', "basic");
|
||||
return '[卡项有效期]格式输入错误';
|
||||
}
|
||||
if (value < 1) {
|
||||
element.tabChange('goods_tab', "basic");
|
||||
return '卡项有效期不能小于1天';
|
||||
}
|
||||
}
|
||||
},
|
||||
validity_time: function (value) {
|
||||
var verify_validity_type = $('[name="validity_type"]:checked').val();
|
||||
if (verify_validity_type == 2 && value.length == 0) {
|
||||
element.tabChange('goods_tab', "basic");
|
||||
return "请输入有效期";
|
||||
}
|
||||
},
|
||||
relation_goods: function () {
|
||||
var cardType = $('.card-type-item.active').attr('data-value');
|
||||
if (cardType != 'discountcard' && !$('.relation-goods-table.oncecard .layui-table-body tr').length) {
|
||||
return '请选择卡项内容';
|
||||
}
|
||||
},
|
||||
relation_discount_goods: function () {
|
||||
var cardType = $('.card-type-item.active').attr('data-value');
|
||||
if (cardType == 'discountcard' && $('[name="discount_goods_type"]:checked').val() != 'all' && !$('.relation-goods-table.discountcard .layui-table-body tr').length) {
|
||||
return '请选择卡项内容';
|
||||
}
|
||||
},
|
||||
use_num: function (value) {
|
||||
var cardType = $('.card-type-item.active').attr('data-value');
|
||||
if (cardType == 'oncecard') {
|
||||
if (!regExp.required.test(value)) {
|
||||
return '请输入可用次数/数量';
|
||||
}
|
||||
if (!regExp.number.test(value)) {
|
||||
return '次数/数量格式错误';
|
||||
}
|
||||
if (parseInt(value) < 1) {
|
||||
return '可用次数/数量不能小于等于0';
|
||||
}
|
||||
}
|
||||
},
|
||||
discount: function (value) {
|
||||
var cardType = $('.card-type-item.active').attr('data-value');
|
||||
if (cardType == 'discountcard' && $('[name="discount_goods_type"]:checked').val() != 'all') {
|
||||
if (!regExp.required.test(value)) {
|
||||
return '请输入折扣卡折扣';
|
||||
}
|
||||
if (!regExp.number.test(value)) {
|
||||
return '折扣卡折扣格式错误';
|
||||
}
|
||||
if (parseInt(value) < 1 || parseInt(value) > 99) {
|
||||
return '折扣卡折扣需在[1-99]之间设置';
|
||||
}
|
||||
}
|
||||
},
|
||||
common_discount: function (value) {
|
||||
var cardType = $('.card-type-item.active').attr('data-value');
|
||||
if (cardType == 'discountcard' && $('[name="discount_goods_type"]:checked').val() == 'all') {
|
||||
if (!regExp.required.test(value)) {
|
||||
return '请输入折扣卡折扣';
|
||||
}
|
||||
if (!regExp.number.test(value)) {
|
||||
return '折扣卡折扣格式错误';
|
||||
}
|
||||
if (parseInt(value) < 1 || parseInt(value) > 99) {
|
||||
return '折扣卡折扣需在[1-99]之间设置';
|
||||
}
|
||||
}
|
||||
},
|
||||
common_num: function (value) {
|
||||
var cardType = $('.card-type-item.active').attr('data-value');
|
||||
if (cardType == 'commoncard') {
|
||||
if (!regExp.required.test(value)) {
|
||||
return '请输入卡项可用次数/数量';
|
||||
}
|
||||
if (!regExp.number.test(value)) {
|
||||
return '卡项可用次数/数量格式错误';
|
||||
}
|
||||
if (parseInt(value) < 1) {
|
||||
return '卡项可用次数/数量不能小于等于0';
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
});
|
||||
109
addon/cardservice/shop/view/public/js/category_select.js
Executable file
109
addon/cardservice/shop/view/public/js/category_select.js
Executable file
@@ -0,0 +1,109 @@
|
||||
var layCascader, goodsCategory = [];
|
||||
layui.use(['layCascader'], function () {
|
||||
layCascader = layui.layCascader;
|
||||
|
||||
$('.goods-category-con-wrap .layui-block').each(function () {
|
||||
var category_id = $(this).find('.category_id').val();
|
||||
var _this = this;
|
||||
|
||||
fetchCategory({elem: $(this).find('.select-category'), value: category_id ? parseInt(category_id.split(',').splice(-1)) : ''},
|
||||
function (value, node) {
|
||||
var categoryId = [];
|
||||
node.path.forEach(function (item) {
|
||||
categoryId.push(item.value)
|
||||
});
|
||||
$(_this).find('.category_id').val(categoryId.toString())
|
||||
}
|
||||
)
|
||||
});
|
||||
});
|
||||
|
||||
// 刷新项目分类,更新选择项目分类数据
|
||||
$('body').off('click', '.goods-category-con-wrap .js-refresh-category').on('click', '.goods-category-con-wrap .js-refresh-category', function () {
|
||||
$.ajax({
|
||||
url : ns.url("cardservice://shop/servicecategory/lists"),
|
||||
dataType: 'JSON',
|
||||
type: 'POST',
|
||||
async: false,
|
||||
success: function(res) {
|
||||
goodsCategory = res.data;
|
||||
|
||||
// 刷新商品分类下拉框数据
|
||||
$('.goods-category-con-wrap .layui-block').each(function () {
|
||||
$(this).find('.el-cascader').remove(); // 清空渲染
|
||||
var category_id = $(this).find('.category_id').val();
|
||||
var _this = this;
|
||||
|
||||
fetchCategory({elem: $(this).find('.select-category'), value: category_id ? parseInt(category_id.split(',').splice(-1)) : ''},
|
||||
function (value, node) {
|
||||
var categoryId = [];
|
||||
node.path.forEach(function (item) {
|
||||
categoryId.push(item.value)
|
||||
});
|
||||
$(_this).find('.category_id').val(categoryId.toString())
|
||||
}
|
||||
)
|
||||
});
|
||||
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
$('body').off('click', '.goods-category-wrap-box .js-add-category').on('click', '.goods-category-wrap-box .js-add-category', function () {
|
||||
if ($('.goods-category-con-wrap .layui-block').length >= 10) {
|
||||
layer.msg('最多添加十个分类');
|
||||
return;
|
||||
}
|
||||
var h = `<div class="layui-block">
|
||||
<div class="layui-input-inline cate-input-default">
|
||||
<input type="text" readonly lay-verify="required" autocomplete="off" class="layui-input len-mid select-category" />
|
||||
<input type="hidden" class="category_id" />
|
||||
</div>
|
||||
<a href="javascript:;" class="text-color js-delete-category">删除</a>
|
||||
</div>`;
|
||||
$('.goods-category-con-wrap').append(h);
|
||||
|
||||
fetchCategory({elem: $('.goods-category-con-wrap .layui-block:last-child').find('.select-category')}, function (value, node) {
|
||||
var categoryId = [];
|
||||
node.path.forEach(function (item) {
|
||||
categoryId.push(item.value)
|
||||
});
|
||||
$('.goods-category-con-wrap .layui-block:last-child').find('.category_id').val(categoryId.toString());
|
||||
})
|
||||
});
|
||||
|
||||
$('body').off('click', '.goods-category-con-wrap .js-delete-category').on('click', '.goods-category-con-wrap .js-delete-category', function () {
|
||||
$(this).parents('.layui-block').remove();
|
||||
});
|
||||
|
||||
/**
|
||||
* 渲染分类选择
|
||||
* @param option
|
||||
* @param callback
|
||||
*/
|
||||
function fetchCategory(option, callback){
|
||||
if (!goodsCategory.length) {
|
||||
$.ajax({
|
||||
url : ns.url("cardservice://shop/servicecategory/lists"),
|
||||
dataType: 'JSON',
|
||||
type: 'POST',
|
||||
async: false,
|
||||
success: function(res) {
|
||||
goodsCategory = res.data;
|
||||
}
|
||||
})
|
||||
}
|
||||
var _option = {
|
||||
options: goodsCategory,
|
||||
props: {
|
||||
value: 'category_id',
|
||||
label: 'category_name',
|
||||
children: 'child_list'
|
||||
}
|
||||
};
|
||||
if (option) Object.assign(_option, option);
|
||||
var _cascader = layCascader(_option);
|
||||
_cascader.changeEvent(function (value, node) {
|
||||
typeof callback == 'function' && callback(value, node)
|
||||
});
|
||||
}
|
||||
407
addon/cardservice/shop/view/public/js/edit_category.js
Executable file
407
addon/cardservice/shop/view/public/js/edit_category.js
Executable file
@@ -0,0 +1,407 @@
|
||||
var link_url_json = $("input[name='link_url']").val();
|
||||
if(link_url_json) {
|
||||
link_url_json = JSON.parse(link_url_json);
|
||||
$(".link-url-show").text(link_url_json.title);
|
||||
}
|
||||
|
||||
var laytpl, form, layerIndex;
|
||||
var categoryFullName = [];//组装名称
|
||||
|
||||
var saveData = null;
|
||||
var totalUploadNum = 0;
|
||||
var completeUploadNum = 0;
|
||||
|
||||
$(function () {
|
||||
|
||||
//编辑时赋值组装名称
|
||||
if ($("input[name='category_full_name']").length > 0) {
|
||||
categoryFullName = $("input[name='category_full_name']").val().split("/").slice(0, $("input[name='category_full_name']").val().split("/").length - 1);
|
||||
}
|
||||
|
||||
layui.use(['form', 'laytpl'], function () {
|
||||
var repeat_flag = false;//防重复标识
|
||||
laytpl = layui.laytpl;
|
||||
form = layui.form;
|
||||
|
||||
/**
|
||||
* 表单验证
|
||||
*/
|
||||
form.verify({
|
||||
commission_rate: function (value) {
|
||||
var reg = /^\d{0,2}(.?\d{0,2})$/;
|
||||
if (value.length > 0) {
|
||||
if (isNaN(value)) {
|
||||
return '佣金比率输入错误';
|
||||
}
|
||||
if (!reg.test(value) || value < 0 || value > 100) {
|
||||
return '佣金比率范围:0~100%';
|
||||
}
|
||||
}
|
||||
},
|
||||
num: function (value) {
|
||||
if (value == '') {
|
||||
return;
|
||||
}
|
||||
if (value % 1 != 0) {
|
||||
return '排序数值必须为整数';
|
||||
}
|
||||
if (value < 0) {
|
||||
return '排序数值必须为大于0';
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
var upload = new Upload({
|
||||
elem: '#imgUpload',
|
||||
size:100,
|
||||
auto:false,
|
||||
bindAction:'#imageUploadAction',
|
||||
callback: function(res) {
|
||||
uploadComplete('image', res.data.pic_path);
|
||||
}
|
||||
});
|
||||
|
||||
var adv_upload = new Upload({
|
||||
elem: '#imgUploadAdv',
|
||||
auto:false,
|
||||
bindAction:'#imageAdvUploadAction',
|
||||
callback: function(res) {
|
||||
uploadComplete('image_adv', res.data.pic_path);
|
||||
}
|
||||
});
|
||||
|
||||
function uploadComplete(field, pic_path) {
|
||||
saveData.field[field] = pic_path;
|
||||
completeUploadNum += 1;
|
||||
if(completeUploadNum == totalUploadNum){
|
||||
saveFunc();
|
||||
}
|
||||
}
|
||||
|
||||
form.on('submit(save)', function (data) {
|
||||
|
||||
saveData = data;
|
||||
var obj = $("img.img_prev[data-prev='1']");
|
||||
totalUploadNum = obj.length;
|
||||
if(totalUploadNum > 0){
|
||||
obj.each(function(){
|
||||
var actionId = $(this).attr('data-action-id');
|
||||
$(actionId).click();
|
||||
})
|
||||
}else{
|
||||
saveFunc();
|
||||
}
|
||||
|
||||
return false;
|
||||
});
|
||||
|
||||
function saveFunc(){
|
||||
|
||||
var data = saveData;
|
||||
categoryFullName.push(data.field.category_name);
|
||||
data.field.category_full_name = categoryFullName.join("/");
|
||||
data.field.attr_class_name = $("select[name='attr_class_id'] option:checked").text();
|
||||
|
||||
// 删除图片
|
||||
if(!data.field.image) upload.delete();
|
||||
|
||||
if(!data.field.image_adv) adv_upload.delete();
|
||||
|
||||
if (repeat_flag) return false;
|
||||
repeat_flag = true;
|
||||
|
||||
var url = ns.url("cardservice://shop/servicecategory/addCategory");
|
||||
if (data.field.category_id) url = ns.url("cardservice://shop/servicecategory/editCategory");
|
||||
$.ajax({
|
||||
url: url,
|
||||
data: data.field,
|
||||
dataType: 'json',
|
||||
type: 'post',
|
||||
success: function (data) {
|
||||
layer.msg(data.message);
|
||||
if (data.code == 0) {
|
||||
location.hash = ns.hash("cardservice://shop/servicecategory/lists");
|
||||
} else {
|
||||
repeat_flag = false;
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
//保存上级分类
|
||||
form.on('submit(save_pid)', function (data) {
|
||||
|
||||
var option_category_id_1 = $("select[name='category_id_1'] option:checked");
|
||||
var option_category_id_2 = $("select[name='category_id_2'] option:checked[value!='0']");
|
||||
|
||||
categoryFullName = [];
|
||||
var level, category_name, pid;
|
||||
if (option_category_id_1.length) {
|
||||
level = parseInt(option_category_id_1.attr("data-level"));
|
||||
category_name = option_category_id_1.text();
|
||||
pid = option_category_id_1.val();//上级分类id
|
||||
var category_id_1 = option_category_id_1.val();//一级分类id
|
||||
if (category_id_1 > 0) {
|
||||
$("input[name='category_id_1']").val(category_id_1);
|
||||
categoryFullName.push(category_name);
|
||||
}
|
||||
}
|
||||
|
||||
if($("input[name='category_name_1']").length){
|
||||
categoryFullName.push($("input[name='category_name_1']").val());
|
||||
}
|
||||
|
||||
// 选中了二级商品分类
|
||||
if (option_category_id_2.length) {
|
||||
level = parseInt(option_category_id_2.attr("data-level"));
|
||||
category_name = option_category_id_2.text();
|
||||
pid = option_category_id_2.val();
|
||||
var category_id_2 = option_category_id_2.val();//二级分类id
|
||||
if (category_id_2 > 0) {
|
||||
$("input[name='category_id_2']").val(category_id_2);
|
||||
categoryFullName.push(category_name);
|
||||
}
|
||||
}
|
||||
|
||||
$(".js-pid span").text(category_name);
|
||||
$("input[name='pid']").val(pid);
|
||||
$("input[name='level']").val(level + 1);//当前添加的层级+1
|
||||
|
||||
layer.close(layerIndex);
|
||||
return false;
|
||||
|
||||
});
|
||||
|
||||
setTimeout(()=>{
|
||||
form.render();
|
||||
},600)
|
||||
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
//选择商品分类弹出框
|
||||
function selectedCategoryPopup() {
|
||||
|
||||
if ($("input[name='category_id']").length) {
|
||||
|
||||
// 修改
|
||||
editSelectedPid();
|
||||
|
||||
} else {
|
||||
|
||||
//添加
|
||||
addSelectedPid();
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取商品分类列表
|
||||
* @param data
|
||||
* @param callback
|
||||
*/
|
||||
function getCategoryList(data, callback) {
|
||||
$.ajax({
|
||||
url: ns.url("cardservice://shop/servicecategory/getCategoryList"),
|
||||
data: data,
|
||||
dataType: 'json',
|
||||
type: 'post',
|
||||
async: false,
|
||||
success: function (res) {
|
||||
var data = res.data;
|
||||
if (callback) callback(data);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 添加时,选择上级分类
|
||||
*/
|
||||
function addSelectedPid() {
|
||||
|
||||
//查询一级商品分类
|
||||
getCategoryList({pid: 0}, function (list) {
|
||||
|
||||
var html = $("#selectedCategory").html();
|
||||
var data = {
|
||||
category_id_1: $("input[name='category_id_1']").val(),
|
||||
category_list_1: list
|
||||
};
|
||||
laytpl(html).render(data, function (html) {
|
||||
layerIndex = layer.open({
|
||||
title: '选择商品分类',
|
||||
skin: 'layer-tips-class',
|
||||
type: 1,
|
||||
area: ['450px'],
|
||||
content: html,
|
||||
success: function () {
|
||||
form.render();
|
||||
|
||||
form.on('select(category_id_1)', function (item) {
|
||||
|
||||
if (item.value > 0) {
|
||||
|
||||
getCategoryList({pid: item.value}, function (list) {
|
||||
var h = '<option value="0">请选择</option>';
|
||||
for (var i = 0; i < list.length; i++) {
|
||||
if ($("input[name='category_id_2']").val() == list[i].category_id) {
|
||||
h += '<option value="' + list[i].category_id + '" data-level="' + list[i].level + '" selected>' + list[i].category_name + '</option>';
|
||||
} else {
|
||||
h += '<option value="' + list[i].category_id + '" data-level="' + list[i].level + '">' + list[i].category_name + '</option>';
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
$("select[name='category_id_2']").html(h);
|
||||
form.render("select");
|
||||
});
|
||||
} else {
|
||||
//顶级分类不需要查询
|
||||
$("select[name='category_id_2']").html('<option value="0">请选择</option>');
|
||||
form.render("select");
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
$("select[name='category_id_1']").siblings("div.layui-form-select").find("dl dd[lay-value='" + $("input[name='category_id_1']").val() + "']").click();
|
||||
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 编辑时,选择上级分类
|
||||
*/
|
||||
function editSelectedPid() {
|
||||
var html = $("#selectedCategory").html();
|
||||
laytpl(html).render({}, function (html) {
|
||||
layerIndex = layer.open({
|
||||
title: '选择商品分类',
|
||||
skin: 'select-category',
|
||||
type: 1,
|
||||
area: ['650px'],
|
||||
content: html,
|
||||
btn: ['确定', '取消'],
|
||||
success: function () {
|
||||
var pid = $('input[name="pid"]').val();
|
||||
var level = $('input[name="level"]').val();
|
||||
$('.table_div input[name="category_id"][data-category-id="'+pid+'"]').attr('checked', true);
|
||||
if(level == 3) $('.table_div div[data-cateid="'+pid+'"]').parents('.table_two_div').show().prev('.table_tr').find('.switch').attr('data-open', 1).html('-');
|
||||
form.render();
|
||||
|
||||
$(".js-switch").click(function (event) {
|
||||
event.stopPropagation();
|
||||
var category_id = $(this).attr("data-category-id");
|
||||
var level = $(this).attr("data-level");
|
||||
var open = parseInt($(this).attr("data-open").toString());
|
||||
if(open){
|
||||
$(".goods-category-list .layui-table tr[data-category-id-"+ level+"='" + category_id + "']").hide();
|
||||
// $(this).children("img").removeClass('rotate');
|
||||
$(this).text("+");
|
||||
if(level == 1) $(this).parents('.table_tr').siblings('.table_two_div').hide();
|
||||
else if(level == 2) $(this).parents('.table_tr').siblings('.table_three').hide();
|
||||
|
||||
}else{
|
||||
$(".goods-category-list .layui-table tr[data-category-id-"+ level+"='" + category_id + "']").show();
|
||||
$(this).text("-");
|
||||
// $(this).children("img").addClass('rotate');
|
||||
if(level == 1) $(this).parents('.table_tr').siblings('.table_two_div').show();
|
||||
else if(level == 2) $(this).parents('.table_tr').siblings('.table_three').show();
|
||||
|
||||
}
|
||||
$(this).attr("data-open", (open ? 0 : 1));
|
||||
});
|
||||
|
||||
form.on('checkbox(category)', function (data) {
|
||||
if(data.elem.checked==true){
|
||||
$('.table_move').children('div').removeClass('layui-form-checked');
|
||||
$(".table_move input").prop("checked",false);
|
||||
}
|
||||
$(this).parents('.table_move').children('div').addClass('layui-form-checked');
|
||||
$(this).parents('.table_move').find('input').prop("checked",true);
|
||||
return false;
|
||||
});
|
||||
|
||||
},
|
||||
yes: function(index, layero){
|
||||
var obj = $('.table_div input[name="category_id"]:checked');
|
||||
var num = $(obj).length;
|
||||
if(num > 1){
|
||||
layer.msg('只能选择一个上级');
|
||||
return false;
|
||||
}
|
||||
|
||||
var parent_level = $(obj).attr('data-level');
|
||||
var pid = $(obj).val();
|
||||
var parent_name = $(obj).attr('data-name');
|
||||
if(num < 1){
|
||||
parent_level = 0;
|
||||
pid = 0;
|
||||
parent_name = '顶级分类';
|
||||
}
|
||||
|
||||
$.ajax({
|
||||
url: ns.url("cardservice://shop/servicecategory/checkEditCategory"),
|
||||
data: {
|
||||
category_id: $('#category_id').val(),
|
||||
pid : pid
|
||||
},
|
||||
dataType: 'json',
|
||||
type: 'post',
|
||||
async: false,
|
||||
success: function (res) {
|
||||
if(res.code >= 0){
|
||||
$(".js-pid span").text(parent_name);
|
||||
$("input[name='pid']").val(pid);
|
||||
$("input[name='level']").val(parseInt(parent_level) + 1);//当前添加的层级+1
|
||||
layer.close(layerIndex);
|
||||
}else{
|
||||
layer.msg(res.message)
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取商品分类信息
|
||||
* @param category_id
|
||||
* @param callback
|
||||
*/
|
||||
function getCategoryInfo(category_id, callback) {
|
||||
$.ajax({
|
||||
url: ns.url("cardservice://shop/servicecategory/getCategoryInfo"),
|
||||
data: {category_id: category_id},
|
||||
dataType: 'json',
|
||||
type: 'post',
|
||||
async: false,
|
||||
success: function (res) {
|
||||
var data = res.data;
|
||||
if (callback) callback(data);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function backCardServiceCategoryList() {
|
||||
location.hash = ns.hash("cardservice://shop/servicecategory/lists")
|
||||
}
|
||||
|
||||
function selectedLink() {
|
||||
if (link_url_json == "") {
|
||||
link_url_json = {};
|
||||
}
|
||||
ns.select_link(link_url_json, function (data) {
|
||||
for (var o in data) {
|
||||
if (data[o] == null) delete data[o];
|
||||
}
|
||||
$("input[name='link_url']").val(JSON.stringify(data));
|
||||
$(".link-url-show-wrap .layui-input-block").find('.link-url-show').remove();
|
||||
$(".link-url-show-wrap .layui-input-block").prepend(`<span class="link-url-show">${data.title}</span>`);
|
||||
});
|
||||
}
|
||||
104
addon/cardservice/shop/view/public/js/service_goods_edit.js
Executable file
104
addon/cardservice/shop/view/public/js/service_goods_edit.js
Executable file
@@ -0,0 +1,104 @@
|
||||
requestAdd = 'cardservice://shop/service/addGoods';
|
||||
requestEdit = 'cardservice://shop/service/editGoods';
|
||||
goodsTag = '项目';
|
||||
|
||||
// 追加刷新商品sku数据
|
||||
appendRefreshGoodsSkuData = {
|
||||
service_length: 0
|
||||
};
|
||||
|
||||
// 追加单规格数据
|
||||
function appendSingleGoodsData(data) {
|
||||
return {
|
||||
service_length: data.field.service_length
|
||||
};
|
||||
}
|
||||
|
||||
// 追加保存数据
|
||||
function appendSaveData(data) {
|
||||
return {
|
||||
verify_validity_type: $('[name="verify_validity_type"]:checked').val()
|
||||
};
|
||||
}
|
||||
|
||||
$(function () {
|
||||
|
||||
layui.use(['element', 'laytpl', 'form', 'laydate'], function () {
|
||||
form = layui.form;
|
||||
element = layui.element;
|
||||
laytpl = layui.laytpl;
|
||||
laydate = layui.laydate;
|
||||
form.render();
|
||||
|
||||
var time = new Date();
|
||||
var currentTime = time.toLocaleDateString + " " + time.getHours() + ":" + time.getMinutes() + ":" + time.getSeconds();
|
||||
|
||||
//核销有效期
|
||||
laydate.render({
|
||||
elem: '#virtual_time', //指定元素
|
||||
type: 'datetime',
|
||||
min: currentTime
|
||||
});
|
||||
|
||||
//卡项有效期类型
|
||||
form.on('radio(verify_validity_type)', function (data) {
|
||||
var value = parseInt(data.value);
|
||||
$('.validity-type').addClass('layui-hide');
|
||||
$('.validity-type.validity-type-' + value).removeClass('layui-hide');
|
||||
});
|
||||
|
||||
form.verify({
|
||||
//有效期
|
||||
virtual_indate: function (value) {
|
||||
var verify_validity_type = $('[name="verify_validity_type"]:checked').val();
|
||||
if (verify_validity_type == 1) {
|
||||
if (isNaN(value) || !regExp.number.test(value)) {
|
||||
element.tabChange('goods_tab', "basic");
|
||||
return '[核销有效期]格式输入错误';
|
||||
}
|
||||
if (value < 1) {
|
||||
element.tabChange('goods_tab', "basic");
|
||||
return '核销有效期不能小于1天';
|
||||
}
|
||||
}
|
||||
},
|
||||
virtual_time: function (value) {
|
||||
var verify_validity_type = $('[name="verify_validity_type"]:checked').val();
|
||||
if (value.length == 0 && verify_validity_type == 2) {
|
||||
element.tabChange('goods_tab', "basic");
|
||||
return "请输入有效期";
|
||||
}
|
||||
},
|
||||
service_length: function (value) {
|
||||
if (value.length > 0) {
|
||||
value = parseInt(value);
|
||||
if (isNaN(value) || !regExp.number.test(value)) {
|
||||
element.tabChange('goods_tab', "price-stock");
|
||||
return '[服务时长]格式输入错误';
|
||||
}
|
||||
if (value < 0) {
|
||||
element.tabChange('goods_tab', "price-stock");
|
||||
return '[服务时长]不能小于0';
|
||||
}
|
||||
}
|
||||
},
|
||||
//销售价
|
||||
service_price: function (value) {
|
||||
if (!$("input[name='spec_type']").is(":checked")) {
|
||||
if (value.length == 0) {
|
||||
element.tabChange('goods_tab', "basic");
|
||||
return "请输入销售价";
|
||||
}
|
||||
|
||||
if (isNaN(value) || !regExp.digit.test(value)) {
|
||||
element.tabChange('goods_tab', "basic");
|
||||
return '[销售价]格式输入错误';
|
||||
}
|
||||
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
});
|
||||
537
addon/cardservice/shop/view/reserve/add_reserve.html
Executable file
537
addon/cardservice/shop/view/reserve/add_reserve.html
Executable file
@@ -0,0 +1,537 @@
|
||||
<link rel="stylesheet" href="ADDON_CARDSERVICE_CSS/add_reserve.css">
|
||||
<div class="main-wrap">
|
||||
<div class="layui-form" lay-filter="form">
|
||||
<br>
|
||||
{empty name="info"}
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label"><span class="required">*</span>手机号:</label>
|
||||
<div class="layui-input-inline search-wrap">
|
||||
<input type="text" class="layui-input len-mid" name="mobile" placeholder="请输入客户手机号" autocomplete="off" lay-verify="required">
|
||||
<i class="iconfont iconsousuo"></i>
|
||||
</div>
|
||||
</div>
|
||||
{else/}
|
||||
<input type="hidden" name="reserve_id" value="{$info.reserve_id}">
|
||||
{/empty}
|
||||
<div class="error">请输入正确的手机号</div>
|
||||
<div class="layui-form-item" lay-verify="member">
|
||||
<label class="layui-form-label"><span class="required">*</span>客户:</label>
|
||||
<div class="layui-input-block member">
|
||||
{notempty name="info"}
|
||||
<div class="member-info">
|
||||
<input type="hidden" name="member_id" value="{$info.member_id}">
|
||||
{notempty name="$info.headimg"}
|
||||
<img src="{:img($info.headimg)}" onerror="this.src = 'STATIC_IMG/default_img/head.png' " alt="">
|
||||
{else/}
|
||||
<img src="STATIC_IMG/default_img/head.png" alt="">
|
||||
{/notempty}
|
||||
<div class="info">
|
||||
<div class="name">{$info.nickname}</div>
|
||||
<div>
|
||||
<span>手机号:{$info.mobile}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{/notempty}
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label"><span class="required">*</span>预约门店:</label>
|
||||
<div class="layui-input-inline len-mid">
|
||||
<select name="store_id" lay-filter="store" {notempty name="info"}disabled{/notempty}>
|
||||
{foreach $store_list as $k=> $v}
|
||||
<option value="{$v.store_id}" {if !empty($info) && $info['store_id'] == $v['store_id']} selected {/if}>{$v.store_name}</option>
|
||||
{/foreach}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item" lay-verify="service">
|
||||
<label class="layui-form-label"><span class="required">*</span>项目:</label>
|
||||
<div class="layui-input-block service-table">
|
||||
<table class="layui-table" lay-skin="line">
|
||||
<colgroup>
|
||||
<col width="50%">
|
||||
<col width="30%">
|
||||
<col width="20%">
|
||||
</colgroup>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>预约项目</th>
|
||||
<th>员工</th>
|
||||
<th class="align-center">操作</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{notempty name="info"}
|
||||
{foreach name="info.item" item="vo"}
|
||||
<tr>
|
||||
<td>
|
||||
<div class="service-item service-item-btn">
|
||||
<div class="info" >
|
||||
<input type="hidden" name="sku" value="{$vo.sku_id}">
|
||||
<input type="hidden" name="goods" value="{$vo.goods_id}">
|
||||
<div class="title" title="{$vo.goods_name}">{$vo.goods_name}</div>
|
||||
<div class="desc">项目时长:{$vo.service_length}分钟 ¥{$vo.price}</div>
|
||||
</div>
|
||||
<i class="iconfont iconlower-triangle"></i>
|
||||
</div>
|
||||
</td>
|
||||
<td>
|
||||
<div class="servicer-item servicer-item-btn">
|
||||
{if $vo.reserve_user_id}
|
||||
<div class="info">
|
||||
<input type="hidden" name="servicer_id" value="{$vo.reserve_user_id}">
|
||||
<div class="title" title="{$vo.username}">{$vo.username}</div>
|
||||
</div>
|
||||
{else/}
|
||||
<div class="info">请选择员工</div>
|
||||
{/if}
|
||||
<i class="iconfont iconlower-triangle"></i>
|
||||
</div>
|
||||
</td>
|
||||
<td class="align-center"><a href="javascript:;" class="text-color delete">删除</a></td>
|
||||
</tr>
|
||||
{/foreach}
|
||||
{else/}
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
<div class="service-item service-item-btn" id="">
|
||||
<div class="info">请选择项目</div>
|
||||
<i class="iconfont iconlower-triangle"></i>
|
||||
</div>
|
||||
</td>
|
||||
<td>
|
||||
<div class="servicer-item servicer-item-btn">
|
||||
<div class="info">请选择员工</div>
|
||||
<i class="iconfont iconlower-triangle"></i>
|
||||
</div>
|
||||
</td>
|
||||
<td class="align-center"><a href="javascript:;" class="text-color delete">删除</a></td>
|
||||
</tr>
|
||||
{/notempty}
|
||||
</tbody>
|
||||
</table>
|
||||
<button class="layui-btn layui-btn-primary add">添加</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label"><span class="required">*</span>到店时间:</label>
|
||||
<div class="layui-input-block">
|
||||
<div class="layui-input-inline">
|
||||
{notempty name="info"}
|
||||
<input type="text" id="reserveDate" name="date" autocomplete="off" class="layui-input" placeholder="请选择到店日期" value="{:date('Y-m-d', $info.reserve_time)}" lay-verify="required">
|
||||
{else/}
|
||||
<input type="text" id="reserveDate" name="date" autocomplete="off" class="layui-input" placeholder="请选择到店日期" value="{:date('Y-m-d')}" lay-verify="required">
|
||||
{/notempty}
|
||||
<i class="iconfont iconriqi"></i>
|
||||
</div>
|
||||
<div class="layui-input-inline">
|
||||
{notempty name="info"}
|
||||
<input type="text" id="reserveTime" name="time" autocomplete="off" class="layui-input" value="{:date('H:i', $info.reserve_time)}" placeholder="请选择到店时间" readonly lay-verify="required">
|
||||
{else/}
|
||||
<input type="text" id="reserveTime" name="time" autocomplete="off" class="layui-input" placeholder="请选择到店时间" readonly lay-verify="required">
|
||||
{/notempty}
|
||||
</div>
|
||||
</div>
|
||||
<div class="word-aux">预约需提前{$config.advance}小时预约</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">备注:</label>
|
||||
<div class="layui-input-block">
|
||||
<textarea name="remark" cols="30" rows="6" class="layui-textarea len-long">{$info.remark ?? ''}</textarea>
|
||||
</div>
|
||||
</div>
|
||||
<div class="save-wrap">
|
||||
<button class="layui-btn" lay-submit lay-filter="save">保存</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{php}$today = strtotime(date('Y-m-d')) {/php}
|
||||
<script type="text/html" id="selectTime">
|
||||
<div class="select-time">
|
||||
<div class="time-wrap today">
|
||||
{for start="$config.start" end="$config.end + 1800" name="i" step="1800"}
|
||||
{if $today + $i > time()}
|
||||
<div class="time-item" data-value="{:date('H:i', ($today + $i) )}">{:date('H:i', ($today + $i) )}</div>
|
||||
{/if}
|
||||
{/for}
|
||||
</div>
|
||||
<div class="time-wrap no-today">
|
||||
{for start="$config.start" end="$config.end + 1800" name="i" step="1800"}
|
||||
<div class="time-item" data-value="{:date('H:i', ($today + $i) )}">{:date('H:i', ($today + $i) )}</div>
|
||||
{/for}
|
||||
</div>
|
||||
</div>
|
||||
</script>
|
||||
|
||||
<script type="text/html" id="selectService">
|
||||
<div class="select-service">
|
||||
<div class="service-wrap">
|
||||
{notempty name="$service"}
|
||||
<div class="flex-wrap">
|
||||
{foreach name="$service" item="vo"}
|
||||
<div class="item">
|
||||
<input type="hidden" name="sku" value="{$vo.sku_id}">
|
||||
<input type="hidden" name="goods" value="{$vo.goods_id}">
|
||||
<div class="title" title="{$vo.goods_name}">{$vo.goods_name}</div>
|
||||
<div class="desc">项目时长:{$vo.service_length}分钟 ¥{$vo.price}</div>
|
||||
</div>
|
||||
{/foreach}
|
||||
</div>
|
||||
{else/}
|
||||
<div class="flex-wrap">
|
||||
<div class="empty">暂无可预约的项目</div>
|
||||
<div>
|
||||
{/notempty}
|
||||
</div>
|
||||
</div>
|
||||
</script>
|
||||
|
||||
<script type="text/html" id="selectServicer">
|
||||
|
||||
</script>
|
||||
|
||||
<script>
|
||||
var today = "{$today}";
|
||||
var laydate, dropdown, form, target, repeat = false;
|
||||
layui.use(['laytpl', 'laydate', 'dropdown', 'form'], function(){
|
||||
laytpl = layui.laytpl;
|
||||
laydate = layui.laydate;
|
||||
dropdown = layui.dropdown;
|
||||
form = layui.form;
|
||||
|
||||
$('.search-wrap .iconfont').click(function () {
|
||||
var mobile = $('[name="mobile"]').val();
|
||||
if (mobile.length == 0) {
|
||||
$('.error').text('请输入客户手机号').show();
|
||||
return;
|
||||
}
|
||||
if (!ns.parse_mobile(mobile)) {
|
||||
$('.error').text('请输入正确的手机号').show();
|
||||
return;
|
||||
}
|
||||
$('.error').hide();
|
||||
|
||||
$.ajax({
|
||||
url: ns.url("shop/member/searchMember"),
|
||||
data: {
|
||||
search_text: mobile
|
||||
},
|
||||
dataType: 'JSON',
|
||||
type: 'POST',
|
||||
success: function (res) {
|
||||
if (res.code == 0 && res.data) {
|
||||
$('.error').hide();
|
||||
var info = res.data;
|
||||
$('.member').html(` <div class="member-info">
|
||||
<input type="hidden" name="member_id" value="` + info.member_id + `">
|
||||
`+ (info.headimg ? `<img src="${ns.img(info.headimg)}" onerror="this.src = \'STATIC_IMG/default_img/head.png\' " alt="">` : '<img src="STATIC_IMG/default_head_square.png" alt="">') + `
|
||||
<div class="info">
|
||||
<div class="name">` + info.nickname + `</div>
|
||||
<div>
|
||||
<span>手机号:` + info.mobile + `</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>`);
|
||||
} else {
|
||||
$('.member').html('');
|
||||
$('.error').text('未查找到该客户').show();
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
// 切换门店
|
||||
form.on('select(store)', function (data) {
|
||||
$.ajax({
|
||||
url: ns.url("cardservice://shop/reserve/getconfig"),
|
||||
data: {'store_id' : data.value},
|
||||
dataType: 'JSON',
|
||||
type: 'POST',
|
||||
success: function (res) {
|
||||
if (res.code == 0) {
|
||||
let data = res.data.value;
|
||||
let time = "{:time()}";
|
||||
let html = `
|
||||
<div class="select-time">
|
||||
<div class="time-wrap today">
|
||||
`;
|
||||
|
||||
for (let i = data.start; i <= (data.end + 1800); i+=1800){
|
||||
if(parseInt(today) + parseInt(i) > time){
|
||||
let data_value = ns.time_to_date(parseInt(today)+parseInt(i), 'H:i');
|
||||
data_value = $.trim(data_value);
|
||||
html += `<div class="time-item" data-value="${data_value}">${data_value}</div>`;
|
||||
}
|
||||
}
|
||||
html += '</div>';
|
||||
html += '<div class="time-wrap no-today">';
|
||||
for (let i = data.start; i <= (data.end + 1800); i+=1800){
|
||||
|
||||
let data_value = ns.time_to_date(parseInt(today)+parseInt(i), 'H:i');
|
||||
data_value = $.trim(data_value);
|
||||
html += `
|
||||
<div class="time-item" data-value="${data_value}">${data_value}</div>
|
||||
`;
|
||||
}
|
||||
|
||||
html += `
|
||||
</div>
|
||||
</div>
|
||||
`;
|
||||
|
||||
$('#selectTime').html(html);
|
||||
$('#reserveTime').val('');
|
||||
initTime(data.week);
|
||||
$('.servicer-item-btn .info').html('请选择员工');
|
||||
getServicer();
|
||||
}
|
||||
}
|
||||
})
|
||||
});
|
||||
|
||||
laydate.render({
|
||||
elem: '#reserveDate',
|
||||
type: 'date',
|
||||
min: 0,
|
||||
done: function(value, date, endDate){
|
||||
$('[name="time"]').val('');
|
||||
}
|
||||
});
|
||||
|
||||
initTime("{:implode($config.week)}");
|
||||
|
||||
$('body').off('click', '.time-wrap .time-item').on('click', '.time-wrap .time-item', function () {
|
||||
if ($(this).hasClass('no-select')) {
|
||||
layer.msg('不在可预约时间内');
|
||||
return;
|
||||
}
|
||||
dropdown.hide('#reserveTime');
|
||||
$('[name="time"]').val($(this).text());
|
||||
});
|
||||
|
||||
getServicer();
|
||||
|
||||
initDropdown();
|
||||
|
||||
$('.service-table .add').click(function () {
|
||||
var service_id = ns.gen_non_duplicate(5);
|
||||
var servicer_id = ns.gen_non_duplicate(5);
|
||||
$('.service-table tbody').append(`<tr>
|
||||
<td>
|
||||
<div class="service-item service-item-btn" id="${service_id}">
|
||||
<div class="info">请选择项目</div>
|
||||
<i class="iconfont iconlower-triangle"></i>
|
||||
</div>
|
||||
</td>
|
||||
<td>
|
||||
<div class="servicer-item servicer-item-btn" id="${servicer_id}">
|
||||
<div class="info">请选择员工</div>
|
||||
<i class="iconfont iconlower-triangle"></i>
|
||||
</div>
|
||||
</td>
|
||||
<td class="align-center"><a href="javascript:;" class="text-color delete">删除</a></td>
|
||||
</tr>`);
|
||||
|
||||
dropdown.suite("#"+service_id, {
|
||||
template: "selectService",
|
||||
maxWidth:'660',
|
||||
success: function ($dom) {
|
||||
$dom.addClass('border-color').css({
|
||||
'outline':'none',
|
||||
'border':'2px solid'
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
dropdown.suite("#"+servicer_id, {
|
||||
template: "selectServicer",
|
||||
maxWidth:'660',
|
||||
success: function ($dom) {
|
||||
$dom.addClass('border-color').css({
|
||||
'outline':'none',
|
||||
'border':'2px solid'
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
// 选择项目
|
||||
$('body').off('click', '.service-wrap .item').on('click', '.service-wrap .item', function () {
|
||||
var id = $(this).parents('.layu-dropdown-root').prev().attr('id');
|
||||
dropdown.hide('#'+id);
|
||||
var target = $('#'+id).find('.info');
|
||||
if ($(this).find('[name="sku"]').val() != $(target).find('[name="sku"]').val()) {
|
||||
$(target).html($(this).html());
|
||||
$(target).parents('tr').find('.servicer-item .info').html('请选择员工');
|
||||
}
|
||||
});
|
||||
|
||||
// 选择员工
|
||||
$('body').off('click', '.select-servicer .select-item').on('click', '.select-servicer .select-item', function () {
|
||||
var id = $(this).parents('.layu-dropdown-root').prev().attr('id');
|
||||
dropdown.hide('#'+id);
|
||||
var target = $('#'+id).find('.info');
|
||||
$(target).html($(this).html());
|
||||
});
|
||||
|
||||
$('body').off('click', '.service-table .delete').on('click', '.service-table .delete', function () {
|
||||
if ($('.service-table tbody tr').length == 1) {
|
||||
layer.msg('至少需要有一项项目');
|
||||
return;
|
||||
}
|
||||
$(this).parents('tr').remove();
|
||||
});
|
||||
|
||||
form.verify({
|
||||
member: function () {
|
||||
if (!$('[name="member_id"]').val()) {
|
||||
return '请选择客户';
|
||||
}
|
||||
},
|
||||
service: function () {
|
||||
if (!$('[name="sku"]').val()) {
|
||||
return '请选择项目';
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
form.on('submit(save)', function (data) {
|
||||
if (repeat) return;
|
||||
repeat = false;
|
||||
|
||||
data.field.goods = [];
|
||||
$('.service-table tbody tr').each(function () {
|
||||
data.field.goods.push({
|
||||
sku_id: $(this).find('[name="sku"]').val(),
|
||||
uid: $(this).find('[name="servicer"]').val() ? $(this).find('[name="servicer"]').val() : 0
|
||||
})
|
||||
});
|
||||
data.field.goods = JSON.stringify(data.field.goods);
|
||||
|
||||
$.ajax({
|
||||
url: data.field.reserve_id ? ns.url("cardservice://shop/reserve/updatereserve") : ns.url("cardservice://shop/reserve/addreserve"),
|
||||
data: data.field,
|
||||
dataType: 'JSON',
|
||||
type: 'POST',
|
||||
success: function (res) {
|
||||
if (res.code == 0) {
|
||||
layer.msg("保存成功");
|
||||
setTimeout(function(){
|
||||
parent.listenerHash(); // 刷新页面
|
||||
parent.layer.closeAll();
|
||||
},500)
|
||||
} else {
|
||||
layer.msg(res.message);
|
||||
repeat = false;
|
||||
}
|
||||
}
|
||||
})
|
||||
})
|
||||
});
|
||||
|
||||
function initDropdown(){
|
||||
$('.service-item-btn').each(function (i, e) {
|
||||
var id = ns.gen_non_duplicate(5);
|
||||
if($(e).attr('id') == '' || $(e).attr('id') == undefined) $(e).attr('id', id);
|
||||
id = $(e).attr('id');
|
||||
|
||||
dropdown.suite("#"+id, {
|
||||
template: "selectService",
|
||||
maxWidth:'660',
|
||||
success: function ($dom) {
|
||||
$dom.addClass('border-color').css({
|
||||
'outline':'none',
|
||||
'border':'2px solid'
|
||||
});
|
||||
}
|
||||
});
|
||||
})
|
||||
|
||||
}
|
||||
|
||||
function initTime(config){
|
||||
// 选择预约时间
|
||||
dropdown.suite("#reserveTime", {
|
||||
template: "selectTime",
|
||||
maxWidth:'660',
|
||||
success: function ($dom) {
|
||||
var date = $('[name="date"]').val();
|
||||
$('.time-wrap').css('display', 'none');
|
||||
|
||||
if (date == "{:date('Y-m-d')}") {
|
||||
$('.today').css('display', 'flex')
|
||||
} else {
|
||||
$('.no-today').css('display', 'flex')
|
||||
}
|
||||
|
||||
var dateArr = date.split('-'),
|
||||
dateEl = new Date(dateArr[0], parseInt(dateArr[1] - 1), dateArr[2]);
|
||||
|
||||
if (config.indexOf(dateEl.getDay()) == -1) {
|
||||
$('.time-wrap .time-item').addClass('no-select');
|
||||
}
|
||||
|
||||
var time = $('[name="time"]').val();
|
||||
$('.time-wrap .time-item[data-value="'+ time +'"]').addClass('active');
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function getServicer(){
|
||||
let store_id = $('[name="store_id"]').val();
|
||||
$.ajax({
|
||||
url: ns.url("cardservice://shop/reserve/servicerlist"),
|
||||
data: {'store_id':store_id},
|
||||
dataType: 'JSON',
|
||||
type: 'POST',
|
||||
success: function (res) {
|
||||
if (res.code == 0) {
|
||||
let html = '';
|
||||
|
||||
let store_html = '';
|
||||
|
||||
for(let i in res.data){
|
||||
let item = res.data[i];
|
||||
store_html += `
|
||||
<div class="select-item">
|
||||
<div class="title">${item.username}</div>
|
||||
<input type="hidden" name="servicer" value="${item.uid}">
|
||||
</div>
|
||||
`;
|
||||
}
|
||||
|
||||
html += `
|
||||
<div class="select-servicer">
|
||||
<div class="select-item">
|
||||
<div class="title">不选择员工</div>
|
||||
<input type="hidden" name="servicer" value="0">
|
||||
</div>
|
||||
${store_html}
|
||||
</div>
|
||||
`;
|
||||
|
||||
$('#selectServicer').html(html);
|
||||
|
||||
$('.servicer-item-btn').each(function (i, e) {
|
||||
var id = ns.gen_non_duplicate(5);
|
||||
if($(e).attr('id') == '' || $(e).attr('id') == undefined) $(e).attr('id', id);
|
||||
id = $(e).attr('id');
|
||||
dropdown.suite("#"+id, {
|
||||
template: "selectServicer",
|
||||
maxWidth:'660',
|
||||
success: function ($dom) {
|
||||
$dom.addClass('border-color').css({
|
||||
'outline':'none',
|
||||
'border':'2px solid'
|
||||
});
|
||||
}
|
||||
});
|
||||
})
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
</script>
|
||||
108
addon/cardservice/shop/view/reserve/config.html
Executable file
108
addon/cardservice/shop/view/reserve/config.html
Executable file
@@ -0,0 +1,108 @@
|
||||
<style>
|
||||
.layui-input {
|
||||
display: inline-block;
|
||||
}
|
||||
</style>
|
||||
|
||||
<div class="layui-form main-wrap form-wrap" lay-filter="form">
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label"><span class="required">*</span>预约时间:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="checkbox" title="周一" lay-skin="primary" name="week[]" value="1" {if in_array(1, $config.week)}checked{/if}>
|
||||
<input type="checkbox" title="周二" lay-skin="primary" name="week[]" value="2" {if in_array(2, $config.week)}checked{/if}>
|
||||
<input type="checkbox" title="周三" lay-skin="primary" name="week[]" value="3" {if in_array(3, $config.week)}checked{/if}>
|
||||
<input type="checkbox" title="周四" lay-skin="primary" name="week[]" value="4" {if in_array(4, $config.week)}checked{/if}>
|
||||
<input type="checkbox" title="周五" lay-skin="primary" name="week[]" value="5" {if in_array(5, $config.week)}checked{/if}>
|
||||
<input type="checkbox" title="周六" lay-skin="primary" name="week[]" value="6" {if in_array(6, $config.week)}checked{/if}>
|
||||
<input type="checkbox" title="周日" lay-skin="primary" name="week[]" value="0" {if in_array(0, $config.week)}checked{/if}>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label"></label>
|
||||
<div class="layui-input-inline len-short">
|
||||
{php}$today = strtotime(date('Y-m-d')) {/php}
|
||||
<select name="start">
|
||||
{for start="0" end="48" name="i"}
|
||||
<option value="{$i * 1800}" {if $config.start == ($i * 1800)}selected{/if}>{:date('H:i', $today + ($i * 1800))}</option>
|
||||
{/for}
|
||||
</select>
|
||||
</div>
|
||||
<div class="layui-form-mid layui-word-aux">-</div>
|
||||
<div class="layui-input-inline len-short">
|
||||
<select name="end" id="">
|
||||
{for start="0" end="48" name="i"}
|
||||
<option value="{$i * 1800}" {if $config.end == ($i * 1800)}selected{/if}>{:date('H:i', $today + ($i * 1800))}</option>
|
||||
{/for}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label"><span class="required">*</span>预约时间间隔:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="radio" title="30分钟" lay-skin="primary" name="interval" value="30" {if empty($config) || $config.interval == 30}checked{/if}>
|
||||
<input type="radio" title="1小时" lay-skin="primary" name="interval" value="60" {if !empty($config) && $config.interval == 60}checked{/if}>
|
||||
<input type="radio" title="90分钟" lay-skin="primary" name="interval" value="90" {if !empty($config) && $config.interval == 90}checked{/if}>
|
||||
<input type="radio" title="2小时" lay-skin="primary" name="interval" value="120" {if !empty($config) && $config.interval == 120}checked{/if}>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label"><span class="required">*</span>预约提前:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="number" name="advance" value="{$config.advance ?? 1}" class="layui-input len-short" lay-verify="advance">
|
||||
<div class="layui-word-aux">小时</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label"><span class="required">*</span>每时段可预约:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="number" name="max" value="{$config.max ?? 1}" class="layui-input len-short" lay-verify="max">
|
||||
<div class="layui-word-aux">人</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-row">
|
||||
<button class="layui-btn bg-color " lay-submit="" lay-filter="save">保存</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
var repeat_flag = false, form;
|
||||
|
||||
layui.use(['form'], function () {
|
||||
form = layui.form;
|
||||
|
||||
form.verify({
|
||||
advance(value) {
|
||||
if (isNaN(value) || !/(^[1-9]\d*$)/.test(value)) {
|
||||
return "预约提前时间格式输入错误";
|
||||
}
|
||||
if (value < 0) {
|
||||
return "预约提前时间不能小于0";
|
||||
}
|
||||
},
|
||||
max(value) {
|
||||
if (isNaN(value) || !/(^[1-9]\d*$)/.test(value)) {
|
||||
return "每时段可预约人数格式输入错误";
|
||||
}
|
||||
if (value < 0) {
|
||||
return "每时段可预约人数不能小于0";
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
form.on('submit(save)', function (data) {
|
||||
if (repeat_flag) return false;
|
||||
repeat_flag = true;
|
||||
|
||||
$.ajax({
|
||||
url: ns.url("cardservice://shop/reserve/config"),
|
||||
data: data.field,
|
||||
dataType: 'JSON',
|
||||
type: 'POST',
|
||||
success: function (res) {
|
||||
layer.msg(res.message, { time: 1000 }, function () {});
|
||||
repeat_flag = false;
|
||||
}
|
||||
});
|
||||
})
|
||||
})
|
||||
</script>
|
||||
75
addon/cardservice/shop/view/reserve/detail.html
Executable file
75
addon/cardservice/shop/view/reserve/detail.html
Executable file
@@ -0,0 +1,75 @@
|
||||
<style>
|
||||
.align-right {text-align: right!important;}
|
||||
.service-table {width: 600px!important;}
|
||||
</style>
|
||||
<div class="main-wrap">
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">预约客户:</label>
|
||||
<div class="layui-input-inline">
|
||||
<a href="{:href_url('shop/member/editmember?member_id='.$info.member_id)}" target="_blank">{$info.nickname} {$info.mobile}</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">预约门店:</label>
|
||||
<div class="layui-input-inline">{$info.store_name ? $info.store_name : ''}</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">预约状态:</label>
|
||||
<div class="layui-input-inline">{$info.reserve_state_name}</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">预约到店时间:</label>
|
||||
<div class="layui-input-inline">{:date('Y-m-d H:i', $info.reserve_time)}</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">创建时间:</label>
|
||||
<div class="layui-input-inline">{:date('Y-m-d H:i', $info.create_time)}</div>
|
||||
</div>
|
||||
{if $info.to_store_time}
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">到店时间:</label>
|
||||
<div class="layui-input-inline">{:date('Y-m-d H:i', $info.to_store_time)}</div>
|
||||
</div>
|
||||
{/if}
|
||||
{if $info.cancel_time}
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">取消时间:</label>
|
||||
<div class="layui-input-inline">{:date('Y-m-d H:i', $info.cancel_time)}</div>
|
||||
</div>
|
||||
{/if}
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">预约项目:</label>
|
||||
<div class="layui-input-inline service-table">
|
||||
<table class="layui-table" lay-skin="line">
|
||||
<colgroup>
|
||||
<col width="62%">
|
||||
<col width="18%">
|
||||
<col>
|
||||
</colgroup>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>项目</th>
|
||||
<th>技师</th>
|
||||
<th class="align-right">项目时长</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{foreach name="info.item" item="item"}
|
||||
<tr>
|
||||
<td>{$item.goods_name}</td>
|
||||
<td>{if $item.reserve_user_id}{$item.username}{else/}未选择员工{/if}</td>
|
||||
<td class="align-right">{$item.service_length}分钟</td>
|
||||
</tr>
|
||||
{/foreach}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">备注:</label>
|
||||
<div class="layui-input-inline">{$info.remark ? $info.remark : '-'}</div>
|
||||
</div>
|
||||
<div class="form-row">
|
||||
<button class="layui-btn layui-btn-primary" onclick="layer.closeAll();">返回</button>
|
||||
</div>
|
||||
</div>
|
||||
461
addon/cardservice/shop/view/reserve/index.html
Executable file
461
addon/cardservice/shop/view/reserve/index.html
Executable file
@@ -0,0 +1,461 @@
|
||||
<link rel="stylesheet" href="ADDON_CARDSERVICE_CSS/reserve_index.css">
|
||||
<style>
|
||||
.layui-layer-loading {
|
||||
box-shadow: unset!important;
|
||||
}
|
||||
.screen.reserve {
|
||||
padding: 0;
|
||||
margin-top: 20px;
|
||||
}
|
||||
{foreach name="reserve_state" item="vo"}
|
||||
.{$vo.state} {
|
||||
background-color: {$vo.color};
|
||||
border-color: {$vo.color};
|
||||
}
|
||||
.{$vo.state}-color {
|
||||
color: {$vo.color};
|
||||
}
|
||||
{/foreach}
|
||||
</style>
|
||||
|
||||
|
||||
<div class="layui-card layui-form reserve-data">
|
||||
<div class="uni-flex panel-head">
|
||||
<button class="layui-btn" onclick="addReserve()">添加预约</button>
|
||||
<div class="status uni-flex">
|
||||
{foreach name="reserve_state" item="vo"}
|
||||
<div class="color {$vo.state}"></div>
|
||||
<div>{$vo.name}</div>
|
||||
{/foreach}
|
||||
</div>
|
||||
</div>
|
||||
<div class="screen reserve">
|
||||
<div class="layui-colla-item">
|
||||
<div class="layui-colla-content layui-form layui-show">
|
||||
<div class="layui-form-item">
|
||||
<div class="layui-inline">
|
||||
<label class="layui-form-label">客户:</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="search_text" placeholder="请输入客户名称/客户手机号" autocomplete="off" class="layui-input ">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-inline">
|
||||
<label class="layui-form-label">预约门店:</label>
|
||||
<div class="layui-input-inline">
|
||||
<select name="store_id">
|
||||
<option value="">全部</option>
|
||||
{foreach $store_list as $k=> $v}
|
||||
<option value="{$v.store_id}">{$v.store_name}</option>
|
||||
{/foreach}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-row">
|
||||
<button class="layui-btn bg-color" lay-submit lay-filter="search">筛选</button>
|
||||
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="panel-body">
|
||||
<!-- 看板类型 -->
|
||||
<!-- <div class="time-type">-->
|
||||
<!-- <span class="on" data-type="week">周</span>-->
|
||||
<!-- <span data-type="month">月</span>-->
|
||||
<!-- </div>-->
|
||||
<!-- 看板数据 -->
|
||||
<div class="time-data" id="time-data">
|
||||
<div class="uni-flex time-wrap">
|
||||
<span class="iconfont iconback_light" onclick="prevWeek()"></span>
|
||||
<div class="date">{$data[0]['date']} - {$data[6]['date']}</div>
|
||||
<span class="iconfont iconyoujiantou" onclick="nextWeek()"></span>
|
||||
</div>
|
||||
<div class="head uni-flex">
|
||||
{foreach name="$data" item="item"}
|
||||
<div>
|
||||
<button class="layui-btn {if $item.currday eq 0}layui-btn-primary{/if}">{$item.week}<span>{$item.date}</span></button>
|
||||
</div>
|
||||
{/foreach}
|
||||
</div>
|
||||
<div class="body uni-flex">
|
||||
{foreach name="$data" item="item"}
|
||||
<div class="common-scrollbar" data-page="1" data-total="{$item.data.page_count}" data-start="{$item.start}" data-end="{$item.end}">
|
||||
<div class="box">
|
||||
{notempty name="item.data.list"}
|
||||
{foreach name="item.data.list" item="vo"}
|
||||
<div class="panel-item {$vo.reserve_state}">
|
||||
<div class="username">{$vo.nickname}</div>
|
||||
<div class="time {$vo.reserve_state}">{:date('H:i', $vo.reserve_time)}</div>
|
||||
{php}
|
||||
$vo['reserve_item'] = explode(',', $vo['reserve_item']);
|
||||
{/php}
|
||||
{foreach name="$vo.reserve_item" item="goods_name"}
|
||||
<div class="service">{$goods_name}</div>
|
||||
{/foreach}
|
||||
<div class="action" data-state="{$vo.reserve_state}" data-id="{$vo.reserve_id}">
|
||||
<span class="iconfont iconyuandian"></span>
|
||||
</div>
|
||||
</div>
|
||||
{/foreach}
|
||||
{/notempty}
|
||||
</div>
|
||||
</div>
|
||||
{/foreach}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 周看板数据 -->
|
||||
<script type="text/html" id="dataTpl">
|
||||
<div class="uni-flex time-wrap">
|
||||
<span class="iconfont iconback_light" onclick="prevWeek()"></span>
|
||||
<div class="date">{{ d[0].date }} - {{ d[6].date }}</div>
|
||||
<span class="iconfont iconyoujiantou" onclick="nextWeek()"></span>
|
||||
</div>
|
||||
<div class="head uni-flex">
|
||||
{{# layui.each(d, function(index, item){ }}
|
||||
<div>
|
||||
<button class="layui-btn {{# if(item.currday == 0){ }}layui-btn-primary{{# } }}">{{ item.week }}<span>{{ item.date }}</span></button>
|
||||
</div>
|
||||
{{# }); }}
|
||||
</div>
|
||||
<div class="body uni-flex">
|
||||
{{# layui.each(d, function(index, item){ }}
|
||||
<div class="common-scrollbar" data-page="0" data-total="1" data-start="{{item.start}}" data-end="{{item.end}}">
|
||||
<div class="box"></div>
|
||||
</div>
|
||||
{{# }); }}
|
||||
</div>
|
||||
</script>
|
||||
|
||||
<script type="text/html" id="reserveTpl">
|
||||
{{# layui.each(d, function(vindex, vo){ }}
|
||||
<div class="panel-item {{ vo.reserve_state }}">
|
||||
<div class="username">{{ vo.nickname }}</div>
|
||||
<div class="time {{ vo.reserve_state }}">{{ ns.time_to_date(vo.reserve_time, 'H:i') }}</div>
|
||||
{{# vo.reserve_item.split(',').forEach(function(goods_name){ }}
|
||||
<div class="service">{{ goods_name }}</div>
|
||||
{{# }); }}
|
||||
<div class="action" data-state="{{ vo.reserve_state }}" data-id="{{ vo.reserve_id }}">
|
||||
<span class="iconfont iconyuandian"></span>
|
||||
</div>
|
||||
</div>
|
||||
{{# }); }}
|
||||
</script>
|
||||
|
||||
<!-- 月看板日期模板 -->
|
||||
<script type="text/html" id="month-table-tpl">
|
||||
<div class="uni-flex time-wrap">
|
||||
<span class="iconfont iconback_light" onclick="prevMonth()"></span>
|
||||
<div class="date">{{ data_year }}/{{ data_month < 10 ? '0' + data_month : data_month }}</div>
|
||||
<span class="iconfont iconyoujiantou" onclick="nextMonth()"></span>
|
||||
</div>
|
||||
<div class="month-table">
|
||||
<div class="table-head">
|
||||
<div class="table-tr">
|
||||
<div class="table-td">周一</div>
|
||||
<div class="table-td">周二</div>
|
||||
<div class="table-td">周三</div>
|
||||
<div class="table-td">周四</div>
|
||||
<div class="table-td">周五</div>
|
||||
<div class="table-td">周六</div>
|
||||
<div class="table-td">周日</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="table-body">
|
||||
{{# d.forEach(function(week_days, week_index){ }}
|
||||
<div class="table-tr">
|
||||
{{# week_days.forEach(function(item, index){ }}
|
||||
<div class="table-td {{ item.is_curr_month ? '' : 'not-curr-month' }}">
|
||||
<div class="top">{{ item.day }}</div>
|
||||
<div class="bottom" id="{{item.month}}_month_{{item.day}}_day">
|
||||
<!-- 每日数据 -->
|
||||
</div>
|
||||
</div>
|
||||
{{# }) }}
|
||||
</div>
|
||||
{{# }) }}
|
||||
</div>
|
||||
</div>
|
||||
</script>
|
||||
|
||||
<!-- 月看板每日数据模板 -->
|
||||
<script type="text/html" id="month-table-td-tpl">
|
||||
{{# d.list.forEach(function(item, index){ }}
|
||||
<div class="item-box">
|
||||
<div class="item" data-reserve_id="{{ item.reserve_id }}">
|
||||
<span class="{{ item.reserve_state }}"></span>
|
||||
<span>{{ item.reserve_item }}</span>
|
||||
</div>
|
||||
<div class="detail-card">
|
||||
<div class="username">{{ item.nickname }}</div>
|
||||
<div class="time {{ item.reserve_state }}">{{ ns.time_to_date(item.reserve_time, 'H:i') }}</div>
|
||||
{{# item.reserve_item.split(',').forEach(function(goods_name){ }}
|
||||
<div class="service">{{ goods_name }}</div>
|
||||
{{# }); }}
|
||||
<div class="state {{ item.reserve_state }}-color">{{ item.reserve_state_name }}</div>
|
||||
</div>
|
||||
</div>
|
||||
{{# }) }}
|
||||
{{# if(d.count > d.list.length){ }}
|
||||
{{# let more_url = ns.href('cardservice://shop/reserve/lists', {start_time:d.start_time, end_time:d.end_time}); }}
|
||||
<div class="more"><a href="{{ more_url }}" target="_blank">查看全部{{ d.count }}条预约 ></a></div>
|
||||
{{# } }}
|
||||
</script>
|
||||
|
||||
{include file="reserve/reserve_action"}
|
||||
<script>
|
||||
var dropdown, laytpl, form, _dropdown = {};
|
||||
var data_year = (new Date()).getFullYear();
|
||||
var data_month = (new Date()).getMonth() + 1;
|
||||
|
||||
layui.use(['form', 'laytpl', 'dropdown'], function(){
|
||||
|
||||
dropdown = layui.dropdown;
|
||||
laytpl = layui.laytpl;
|
||||
form = layui.form;
|
||||
|
||||
init();
|
||||
|
||||
/**
|
||||
* 搜索功能
|
||||
*/
|
||||
form.on('submit(search)', function(data) {
|
||||
curr = 0;
|
||||
getWeekData();
|
||||
return false;
|
||||
});
|
||||
});
|
||||
|
||||
// 触底加载
|
||||
$('.panel-body .common-scrollbar').scroll(function () {
|
||||
var top = $(this).scrollTop();
|
||||
var windowHeight = $(this).height();
|
||||
var documentHeight = $(this).find('.box').height();
|
||||
|
||||
if (documentHeight - top - windowHeight < 20) {
|
||||
loadinfo($(this))
|
||||
}
|
||||
});
|
||||
|
||||
function addReserve() {
|
||||
layer.open({
|
||||
title: '添加预约',
|
||||
type: 2,
|
||||
content: ns.url('cardservice://shop/reserve/addreserve?request_mode=iframe'),
|
||||
area: ['800px', '690px'],
|
||||
success: function (layero, index) {
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
var curr = 0, repeat = false;
|
||||
function prevWeek() { curr -= 1; getWeekData(); }
|
||||
function nextWeek() { curr += 1; getWeekData(); }
|
||||
|
||||
function getWeekData() {
|
||||
if (repeat) return;
|
||||
repeat = true;
|
||||
|
||||
layer.load(3,{shade: [0.8, '#fff']});
|
||||
|
||||
$.ajax({
|
||||
url: ns.url("cardservice://shop/reserve/getweekday"),
|
||||
data: {
|
||||
length: curr
|
||||
},
|
||||
dataType: 'JSON',
|
||||
type: 'POST',
|
||||
success: function (res) {
|
||||
repeat = false;
|
||||
if (res.code == 0) {
|
||||
laytpl($('#dataTpl').html()).render(res.data, function(string){
|
||||
$('#time-data').html(string);
|
||||
layer.closeAll();
|
||||
$('.panel-body .common-scrollbar').scroll(function () {
|
||||
var top = $(this).scrollTop();
|
||||
var windowHeight = $(this).height();
|
||||
var documentHeight = $(this).find('.box').height();
|
||||
if (documentHeight - top - windowHeight < 20) {
|
||||
loadinfo($(this))
|
||||
}
|
||||
});
|
||||
|
||||
$('.panel-body .common-scrollbar').each(function (index, item) {
|
||||
loadinfo($(item))
|
||||
})
|
||||
|
||||
});
|
||||
|
||||
} else {
|
||||
layer.msg('请求错误');
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function loadinfo(elem) {
|
||||
var page = parseInt(elem.attr('data-page')),
|
||||
total = elem.attr('data-total');
|
||||
|
||||
if (page >= total) return;
|
||||
page += 1;
|
||||
|
||||
$.ajax({
|
||||
url: ns.url("cardservice://shop/reserve/lists"),
|
||||
data: {
|
||||
page: page,
|
||||
start_time: elem.attr('data-start'),
|
||||
end_time: elem.attr('data-end'),
|
||||
store_id: $('[name="store_id"]').val(),
|
||||
search_text: $('[name="search_text"]').val(),
|
||||
},
|
||||
dataType: 'JSON',
|
||||
type: 'POST',
|
||||
success: function (res) {
|
||||
if (res.code == 0 && res.data.list.length) {
|
||||
elem.attr('data-page', page);
|
||||
laytpl($('#reserveTpl').html()).render(res.data.list, function(string) {
|
||||
elem.find('.box').append(string);
|
||||
init();
|
||||
})
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function getMonthDays() {
|
||||
layer.load(3,{shade: [0.8, '#fff']});
|
||||
$.ajax({
|
||||
url: ns.url("cardservice://shop/reserve/getMonthDays"),
|
||||
data: {
|
||||
year : data_year,
|
||||
month : data_month,
|
||||
},
|
||||
dataType: 'JSON',
|
||||
type: 'POST',
|
||||
success: function (res) {
|
||||
if (res.code == 0) {
|
||||
var month_data = [];
|
||||
var week_data = [];
|
||||
var month_day_num = res.data.length;
|
||||
res.data.forEach(function(item, index){
|
||||
week_data.push(item);
|
||||
if(week_data.length === 7 || index === month_day_num - 1){
|
||||
month_data.push(week_data);
|
||||
week_data = [];
|
||||
}
|
||||
});
|
||||
laytpl($('#month-table-tpl').html()).render(month_data, function(string){
|
||||
$("#time-data").html(string);
|
||||
layer.closeAll();
|
||||
res.data.forEach(function(item, index){
|
||||
getDayData(item);
|
||||
})
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function getDayData(item) {
|
||||
$.ajax({
|
||||
url: ns.url("cardservice://shop/reserve/lists"),
|
||||
data: {
|
||||
page: 1,
|
||||
page_size:3,
|
||||
start_time: ns.date_to_time(item.start_time),
|
||||
end_time: ns.date_to_time(item.end_time),
|
||||
store_id: $('[name="store_id"]').val(),
|
||||
search_text: $('[name="search_text"]').val(),
|
||||
},
|
||||
dataType: 'JSON',
|
||||
type: 'POST',
|
||||
success: function (res) {
|
||||
if (res.code == 0 && res.data.list.length) {
|
||||
res.data.start_time = item.start_time;
|
||||
res.data.end_time = item.end_time;
|
||||
laytpl($('#month-table-td-tpl').html()).render(res.data, function(string) {
|
||||
$(`#${item.month}_month_${item.day}_day`).html(string);
|
||||
init();
|
||||
})
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
$("#time-data").on('click', '.table-td .bottom .item', function(){
|
||||
let reserve_id = $(this).attr('data-reserve_id');
|
||||
reserveEvent('detail', {reserve_id: reserve_id});
|
||||
});
|
||||
|
||||
function prevMonth(){
|
||||
if(data_month > 1){
|
||||
data_month --;
|
||||
}else{
|
||||
data_month = 12;
|
||||
data_year --;
|
||||
}
|
||||
getMonthDays();
|
||||
}
|
||||
|
||||
function nextMonth(){
|
||||
if(data_month < 12){
|
||||
data_month ++;
|
||||
}else{
|
||||
data_month = 1;
|
||||
data_year ++;
|
||||
}
|
||||
getMonthDays();
|
||||
}
|
||||
|
||||
$(".time-type span").on('click', function(){
|
||||
$(this).addClass('on').siblings().removeClass('on');
|
||||
var type = $(this).attr('data-type');
|
||||
if(type === 'week'){
|
||||
curr = 0;
|
||||
getWeekData();
|
||||
}else{
|
||||
data_year = (new Date()).getFullYear();
|
||||
data_month = (new Date()).getMonth() + 1;
|
||||
getMonthDays();
|
||||
}
|
||||
});
|
||||
|
||||
function init(){
|
||||
$('body .panel-item .action').each(function () {
|
||||
var state = $(this).attr('data-state');
|
||||
var reserveId = $(this).attr('data-id');
|
||||
var menuData = getMemuData(state);
|
||||
var elem = $(this);
|
||||
let id = $(elem).attr('id');
|
||||
if(id == '' || id == undefined){
|
||||
id = ns.gen_non_duplicate(5);
|
||||
$(elem).attr('id', id)
|
||||
}
|
||||
|
||||
if (!_dropdown['reserve_id' + reserveId]) {
|
||||
dropdown.suite("#"+id, {
|
||||
menus: menuData,
|
||||
success: function ($dom) {
|
||||
$dom.addClass('border-color').css({
|
||||
'outline':'none',
|
||||
'border':'2px solid'
|
||||
});
|
||||
},
|
||||
onItemClick: function (event, menu) {
|
||||
let data_id = $('#'+id).attr('data-id');
|
||||
reserveEvent(event, {reserve_id: data_id}, function (res) {
|
||||
getWeekData()
|
||||
});
|
||||
},
|
||||
});
|
||||
}
|
||||
})
|
||||
}
|
||||
</script>
|
||||
373
addon/cardservice/shop/view/reserve/lists.html
Executable file
373
addon/cardservice/shop/view/reserve/lists.html
Executable file
@@ -0,0 +1,373 @@
|
||||
<style>
|
||||
.layui-layout-admin .layui-form-item .layui-input-inline {
|
||||
background-color: #fff;
|
||||
}
|
||||
.table-btn .more-operation {
|
||||
display: none;
|
||||
font-size: 14px;
|
||||
line-height: 20px;
|
||||
background-color: #fff;
|
||||
box-shadow: 0 2px 8px 0 rgba(200, 201, 204, .5);
|
||||
position: absolute;
|
||||
z-index: 2000;
|
||||
border-radius: 2px;
|
||||
padding: 13px 12px;
|
||||
top: 40px;
|
||||
right: 5px;
|
||||
transform: translateX(10px);
|
||||
}
|
||||
.main-wrap{
|
||||
padding-bottom: 20px;
|
||||
}
|
||||
.body-content {
|
||||
padding-top: 0!important;
|
||||
}
|
||||
.table-btn .more-operation:before {
|
||||
right: 7px;
|
||||
top: -14px;
|
||||
border: solid transparent;
|
||||
content: "";
|
||||
height: 0;
|
||||
width: 0;
|
||||
position: absolute;
|
||||
pointer-events: none;
|
||||
border-bottom-color: #fff;
|
||||
border-width: 8px;
|
||||
}
|
||||
|
||||
.table-btn .more-operation .operation {
|
||||
display: block;
|
||||
text-align: right;
|
||||
margin-bottom: 12px;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.table-btn .more-operation .operation:last-child {
|
||||
margin-bottom: 0
|
||||
}
|
||||
.layui-table-view td:last-child>div {
|
||||
overflow: inherit;
|
||||
}
|
||||
.operation-wrap {
|
||||
position: relative;
|
||||
}
|
||||
</style>
|
||||
|
||||
<div class="main-wrap">
|
||||
<div class="single-filter-box single-filter-box">
|
||||
<button class="layui-btn" onclick="addReserve()">添加预约</button>
|
||||
</div>
|
||||
|
||||
<div class="screen layui-collapse" lay-filter="selection_panel">
|
||||
<div class="layui-colla-item">
|
||||
<div class="layui-form layui-colla-content layui-form layui-show" >
|
||||
|
||||
<div class="layui-form-item">
|
||||
<div class="layui-inline">
|
||||
<label class="layui-form-label">客户</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="search_text" placeholder="请输入客户名称/客户手机号" autocomplete="off" class="layui-input ">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-inline">
|
||||
<label class="layui-form-label">预约门店</label>
|
||||
<div class="layui-input-inline">
|
||||
<select name="store_id">
|
||||
<option value="">全部</option>
|
||||
{foreach $store_list as $k=> $v}
|
||||
<option value="{$v.store_id}">{$v.store_name}</option>
|
||||
{/foreach}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<div class="layui-inline">
|
||||
<label class="layui-form-label">预约时间</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" class="layui-input" name="start_time" placeholder="开始时间" id="start_time" readonly>
|
||||
<i class=" iconrili iconfont calendar"></i>
|
||||
</div>
|
||||
<div class="layui-form-mid">-</div>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" class="layui-input" name="end_time" placeholder="结束时间" id="end_time" readonly>
|
||||
<i class=" iconrili iconfont calendar"></i>
|
||||
</div>
|
||||
<button class="layui-btn layui-btn-primary date-picker-btn" onclick="datePick(7, this);return false;">近7天</button>
|
||||
<button class="layui-btn layui-btn-primary date-picker-btn" onclick="datePick(30, this);return false;">近30天</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-row">
|
||||
<button class="layui-btn bg-color" lay-submit lay-filter="search">筛选</button>
|
||||
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 列表 -->
|
||||
<div class="table-tab layui-tab" lay-filter="list_tab">
|
||||
<div class="table-tab-list">
|
||||
<ul class="layui-tab-title">
|
||||
<li class="layui-this" lay-id="all">全部</li>
|
||||
{foreach name="$reserve_state" item="vo"}
|
||||
<li lay-id="{$vo.state}" data-type="reserve_state">{$vo.name}</li>
|
||||
{/foreach}
|
||||
</ul>
|
||||
</div>
|
||||
<div class="layui-tab-content">
|
||||
<table id="reserve_list" lay-filter="reserve_list"></table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 用户信息 -->
|
||||
<script type="text/html" id="detail">
|
||||
<div class='table-title'>
|
||||
<div class='title-pic'>
|
||||
<img layer-src src="{{ns.img(d.headimg)}}" onerror="this.src = 'STATIC_IMG/default_img/head.png' ">
|
||||
</div>
|
||||
<div class='title-content'>
|
||||
<p class="layui-elip" title="{{d.nickname}}">{{d.nickname}}</p>
|
||||
{{# if(d.member_id != 0 && d.mobile){ }}
|
||||
<p title="{{d.mobile}}">{{d.mobile}}</p>
|
||||
{{# } }}
|
||||
</div>
|
||||
</div>
|
||||
</script>
|
||||
|
||||
<!-- 工具栏操作 -->
|
||||
<script type="text/html" id="operation">
|
||||
<div class="operation-wrap">
|
||||
<div class="table-btn">
|
||||
<a class="layui-btn" lay-event="detail">详情</a>
|
||||
{{# if(d.reserve_state == 'cancelled'){ }} <a class="layui-btn" lay-event="delete">删除预约</a> {{# } }}
|
||||
{{# if(d.reserve_state != 'completed' && d.reserve_state != 'cancelled'){ }} <a class="layui-btn" lay-event="more">更多</a>{{# } }}
|
||||
<div class="more-operation">
|
||||
{{# if(d.reserve_state == 'wait_confirm'){ }}
|
||||
<a class="operation" lay-event="confirm">确认预约</a>
|
||||
<a class="operation" lay-event="update">更改预约</a>
|
||||
{{# } }}
|
||||
{{# if(d.reserve_state == 'wait_to_store'){ }}
|
||||
<a class="operation" lay-event="tostore">确认到店</a>
|
||||
<a class="operation" lay-event="update">更改预约</a>
|
||||
{{# } }}
|
||||
{{# if(d.reserve_state == 'arrived_store'){ }} <a class="operation" lay-event="complet">确认完成</a> {{# } }}
|
||||
{{# if(d.reserve_state == 'wait_confirm' || d.reserve_state == 'wait_to_store' || d.reserve_state == 'arrived_store'){ }} <a class="operation" lay-event="cancel">取消预约</a> {{# } }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</script>
|
||||
|
||||
{include file="reserve/reserve_action"}
|
||||
|
||||
<script type="text/javascript">
|
||||
var table, form, laytpl, element, currentDate = new Date(), minDate = "",laydate;
|
||||
|
||||
layui.use(['form', 'element', 'laydate'], function() {
|
||||
form = layui.form;
|
||||
laydate = layui.laydate;
|
||||
element = layui.element;
|
||||
currentDate.setDate(currentDate.getDate() - 7);
|
||||
form.render();
|
||||
|
||||
laydate.render({
|
||||
elem: '#start_time'
|
||||
,type: 'datetime'
|
||||
,change: function(value, date, endDate){
|
||||
$(".date-picker-btn").removeClass("selected");
|
||||
}
|
||||
});
|
||||
laydate.render({
|
||||
elem: '#end_time'
|
||||
,type: 'datetime'
|
||||
,change: function(value, date, endDate){
|
||||
$(".date-picker-btn").removeClass("selected");
|
||||
}
|
||||
});
|
||||
|
||||
element.on('tab(list_tab)', function (data) {
|
||||
var state = $(data.elem).find('li:eq('+ data.index + ')').attr('lay-id');
|
||||
$('[name="reserve_state"]').val(state);
|
||||
table.reload({
|
||||
where: {
|
||||
reserve_state: state,
|
||||
search_text: $('input[name="search_text"]').val(),
|
||||
store_id: $('select[name="store_id"]').val(),
|
||||
start: $('input[name="start"]').val() ? new Date($('input[name="start"]').val()).valueOf / 100 : '',
|
||||
end: $('input[name="end"]').val() ? new Date($('input[name="end"]').val()).valueOf / 100 : ''
|
||||
},
|
||||
page: {
|
||||
curr: 1
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
var cols = [
|
||||
[
|
||||
{
|
||||
title: '客户信息',
|
||||
width: '15%',
|
||||
templet: '#detail'
|
||||
},
|
||||
{
|
||||
field: 'service',
|
||||
title: '预约项目',
|
||||
width: '15%',
|
||||
templet: function (data) {
|
||||
var text = '';
|
||||
data.reserve_item.split(',').forEach(function (goods_name) {
|
||||
text += '<div class="goods-name">'+ goods_name +'</div>';
|
||||
});
|
||||
return text;
|
||||
}
|
||||
},
|
||||
{
|
||||
field: 'service',
|
||||
title: '预约门店',
|
||||
width: '15%',
|
||||
templet: function (data) {
|
||||
return data.store_name ? data.store_name : '';
|
||||
}
|
||||
},
|
||||
{
|
||||
title: '预约到店时间',
|
||||
width: '10%',
|
||||
templet: function (data) {
|
||||
if (data.reserve_time) {
|
||||
let time = ns.time_to_date(data.reserve_time).split(' ');
|
||||
let text = '<div class="time-line-height"><p>'+ time[0] +'</p><p>'+ time[1] +'</p></div>';
|
||||
if ((data.reserve_time == 'wait_confirm' || data.reserve_time == 'wait_to_store') && data.reserve_time < {:time()}) text += '<div class="error">已超时</div>';
|
||||
return text;
|
||||
} else {
|
||||
return '';
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
title: '下单时间',
|
||||
width: '10%',
|
||||
templet: function (data) {
|
||||
let time = ns.time_to_date(data.create_time).split(' ');
|
||||
return '<div class="time-line-height"><p>'+ time[0] +'</p><p>'+ time[1] +'</p></div>';
|
||||
}
|
||||
},
|
||||
{
|
||||
field: 'reserve_state_name',
|
||||
title: '预约状态',
|
||||
width: '10%',
|
||||
align: 'center',
|
||||
},
|
||||
{
|
||||
title: '来源',
|
||||
width: '10%',
|
||||
align: 'center',
|
||||
templet: function (data) {
|
||||
return data.source == 'store' ? '门店添加' : '客户预约';
|
||||
}
|
||||
},
|
||||
{
|
||||
title: '操作',
|
||||
width: '15%',
|
||||
align: 'right',
|
||||
toolbar: '#operation'
|
||||
}
|
||||
]
|
||||
];
|
||||
|
||||
/**
|
||||
* 加载表格
|
||||
*/
|
||||
table = new Table({
|
||||
elem: '#reserve_list',
|
||||
url: ns.url("cardservice://shop/reserve/lists"),
|
||||
where:{
|
||||
start_time : '{$start_time}',
|
||||
end_time : '{$end_time}',
|
||||
},
|
||||
cols: cols
|
||||
});
|
||||
|
||||
/**
|
||||
* 监听工具栏操作
|
||||
*/
|
||||
table.tool(function(obj) {
|
||||
var data = obj.data;
|
||||
switch (obj.event) {
|
||||
case 'more': //更多
|
||||
$('.more-operation').css('display', 'none');
|
||||
$(obj.tr).find('.more-operation').css('display', 'block');
|
||||
break;
|
||||
default:
|
||||
reserveEvent(obj.event, data, function () {
|
||||
table.reload();
|
||||
});
|
||||
break;
|
||||
}
|
||||
});
|
||||
|
||||
$(document).click(function(event) {
|
||||
if ($(event.target).attr('lay-event') != 'more' && $('.more-operation').not(':hidden').length) {
|
||||
$('.more-operation').css('display', 'none');
|
||||
}
|
||||
});
|
||||
|
||||
/**
|
||||
* 搜索功能
|
||||
*/
|
||||
form.on('submit(search)', function(data) {
|
||||
if (data.field.start_time && data.field.start_time != '') data.field.start_time = new Date(data.field.start_time).valueOf() / 1000;
|
||||
if (data.field.end_time && data.field.end_time != '') data.field.end_time = new Date(data.field.end_time).valueOf() / 1000;
|
||||
table.reload({
|
||||
page: {
|
||||
curr: 1
|
||||
},
|
||||
where: data.field
|
||||
});
|
||||
return false;
|
||||
});
|
||||
});
|
||||
|
||||
function addReserve() {
|
||||
layer.open({
|
||||
title: '添加预约',
|
||||
type: 2,
|
||||
content: ns.url('cardservice://shop/reserve/addreserve', {request_mode: 'iframe'}),
|
||||
area: ['800px', '690px']
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* 七天时间
|
||||
*/
|
||||
function datePick(date_num,event_obj){
|
||||
$(".date-picker-btn").removeClass("selected");
|
||||
$(event_obj).addClass('selected');
|
||||
var now_date = new Date();
|
||||
|
||||
Date.prototype.Format = function (fmt,date_num) { //author: meizz
|
||||
this.setDate(this.getDate()-date_num);
|
||||
var o = {
|
||||
"M+": this.getMonth() + 1, //月份
|
||||
"d+": this.getDate(), //日
|
||||
"H+": this.getHours(), //小时
|
||||
"m+": this.getMinutes(), //分
|
||||
"s+": this.getSeconds(), //秒
|
||||
"q+": Math.floor((this.getMonth() + 3) / 3), //季度
|
||||
"S": this.getMilliseconds() //毫秒
|
||||
};
|
||||
if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
|
||||
for (var k in o)
|
||||
if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
|
||||
return fmt;
|
||||
};
|
||||
// var now_time = new Date().Format("yyyy-MM-dd HH:mm:ss",0);//当前日期
|
||||
var now_time = new Date().Format("yyyy-MM-dd 23:59:59",0);//当前日期
|
||||
var before_time = new Date().Format("yyyy-MM-dd 00:00:00",date_num-1);//前几天日期
|
||||
$("input[name=start_time]").val(before_time,0);
|
||||
$("input[name=end_time]").val(now_time,date_num-1);
|
||||
}
|
||||
</script>
|
||||
253
addon/cardservice/shop/view/reserve/reserve_action.html
Executable file
253
addon/cardservice/shop/view/reserve/reserve_action.html
Executable file
@@ -0,0 +1,253 @@
|
||||
<script>
|
||||
var show_link_box_flag = true;
|
||||
function reserveEvent(event, data, callback) {
|
||||
switch (event) {
|
||||
case 'detail':
|
||||
var url = ns.url("cardservice://shop/reserve/detail");
|
||||
if (show_link_box_flag) {
|
||||
show_link_box_flag = false;
|
||||
$.post(url, {
|
||||
id: data.reserve_id
|
||||
}, function (str) {
|
||||
window.linkIndex = layer.open({
|
||||
type: 1,
|
||||
title: "预约详情",
|
||||
content: str,
|
||||
btn: [],
|
||||
area: ['850px'], //宽高
|
||||
maxWidth: 1920,
|
||||
cancel: function (index, layero) {
|
||||
show_link_box_flag = true;
|
||||
},
|
||||
end: function () {
|
||||
show_link_box_flag = true;
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
break;
|
||||
case 'confirm':
|
||||
confirmReserve(data, callback);
|
||||
break;
|
||||
case 'update':
|
||||
updateReserve(data);
|
||||
break;
|
||||
case 'tostore':
|
||||
confirmToStore(data, callback);
|
||||
break;
|
||||
case 'complet':
|
||||
confirmComplete(data, callback);
|
||||
break;
|
||||
case 'cancel':
|
||||
cancelReserve(data, callback);
|
||||
break;
|
||||
case 'delete':
|
||||
deleteReserve(data, callback);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
function getMemuData(state) {
|
||||
var menuData = [{txt: '预约详情', event: 'detail'}];
|
||||
switch (state) {
|
||||
case 'wait_confirm':
|
||||
menuData.push({txt: '确认预约', event: 'confirm'});
|
||||
menuData.push({txt: '更改预约', event: 'update'});
|
||||
menuData.push({txt: '取消预约', event: 'cancel'});
|
||||
break;
|
||||
case 'wait_to_store':
|
||||
menuData.push({txt: '确认到店', event: 'tostore'});
|
||||
menuData.push({txt: '更改预约', event: 'update'});
|
||||
menuData.push({txt: '取消预约', event: 'cancel'});
|
||||
break;
|
||||
case 'arrived_store':
|
||||
menuData.push({txt: '确认完成', event: 'complet'});
|
||||
break;
|
||||
case 'cancelled':
|
||||
menuData.push({txt: '删除预约', event: 'delete'});
|
||||
break;
|
||||
}
|
||||
return menuData;
|
||||
}
|
||||
|
||||
var repeat = false;
|
||||
function confirmReserve(data, callback) {
|
||||
layer.confirm('是否要确认该预约?', function(index){
|
||||
if (repeat) return;
|
||||
repeat = true;
|
||||
layer.close(index);
|
||||
$.ajax({
|
||||
url: ns.url("cardservice://shop/reserve/confirm"),
|
||||
data: {
|
||||
reserve_id: data.reserve_id
|
||||
},
|
||||
dataType: 'JSON',
|
||||
type: 'POST',
|
||||
success: function (res) {
|
||||
repeat = false;
|
||||
if (res.code == 0) {
|
||||
try {
|
||||
data.elem.attr('data-state', 'wait_to_store');
|
||||
data.elem.parents('.panel-item').attr('class', 'panel-item wait_to_store');
|
||||
data.elem.parents('.panel-item').find('.time').attr('class', 'time wait_to_store');
|
||||
var menuData = getMemuData('wait_to_store');
|
||||
_dropdown['reserve_id' + data.reserve_id].reload({
|
||||
data: menuData,
|
||||
show: false
|
||||
})
|
||||
} catch (e) {
|
||||
}
|
||||
typeof callback == 'function' && callback(data);
|
||||
} else {
|
||||
layer.msg(res.message)
|
||||
}
|
||||
}
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
function confirmToStore(data, callback) {
|
||||
layer.confirm('是否确认客户已经到店?', function(index){
|
||||
if (repeat) return;
|
||||
repeat = true;
|
||||
layer.close(index);
|
||||
$.ajax({
|
||||
url: ns.url("cardservice://shop/reserve/confirmtostore"),
|
||||
data: {
|
||||
reserve_id: data.reserve_id
|
||||
},
|
||||
dataType: 'JSON',
|
||||
type: 'POST',
|
||||
success: function (res) {
|
||||
repeat = false;
|
||||
if (res.code == 0) {
|
||||
try {
|
||||
data.elem.attr('data-state', 'arrived_store');
|
||||
data.elem.parents('.panel-item').attr('class', 'panel-item arrived_store');
|
||||
data.elem.parents('.panel-item').find('.time').attr('class', 'time arrived_store');
|
||||
var menuData = getMemuData('arrived_store');
|
||||
_dropdown['reserve_id' + data.reserve_id].reload({
|
||||
data: menuData,
|
||||
show: false
|
||||
})
|
||||
} catch (e) {
|
||||
}
|
||||
typeof callback == 'function' && callback(data);
|
||||
} else {
|
||||
layer.msg(res.message)
|
||||
}
|
||||
}
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
function confirmComplete(data, callback) {
|
||||
layer.confirm('确认已完成预约?', function(index){
|
||||
if (repeat) return;
|
||||
repeat = true;
|
||||
layer.close(index);
|
||||
$.ajax({
|
||||
url: ns.url("cardservice://shop/reserve/complete"),
|
||||
data: {
|
||||
reserve_id: data.reserve_id
|
||||
},
|
||||
dataType: 'JSON',
|
||||
type: 'POST',
|
||||
success: function (res) {
|
||||
repeat = false;
|
||||
if (res.code == 0) {
|
||||
try {
|
||||
data.elem.attr('data-state', 'completed');
|
||||
data.elem.parents('.panel-item').attr('class', 'panel-item completed');
|
||||
data.elem.parents('.panel-item').find('.time').attr('class', 'time completed');
|
||||
var menuData = getMemuData('completed');
|
||||
_dropdown['reserve_id' + data.reserve_id].reload({
|
||||
data: menuData,
|
||||
show: false
|
||||
})
|
||||
} catch (e) {
|
||||
}
|
||||
typeof callback == 'function' && callback(data);
|
||||
} else {
|
||||
layer.msg(res.message)
|
||||
}
|
||||
}
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
function cancelReserve(data, callback) {
|
||||
layer.confirm('确认要取消该预约?', function(index){
|
||||
if (repeat) return;
|
||||
repeat = true;
|
||||
layer.close(index);
|
||||
$.ajax({
|
||||
url: ns.url("cardservice://shop/reserve/cancel"),
|
||||
data: {
|
||||
reserve_id: data.reserve_id
|
||||
},
|
||||
dataType: 'JSON',
|
||||
type: 'POST',
|
||||
success: function (res) {
|
||||
repeat = false;
|
||||
if (res.code == 0) {
|
||||
try {
|
||||
data.elem.attr('data-state', 'cancelled');
|
||||
data.elem.parents('.panel-item').attr('class', 'panel-item cancelled');
|
||||
data.elem.parents('.panel-item').find('.time').attr('class', 'time cancelled');
|
||||
var menuData = getMemuData('cancelled');
|
||||
_dropdown['reserve_id' + data.reserve_id].reload({
|
||||
data: menuData,
|
||||
show: false
|
||||
})
|
||||
} catch (e) {
|
||||
}
|
||||
typeof callback == 'function' && callback(data);
|
||||
} else {
|
||||
layer.msg(res.message)
|
||||
}
|
||||
}
|
||||
})
|
||||
});
|
||||
}
|
||||
|
||||
function deleteReserve(data, callback) {
|
||||
layer.confirm('确认要删除该预约?', function(index){
|
||||
if (repeat) return;
|
||||
repeat = true;
|
||||
layer.close(index);
|
||||
$.ajax({
|
||||
url: ns.url("cardservice://shop/reserve/deletereserve"),
|
||||
data: {
|
||||
reserve_id: data.reserve_id
|
||||
},
|
||||
dataType: 'JSON',
|
||||
type: 'POST',
|
||||
success: function (res) {
|
||||
repeat = false;
|
||||
if (res.code == 0) {
|
||||
try {
|
||||
data.elem.parents('.panel-item').remove();
|
||||
} catch (e) {
|
||||
}
|
||||
typeof callback == 'function' && callback(data);
|
||||
} else {
|
||||
layer.msg(res.message)
|
||||
}
|
||||
}
|
||||
})
|
||||
});
|
||||
}
|
||||
|
||||
function updateReserve(data) {
|
||||
layer.open({
|
||||
title: '修改预约',
|
||||
type: 2,
|
||||
content: ns.url('cardservice://shop/reserve/updatereserve',{
|
||||
request_mode: 'iframe',
|
||||
id:data.reserve_id
|
||||
}),
|
||||
area: ['800px', '620px'],
|
||||
})
|
||||
}
|
||||
</script>
|
||||
701
addon/cardservice/shop/view/service/add_goods.html
Executable file
701
addon/cardservice/shop/view/service/add_goods.html
Executable file
@@ -0,0 +1,701 @@
|
||||
<link rel="stylesheet" href="__STATIC__/ext/video/video.css">
|
||||
<link rel="stylesheet" type="text/css" href="__STATIC__/ext/searchable_select/searchable_select.css" />
|
||||
<link rel="stylesheet" type="text/css" href="__STATIC__/ext/layui/extend/cascader/cascader.css"/>
|
||||
<link rel="stylesheet" type="text/css" href="SHOP_CSS/goods_edit.css?time=20250527" />
|
||||
|
||||
<div class="layui-form">
|
||||
<div class="layui-tab layui-tab-brief" lay-filter="goods_tab">
|
||||
<ul class="layui-tab-title">
|
||||
<li class="layu1i-this" lay-id="basic">基础设置</li>
|
||||
<li lay-id="price-stock">价格库存</li>
|
||||
<li lay-id="detail">项目详情</li>
|
||||
<li lay-id="senior">高级设置</li>
|
||||
</ul>
|
||||
<div class="layui-tab-content">
|
||||
<!-- 基础设置 -->
|
||||
<div class="layui-tab-item layui-show">
|
||||
|
||||
<!-- 项目类型 -->
|
||||
<div class="layui-card card-common card-brief head">
|
||||
<div class="layui-card-header">
|
||||
<span class="card-title">商品类型</span>
|
||||
</div>
|
||||
|
||||
<div class="layui-card-body commodity-type-box" >
|
||||
{foreach name="all_goodsclass" item="vo"}
|
||||
<div class="commodity-type-item {if $vo.goods_class eq $goods_class.id}border-color{/if}" onclick="location.hash = ns.hash('{$vo.add_url}')">
|
||||
<span>{$vo.goods_class_name}</span>
|
||||
<span>{$vo.is_virtual ? '(无需物流)' : '(需要物流)'}</span>
|
||||
</div>
|
||||
{/foreach}
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="layui-card card-common card-brief head">
|
||||
<div class="layui-card-header">
|
||||
<span class="card-title">基础信息</span>
|
||||
</div>
|
||||
|
||||
<div class="layui-card-body">
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label"><span class="required">*</span>项目名称:</label>
|
||||
<div class="layui-input-inline">
|
||||
<input name="goods_name" type="text" placeholder="请输入项目名称,不能超过60个字符" maxlength="60" autocomplete="off" lay-verify="goods_name" class="layui-input len-long">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">促销语:</label>
|
||||
<div class="layui-input-inline">
|
||||
<textarea class="layui-textarea len-long" name="introduction" maxlength="100" lay-verify="introduction" placeholder="请输入促销语,不能超过100个字符"></textarea>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">关键词:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="keywords" placeholder="项目关键词用于SEO搜索,不能超过100个字符" maxlength="100" autocomplete="off" class="layui-input len-long">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item goods-image-wrap">
|
||||
<label class="layui-form-label"><span class="required">*</span>项目主图:</label>
|
||||
<div class="layui-input-block">
|
||||
<!--项目主图项-->
|
||||
<div class="js-goods-image"></div>
|
||||
</div>
|
||||
<div class="word-aux">第一张图片将作为项目主图,支持同时上传多张图片,多张图片之间可随意调整位置;</div>
|
||||
<div class="word-aux">支持jpg、gif、png格式上传或从图片空间中选择,建议使用尺寸800x800像素以上、大小不超过1M的正方形图片;</div>
|
||||
<div class="word-aux">上传后的图片将会自动保存在图片空间的默认分类中,最多上传10张(至少1张)</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">项目视频:</label>
|
||||
<div class="layui-input-block">
|
||||
|
||||
<div class="video-thumb">
|
||||
<video id="goods_video" class="video-js vjs-big-play-centered" controls="" poster="SHOP_IMG/goods_video_preview.png" preload="auto"></video>
|
||||
</div>
|
||||
<div id="videoUpload2" class="up-video " title="项目视频" >
|
||||
<span class="delete-video hide" onclick="deleteVideo()"><img class="del-img" src="SHOP_IMG/delete.png">删除</span>
|
||||
<span class=" replace-video hide js-add-goods-video" ><img class="up-img" src="SHOP_IMG/upload.png">上传视频</span>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label"></label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="video_url" placeholder="在此输入外链视频地址" autocomplete="off" class="layui-input len-long">
|
||||
</div>
|
||||
<div class="file-title word-aux">
|
||||
<div>注意事项:</div>
|
||||
<ul>
|
||||
<li>1、检查upload文件夹是否有读写权限。</li>
|
||||
<li>2、PHP默认上传限制为2MB,需要在php.ini配置文件中修改“post_max_size”和“upload_max_filesize”的大小。</li>
|
||||
<li>3、视频支持手动输入外链视频地址或者上传本地视频文件</li>
|
||||
<li>4、必须上传.mp4视频格式</li>
|
||||
<li>5、视频文件大小不能超过500MB</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{notempty name="$service_list"}
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">项目服务:</label>
|
||||
<div class="layui-input-block">
|
||||
{foreach name="$service_list" item="vo"}
|
||||
<input type="checkbox" name="goods_service_ids" value="{$vo.id}" title="{$vo.service_name}" lay-skin="primary">
|
||||
{/foreach}
|
||||
</div>
|
||||
</div>
|
||||
{/notempty}
|
||||
|
||||
<div class="layui-form-item goods-category-wrap">
|
||||
<label class="layui-form-label"><span class="required">*</span>项目分类:</label>
|
||||
<div class="layui-input-block" id="category_select_box">
|
||||
</div>
|
||||
<input type="hidden" lay-verify="category_id"/>
|
||||
<div class="word-aux">项目可以属于多个分类,最多10个</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item goods_state">
|
||||
<label class="layui-form-label"><span class="required">*</span>是否上架:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="radio" name="goods_state" value="1" title="立刻上架" checked lay-filter="goods_state">
|
||||
<input type="radio" name="goods_state" value="0" title="放入仓库" lay-filter="goods_state">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">定时下架:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="radio" name="timer_off_status" value="1" title="启用" lay-filter="timer_off">
|
||||
<input type="radio" name="timer_off_status" value="2" title="不启用" lay-filter="timer_off" checked>
|
||||
</div>
|
||||
<div class="word-aux">启用定时下架后,到达设定时间,此项目将自动下架。</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="layui-form-item timer_off" style="display: none;">
|
||||
<label class="layui-form-label"></label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" id="timer_off" name="timer_off" class="layui-input len-mid" autocomplete="off" readonly>
|
||||
<i class=" iconrili iconfont calendar"></i>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">是否需要预约:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="radio" name="is_reserve" value="1" title="是" >
|
||||
<input type="radio" name="is_reserve" value="0" title="否"checked>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">服务模式:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="radio" name="service_mode" value="onsite" title="上门服务" lay-filter="service_mode">
|
||||
<input type="radio" name="service_mode" value="in_store" title="到店服务" lay-filter="service_mode" checked>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item onsite-price" style="display: none">
|
||||
<label class="layui-form-label">费用形式:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="radio" name="service_price_way" value="reserve_price" title="预约定金">
|
||||
<input type="radio" name="service_price_way" value="fixed_price" title="一口价格" checked>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label"><span class="required">*</span>销售价:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="price" placeholder="0.00" lay-verify="service_price" class="layui-input len-short" autocomplete="off">
|
||||
<div class="layui-form-mid">元</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{if addon_is_exit('cashier') == 1}
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">销售渠道:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="radio" name="sale_channel" value="all" title="线上线下销售" checked>
|
||||
<input type="radio" name="sale_channel" value="online" title="线上销售">
|
||||
<input type="radio" name="sale_channel" value="offline" title="线下销售">
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
{if $store_is_exit}
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">适用门店:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="radio" name="sale_store" value="all" title="全部门店" checked lay-filter="sale_store">
|
||||
<input type="radio" name="sale_store" value="" title="部分门店" lay-filter="sale_store">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item sale-store-select" style="display: none" lay-verify="sale_store">
|
||||
<label class="layui-form-label"></label>
|
||||
<div class="layui-input-block">
|
||||
<button class="layui-btn select-store">选择门店</button>
|
||||
<div style="width: 700px">
|
||||
<table class="layui-table" lay-skin="nob">
|
||||
<colgroup>
|
||||
<col width="30%">
|
||||
<col width="60%">
|
||||
<col width="10%">
|
||||
</colgroup>
|
||||
<tr>
|
||||
<th>门店名称</th>
|
||||
<th>门店地址</th>
|
||||
<th>操作</th>
|
||||
</tr>
|
||||
<tbody class="sale-store"></tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="need-verify">
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">项目有效期:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="radio" name="verify_validity_type" value="0" title="永久" checked lay-filter="verify_validity_type">
|
||||
<input type="radio" name="verify_validity_type" value="1" title="购买后几日有效" lay-filter="verify_validity_type">
|
||||
<input type="radio" name="verify_validity_type" value="2" title="指定过期日期" lay-filter="verify_validity_type">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item validity-type validity-type-1 layui-hide">
|
||||
<label class="layui-form-label"><span class="required">*</span>有效期:</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="virtual_indate" placeholder="0" class="layui-input len-short" lay-verify="virtual_indate" autocomplete="off">
|
||||
</div>
|
||||
<div class="layui-form-mid layui-word-aux">天</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item validity-type validity-type-2 layui-hide">
|
||||
<label class="layui-form-label"><span class="required">*</span>有效期:</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" id="virtual_time" name="virtual_time" class="layui-input len-mid" lay-verify="virtual_time" autocomplete="off" readonly>
|
||||
<i class=" iconrili iconfont calendar"></i>
|
||||
</div>
|
||||
<div class="word-aux" style="clear:both;top: 5px;position: relative;">无论何时购买此项目,到达指定时间后都将过期,无法核销。</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">是否统一售价:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="radio" name="is_unify_price" value="1" title="是" checked >
|
||||
<input type="radio" name="is_unify_price" value="0" title="否" >
|
||||
</div>
|
||||
<div class="word-aux">价格设置之后门店不能修改价格,门店按照平台设置的价格售卖</div>
|
||||
</div>
|
||||
|
||||
{/if}
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<!-- 价格库存 -->
|
||||
<div class="layui-tab-item">
|
||||
<div class="layui-form-item layui-hide">
|
||||
<label class="layui-form-label">启用多规格:</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="checkbox" value="1" lay-skin="switch" name="spec_type" lay-filter="spec_type" lay-verify="spec_type">
|
||||
<input type="hidden" id="spec_type_status" value="0">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 单规格 -->
|
||||
<div class="js-single-spec">
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">划线价:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="market_price" placeholder="0.00" lay-verify="market_price" class="layui-input len-short" autocomplete="off">
|
||||
<div class="layui-form-mid">元</div>
|
||||
</div>
|
||||
<div class="word-aux">项目没有优惠活动显示的划线价格,如果项目有折扣等优惠活动划线价显示销售价</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">成本价:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="cost_price" placeholder="0.00" class="layui-input len-short" lay-verify="cost_price" autocomplete="off">
|
||||
<div class="layui-form-mid">元</div>
|
||||
</div>
|
||||
<div class="word-aux">成本价将不会对前台会员展示,用于商家统计使用</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">项目编码:</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="sku_no" placeholder="请输入项目编码" maxlength="50" class="layui-input len-long" autocomplete="off">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<!-- 多规格 -->
|
||||
<div class="js-more-spec">
|
||||
|
||||
<!--规格项/规格值-->
|
||||
<div class="spec-edit-list"></div>
|
||||
|
||||
<div class="layui-form-item js-add-spec">
|
||||
<label class="layui-form-label"></label>
|
||||
<div class="layui-input-inline">
|
||||
<button class="layui-btn" type="button">添加规格</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item batch-operation-sku">
|
||||
<label class="layui-form-label">批量操作:</label>
|
||||
<div class="layui-input-inline">
|
||||
<span class="text-color" data-field="spec_name">副标题</span>
|
||||
<span class="text-color" data-field="price" data-verify="price">销售价</span>
|
||||
<span class="text-color" data-field="market_price" data-verify="market_price">划线价</span>
|
||||
<span class="text-color" data-field="cost_price" data-verify="cost_price">成本价</span>
|
||||
<span class="text-color" data-field="stock" data-verify="stock">库存</span>
|
||||
<span class="text-color" data-field="stock_alarm" data-verify="stock_alarm">库存预警</span>
|
||||
<span class="text-color" data-field="sku_no" data-verify="">项目编码</span>
|
||||
<input type="text" class="layui-input len-short" name="batch_operation_sku" autocomplete="off" />
|
||||
<button class="layui-btn confirm" type="button">确定</button>
|
||||
<button class="layui-btn layui-btn-primary cancel" type="button">取消</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!--sku列表-->
|
||||
<div class="layui-form-item sku-table">
|
||||
<label class="layui-form-label"></label>
|
||||
<div class="layui-input-block"></div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item js-goods-stock-wrap">
|
||||
<label class="layui-form-label"><span class="required">*</span>库存:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="number" name="goods_stock" placeholder="0" lay-verify="goods_stock" class="layui-input len-short" autocomplete="off">
|
||||
<div class="layui-form-mid">件</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item js-goods-stock-wrap">
|
||||
<label class="layui-form-label">库存预警:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="number" name="goods_stock_alarm" placeholder="0" lay-verify="goods_stock_alarm" class="layui-input len-short" autocomplete="off">
|
||||
<div class="layui-form-mid">件</div>
|
||||
</div>
|
||||
<div class="word-aux">项目库存少于预警数量,项目列表库存数量标红显示,0为不预警。</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item js-goods-stock-wrap">
|
||||
<label class="layui-form-label">服务时长:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="number" name="service_length" placeholder="0" lay-verify="service_length" class="layui-input len-short" autocomplete="off">
|
||||
<div class="layui-form-mid">分钟</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item ">
|
||||
<label class="layui-form-label">虚拟销量:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="number" name="virtual_sale" placeholder="0" lay-verify="virtual_sale" class="layui-input len-short" autocomplete="off">
|
||||
<div class="layui-form-mid">件</div>
|
||||
</div>
|
||||
<div class="word-aux">该设置不计入项目统计数据</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item is_limit">
|
||||
<label class="layui-form-label">是否限购:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="radio" name="is_limit" value="0" title="否" lay-filter="is_limit" checked>
|
||||
<input type="radio" name="is_limit" value="1" title="是" lay-filter="is_limit">
|
||||
</div>
|
||||
<div class="word-aux">启用限购后,购买项目时,会对该项目购买量做限制判断。</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">起售:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="number" name="min_buy" placeholder="" lay-verify="min_buy" class="layui-input len-short" autocomplete="off">
|
||||
<div class="layui-form-mid">件</div>
|
||||
</div>
|
||||
<div class="word-aux">起售数量超出项目库存时,买家无法购买该项目</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">会员等级折扣:</label>
|
||||
<div class="layui-input-block">
|
||||
<div class="layui-input-inline">
|
||||
<input type="radio" name="is_consume_discount" value="1" title="参与" checked>
|
||||
<input type="radio" name="is_consume_discount" value="0" title="不参与">
|
||||
</div>
|
||||
</div>
|
||||
<div class="word-aux">按照默认会员等级折扣优惠</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 项目详情 -->
|
||||
<div class="layui-tab-item">
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label sm"></label>
|
||||
<div class="layui-input-inline special-length">
|
||||
<script id="editor" type="text/plain" style="width:100%;height:500px;"></script>
|
||||
</div>
|
||||
</div>
|
||||
<script type="text/javascript" charset="utf-8" src="__STATIC__/ext/ueditor/ueditor.config.js"></script>
|
||||
<script type="text/javascript" charset="utf-8" src="__STATIC__/ext/ueditor/ueditor.all.js"> </script>
|
||||
<script type="text/javascript" charset="utf-8" src="__STATIC__/ext/ueditor/lang/zh-cn/zh-cn.js"></script>
|
||||
</div>
|
||||
|
||||
<div class="layui-tab-item layui-card card-common card-brief head">
|
||||
<div class="layui-card-header">
|
||||
<span class="card-title">高级设置</span>
|
||||
</div>
|
||||
|
||||
<div class="layui-card-body">
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">排序:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="number" name="sort" class="layui-input len-short" value="{$sort_config['default_value']}" placeholder="0" autocomplete="off">
|
||||
</div>
|
||||
<div class="word-aux">项目默认排序号为0,数字越大,排序越靠前,数字重复,则最新添加的靠前。</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">项目详情显示库存:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="radio" name="stock_show" value="1" title="显示" checked >
|
||||
<input type="radio" name="stock_show" value="0" title="隐藏" >
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">划线价显示:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="radio" name="market_price_show" value="1" title="显示" checked>
|
||||
<input type="radio" name="market_price_show" value="0" title="隐藏" >
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">项目详情显示弹幕:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="radio" name="barrage_show" value="1" title="显示" checked>
|
||||
<input type="radio" name="barrage_show" value="0" title="隐藏" >
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">项目详情显示销量:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="radio" name="sale_show" value="1" title="显示" checked>
|
||||
<input type="radio" name="sale_show" value="0" title="隐藏" >
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">项目海报:</label>
|
||||
<div class="layui-input-inline">
|
||||
<select name="template_id" lay-search="" lay-verify="">
|
||||
<option value="">请选择项目海报</option>
|
||||
{foreach name="$poster_list" item="vo"}
|
||||
<option value="{$vo['template_id']}">{$vo['poster_name']}</option>
|
||||
{/foreach}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{if $form_is_exit}
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">项目表单:</label>
|
||||
<div class="layui-input-block len-mid">
|
||||
<select name="form_id">
|
||||
<option value="0">请选择项目表单</option>
|
||||
{foreach name="$form_list" item="vo"}
|
||||
<option value="{$vo.id}">{$vo.form_name}</option>
|
||||
{/foreach}
|
||||
</select>
|
||||
</div>
|
||||
<div class="word-aux">
|
||||
<a href="{:href_url('form://shop/form/addform?form_type=goods')}" class="text-color" target="_blank">创建项目表单</a>
|
||||
<a href="javascript:;" onclick="refreshFormList()" class="text-color">刷新</a>
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="fixed-btn">
|
||||
<button class="layui-btn layui-btn-primary border-color text-color js-prev" lay-filter="prev">上一步</button>
|
||||
<button class="layui-btn js-save" lay-submit="" lay-filter="save">保存</button>
|
||||
<button class="layui-btn layui-btn-primary border-color text-color js-next" lay-submit="" lay-filter="next">下一步</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!--规格项模板-->
|
||||
<script type="text/html" id="specTemplate">
|
||||
|
||||
{{# for(var i=0;i<d.list.length;i++){ }}
|
||||
<div class="spec-item" data-index="{{i}}">
|
||||
<div class="layui-form-item spec">
|
||||
<label class="layui-form-label">规格项{{i+1}}:</label>
|
||||
<div class="layui-input-inline">
|
||||
<select name="spec_item">
|
||||
<option value="0"></option>
|
||||
{{# if(d.list[i].spec_name != ''){ }}
|
||||
<option value="{{d.list[i].spec_id}}" data-attr-name="{{d.list[i].spec_name}}" selected>{{d.list[i].spec_name}}</option>
|
||||
{{# }else{ }}
|
||||
{{# } }}
|
||||
</select>
|
||||
<i class="layui-icon layui-icon-close" data-index="{{i}}"></i>
|
||||
</div>
|
||||
|
||||
{{# if(i==0){ }}
|
||||
<div class="layui-input-inline">
|
||||
{{# if(d.add_spec_img){ }}
|
||||
<input type="checkbox" name="add_spec_img" title="添加规格图片" lay-skin="primary" lay-filter="add_spec_img" checked>
|
||||
{{# }else{ }}
|
||||
<input type="checkbox" name="add_spec_img" title="添加规格图片" lay-skin="primary" lay-filter="add_spec_img">
|
||||
{{# } }}
|
||||
</div>
|
||||
{{# } }}
|
||||
</div>
|
||||
|
||||
{{# if(d.list[i].spec_name != ''){ }}
|
||||
<div class="layui-form-item spec-value">
|
||||
{{# }else{ }}
|
||||
<div class="layui-form-item spec-value" style="display:none;">
|
||||
{{# } }}
|
||||
<label class="layui-form-label"></label>
|
||||
<div class="layui-input-block spec-value">
|
||||
{{# if(d.list[i].value.length){ }}
|
||||
<ul>
|
||||
{{# for(var j=0;j<d.list[i].value.length;j++){ }}
|
||||
<li data-index="{{j}}" data-parent-index="{{i}}" >
|
||||
{{# if(i==0 && d.add_spec_img){ }}
|
||||
<div class="img-wrap">
|
||||
{{# if(d.list[i].value[j].image){ }}
|
||||
<img src="{{ns.img(d.list[i].value[j].image)}}" alt="">
|
||||
{{# }else{ }}
|
||||
<img src="SHOP_IMG/goods_spec_value_empty.png" alt="">
|
||||
{{# } }}
|
||||
</div>
|
||||
{{# } }}
|
||||
<span title="双击可编辑规格值" ondblclick="$(this).attr('contenteditable',true);$(this).focus()" class="spec-txt" data-spec_value_name="{{d.list[i].value[j].spec_value_name}}" data-parent-index="{{i}}" data-index="{{j}}">{{d.list[i].value[j].spec_value_name}}</span>
|
||||
<i class="layui-icon layui-icon-close" data-parent-index="{{i}}" data-index="{{j}}"></i>
|
||||
</li>
|
||||
{{# } }}
|
||||
</ul>
|
||||
{{# } }}
|
||||
|
||||
<a class="text-color" href="javascript:;" data-index="{{i}}">+添加规格值</a>
|
||||
|
||||
<div class="add-spec-value-popup" data-index="{{i}}">
|
||||
<select name="spec_value_item"></select>
|
||||
<button class="layui-btn layui-btn-primary border-color text-color js-cancel-spec-value">取消</button>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
{{# } }}
|
||||
</script>
|
||||
|
||||
<!--SKU列表模板-->
|
||||
<script type="text/html" id="skuTableTemplate">
|
||||
|
||||
{{# if(d.skuList.length){ }}
|
||||
<table class="layui-table">
|
||||
<colgroup></colgroup>
|
||||
<thead>
|
||||
<tr>
|
||||
{{# if(d.showSpecName){ }}
|
||||
<th colspan="{{d.colSpan}}" style="min-width: 60px;">项目规格</th>
|
||||
{{# } }}
|
||||
<th rowspan="{{d.rowSpan}}">SKU图片</th>
|
||||
<th rowspan="{{d.rowSpan}}">副标题</th>
|
||||
<th rowspan="{{d.rowSpan}}"><span class="required">*</span>销售价</th>
|
||||
<th rowspan="{{d.rowSpan}}">划线价</th>
|
||||
<th rowspan="{{d.rowSpan}}">成本价</th>
|
||||
<th rowspan="{{d.rowSpan}}"><span class="required">*</span>库存</th>
|
||||
<th rowspan="{{d.rowSpan}}">库存预警</th>
|
||||
<th rowspan="{{d.rowSpan}}">服务时长</th>
|
||||
<th rowspan="{{d.rowSpan}}">商品编码(多个编码以英文逗号分割)</th>
|
||||
<th rowspan="{{d.rowSpan}}" style="white-space: nowrap;">默认展示</th>
|
||||
</tr>
|
||||
{{# if(d.colSpan>1){ }}
|
||||
<tr>
|
||||
{{# for(var i=0;i<d.specList.length;i++){ }}
|
||||
{{# if(d.specList[i].spec_name && d.specList[i].value.length> 0){ }}
|
||||
<th>{{d.specList[i].spec_name}}</th>
|
||||
{{# } }}
|
||||
{{# } }}
|
||||
</tr>
|
||||
{{# } }}
|
||||
</thead>
|
||||
<tbody>
|
||||
{{# for(var i=0;i<d.skuList.length;i++){ }}
|
||||
<tr>
|
||||
<td class="sku_imgs" id="sku_img_{{i}}" style="width: 130px;">
|
||||
{{# for(var j=0;j<d.skuList[i].sku_images_arr.length;j++){ }}
|
||||
<div class="img-wrap" data-index="{{j}}" data-parent-index="{{i}}">
|
||||
<a href="javascript:void(0)">
|
||||
<img src="{{ns.img(d.skuList[i].sku_images_arr[j])}}" layer-src />
|
||||
</a>
|
||||
<div class="operation">
|
||||
<i title="图片预览" class="iconfont iconreview js-preview"></i>
|
||||
<i title="删除图片" class="layui-icon layui-icon-delete js-delete"></i>
|
||||
</div>
|
||||
</div>
|
||||
{{# } }}
|
||||
{{# if(d.skuList[i].sku_images_arr.length<d.goods_sku_max){ }}
|
||||
<div class="upload-sku-img" data-index="{{i}}"><i class="layui-icon layui-icon-add-1"></i></div>
|
||||
{{# } }}
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" name="spec_name" placeholder="副标题" maxlength="100" value="{{d.skuList[i].spec_name}}" class="layui-input" autocomplete="off" data-index="{{i}}">
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" name="price" placeholder="销售价" lay-verify="sku_price" value="{{d.skuList[i].price}}" class="layui-input" autocomplete="off" data-index="{{i}}">
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" name="market_price" placeholder="划线价" value="{{d.skuList[i].market_price}}" lay-verify="sku_market_price" class="layui-input" autocomplete="off" data-index="{{i}}">
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" name="cost_price" placeholder="成本价" value="{{d.skuList[i].cost_price}}" lay-verify="sku_cost_price" class="layui-input" autocomplete="off" data-index="{{i}}">
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" name="stock" placeholder="库存" value="{{d.skuList[i].stock}}" lay-verify="sku_stock" class="layui-input" autocomplete="off" data-index="{{i}}">
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" name="stock_alarm" placeholder="库存预警" value="{{d.skuList[i].stock_alarm}}" lay-verify="sku_stock_alarm" class="layui-input" autocomplete="off" data-index="{{i}}">
|
||||
</td>
|
||||
<td>
|
||||
<input type="number" name="service_length" placeholder="服务时长" value="{{d.skuList[i].service_length}}" maxlength="50" class="layui-input" autocomplete="off" data-index="{{i}}" lay-verify="service_length">
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" name="sku_no" placeholder="商品编码" value="{{d.skuList[i].sku_no}}" maxlength="50" class="layui-input" autocomplete="off" data-index="{{i}}">
|
||||
</td>
|
||||
<td style="min-width: 40px;">
|
||||
{{# if(d.skuList[i].is_default == 1) { }}
|
||||
<input type="checkbox" data-index="{{i}}" name="is_default" lay-filter="is_default" lay-skin="switch" checked>
|
||||
{{# }else { }}
|
||||
<input type="checkbox" data-index="{{i}}" name="is_default" lay-filter="is_default" lay-skin="switch">
|
||||
{{# } }}
|
||||
</td>
|
||||
</tr>
|
||||
{{# } }}
|
||||
|
||||
</tbody>
|
||||
</table>
|
||||
{{# } }}
|
||||
<div class="word-aux text-color" style="margin: 10px 0 0 0;">默认展示,是多规格项目在客户访问项目时,默认显示的项目规格</div>
|
||||
</script>
|
||||
|
||||
<!--项目主图列表-->
|
||||
<script type="text/html" id="goodsImage">
|
||||
{{# if(d.list.length){ }}
|
||||
{{# for(var i=0;i<d.list.length;i++){ }}
|
||||
<div class="item upload_img_square_item" data-index="{{i}}">
|
||||
<div class="img-wrap">
|
||||
<img src="{{ns.img(d.list[i],'small')}}" layer-src="{{ns.img(d.list[i],'big')}}">
|
||||
</div>
|
||||
<div class="operation">
|
||||
<i title="图片预览" class="iconfont iconreview js-preview"></i>
|
||||
<i title="删除图片" class="layui-icon layui-icon-delete js-delete" data-index="{{i}}"></i>
|
||||
<div class="replace_img" data-index="{{i}}">点击替换</div>
|
||||
</div>
|
||||
</div>
|
||||
{{# } }}
|
||||
{{# if(d.list.length < d.max){ }}
|
||||
<div class="item js-add-goods-image upload_img_square">+</div>
|
||||
{{# } }}
|
||||
{{# }else{ }}
|
||||
<div class="item js-add-goods-image upload_img_square">+</div>
|
||||
{{# } }}
|
||||
</script>
|
||||
|
||||
<script src="__STATIC__/ext/drag-arrange.js"></script>
|
||||
<script src="__STATIC__/ext/video/videojs-ie8.min.js"></script>
|
||||
<script src="__STATIC__/ext/video/video.min.js"></script>
|
||||
<script src="__STATIC__/ext/searchable_select/searchable_select.js"></script>
|
||||
<script src="SHOP_JS/category_select.js?time=20240821"></script>
|
||||
<script src="SHOP_JS/goods_edit_common.js?time=20250527"></script>
|
||||
<script src="ADDON_CARDSERVICE_JS/service_goods_edit.js?v=1.1"></script>
|
||||
773
addon/cardservice/shop/view/service/edit_goods.html
Executable file
773
addon/cardservice/shop/view/service/edit_goods.html
Executable file
@@ -0,0 +1,773 @@
|
||||
<link rel="stylesheet" href="__STATIC__/ext/video/video.css">
|
||||
<link rel="stylesheet" type="text/css" href="__STATIC__/ext/searchable_select/searchable_select.css" />
|
||||
<link rel="stylesheet" type="text/css" href="__STATIC__/ext/layui/extend/cascader/cascader.css"/>
|
||||
<link rel="stylesheet" type="text/css" href="SHOP_CSS/goods_edit.css?time=20250527" />
|
||||
|
||||
<div class="layui-form">
|
||||
<div class="layui-tab layui-tab-brief" lay-filter="goods_tab">
|
||||
<ul class="layui-tab-title">
|
||||
<li class="layu1i-this" lay-id="basic">基础设置</li>
|
||||
<li lay-id="price-stock">价格库存</li>
|
||||
<li lay-id="detail">项目详情</li>
|
||||
<li lay-id="senior">高级设置</li>
|
||||
</ul>
|
||||
<div class="layui-tab-content">
|
||||
<!-- 基础设置 -->
|
||||
<div class="layui-tab-item layui-show">
|
||||
<div class="layui-card card-common card-brief head">
|
||||
<div class="layui-card-header">
|
||||
<span class="card-title">基础信息</span>
|
||||
</div>
|
||||
|
||||
<div class="layui-card-body">
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label"><span class="required">*</span>项目名称:</label>
|
||||
<div class="layui-input-inline">
|
||||
<input name="goods_name" type="text" value="{$goods_info['goods_name']}" placeholder="请输入项目名称,不能超过60个字符" maxlength="60" autocomplete="off" lay-verify="goods_name" class="layui-input len-long">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">促销语:</label>
|
||||
<div class="layui-input-inline">
|
||||
<textarea class="layui-textarea len-long" name="introduction" maxlength="100" lay-verify="introduction" placeholder="请输入促销语,不能超过100个字符">{$goods_info['introduction']}</textarea>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">关键词:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="keywords" value="{$goods_info['keywords']}" placeholder="项目关键词用于SEO搜索,不能超过100个字符" maxlength="100" autocomplete="off" class="layui-input len-long">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item goods-image-wrap">
|
||||
<label class="layui-form-label"><span class="required">*</span>项目主图:</label>
|
||||
<div class="layui-input-block">
|
||||
<!--项目主图项-->
|
||||
<div class="js-goods-image"></div>
|
||||
</div>
|
||||
<div class="word-aux">第一张图片将作为项目主图,支持同时上传多张图片,多张图片之间可随意调整位置;</div>
|
||||
<div class="word-aux">支持jpg、gif、png格式上传或从图片空间中选择,建议使用尺寸800x800像素以上、大小不超过1M的正方形图片;</div>
|
||||
<div class="word-aux">上传后的图片将会自动保存在图片空间的默认分类中,最多上传10张(至少1张)</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">项目视频:</label>
|
||||
<div class="layui-input-block">
|
||||
<div class="video-thumb">
|
||||
<video id="goods_video" class="video-js vjs-big-play-centered" controls="" poster="SHOP_IMG/goods_video_preview.png" preload="auto"></video>
|
||||
</div>
|
||||
<div id="videoUpload2" class="up-video " title="项目视频" >
|
||||
<span class="delete-video hide" onclick="deleteVideo()"><img class="del-img" src="SHOP_IMG/delete.png">删除</span>
|
||||
<span class=" replace-video hide js-add-goods-video" ><img class="up-img" src="SHOP_IMG/upload.png">上传视频</span>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label"></label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="video_url" placeholder="在此输入外链视频地址" value="{$goods_info['video_url']}" autocomplete="off" class="layui-input len-long">
|
||||
</div>
|
||||
<div class="file-title word-aux">
|
||||
<div>注意事项:</div>
|
||||
<ul>
|
||||
<li>1、检查upload文件夹是否有读写权限。</li>
|
||||
<li>2、PHP默认上传限制为2MB,需要在php.ini配置文件中修改“post_max_size”和“upload_max_filesize”的大小。</li>
|
||||
<li>3、视频支持手动输入外链视频地址或者上传本地视频文件</li>
|
||||
<li>4、必须上传.mp4视频格式</li>
|
||||
<li>5、视频文件大小不能超过500MB</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{notempty name="$service_list"}
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">项目服务:</label>
|
||||
<div class="layui-input-block">
|
||||
{foreach name="$service_list" item="vo"}
|
||||
<input type="checkbox" name="goods_service_ids" value="{$vo.id}" title="{$vo.service_name}" lay-skin="primary" {if strpos($goods_info['goods_service_ids'],(string)$vo['id'])>-1}checked{/if}>
|
||||
{/foreach}
|
||||
</div>
|
||||
</div>
|
||||
{/notempty}
|
||||
|
||||
<div class="layui-form-item goods-category-wrap">
|
||||
<label class="layui-form-label"><span class="required">*</span>项目分类:</label>
|
||||
<div class="layui-input-block" id="category_select_box">
|
||||
</div>
|
||||
<input type="hidden" lay-verify="category_id"/>
|
||||
<input type="hidden" id="category_data" value='{:json_encode($goods_info.goods_category_data)}'>
|
||||
<div class="word-aux">项目可以属于多个分类,最多10个</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item goods_state">
|
||||
<label class="layui-form-label"><span class="required">*</span>是否上架:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="radio" name="goods_state" value="1" title="立刻上架" lay-filter="goods_state" {if $goods_info['goods_state'] == 1 }checked{/if}>
|
||||
<input type="radio" name="goods_state" value="0" title="放入仓库" lay-filter="goods_state" {if $goods_info['goods_state'] == 0 }checked{/if}>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{if $goods_info['goods_state'] == 0}
|
||||
<div class="layui-form-item timer_on">
|
||||
<label class="layui-form-label">定时上架:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="radio" name="timer_on_status" class="timer_on_status_true" value="1" title="启用" lay-filter="timer_on" {if $goods_info['timer_on'] > 0} checked {/if}>
|
||||
<input type="radio" name="timer_on_status" value="2" title="不启用" lay-filter="timer_on" {if $goods_info['timer_on'] == 0} checked {/if}>
|
||||
</div>
|
||||
<div class="word-aux">启用定时上架后,到达设定时间,此项目将自动上架。</div>
|
||||
</div>
|
||||
{if $goods_info['timer_on'] > 0}
|
||||
<div class="layui-form-item timer_on_time">
|
||||
<label class="layui-form-label"></label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" id="timer_on" name="timer_on" value="{:date('Y-m-d H:i:s',$goods_info['timer_on'])}" lay-verify="required" class="layui-input len-mid" autocomplete="off" readonly>
|
||||
<i class=" iconrili iconfont calendar"></i>
|
||||
</div>
|
||||
</div>
|
||||
{else/}
|
||||
<div class="layui-form-item timer_on_time layui-hide">
|
||||
<label class="layui-form-label"></label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" id="timer_on" name="timer_on" lay-verify="" class="layui-input len-mid" autocomplete="off" readonly>
|
||||
<i class=" iconrili iconfont calendar"></i>
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
{/if}
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">定时下架:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="radio" name="timer_off_status" value="1" title="启用" lay-filter="timer_off" {if $goods_info['timer_off'] > 0} checked {/if}>
|
||||
<input type="radio" name="timer_off_status" value="2" title="不启用" lay-filter="timer_off" {if $goods_info['timer_off'] == 0} checked {/if}>
|
||||
</div>
|
||||
<div class="word-aux">启用定时下架后,到达设定时间,此项目将自动下架。</div>
|
||||
</div>
|
||||
{if $goods_info['timer_off'] > 0}
|
||||
<div class="layui-form-item timer_off">
|
||||
<label class="layui-form-label"></label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" id="timer_off" name="timer_off" value="{:date('Y-m-d H:i:s',$goods_info['timer_off'])}" lay-verify="required" class="layui-input len-mid" autocomplete="off" readonly>
|
||||
<i class=" iconrili iconfont calendar"></i>
|
||||
</div>
|
||||
</div>
|
||||
{else/}
|
||||
<div class="layui-form-item timer_off" style="display:none">
|
||||
<label class="layui-form-label"></label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" id="timer_off" name="timer_off" lay-verify="" class="layui-input len-mid" autocomplete="off" readonly>
|
||||
<i class=" iconrili iconfont calendar"></i>
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">是否需要预约:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="radio" name="is_reserve" value="1" title="是" {if $goods_info['is_reserve'] == 1 }checked{/if}>
|
||||
<input type="radio" name="is_reserve" value="0" title="否" {if $goods_info['is_reserve'] == 0 }checked{/if}>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">服务模式:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="radio" name="service_mode" value="onsite" title="上门服务" lay-filter="service_mode" {if $goods_info['service_mode'] == 'onsite' }checked{/if}>
|
||||
<input type="radio" name="service_mode" value="in_store" title="到店服务" lay-filter="service_mode" {if $goods_info['service_mode'] == 'in_store' }checked{/if}>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item onsite-price" {if $goods_info['service_mode'] == 'in_store' }style="display: none"{/if}>
|
||||
<label class="layui-form-label">费用形式:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="radio" name="service_price_way" value="reserve_price" title="预约定金" {if $goods_info['service_price_way'] == 'reserve_price' }checked{/if}>
|
||||
<input type="radio" name="service_price_way" value="fixed_price" title="一口价格" {if $goods_info['service_price_way'] == 'fixed_price' }checked{/if}>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label"><span class="required">*</span>销售价:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="price" value="{$goods_info['price']}" placeholder="0.00" lay-verify="service_price" class="layui-input len-short" autocomplete="off">
|
||||
<div class="layui-form-mid">元</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
{if addon_is_exit('cashier') == 1}
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">销售渠道:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="radio" name="sale_channel" value="all" title="线上线下销售" {if $goods_info.sale_channel eq 'all'}checked{/if}>
|
||||
<input type="radio" name="sale_channel" value="online" title="线上销售" {if $goods_info.sale_channel eq 'online'}checked{/if}>
|
||||
<input type="radio" name="sale_channel" value="offline" title="线下销售" {if $goods_info.sale_channel eq 'offline'}checked{/if}>
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
{if $store_is_exit}
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">适用门店:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="radio" name="sale_store" value="all" title="全部门店" {if $goods_info.sale_store eq 'all'}checked{/if} lay-filter="sale_store">
|
||||
<input type="radio" name="sale_store" value="" title="部分门店" {if $goods_info.sale_store neq 'all'}checked{/if} lay-filter="sale_store">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item sale-store-select" {if $goods_info.sale_store eq 'all'}style="display: none"{/if} lay-verify="sale_store">
|
||||
<label class="layui-form-label"></label>
|
||||
<div class="layui-input-block">
|
||||
<button class="layui-btn select-store">选择门店</button>
|
||||
<div style="width: 700px">
|
||||
<table class="layui-table" lay-skin="nob">
|
||||
<colgroup>
|
||||
<col width="30%">
|
||||
<col width="60%">
|
||||
<col width="10%">
|
||||
</colgroup>
|
||||
<tr>
|
||||
<th>门店名称</th>
|
||||
<th>门店地址</th>
|
||||
<th>操作</th>
|
||||
</tr>
|
||||
<tbody class="sale-store">
|
||||
{if isset($store_list) && !empty($store_list)}
|
||||
{foreach name="$store_list" item="vo"}
|
||||
<tr data-store="{$vo.store_id}">
|
||||
<td>{$vo.store_name}</td>
|
||||
<td>{$vo.full_address}{$vo.address}</td>
|
||||
<td><a href="javascript:;" class="del">删除</a></td>
|
||||
</tr>
|
||||
{/foreach}
|
||||
{/if}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="need-verify">
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">核销有效期:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="radio" name="verify_validity_type" value="0" title="永久" lay-filter="verify_validity_type" {if $goods_info['verify_validity_type'] eq 0}checked{/if}>
|
||||
<input type="radio" name="verify_validity_type" value="1" title="购买后几日有效" lay-filter="verify_validity_type" {if $goods_info['verify_validity_type'] eq 1}checked{/if}>
|
||||
<input type="radio" name="verify_validity_type" value="2" title="指定过期日期" lay-filter="verify_validity_type" {if $goods_info['verify_validity_type'] eq 2}checked{/if}>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item validity-type validity-type-1 {if $goods_info['verify_validity_type'] neq 1}layui-hide{/if}">
|
||||
<label class="layui-form-label"><span class="required">*</span>有效期:</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="virtual_indate" placeholder="0" class="layui-input len-short" lay-verify="virtual_indate" autocomplete="off" {if $goods_info['verify_validity_type'] eq 1}value="{$goods_info['virtual_indate']}"{/if}>
|
||||
</div>
|
||||
<div class="layui-form-mid layui-word-aux">天</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item validity-type validity-type-2 {if $goods_info['verify_validity_type'] neq 2}layui-hide{/if}">
|
||||
<label class="layui-form-label"><span class="required">*</span>有效期:</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" id="virtual_time" name="virtual_time" class="layui-input len-mid" lay-verify="virtual_time" autocomplete="off" readonly {if $goods_info['verify_validity_type'] eq 2}value="{:time_to_date($goods_info['virtual_indate'])}"{/if}>
|
||||
<i class=" iconrili iconfont calendar"></i>
|
||||
</div>
|
||||
<div class="word-aux" style="clear:both;top: 5px;position: relative;">无论何时购买此商品,到达指定时间后都将过期,无法核销。</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">是否统一售价:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="radio" name="is_unify_price" value="1" title="是" {if $goods_info.is_unify_price eq '1'}checked{/if} >
|
||||
<input type="radio" name="is_unify_price" value="0" title="否" {if $goods_info.is_unify_price eq '0'}checked{/if}>
|
||||
</div>
|
||||
<div class="word-aux">价格设置之后门店不能修改价格,门店按照平台设置的价格售卖</div>
|
||||
</div>
|
||||
|
||||
{/if}
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
<!-- 价格库存 -->
|
||||
<div class="layui-tab-item">
|
||||
<div class="layui-form-item layui-hide">
|
||||
<label class="layui-form-label">启用多规格:</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="checkbox" value="1" lay-skin="switch" name="spec_type" lay-filter="spec_type" lay-verify="spec_type" {notempty name="$goods_info['goods_spec_format']" }checked{/notempty}>
|
||||
<input type="hidden" id="spec_type_status" {if empty($goods_info['goods_spec_format'])} value="0" {else/} value="1" {/if}>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 单规格 -->
|
||||
<div class="js-single-spec" {notempty name="$goods_info['goods_spec_format']" }style="display:none;"{/notempty}>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">划线价:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="market_price" value="{$goods_info['market_price']}" placeholder="0.00" lay-verify="market_price" class="layui-input len-short" autocomplete="off">
|
||||
<div class="layui-form-mid">元</div>
|
||||
</div>
|
||||
<div class="word-aux">项目没有优惠活动显示的划线价格,如果项目有折扣等优惠活动划线价显示销售价</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">成本价:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="cost_price" value="{$goods_info['cost_price']}" placeholder="0.00" class="layui-input len-short" lay-verify="cost_price" autocomplete="off">
|
||||
<div class="layui-form-mid">元</div>
|
||||
</div>
|
||||
<div class="word-aux">成本价将不会对前台会员展示,用于商家统计使用</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">项目编码:</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="text" name="sku_no" value="{$goods_info['sku_list'][0]['sku_no']}" placeholder="请输入项目编码" maxlength="50" class="layui-input len-long" autocomplete="off">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<!-- 多规格 -->
|
||||
<div class="js-more-spec" {notempty name="$goods_info['goods_spec_format']" }style="display:block;"{/notempty}>
|
||||
|
||||
<!--规格项/规格值-->
|
||||
<div class="spec-edit-list"></div>
|
||||
|
||||
<div class="layui-form-item js-add-spec">
|
||||
<label class="layui-form-label"></label>
|
||||
<div class="layui-input-inline">
|
||||
<button class="layui-btn" type="button">添加规格</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item batch-operation-sku">
|
||||
<label class="layui-form-label">批量操作:</label>
|
||||
<div class="layui-input-inline">
|
||||
<span class="text-color" data-field="spec_name">副标题</span>
|
||||
<span class="text-color" data-field="price" data-verify="price">销售价</span>
|
||||
<span class="text-color" data-field="market_price" data-verify="market_price">划线价</span>
|
||||
<span class="text-color" data-field="cost_price" data-verify="cost_price">成本价</span>
|
||||
<span class="text-color" data-field="stock" data-verify="stock">库存</span>
|
||||
<span class="text-color" data-field="stock_alarm" data-verify="stock_alarm">库存预警</span>
|
||||
<span class="text-color" data-field="sku_no" data-verify="">项目编码</span>
|
||||
<input type="text" class="layui-input len-short" name="batch_operation_sku" autocomplete="off" />
|
||||
<button class="layui-btn confirm" type="button">确定</button>
|
||||
<button class="layui-btn layui-btn-primary cancel" type="button">取消</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!--编辑时用到的SKU列表-->
|
||||
<div class="js-edit-sku-list">
|
||||
{foreach name="$goods_info['sku_list']" item="vo" key="k"}
|
||||
<div data-index="{$k}">
|
||||
<input type="hidden" name="edit_sku_id" value="{$vo['sku_id']}" />
|
||||
<input type="hidden" name="edit_spec_name" value="{$vo['spec_name']}" />
|
||||
<input type="hidden" name="edit_sku_no" value="{$vo['sku_no']}" />
|
||||
<input type="hidden" name="edit_sku_spec_format" value="{$vo['sku_spec_format']}" />
|
||||
<input type="hidden" name="edit_price" value="{$vo['price']}" />
|
||||
<input type="hidden" name="edit_market_price" value="{$vo['market_price']}" />
|
||||
<input type="hidden" name="edit_cost_price" value="{$vo['cost_price']}" />
|
||||
<input type="hidden" name="edit_stock" value="{$vo['stock']}" />
|
||||
<input type="hidden" name="edit_stock_alarm" value="{$vo['stock_alarm']}" />
|
||||
<input type="hidden" name="edit_sku_image" value="{$vo['sku_image']}" />
|
||||
<input type="hidden" name="edit_sku_images" value="{$vo['sku_images']}" />
|
||||
<input type="hidden" name="edit_is_default" value="{$vo['is_default']}" />
|
||||
<input type="hidden" name="edit_service_length" value="{$vo['service_length']}" />
|
||||
</div>
|
||||
{/foreach}
|
||||
</div>
|
||||
|
||||
<!--sku列表-->
|
||||
<div class="layui-form-item sku-table">
|
||||
<label class="layui-form-label"></label>
|
||||
<div class="layui-input-block"></div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item js-goods-stock-wrap" {notempty name="$goods_info['goods_spec_format']" }style="display:none;"{/notempty}>
|
||||
<label class="layui-form-label"><span class="required">*</span>库存:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="number" name="goods_stock" value="{$goods_info['goods_stock']}" placeholder="0" lay-verify="goods_stock" class="layui-input len-short" autocomplete="off" {notempty name="$goods_info['goods_spec_format']" }disabled{/notempty}>
|
||||
<div class="layui-form-mid">件</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item js-goods-stock-wrap" {notempty name="$goods_info['goods_spec_format']" }style="display:none;"{/notempty}>
|
||||
<label class="layui-form-label">库存预警:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="number" name="goods_stock_alarm" value="{$goods_info['goods_stock_alarm']}" placeholder="0" lay-verify="goods_stock_alarm" class="layui-input len-short" autocomplete="off">
|
||||
<div class="layui-form-mid">件</div>
|
||||
</div>
|
||||
<div class="word-aux">项目库存少于预警数量,项目列表库存数量标红显示,0为不预警。</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item js-goods-stock-wrap">
|
||||
<label class="layui-form-label">服务时长:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="number" name="service_length" value="{$goods_info['sku_list'][0]['service_length']}" placeholder="请输入服务时长" autocomplete="off" class="layui-input len-short" lay-verify="service_length">
|
||||
<div class="layui-form-mid">分钟</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">虚拟销量:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="number" name="virtual_sale" placeholder="0" value="{$goods_info['virtual_sale']}" lay-verify="virtual_sale" class="layui-input len-short" autocomplete="off">
|
||||
<div class="layui-form-mid">件</div>
|
||||
</div>
|
||||
<div class="word-aux">该设置不计入项目统计数据</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item is_limit">
|
||||
<label class="layui-form-label">是否限购:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="radio" name="is_limit" value="0" title="否" lay-filter="is_limit" {if $goods_info['is_limit'] == 0} checked {/if}>
|
||||
<input type="radio" name="is_limit" value="1" title="是" lay-filter="is_limit" {if $goods_info['is_limit'] == 1} checked {/if}>
|
||||
</div>
|
||||
<div class="word-aux">启用限购后,购买项目时,会对该项目购买量做限制判断。</div>
|
||||
</div>
|
||||
|
||||
{if $goods_info['is_limit'] == 1}
|
||||
<div class="layui-form-item limit_type" >
|
||||
<label class="layui-form-label">限购类型:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="radio" name="limit_type" class="limit_type" value="1" title="单次限购" lay-filter="limit_type" {if $goods_info['limit_type'] == 1 } checked {/if}>
|
||||
<input type="radio" name="limit_type" class="limit_type" value="2" title="长期限购" lay-filter="limit_type" {if $goods_info['limit_type'] == 2} checked {/if}>
|
||||
<input type="number" name="max_buy" placeholder="" lay-verify="max_buy" value="{$goods_info['max_buy']}" class="layui-input len-short" autocomplete="off">
|
||||
<div class="layui-form-mid"> 件</div>
|
||||
</div>
|
||||
<div class="word-aux">单次限购是针对于每次下单不能超过限购数量,长期限购是针对于会员账号购买这个项目的总数不能超过限购数量。</div>
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">起售:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="number" name="min_buy" placeholder="" lay-verify="min_buy" value="{$goods_info['min_buy']}" class="layui-input len-short" autocomplete="off">
|
||||
<div class="layui-form-mid">件</div>
|
||||
</div>
|
||||
<div class="word-aux">起售数量超出项目库存时,买家无法购买该项目</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">会员等级折扣:</label>
|
||||
<div class="layui-input-block">
|
||||
<div class="layui-input-inline">
|
||||
<input type="radio" name="is_consume_discount" value="1" title="参与" {if $goods_info['is_consume_discount'] > 0} checked {/if}>
|
||||
<input type="radio" name="is_consume_discount" value="0" title="不参与" {if $goods_info['is_consume_discount'] == 0} checked {/if}>
|
||||
</div>
|
||||
</div>
|
||||
<div class="word-aux">如果该项目未单独配置过优惠规则,则按照默认会员等级折扣优惠</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 项目详情 -->
|
||||
<div class="layui-tab-item">
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label sm"></label>
|
||||
<div class="layui-input-inline special-length">
|
||||
<input type="hidden" name="goods_content" value="{$goods_info['goods_content']}" />
|
||||
<script id="editor" type="text/plain" style="width:100%;height:500px;"></script>
|
||||
</div>
|
||||
</div>
|
||||
<script type="text/javascript" charset="utf-8" src="__STATIC__/ext/ueditor/ueditor.config.js"></script>
|
||||
<script type="text/javascript" charset="utf-8" src="__STATIC__/ext/ueditor/ueditor.all.js"> </script>
|
||||
<script type="text/javascript" charset="utf-8" src="__STATIC__/ext/ueditor/lang/zh-cn/zh-cn.js"></script>
|
||||
</div>
|
||||
|
||||
<div class="layui-tab-item layui-card card-common card-brief head">
|
||||
<div class="layui-card-header">
|
||||
<span class="card-title">高级设置</span>
|
||||
</div>
|
||||
|
||||
<div class="layui-card-body">
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">排序:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="number" name="sort" value="{$goods_info['sort']}" class="layui-input len-short" placeholder="0" autocomplete="off">
|
||||
</div>
|
||||
<div class="word-aux">项目默认排序号为0,数字越大,排序越靠前,数字重复,则最新添加的靠前。</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">项目详情显示库存:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="radio" name="stock_show" value="1" title="显示" {if $goods_info['stock_show'] > 0} checked {/if}>
|
||||
<input type="radio" name="stock_show" value="0" title="隐藏" {if $goods_info['stock_show'] == 0} checked {/if}>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">划线价显示:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="radio" name="market_price_show" value="1" title="显示" {if $goods_info['market_price_show'] > 0} checked {/if}>
|
||||
<input type="radio" name="market_price_show" value="0" title="隐藏" {if $goods_info['market_price_show'] == 0} checked {/if}>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">项目详情显示弹幕:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="radio" name="barrage_show" value="1" title="显示" {if $goods_info['barrage_show'] > 0} checked {/if}>
|
||||
<input type="radio" name="barrage_show" value="0" title="隐藏" {if $goods_info['barrage_show'] == 0} checked {/if}>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">项目详情显示销量:</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="radio" name="sale_show" value="1" title="显示" {if $goods_info['sale_show'] > 0} checked {/if}>
|
||||
<input type="radio" name="sale_show" value="0" title="隐藏" {if $goods_info['sale_show'] == 0} checked {/if}>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">项目海报:</label>
|
||||
<div class="layui-input-inline">
|
||||
<select name="template_id" lay-search="" lay-verify="">
|
||||
<option value="">请选择项目海报</option>
|
||||
{foreach name="$poster_list" item="vo"}
|
||||
<option value="{$vo['template_id']}" {if $goods_info.template_id == $vo.template_id} selected {/if}>{$vo['poster_name']}</option>
|
||||
{/foreach}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{if $form_is_exit}
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">项目表单:</label>
|
||||
<div class="layui-input-block len-mid">
|
||||
<select name="form_id">
|
||||
<option value="0">请选择项目表单</option>
|
||||
{foreach name="$form_list" item="vo"}
|
||||
<option value="{$vo.id}" {if $goods_info.form_id == $vo.id} selected {/if}>{$vo.form_name}</option>
|
||||
{/foreach}
|
||||
</select>
|
||||
</div>
|
||||
<div class="word-aux">
|
||||
<a href="{:href_url('form://shop/form/addform?form_type=goods')}" class="text-color" target="_blank">创建项目表单</a>
|
||||
<a href="javascript:;" onclick="refreshFormList()" class="text-color">刷新</a>
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<input type="hidden" name="goods_id" value="{$goods_info['goods_id']}" />
|
||||
<input type="hidden" name="goods_spec_format" value="{$goods_info['goods_spec_format']}" />
|
||||
<input type="hidden" name="goods_image" value="{$goods_info['goods_image']}" />
|
||||
<input type="hidden" name="goods_attr_format" value="{$goods_info['goods_attr_format']}" />
|
||||
|
||||
<div class="fixed-btn">
|
||||
<button class="layui-btn layui-btn-primary border-color text-color js-prev" lay-filter="prev">上一步</button>
|
||||
<button class="layui-btn js-save" lay-submit="" lay-filter="save">保存</button>
|
||||
<button class="layui-btn layui-btn-primary border-color text-color js-next" lay-submit="" lay-filter="next">下一步</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!--规格项模板-->
|
||||
<script type="text/html" id="specTemplate">
|
||||
|
||||
{{# for(var i=0;i<d.list.length;i++){ }}
|
||||
<div class="spec-item" data-index="{{i}}">
|
||||
<div class="layui-form-item spec">
|
||||
<label class="layui-form-label">规格项{{i+1}}:</label>
|
||||
<div class="layui-input-inline">
|
||||
<select name="spec_item">
|
||||
<option value="0"></option>
|
||||
{{# if(d.list[i].spec_name != ''){ }}
|
||||
<option value="{{d.list[i].spec_id}}" data-attr-name="{{d.list[i].spec_name}}" selected>{{d.list[i].spec_name}}</option>
|
||||
{{# }else{ }}
|
||||
{{# } }}
|
||||
</select>
|
||||
<i class="layui-icon layui-icon-close" data-index="{{i}}"></i>
|
||||
</div>
|
||||
|
||||
{{# if(i==0){ }}
|
||||
<div class="layui-input-inline">
|
||||
{{# if(d.add_spec_img){ }}
|
||||
<input type="checkbox" name="add_spec_img" title="添加规格图片" lay-skin="primary" lay-filter="add_spec_img" checked>
|
||||
{{# }else{ }}
|
||||
<input type="checkbox" name="add_spec_img" title="添加规格图片" lay-skin="primary" lay-filter="add_spec_img">
|
||||
{{# } }}
|
||||
</div>
|
||||
{{# } }}
|
||||
</div>
|
||||
|
||||
{{# if(d.list[i].spec_name != ''){ }}
|
||||
<div class="layui-form-item spec-value">
|
||||
{{# }else{ }}
|
||||
<div class="layui-form-item spec-value" style="display:none;">
|
||||
{{# } }}
|
||||
<label class="layui-form-label"></label>
|
||||
<div class="layui-input-block spec-value">
|
||||
{{# if(d.list[i].value.length){ }}
|
||||
<ul>
|
||||
{{# for(var j=0;j<d.list[i].value.length;j++){ }}
|
||||
<li data-index="{{j}}" data-parent-index="{{i}}" >
|
||||
{{# if(i==0 && d.add_spec_img){ }}
|
||||
<div class="img-wrap">
|
||||
{{# if(d.list[i].value[j].image){ }}
|
||||
<img src="{{ns.img(d.list[i].value[j].image)}}" alt="">
|
||||
{{# }else{ }}
|
||||
<img src="SHOP_IMG/goods_spec_value_empty.png" alt="">
|
||||
{{# } }}
|
||||
</div>
|
||||
{{# } }}
|
||||
|
||||
<span title="双击可编辑规格值" ondblclick="$(this).attr('contenteditable',true);$(this).focus()" class="spec-txt" data-spec_value_name="{{d.list[i].value[j].spec_value_name}}" data-parent-index="{{i}}" data-index="{{j}}">{{d.list[i].value[j].spec_value_name}}</span>
|
||||
<!--{{1# if(d.list[i].value[j].is_delete === undefined){ }}-->
|
||||
<i class="layui-icon layui-icon-close" data-parent-index="{{i}}" data-index="{{j}}"></i>
|
||||
<!--{{1# } }}-->
|
||||
</li>
|
||||
{{# } }}
|
||||
</ul>
|
||||
{{# } }}
|
||||
|
||||
<a class="text-color" href="javascript:;" data-index="{{i}}">+添加规格值</a>
|
||||
|
||||
<div class="add-spec-value-popup" data-index="{{i}}">
|
||||
<select name="spec_value_item"></select>
|
||||
<button class="layui-btn layui-btn-primary border-color text-color js-cancel-spec-value">取消</button>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
{{# } }}
|
||||
</script>
|
||||
|
||||
<!--SKU列表模板-->
|
||||
<script type="text/html" id="skuTableTemplate">
|
||||
|
||||
{{# if(d.skuList.length){ }}
|
||||
<table class="layui-table">
|
||||
<colgroup></colgroup>
|
||||
<thead>
|
||||
<tr>
|
||||
{{# if(d.showSpecName){ }}
|
||||
<th colspan="{{d.colSpan}}" style="min-width: 60px;">项目规格</th>
|
||||
{{# } }}
|
||||
<th rowspan="{{d.rowSpan}}">SKU图片</th>
|
||||
<th rowspan="{{d.rowSpan}}">副标题</th>
|
||||
<th rowspan="{{d.rowSpan}}"><span class="required">*</span>销售价</th>
|
||||
<th rowspan="{{d.rowSpan}}">划线价</th>
|
||||
<th rowspan="{{d.rowSpan}}">成本价</th>
|
||||
<th rowspan="{{d.rowSpan}}"><span class="required">*</span>库存</th>
|
||||
<th rowspan="{{d.rowSpan}}">库存预警</th>
|
||||
<th rowspan="{{d.rowSpan}}">服务时长</th>
|
||||
<th rowspan="{{d.rowSpan}}">商品编码(多个编码以英文逗号分割)</th>
|
||||
<th rowspan="{{d.rowSpan}}" style="white-space: nowrap;">默认展示</th>
|
||||
</tr>
|
||||
{{# if(d.colSpan>1){ }}
|
||||
<tr>
|
||||
{{# for(var i=0;i<d.specList.length;i++){ }}
|
||||
{{# if(d.specList[i].spec_name && d.specList[i].value.length> 0){ }}
|
||||
<th>{{d.specList[i].spec_name}}</th>
|
||||
{{# } }}
|
||||
{{# } }}
|
||||
</tr>
|
||||
{{# } }}
|
||||
</thead>
|
||||
<tbody>
|
||||
{{# for(var i=0;i<d.skuList.length;i++){ }}
|
||||
<tr>
|
||||
<td class="sku_imgs" id="sku_img_{{i}}" style="width: 130px;">
|
||||
{{# for(var j=0;j<d.skuList[i].sku_images_arr.length;j++){ }}
|
||||
<div class="img-wrap" data-index="{{j}}" data-parent-index="{{i}}">
|
||||
<a href="javascript:void(0)">
|
||||
<img src="{{ns.img(d.skuList[i].sku_images_arr[j])}}" layer-src />
|
||||
</a>
|
||||
<div class="operation">
|
||||
<i title="图片预览" class="iconfont iconreview js-preview"></i>
|
||||
<i title="删除图片" class="layui-icon layui-icon-delete js-delete"></i>
|
||||
</div>
|
||||
</div>
|
||||
{{# } }}
|
||||
{{# if(d.skuList[i].sku_images_arr.length<d.goods_sku_max){ }}
|
||||
<div class="upload-sku-img" data-index="{{i}}"><i class="layui-icon layui-icon-add-1"></i></div>
|
||||
{{# } }}
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" name="spec_name" placeholder="副标题" maxlength="100" value="{{d.skuList[i].spec_name}}" class="layui-input" autocomplete="off" data-index="{{i}}">
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" name="price" placeholder="销售价" lay-verify="sku_price" value="{{d.skuList[i].price}}" class="layui-input" autocomplete="off" data-index="{{i}}">
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" name="market_price" placeholder="划线价" value="{{d.skuList[i].market_price}}" lay-verify="sku_market_price" class="layui-input" autocomplete="off" data-index="{{i}}">
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" name="cost_price" placeholder="成本价" value="{{d.skuList[i].cost_price}}" lay-verify="sku_cost_price" class="layui-input" autocomplete="off" data-index="{{i}}">
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" name="stock" placeholder="库存" value="{{d.skuList[i].stock}}" lay-verify="sku_stock" class="layui-input" autocomplete="off" data-index="{{i}}">
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" name="stock_alarm" placeholder="库存预警" value="{{d.skuList[i].stock_alarm}}" lay-verify="sku_stock_alarm" class="layui-input" autocomplete="off" data-index="{{i}}">
|
||||
</td>
|
||||
<td>
|
||||
<input type="number" name="service_length" placeholder="服务时长" value="{{d.skuList[i].service_length}}" maxlength="50" class="layui-input" autocomplete="off" data-index="{{i}}" lay-verify="verify_num">
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" name="sku_no" placeholder="商品编码" value="{{d.skuList[i].sku_no}}" maxlength="50" class="layui-input" autocomplete="off" data-index="{{i}}">
|
||||
</td>
|
||||
<td style="min-width: 40px;">
|
||||
{{# if(d.skuList[i].is_default == 1) { }}
|
||||
<input type="checkbox" data-index="{{i}}" name="is_default" lay-filter="is_default" lay-skin="switch" checked>
|
||||
{{# }else { }}
|
||||
<input type="checkbox" data-index="{{i}}" name="is_default" lay-filter="is_default" lay-skin="switch">
|
||||
{{# } }}
|
||||
</td>
|
||||
</tr>
|
||||
{{# } }}
|
||||
|
||||
</tbody>
|
||||
</table>
|
||||
{{# } }}
|
||||
<div class="word-aux text-color" style="margin: 10px 0 0 0;">默认展示,是多规格项目在客户访问项目时,默认显示的项目规格</div>
|
||||
</script>
|
||||
|
||||
<!--项目主图列表-->
|
||||
<script type="text/html" id="goodsImage">
|
||||
{{# if(d.list.length){ }}
|
||||
{{# for(var i=0;i<d.list.length;i++){ }}
|
||||
<div class="item upload_img_square_item" data-index="{{i}}">
|
||||
<div class="img-wrap">
|
||||
<img src="{{ns.img(d.list[i],'small')}}" layer-src="{{ns.img(d.list[i],'big')}}">
|
||||
</div>
|
||||
<div class="operation">
|
||||
<i title="图片预览" class="iconfont iconreview js-preview"></i>
|
||||
<i title="删除图片" class="layui-icon layui-icon-delete js-delete" data-index="{{i}}"></i>
|
||||
<div class="replace_img" data-index="{{i}}">点击替换</div>
|
||||
</div>
|
||||
</div>
|
||||
{{# } }}
|
||||
{{# if(d.list.length < d.max){ }}
|
||||
<div class="item js-add-goods-image upload_img_square">+</div>
|
||||
{{# } }}
|
||||
{{# }else{ }}
|
||||
<div class="item js-add-goods-image upload_img_square">+</div>
|
||||
{{# } }}
|
||||
</script>
|
||||
<script src="__STATIC__/ext/drag-arrange.js"></script>
|
||||
<script src="__STATIC__/ext/video/videojs-ie8.min.js"></script>
|
||||
<script src="__STATIC__/ext/video/video.min.js"></script>
|
||||
<script src="__STATIC__/ext/searchable_select/searchable_select.js"></script>
|
||||
<script src="SHOP_JS/category_select.js?time=20240821"></script>
|
||||
<script src="SHOP_JS/goods_edit_common.js?time=20250527"></script>
|
||||
<script src="ADDON_CARDSERVICE_JS/service_goods_edit.js?v=1.1"></script>
|
||||
|
||||
Reference in New Issue
Block a user