初始上传

This commit is contained in:
2026-04-04 17:27:12 +08:00
parent 4d80d28eb4
commit b7e11774ee
11191 changed files with 1588469 additions and 0 deletions

View File

@@ -0,0 +1,343 @@
<?php
/**
* Niushop商城系统 - 团队十年电商经验汇集巨献!
* =========================================================
* Copy right 2019-2029 杭州牛之云科技有限公司, 保留所有权利。
* ----------------------------------------------
* 官方网址: https://www.niushop.com
* =========================================================
*/
namespace addon\pintuan\shop\controller;
use addon\pintuan\model\PintuanGroup;
use addon\pintuan\model\PintuanOrder;
use app\shop\controller\BaseShop;
use addon\pintuan\model\Pintuan as PintuanModel;
use addon\pintuan\model\PintuanGroup as PintuanGroupModel;
/**
* 拼团控制器
*/
class Pintuan extends BaseShop
{
/*
* 拼团活动列表
*/
public function lists()
{
if (request()->isJson()) {
$model = new PintuanModel();
$condition = [
[ 'p.site_id', '=', $this->site_id ],
[ 'g.goods_state', '=', 1 ],
[ 'g.is_delete', '=', 0 ]
];
$status = input('status', '');//拼团状态
if ($status) {
if ($status == 6) {
$condition[] = [ 'p.status', '=', 0 ];
} else {
$condition[] = [ 'p.status', '=', $status ];
}
}
$goods_name = input('goods_name', '');
if ($goods_name) {
$condition[] = [ 'g.goods_name', 'like', '%' . $goods_name . '%' ];
}
$start_time = input('start_time', '');
$end_time = input('end_time', '');
if ($start_time && !$end_time) {
$condition[] = [ 'p.end_time', '>=', date_to_time($start_time) ];
} elseif (!$start_time && $end_time) {
$condition[] = [ 'p.start_time', '<=', date_to_time($end_time) ];
} elseif ($start_time && $end_time) {
$start_timestamp = date_to_time($start_time);
$end_timestamp = date_to_time($end_time);
$sql = "p.start_time between {$start_timestamp} and {$end_timestamp}";
$sql .= " or p.end_time between {$start_timestamp} and {$end_timestamp}";
$sql .= " or (p.start_time <= {$start_timestamp} and p.end_time >= {$end_timestamp})";
$condition[] = [ '', 'exp', \think\facade\Db::raw($sql) ];
}
//排序
$order = input('order', 'create_time');
$sort = input('sort', 'desc');
if ($order == 'create_time') {
$order_by = 'p.' . $order . ' ' . $sort;
} else {
$order_by = 'p.' . $order . ' ' . $sort . ',p.create_time desc';
}
$page = input('page', 1);
$page_size = input('page_size', PAGE_LIST_ROWS);
$list = $model->getPintuanPageList($condition, $page, $page_size, $order_by);
return $list;
} else {
return $this->fetch("pintuan/lists");
}
}
/**
* 添加活动
*/
public function add()
{
if (request()->isJson()) {
$pintuan_data = [
'site_id' => $this->site_id,
'site_name' => '',
'pintuan_name' => input('pintuan_name', ''),//活动名称
'is_virtual_goods' => input('is_virtual_goods', ''),//是否是虚拟商品
'pintuan_num' => input('pintuan_num', ''),//参团人数
'pintuan_time' => input('pintuan_time', ''),//拼团有效期
'remark' => input('remark', ''),// 活动规则
'is_recommend' => input('is_recommend', ''),//是否推荐
'start_time' => date_to_time(input('start_time', '')),//开始时间
'end_time' => date_to_time(input('end_time', '')),//结束时间
'buy_num' => input('buy_num', ''),//拼团限制购买
'is_single_buy' => input('is_single_buy', ''),//是否单独购买
'is_virtual_buy' => input('is_virtual_buy', ''),//是否虚拟成团
'is_promotion' => input('is_promotion', ''),//是否团长优惠
'pintuan_type' => input('pintuan_type', ''),
'pintuan_num_2' => input('pintuan_num_2', 0),
'pintuan_num_3' => input('pintuan_num_3', 0),
];
$goods = [
'goods_ids' => input('goods_ids', ''),
'sku_ids' => input('sku_ids', ''),
];
$sku_list = input('sku_list', '');
$pintuan_model = new PintuanModel();
return $pintuan_model->addPintuan($pintuan_data, $goods, $sku_list);
} else {
$pintuan_name = '拼团 ' . date('Y-m-d');
$this->assign('pintuan_name', $pintuan_name);
return $this->fetch("pintuan/add");
}
}
/**
* 编辑活动
*/
public function edit()
{
$pintuan_model = new PintuanModel();
if (request()->isJson()) {
$pintuan_data = [
'pintuan_id' => input('pintuan_id', ''),
'site_id' => $this->site_id,
'pintuan_name' => input('pintuan_name', ''),//活动名称
'goods_id' => input('goods_id', ''),//商品ID
'is_virtual_goods' => input('is_virtual_goods', ''),//是否是虚拟商品
'pintuan_num' => input('pintuan_num', ''),//参团人数
'pintuan_time' => input('pintuan_time', ''),//拼团有效期
'remark' => input('remark', ''),//活动规则
'is_recommend' => input('is_recommend', ''),//是否推荐
'start_time' => date_to_time(input('start_time', '')),//开始时间
'end_time' => date_to_time(input('end_time', '')),//结束时间
'buy_num' => input('buy_num', ''),//拼团限制购买
'is_single_buy' => input('is_single_buy', ''),//是否单独购买
'is_virtual_buy' => input('is_virtual_buy', ''),//是否虚拟成团
'is_promotion' => input('is_promotion', ''),//是否团长优惠
'pintuan_num_2' => input('pintuan_num_2', 0),
'pintuan_num_3' => input('pintuan_num_3', 0),
];
$sku_list = input('sku_list', '');
$goods = [
'goods_id' => input('goods_id', ''),
'sku_ids' => input('sku_ids', ''),
];
return $pintuan_model->editPintuan($pintuan_data, $goods, $sku_list);
} else {
$pintuan_id = input('pintuan_id', '');
//获取拼团信息
$pintuan_info = $pintuan_model->getPintuanDetail($pintuan_id, $this->site_id);
if (empty($pintuan_info[ 'data' ])) $this->error('未获取到活动数据', href_url('pintuan://shop/pintuan/lists'));
$this->assign('pintuan_info', $pintuan_info);
return $this->fetch("pintuan/edit");
}
}
/*
* 拼团详情
*/
public function detail()
{
$pintuan_model = new PintuanModel();
$pintuan_id = input('pintuan_id', '');
//获取拼团信息
$pintuan_info = $pintuan_model->getPintuanJoinGoodsList($pintuan_id, $this->site_id)[ 'data' ] ?? [];
if (empty($pintuan_info)) $this->error('未获取到活动数据', href_url('pintuan://shop/pintuan/lists'));
$this->assign('info', $pintuan_info);
return $this->fetch("pintuan/detail");
}
/*
* 删除拼团活动
*/
public function delete()
{
$pintuan_id = input('pintuan_id', '');
$pintuan_model = new PintuanModel();
return $pintuan_model->deletePintuan($pintuan_id, $this->site_id);
}
/*
* 拼团活动失效
*/
public function invalid()
{
$pintuan_id = input('pintuan_id', '');
$pintuan_model = new PintuanModel();
return $pintuan_model->invalidPintuanTo($pintuan_id, $this->site_id);
}
/********************************** 开团团队 ******************************************************/
/*
* 开团团队列表
*/
public function group()
{
$model = new PintuanGroupModel();
$condition[] = [ 'pg.site_id', '=', $this->site_id ];
$pintuan_id = input('pintuan_id', '');
if ($pintuan_id) {
$condition[] = [ 'pg.pintuan_id', '=', $pintuan_id ];
}
//获取续签信息
if (request()->isJson()) {
$goods_name = input('goods_name', '');
$nickname = input('nickname', '');
$start_time = input('start_time', '');
$end_time = input('end_time', '');
$status = input('status', '');//拼团状态
$page = input('page', 1);
$page_size = input('page_size', PAGE_LIST_ROWS);
if ($goods_name) {
$condition[] = [ 'g.goods_name', 'like', '%' . $goods_name . '%' ];
}
if ($nickname) {
$condition[] = [ 'm.nickname', 'like', '%' . $nickname . '%' ];
}
if ($start_time && !$end_time) {
$condition[] = [ 'pg.create_time', '>=', date_to_time($start_time) ];
} elseif (!$start_time && $end_time) {
$condition[] = [ 'pg.create_time', '<=', date_to_time($end_time) ];
} elseif ($start_time && $end_time) {
$condition[] = [ 'pg.create_time', 'between', [ date_to_time($start_time), date_to_time($end_time) ] ];
}
if ($status) {
if ($status == 6) {
$condition[] = [ 'pg.status', '=', 0 ];
} else {
$condition[] = [ 'pg.status', '=', $status ];
}
}
$list = $model->getPintuanGroupPageList($condition, $page, $page_size, 'pg.group_id desc');
return $list;
} else {
$this->assign('pintuan_id', $pintuan_id);
return $this->fetch("pintuan/group");
}
}
/*
* 拼团组成员订单列表
*/
public function groupOrder()
{
$model = new PintuanOrder();
$condition = [];
$condition[] = [ 'ppo.pintuan_status', 'in', '2,3' ];
$group_id = input('group_id', '');
if ($group_id) {
$condition[] = [ 'ppo.group_id', '=', $group_id ];
}
//获取续签信息
if (request()->isJson()) {
$page = input('page', 1);
$page_size = input('page_size', PAGE_LIST_ROWS);
$list = $model->getPintuanOrderPageList($condition, $page, $page_size, 'ppo.id desc');
return $list;
} else {
$this->assign('group_id', $group_id);
//获取团长信息
$pintuan_group_model = new PintuanGroupModel();
$info = $pintuan_group_model->getPintuanGroupDetail([ [ 'pg.group_id', '=', $group_id ], [ 'pg.site_id', '=', $this->site_id ] ]);
if (empty($info[ 'data' ])) $this->error('未获取到成团数据', href_url('pintuan://shop/pintuan/group'));
$this->assign('info', $info[ 'data' ]);
return $this->fetch("pintuan/group_order");
}
}
/**
* 获取商品列表
* @return array
*/
public function getSkuList()
{
if (request()->isJson()) {
$pintuan_model = new PintuanModel();
$pintuan_id = input('pintuan_id', '');
$pintuan_info = $pintuan_model->getPintuanGoodsList($pintuan_id, $this->site_id);
return $pintuan_info;
}
}
/**
* 拼团推广
*/
public function pintuanUrl()
{
$pintuan_id = input('pintuan_id', '');
$app_type = input('app_type', '');
$pintuan_model = new PintuanModel();
$res = $pintuan_model->urlQrcode('/pages_promotion/pintuan/detail', [ 'id' => $pintuan_id ], 'pintuan', $app_type, $this->site_id);
return $res;
}
/**
* 批量删除
*/
public function deleteAll(){
$pintuan_id = input('pintuan_id', '');
$pintuan_model = new PintuanModel();
foreach ($pintuan_id as $k => $v){
$res = $pintuan_model->deletePintuan($v, $this->site_id);
}
return $res;
}
/**
* 批量关闭
*/
public function invalidAll(){
$pintuan_id = input('pintuan_id', '');
$pintuan_model = new PintuanModel();
foreach ($pintuan_id as $k => $v){
$res = $pintuan_model->invalidPintuanTo($v, $this->site_id);
}
return $res;
}
}

View File

@@ -0,0 +1,755 @@
<style>
.layui-form-item .layui-input-inline.end-time{float: none;}
.goods_list .layui-table-body{max-height: 480px !important;}
.goods-title{display: flex;align-items: center;}
.goods-title .goods-img{display: flex;align-items: center;justify-content: center;width: 55px;height: 55px;margin-right: 5px;}
.goods-title .goods-img img{max-height: 100%;max-width: 100%;}
.goods-title .goods-name{flex: 1;line-height: 1.6;width: 0;white-space: break-spaces;}
.form-wrap {position: relative;}
.examples {cursor: pointer; margin-left: 5px;}
.layui-carousel>[carousel-item]>* {background: #fff !important;}
.layui-carousel {position: absolute; top: 10px; left: 1330px; width: 300px !important; height: 610px !important; background: #fff;}
.goods_num {padding-left: 20px;}
.ladder .layui-form-label + .layui-input-block {display: flex}
.ladder .layui-form-label + .layui-input-block .layui-form-mid.right {margin-left: 10px}
</style>
<div 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" style="display: inline-block; margin-left: 0px;">
<input type="text" name="pintuan_name" value="{$pintuan_name}" lay-verify="required" autocomplete="off" class="layui-input len-long" maxlength="40">
</div>
<div class="word-aux">
<p>活动名称将显示在活动列表中,方便商家管理</p>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>活动时间:</label>
<div class="layui-inline">
<div class="layui-input-inline len-mid">
<input type="text" id="start_time" name="start_time" lay-verify="required" class="layui-input" autocomplete="off" readonly>
<i class=" iconrili iconfont calendar"></i>
</div>
<span class="layui-form-mid">-</span>
<div class="layui-input-inline len-mid end-time">
<input type="text" id="end_time" name="end_time" lay-verify="required|time" class="layui-input" autocomplete="off" readonly>
<i class=" iconrili iconfont calendar"></i>
</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">拼团类型:</label>
<div class="layui-input-inline">
<input type="radio" name="pintuan_type" value="ordinary" title="普通拼团" checked lay-filter="pintuan_type">
<input type="radio" name="pintuan_type" value="ladder" title="阶梯拼团" lay-filter="pintuan_type">
</div>
</div>
<div class="pintuan-type ordinary">
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>参团人数:</label>
<div class="layui-input-block">
<input type="number" name="pintuan_num" value="2" lay-verify="required|sum" autocomplete="off" class="layui-input len-short">
</div>
<div class="word-aux">
<p>最少两人成团</p>
</div>
</div>
</div>
<div class="pintuan-type ladder" style="display: none">
<div class="layui-form-item pintuan-ladder">
<label class="layui-form-label"><span class="required">*</span>参团人数:</label>
<div class="layui-input-block">
<div class="layui-form-mid">第一级阶梯人数</div>
<input type="number" name="pintuan_num_1" value="" lay-verify="ladderNum" autocomplete="off" class="layui-input len-short">
<div class="layui-form-mid right"></div>
</div>
</div>
<div class="layui-form-item pintuan-ladder">
<label class="layui-form-label"></label>
<div class="layui-input-block">
<div class="layui-form-mid">第二级阶梯人数</div>
<input type="number" name="pintuan_num_2" value="" lay-verify="ladderNum" autocomplete="off" class="layui-input len-short">
<div class="layui-form-mid right"></div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"></label>
<div class="layui-input-block">
<button class="layui-btn add-ladder">添加拼团阶梯</button>
</div>
<div class="word-aux">
<p>最少两人成团,最多支持三级阶梯</p>
</div>
</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 len-short">
<select class="pintuan-day"></select>
</div>
<div class="layui-form-mid"></div>
<div class="layui-input-inline len-short">
<select class="pintuan-hour"></select>
</div>
<div class="layui-form-mid"></div>
<div class="layui-input-inline len-short">
<select class="pintuan-minute"></select>
</div>
<div class="layui-form-mid"></div>
</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">
<input type="number" name="buy_num" value="1" lay-verify="num" autocomplete="off" class="layui-input len-short">
</div>
<div class="word-aux">
<p>本次活动中一次最多可购买的商品数量默认为1</p>
</div>
</div>
<div class="pintuan-type ordinary layui-form-item">
<label class="layui-form-label">团长优惠:</label>
<div class="layui-input-block">
<input type="checkbox" name="is_promotion" title="团长享受优惠价" lay-skin="primary" lay-filter="is_promotion">
</div>
<div class="word-aux">
<p>开启团长(开团人)优惠后,团长将享受更优惠价格,有助于提高开团率和成团率</p>
</div>
</div>
<div class="layui-form-item goods_list">
<label class="layui-form-label">活动商品:</label>
<div class="layui-input-block">
<table id="selected_goods_list" lay-filter="selected_goods_list"></table>
<button class="layui-btn" onclick="addGoods()">选择商品</button>
<span class="goods_num">已选商品(<span id="goods_num" style="color: red">0</span></span>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">是否单独购买:</label>
<div class="layui-input-inline">
<input type="radio" name="is_single_buy" value="1" title="是">
<input type="radio" name="is_single_buy" value="0" title="否" checked>
</div>
</div>
<div class="word-aux">
<p>说明:设置单独购买,是可以选择不走拼团,直接提交订单购买商品 <a onclick="showDemo()" class="examples text-color">查看示例</a></p>
</div>
<div class="layui-form-item">
<label class="layui-form-label">是否虚拟成团:</label>
<div class="layui-input-inline">
<input type="radio" name="is_virtual_buy" value="1" title="是">
<input type="radio" name="is_virtual_buy" value="0" title="否" checked>
</div>
</div>
<div class="word-aux">
<p>说明:虚拟成团则代表在拼团时间结束后,如果还未拼单成功,那么系统将会默认拼团成功。</p>
</div>
<div class="layui-form-item layui-hide">
<label class="layui-form-label">是否推荐:</label>
<div class="layui-input-inline">
<input type="radio" name="is_recommend" value="1" title="是">
<input type="radio" name="is_recommend" value="0" title="否" checked>
</div>
</div>
<input type="hidden" name="is_virtual_goods" value="0">
<div class="layui-form-item layui-form-text">
<label class="layui-form-label">活动规则:</label>
<div class="layui-input-inline">
<textarea name="remark" class="layui-textarea len-long" maxlength="300"></textarea>
</div>
</div>
<div class="form-row">
<button class="layui-btn" lay-submit lay-filter="save">保存</button>
<button class="layui-btn layui-btn-primary" onclick="backPintuanList()">返回</button>
</div>
</div>
<script type="text/html" id="toolbarOperation">
<button class="layui-btn layui-btn-primary" lay-event="pintuan-price">拼团价格</button>
</script>
<script type="text/html" id="toolbarOperationOne">
<button class="layui-btn layui-btn-primary" lay-event="pintuan-price">拼团价格</button>
<button class="layui-btn layui-btn-primary" lay-event="pintuan-discounts-price">团长优惠价</button>
</script>
<script>
var goodsId = {}, selectedGoodsId = [], sku_list = [],is_promotion=0,table;
layui.use(['form', 'laydate','carousel'], function() {
var form = layui.form,
laydate = layui.laydate,
repeat_flag = false,
currentDate = new Date(),
minDate = "";
var carousel = layui.carousel;
currentDate.setDate(currentDate.getDate() + 30);
carousel.render({
elem: '#carousel',
width: '100%',
arrow: 'always'
});
form.render();
renderTable(sku_list); // 初始化表格
for (var i = 0; i <= 30; i++) {
if (i < 10) {
var html = '<option value="' + i + '">0' + i + '</option>';
} else {
var html = '<option value="' + i + '">' + i + '</option>';
}
if (i == 1) {
var html = '<option value="' + i + '" selected>0' + i + '</option>';
}
$(".pintuan-day").append(html);
}
for (var i = 0; i <= 23; i++) {
if (i < 10) {
var html = '<option value="' + i + '">0' + i + '</option>';
} else {
var html = '<option value="' + i + '">' + i + '</option>';
}
$(".pintuan-hour").append(html);
}
for (var i = 0; i <= 59; i++) {
if (i < 10) {
var html = '<option value="' + i + '">0' + i + '</option>';
} else {
var html = '<option value="' + i + '">' + i + '</option>';
}
$(".pintuan-minute").append(html);
}
form.render('select');
//开始时间
laydate.render({
elem: '#start_time', //指定元素
type: 'datetime',
value: new Date(),
done: function(value) {
minDate = value;
reRender();
}
});
//结束时间
laydate.render({
elem: '#end_time', //指定元素
type: 'datetime',
value: new Date(currentDate)
});
/**
* 重新渲染结束时间
* */
function reRender() {
$("#end_time").remove();
$(".end-time").html('<input type="text" id="end_time" name="end_time" placeholder="请输入结束时间" lay-verify="required|time" class = "layui-input" autocomplete="off" readonly><i class=" iconrili iconfont calendar"></i> ');
laydate.render({
elem: '#end_time',
type: 'datetime',
min: minDate
});
}
/**
* 表单验证
*/
form.verify({
time: function(value) {
var now_time = (new Date()).getTime();
var start_time = (new Date($("#start_time").val())).getTime();
var end_time = (new Date(value)).getTime();
if (now_time > end_time) {
return '结束时间不能小于当前时间!'
}
if (start_time > end_time) {
return '结束时间不能小于开始时间!';
}
},
num: function(value) {
if (value < 1 || value % 1 != 0) {
return '请输入大于0的正整数';
}
},
sum: function(value) {
if ($('[name="pintuan_type"]:checked').val() == 'ordinary') {
if (value < 2 || value % 1 != 0) {
return '参团人数不能小于2且必须是整数';
}
}
},
ladderNum: function(value, item){
if ($('[name="pintuan_type"]:checked').val() == 'ladder') {
if (value < 2 || value % 1 != 0) {
return '参团人数不能小于2且必须是整数';
}
var prevVal = $(item).parents('.pintuan-ladder').prev('.pintuan-ladder').find('input').val();
if (prevVal != undefined && parseInt(prevVal) >= parseInt(value)) {
return '参团人数不能小于等于上一个阶梯的人数';
}
}
},
pintuan_price: function(value, item) {
var price = $(item).parents("tr").find(".goods-price").text();
if (Number(value) > Number(price)) {
return '拼团价格不能大于商品价格';
}
if (value.trim() == "") {
return '拼团价格不能为空';
}
if (Number(value) <= 0) {
return '拼团价格必须大于0';
}
var arrMen = value.split(".");
var val = 0;
if (arrMen.length == 2) {
val = arrMen[1];
}
if (val.length > 2) {
return '拼团价格最多保留两位小数';
}
},
promotion_price: function(value, item) {
var price = $(item).parents("tr").find(".goods-price").text();
if (Number(value) > Number(price)) {
return '团长优惠价不能大于商品价格';
}
if (value.trim() == "") {
return '团长优惠价不能为空';
}
if (Number(value) <= 0) {
return '团长优惠价必须大于0';
}
var arrMen = value.split(".");
var val = 0;
if (arrMen.length == 2) {
val = arrMen[1];
}
if (val.length > 2) {
return '团长优惠价最多保留两位小数';
}
}
});
/**
* 监听团长优惠是否被选中
*/
form.on('checkbox(is_promotion)', function(data){
renderTable(sku_list);
});
form.on('radio(pintuan_type)', function(data){
$('.pintuan-type').hide();
$('.pintuan-type.' + data.value).show();
renderTable(sku_list);
});
$('.add-ladder').click(function () {
if ($('.pintuan-ladder').length >= 3) {
layer.msg('最多添加三个阶梯');
return;
}
var h = `<div class="layui-form-item pintuan-ladder">
<label class="layui-form-label"></label>
<div class="layui-input-block">
<div class="layui-form-mid">第三级阶梯人数</div>
<input type="number" name="pintuan_num_3" value="" lay-verify="required|ladderNum" autocomplete="off" class="layui-input len-short">
<div class="layui-form-mid right">人</div>
<a href="javascript:;" class="text-color delete">删除</a>
</div>
</div>`;
$(this).parents('.layui-form-item').before(h);
renderTable(sku_list);
});
$('body').off('click', '.pintuan-ladder .delete').on('click', '.pintuan-ladder .delete', function () {
$(this).parents('.layui-form-item').remove();
renderTable(sku_list);
});
/**
* 监听提交
*/
form.on('submit(save)', function(data){
if (!Object.keys(goodsId).length) {
layer.msg("请选择活动商品!", {icon: 5, anim: 6});
return;
}
data.field.goods_ids = selectedGoodsId.split(',');
var skuId = [];
Object.values(goodsId).forEach(function (item,index) {
Object.values(item.sku_id).forEach(function (skuItem,skuIndex) {
skuId.push(skuItem.sku);
});
});
data.field.sku_ids = skuId;
if (data.field.pintuan_type == 'ladder') {
data.field.pintuan_num = data.field.pintuan_num_1;
}
var skuLisArr = [];
sku_list.forEach(function(item,index) {
var sku_detail = {};
sku_detail.sku_id = item.sku_id;
sku_detail.goods_id = item.goods_id;
sku_detail.pintuan_price = item.pintuan_price || 0;
sku_detail.pintuan_price_2 = item.pintuan_price_2 || 0;
sku_detail.pintuan_price_3 = item.pintuan_price_3 || 0;
sku_detail.promotion_price = item.promotion_price || 0;
skuLisArr.push(sku_detail);
});
data.field.sku_list = skuLisArr;
var day = $(".pintuan-day option:selected").text(),
hour = $(".pintuan-hour option:selected").text(),
minute = $(".pintuan-minute option:selected").text();
var pintuan_time = Number(day) * 24 * 60 + Number(hour) * 60 + Number(minute);
data.field.pintuan_time = pintuan_time;
var time = new Date(data.field.end_time).getTime() - new Date(data.field.start_time).getTime();
if (time == 0) {
layer.msg("拼团有效期不能为0", {icon: 5, anim: 6});
return;
}
if (time < (pintuan_time * 60 * 1000)) {
layer.msg("拼团有效期不能大于活动时长!", {icon: 5, anim: 6});
return;
}
data.field.is_promotion = data.field.is_promotion == undefined ? 0 : 1;
if(repeat_flag) return;
repeat_flag = true;
$.ajax({
type: 'POST',
dataType: 'JSON',
url: ns.url("pintuan://shop/pintuan/add"),
data: data.field,
async: false,
success: function(res){
repeat_flag = false;
if (res.code == 0) {
layer.confirm('添加成功', {
title:'操作提示',
btn: ['返回列表', '继续添加'],
closeBtn: 0,
yes: function(index, layero){
location.hash = ns.hash("pintuan://shop/pintuan/lists");
layer.close(index);
},
btn2: function(index, layero) {
listenerHash(); // 刷新页面
layer.close(index);
}
});
}else{
layer.msg(res.message);
}
}
})
});
});
// 表格渲染
function renderTable(sku_list) {
var cols = [[
{
width: "3%",
type: 'checkbox',
unresize: 'false'
},
{
field: 'sku_name',
title: '商品名称',
width: '30%',
unresize: 'false',
templet: function(data) {
var html = '';
html += ` <div class="goods-title">
<div class="goods-img">
<img layer-src src="${data.sku_image ? ns.img(data.sku_image) : ''}" alt="">
</div>
<p class="multi-line-hiding goods-name" data-goods_id="${data.goods_id}" data-sku_id="${data.sku_id}" title="${data.sku_name}">${data.sku_name}</p>
</div>`;
return html;
}
}, {
field: 'price',
title: '商品价格',
unresize: 'false',
align: 'right',
width: '15%',
templet: function(data) {
return '<p class="line-hiding" title="'+ data.price +'">¥<span class="goods-price">' + data.price +'</span ></p>';
}
}, {
title: '操作',
toolbar: '#operation ',
width: '7% ',
align: 'right',
unresize: 'false '
}]
];
if ($('[name="pintuan_type"]:checked').val() == 'ordinary') {
let col = [
{
title: '拼团价 (元)',
unresize: 'false ',
align: 'center',
templet: '#pintuan_price',
width: $('[name="is_promotion"]').is(':checked') ? '25%' : '45%'
}
];
if ($('[name="is_promotion"]').is(':checked')) {
col.push({
title: '团长价(元)',
unresize: 'false',
align: 'center',
templet: '#promotion_price',
width: '20%'
})
}
cols[0].splice(3, 0, ...col);
} else if ($('[name="pintuan_type"]:checked').val() == 'ladder') {
let col = [
{
title: '阶梯一 (元)',
unresize: 'false ',
align: 'center',
templet: '#pintuan_price',
width: $('.pintuan-ladder').length == 3 ? '15%' : '25%'
},
{
title: '阶梯二 (元)',
unresize: 'false ',
align: 'center',
templet: '#pintuan_price_2',
width: $('.pintuan-ladder').length == 3 ? '15%' : '20%'
}
];
if ($('.pintuan-ladder').length == 3) {
col.push({
title: '阶梯三 (元)',
unresize: 'false ',
align: 'center',
templet: '#pintuan_price_3',
width: '15%'
})
}
cols[0].splice(3, 0, ...col);
}
//展示已知数据
table = new Table({
elem: '#selected_goods_list',
page:false,
limit:Number.MAX_VALUE,
cols: cols,
data: sku_list,
toolbar: '#toolbarOperation'
});
/**
* 批量操作
*/
table.toolbar(function(obj) {
if (obj.data.length < 1) {
layer.msg('请选择要操作的数据');
return;
}
switch (obj.event) {
case "pintuan-price":
editInput(0,obj);
break;
case "pintuan-discounts-price":
editInput(1,obj);
break;
}
});
}
function editInput(textIndex=0,data) {
var text = [{
name: '拼团价格',
value: 'pintuan_price'
},{
name: '团长优惠价',
value: 'promotion_price'
}];
layer.open({
type: 1,
title:"修改"+text[textIndex].name,
area:['600px'],
btn:["保存","返回"],
content: `
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>${text[textIndex].name}</label>
<div class="layui-input-block">
<input type="text" name="bargain_edit_input" lay-verify="required" autocomplete="off" class="layui-input len-mid" placeholder="请输入${text[textIndex].name}">
</div>
</div>
`,
yes: function(index, layero){
var val = $("input[name='bargain_edit_input']").val();
if (!val){
layer.msg("请输入" + text[textIndex].name);
return false;
}
data.data.forEach(function (item,index) {
sku_list.forEach(function (skuItem,skuIndex) {
if (item.sku_id == skuItem.sku_id){
sku_list[skuIndex][text[textIndex].value] = val;
}
})
});
renderTable(sku_list);
layer.closeAll();
}
});
}
/**
* 添加商品
*/
function addGoods(){
goodsSelect(function (data) {
let newGoodsId = {};
let new_sku_list = [];
for (var key in data) {
newGoodsId['goods_'+ data[key].goods_id] = {};
newGoodsId['goods_'+ data[key].goods_id].sku_id = {};
newGoodsId['goods_'+ data[key].goods_id].spu_id = data[key].goods_id;
for (var sku in data[key].sku_list) {
var item = data[key].sku_list[sku];
newGoodsId['goods_'+ data[key].goods_id].sku_id['sku_'+item.sku_id]={};
newGoodsId['goods_'+ data[key].goods_id].sku_id['sku_'+item.sku_id].sku = item.sku_id;
sku_list.forEach((old_item)=>{
if(item.sku_id == old_item.sku_id){
item.pintuan_price = old_item.pintuan_price;
item.pintuan_price_2 = old_item.pintuan_price_2;
item.pintuan_price_3 = old_item.pintuan_price_3;
item.promotion_price = old_item.promotion_price;
}
})
new_sku_list.push(item);
}
}
goodsId = newGoodsId;
sku_list = new_sku_list;
renderTable(sku_list);
$("input[name='sku_ids']").val(JSON.stringify(goodsId));
var spuId = [];
Object.values(goodsId).forEach(function (item,index) {
spuId.push(item.spu_id);
});
selectedGoodsId = spuId.toString();
$("#goods_num").html(sku_list.length)
}, selectedGoodsId);
}
function delRow(obj,id) {
for (var i = 0; i < sku_list.length; i++){
if (sku_list[i].sku_id == parseInt(id)){
sku_list.splice(i,1);
}
}
Object.values(goodsId).forEach(function (item,index) {
delete item.sku_id['sku_'+id];
if (!Object.keys(item.sku_id).length){
delete goodsId['goods_'+item.spu_id];
}
});
var spuId = [];
Object.values(goodsId).forEach(function (item,index) {
spuId.push(item.spu_id);
});
selectedGoodsId = spuId.toString();
$(obj).parents("tr").remove();
$("#goods_num").html(sku_list.length)
}
function bargainPintuanPrice(index,event, key) {
for (var i = 0; i < sku_list.length; i++){
if (sku_list[i].sku_id == index)
sku_list[i][key] = event.srcElement.value;
}
}
function backPintuanList() {
location.hash = ns.hash("pintuan://shop/pintuan/lists");
}
function showDemo(){
layer.open({
title: '查看示例',
type: 1,
area: ['600px', '660px'],
content: '<img style="margin:20px 45px;" src="__STATIC__/img/single_buy.png" >',
})
}
</script>
<script type="text/html" id="pintuan_price">
<input type="number" class="layui-input len-short pintuan-price" value="{{d.pintuan_price ? d.pintuan_price : '' }}" lay-verify="pintuan_price" min="0.00" oninput="bargainPintuanPrice({{ d.sku_id }},event, 'pintuan_price')" onporpertychange="bargainPintuanPrice({{ d.sku_id }},event, 'pintuan_price')"/>
</script>
<script type="text/html" id="pintuan_price_2">
<input type="number" class="layui-input len-short pintuan-price" value="{{d.pintuan_price_2 ? d.pintuan_price_2 : '' }}" lay-verify="pintuan_price" min="0.00" oninput="bargainPintuanPrice({{ d.sku_id }},event, 'pintuan_price_2')" onporpertychange="bargainPintuanPrice({{ d.sku_id }},event, 'pintuan_price_2')"/>
</script>
<script type="text/html" id="pintuan_price_3">
<input type="number" class="layui-input len-short pintuan-price" value="{{d.pintuan_price_3 ? d.pintuan_price_3 : '' }}" lay-verify="pintuan_price" min="0.00" oninput="bargainPintuanPrice({{ d.sku_id }},event, 'pintuan_price_3')" onporpertychange="bargainPintuanPrice({{ d.sku_id }},event, 'pintuan_price_3')"/>
</script>
<script type="text/html" id="promotion_price">
<input type="number" class="layui-input len-short promotion-price" value="{{d.promotion_price ? d.promotion_price : '' }}" lay-verify="promotion_price" min="0.00" oninput="bargainPintuanPrice({{ d.sku_id }},event, 'promotion_price')" onporpertychange="bargainPromotionPrice({{ d.sku_id }},event, 'promotion_price')"/>
</script>
<script type="text/html" id="operation">
<div class="table-btn">
<a class="layui-btn" onclick="delRow(this,{{d.sku_id}})">删除</a>
</div>
</script>

View File

@@ -0,0 +1,168 @@
<link rel="stylesheet" href="STATIC_CSS/promotion_detail.css">
<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>{$info.pintuan_name}</span>
</div>
<div class="promotion-view-item">
<label>活动状态:</label>
<span>{if condition="$info.status == 0"}未开始{/if}{if condition="$info.status == 1"}进行中{/if}{if condition="$info.status == 2"}已结束{/if}{if condition="$info.status == 3"}已失效{/if}</span>
</div>
<div class="promotion-view-item">
<label>拼团类型:</label>
<span>{$info.pintuan_type == 'ordinary' ? '普通拼团' : '阶梯拼团'}</span>
</div>
<div class="promotion-view-item">
<label>拼团人数:</label>
<span>{$info.pintuan_num}人团</span>
{if $info.pintuan_type == 'ladder'}<span> {$info.pintuan_num_2}人团</span>{/if}
{if $info.pintuan_type == 'ladder' && $info.pintuan_num_3 > 0}<span> {$info.pintuan_num_3}人团</span>{/if}
</div>
<div class="promotion-view-item">
<label>开始时间:</label>
<span>{:date('Y-m-d H:i:s',$info.start_time)}</span>
</div>
<div class="promotion-view-item">
<label>结束时间:</label>
<span>{:date('Y-m-d H:i:s',$info.end_time)}</span>
</div>
<div class="promotion-view-item">
<label>单人限制购买数量:</label>
<span>{$info.buy_num}</span>
</div>
<div class="promotion-view-item">
<label>是否是单独购买:</label>
<span>{$info.is_single_buy == 0 ? '否' : '是'}</span>
</div>
<div class="promotion-view-item">
<label>是否是虚拟成团:</label>
<span>{$info.is_virtual_buy == 0 ? '否' : '是'}</span>
</div>
<div class="promotion-view-item">
<label>是否有团长优惠:</label>
<span>{$info.is_promotion == 0 ? '否' : '是'}</span>
</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">
<div class="promotion-stat-view todo-list">
<div class="promotion-stat-item" >
<div class="promotion-stat-item-title">开团数</div>
<div class="promotion-stat-item-value">{$info.group_num}</div>
</div>
<div class="promotion-stat-item" >
<div class="promotion-stat-item-title">成团数</div>
<div class="promotion-stat-item-value">{$info.success_group_num}</div>
</div>
<div class="promotion-stat-item" >
<div class="promotion-stat-item-title">订单数</div>
<div class="promotion-stat-item-value">{$info.order_num}</div>
</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">
<div class='promotion-view-list'>
<table id="promotion_list"></table>
</div>
</div>
</div>
<script type='text/html' id="promotion_list_item_box_html">
<div class="promotion-list-item-title">
<div class="promotion-list-item-title-icon">
<img src="{{ ns.img(d.sku_image) }}" alt="">
</div>
<p class="promotion-list-item-title-name multi-line-hiding">{{ d.sku_name }}</p>
</div>
</script>
<script>
var list = {:json_encode($info.sku_list, JSON_UNESCAPED_UNICODE)};
layui.use('table', function() {
new Table({
elem: '#promotion_list',
cols: [
[{
field: 'sku_name',
title: '商品名称',
width: '26%',
unresize: 'false',
templet: "#promotion_list_item_box_html"
}, {
title: '商品价格(元)',
unresize: 'false',
align: 'left',
width: '20%',
templet: function(data) {
return '¥' + data.price;
}
}
{if $info.pintuan_type == 'ordinary'}
, {
title: '拼团价格(元)',
unresize: 'false',
width: '20%',
templet: function(data) {
return '¥' + data.pintuan_price;
}
},
{if condition="$info.is_promotion == 1"}
{
title: '团长优惠价(元)',
unresize: 'false',
templet: function(data) {
return '¥' + data.promotion_price;
}
}
{/if}
{/if}
{if $info.pintuan_type == 'ladder'}
,{
title: '{$info.pintuan_num}人团(元)',
unresize: 'false',
width: '20%',
templet: function(data) {
return '¥' + data.pintuan_price;
}
},
{
title: '{$info.pintuan_num_2}人团(元)',
unresize: 'false',
templet: function(data) {
return '¥' + data.pintuan_price_2;
}
}
{if condition="$info.pintuan_num_3 > 0"}
,{
title: '{$info.pintuan_num_3}人团(元)',
unresize: 'false',
templet: function(data) {
return '¥' + data.pintuan_price_3;
}
}
{/if}
{/if}
]
],
data: list
});
});
</script>

View File

@@ -0,0 +1,758 @@
<style>
.layui-form-item .layui-input-inline.end-time{float: none;}
.goods_list .layui-table-body{max-height: 480px !important;}
.forbidden{cursor:not-allowed;background-color: #eee;}
.goods-title{display: flex;align-items: center;}
.goods-title .goods-img{display: flex;align-items: center;justify-content: center;width: 55px;height: 55px;margin-right: 5px;}
.goods-title .goods-img img{max-height: 100%;max-width: 100%;}
.goods-title .goods-name{flex: 1;line-height: 1.6;}
.form-wrap {position: relative;}
.examples {cursor: pointer; margin-left: 5px; line-height: 36px;}
.layui-carousel>[carousel-item]>* {background: #fff !important;}
.layui-carousel {position: absolute; top: 10px; left: 1330px; width: 300px !important; height: 610px !important; background: #fff;}
.ladder .layui-form-label + .layui-input-block {display: flex}
.ladder .layui-form-label + .layui-input-block .layui-form-mid.right {margin-left: 10px}
</style>
<div 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 type="text" name="pintuan_name" value="{$pintuan_info.data.pintuan_name}" lay-verify="required" autocomplete="off" class="layui-input len-long" maxlength="40">
</div>
<div class="word-aux">
<p>活动名称将显示在活动列表中,方便商家管理</p>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>活动时间:</label>
<div class="layui-inline">
<div class="layui-input-inline len-mid">
<input type="text" id="start_time" name="start_time" value="{:date('Y-m-d H:i:s', $pintuan_info.data.start_time)}" lay-verify="required" class="layui-input" autocomplete="off" readonly>
<i class=" iconrili iconfont calendar"></i>
</div>
<span class="layui-form-mid">-</span>
<div class="layui-input-inline len-mid end-time">
<input type="text" id="end_time" name="end_time" value="{:date('Y-m-d H:i:s', $pintuan_info.data.end_time)}" lay-verify="required|time" class="layui-input" autocomplete="off" readonly>
<input type="hidden" value="{$pintuan_info.data.end_time}" id="old_end_time">
<i class=" iconrili iconfont calendar"></i>
</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">拼团类型:</label>
<div class="layui-input-inline">
<input type="radio" name="pintuan_type" value="ordinary" disabled title="普通拼团" {if $pintuan_info.data.pintuan_type eq 'ordinary'}checked{/if} lay-filter="pintuan_type">
<input type="radio" name="pintuan_type" value="ladder" disabled title="阶梯拼团" {if $pintuan_info.data.pintuan_type eq 'ladder'}checked{/if} lay-filter="pintuan_type">
</div>
</div>
<div class="pintuan-type ordinary" {if $pintuan_info.data.pintuan_type neq 'ordinary'}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="number" name="pintuan_num" value="{$pintuan_info.data.pintuan_num}" lay-verify="required|sum" autocomplete="off" class="layui-input len-short">
</div>
<div class="word-aux">
<p>最少两人成团</p>
</div>
</div>
</div>
<div class="pintuan-type ladder" {if $pintuan_info.data.pintuan_type neq 'ladder'}style="display: none"{/if}>
<div class="layui-form-item pintuan-ladder">
<label class="layui-form-label"><span class="required">*</span>参团人数:</label>
<div class="layui-input-block">
<div class="layui-form-mid">第一级阶梯人数</div>
<input type="number" name="pintuan_num_1" disabled value="{$pintuan_info.data.pintuan_num}" lay-verify="required|ladderNum" autocomplete="off" class="layui-input len-short">
<div class="layui-form-mid right"></div>
</div>
</div>
<div class="layui-form-item pintuan-ladder">
<label class="layui-form-label"></label>
<div class="layui-input-block">
<div class="layui-form-mid">第二级阶梯人数</div>
<input type="number" name="pintuan_num_2" disabled value="{$pintuan_info.data.pintuan_num_2}" lay-verify="required|ladderNum" autocomplete="off" class="layui-input len-short">
<div class="layui-form-mid right"></div>
</div>
</div>
{if $pintuan_info.data.pintuan_num_3 > 0}
<div class="layui-form-item pintuan-ladder">
<label class="layui-form-label"></label>
<div class="layui-input-block">
<div class="layui-form-mid">第二级阶梯人数</div>
<input type="number" name="pintuan_num_3" disabled value="{$pintuan_info.data.pintuan_num_3}" lay-verify="required|ladderNum" autocomplete="off" class="layui-input len-short">
<div class="layui-form-mid right"></div>
</div>
</div>
{/if}
<div class="layui-form-item">
<label class="layui-form-label"></label>
<div class="layui-input-block">
<button class="layui-btn add-ladder">添加拼团阶梯</button>
</div>
<div class="word-aux">
<p>最少两人成团,最多支持三级阶梯</p>
</div>
</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 len-short">
<select class="pintuan-day"></select>
</div>
<div class="layui-form-mid"></div>
<div class="layui-input-inline len-short">
<select class="pintuan-hour"></select>
</div>
<div class="layui-form-mid"></div>
<div class="layui-input-inline len-short">
<select class="pintuan-minute"></select>
</div>
<div class="layui-form-mid"></div>
</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">
<input type="number" name="buy_num" value="{$pintuan_info.data.buy_num}" lay-verify="num" autocomplete="off" class="layui-input len-short">
</div>
<div class="word-aux">
<p>本次活动中一次最多可购买的商品数量</p>
</div>
</div>
<div class="layui-form-item pintuan-type ordinary" {if $pintuan_info.data.pintuan_type neq 'ordinary'}style="display: none"{/if}>
<label class="layui-form-label">团长优惠:</label>
<div class="layui-input-block">
<input type="checkbox" name="is_promotion" {$pintuan_info.data.is_promotion == 1 ? 'checked' : ''} value="{$pintuan_info.data.is_promotion}" title="团长享受优惠价" lay-skin="primary" lay-filter="is_promotion">
</div>
<div class="word-aux">
<p>开启团长(开团人)优惠后,团长将享受更优惠价格,有助于提高开团率和成团率</p>
</div>
</div>
<div class="layui-form-item goods_list">
<label class="layui-form-label">活动商品:</label>
<div class="layui-input-block">
<table id="selected_goods_list" lay-filter="selected_goods_list"></table>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">是否单独购买:</label>
<div class="layui-input-inline">
<input type="radio" name="is_single_buy" value="1" title="是" {$pintuan_info.data.is_single_buy == 1 ? 'checked' : ''}>
<input type="radio" name="is_single_buy" value="0" title="否" {$pintuan_info.data.is_single_buy == 0 ? 'checked' : ''}>
</div>
<a onclick="showDemo()" class="examples text-color">查看示例</a>
</div>
<div class="layui-form-item">
<label class="layui-form-label">是否虚拟成团:</label>
<div class="layui-input-inline">
<input type="radio" name="is_virtual_buy" value="1" title="是" {$pintuan_info.data.is_virtual_buy == 1 ? 'checked' : ''}>
<input type="radio" name="is_virtual_buy" value="0" title="否" {$pintuan_info.data.is_virtual_buy == 0 ? 'checked' : ''}>
</div>
</div>
<div class="layui-form-item layui-hide">
<label class="layui-form-label">是否推荐:</label>
<div class="layui-input-inline">
<input type="radio" name="is_recommend" value="1" title="是" {$pintuan_info.data.is_recommend == 1 ? 'checked' : ''}>
<input type="radio" name="is_recommend" value="0" title="否" {$pintuan_info.data.is_recommend == 0 ? 'checked' : ''}>
</div>
</div>
<div class="layui-form-item layui-form-text">
<label class="layui-form-label">活动规则:</label>
<div class="layui-input-inline">
<textarea name="remark" class="layui-textarea len-long" maxlength="300">{$pintuan_info.data.remark}</textarea>
</div>
</div>
<div class="form-row">
<button class="layui-btn" lay-submit lay-filter="save">保存</button>
<button class="layui-btn layui-btn-primary" onclick="backPintuanList()">返回</button>
</div>
<input type="hidden" name="pintuan_id" value="{$pintuan_info.data.pintuan_id}" />
<input type="hidden" class="pintuan-time" value="{$pintuan_info.data.pintuan_time}" />
<input type="hidden" name="goods_id" class="goods-id" value="{$pintuan_info.data.goods_id}" />
<input type="hidden" name="is_virtual_goods" class="is-virtual-goods" value="{$pintuan_info.data.is_virtual_goods}" />
<input type="hidden" class="start-time-pri" value="{$pintuan_info.data.start_time}" />
<input type="hidden" class="end-time-pri" value="{$pintuan_info.data.end_time}" />
<!-- <div class="layui-carousel" id="carousel">
<div carousel-item>
<img src="__STATIC__/img/pintuan.png" >
<img src="__STATIC__/img/pintuan_detail.png" >
</div>
</div>-->
</div>
<script type="text/html" id="toolbarOperation">
<button class="layui-btn layui-btn-primary" lay-event="pintuan-price">拼团价格</button>
</script>
<script type="text/html" id="toolbarOperationOne">
<button class="layui-btn layui-btn-primary" lay-event="pintuan-price">拼团价格</button>
<button class="layui-btn layui-btn-primary" lay-event="pintuan-discounts-price">团长优惠价</button>
</script>
<script>
var start_time_pri = ns.time_to_date($(".start-time-pri").val()),
end_time_pri = ns.time_to_date($(".end-time-pri").val());
var pintuan_time = $(".pintuan-time").val(), //总分钟数
day_time = pintuan_time / (24 * 60), //天数
houe_time = (pintuan_time % (24 * 60)) / 60, //小时
second_time = (pintuan_time % (24 * 60)) % 60; //分钟
var sku_list = [];
sku_list = {:json_encode($pintuan_info.data.sku_list, JSON_UNESCAPED_UNICODE)};
var pintuan_info = {:json_encode($pintuan_info.data,JSON_UNESCAPED_UNICODE)},is_promotion = 0;
sku_list.forEach(function (item,index) {
item.is_delete = item.pintuan_price ? 1 : 2;
});
var is_virtual = [];
layui.use(['form', 'laydate','carousel'], function() {
var form = layui.form,
laydate = layui.laydate,
repeat_flag = false,
minDate = "";
var carousel = layui.carousel;
carousel.render({
elem: '#carousel'
,width: '100%'
,arrow: 'always'
});
form.render();
renderTable(sku_list); // 初始化表格
for (var i = 0; i <= 30; i++) {
if (i < 10) {
if (i == day_time) {
var html = '<option value="' + i + '" selected>0' + i + '</option>';
} else {
var html = '<option value="' + i + '">0' + i + '</option>';
}
} else {
if (i == day_time) {
var html = '<option value="' + i + '" selected>' + i + '</option>';
} else {
var html = '<option value="' + i + '">' + i + '</option>';
}
}
$(".pintuan-day").append(html);
}
for (var i = 0; i <= 23; i++) {
if (i < 10) {
if (i == houe_time) {
var html = '<option value="' + i + '" selected>0' + i + '</option>';
} else {
var html = '<option value="' + i + '">0' + i + '</option>';
}
} else {
if (i == houe_time) {
var html = '<option value="' + i + '" selected>' + i + '</option>';
} else {
var html = '<option value="' + i + '">' + i + '</option>';
}
}
$(".pintuan-hour").append(html);
}
for (var i = 0; i <= 59; i++) {
if (i < 10) {
if (i == second_time) {
var html = '<option value="' + i + '" selected>0' + i + '</option>';
} else {
var html = '<option value="' + i + '">0' + i + '</option>';
}
} else {
if (i == second_time) {
var html = '<option value="' + i + '" selected>' + i + '</option>';
} else {
var html = '<option value="' + i + '">' + i + '</option>';
}
}
$(".pintuan-minute").append(html);
}
form.render('select');
var now_time = ((new Date()).getTime())/1000;
var start_time = ((new Date($("#start_time").val())).getTime())/1000;
var old_end_time = ((new Date($("#end_time").val())).getTime())/1000;
if(now_time <= start_time){
//开始时间
laydate.render({
elem: '#start_time', //指定元素
type: 'datetime',
value: start_time_pri,
done: function(value) {
minDate = value;
reRender();
}
});
}
if(now_time <= old_end_time){
//结束时间
laydate.render({
elem: '#end_time', //指定元素
type: 'datetime',
value: end_time_pri
});
}
/**
* 重新渲染结束时间
* */
function reRender() {
$("#end_time").remove();
$(".end-time").html('<input type="text" id="end_time" name="end_time" placeholder="请输入结束时间" lay-verify="required|time" class ="layui-input" autocomplete="off" readonly><i class=" iconrili iconfont calendar"></i> ');
laydate.render({
elem: '#end_time',
type: 'datetime',
min: minDate
});
}
/**
* 表单验证
*/
form.verify({
time: function(value) {
var now_time = ((new Date()).getTime())/1000;
var start_time = ((new Date($("#start_time").val())).getTime())/1000;
var end_time = ((new Date(value)).getTime())/1000;
var old_end_time = $("#old_end_time").val();
if(old_end_time > end_time){
return '结束时间不能小于之前设置的结束时间!'
}
if (now_time > end_time) {
return '结束时间不能小于当前时间!'
}
if (start_time > end_time) {
return '结束时间不能小于开始时间!';
}
},
num: function(value) {
if (value < 1 || value % 1 != 0) {
return '请输入大于0的正整数';
}
},
sum: function(value) {
if ($('[name="pintuan_type"]:checked').val() == 'ordinary') {
if (value < 2 || value % 1 != 0) {
return '参团人数不能小于2且必须是整数';
}
}
},
ladderNum: function(value, item){
if ($('[name="pintuan_type"]:checked').val() == 'ladder') {
if (value < 2 || value % 1 != 0) {
return '参团人数不能小于2且必须是整数';
}
var prevVal = $(item).parents('.pintuan-ladder').prev('.pintuan-ladder').find('input').val();
if (prevVal != undefined && parseInt(prevVal) >= parseInt(value)) {
return '参团人数不能小于等于上一个阶梯的人数';
}
}
},
pintuan_price: function(value, item) {
var price = $(item).parents("tr").find(".goods-price").text();
if (Number(value) > Number(price)) {
return '拼团价格不能大于商品价格';
}
if (value.trim() == "") {
return '拼团价格不能为空';
}
if (Number(value) <= 0) {
return '拼团价格必须大于0';
}
var arrMen = value.split(".");
var val = 0;
if (arrMen.length == 2) {
val = arrMen[1];
}
if (val.length > 2) {
return '拼团价格最多保留两位小数';
}
},
promotion_price: function(value, item) {
var price = $(item).parents("tr").find(".goods-price").text();
if (Number(value) > Number(price)) {
return '团长优惠价不能大于商品价格';
}
if (value.trim() == "") {
return '团长优惠价不能为空';
}
if (Number(value) <= 0) {
return '团长优惠价必须大于0';
}
var arrMen = value.split(".");
var val = 0;
if (arrMen.length == 2) {
val = arrMen[1];
}
if (val.length > 2) {
return '团长优惠价最多保留两位小数';
}
}
});
/**
* 监听团长优惠是否被选中
*/
form.on('checkbox(is_promotion)', function(data){
if (data.elem.checked) {
$(".team-leader").removeClass("layui-hide");
$(".goods-empty").attr("colspan", 4);
$("input[name='is_promotion']").val(1);
is_promotion = 1;
} else {
$(".team-leader").addClass("layui-hide");
$(".goods-empty").attr("colspan", 3);
$("input[name='is_promotion']").val(0);
is_promotion = 0;
}
renderTable(sku_list);
});
$('.add-ladder').click(function () {
if ($('.pintuan-ladder').length >= 3) {
layer.msg('最多添加三个阶梯');
return;
}
var h = `<div class="layui-form-item pintuan-ladder">
<label class="layui-form-label"></label>
<div class="layui-input-block">
<div class="layui-form-mid">第三级阶梯人数</div>
<input type="number" name="pintuan_num_3" value="" lay-verify="required|ladderNum" autocomplete="off" class="layui-input len-short">
<div class="layui-form-mid right">人</div>
<a href="javascript:;" class="text-color delete">删除</a>
</div>
</div>`;
$(this).parents('.layui-form-item').before(h);
renderTable(sku_list);
});
$('body').off('click', '.pintuan-ladder .delete').on('click', '.pintuan-ladder .delete', function () {
$(this).parents('.layui-form-item').remove();
renderTable(sku_list);
});
/**
* 监听提交
*/
form.on('submit(save)', function(data){
data.field.sku_ids = [];
data.field.goods_id = sku_list[0].goods_id;
sku_list.forEach(function (item,index) {
if (item.is_delete == 2) return false;
data.field.sku_ids.push(item.sku_id);
});
if (data.field.sku_ids.length == 0) {
layer.msg("请选择参与活动商品!", {icon: 5, anim: 6});
return;
}
var skuLisArr = [];
sku_list.forEach(function(item,index) {
var sku_detail = {};
sku_detail.sku_id = item.sku_id;
sku_detail.goods_id = item.goods_id;
sku_detail.pintuan_price = item.pintuan_price || 0;
sku_detail.pintuan_price_2 = item.pintuan_price_2 || 0;
sku_detail.pintuan_price_3 = item.pintuan_price_3 || 0;
sku_detail.promotion_price = item.promotion_price || 0;
sku_detail.is_delete = item.is_delete || 1;
skuLisArr.push(sku_detail);
});
data.field.sku_list = skuLisArr;
var day = $(".pintuan-day option:selected").text(),
hour = $(".pintuan-hour option:selected").text(),
minute = $(".pintuan-minute option:selected").text();
var pintuan_time = Number(day) * 24 * 60 + Number(hour) * 60 + Number(minute);
data.field.pintuan_time = pintuan_time;
var time = new Date(data.field.end_time).getTime() - new Date(data.field.start_time).getTime();
if (time < (pintuan_time * 60 * 1000)) {
layer.msg("拼团有效期不能大于活动时长!", {icon: 5, anim: 6});
return;
}
data.field.is_promotion = data.field.is_promotion == undefined ? 0 : 1;
if(repeat_flag) return;
repeat_flag = true;
$.ajax({
type: 'POST',
dataType: 'JSON',
url: ns.url("pintuan://shop/pintuan/edit"),
data: data.field,
async: false,
success: function(res){
repeat_flag = false;
if (res.code == 0) {
layer.confirm('编辑成功', {
title:'操作提示',
btn: ['返回列表', '继续操作'],
yes: function(index, layero) {
location.hash = ns.hash("pintuan://shop/pintuan/lists");
layer.close(index);
}
});
}else{
layer.msg(res.message);
}
}
})
});
});
// 表格渲染
function renderTable(sku_list) {
var cols = [[
{
width: "3%",
type: 'checkbox',
unresize: 'false'
},
{
field: 'sku_name',
title: '商品名称',
width: '30%',
unresize: 'false',
templet: function(data) {
var html = '';
html += ` <div class="goods-title">
<div class="goods-img">
<img layer-src src="${data.sku_image ? ns.img(data.sku_image) : ''}" alt="">
</div>
<p class="multi-line-hiding goods-name" data-goods_id="${data.goods_id}" data-sku_id="${data.sku_id}" title="${data.sku_name}">${data.sku_name}</p>
</div>`;
return html;
}
}, {
field: 'price',
title: '商品价格',
unresize: 'false',
align: 'right',
width: '15%',
templet: function(data) {
return '<p class="line-hiding" title="'+ data.price +'">¥<span class="goods-price">' + data.price +'</span ></p>';
}
}, {
title: '操作',
toolbar: '#operation ',
width: '7% ',
align: 'right',
unresize: 'false '
}]
];
if ($('[name="pintuan_type"]:checked').val() == 'ordinary') {
let col = [
{
title: '拼团价 (元)',
unresize: 'false ',
align: 'center',
templet: '#pintuan_price',
width: $('[name="is_promotion"]').is(':checked') ? '25%' : '45%'
}
];
if ($('[name="is_promotion"]').is(':checked')) {
col.push({
title: '团长价(元)',
unresize: 'false',
align: 'center',
templet: '#promotion_price',
width: '20%'
})
}
cols[0].splice(3, 0, ...col);
} else if ($('[name="pintuan_type"]:checked').val() == 'ladder') {
let col = [
{
title: '阶梯一 (元)',
unresize: 'false ',
align: 'center',
templet: '#pintuan_price',
width: $('.pintuan-ladder').length == 3 ? '15%' : '25%'
},
{
title: '阶梯二 (元)',
unresize: 'false ',
align: 'center',
templet: '#pintuan_price_2',
width: $('.pintuan-ladder').length == 3 ? '15%' : '20%'
}
];
if ($('.pintuan-ladder').length == 3) {
col.push({
title: '阶梯三 (元)',
unresize: 'false ',
align: 'center',
templet: '#pintuan_price_3',
width: '15%'
})
}
cols[0].splice(3, 0, ...col);
}
//展示已知数据
table = new Table({
elem: '#selected_goods_list',
page:false,
limit:Number.MAX_VALUE,
cols: cols,
data: sku_list,
toolbar: '#toolbarOperation'
});
/**
* 批量操作
*/
table.toolbar(function(obj) {
if (obj.data.length < 1) {
layer.msg('请选择要操作的数据');
return;
}
switch (obj.event) {
case "pintuan-price":
editInput(0,obj);
break;
case "pintuan-discounts-price":
editInput(1,obj);
break;
}
});
}
function editInput(textIndex=0,data) {
var text = [{
name: '拼团价格',
value: 'pintuan_price'
},{
name: '团长优惠价',
value: 'promotion_price'
}];
layer.open({
type: 1,
title:"修改"+text[textIndex].name,
area:['600px'],
btn:["保存","返回"],
content: `
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>${text[textIndex].name}</label>
<div class="layui-input-block">
<input type="text" name="bargain_edit_input" lay-verify="required" autocomplete="off" class="layui-input len-mid" placeholder="请输入${text[textIndex].name}">
</div>
</div>
`,
yes: function(index, layero){
var val = $("input[name='bargain_edit_input']").val();
if (!val){
layer.msg("请输入" + text[textIndex].name);
return false;
}
data.data.forEach(function (item,index) {
sku_list.forEach(function (skuItem,skuIndex) {
if (item.sku_id == skuItem.sku_id){
sku_list[skuIndex][text[textIndex].value] = val;
}
})
});
renderTable(sku_list);
layer.closeAll();
}
});
}
function bargainPintuanPrice(index,event,field) {
sku_list[index][field] = event.srcElement.value;
}
$("body").off("click",".no-participation").on("click",".no-participation",function(){
$(this).text("参与");
$(this).parents("tr").find("input").each(function (index,item) {
$(item).attr("readonly",true);
$(item).attr("disabled",true);
$(item).addClass("forbidden");
$(item).attr("lay-verify","");
});
$(this).addClass("participation").removeClass("no-participation");
sku_list[$(this).parents("tr").attr("data-index")].is_delete = 2;
});
$("body").off("click",".participation").on("click",".participation",function(){
$(this).text("不参与");
$(this).parents("tr").find("input").each(function (index,item) {
$(item).attr("readonly",false);
$(item).attr("disabled",false);
$(item).removeClass("forbidden");
if($(item).hasClass(".pintuan-price")){
$(item).attr("lay-verify","pintuan_price");
}else{
$(item).attr("lay-verify","promotion_price");
}
});
$(this).removeClass("participation").addClass("no-participation");
sku_list[$(this).parents("tr").attr("data-index")].is_delete = 1;
});
function backPintuanList() {
location.hash = ns.hash("pintuan://shop/pintuan/lists");
}
function showDemo(){
layer.open({
title: '查看示例',
type: 1,
area: ['600px', '660px'],
content: '<img style="margin:20px 45px;" src="__STATIC__/img/single_buy.png" >',
})
}
</script>
<script type="text/html" id="pintuan_price">
<input type="number" class="layui-input len-short pintuan-price" value="{{d.pintuan_price ? d.pintuan_price : '' }}" lay-verify="pintuan_price" min="0.00" oninput="bargainPintuanPrice({{ d.LAY_TABLE_INDEX }},event, 'pintuan_price')" onporpertychange="bargainPintuanPrice({{ d.LAY_TABLE_INDEX }},event, 'pintuan_price')"/>
</script>
<script type="text/html" id="pintuan_price_2">
<input type="number" class="layui-input len-short pintuan-price" value="{{d.pintuan_price_2 ? d.pintuan_price_2 : '' }}" lay-verify="pintuan_price" min="0.00" oninput="bargainPintuanPrice({{ d.LAY_TABLE_INDEX }},event, 'pintuan_price_2')" onporpertychange="bargainPintuanPrice({{ d.LAY_TABLE_INDEX }},event, 'pintuan_price_2')"/>
</script>
<script type="text/html" id="pintuan_price_3">
<input type="number" class="layui-input len-short pintuan-price" value="{{d.pintuan_price_3 ? d.pintuan_price_3 : '' }}" lay-verify="pintuan_price" min="0.00" oninput="bargainPintuanPrice({{ d.LAY_TABLE_INDEX }},event, 'pintuan_price_3')" onporpertychange="bargainPintuanPrice({{ d.LAY_TABLE_INDEX }},event, 'pintuan_price_3')"/>
</script>
<script type="text/html" id="promotion_price">
<input type="number" class="layui-input len-short promotion-price" value="{{d.promotion_price ? d.promotion_price : '' }}" lay-verify="promotion_price" min="0.00" oninput="bargainPintuanPrice({{ d.LAY_TABLE_INDEX }},event, 'promotion_price')" onporpertychange="bargainPintuanPrice({{ d.LAY_TABLE_INDEX }},event, 'promotion_price')"/>
</script>
<script type="text/html" id="operation">
<div class="table-btn">
{{# if(!d.pintuan_price){ }}
<a class="layui-btn participation">参与</a>
{{# }else{ }}
<a class="layui-btn no-participation">不参与</a>
{{# } }}
</div>
</script>

View File

@@ -0,0 +1,242 @@
<style>
.layui-layout-admin .layui-form-item .layui-input-inline{background-color: #fff;}
.layui-layout-admin .screen{margin-bottom: 15px;}
</style>
{if condition="$pintuan_id"}
<input type="hidden" class="pintuan-id" value="{$pintuan_id}" />
{else/}
<input type="hidden" class="pintuan-id" value="" />
{/if}
<div class="screen layui-collapse" lay-filter="selection_panel">
<div class="layui-colla-item">
<form class="layui-form layui-colla-content layui-form layui-show" lay-filter="order_list">
<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="goods_name">
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">团长昵称:</label>
<div class="layui-input-inline">
<input type="text" class="layui-input" name="nickname">
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">拼团状态:</label>
<div class="layui-input-inline">
<select name="status" lay-filter="status">
<option value="">全部</option>
<option value="3">拼团成功</option>
<option value="2">组团中</option>
<option value="1">拼团失败</option>
</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" lay-submit lay-filter="search">筛选</button>
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
</div>
</form>
</div>
</div>
<table id="team_list" lay-filter="team_list"></table>
<!-- 商品 -->
<script type="text/html" id="goods">
<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" title="{{d.goods_name}}">{{d.goods_name}}</a>
</div>
</div>
</script>
<!-- 会员 -->
<script type="text/html" id="member_info">
<div class="table-title">
<div class="title-pic">
{{# if(d.headimg){ }}
<img layer-src src="{{ns.img(d.headimg)}}"/>
{{# } }}
</div>
<div class="title-content">
<a href="javascript:;" class="multi-line-hiding text-color-sub" title="{{d.nickname}}">{{d.nickname}}</a>
</div>
</div>
</script>
<!-- 状态 -->
<script type="text/html" id="status">
{{# if(d.status == 1){ }}
拼团失败
{{# }else if(d.status == 2){ }}
组团中
{{# }else if(d.status == 3){ }}
拼团成功
{{# } }}
</script>
<!-- 操作 -->
<script type="text/html" id="operation">
<div class="table-btn">
<a class="layui-btn" lay-event="check">详情</a>
</div>
</script>
<script>
layui.use(['form', 'element', 'laydate'], function() {
var table,
form = layui.form,
laydate = layui.laydate;
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");
}
});
table = new Table({
elem: '#team_list',
url: ns.url("pintuan://shop/pintuan/group"),
where: {
"pintuan_id": $(".pintuan-id").val()
},
cols: [
[ {
title: '团长信息',
unresize: 'false',
width: '17%',
templet: '#member_info'
},{
title: '拼团商品',
unresize: 'false',
width: '22%',
templet: '#goods'
}, {
title: '开团时间',
unresize: 'false',
width: '15%',
templet:function(data){
return ns.time_to_date(data.create_time);
}
}, {
title: '成团人数/当前人数',
unresize: 'false',
width: '10%',
templet: function(data) {
return data.pintuan_num + ' / ' + data.pintuan_count;
}
}, {
title: '结束时间',
unresize: 'false',
width: '15%',
templet: function(data) {
return ns.time_to_date(data.end_time);
}
}, {
title: '拼团状态',
unresize: 'false',
width: '10%',
templet: '#status'
}, {
title: '操作',
toolbar: '#operation',
unresize: 'false',
align:'right'
}]
],
});
/**
* 监听工具栏操作
*/
table.tool(function(obj) {
var data = obj.data;
switch (obj.event) {
case 'check': //查看
location.hash = ns.hash("pintuan://shop/pintuan/grouporder?group_id="+ data.group_id);
break;
}
});
//监听筛选事件
form.on('submit(search)', function(data) {
table.reload({
page: {
curr: 1
},
where: data.field
});
return false;
});
});
function datePick(date_num,event_obj){
$(".date-picker-btn").removeClass("selected");
$(event_obj).addClass('selected');
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 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>

View File

@@ -0,0 +1,193 @@
<style>
.layui-table[lay-skin=line] {margin-top: 15px; border-width: 0;}
.title-pic {
flex-shrink: 0;
display: inline-block;
width: 50px;
height: 50px;
text-align: center;
line-height: 50px;
margin-left: 5px;
}
</style>
<div class="layui-form tips-wrap">
<div class="layui-form-item">
<label class="layui-form-label">团长信息:</label>
<div class="table-title layui-input-inline">
<div class="title-pic">
<img layer-src src="{:img($info['headimg'])}"/>
</div>
<div class="title-content">
<a href="javascript:;" class="multi-line-hiding text-color" title="{$info['nickname']}">{$info['nickname']}</a>
</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">商品信息:</label>
<div class="table-title layui-input-inline">
<div class="title-pic">
<img layer-src src="{:img($info['sku_image'])}"/>
</div>
<div class="title-content">
<a href="javascript:;" class="multi-line-hiding text-color" title="{$info['sku_name']}">{$info['sku_name']}</a>
</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">拼团价格:</label>
<div class="layui-input-inline">¥{$info.pintuan_price}</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">开团时间:</label>
<div class="layui-input-inline">{:time_to_date($info.create_time)}</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">成团人数/当前人数:</label>
<div class="layui-input-inline">{$info.pintuan_num} / {$info.pintuan_count}</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">是否虚拟成团:</label>
<div class="layui-input-inline">{if $info.is_virtual_buy == 1} 是 {else/} 否 {/if}</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">结束时间:</label>
<div class="layui-input-inline">{:time_to_date($info.end_time)}</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">拼团状态:</label>
<div class="layui-input-inline">
{if $info.status == 1}
拼团失败
{elseif $info.status == 2}
组团中
{else/}
拼团成功
{/if}
</div>
</div>
</div>
<!-- 列表 -->
<table id="order_list" lay-filter="order_list"></table>
<!-- 参与人 -->
<script type="text/html" id="member_info">
<div class="table-title">
<div class="title-pic">
{{# if(d.member_img){ }}
<img layer-src src="{{ns.img(d.member_img)}}"/>
{{# } }}
</div>
<div class="title-content">
<a href="javascript:;" class="multi-line-hiding text-color" title="{{d.nickname}}">{{d.nickname}}</a>
</div>
</div>
</script>
<!-- 商品 -->
<script type="text/html" id="goods">
<div class="table-title">
<div class="title-pic">
{{# if(d.sku_image){ }}
<img layer-src src="{{ns.img(d.sku_image.split(',')[0],'small')}}"/>
{{# } }}
</div>
<div class="title-content">
<a href="javascript:;" class="multi-line-hiding text-color">{{d.sku_name}}</a>
</div>
</div>
</script>
<!-- 信息标签 -->
<script type="text/html" id="information">
<p class="layui-elip">支付方式{{d.pay_type_name}}</p>
<p class="layui-elip">来源{{d.order_from_name}}</p>
</script>
<!-- 余额标签 -->
<script type="text/html" id="money">
<p class="layui-elip">{{d.order_money}}</p>
</script>
<!-- 操作 -->
<script type="text/html" id="operation">
<a class="layui-btn" lay-event="check">详情</a>
</script>
<script>
var group_id = "{$group_id}";
layui.use(['form'], function() {
var table, form = layui.form;
form.render();
table = new Table({
elem: '#order_list',
url: ns.url("pintuan://shop/pintuan/groupOrder"),
where: {
"group_id": group_id
},
cols: [
[{
title: '参与人',
unresize: 'false',
width: '15%',
templet:'#member_info'
},{
field: 'order_no',
title: '订单号',
unresize: 'false',
width: '10%',
}, {
title: '商品信息',
unresize: 'false',
width: '20%',
templet:'#goods'
}, {
title: '下单时间',
unresize: 'false',
width: '17%',
templet: function(data) {
return ns.time_to_date(data.pay_time);
}
}, {
title: '下单金额',
unresize: 'false',
width: '10%',
templet: '#money'
}, {
field: 'order_status_name',
title: '订单状态',
unresize: 'false',
width: '8%'
}, {
title: '操作',
toolbar: '#operation',
align: 'right',
unresize: 'false',
}]
],
});
/**
* 监听工具栏操作
*/
table.tool(function(obj) {
var data = obj.data;
switch (obj.event) {
case 'check': //查看
var newWin = window.open('about:blank');
newWin.location.href = ns.href("shop/order/detail", {"order_id": data.order_id});
break;
}
});
});
</script>

View File

@@ -0,0 +1,504 @@
<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;}
.sku-list {overflow: hidden;padding: 0 45px;}
.sku-list li .img-wrap {vertical-align: middle;margin-right: 8px;width: 20%;height: 80px;text-align: center;line-height: 70px;}
.sku-list li .img-wrap img {max-width: 100%;max-height: 100%;}
.sku-list li .info-wrap span.sku-name {-webkit-line-clamp: 2;margin-bottom: 5px;}
.sku-list li .info-wrap span {display: -webkit-box;margin-bottom: 5px;overflow: hidden;text-overflow: ellipsis;white-space: normal;word-break: break-all;-webkit-box-orient: vertical;-webkit-line-clamp: 1;}
.sku-list li {float: left;display: flex;padding: 10px;margin-right: 10px;margin-bottom: 10px;border: 1px solid #EFEFEF;width: 294px;height: 110px;align-items: center;}
.body-content {padding-top: 15px!important;}
.layui-layout-admin .layui-form-item .layui-input-inline{background-color: #fff;}
</style>
<!-- 按钮容器 -->
<div class="single-filter-box">
<button class="layui-btn" onclick="add()">添加拼团商品</button>
</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="goods_name" placeholder="请输入商品名称" autocomplete="off" class="layui-input">
</div>
</div>
<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>
</div>
</div>
<div class="form-row">
<button type="button" class="layui-btn" lay-filter="search" lay-submit>筛选</button>
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
</div>
</form>
</div>
</div>
<div class="layui-tab table-tab" lay-filter="pintuan_tab">
<ul class="layui-tab-title">
<li class="layui-this" lay-id="">全部</li>
<li lay-id="6">未开始</li>
<li lay-id="1">进行中</li>
<li lay-id="2">已结束</li>
<li lay-id="3">已关闭</li>
</ul>
<div class="layui-tab-content">
<!-- 列表 -->
<table id="pintuan_list" lay-filter="pintuan_list"></table>
</div>
</div>
<!-- 推广 -->
{include file="app/shop/view/component/promote_show.html"}
<!-- 商品 -->
<script type="text/html" id="goods">
<div class="table-title">
<div class="contraction" data-id="{{d.pintuan_id}}" data-open="0">
<span>+</span>
</div>
<div class="title-pic">
{{# if(d.goods_image){ }}
<img layer-src="{{ns.img(d.goods_image.split(',')[0],'big')}}" 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 id="time" type="text/html">
<div class="layui-elip">开始时间{{ns.time_to_date(d.start_time)}}</div>
<div class="layui-elip">结束时间{{ns.time_to_date(d.end_time)}}</div>
</script>
<!-- 状态 -->
<script type="text/html" id="status">
{{# if(d.status == 0){ }}
未开始
{{# }else if(d.status == 1){ }}
进行中
{{# }else if(d.status == 2){ }}
已结束
{{# }else if(d.status == 3){ }}
已关闭
{{# } }}
</script>
<!-- 操作 -->
<script type="text/html" id="operation">
<div class="operation-wrap" data-pintuan-id="{{d.pintuan_id}}">
<div class="popup-qrcode-wrap" style="display: none"><img class="popup-qrcode-loadimg" src="__STATIC__/loading/loading.gif"/></div>
<div class="table-btn">
{{# if(d.status == 1){ }}
<a class="layui-btn text-color" lay-event="select">推广</a>
{{# } }}
<a class="layui-btn" lay-event="detail">详情</a>
<a class="layui-btn" lay-event="edit">编辑</a>
{{# if(d.status == 0){ }}
<a class="layui-btn" lay-event="delete">删除</a>
{{# }else if(d.status == 1){ }}
<a class="layui-btn" lay-event="team">拼团列表</a>
<a class="layui-btn" lay-event="invalid">关闭</a>
{{# }else if(d.status == 2){ }}
<a class="layui-btn" lay-event="team">拼团列表</a>
<a class="layui-btn" lay-event="delete">删除</a>
{{# }else if(d.status == 3){ }}
<a class="layui-btn" lay-event="delete">删除</a>
{{# } }}
</div>
</div>
</script>
<!-- 批量操作 -->
<script type="text/html" id="toolbarOperation">
<button class="layui-btn layui-btn-primary" lay-event="delete">批量删除</button>
<button class="layui-btn layui-btn-primary" lay-event="invalid">批量关闭</button>
</script>
<!-- 商品sku -->
<script type="text/html" id="skuList">
<tr class="js-list-{{d.index}}" id="sku_img_{{d.index}}">
<td colspan="9">
<ul class="sku-list">
{{# for(var i=0; i<d.list.length; i++){ }}
<li>
<div class="img-wrap">
<img layer-src src="{{ns.img(d.list[i].sku_image)}}">
</div>
<div class="info-wrap">
<span class="sku-name" title="{{d.list[i].sku_name}}">{{d.list[i].sku_name}}</span>
<span class="price">商品价格{{d.list[i].price}}</span>
<span class="price">拼团价{{d.list[i].pintuan_price}}</span>
</div>
</li>
{{# } }}
</ul>
</td>
</tr>
</script>
<script>
var laytpl;
$(function () {
$("body").off("click", ".contraction").on("click", ".contraction", function () {
var pintuan_id = $(this).attr("data-id");
var open = $(this).attr("data-open");
var tr = $(this).parent().parent().parent().parent();
var index = tr.attr("data-index");
if (open == 1) {
$(this).children("span").text("+");
$(".js-list-" + index).remove();
} else {
$(this).children("span").text("-");
$.ajax({
url: ns.url("pintuan://shop/pintuan/getSkuList"),
data: {pintuan_id: pintuan_id},
dataType: 'JSON',
type: 'POST',
async: false,
success: function (res) {
var sku_list = $("#skuList").html();
var data = {
list: res.data,
index: index
};
laytpl(sku_list).render(data, function (html) {
tr.after(html);
});
layer.photos({
photos: '.img-wrap',
anim: 5
});
}
});
}
$(this).attr("data-open", (open == 0 ? 1 : 0));
});
layui.use(['form', 'element','laytpl', 'laydate'], function () {
laytpl = layui.laytpl;
var table,
form = layui.form,
laydate = layui.laydate,
element = layui.element,
pingtuanAll = [],
repeat_flag = false; //防重复标识
form.render();
//开始时间
laydate.render({
elem: '#start_time', //指定元素
type: 'datetime'
});
//结束时间
laydate.render({
elem: '#end_time', //指定元素
type: 'datetime'
});
element.on('tab(pintuan_tab)', function () {
table.reload({
page: {
curr: 1
},
where: {
'status': this.getAttribute('lay-id')
}
});
});
table = new Table({
elem: '#pintuan_list',
url: ns.url("pintuan://shop/pintuan/lists"),
cols: [
[{
type: 'checkbox',
width: '3%',
}, {
title: '拼团商品',
unresize: 'false',
width: '20%',
templet: '#goods'
}, {
title: '商品价格',
unresize: 'false',
width: '8%',
templet: function (data) {
return '¥' + data.price;
}
}, {
field:'pintuan_price',
title: '拼团价格',
unresize: 'false',
width: '8%',
sort:true,
templet: function (data) {
return '¥' + data.pintuan_price;
}
}, {
field: 'group_num',
title: '开团组数',
unresize: 'false',
sort:true,
width: '8%'
}, {
field: 'success_group_num',
title: '成团组数',
unresize: 'false',
sort:true,
width: '8%'
}, {
field: 'order_num',
title: '购买人数',
unresize: 'false',
sort:true,
width: '8%'
}, {
title: '活动时间',
unresize: 'false',
width: '15%',
templet: '#time'
}, {
title: '状态',
unresize: 'false',
width: '8%',
templet: '#status'
}, {
title: '操作',
toolbar: '#operation',
unresize: 'false',
align:'right'
}]
],
toolbar: '#toolbarOperation',
});
table.on("sort",function (obj) {
table.reload({
page: {
curr: 1
},
where: {
order:obj.field,
sort:obj.type
}
});
});
// 监听工具栏操作
table.toolbar(function (obj) {
var data = obj.data;
switch (obj.event) {
case 'delete':
deletePintuanAll(data)
break;
case 'invalid':
invalidPintuanAll(data)
break;
}
})
//批量关闭
function invalidPintuanAll(data){
if(data.length <= 0) return;
var pintuanIdAll = [];
for (var i in data){
pintuanIdAll.push(data[i].pintuan_id);
}
layer.confirm('确定要关闭拼团活动吗?', function (index) {
if (repeat_flag) return;
repeat_flag = true;
layer.close(index);
$.ajax({
url: ns.url("pintuan://shop/pintuan/invalidAll"),
data: {
pintuan_id: pintuanIdAll
},
dataType: 'JSON',
type: 'POST',
success: function (res) {
layer.msg(res.message);
repeat_flag = false;
table.reload();
}
});
}, function () {
layer.close();
repeat_flag = false;
});
}
//批量删除
function deletePintuanAll(data){
if(data.length <= 0) return;
var pintuanIdAll = [];
for (var i in data){
pintuanIdAll.push(data[i].pintuan_id);
}
layer.confirm('确定要删除拼团活动吗?', function (index) {
if (repeat_flag) return;
repeat_flag = true;
layer.close(index);
$.ajax({
url: ns.url("pintuan://shop/pintuan/deleteAll"),
data: {
pintuan_id: pintuanIdAll
},
dataType: 'JSON',
type: 'POST',
success: function (res) {
layer.msg(res.message);
repeat_flag = false;
table.reload({
page: {
curr: 1
},
});
}
});
}, function () {
layer.close();
repeat_flag = false;
});
}
/**
* 搜索功能
*/
form.on('submit(search)', function (data) {
table.reload({
page: {
curr: 1
},
where: data.field
});
});
/**
* 监听工具栏操作
*/
table.tool(function (obj) {
var data = obj.data;
switch (obj.event) {
case 'edit': //编辑
location.hash = ns.hash("pintuan://shop/pintuan/edit", {"pintuan_id": data.pintuan_id});
break;
case 'detail': //详情
location.hash = ns.hash("pintuan://shop/pintuan/detail", {"pintuan_id": data.pintuan_id});
break;
case 'team': //开团团队
location.hash = ns.hash("pintuan://shop/pintuan/group", {"pintuan_id": data.pintuan_id});
break;
case 'delete': //删除
deletePintuan(data.pintuan_id);
break;
case 'select': //推广
pintuanUrl(data);
break;
case 'invalid': //使失效
invalidPintuan(data.pintuan_id);
break;
}
});
/**
* 删除
*/
function deletePintuan(pintuan_id) {
layer.confirm('确定要删除该拼团活动吗?', function (index) {
if (repeat_flag) return;
repeat_flag = true;
layer.close(index);
$.ajax({
url: ns.url("pintuan://shop/pintuan/delete"),
data: {
pintuan_id: pintuan_id
},
dataType: 'JSON',
type: 'POST',
success: function (res) {
layer.msg(res.message);
repeat_flag = false;
if (res.code == 0) {
table.reload();
}
}
});
}, function () {
layer.close();
repeat_flag = false;
});
}
//使失效
function invalidPintuan(pintuan_id) {
layer.confirm('确定要关闭拼团活动吗?', function (index) {
if (repeat_flag) return;
repeat_flag = true;
layer.close(index);
$.ajax({
url: ns.url("pintuan://shop/pintuan/invalid"),
data: {
pintuan_id: pintuan_id
},
dataType: 'JSON',
type: 'POST',
success: function (res) {
layer.msg(res.message);
repeat_flag = false;
if (res.code == 0) {
table.reload({
page: {
curr: 1
},
});
}
}
});
}, function () {
layer.close();
repeat_flag = false;
});
}
function pintuanUrl(data){
new PromoteShow({
url:ns.url("pintuan://shop/pintuan/pintuanUrl"),
param:{pintuan_id:data.pintuan_id},
})
}
});
});
function add() {
location.hash = ns.hash("pintuan://shop/pintuan/add");
}
</script>

Binary file not shown.

After

Width:  |  Height:  |  Size: 152 KiB