Files
ZangShiQi/addon/pintuan/shop/view/pintuan/add.html
2026-04-04 17:27:12 +08:00

756 lines
24 KiB
HTML
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<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>