初始上传

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,353 @@
<?php
/**
* Niushop商城系统 - 团队十年电商经验汇集巨献!
* =========================================================
* Copy right 2019-2029 杭州牛之云科技有限公司, 保留所有权利。
* ----------------------------------------------
* 官方网址: https://www.niushop.com
* =========================================================
*/
namespace addon\bargain\shop\controller;
use addon\bargain\model\Bargain as BargainModel;
class Bargain extends BaseController
{
/*
* 砍价商品列表
*/
public function lists()
{
$model = new BargainModel();
$condition = [
[ 'pb.site_id', '=', $this->site_id ],
[ 'g.goods_state', '=', 1 ],
[ 'g.is_delete', '=', 0 ]
];
//获取续签信息
if (request()->isJson()) {
$page = input('page', 1);
$page_size = input('page_size', PAGE_LIST_ROWS);
$status = input('status', '');//砍价状态
if ($status !== '') {
$condition[] = [ 'pb.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[] = [ 'pb.end_time', '>=', date_to_time($start_time) ];
} elseif (!$start_time && $end_time) {
$condition[] = [ 'pb.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 = "pb.start_time between {$start_timestamp} and {$end_timestamp}";
$sql .= " or pb.end_time between {$start_timestamp} and {$end_timestamp}";
$sql .= " or (pb.start_time <= {$start_timestamp} and pb.end_time >= {$end_timestamp})";
$condition[] = [ '', 'exp', \think\facade\Db::raw($sql) ];
}
//排序
$order = input('order', 'create_time');
$sort = input('sort', 'desc');
if (!empty($sort)) {
$order_by = 'pb.' . $order . ' ' . $sort;
} else {
$order_by = 'pb.create_time desc';
}
$list = $model->getBargainPageList($condition, $page, $page_size, $order_by);
return $list;
} else {
$bargain_status = $model->getBargainStatus();
$this->assign('bargain_status', $bargain_status[ 'data' ]);
return $this->fetch('bargain/lists');
}
}
/**
* 添加活动
*/
public function add()
{
if (request()->isJson()) {
$common_data = [
'site_id' => $this->site_id,
'bargain_name' => input('bargain_name', ''),
'is_fenxiao' => input('is_fenxiao', ''),
'buy_type' => input('buy_type', ''),
'bargain_type' => input('bargain_type', ''),
'bargain_num' => input('bargain_num', ''),
'bargain_time' => input('bargain_time', ''),
'remark' => input('remark', ''),
'is_own' => input('is_own', ''),
'start_time' => strtotime(input('start_time', '')),
'end_time' => strtotime(input('end_time', '')),
'is_differ_new_user' => input('is_differ_new_user', 0),
'distinguish' => input('distinguish', 1),
'new_low' => input('new_low', ''),
'aged_tall' => input('aged_tall'),
'aged_fixation' => input('aged_fixation'),
'bargain_max_num' => input('bargain_max_num', 0),
'help_bargain_num' => input('help_bargain_num', 0),
];
$goods = [
'goods_ids' => input('goods_ids', ''),
'sku_ids' => input('sku_ids', ''),
];
$sku_list = input('sku_list', '');
$bargain_model = new BargainModel();
return $bargain_model->addBargain($common_data, $goods, $sku_list);
} else {
$bargain_name = '砍价 ' . date('Y-m-d');
$this->assign('bargain_name', $bargain_name);
return $this->fetch('bargain/add');
}
}
/**
* 编辑活动
*/
public function edit()
{
$bargain_model = new BargainModel();
$bargain_id = input('bargain_id', '');
if (request()->isJson()) {
$common_data = [
'bargain_id' => $bargain_id,
'site_id' => $this->site_id,
'bargain_name' => input('bargain_name', ''),
'is_fenxiao' => input('is_fenxiao', ''),
'buy_type' => input('buy_type', ''),
'bargain_type' => input('bargain_type', ''),
'bargain_num' => input('bargain_num', ''),
'bargain_time' => input('bargain_time', ''),
'remark' => input('remark', ''),
'is_own' => input('is_own', ''),
'start_time' => strtotime(input('start_time', '')),
'end_time' => strtotime(input('end_time', '')),
'is_differ_new_user' => input('is_differ_new_user', 0),
'distinguish' => input('distinguish', 1),
'new_low' => input('new_low', ''),
'aged_tall' => input('aged_tall'),
'aged_fixation' => input('aged_fixation'),
'bargain_max_num' => input('bargain_max_num', 0),
'help_bargain_num' => input('help_bargain_num', 0),
];
$sku_list = input('sku_list', '');
$goods = [
'goods_id' => input('goods_id', ''),
'sku_ids' => input('sku_ids', ''),
];
return $bargain_model->editBargain($common_data, $goods, $sku_list);
} else {
//获取砍价信息
$condition = [
[ 'pb.bargain_id', '=', $bargain_id ],
[ 'pb.site_id', '=', $this->site_id ],
[ 'g.goods_state', '=', 1 ],
[ 'g.is_delete', '=', 0 ]
];
$bargain_info = $bargain_model->getBargainInfo($condition);
if (empty($bargain_info[ 'data' ])) $this->error('未获取到活动数据', href_url('bargain://shop/bargain/lists'));
$this->assign('bargain_info', $bargain_info[ 'data' ]);
return $this->fetch('bargain/edit');
}
}
/*
* 砍价详情
*/
public function detail()
{
$bargain_model = new BargainModel();
$bargain_id = input('bargain_id', '');
//获取砍价信息
$condition = [
[ 'pb.bargain_id', '=', $bargain_id ],
[ 'pb.site_id', '=', $this->site_id ],
[ 'g.goods_state', '=', 1 ],
[ 'g.is_delete', '=', 0 ]
];
$bargain_info = $bargain_model->getBargainJoinGoodsList($condition);
if (empty($bargain_info[ 'data' ])) $this->error('未获取到活动数据', href_url('bargain://shop/bargain/lists'));
$this->assign('bargain_info', $bargain_info[ 'data' ]);
return $this->fetch('bargain/detail');
}
/*
* 删除砍价活动
*/
public function delete()
{
$bargain_id = input('bargain_id', '');
$bargain_model = new BargainModel();
return $bargain_model->deleteBargain($bargain_id, $this->site_id);
}
/*
* 结束砍价活动
*/
public function finish()
{
$bargain_id = input('bargain_id', '');
$bargain_model = new BargainModel();
return $bargain_model->finishBargain($bargain_id, $this->site_id);
}
/**
* 获取商品列表
* @return array
*/
public function getSkuList()
{
if (request()->isJson()) {
$bargain_model = new BargainModel();
$bargain_id = input('bargain_id', '');
$bargain_info = $bargain_model->getBargainGoodsList($bargain_id, $this->site_id);
return $bargain_info;
}
}
/**
* 砍价列表
*/
public function launchList()
{
$bargain_id = input('bargain_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);
$bargain_model = new BargainModel();
$condition = [
[ 'site_id', '=', $this->site_id ]
];
if ($bargain_id) {
$condition[] = [ 'bargain_id', '=', $bargain_id ];
}
if ($status !== '') {
$condition[] = [ 'status', '=', $status ];
}
if ($goods_name) {
$condition[] = [ 'sku_name', 'like', '%' . $goods_name . '%' ];
}
if ($nickname) {
$condition[] = [ 'nickname', 'like', '%' . $nickname . '%' ];
}
if ($start_time && !$end_time) {
$condition[] = [ 'start_time', '>=', date_to_time($start_time) ];
} elseif (!$start_time && $end_time) {
$condition[] = [ 'start_time', '<=', date_to_time($end_time) ];
} elseif ($start_time && $end_time) {
$condition[] = [ 'start_time', 'between', [ date_to_time($start_time), date_to_time($end_time) ] ];
}
$list = $bargain_model->getBargainLaunchPageListInAdmin($condition, '', 'launch_id desc', $page, $page_size);
return $list;
} else {
$this->assign('bargain_id', $bargain_id);
return $this->fetch('bargain/launch_list');
}
}
/**
* 帮砍记录
* @return mixed
*/
public function launchDetail()
{
$launch_id = input('launch_id', '');
$bargain_model = new BargainModel();
if (request()->isJson()) {
$page = input('page', 1);
$page_size = input('page_size', PAGE_LIST_ROWS);
$condition = [ [ 'launch_id', '=', $launch_id ] ];
$list = $bargain_model->getBargainRecordPageList($condition, '', 'id desc', $page, $page_size);
return $list;
} else {
$this->assign('launch_id', $launch_id);
//获取发起人信息
$info = $bargain_model->getBargainLaunchDetail([ [ 'launch_id', '=', $launch_id ], [ 'site_id', '=', $this->site_id ] ]);
if (empty($info[ 'data' ])) $this->error('未获取到活动数据', href_url('bargain://shop/bargain/launchlist'));
$this->assign('info', $info[ 'data' ]);
return $this->fetch('bargain/launch_detail');
}
}
/**
* 砍价推广
*/
public function bargainUrl()
{
$bargain_id = input('bargain_id', '');
$app_type = input('app_type', 'all');
$bargain_model = new BargainModel();
$res = $bargain_model->urlQrcode('/pages_promotion/bargain/detail', [ 'b_id' => $bargain_id ], 'bargain', $app_type, $this->site_id);
return $res;
}
/**
* 批量删除
* @return array
*/
public function deleteAll()
{
$bargain_id = input('bargain_id', '');
$bargain_model = new BargainModel();
foreach ($bargain_id as $k => $v){
$res = $bargain_model->deleteBargain($v, $this->site_id);
}
return $res;
}
/**
* 批量关闭
* @return array
*/
public function finishAll()
{
$bargain_id = input('bargain_id', '');
$bargain_model = new BargainModel();
foreach ($bargain_id as $k => $v){
$res = $bargain_model->finishBargain($v, $this->site_id);
}
return $res;
}
}

View File

@@ -0,0 +1,30 @@
<?php
/**
* Niushop商城系统 - 团队十年电商经验汇集巨献!
* =========================================================
* Copy right 2019-2029 杭州牛之云科技有限公司, 保留所有权利。
* ----------------------------------------------
* 官方网址: https://www.niushop.com
* =========================================================
*/
namespace addon\bargain\shop\controller;
use app\shop\controller\BaseShop;
use think\App;
class BaseController extends BaseShop
{
public function __construct(App $app = null)
{
$this->replace = [
'SHOP_ADDON_CSS' => __ROOT__ . '/addon/bargain/shop/view/public/css',
'SHOP_ADDON_IMG' => __ROOT__ . '/addon/bargain/shop/view/public/img',
'SHOP_ADDON_JS' => __ROOT__ . '/addon/bargain/shop/view/public/js',
];
//执行父类构造函数
parent::__construct($app);
}
}

View File

@@ -0,0 +1,729 @@
<style>
.len-input {width: 100%;max-width: 120px;}
.layui-form-item .layui-input-inline.end-time{float: none;}
.desc{margin-bottom: 15px;border:1px dashed #ff8143;padding: 5px 10px;background: #fff0e9;color: #ff8143;width: 65%;}
.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;}
.layui-carousel { position: absolute; top: 90px; left: 1350px; background: #fff;}
.goods_num {padding-left: 20px;}
</style>
<div class="layui-form form-wrap">
<div class="desc">
请自觉遵守微信关于规范外部链接内容管理的规范,防止由于微信封号导致不必要的损失。<a href="http://weixin.qq.com/cgi-bin/readtemplate?t=weixin_external_links_content_management_specification" target="_blank">点击查看详情</a>
</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="bargain_name" value="{$bargain_name}" lay-verify="required" autocomplete="off" class="layui-input len-long" maxlength="40">
</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"><span class="required">*</span>砍价有效期:</label>
<div class="layui-input-block">
<div class="layui-input-inline len-short">
<input type="number" name="bargain_time" value="" lay-verify="required|int" data-min="4" data-max="48" data-unit="小时" placeholder="4-48小时" autocomplete="off" class="layui-input len-short">
</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="radio" name="is_fenxiao" value="0" title="不参与" checked>
<input type="radio" name="is_fenxiao" value="1" title="参与">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">购买方式:</label>
<div class="layui-input-block">
<input type="radio" name="buy_type" value="0" title="任意金额可购买" checked>
<input type="radio" name="buy_type" value="1" title="砍到指定价格才可购买">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">帮砍金额:</label>
<div class="layui-input-block">
<input type="radio" name="bargain_type" lay-filter='bargain_type' value="1" title="随机金额" checked >
<input type="radio" name="bargain_type" lay-filter='bargain_type' value="0" title="固定金额" >
</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="checkbox" name="is_own" lay-filter="" value="1" lay-skin="switch" />
</div>
</div>
<div class="layui-form-item bargain_num">
<label class="layui-form-label"><span class="required">*</span>最少帮砍人数:</label>
<div class="layui-input-block">
<input type="number" name="bargain_num" value="" lay-verify="required|int" data-min="2" data-max="100" data-unit="人" placeholder="2-100人" autocomplete="off" class="layui-input len-short">
</div>
<div class="word-aux">
<p>最少帮砍人数为该砍价订单最少人数</p>
</div>
</div>
<div class="layui-form-item bargain_max_num">
<label class="layui-form-label"><span class="required">*</span>砍成人数:</label>
<div class="layui-input-block">
<input type="number" name="bargain_max_num" value="0" lay-verify="bargain_max_num" data-min="2" data-max="100" data-unit="人" placeholder="" autocomplete="off" class="layui-input len-short">
</div>
<div class="word-aux">
<p>由于帮砍金额为随机金额,实际砍成人数可能小于设置的砍成人数,但是达到砍成人数时砍价必然成功</p>
<p>若砍成人数设置为0表示不限制砍成人数累计帮砍金额达到最低砍价金额时砍价成功</p>
</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="help_bargain_num" value="0" lay-verify="help_bargain_num" data-unit="人" placeholder="" autocomplete="off" class="layui-input len-short">
</div>
<div class="word-aux">
<p>每个会员针对当前活动商品最多帮砍次数0为不限制</p>
</div>
</div>
<div class="layui-form-item" style="display: none">
<label class="layui-form-label">是否区分新老用户:</label>
<div class="layui-input-block">
<input type="radio" lay-filter="is_differ_new_user" name="is_differ_new_user" value="1" title="是" >
<input type="radio" lay-filter="is_differ_new_user" name="is_differ_new_user" value="0" title="否" checked>
</div>
</div>
<div name="distinguish" 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="number" name="distinguish" value="1" lay-verify="required|int" data-min="1" data-max="100" data-unit="人" placeholder="1-100天" autocomplete="off" class="layui-input len-short" min="1">
<span class="layui-form-label label-time">天内新注册且未砍过价的</span>
</div>
</div>
<div name='random' style="display: none">
<div class="layui-form-item">
<label class="layui-form-label">新用户最低随机金额:</label>
<div class="layui-input-block">
<input type="number" name="new_low" lay-verify="flo" autocomplete="off" class="layui-input combined-price len-short" value="0.00" step="1" min="0.00">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">老用户最高随机金额:</label>
<div class="layui-input-block">
<input type="number" name="aged_tall" autocomplete="off" class="layui-input combined-price len-short" value="0.00" step="1" min="0.00">
</div>
</div>
</div>
<div name='fixed' class="layui-form-item layui-hide" style="display: none">
<label class="layui-form-label">老用户固定砍价:</label>
<div class="layui-input-block">
<input type="number" name="aged_fixation" autocomplete="off" class="layui-input combined-price len-short" value="0.00" step="1" min="0.00">
</div>
</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-block">
<button class="layui-btn" onclick="addGoods()">选择商品</button> <span class="goods_num">已选商品(<span id="goods_num" class="text-color">0</span></span>
</div>
</div>
<input type="hidden" name="sku_ids">
<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="layui-carousel" >
<img src="__STATIC__/img/bargain.png" >
</div>-->
<div class="form-row">
<button class="layui-btn" lay-submit lay-filter="save">保存</button>
<button class="layui-btn layui-btn-primary" onclick="backBargainList()">返回</button>
</div>
</div>
<script type="text/html" id="toolbarOperation">
<button class="layui-btn layui-btn-primary" lay-event="money">首刀金额</button>
<button class="layui-btn layui-btn-primary" lay-event="bargain-stock">砍价库存</button>
<button class="layui-btn layui-btn-primary" lay-event="floor-price">底价</button>
</script>
<script type="text/html" id="bargainFirst">
<input type="number" class="layui-input len-input bargain-first" value="{{d.first_bargain_price ? d.first_bargain_price : ''}}" lay-verify="bargain_first" min="0.00" oninput="bargainFirst({{ d.sku_id }},event)" onporpertychange="bargainFirst({{ d.sku_id }},event)" />
</script>
<script type="text/html" id="bargainStock">
<input type="number" class="layui-input len-input bargain-stock" value="{{d.bargain_stock ? d.bargain_stock : d.stock }}" lay-verify="bargain_stock" min="0" oninput="bargainStock({{ d.sku_id }},event)" onporpertychange="bargainStock({{ d.sku_id }},event)"/>
</script>
<script type="text/html" id="minPrice">
<input type="number" class="layui-input len-input min-price" lay-verify="min_price" min="0.00" value="{{d.floor_price ? d.floor_price : 0.00}}" oninput="bargainMinPrice({{ d.sku_id }},event)" onporpertychange="bargainMinPrice({{ d.sku_id }},event)"/>
</script>
<script type="text/html" id="operation">
<div class="table-btn">
<a class="layui-btn" onclick="delRow(this,{{d.sku_id}})">删除</a>
</div>
</script>
<script>
var goodsId = {}, selectedGoodsId = [], sku_list = [],
form,laydate,repeat_flag,currentDate,minDate,
is_differ_new_user = 1,bargain_type = 1;
layui.use(['form', 'laydate'], function() {
form = layui.form;
laydate = layui.laydate;
repeat_flag = false;
currentDate = new Date();
minDate = "";
currentDate.setDate(currentDate.getDate() + 30);
form.render();
/**
* 新老客户单选框选择
*/
form.on("radio(is_differ_new_user)", function(data){
is_differ_new_user = data.value;
if(data.value == '1'){
$("div[name='distinguish']").removeClass('layui-hide')
}else{
$("div[name='distinguish']").addClass('layui-hide')
}
});
/**
* 帮砍金额单选框选择
*/
form.on("radio(bargain_type)",function(data){
bargain_type = data.value;
if(data.value == '1'){
$("div[name='random']").removeClass('layui-hide');
$("div[name='fixed']").addClass('layui-hide');
$(".bargain_max_num").removeClass('layui-hide');
$('.bargain_num .layui-form-label').html('<span class="required">*</span>最少帮砍人数:');
$('.bargain_num .word-aux').html('<p>最少帮砍人数为该砍价订单最少人数</p>');
}else{
$("div[name='random']").addClass('layui-hide');
$("div[name='fixed']").removeClass('layui-hide');
$(".bargain_max_num").addClass('layui-hide');
$('.bargain_num .layui-form-label').html('<span class="required">*</span>砍成人数:');
$('.bargain_num .word-aux').html('');
}
});
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>';
}
$(".bargain-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>';
}
$(".bargain-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>';
}
$(".bargain-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 len-mid" autocomplete="off"> ');
laydate.render({
elem: '#end_time',
type: 'datetime',
min: minDate
});
}
/**
* 表单验证
*/
form.verify({
int: function(value, item) {
var str = $(item).parents(".layui-form-item").find("label").text().split("*").join("");
str = str.substring(0, str.length - 1);
var min = $(item).attr("data-min");
var max = $(item).attr("data-max");
var unit = $(item).attr("data-unit");
if (value < Number(min)) {
return str + '不能小于' + min + unit;
}
if (value > Number(max)) {
return str + '不能大于' + max + unit;
}
if (value % 1 != 0) {
return str + '必须为整数';
}
},
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 (value < 2 || value % 1 != 0) {
return '参团人数不能小于2且必须是整数';
}
},
bargain_first: function(value, item) {
var price = $(item).parents("tr").find(".bargain-price").text();
var min_price = $(item).parents("tr").find("input[lay-verify='min_price']").val();
if (value == "" || value == 0) {
return;
}
if (value < 0) {
return '首刀金额不能小于0';
}
if (Number(value) >= Number(price)) {
return '首刀金额必须小于商品价格';
}
if ((Number(value) + Number(min_price)) >= Number(price)) {
return '首刀金额与底价之和必须小于商品价格';
}
var arrMen = value.split(".");
var val = 0;
if (arrMen.length == 2) {
val = arrMen[1];
}
if (val.length > 2) {
return '首刀金额最多保留两位小数';
}
},
bargain_stock: function(value, item) {
var stock = $(item).parents("tr").find(".stock").text();
if (value == "" || value == 0) {
return;
}
if (Number(value) < 0) {
return '砍价库存不能小于0';
}
if (Number(value) > Number(stock)) {
return '砍价库存不能大于商品总库存';
}
if (value % 1 != 0) {
return '砍价库存必须为整数';
}
},
min_price: function(value, item) {
var price = $(item).parents("tr").find(".bargain-price").text();
if (value == "" || value == 0) {
return;
}
if (Number(value) < 0) {
return '商品底价不能小于0';
}
if (Number(value) > Number(price)) {
return '商品底价不能大于商品价格';
}
var arrMen = value.split(".");
var val = 0;
if (arrMen.length == 2) {
val = arrMen[1];
}
if (val.length > 2) {
return '商品底价最多保留两位小数';
}
},
bargain_max_num: function(value, item) {
var bargain_type = $('input[name="bargain_type"]:checked').val();
if(bargain_type == 1) {
if (value == "" || value == 0) {
return;
}
if (Number(value) < 0) {
return '砍成人数不能小于0';
}
if (value % 1 != 0) {
return '砍成人数必须为整数';
}
var bargain_num = $('input[name="bargain_num"]').val();
if (Number(value) <= Number(bargain_num)) {
return '砍成人数不能小于最少帮砍人数';
}
}
},
help_bargain_num: function (value, item){
if (value == "" || value == 0) {
return;
}
if (Number(value) < 0) {
return '最大帮砍次数不能小于0';
}
if (value % 1 != 0) {
return '最大帮砍次数必须为整数';
}
}
});
/**
* 监听提交
*/
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;
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.first_bargain_price = item.first_bargain_price || 0.00;
sku_detail.bargain_stock = item.bargain_stock || item.stock;
sku_detail.floor_price = item.floor_price || 0.00;
skuLisArr.push(sku_detail);
});
data.field.sku_list = skuLisArr;
if(repeat_flag) return;
repeat_flag = true;
$.ajax({
type: 'POST',
dataType: 'JSON',
url: ns.url("bargain://shop/bargain/add"),
data: data.field,
async: false,
success: function(res){
repeat_flag = false;
if (res.code == 0) {
location.hash = ns.hash("bargain://shop/bargain/lists");
}else{
layer.msg(res.message);
}
}
})
});
});
// 表格渲染
function renderTable(sku_list) {
//展示已知数据
table = new Table({
elem: '#selected_goods_list',
page: false,
limit: Number.MAX_VALUE,
cols: [
[{
width: "3%",
type: 'checkbox',
unresize: 'false'
},{
title: '商品名称',
width: '23%',
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',
width: '12%',
templet: function(data) {
return '<p class="line-hiding" title="'+ data.price +'">¥<span class="bargain-price">' + data.price +'</span></p>';
}
}, {
field: 'stock',
title: '库存',
unresize: 'false',
width: '10%',
templet: function(data) {
return '<p class="stock">' + data.stock +'</p>';
}
}, {
title: '<span title="首刀金额自定义">首刀金额自定义</span>',
unresize: 'false',
width: '16%',
templet: '#bargainFirst'
}, {
title: '砍价库存',
unresize: 'false',
width: '13%',
templet: '#bargainStock'
}, {
title: '底价',
unresize: 'false',
width: '13%',
templet: '#minPrice'
}, {
title: '操作',
toolbar: '#operation',
unresize: 'false'
}]
],
data: sku_list,
toolbar: '#toolbarOperation'
});
/**
* 批量操作
*/
table.toolbar(function(obj) {
if (obj.data.length < 1) {
layer.msg('请选择要操作的数据');
return;
}
switch (obj.event) {
case "money":
editInput(0,obj);
break;
case "bargain-stock":
editInput(1,obj);
break;
case "floor-price":
editInput(2,obj);
break;
}
});
}
function editInput(textIndex=0,data) {
var text = [{
name: '首刀金额',
value: 'first_bargain_price'
}, {
name: '砍价库存',
value: 'bargain_stock'
}, {
name: '底价',
value: 'floor_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) {
sku_list = [];
goodsId = [];
for (var key in data) {
goodsId['goods_' + data[key].goods_id] = {};
goodsId['goods_' + data[key].goods_id].sku_id = {};
goodsId['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];
goodsId['goods_' + data[key].goods_id].sku_id['sku_' + item.sku_id] = {};
goodsId['goods_' + data[key].goods_id].sku_id['sku_' + item.sku_id].sku = item.sku_id;
sku_list.push(item);
}
}
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 bargainFirst(index,event) {
for (var i = 0; i < sku_list.length; i++){
if (sku_list[i].sku_id == index) sku_list[i].first_bargain_price = event.srcElement.value;
}
}
function bargainStock(index,event) {
for (var i = 0; i < sku_list.length; i++){
if (sku_list[i].sku_id == index) sku_list[i].bargain_stock = event.srcElement.value;
}
}
function bargainMinPrice(index,event) {
for (var i = 0; i < sku_list.length; i++){
if (sku_list[i].sku_id == index) sku_list[i].floor_price = event.srcElement.value;
}
}
function backBargainList() {
location.hash = ns.hash("bargain://shop/bargain/lists");
}
</script>

View File

@@ -0,0 +1,117 @@
<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>{$bargain_info.bargain_name}</span>
</div>
<div class="promotion-view-item">
<label>开始时间:</label>
<span>{:date('Y-m-d H:i:s',$bargain_info.start_time)}</span>
</div>
<div class="promotion-view-item">
<label>结束时间:</label>
<span>{:date('Y-m-d H:i:s',$bargain_info.end_time)}</span>
</div>
<div class="promotion-view-item">
<label>购买方式:</label>
<span>{if $bargain_info.buy_type == 1} 砍到指定价格 {else/} 任意金额可购买 {/if}</span>
</div>
<div class="promotion-view-item">
<label>帮砍金额:</label>
<span>{if $bargain_info.bargain_type == 1} 随机金额 {else/} 固定金额 {/if}</span>
</div>
<div class="promotion-view-item">
<label>帮砍人数:</label>
<span>{$bargain_info.bargain_time} 小时</span>
</div>
<div class="promotion-view-item">
<label>是否允许自己砍价:</label>
<span>{if $bargain_info.is_own == 1} 是 {else/} 否 {/if}</span>
</div>
<div class="promotion-view-item">
<label>是否参与分销:</label>
<span>{if $bargain_info.is_fenxiao == 1} 参与 {else/} 不参与 {/if}</span>
</div>
</div>
<div class="promotion-view">
<div class="promotion-view-item-line">
<label>活动规则:</label>
<span>{$bargain_info.remark}</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-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($bargain_info.goods_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"
}, {
field: 'price',
title: '商品价格',
unresize: 'false',
align: 'right',
width: '20%',
templet: function(data) {
return '¥' + data.price;
}
}, {
field: 'stock',
title: '库存',
unresize: 'false',
width: '10%',
templet: function(data) {
return data.stock;
}
}, {
field: 'first_bargain_price',
title: '首刀金额',
unresize: 'false'
}, {
field: 'bargain_stock',
title: '砍价库存',
unresize: 'false'
}, {
field: 'floor_price',
title: '底价',
unresize: 'false'
}]
],
data: list
});
});
</script>

View File

@@ -0,0 +1,709 @@
<style>
.len-input{width: 100%;max-width: 120px;}
.layui-table-view{margin-top: 0;}
.layui-form-item .layui-input-inline.end-time{float: none;}
.desc{margin-bottom: 15px;border:1px dashed #ff8143;padding: 5px 10px;background: #fff0e9;color: #ff8143;width: 65%;}
.forbidden{cursor:not-allowed;background-color: #eee;}
.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;}
.layui-carousel { position: absolute; top: 90px; left: 1350px; background: #fff;}
#bargain_num{width: 60px !important;}
.layui-form-item .layui-input-block .label-time{width: auto;margin-left: 10px;}
</style>
<div class="layui-form form-wrap">
<div class="desc">
请自觉遵守微信关于规范外部链接内容管理的规范,防止由于微信封号导致不必要的损失。<a href="http://weixin.qq.com/cgi-bin/readtemplate?t=weixin_external_links_content_management_specification" target="_blank">点击查看详情</a>
</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="bargain_name" lay-verify="required" value="{$bargain_info.bargain_name}" 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', $bargain_info.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', $bargain_info.end_time)}" lay-verify="required|time" class="layui-input" autocomplete="off" readonly>
<input type="hidden" value="{$bargain_info.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"><span class="required">*</span>砍价有效期:</label>
<div class="layui-input-block">
<div class="layui-input-inline len-short">
<input type="number" name="bargain_time" value="{$bargain_info.bargain_time}" lay-verify="required|int" data-min="4" data-max="48" data-unit="小时" placeholder="4-48小时" autocomplete="off" class="layui-input len-short">
</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="radio" name="is_fenxiao" value="0" title="不参与" {if condition="$bargain_info.is_fenxiao == 0"}checked{/if} >
<input type="radio" name="is_fenxiao" value="1" title="参与" {if condition="$bargain_info.is_fenxiao == 1"}checked{/if} >
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">购买方式:</label>
<div class="layui-input-block">
<input type="radio" name="buy_type" value="0" title="任意金额可购买" {if condition="$bargain_info.buy_type == 0"}checked{/if} >
<input type="radio" name="buy_type" value="1" title="砍到指定价格才可购买" {if condition="$bargain_info.buy_type == 1"}checked{/if} >
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">帮砍金额:</label>
<div class="layui-input-block">
<input type="radio" name="bargain_type" value="1" lay-filter='bargain_type' title="随机金额" {if condition="$bargain_info.bargain_type == 1"}checked{/if} >
<input type="radio" name="bargain_type" value="0" lay-filter='bargain_type' title="固定金额" {if condition="$bargain_info.bargain_type == 0"}checked{/if} >
</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="checkbox" name="is_own" lay-filter="" {if condition="$bargain_info.is_own == 1"}checked{/if} value="1" lay-skin="switch" />
</div>
</div>
<div class="layui-form-item bargain_num">
<label class="layui-form-label"><span class="required">*</span>最少帮砍人数:</label>
<div class="layui-input-block">
<input type="number" name="bargain_num" value="{$bargain_info.bargain_num}" lay-verify="required|int" data-min="2" data-max="100" data-unit="人" placeholder="2-100人" autocomplete="off" class="layui-input len-short">
</div>
<div class="word-aux">
<p>最少帮砍人数为该砍价订单最少人数</p>
</div>
</div>
<div class="layui-form-item bargain_max_num">
<label class="layui-form-label"><span class="required">*</span>砍成人数:</label>
<div class="layui-input-block">
<input type="number" name="bargain_max_num" value="{$bargain_info.bargain_max_num}" lay-verify="bargain_max_num" data-min="2" data-max="100" data-unit="人" placeholder="" autocomplete="off" class="layui-input len-short">
</div>
<div class="word-aux">
<p>由于帮砍金额为随机金额,实际砍成人数可能小于设置的砍成人数,但是达到砍成人数时砍价必然成功</p>
<p>若砍成人数设置为0表示不限制砍成人数累计帮砍金额达到最低砍价金额时砍价成功</p>
</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="help_bargain_num" value="{$bargain_info.help_bargain_num}" lay-verify="help_bargain_num" data-unit="人" placeholder="" autocomplete="off" class="layui-input len-short">
</div>
<div class="word-aux">
<p>每个会员针对当前活动商品最多帮砍次数0为不限制</p>
</div>
</div>
<div class="layui-form-item" style="display: none">
<label class="layui-form-label">是否区分新老用户:</label>
<div class="layui-input-block">
<input type="radio" name="is_differ_new_user" value="1" lay-filter='is_differ_new_user' title="是" {if condition="$bargain_info.is_differ_new_user == 1"}checked{/if} >
<input type="radio" name="is_differ_new_user" value="0" lay-filter='is_differ_new_user' title="否" {if condition="$bargain_info.is_differ_new_user == 0"}checked{/if} >
</div>
</div>
<div name="distinguish" 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="number" name="distinguish" id="bargain_num" value="{$bargain_info.distinguish}" lay-verify="required|int" data-min="1" data-max="100" data-unit="人" placeholder="1-100天" autocomplete="off" class="layui-input len-short" min="1">
<span class="layui-form-label label-time">天内新注册且未砍过价的</span>
</div>
</div>
<div name='random' style="display: none">
<div class="layui-form-item">
<label class="layui-form-label">新用户最低随机金额:</label>
<div class="layui-input-block">
<input type="number" name="new_low" value="{$bargain_info.new_low}" autocomplete="off" class="layui-input combined-price len-short" step="1" min="0.00">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">老用户最高随机金额:</label>
<div class="layui-input-block">
<input type="number" name="aged_tall" value="{$bargain_info.aged_tall}" autocomplete="off" class="layui-input combined-price len-short" step="1" min="0.00">
</div>
</div>
</div>
<div name='fixed' class="layui-form-item layui-hide" style="display: none">
<label class="layui-form-label">老用户固定砍价:</label>
<div class="layui-input-block">
<input type="number" name="aged_fixation" value="{$bargain_info.aged_fixation}" autocomplete="off" class="layui-input combined-price len-short" step="1" min="0.00">
</div>
</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 layui-form-text">
<label class="layui-form-label">活动规则说明:</label>
<div class="layui-input-inline">
<textarea name="remark" class="layui-textarea len-long" maxlength="300">{$bargain_info.remark}</textarea>
</div>
</div>
<!-- <div class="layui-carousel" style="display: none" >
<img src="__STATIC__/img/bargain.png" >
</div>-->
<div class="form-row">
<button class="layui-btn" lay-submit lay-filter="save">保存</button>
<button class="layui-btn layui-btn-primary" onclick="backBargainList()">返回</button>
</div>
<input type="hidden" name="bargain_id" value="{$bargain_info.bargain_id}" />
</div>
<script type="text/html" id="toolbarOperation">
<button class="layui-btn layui-btn-primary" lay-event="money">首刀金额</button>
<button class="layui-btn layui-btn-primary" lay-event="bargain-stock">砍价库存</button>
<button class="layui-btn layui-btn-primary" lay-event="floor-price">底价</button>
</script>
<script>
var sku_list = [],is_differ_new_user = 1,bargain_type = 1;
sku_list = {:json_encode($bargain_info.goods_list, JSON_UNESCAPED_UNICODE)};
sku_list.forEach(function (item,index) {
item.is_delete = item.bargain_stock ? 1 : 2;
});
layui.use(['form', 'laydate'], function() {
var form = layui.form,
laydate = layui.laydate,
repeat_flag = false,
startDate = '{$bargain_info.start_time}',
endDate = '{$bargain_info.end_time}',
minDate = "";
form.render();
/**
* 新老客户单选框选择
*/
form.on("radio(is_differ_new_user)", function(data){
is_differ_new_user = data.value;
if(data.value == '1'){
$("div[name='distinguish']").removeClass('layui-hide')
}else{
$("div[name='distinguish']").addClass('layui-hide')
}
});
/**
* 帮砍金额单选框选择
*/
form.on("radio(bargain_type)",function(data){
bargain_type = data.value;
if(data.value == '1'){
$("div[name='random']").removeClass('layui-hide');
$("div[name='fixed']").addClass('layui-hide');
$(".bargain_max_num").removeClass('layui-hide');
$('.bargain_num .layui-form-label').html('<span class="required">*</span>最少帮砍人数:');
$('.bargain_num .word-aux').html('<p>最少帮砍人数为该砍价订单最少人数</p>');
}else{
$("div[name='random']").addClass('layui-hide');
$("div[name='fixed']").removeClass('layui-hide');
$(".bargain_max_num").addClass('layui-hide');
$('.bargain_num .layui-form-label').html('<span class="required">*</span>砍成人数:');
$('.bargain_num .word-aux').html('');
}
});
var bargain_type = $('input[name="bargain_type"]:checked').val();
if(bargain_type == 1){
$("div[name='random']").removeClass('layui-hide');
$("div[name='fixed']").addClass('layui-hide');
$(".bargain_max_num").removeClass('layui-hide');
$('.bargain_num .layui-form-label').html('<span class="required">*</span>最少帮砍人数:');
$('.bargain_num .word-aux').html('<p>最少帮砍人数为该砍价订单最少人数</p>');
}else{
$("div[name='random']").addClass('layui-hide');
$("div[name='fixed']").removeClass('layui-hide');
$(".bargain_max_num").addClass('layui-hide');
$('.bargain_num .layui-form-label').html('<span class="required">*</span>砍成人数:');
$('.bargain_num .word-aux').html('');
}
renderTable(sku_list); // 初始化表格
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',
done: function(value) {
minDate = value;
reRender();
}
});
}
if(now_time <= old_end_time){
//结束时间
laydate.render({
elem: '#end_time', //指定元素
type: 'datetime',
});
}
/**
* 重新渲染结束时间
* */
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 len-mid" autocomplete="off"> ');
laydate.render({
elem: '#end_time',
type: 'datetime',
min: minDate
});
}
/**
* 表单验证
*/
form.verify({
int: function(value, item) {
var str = $(item).parents(".layui-form-item").find("label").text().split("*").join("");
str = str.substring(0, str.length - 1);
var min = $(item).attr("data-min");
var max = $(item).attr("data-max");
var unit = $(item).attr("data-unit");
if (value < Number(min)) {
return str + '不能小于' + min + unit;
}
if (value > Number(max)) {
return str + '不能大于' + max + unit;
}
if (value % 1 != 0) {
return str + '必须为整数';
}
},
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 (now_time > end_time) {
return '结束时间不能小于当前时间!'
}
if (end_time < old_end_time) {
return '结束时间不能小于之前设置的结束时间!';
}
if (start_time > end_time) {
return '结束时间不能小于开始时间!';
}
},
num: function(value) {
if (value < 1 || value % 1 != 0) {
return '请输入大于0的正整数';
}
},
sum: function(value) {
if (value < 2 || value % 1 != 0) {
return '参团人数不能小于2且必须是整数';
}
},
bargain_first: function(value, item) {
var price = $(item).parents("tr").find(".bargain-price").text();
var min_price = $(item).parents("tr").find("input[lay-verify='min_price']").val();
if (value == "" || value == 0) {
return;
}
if (value < 0) {
return '首刀金额不能小于0';
}
if (Number(value) >= Number(price)) {
return '首刀金额必须小于商品价格';
}
if ((Number(value) + Number(min_price)) >= Number(price)) {
return '首刀金额与底价之和必须小于商品价格';
}
var arrMen = value.split(".");
var val = 0;
if (arrMen.length == 2) {
val = arrMen[1];
}
if (val.length > 2) {
return '首刀金额最多保留两位小数';
}
},
bargain_stock: function(value, item) {
var stock = $(item).parents("tr").find(".stock").text();
if (value == "" || value == 0) {
return;
}
if (Number(value) < 0) {
return '砍价库存不能小于0';
}
if (Number(value) > Number(stock)) {
return '砍价库存不能大于商品总库存';
}
if (value % 1 != 0) {
return '砍价库存必须为整数';
}
},
min_price: function(value, item) {
var price = $(item).parents("tr").find(".bargain-price").text();
if (value == "" || value == 0) {
return;
}
if (Number(value) < 0) {
return '商品底价不能小于0';
}
if (Number(value) > Number(price)) {
return '商品底价不能大于商品价格';
}
var arrMen = value.split(".");
var val = 0;
if (arrMen.length == 2) {
val = arrMen[1];
}
if (val.length > 2) {
return '商品底价最多保留两位小数';
}
},
bargain_max_num: function(value, item) {
var bargain_type = $('input[name="bargain_type"]:checked').val();
if(bargain_type == 1) {
if (value == "" || value == 0) {
return;
}
if (Number(value) < 0) {
return '砍成人数不能小于0';
}
if (value % 1 != 0) {
return '砍成人数必须为整数';
}
var bargain_num = $('input[name="bargain_num"]').val();
if (Number(value) <= Number(bargain_num)) {
return '砍成人数不能小于最少帮砍人数';
}
}
},
help_bargain_num: function (value, item){
if (value == "" || value == 0) {
return;
}
if (Number(value) < 0) {
return '最大帮砍次数不能小于0';
}
if (value % 1 != 0) {
return '最大帮砍次数必须为整数';
}
}
});
/**
* 监听提交
*/
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.first_bargain_price = item.first_bargain_price || 0.00;
sku_detail.bargain_stock = item.bargain_stock || item.stock;
sku_detail.floor_price = item.floor_price || 0.00;
sku_detail.is_delete = item.is_delete || 1;
skuLisArr.push(sku_detail);
});
data.field.sku_list = skuLisArr;
if(repeat_flag) return;
repeat_flag = true;
$.ajax({
type: 'POST',
dataType: 'JSON',
url: ns.url("bargain://shop/bargain/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("bargain://shop/bargain/lists");
layer.close(index);
},
btn2: function(index, layero) {
layer.close(index);
}
});
}else{
layer.msg(res.message);
}
}
})
});
});
// 表格渲染
function renderTable(sku_list) {
//展示已知数据
table = new Table({
elem: '#selected_goods_list',
page: false,
limit: Number.MAX_VALUE,
cols: [
[{
width: "3%",
type: 'checkbox',
unresize: 'false'
},{
title: '商品名称',
width: '23%',
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',
width: '12%',
templet: function(data) {
return '<p class="line-hiding" title="'+ data.price +'">¥<span class="bargain-price">' + data.price +'</span></p>';
}
}, {
field: 'stock',
title: '库存',
unresize: 'false',
width: '10%',
templet: function(data) {
return '<p class="stock">' + data.stock +'</p>';
}
}, {
title: '<span title="首刀金额自定义">首刀金额自定义</span>',
unresize: 'false',
width: '16%',
templet: '#bargainFirst'
}, {
title: '砍价库存',
unresize: 'false',
width: '13%',
templet: '#bargainStock'
}, {
title: '底价',
unresize: 'false',
width: '13%',
templet: '#minPrice'
}, {
title: '操作',
toolbar: '#operation',
unresize: 'false',
align:'right'
}]
],
data: sku_list,
toolbar: '#toolbarOperation'
});
/**
* 批量操作
*/
table.toolbar(function(obj) {
if (obj.data.length < 1) {
layer.msg('请选择要操作的数据');
return;
}
switch (obj.event) {
case "money":
editInput(0,obj);
break;
case "bargain-stock":
editInput(1,obj);
break;
case "floor-price":
editInput(2,obj);
break;
}
});
}
function editInput(textIndex=0,data) {
var text = [{
name: '首刀金额',
value: 'first_bargain_price'
},{
name: '砍价库存',
value: 'bargain_stock'
},{
name: '底价',
value: 'floor_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 bargainFirst(index,event) {
sku_list[index-1].first_bargain_price = event.srcElement.value;
}
function bargainStock(index,event) {
sku_list[index-1].bargain_stock = event.srcElement.value;
}
function bargainMinPrice(index,event) {
sku_list[index-1].floor_price = event.srcElement.value;
}
function backBargainList() {
location.hash = ns.hash("bargain://shop/bargain/lists");
}
$("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");
});
$(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");
});
$(this).removeClass("participation").addClass("no-participation");
sku_list[$(this).parents("tr").attr("data-index")].is_delete = 1;
});
</script>
<script type="text/html" id="bargainFirst">
{{# if(!d.bargain_stock){ }}
<input type="number" class="layui-input len-input bargain-first forbidden" value="{{d.first_bargain_price}}" lay-verify="bargain_first" min="0.00" oninput="bargainFirst({{ d.LAY_INDEX }},event)" onporpertychange="bargainFirst({{ d.LAY_INDEX }},event)" readonly disabled/>
{{# }else{ }}
<input type="number" class="layui-input len-input bargain-first" value="{{d.first_bargain_price}}" lay-verify="bargain_first" min="0.00" oninput="bargainFirst({{ d.LAY_INDEX }},event)" onporpertychange="bargainFirst({{ d.LAY_INDEX }},event)"/>
{{# } }}
</script>
<script type="text/html" id="bargainStock">
{{# if(!d.bargain_stock){ }}
<input type="number" class="layui-input len-input bargain-stock forbidden" value="{{d.bargain_stock}}" lay-verify="bargain_stock" min="0" oninput="bargainStock({{ d.LAY_INDEX }},event)" onporpertychange="bargainStock({{ d.LAY_INDEX }},event)" readonly disabled/>
{{# }else{ }}
<input type="number" class="layui-input len-input bargain-stock" value="{{d.bargain_stock}}" lay-verify="bargain_stock" min="0" oninput="bargainStock({{ d.LAY_INDEX }},event)" onporpertychange="bargainStock({{ d.LAY_INDEX }},event)"/>
{{# } }}
</script>
<script type="text/html" id="minPrice">
{{# if(!d.bargain_stock){ }}
<input type="number" class="layui-input len-input min-price forbidden" value="{{d.floor_price}}" lay-verify="min_price" min="0.00" oninput="bargainMinPrice({{ d.LAY_INDEX }},event)" onporpertychange="bargainMinPrice({{ d.LAY_INDEX }},event)" readonly disabled/>
{{# }else{ }}
<input type="number" class="layui-input len-input min-price" value="{{d.floor_price}}" lay-verify="min_price" min="0.00" oninput="bargainMinPrice({{ d.LAY_INDEX }},event)" onporpertychange="bargainMinPrice({{ d.LAY_INDEX }},event)"/>
{{# } }}
</script>
<script type="text/html" id="operation">
<div class="table-btn">
{{# if(!d.bargain_stock){ }}
<a class="layui-btn participation">参与</a>
{{# }else{ }}
<a class="layui-btn no-participation">不参与</a>
{{# } }}
</div>
</script>

View File

@@ -0,0 +1,133 @@
<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;}
.layui-layout-admin .layui-table-header{background-color: transparent;}
.layui-layout-admin .layui-table-view .layui-table-body .layui-table[lay-skin=line]{margin-top: 0;}
</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'])}" onerror="this.src = '{:img('public/static/img/default_img/head.png')}' "/>
</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">{:time_to_date($info.start_time)}</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">最少砍价数/已砍人数:</label>
<div class="layui-input-inline">{$info.need_num} / {$info.curr_num}</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">底价:</label>
<div class="layui-input-inline">¥{$info.floor_price}</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 == 2}
砍价失败
{elseif $info.status == 0}
砍价中
{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.headimg){ }}
<img layer-src src="{{ns.img(d.headimg)}}" onerror="this.src = '{:img('public/static/img/default_img/head.png')}' "/>
{{# } else{ }}
<img layer-src src="{:img('public/static/img/default_img/head.png')}"/>
{{# } }}
</div>
<div class="title-content">
<a href="javascript:;" class="multi-line-hiding text-color" title="{{d.nickname}}">{{d.nickname}}</a>
</div>
</div>
</script>
<script>
var launch_id = "{$launch_id}";
layui.use(['form'], function() {
var table,form = layui.form;
form.render();
table = new Table({
elem: '#order_list',
url: ns.url("bargain://shop/bargain/launchdetail"),
where: {
"launch_id": launch_id
},
cols: [
[{
title: '帮砍人信息',
unresize: 'false',
templet:'#member_info'
}, {
title: '帮砍金额',
unresize: 'false',
templet:function(data){
return '¥' + data.money;
}
}, {
title: '帮砍时间',
unresize: 'false',
templet: function(data) {
return ns.time_to_date(data.bargain_time);
}
}]
],
});
/**
* 监听工具栏操作
*/
table.tool(function(obj) {
var data = obj.data;
switch (obj.event) {
case 'check': //查看
window.open(ns.href("shop/order/detail", {"order_id": data.order_id}));
break;
}
});
});
</script>

View File

@@ -0,0 +1,263 @@
<style>
.layui-layout-admin .screen{margin-bottom: 15px;}
.layui-layout-admin .layui-form-item .layui-input-inline{background-color: #fff;}
</style>
{if condition="$bargain_id"}
<input type="hidden" class="bargain-id" value="{$bargain_id}" />
{else/}
<input type="hidden" class="bargain-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="1">砍价成功</option>
<option value="0">砍价中</option>
<option value="2">砍价失败</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.sku_image){ }}
<img layer-src="{{ns.img(d.sku_image.split(',')[0],'big')}}" src="{{ns.img(d.sku_image.split(',')[0],'small')}}"/>
{{# } }}
</div>
<div class="title-content">
<a href="javascript:;" class="multi-line-hiding text-color-sub" title="{{d.sku_name}}">{{d.sku_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)}}"/>
{{# }else if(d.headimg == ''){ }}
<img layer-src src="{:img('public/static/img/default_img/head.png')}">
{{# } }}
</div>
<!-- <div class='title-pic'>
<img layer-src src="{{ns.img(d.sku_image.split(',')[0],'small')}}" onerror="this.src = '{:img('public/static/img/default_img/head.png')}' ">
</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 == 0){ }}
砍价中
{{# }else if(d.status == 1){ }}
砍价成功
{{# }else if(d.status == 2){ }}
砍价失败
{{# } }}
</script>
<!-- 操作 -->
<script type="text/html" id="operation">
<div class="table-btn">
<a class="layui-btn" lay-event="record">帮砍记录</a>
{{# if(d.status == 1 && d.order_id > 0){ }}
<a class="layui-btn" lay-event="order">查看订单</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("bargain://shop/bargain/launchlist"),
where: {
"bargain_id": $(".bargain-id").val()
},
cols: [
[ {
title: '会员信息',
unresize: 'false',
width: '12%',
templet: '#member_info'
},{
title: '砍价商品',
unresize: 'false',
width: '15%',
templet: '#goods'
}, {
title: '发起砍价时间',
unresize: 'false',
width: '10%',
templet:function(data){
return ns.time_to_date(data.start_time);
}
}, {
title: '最少砍价数/已砍人数',
unresize: 'false',
align:'center',
width: '12%',
templet: function(data) {
return data.need_num + ' / ' + data.curr_num;
}
}, {
title: '底价',
unresize: 'false',
width: '10%',
templet: function(data) {
return '¥' + data.floor_price;
}
}, {
title: '结束时间',
unresize: 'false',
width: '12%',
templet: function(data) {
return ns.time_to_date(data.end_time);
}
}, {
title: '砍价状态',
unresize: 'false',
width: '8%',
templet: '#status'
}, {
title: '操作',
toolbar: '#operation',
unresize: 'false',
align : 'right'
}]
],
});
//监听筛选事件
form.on('submit(search)', function(data) {
table.reload({
page: {
curr: 1
},
where: data.field
});
return false;
});
/**
* 监听工具栏操作
*/
table.tool(function(obj) {
var data = obj.data;
switch (obj.event) {
case 'record': //帮砍记录
location.hash = ns.hash("bargain://shop/bargain/launchdetail?launch_id="+ data.launch_id);
break;
case 'order': //订单
window.open(ns.href("shop/order/detail", {"order_id": data.order_id}));
break;
}
});
});
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,136 @@
<link rel="stylesheet" type="text/css" href="SHOP_ADDON_CSS/list.css" />
<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="bargain_tab">
<ul class="layui-tab-title">
<li class="layui-this" data-status="">全部</li>
{foreach $bargain_status as $k=>$v}
<li data-status="{$k}">{$v}</li>
{/foreach}
</ul>
<div class="layui-tab-content">
<!-- 列表 -->
<table id="bargain_list" lay-filter="bargain_list"></table>
</div>
</div>
<!-- 商品 -->
<script type="text/html" id="goods_info">
<div class="table-title">
<div class="contraction" data-id="{{d.bargain_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" title="{{d.goods_name}}">{{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>
<!-- 推广 -->
{include file="app/shop/view/component/promote_show.html"}
<!-- 操作 -->
<script type="text/html" id="operation">
<div class="operation-wrap" data-bargain-id="{{d.bargain_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="del">删除</a>
{{# }else if(d.status == 1){ }}
<a class="layui-btn" lay-event="launch">砍价列表</a>
<a class="layui-btn" lay-event="close">结束</a>
{{# }else{ }}
<a class="layui-btn" lay-event="launch">砍价列表</a>
<a class="layui-btn" lay-event="del">删除</a>
{{# } }}
</div>
</div>
</script>
<!-- 批量操作 -->
<script type="text/html" id="toolbarAction">
<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="10">
<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].floor_price}}</span>
<span class="price">库存{{d.list[i].bargain_stock}}</span>
<span class="sale_num">销量{{d.list[i].sale_num}}</span>
<span class="sale_num">参与人数{{d.list[i].join_num}}</span>
</div>
</li>
{{# } }}
</ul>
</td>
</tr>
</script>
<script type="text/javascript" src="SHOP_ADDON_JS/list.js?time=20240603" ></script>

View File

@@ -0,0 +1,4 @@
.screen{margin-bottom: 15px;}
.contraction span{cursor: pointer;display: inline-block;width: 17px;height: 17px;text-align: center;line-height: 14px;user-select: none;}
.screen .layui-colla-content .goods-category-container .layui-input{width: 240px !important;}
.layui-layout-admin .layui-form-item .layui-input-inline{background-color: #fff;}

Binary file not shown.

After

Width:  |  Height:  |  Size: 120 KiB

View File

@@ -0,0 +1,355 @@
var laytpl;
$(function () {
$("body").off("click", ".contraction").on("click", ".contraction", function () {
var bargain_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("bargain://shop/bargain/getSkuList"),
data: {bargain_id: bargain_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,
element = layui.element,
laydate = layui.laydate,
repeat_flag = false; //防重复标识
form.render();
element.on('tab(bargain_tab)', function () {
table.reload({
page: {
curr: 1
},
where: {
'status': this.getAttribute('data-status')
}
});
});
//开始时间
laydate.render({
elem: '#start_time', //指定元素
type: 'datetime'
});
//结束时间
laydate.render({
elem: '#end_time', //指定元素
type: 'datetime'
});
table = new Table({
elem: '#bargain_list',
url: ns.url("bargain://shop/bargain/lists"),
cols: [
[{
type: 'checkbox',
width: '3%',
},{
title: '商品信息',
unresize: 'false',
width: '25%',
templet: '#goods_info'
}, {
title: '商品价格',
unresize: 'false',
width: '8%',
templet: function (data) {
return '¥' + data.price;
}
}, {
field: 'floor_price',
title: '底价',
unresize: 'false',
width: '7%',
sort : true,
templet: function (data) {
return '¥' + data.floor_price;
}
}, {
field: 'join_num',
title: '参与人数',
unresize: 'false',
width: '7%',
sort : true
}, {
field: 'sale_num',
title: '砍价成功人数',
unresize: 'false',
width: '8%',
sort : true
}, {
field: 'bargain_stock',
title: '砍价总库存',
unresize: 'false',
width: '7%'
// }, {
// title: '库存剩余',
// unresize: 'false',
// width: '8%',
// templet: function (data) {
// return data.bargain_stock - data.sale_num;
// }
}, {
title: '活动时间',
unresize: 'false',
width: '15%',
templet: '#time'
}, {
field: 'status_name',
title: '状态',
unresize: 'false',
width: '8%'
}, {
title: '操作',
toolbar: '#operation',
unresize: 'false',
align:'right',
}]
],
toolbar: '#toolbarAction'
});
/**
* 搜索功能
*/
form.on('submit(search)', function (data) {
table.reload({
page: {
curr: 1
},
where: data.field
});
});
table.on("sort",function (obj) {
table.reload({
page: {
curr: 1
},
where: {
order:obj.field,
sort:obj.type
}
});
});
//监听Tab切换
element.on('tab(status)', function (data) {
var status = $(this).attr("data-status");
table.reload({
page: {
curr: 1
},
where: {
'status': status
}
});
});
// 监听工具栏操作
table.toolbar(function (obj) {
var data = obj.data;
if(data.length <= 0) return;
var bargainIdAll = [];
for (var i in data){
bargainIdAll.push(data[i].bargain_id);
}
switch (obj.event) {
case 'delete':
deleteBargainAll(bargainIdAll)
break;
case 'invalid':
closeBargainAll(bargainIdAll)
break;
}
})
//批量删除
function deleteBargainAll(data){
layer.confirm('确定要删除砍价活动吗?', function (index) {
if (repeat_flag) return;
repeat_flag = true;
layer.close(index);
$.ajax({
url: ns.url("bargain://shop/bargain/deleteAll"),
data: {
bargain_id: data
},
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;
});
}
//批量关闭
function closeBargainAll(data){
layer.confirm('确定要结束砍价活动吗?', function (index) {
if (repeat_flag) return;
repeat_flag = true;
layer.close(index);
$.ajax({
url: ns.url("bargain://shop/bargain/finishAll"),
data: {
bargain_id: data
},
dataType: 'JSON',
type: 'POST',
success: function (res) {
layer.msg(res.message);
repeat_flag = false;
table.reload();
}
});
}, function () {
layer.close();
repeat_flag = false;
});
}
/**
* 监听工具栏操作
*/
table.tool(function (obj) {
var data = obj.data;
switch (obj.event) {
case 'detail': //详情
location.hash = ns.hash("bargain://shop/bargain/detail", {"bargain_id": data.bargain_id});
break;
case 'edit': //编辑
location.hash = ns.hash("bargain://shop/bargain/edit", {"bargain_id": data.bargain_id});
break;
case 'del': //删除
deleteGroupbuy(data.bargain_id);
break;
case 'select': //推广
bargainUrl(data);
break;
case 'close': // 结束
closeGroupbuy(data.bargain_id);
break;
case 'launch': //砍价列表
location.hash = ns.hash("bargain://shop/bargain/launchlist", {"bargain_id": data.bargain_id});
break;
}
});
/**
* 删除
*/
function deleteGroupbuy(bargain_id) {
layer.confirm('确定要删除该砍价活动吗?', function (index) {
if (repeat_flag) return;
repeat_flag = true;
layer.close(index);
$.ajax({
url: ns.url("bargain://shop/bargain/delete"),
data: {
bargain_id: bargain_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 closeGroupbuy(bargain_id) {
layer.confirm('确定要结束该砍价活动吗?', function (index) {
if (repeat_flag) return;
repeat_flag = true;
layer.close(index);
$.ajax({
url: ns.url("bargain://shop/bargain/finish"),
data: {
bargain_id: bargain_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 bargainUrl(data){
new PromoteShow({
url:ns.url("bargain://shop/bargain/bargainurl"),
param:{bargain_id:data.bargain_id},
})
}
});
});
function add() {
location.hash = ns.hash("bargain://shop/bargain/add");
}