初始上传

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,764 @@
<link rel="stylesheet" href="__STATIC__/ext/video/video.css">
<link rel="stylesheet" type="text/css" href="__STATIC__/ext/searchable_select/searchable_select.css" />
<link rel="stylesheet" type="text/css" href="__STATIC__/ext/layui/extend/cascader/cascader.css"/>
<link rel="stylesheet" type="text/css" href="SHOP_CSS/goods_edit.css?time=20250527" />
<link rel="stylesheet" type="text/css" href="ADDON_CARDSERVICE_CSS/card_goods_edit.css" />
<div class="layui-form">
<div class="layui-tab layui-tab-brief" lay-filter="goods_tab">
<ul class="layui-tab-title">
<li class="layu1i-this" lay-id="basic">基础设置</li>
<li lay-id="price-stock">价格库存</li>
<li lay-id="detail">卡项详情</li>
<li lay-id="senior">高级设置</li>
</ul>
<div class="layui-tab-content">
<!-- 基础设置 -->
<div class="layui-tab-item layui-show">
<!-- 卡项类型 -->
<div class="layui-card card-common card-brief head">
<div class="layui-card-header">
<span class="card-title">商品类型</span>
</div>
<div class="layui-card-body commodity-type-box" >
{foreach name="all_goodsclass" item="vo"}
<div class="commodity-type-item {if $vo.goods_class eq $goods_class.id}border-color{/if}" onclick="location.hash = ns.hash('{$vo.add_url}')">
<span>{$vo.goods_class_name}</span>
<span>{$vo.is_virtual ? '(无需物流)' : '(需要物流)'}</span>
</div>
{/foreach}
</div>
</div>
<div class="layui-card card-common card-brief head">
<div class="layui-card-header">
<span class="card-title">基础信息</span>
</div>
<div class="layui-card-body">
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>卡项类型:</label>
<div class="layui-input-block card-type">
{foreach name="card_type" item="vo" index="index"}
<div class="card-type-item {if $index == 1}active{/if}" data-value="{$vo.type}">
<div class="title">{$vo.title}</div>
<div class="desc">{$vo.desc}</div>
<i class="iconfont iconxuanzhongjiaobiao text-color"></i>
</div>
{/foreach}
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>卡项名称:</label>
<div class="layui-input-inline">
<input name="goods_name" type="text" placeholder="请输入卡项名称不能超过60个字符" maxlength="60" autocomplete="off" lay-verify="goods_name" class="layui-input len-long">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">促销语:</label>
<div class="layui-input-inline">
<textarea class="layui-textarea len-long" name="introduction" maxlength="100" lay-verify="introduction" placeholder="请输入促销语不能超过100个字符"></textarea>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">关键词:</label>
<div class="layui-input-block">
<input type="text" name="keywords" placeholder="卡项关键词用于SEO搜索不能超过100个字符" maxlength="100" autocomplete="off" class="layui-input len-long">
</div>
</div>
<div class="layui-form-item goods-image-wrap">
<label class="layui-form-label"><span class="required">*</span>卡项主图:</label>
<div class="layui-input-block">
<!--卡项主图项-->
<div class="js-goods-image"></div>
</div>
<div class="word-aux">第一张图片将作为卡项主图,支持同时上传多张图片,多张图片之间可随意调整位置;</div>
<div class="word-aux">支持jpg、gif、png格式上传或从图片空间中选择建议使用尺寸800x800像素以上、大小不超过1M的正方形图片</div>
<div class="word-aux">上传后的图片将会自动保存在图片空间的默认分类中最多上传10张至少1张</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">卡项视频:</label>
<div class="layui-input-block">
<div class="video-thumb">
<video id="goods_video" class="video-js vjs-big-play-centered" controls="" poster="SHOP_IMG/goods_video_preview.png" preload="auto"></video>
</div>
<div id="videoUpload2" class="up-video " title="卡项视频" >
<span class="delete-video hide" onclick="deleteVideo()"><img class="del-img" src="SHOP_IMG/delete.png">删除</span>
<span class="replace-video hide js-add-goods-video" ><img class="up-img" src="SHOP_IMG/upload.png">上传视频</span>
</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"></label>
<div class="layui-input-block">
<input type="text" name="video_url" placeholder="在此输入外链视频地址" autocomplete="off" class="layui-input len-long">
</div>
<div class="file-title word-aux">
<div>注意事项:</div>
<ul>
<li>1、检查upload文件夹是否有读写权限。</li>
<li>2、PHP默认上传限制为2MB需要在php.ini配置文件中修改“post_max_size”和“upload_max_filesize”的大小。</li>
<li>3、视频支持手动输入外链视频地址或者上传本地视频文件</li>
<li>4、必须上传.mp4视频格式</li>
<li>5、视频文件大小不能超过500MB</li>
</ul>
</div>
</div>
<div class="card-type-content discountcard" style="display: none">
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>适用商品:</label>
<div class="layui-input-block">
<input type="radio" name="discount_goods_type" value="all" title="全部商品" checked lay-filter="discount_goods_type">
<input type="radio" name="discount_goods_type" value="part" title="部分商品" lay-filter="discount_goods_type">
</div>
</div>
<div class="layui-form-item discount-goods all">
<label class="layui-form-label"><span class="required">*</span>折扣卡折扣:</label>
<div class="layui-input-inline">
<input type="number" name="discount" placeholder="0" class="layui-input len-short" lay-verify="common_discount" autocomplete="off">
</div>
<div class="layui-form-mid layui-word-aux">%</div>
<div class="layui-form-mid word-aux">购卡后购买商品或服务时可享折扣 1-99之间</div>
</div>
<div class="layui-form-item discount-goods part" style="display: none">
<label class="layui-form-label"></label>
<div class="layui-input-block">
<button class="layui-btn add-relation-goods">选择商品</button>
<div class="relation-goods-table discountcard" lay-verify="relation_discount_goods">
<table id="relationDiscountGoods"></table>
</div>
</div>
<div class="word-aux batch-set">
<div class="batch-set-wrap">
<span>批量操作:</span>
<div class="set-item">
<a href="javascript:;" class="text-color set">可享受折扣</a>
</div>
<div class="set-content-wrap">
<input type="number" placeholder="0" class="layui-input len-short value" autocomplete="off" data-type="discount">
<button class="layui-btn confirm">确认</button>
<button class="layui-btn layui-btn-primary cancel">取消</button>
</div>
</div>
</div>
</div>
</div>
<div class="layui-form-item card-type-content oncecard timecard commoncard">
<label class="layui-form-label"><span class="required">*</span>卡项内容:</label>
<div class="layui-input-block">
<a href="javascript:;" class="text-color add-relation-goods" data-goods-class="4">添加卡项项目</a>
<a href="javascript:;" class="text-color add-relation-goods" data-goods-class="1">添加实物商品</a>
<div class="relation-goods-table oncecard" lay-verify="relation_goods">
<table id="relationGoods"></table>
</div>
</div>
<div class="word-aux batch-set">
<div class="batch-set-wrap">
<span>批量操作:</span>
<div class="set-item">
<a href="javascript:;" class="text-color set">可用次数</a>
</div>
<div class="set-content-wrap">
<input type="number" placeholder="0" class="layui-input len-short value" autocomplete="off" data-type="num">
<button class="layui-btn confirm">确认</button>
<button class="layui-btn layui-btn-primary cancel">取消</button>
</div>
</div>
</div>
</div>
<div class="layui-form-item card-type-content commoncard" style="display: none">
<label class="layui-form-label"><span class="required">*</span>可用次数/数量:</label>
<div class="layui-input-block">
<input type="text" name="common_num" placeholder="0" lay-verify="common_num" class="layui-input len-short" autocomplete="off">
</div>
<div class="layui-form-mid word-aux">卡项内项目/商品总的可用次数</div>
</div>
{notempty name="$service_list"}
<div class="layui-form-item">
<label class="layui-form-label">卡项服务:</label>
<div class="layui-input-block">
{foreach name="$service_list" item="vo"}
<input type="checkbox" name="goods_service_ids" value="{$vo.id}" title="{$vo.service_name}" lay-skin="primary">
{/foreach}
</div>
</div>
{/notempty}
<div class="layui-form-item goods_state">
<label class="layui-form-label"><span class="required">*</span>是否上架:</label>
<div class="layui-input-block">
<input type="radio" name="goods_state" value="1" title="立刻上架" checked lay-filter="goods_state">
<input type="radio" name="goods_state" value="0" title="放入仓库" lay-filter="goods_state">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">定时下架:</label>
<div class="layui-input-block">
<input type="radio" name="timer_off_status" value="1" title="启用" lay-filter="timer_off">
<input type="radio" name="timer_off_status" value="2" title="不启用" lay-filter="timer_off" checked>
</div>
<div class="word-aux">启用定时下架后,到达设定时间,此卡项将自动下架。</div>
</div>
<div class="layui-form-item timer_off" style="display: none;">
<label class="layui-form-label"></label>
<div class="layui-input-inline">
<input type="text" id="timer_off" name="timer_off" class="layui-input len-mid" autocomplete="off" readonly>
<i class=" iconrili iconfont calendar"></i>
</div>
</div>
{if addon_is_exit('cashier') == 1}
<div class="layui-form-item">
<label class="layui-form-label">销售渠道:</label>
<div class="layui-input-block">
<input type="radio" name="sale_channel" value="all" title="线上线下销售" checked>
<input type="radio" name="sale_channel" value="online" title="线上销售">
<input type="radio" name="sale_channel" value="offline" title="线下销售">
</div>
</div>
{/if}
{if $store_is_exit}
<div class="layui-form-item">
<label class="layui-form-label">适用门店:</label>
<div class="layui-input-block">
<input type="radio" name="sale_store" value="all" title="全部门店" checked lay-filter="sale_store">
<input type="radio" name="sale_store" value="" title="部分门店" lay-filter="sale_store">
</div>
</div>
<div class="layui-form-item sale-store-select" style="display: none" lay-verify="sale_store">
<label class="layui-form-label"></label>
<div class="layui-input-block">
<button class="layui-btn select-store">选择门店</button>
<div style="width: 700px">
<table class="layui-table" lay-skin="nob">
<colgroup>
<col width="30%">
<col width="60%">
<col width="10%">
</colgroup>
<tr>
<th>门店名称</th>
<th>门店地址</th>
<th>操作</th>
</tr>
<tbody class="sale-store"></tbody>
</table>
</div>
</div>
</div>
{/if}
<div class="layui-form-item">
<label class="layui-form-label">卡项有效期:</label>
<div class="layui-input-block">
<input type="radio" name="validity_type" value="0" title="永久" checked lay-filter="validity_type">
<input type="radio" name="validity_type" value="1" title="购买后几日有效" lay-filter="validity_type">
<input type="radio" name="validity_type" value="2" title="指定过期日期" lay-filter="validity_type">
</div>
</div>
<div class="layui-form-item validity-type validity-type-1 layui-hide">
<label class="layui-form-label"><span class="required">*</span>有效期:</label>
<div class="layui-input-inline">
<input type="text" name="validity_day" placeholder="0" class="layui-input len-short" lay-verify="validity_day" autocomplete="off">
</div>
<div class="layui-form-mid layui-word-aux"></div>
</div>
<div class="layui-form-item validity-type validity-type-2 layui-hide">
<label class="layui-form-label"><span class="required">*</span>有效期:</label>
<div class="layui-input-inline">
<input type="text" id="validity_time" name="validity_time" class="layui-input len-mid" lay-verify="validity_time" autocomplete="off" readonly>
<i class=" iconrili iconfont calendar"></i>
</div>
</div>
{if $store_is_exit}
<div class="layui-form-item">
<label class="layui-form-label">是否统一售价:</label>
<div class="layui-input-block">
<input type="radio" name="is_unify_price" value="1" title="是" checked >
<input type="radio" name="is_unify_price" value="0" title="否" >
</div>
<div class="word-aux">价格设置之后门店不能修改价格,门店按照平台设置的价格售卖</div>
</div>
{/if}
</div>
</div>
</div>
<!-- 价格库存 -->
<div class="layui-tab-item">
<div class="layui-form-item layui-hide">
<label class="layui-form-label">启用多规格:</label>
<div class="layui-input-inline">
<input type="checkbox" value="1" lay-skin="switch" name="spec_type" lay-filter="spec_type" lay-verify="spec_type">
<input type="hidden" id="spec_type_status" value="0">
</div>
</div>
<!-- 单规格 -->
<div class="js-single-spec">
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>开卡价格:</label>
<div class="layui-input-block">
<input type="text" name="price" placeholder="0.00" lay-verify="price" class="layui-input len-short" autocomplete="off">
<div class="layui-form-mid"></div>
</div>
<div class="word-aux">卡项购买价格</div>
</div>
<!--<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>续费价格:</label>
<div class="layui-input-block">
<input type="text" name="renew_price" placeholder="0.00" lay-verify="renew_price" class="layui-input len-short" autocomplete="off">
<div class="layui-form-mid">元</div>
</div>
<div class="word-aux">卡项续费价格</div>
</div>-->
<div class="layui-form-item">
<label class="layui-form-label">划线价:</label>
<div class="layui-input-block">
<input type="text" name="market_price" placeholder="0.00" lay-verify="market_price" class="layui-input len-short" autocomplete="off">
<div class="layui-form-mid"></div>
</div>
<div class="word-aux">卡项没有优惠活动显示的划线价格,如果卡项有折扣等优惠活动划线价显示销售价</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">成本价:</label>
<div class="layui-input-block">
<input type="text" name="cost_price" placeholder="0.00" class="layui-input len-short" lay-verify="cost_price" autocomplete="off">
<div class="layui-form-mid"></div>
</div>
<div class="word-aux">成本价将不会对前台会员展示,用于商家统计使用</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">卡项编码:</label>
<div class="layui-input-inline">
<input type="text" name="sku_no" placeholder="请输入卡项编码" maxlength="50" class="layui-input len-long" autocomplete="off">
</div>
</div>
</div>
<!-- 多规格 -->
<div class="js-more-spec">
<!--规格项/规格值-->
<div class="spec-edit-list"></div>
<div class="layui-form-item js-add-spec">
<label class="layui-form-label"></label>
<div class="layui-input-inline">
<button class="layui-btn" type="button">添加规格</button>
</div>
</div>
<div class="layui-form-item batch-operation-sku">
<label class="layui-form-label">批量操作:</label>
<div class="layui-input-inline">
<span class="text-color" data-field="spec_name">副标题</span>
<span class="text-color" data-field="price" data-verify="price">销售价</span>
<span class="text-color" data-field="market_price" data-verify="market_price">划线价</span>
<span class="text-color" data-field="cost_price" data-verify="cost_price">成本价</span>
<span class="text-color" data-field="stock" data-verify="stock">库存</span>
<span class="text-color" data-field="stock_alarm" data-verify="stock_alarm">库存预警</span>
<span class="text-color" data-field="sku_no" data-verify="">卡项编码</span>
<input type="text" class="layui-input len-short" name="batch_operation_sku" autocomplete="off" />
<button class="layui-btn confirm" type="button">确定</button>
<button class="layui-btn layui-btn-primary cancel" type="button">取消</button>
</div>
</div>
<!--sku列表-->
<div class="layui-form-item sku-table">
<label class="layui-form-label"></label>
<div class="layui-input-block"></div>
</div>
</div>
<div class="layui-form-item js-goods-stock-wrap">
<label class="layui-form-label"><span class="required">*</span>库存:</label>
<div class="layui-input-block">
<input type="number" name="goods_stock" placeholder="0" lay-verify="goods_stock" class="layui-input len-short" autocomplete="off">
<div class="layui-form-mid"></div>
</div>
</div>
<div class="layui-form-item js-goods-stock-wrap">
<label class="layui-form-label">库存预警:</label>
<div class="layui-input-block">
<input type="number" name="goods_stock_alarm" placeholder="0" lay-verify="goods_stock_alarm" class="layui-input len-short" autocomplete="off">
<div class="layui-form-mid"></div>
</div>
<div class="word-aux">卡项库存少于预警数量卡项列表库存数量标红显示0为不预警。</div>
</div>
<div class="layui-form-item js-goods-stock-wrap">
<label class="layui-form-label">服务时长:</label>
<div class="layui-input-block">
<input type="number" name="service_length" placeholder="0" lay-verify="service_length" class="layui-input len-short" autocomplete="off">
<div class="layui-form-mid">分钟</div>
</div>
</div>
<div class="layui-form-item ">
<label class="layui-form-label">虚拟销量:</label>
<div class="layui-input-block">
<input type="number" name="virtual_sale" placeholder="0" lay-verify="virtual_sale" class="layui-input len-short" autocomplete="off">
<div class="layui-form-mid"></div>
</div>
<div class="word-aux">该设置不计入卡项统计数据</div>
</div>
<div class="layui-form-item is_limit">
<label class="layui-form-label">是否限购:</label>
<div class="layui-input-block">
<input type="radio" name="is_limit" value="0" title="否" lay-filter="is_limit" checked>
<input type="radio" name="is_limit" value="1" title="是" lay-filter="is_limit">
</div>
<div class="word-aux">启用限购后,购买卡项时,会对该卡项购买量做限制判断。</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">起售:</label>
<div class="layui-input-block">
<input type="number" name="min_buy" placeholder="" lay-verify="min_buy" class="layui-input len-short" autocomplete="off">
<div class="layui-form-mid"></div>
</div>
<div class="word-aux">起售数量超出卡项库存时,买家无法购买该卡项</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">会员等级折扣:</label>
<div class="layui-input-block">
<div class="layui-input-inline">
<input type="radio" name="is_consume_discount" value="1" title="参与" checked>
<input type="radio" name="is_consume_discount" value="0" title="不参与">
</div>
</div>
<div class="word-aux">按照默认会员等级折扣优惠</div>
</div>
</div>
<!-- 卡项详情 -->
<div class="layui-tab-item">
<div class="layui-form-item">
<label class="layui-form-label sm"></label>
<div class="layui-input-inline special-length">
<script id="editor" type="text/plain" style="width:100%;height:500px;"></script>
</div>
</div>
<script type="text/javascript" charset="utf-8" src="__STATIC__/ext/ueditor/ueditor.config.js"></script>
<script type="text/javascript" charset="utf-8" src="__STATIC__/ext/ueditor/ueditor.all.js"> </script>
<script type="text/javascript" charset="utf-8" src="__STATIC__/ext/ueditor/lang/zh-cn/zh-cn.js"></script>
</div>
<div class="layui-tab-item layui-card card-common card-brief head">
<div class="layui-card-header">
<span class="card-title">高级设置</span>
</div>
<div class="layui-card-body">
<div class="layui-form-item">
<label class="layui-form-label">排序:</label>
<div class="layui-input-block">
<input type="number" name="sort" class="layui-input len-short" value="{$sort_config['default_value']}" placeholder="0" autocomplete="off">
</div>
<div class="word-aux">卡项默认排序号为0数字越大排序越靠前数字重复则最新添加的靠前。</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">卡项详情显示库存:</label>
<div class="layui-input-block">
<input type="radio" name="stock_show" value="1" title="显示" checked >
<input type="radio" name="stock_show" value="0" title="隐藏" >
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">划线价显示:</label>
<div class="layui-input-block">
<input type="radio" name="market_price_show" value="1" title="显示" checked>
<input type="radio" name="market_price_show" value="0" title="隐藏" >
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">卡项详情显示弹幕:</label>
<div class="layui-input-block">
<input type="radio" name="barrage_show" value="1" title="显示" checked>
<input type="radio" name="barrage_show" value="0" title="隐藏" >
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">卡项详情显示销量:</label>
<div class="layui-input-block">
<input type="radio" name="sale_show" value="1" title="显示" checked>
<input type="radio" name="sale_show" value="0" title="隐藏" >
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">卡项海报:</label>
<div class="layui-input-inline">
<select name="template_id" lay-search="" lay-verify="">
<option value="">请选择卡项海报</option>
{foreach name="$poster_list" item="vo"}
<option value="{$vo['template_id']}">{$vo['poster_name']}</option>
{/foreach}
</select>
</div>
</div>
{if $form_is_exit}
<div class="layui-form-item">
<label class="layui-form-label">卡项表单:</label>
<div class="layui-input-block len-mid">
<select name="form_id">
<option value="0">请选择卡项表单</option>
{foreach name="$form_list" item="vo"}
<option value="{$vo.id}">{$vo.form_name}</option>
{/foreach}
</select>
</div>
<div class="word-aux">
<a href="{:href_url('form://shop/form/addform?form_type=goods')}" class="text-color" target="_blank">创建卡项表单</a>
<a href="javascript:;" onclick="refreshFormList()" class="text-color">刷新</a>
</div>
</div>
{/if}
</div>
</div>
</div>
</div>
<div class="fixed-btn">
<button class="layui-btn layui-btn-primary border-color text-color js-prev" lay-filter="prev">上一步</button>
<button class="layui-btn js-save" lay-submit="" lay-filter="save">保存</button>
<button class="layui-btn layui-btn-primary border-color text-color js-next" lay-submit="" lay-filter="next">下一步</button>
</div>
</div>
<!--规格项模板-->
<script type="text/html" id="specTemplate">
{{# for(var i=0;i<d.list.length;i++){ }}
<div class="spec-item" data-index="{{i}}">
<div class="layui-form-item spec">
<label class="layui-form-label">规格项{{i+1}}</label>
<div class="layui-input-inline">
<select name="spec_item">
<option value="0"></option>
{{# if(d.list[i].spec_name != ''){ }}
<option value="{{d.list[i].spec_id}}" data-attr-name="{{d.list[i].spec_name}}" selected>{{d.list[i].spec_name}}</option>
{{# }else{ }}
{{# } }}
</select>
<i class="layui-icon layui-icon-close" data-index="{{i}}"></i>
</div>
{{# if(i==0){ }}
<div class="layui-input-inline">
{{# if(d.add_spec_img){ }}
<input type="checkbox" name="add_spec_img" title="添加规格图片" lay-skin="primary" lay-filter="add_spec_img" checked>
{{# }else{ }}
<input type="checkbox" name="add_spec_img" title="添加规格图片" lay-skin="primary" lay-filter="add_spec_img">
{{# } }}
</div>
{{# } }}
</div>
{{# if(d.list[i].spec_name != ''){ }}
<div class="layui-form-item spec-value">
{{# }else{ }}
<div class="layui-form-item spec-value" style="display:none;">
{{# } }}
<label class="layui-form-label"></label>
<div class="layui-input-block spec-value">
{{# if(d.list[i].value.length){ }}
<ul>
{{# for(var j=0;j<d.list[i].value.length;j++){ }}
<li data-index="{{j}}" data-parent-index="{{i}}" >
{{# if(i==0 && d.add_spec_img){ }}
<div class="img-wrap">
{{# if(d.list[i].value[j].image){ }}
<img src="{{ns.img(d.list[i].value[j].image)}}" alt="">
{{# }else{ }}
<img src="SHOP_IMG/goods_spec_value_empty.png" alt="">
{{# } }}
</div>
{{# } }}
<span title="双击可编辑规格值" ondblclick="$(this).attr('contenteditable',true);$(this).focus()" class="spec-txt" data-spec_value_name="{{d.list[i].value[j].spec_value_name}}" data-parent-index="{{i}}" data-index="{{j}}">{{d.list[i].value[j].spec_value_name}}</span>
<i class="layui-icon layui-icon-close" data-parent-index="{{i}}" data-index="{{j}}"></i>
</li>
{{# } }}
</ul>
{{# } }}
<a class="text-color" href="javascript:;" data-index="{{i}}">+添加规格值</a>
<div class="add-spec-value-popup" data-index="{{i}}">
<select name="spec_value_item"></select>
<button class="layui-btn layui-btn-primary border-color text-color js-cancel-spec-value">取消</button>
</div>
</div>
</div>
</div>
{{# } }}
</script>
<!--SKU列表模板-->
<script type="text/html" id="skuTableTemplate">
{{# if(d.skuList.length){ }}
<table class="layui-table">
<colgroup></colgroup>
<thead>
<tr>
{{# if(d.showSpecName){ }}
<th colspan="{{d.colSpan}}" style="min-width: 60px;">卡项规格</th>
{{# } }}
<th rowspan="{{d.rowSpan}}">SKU图片</th>
<th rowspan="{{d.rowSpan}}">副标题</th>
<th rowspan="{{d.rowSpan}}"><span class="required">*</span></th>
<th rowspan="{{d.rowSpan}}">划线价</th>
<th rowspan="{{d.rowSpan}}">成本价</th>
<th rowspan="{{d.rowSpan}}"><span class="required">*</span></th>
<th rowspan="{{d.rowSpan}}">库存预警</th>
<th rowspan="{{d.rowSpan}}">服务时长</th>
<th rowspan="{{d.rowSpan}}">商品编码多个编码以英文逗号分割</th>
<th rowspan="{{d.rowSpan}}" style="white-space: nowrap;">默认展示</th>
</tr>
{{# if(d.colSpan>1){ }}
<tr>
{{# for(var i=0;i<d.specList.length;i++){ }}
{{# if(d.specList[i].spec_name && d.specList[i].value.length> 0){ }}
<th>{{d.specList[i].spec_name}}</th>
{{# } }}
{{# } }}
</tr>
{{# } }}
</thead>
<tbody>
{{# for(var i=0;i<d.skuList.length;i++){ }}
<tr>
<td class="sku_imgs" id="sku_img_{{i}}" style="width: 130px;">
{{# for(var j=0;j<d.skuList[i].sku_images_arr.length;j++){ }}
<div class="img-wrap" data-index="{{j}}" data-parent-index="{{i}}">
<a href="javascript:void(0)">
<img src="{{ns.img(d.skuList[i].sku_images_arr[j])}}" layer-src />
</a>
<div class="operation">
<i title="图片预览" class="iconfont iconreview js-preview"></i>
<i title="删除图片" class="layui-icon layui-icon-delete js-delete"></i>
</div>
</div>
{{# } }}
{{# if(d.skuList[i].sku_images_arr.length<d.goods_sku_max){ }}
<div class="upload-sku-img" data-index="{{i}}"><i class="layui-icon layui-icon-add-1"></i></div>
{{# } }}
</td>
<td>
<input type="text" name="spec_name" placeholder="副标题" maxlength="100" value="{{d.skuList[i].spec_name}}" class="layui-input" autocomplete="off" data-index="{{i}}">
</td>
<td>
<input type="text" name="price" placeholder="销售价" lay-verify="sku_price" value="{{d.skuList[i].price}}" class="layui-input" autocomplete="off" data-index="{{i}}">
</td>
<td>
<input type="text" name="market_price" placeholder="划线价" value="{{d.skuList[i].market_price}}" lay-verify="sku_market_price" class="layui-input" autocomplete="off" data-index="{{i}}">
</td>
<td>
<input type="text" name="cost_price" placeholder="成本价" value="{{d.skuList[i].cost_price}}" lay-verify="sku_cost_price" class="layui-input" autocomplete="off" data-index="{{i}}">
</td>
<td>
<input type="text" name="stock" placeholder="库存" value="{{d.skuList[i].stock}}" lay-verify="sku_stock" class="layui-input" autocomplete="off" data-index="{{i}}">
</td>
<td>
<input type="text" name="stock_alarm" placeholder="库存预警" value="{{d.skuList[i].stock_alarm}}" lay-verify="sku_stock_alarm" class="layui-input" autocomplete="off" data-index="{{i}}">
</td>
<td>
<input type="number" name="service_length" placeholder="服务时长" value="{{d.skuList[i].service_length}}" maxlength="50" class="layui-input" autocomplete="off" data-index="{{i}}" lay-verify="service_length">
</td>
<td>
<input type="text" name="sku_no" placeholder="商品编码" value="{{d.skuList[i].sku_no}}" maxlength="50" class="layui-input" autocomplete="off" data-index="{{i}}">
</td>
<td style="min-width: 40px;">
{{# if(d.skuList[i].is_default == 1) { }}
<input type="checkbox" data-index="{{i}}" name="is_default" lay-filter="is_default" lay-skin="switch" checked>
{{# }else { }}
<input type="checkbox" data-index="{{i}}" name="is_default" lay-filter="is_default" lay-skin="switch">
{{# } }}
</td>
</tr>
{{# } }}
</tbody>
</table>
{{# } }}
<div class="word-aux text-color" style="margin: 10px 0 0 0;">默认展示是多规格卡项在客户访问卡项时默认显示的卡项规格</div>
</script>
<!--卡项主图列表-->
<script type="text/html" id="goodsImage">
{{# if(d.list.length){ }}
{{# for(var i=0;i<d.list.length;i++){ }}
<div class="item upload_img_square_item" data-index="{{i}}">
<div class="img-wrap">
<img src="{{ns.img(d.list[i],'small')}}" layer-src="{{ns.img(d.list[i],'big')}}">
</div>
<div class="operation">
<i title="图片预览" class="iconfont iconreview js-preview"></i>
<i title="删除图片" class="layui-icon layui-icon-delete js-delete" data-index="{{i}}"></i>
<div class="replace_img" data-index="{{i}}">点击替换</div>
</div>
</div>
{{# } }}
{{# if(d.list.length < d.max){ }}
<div class="item js-add-goods-image upload_img_square">+</div>
{{# } }}
{{# }else{ }}
<div class="item js-add-goods-image upload_img_square">+</div>
{{# } }}
</script>
<script>
var relationGoods = [];
</script>
<script src="__STATIC__/ext/drag-arrange.js"></script>
<script src="__STATIC__/ext/video/videojs-ie8.min.js"></script>
<script src="__STATIC__/ext/video/video.min.js"></script>
<script src="__STATIC__/ext/searchable_select/searchable_select.js"></script>
<script src="SHOP_JS/goods_edit_common.js?time=20250527"></script>
<script src="ADDON_CARDSERVICE_JS/card_goods_edit.js?v=1"></script>

View File

@@ -0,0 +1,247 @@
<style>
.card-common {margin-top: 15px;margin-bottom: 0;box-shadow: initial;}
.card-common .layui-card-body{padding-top: 0;}
.promotion-view{display:flex;flex-wrap:wrap}
.promotion-view-item{width:33.3%;padding-right:10px;box-sizing:border-box;line-height:30px}
.promotion-view-item-line{padding-right:10px;box-sizing:border-box;line-height:30px;overflow: hidden;width: 100%}
.promotion-view-item-custom-label{float:left}
.promotion-view-item-custom-box{float:left}
.promotion-stat-view{display:flex;flex-wrap:wrap}
.promotion-stat-view .promotion-stat-item{width:25%;padding:0 15px 10px 15px;box-sizing:border-box}
.promotion-stat-view .promotion-stat-item .promotion-stat-item-title{color:#909399;font-size:14px;margin-top:5px}
.promotion-stat-view .promotion-stat-item .promotion-stat-item-value{color:#303133;font-size:26px;margin-top:10px}
.todo-list .promotion-stat-item{flex:1;width:0;cursor:pointer}
.layui-layout-admin .layui-body .body-content {background: 0 0;padding: 0;}
.gift-card-goods span{cursor: pointer; color: var(--base-color);}
.layui-tab-title{margin-bottom: 15px;}
.layui-layout-admin .single-filter-box.top {padding-top: 0 !important;}
.add-way .add-way-item{display: flex;margin: 8px 0;align-items: center;}
.add-way .add-way-item input{margin: 0 10px;}
.add-way .add-way-item .layui-form-radio{margin-right: 0;}
.disabled-click{pointer-events: none;color: #999 !important;}
#addFile{margin-left: 10px; cursor: pointer;color: var(--base-color);}
.card-goods .layui-table{margin-bottom: 0;margin-top: 0;}
#card_right_type_goods #goods{border: 0;}
.card-goods .layui-table .goods-title{display: flex;align-items: center;}
.card-goods .layui-table .goods-title .goods-img{width: 55px;height: 55px;line-height: 55px;flex-shrink: 0;margin-right: 10px;}
.card-goods .layui-table .goods-title .goods-img img{max-width: 100%;max-height: 100%;}
.card-goods .layui-table-body{overflow: auto;max-height: 425px;margin-bottom: 15px;border-bottom: 1px solid #e6e6e6;}
.card-goods .layui-table-body .layui-table{border: none;}
.card-goods .layui-table-body tbody tr:last-of-type td{border: none;}
.card-goods .layui-table-head tr th:last-of-type{text-align: right;}
.card-goods .layui-table-body tr td:last-of-type{text-align: right;}
.card-tab{margin-bottom: 15px;margin-top: 15px;}
/* 商品列表 */
.shop-information-table > p{padding-left: 5px;padding-bottom: 5px;}
.shop-information-table table {width: 100%;border: 1px solid rgb(238,238,238);}
.shop-information-table .table-body {max-height: 400px;overflow: auto;}
.table-trOne{height: 48px;background:rgb(245,245,245) ;}
.shop-information-table th{text-align: left;padding-left:28px;box-sizing: border-box;font-weight: 500;color:#333333;}
.shop-information-table th:last-child{border:none;}
.table-trTow{width:100%;height:60px;border-top:1px solid rgb(238,238,238);}
.table-trTow>td{text-align: left;padding-left:28px;box-sizing: border-box;font-weight: 500;color:#333333;border-right:1px solid rgb(238,238,238);}
.table-trTow>td:nth-child(5){color:var(--base-color)}
.layui-tab-content {
padding: 0;
}
.layui-layout-admin .screen {
margin-bottom: 15px;
}
</style>
<div class="layui-card card-common card-brief">
<div class="layui-card-header">
<span class="card-title">基本信息</span>
</div>
<div class="layui-card-body">
<div class="promotion-view">
<div class="promotion-view-item">
<label>卡项名称:</label>
<span>{$detail.goods_name}</span>
</div>
<div class="promotion-view-item grouping">
<label>价格:</label>
<span>¥{$detail.price}</span>
</div>
<div class="promotion-view-item grouping">
<label>所属会员:</label>
<span>{$detail.nickname}</span>
</div>
<div class="promotion-view-item grouping">
<label>卡类型:</label>
<span>{$detail.card_type_name}</span>
</div>
<div class="promotion-view-item grouping">
<label>总次数/已使用:</label>
<span>{if $detail.card_type == "timecard"}不限{else/}{$detail.total_num} {/if}/{$detail.total_use_num}</span>
</div>
<div class="promotion-view-item grouping">
<label>获取时间:</label>
<span>{:date('Y-m-d H:i:s',$detail.create_time)}</span>
</div>
<div class="promotion-view-item grouping">
<label>过期时间:</label>
{if $detail.end_time > 0}
<span>{:date('Y-m-d H:i:s',$detail.end_time)}</span>
{else /}
<span>永久有效</span>
{/if}
</div>
<div class="promotion-view-item grouping">
<label>卡状态:</label>
{$detail.status == 1 ? '正常' : '已失效'}
</div>
</div>
</div>
</div>
<div class="layui-card card-common card-brief">
<div class="layui-card-header">
<span class="card-title">卡项商品</span>
</div>
<div class="layui-card-body layui-tab layui-tab-brief" lay-filter="edit_user_tab">
<ul class="layui-tab-title">
<li class="layui-this" lay-id="basic_info">商品信息</li>
<li lay-id="basic_info">使用记录</li>
</ul>
<div class="layui-tab-content">
<div class="layui-tab-item layui-show">
<table id="data_list" lay-filter="data_list"></table>
</div>
<div class="layui-tab-item">
<table id="recrods_list" lay-filter="recrods_list"></table>
</div>
</div>
</div>
</div>
<!-- 工具栏操作 -->
<script type="text/html" id="operation">
<div class="table-btn">
<a class="layui-btn" lay-event="order">查看订单</a>
</div>
</script>
<script type="text/html" id="memberInfo">
<div class='table-title'>
<div class='title-pic'>
<img layer-src src="{{ns.img(d.headimg)}}" onerror="this.src = '{:img('public/static/img/default_img/head.png')}' ">
</div>
<div class='title-content' onclick="location.hash = ns.hash('shop/member/editmember?member_id={{d.member_id}}')">
<p class="layui-elip">{{d.nickname}}</p>
<p class="layui-elip">{{d.mobile}}</p>
</div>
</div>
</script>
<script type="text/html" id="operation">
<div class="table-btn">
{{# if(d.status == 'to_activate'){ }}
<a class="layui-btn" lay-event="delete">删除</a>
{{# } }}
{{# if(d.status != 'to_activate'){ }}
<a class="layui-btn" lay-event="info">详情</a>
{{# } }}
</div>
</script>
<script>
var table,element,form,laytpl,repeat_flag=false,records_table;
layui.use(['form', 'element', 'laytpl','laydate'], function () {
laytpl = layui.laytpl;
element = layui.element;
form = layui.form;
form.render();
table = new Table({
elem: '#data_list',
url: ns.url("cardservice://shop/card/getcarditem", {'card_id':"{$detail['card_id']}"}),
cols: [
[{
field: 'goods_name',
title: '商品名称',
unresize: 'false',
width: '50%',
}, {
field: '',
title: '总次数',
unresize: 'false',
templet: function (data) {
var totalNum = data.card_type == 'timecard' ? '不限' : data.num;
return totalNum;
}
}, {
field: '',
title: '已使用',
unresize: 'false',
templet: function (data) {
return data.use_num;
}
}]
]
});
records_table = new Table({
elem: '#recrods_list',
url: ns.url("cardservice://shop/card/records", {'card_id':"{$detail['card_id']}"}),
cols: [
[{
field: 'sku_name',
title: '卡项名称',
unresize: 'false',
width: '20%',
},{
field: 'store_name',
title: '使用门店',
unresize: 'false',
width: '15%',
}, {
field: '',
title: '使用次数',
unresize: 'false',
width: '15%',
templet: function (data) {
return data.num;
}
}, {
title: '使用时间',
unresize: 'false',
width: '15%',
templet: function (data) {
return ns.time_to_date(data.create_time);
}
}, {
title: '操作',
toolbar: '#operation',
unresize: 'false',
align : 'right'
}]
]
});
/**
* 监听工具栏操作
*/
records_table.tool(function(obj) {
var data = obj.data;
switch (obj.event) {
case 'order':
window.open(ns.href("shop/order/detail?order_id=" + data.order_id));
break;
}
});
/**
* 搜索功能
*/
form.on('submit(search)', function (data) {
records_table.reload({
page: {curr: 1},
where: data.field
});
return false;
});
})
</script>

View File

@@ -0,0 +1,857 @@
<link rel="stylesheet" href="__STATIC__/ext/video/video.css">
<link rel="stylesheet" type="text/css" href="__STATIC__/ext/searchable_select/searchable_select.css" />
<link rel="stylesheet" type="text/css" href="__STATIC__/ext/layui/extend/cascader/cascader.css"/>
<link rel="stylesheet" type="text/css" href="SHOP_CSS/goods_edit.css?time=20250527" />
<link rel="stylesheet" type="text/css" href="ADDON_CARDSERVICE_CSS/card_goods_edit.css" />
<div class="layui-form">
<div class="layui-tab layui-tab-brief" lay-filter="goods_tab">
<ul class="layui-tab-title">
<li class="layu1i-this" lay-id="basic">基础设置</li>
<li lay-id="price-stock">价格库存</li>
<li lay-id="detail">卡项详情</li>
<li lay-id="senior">高级设置</li>
</ul>
<div class="layui-tab-content">
<!-- 基础设置 -->
<div class="layui-tab-item layui-show">
<div class="layui-card card-common card-brief head">
<div class="layui-card-header">
<span class="card-title">基础信息</span>
</div>
<div class="layui-card-body">
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>卡项类型:</label>
<div class="layui-input-block card-type">
{foreach name="card_type" item="vo" index="index"}
{if $vo.type eq $goods_info.card_type}
<div class="card-type-item active" data-value="{$vo.type}">
<div class="title">{$vo.title}</div>
<div class="desc">{$vo.desc}</div>
<i class="iconfont iconxuanzhongjiaobiao text-color"></i>
</div>
{/if}
{/foreach}
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>卡项名称:</label>
<div class="layui-input-inline">
<input name="goods_name" type="text" value="{$goods_info['goods_name']}" placeholder="请输入卡项名称不能超过60个字符" maxlength="60" autocomplete="off" lay-verify="goods_name" class="layui-input len-long">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">促销语:</label>
<div class="layui-input-inline">
<textarea class="layui-textarea len-long" name="introduction" maxlength="100" lay-verify="introduction" placeholder="请输入促销语不能超过100个字符">{$goods_info['introduction']}</textarea>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">关键词:</label>
<div class="layui-input-block">
<input type="text" name="keywords" value="{$goods_info['keywords']}" placeholder="卡项关键词用于SEO搜索不能超过100个字符" maxlength="100" autocomplete="off" class="layui-input len-long">
</div>
</div>
<div class="layui-form-item goods-image-wrap">
<label class="layui-form-label"><span class="required">*</span>卡项主图:</label>
<div class="layui-input-block">
<!--卡项主图项-->
<div class="js-goods-image"></div>
</div>
<div class="word-aux">第一张图片将作为卡项主图,支持同时上传多张图片,多张图片之间可随意调整位置;</div>
<div class="word-aux">支持jpg、gif、png格式上传或从图片空间中选择建议使用尺寸800x800像素以上、大小不超过1M的正方形图片</div>
<div class="word-aux">上传后的图片将会自动保存在图片空间的默认分类中最多上传10张至少1张</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">卡项视频:</label>
<div class="layui-input-block">
<div class="video-thumb">
<video id="goods_video" class="video-js vjs-big-play-centered" controls="" poster="SHOP_IMG/goods_video_preview.png" preload="auto"></video>
</div>
<div id="videoUpload2" class="up-video " title="卡项视频" >
<span class="delete-video hide" onclick="deleteVideo()"><img class="del-img" src="SHOP_IMG/delete.png">删除</span>
<span class=" replace-video hide js-add-goods-video" ><img class="up-img" src="SHOP_IMG/upload.png">上传视频</span>
</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"></label>
<div class="layui-input-block">
<input type="text" name="video_url" placeholder="在此输入外链视频地址" value="{$goods_info['video_url']}" autocomplete="off" class="layui-input len-long">
</div>
<div class="file-title word-aux">
<div>注意事项:</div>
<ul>
<li>1、检查upload文件夹是否有读写权限。</li>
<li>2、PHP默认上传限制为2MB需要在php.ini配置文件中修改“post_max_size”和“upload_max_filesize”的大小。</li>
<li>3、视频支持手动输入外链视频地址或者上传本地视频文件</li>
<li>4、必须上传.mp4视频格式</li>
<li>5、视频文件大小不能超过500MB</li>
</ul>
</div>
</div>
<div class="card-type-content discountcard" {if $goods_info.card_type neq 'discountcard'}style="display: none"{/if}>
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>适用商品:</label>
<div class="layui-input-block">
<input type="radio" name="discount_goods_type" value="all" title="全部商品" {if $goods_info.discount_goods_type eq 'all'}checked{/if} lay-filter="discount_goods_type">
<input type="radio" name="discount_goods_type" value="part" title="部分商品" {if $goods_info.discount_goods_type eq 'part'}checked{/if} lay-filter="discount_goods_type">
</div>
</div>
<div class="layui-form-item discount-goods all">
<label class="layui-form-label"><span class="required">*</span>折扣卡折扣:</label>
<div class="layui-input-inline">
<input type="number" name="discount" value="{$goods_info.discount}" placeholder="0" class="layui-input len-short" lay-verify="common_discount" autocomplete="off">
</div>
<div class="layui-form-mid layui-word-aux">%</div>
<div class="layui-form-mid word-aux">购卡后购买商品或服务时可享折扣 1-99之间</div>
</div>
<div class="layui-form-item discount-goods part" {if $goods_info.discount_goods_type eq 'all'}style="display: none"{/if}>
<label class="layui-form-label"></label>
<div class="layui-input-block">
<button class="layui-btn add-relation-goods">选择商品</button>
<div class="relation-goods-table discountcard" lay-verify="relation_discount_goods">
<table id="relationDiscountGoods"></table>
</div>
</div>
<div class="word-aux batch-set">
<div class="batch-set-wrap">
<span>批量操作:</span>
<div class="set-item">
<a href="javascript:;" class="text-color set">可享受折扣</a>
</div>
<div class="set-content-wrap">
<input type="number" placeholder="0" class="layui-input len-short value" autocomplete="off" data-type="discount">
<button class="layui-btn confirm">确认</button>
<button class="layui-btn layui-btn-primary cancel">取消</button>
</div>
</div>
</div>
</div>
</div>
<div class="layui-form-item card-type-content oncecard timecard commoncard" {if $goods_info.card_type eq 'discountcard'}style="display: none"{/if}>
<label class="layui-form-label"><span class="required">*</span>卡项内容:</label>
<div class="layui-input-block">
<a href="javascript:;" class="text-color add-relation-goods" data-goods-class="4">添加卡项项目</a>
<a href="javascript:;" class="text-color add-relation-goods" data-goods-class="1">添加实物商品</a>
<div class="relation-goods-table oncecard" lay-verify="relation_goods">
<table id="relationGoods"></table>
</div>
</div>
<div class="word-aux batch-set">
<div class="batch-set-wrap">
<span>批量操作:</span>
<div class="set-item">
<a href="javascript:;" class="text-color set">可用次数</a>
</div>
<div class="set-content-wrap">
<input type="number" placeholder="0" class="layui-input len-short value" autocomplete="off" data-type="num">
<button class="layui-btn confirm">确认</button>
<button class="layui-btn layui-btn-primary cancel">取消</button>
</div>
</div>
</div>
</div>
<div class="layui-form-item card-type-content commoncard" {if $goods_info.card_type neq 'commoncard'}style="display: none"{/if}>
<label class="layui-form-label"><span class="required">*</span>可用次数/数量:</label>
<div class="layui-input-block">
<input type="text" name="common_num" value="{$goods_info.common_num}" placeholder="0" lay-verify="common_num" class="layui-input len-short" autocomplete="off">
</div>
<div class="layui-form-mid word-aux">卡项内项目/商品总的可用次数</div>
</div>
{notempty name="$service_list"}
<div class="layui-form-item">
<label class="layui-form-label">卡项服务:</label>
<div class="layui-input-block">
{foreach name="$service_list" item="vo"}
<input type="checkbox" name="goods_service_ids" value="{$vo.id}" title="{$vo.service_name}" lay-skin="primary" {if strpos($goods_info['goods_service_ids'],(string)$vo['id'])>-1}checked{/if}>
{/foreach}
</div>
</div>
{/notempty}
<div class="layui-form-item">
<label class="layui-form-label">商品品牌:</label>
<div class="layui-input-inline">
<select name="brand_id" lay-search="" lay-filter="brand_id">
<option value="">请选择商品品牌</option>
{foreach name="$brand_list" item="vo"}
<option value="{$vo['brand_id']}" {if $goods_info['brand_id'] == $vo['brand_id'] }selected{/if}>{$vo['brand_name']}</option>
{/foreach}
</select>
</div>
</div>
{if $is_install_supply}
<div class="layui-form-item">
<label class="layui-form-label">供应商:</label>
<div class="layui-input-inline">
<select name="supplier_id" lay-search="" lay-verify="supplier_id">
<option value="">请选择供应商</option>
{foreach name="$supplier_list" item="vo"}
<option value="{$vo['supplier_id']}" {if $goods_info['supplier_id']==$vo['supplier_id'] }selected{/if}>{$vo['title']}</option>
{/foreach}
</select>
</div>
</div>
{/if}
<div class="layui-form-item goods_state">
<label class="layui-form-label"><span class="required">*</span>是否上架:</label>
<div class="layui-input-block">
<input type="radio" name="goods_state" value="1" title="立刻上架" lay-filter="goods_state" {if $goods_info['goods_state'] == 1 }checked{/if}>
<input type="radio" name="goods_state" value="0" title="放入仓库" lay-filter="goods_state" {if $goods_info['goods_state'] == 0 }checked{/if}>
</div>
</div>
{if $goods_info['goods_state'] == 0}
<div class="layui-form-item timer_on">
<label class="layui-form-label">定时上架:</label>
<div class="layui-input-block">
<input type="radio" name="timer_on_status" class="timer_on_status_true" value="1" title="启用" lay-filter="timer_on" {if $goods_info['timer_on'] > 0} checked {/if}>
<input type="radio" name="timer_on_status" value="2" title="不启用" lay-filter="timer_on" {if $goods_info['timer_on'] == 0} checked {/if}>
</div>
<div class="word-aux">启用定时上架后,到达设定时间,此卡项将自动上架。</div>
</div>
{if $goods_info['timer_on'] > 0}
<div class="layui-form-item timer_on_time">
<label class="layui-form-label"></label>
<div class="layui-input-inline">
<input type="text" id="timer_on" name="timer_on" value="{:date('Y-m-d H:i:s',$goods_info['timer_on'])}" lay-verify="required" class="layui-input len-mid" autocomplete="off" readonly>
<i class=" iconrili iconfont calendar"></i>
</div>
</div>
{else/}
<div class="layui-form-item timer_on_time layui-hide">
<label class="layui-form-label"></label>
<div class="layui-input-inline">
<input type="text" id="timer_on" name="timer_on" lay-verify="" class="layui-input len-mid" autocomplete="off" readonly>
<i class=" iconrili iconfont calendar"></i>
</div>
</div>
{/if}
{/if}
<div class="layui-form-item">
<label class="layui-form-label">定时下架:</label>
<div class="layui-input-block">
<input type="radio" name="timer_off_status" value="1" title="启用" lay-filter="timer_off" {if $goods_info['timer_off'] > 0} checked {/if}>
<input type="radio" name="timer_off_status" value="2" title="不启用" lay-filter="timer_off" {if $goods_info['timer_off'] == 0} checked {/if}>
</div>
<div class="word-aux">启用定时下架后,到达设定时间,此卡项将自动下架。</div>
</div>
{if $goods_info['timer_off'] > 0}
<div class="layui-form-item timer_off">
<label class="layui-form-label"></label>
<div class="layui-input-inline">
<input type="text" id="timer_off" name="timer_off" value="{:date('Y-m-d H:i:s',$goods_info['timer_off'])}" lay-verify="required" class="layui-input len-mid" autocomplete="off" readonly>
<i class=" iconrili iconfont calendar"></i>
</div>
</div>
{else/}
<div class="layui-form-item timer_off" style="display:none">
<label class="layui-form-label"></label>
<div class="layui-input-inline">
<input type="text" id="timer_off" name="timer_off" lay-verify="" class="layui-input len-mid" autocomplete="off" readonly>
<i class=" iconrili iconfont calendar"></i>
</div>
</div>
{/if}
{if addon_is_exit('cashier') == 1}
<div class="layui-form-item">
<label class="layui-form-label">销售渠道:</label>
<div class="layui-input-block">
<input type="radio" name="sale_channel" value="all" title="线上线下销售" {if $goods_info.sale_channel eq 'all'}checked{/if}>
<input type="radio" name="sale_channel" value="online" title="线上销售" {if $goods_info.sale_channel eq 'online'}checked{/if}>
<input type="radio" name="sale_channel" value="offline" title="线下销售" {if $goods_info.sale_channel eq 'offline'}checked{/if}>
</div>
</div>
{/if}
{if $store_is_exit}
<div class="layui-form-item">
<label class="layui-form-label">适用门店:</label>
<div class="layui-input-block">
<input type="radio" name="sale_store" value="all" title="全部门店" {if $goods_info.sale_store eq 'all'}checked{/if} lay-filter="sale_store">
<input type="radio" name="sale_store" value="" title="部分门店" {if $goods_info.sale_store neq 'all'}checked{/if} lay-filter="sale_store">
</div>
</div>
<div class="layui-form-item sale-store-select" {if $goods_info.sale_store eq 'all'}style="display: none"{/if} lay-verify="sale_store">
<label class="layui-form-label"></label>
<div class="layui-input-block">
<button class="layui-btn select-store">选择门店</button>
<div style="width: 700px">
<table class="layui-table" lay-skin="nob">
<colgroup>
<col width="30%">
<col width="60%">
<col width="10%">
</colgroup>
<tr>
<th>门店名称</th>
<th>门店地址</th>
<th>操作</th>
</tr>
<tbody class="sale-store">
{if isset($store_list) && !empty($store_list)}
{foreach name="$store_list" item="vo"}
<tr data-store="{$vo.store_id}">
<td>{$vo.store_name}</td>
<td>{$vo.full_address}{$vo.address}</td>
<td><a href="javascript:;" class="del">删除</a></td>
</tr>
{/foreach}
{/if}
</tbody>
</table>
</div>
</div>
</div>
{/if}
<div class="layui-form-item">
<label class="layui-form-label">卡项有效期:</label>
<div class="layui-input-block">
<input type="radio" name="validity_type" value="0" title="永久" {if $goods_info.validity_type eq 0}checked{/if} lay-filter="validity_type">
<input type="radio" name="validity_type" value="1" title="购买后几日有效" {if $goods_info.validity_type eq 1}checked{/if} lay-filter="validity_type">
<input type="radio" name="validity_type" value="2" title="指定过期日期" {if $goods_info.validity_type eq 2}checked{/if} lay-filter="validity_type">
</div>
</div>
<div class="layui-form-item validity-type validity-type-1 {if $goods_info.validity_type neq 1}layui-hide{/if}">
<label class="layui-form-label"><span class="required">*</span>有效期:</label>
<div class="layui-input-inline">
<input type="text" name="validity_day" placeholder="0" class="layui-input len-short" value="{$goods_info.validity_day}" lay-verify="validity_day" autocomplete="off">
</div>
<div class="layui-form-mid layui-word-aux"></div>
</div>
<div class="layui-form-item validity-type validity-type-2 {if $goods_info.validity_type neq 2}layui-hide{/if}">
<label class="layui-form-label"><span class="required">*</span>有效期:</label>
<div class="layui-input-inline">
<input type="text" id="validity_time" name="validity_time" class="layui-input len-mid" value="{$goods_info.validity_time ? time_to_date($goods_info.validity_time) : ''}" lay-verify="validity_time" autocomplete="off" readonly>
<i class=" iconrili iconfont calendar"></i>
</div>
</div>
{if $store_is_exit}
<div class="layui-form-item">
<label class="layui-form-label">是否统一售价:</label>
<div class="layui-input-block">
<input type="radio" name="is_unify_price" value="1" title="是" {if $goods_info.is_unify_price eq '1'}checked{/if} >
<input type="radio" name="is_unify_price" value="0" title="否" {if $goods_info.is_unify_price eq '0'}checked{/if}>
</div>
<div class="word-aux">价格设置之后门店不能修改价格,门店按照平台设置的价格售卖</div>
</div>
{/if}
</div>
</div>
</div>
<!-- 价格库存 -->
<div class="layui-tab-item">
<div class="layui-form-item layui-hide">
<label class="layui-form-label">启用多规格:</label>
<div class="layui-input-inline">
<input type="checkbox" value="1" lay-skin="switch" name="spec_type" lay-filter="spec_type" lay-verify="spec_type" {notempty name="$goods_info['goods_spec_format']" }checked{/notempty}>
<input type="hidden" id="spec_type_status" {if empty($goods_info['goods_spec_format'])} value="0" {else/} value="1" {/if}>
</div>
</div>
<!-- 单规格 -->
<div class="js-single-spec" {notempty name="$goods_info['goods_spec_format']" }style="display:none;"{/notempty}>
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>开卡价格:</label>
<div class="layui-input-block">
<input type="text" name="price" value="{$goods_info['price']}" placeholder="0.00" lay-verify="price" class="layui-input len-short" autocomplete="off">
<div class="layui-form-mid"></div>
</div>
<div class="word-aux">卡项购买价格</div>
</div>
<!--<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>续费价格:</label>
<div class="layui-input-block">
<input type="text" name="renew_price" value="{$goods_info['renew_price']}" placeholder="0.00" lay-verify="renew_price" class="layui-input len-short" autocomplete="off">
<div class="layui-form-mid">元</div>
</div>
<div class="word-aux">卡项续费价格</div>
</div>-->
<div class="layui-form-item">
<label class="layui-form-label">划线价:</label>
<div class="layui-input-block">
<input type="text" name="market_price" value="{$goods_info['market_price']}" placeholder="0.00" lay-verify="market_price" class="layui-input len-short" autocomplete="off">
<div class="layui-form-mid"></div>
</div>
<div class="word-aux">卡项没有优惠活动显示的划线价格,如果卡项有折扣等优惠活动划线价显示销售价</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">成本价:</label>
<div class="layui-input-block">
<input type="text" name="cost_price" value="{$goods_info['cost_price']}" placeholder="0.00" class="layui-input len-short" lay-verify="cost_price" autocomplete="off">
<div class="layui-form-mid"></div>
</div>
<div class="word-aux">成本价将不会对前台会员展示,用于商家统计使用</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">卡项编码:</label>
<div class="layui-input-inline">
<input type="text" name="sku_no" value="{$goods_info['sku_list'][0]['sku_no']}" placeholder="请输入卡项编码" maxlength="50" class="layui-input len-long" autocomplete="off">
</div>
</div>
</div>
<!-- 多规格 -->
<div class="js-more-spec" {notempty name="$goods_info['goods_spec_format']" }style="display:block;"{/notempty}>
<!--规格项/规格值-->
<div class="spec-edit-list"></div>
<div class="layui-form-item js-add-spec">
<label class="layui-form-label"></label>
<div class="layui-input-inline">
<button class="layui-btn" type="button">添加规格</button>
</div>
</div>
<div class="layui-form-item batch-operation-sku">
<label class="layui-form-label">批量操作:</label>
<div class="layui-input-inline">
<span class="text-color" data-field="spec_name">副标题</span>
<span class="text-color" data-field="price" data-verify="price">销售价</span>
<span class="text-color" data-field="market_price" data-verify="market_price">划线价</span>
<span class="text-color" data-field="cost_price" data-verify="cost_price">成本价</span>
<span class="text-color" data-field="stock" data-verify="stock">库存</span>
<span class="text-color" data-field="stock_alarm" data-verify="stock_alarm">库存预警</span>
<span class="text-color" data-field="sku_no" data-verify="">卡项编码</span>
<input type="text" class="layui-input len-short" name="batch_operation_sku" autocomplete="off" />
<button class="layui-btn confirm" type="button">确定</button>
<button class="layui-btn layui-btn-primary cancel" type="button">取消</button>
</div>
</div>
<!--编辑时用到的SKU列表-->
<div class="js-edit-sku-list">
{foreach name="$goods_info['sku_list']" item="vo" key="k"}
<div data-index="{$k}">
<input type="hidden" name="edit_sku_id" value="{$vo['sku_id']}" />
<input type="hidden" name="edit_spec_name" value="{$vo['spec_name']}" />
<input type="hidden" name="edit_sku_no" value="{$vo['sku_no']}" />
<input type="hidden" name="edit_sku_spec_format" value="{$vo['sku_spec_format']}" />
<input type="hidden" name="edit_price" value="{$vo['price']}" />
<input type="hidden" name="edit_market_price" value="{$vo['market_price']}" />
<input type="hidden" name="edit_cost_price" value="{$vo['cost_price']}" />
<input type="hidden" name="edit_stock" value="{$vo['stock']}" />
<input type="hidden" name="edit_stock_alarm" value="{$vo['stock_alarm']}" />
<input type="hidden" name="edit_sku_image" value="{$vo['sku_image']}" />
<input type="hidden" name="edit_sku_images" value="{$vo['sku_images']}" />
<input type="hidden" name="edit_is_default" value="{$vo['is_default']}" />
</div>
{/foreach}
</div>
<!--sku列表-->
<div class="layui-form-item sku-table">
<label class="layui-form-label"></label>
<div class="layui-input-block"></div>
</div>
</div>
<div class="layui-form-item js-goods-stock-wrap" {notempty name="$goods_info['goods_spec_format']" }style="display:none;"{/notempty}>
<label class="layui-form-label"><span class="required">*</span>库存:</label>
<div class="layui-input-block">
<input type="number" name="goods_stock" value="{$goods_info['goods_stock']}" placeholder="0" lay-verify="goods_stock" class="layui-input len-short" autocomplete="off" {notempty name="$goods_info['goods_spec_format']" }disabled{/notempty}>
<div class="layui-form-mid"></div>
</div>
</div>
<div class="layui-form-item js-goods-stock-wrap" {notempty name="$goods_info['goods_spec_format']" }style="display:none;"{/notempty}>
<label class="layui-form-label">库存预警:</label>
<div class="layui-input-block">
<input type="number" name="goods_stock_alarm" value="{$goods_info['goods_stock_alarm']}" placeholder="0" lay-verify="goods_stock_alarm" class="layui-input len-short" autocomplete="off">
<div class="layui-form-mid"></div>
</div>
<div class="word-aux">卡项库存少于预警数量卡项列表库存数量标红显示0为不预警。</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">虚拟销量:</label>
<div class="layui-input-block">
<input type="number" name="virtual_sale" placeholder="0" value="{$goods_info['virtual_sale']}" lay-verify="virtual_sale" class="layui-input len-short" autocomplete="off">
<div class="layui-form-mid"></div>
</div>
<div class="word-aux">该设置不计入卡项统计数据</div>
</div>
<div class="layui-form-item is_limit">
<label class="layui-form-label">是否限购:</label>
<div class="layui-input-block">
<input type="radio" name="is_limit" value="0" title="否" lay-filter="is_limit" {if $goods_info['is_limit'] == 0} checked {/if}>
<input type="radio" name="is_limit" value="1" title="是" lay-filter="is_limit" {if $goods_info['is_limit'] == 1} checked {/if}>
</div>
<div class="word-aux">启用限购后,购买卡项时,会对该卡项购买量做限制判断。</div>
</div>
{if $goods_info['is_limit'] == 1}
<div class="layui-form-item limit_type" >
<label class="layui-form-label">限购类型:</label>
<div class="layui-input-block">
<input type="radio" name="limit_type" class="limit_type" value="1" title="单次限购" lay-filter="limit_type" {if $goods_info['limit_type'] == 1 } checked {/if}>
<input type="radio" name="limit_type" class="limit_type" value="2" title="长期限购" lay-filter="limit_type" {if $goods_info['limit_type'] == 2} checked {/if}>
<input type="number" name="max_buy" placeholder="" lay-verify="max_buy" value="{$goods_info['max_buy']}" class="layui-input len-short" autocomplete="off">
<div class="layui-form-mid">&nbsp件</div>
</div>
<div class="word-aux">单次限购是针对于每次下单不能超过限购数量,长期限购是针对于会员账号购买这个卡项的总数不能超过限购数量。</div>
</div>
{/if}
<div class="layui-form-item">
<label class="layui-form-label">起售:</label>
<div class="layui-input-block">
<input type="number" name="min_buy" placeholder="" lay-verify="min_buy" value="{$goods_info['min_buy']}" class="layui-input len-short" autocomplete="off">
<div class="layui-form-mid"></div>
</div>
<div class="word-aux">起售数量超出卡项库存时,买家无法购买该卡项</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">会员等级折扣:</label>
<div class="layui-input-block">
<div class="layui-input-inline">
<input type="radio" name="is_consume_discount" value="1" title="参与" {if $goods_info['is_consume_discount'] > 0} checked {/if}>
<input type="radio" name="is_consume_discount" value="0" title="不参与" {if $goods_info['is_consume_discount'] == 0} checked {/if}>
</div>
</div>
<div class="word-aux">如果该卡项未单独配置过优惠规则,则按照默认会员等级折扣优惠</div>
</div>
</div>
<!-- 卡项详情 -->
<div class="layui-tab-item">
<div class="layui-form-item">
<label class="layui-form-label sm"></label>
<div class="layui-input-inline special-length">
<input type="hidden" name="goods_content" value="{$goods_info['goods_content']}" />
<script id="editor" type="text/plain" style="width:100%;height:500px;"></script>
</div>
</div>
<script type="text/javascript" charset="utf-8" src="__STATIC__/ext/ueditor/ueditor.config.js"></script>
<script type="text/javascript" charset="utf-8" src="__STATIC__/ext/ueditor/ueditor.all.js"> </script>
<script type="text/javascript" charset="utf-8" src="__STATIC__/ext/ueditor/lang/zh-cn/zh-cn.js"></script>
</div>
<div class="layui-tab-item layui-card card-common card-brief head">
<div class="layui-card-header">
<span class="card-title">高级设置</span>
</div>
<div class="layui-card-body">
<div class="layui-form-item">
<label class="layui-form-label">排序:</label>
<div class="layui-input-block">
<input type="number" name="sort" value="{$goods_info['sort']}" class="layui-input len-short" placeholder="0" autocomplete="off">
</div>
<div class="word-aux">卡项默认排序号为0数字越大排序越靠前数字重复则最新添加的靠前。</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">卡项详情显示库存:</label>
<div class="layui-input-block">
<input type="radio" name="stock_show" value="1" title="显示" {if $goods_info['stock_show'] > 0} checked {/if}>
<input type="radio" name="stock_show" value="0" title="隐藏" {if $goods_info['stock_show'] == 0} checked {/if}>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">划线价显示:</label>
<div class="layui-input-block">
<input type="radio" name="market_price_show" value="1" title="显示" {if $goods_info['market_price_show'] > 0} checked {/if}>
<input type="radio" name="market_price_show" value="0" title="隐藏" {if $goods_info['market_price_show'] == 0} checked {/if}>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">卡项详情显示弹幕:</label>
<div class="layui-input-block">
<input type="radio" name="barrage_show" value="1" title="显示" {if $goods_info['barrage_show'] > 0} checked {/if}>
<input type="radio" name="barrage_show" value="0" title="隐藏" {if $goods_info['barrage_show'] == 0} checked {/if}>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">卡项详情显示销量:</label>
<div class="layui-input-block">
<input type="radio" name="sale_show" value="1" title="显示" {if $goods_info['sale_show'] > 0} checked {/if}>
<input type="radio" name="sale_show" value="0" title="隐藏" {if $goods_info['sale_show'] == 0} checked {/if}>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">卡项海报:</label>
<div class="layui-input-inline">
<select name="template_id" lay-search="" lay-verify="">
<option value="">请选择卡项海报</option>
{foreach name="$poster_list" item="vo"}
<option value="{$vo['template_id']}" {if $goods_info.template_id == $vo.template_id} selected {/if}>{$vo['poster_name']}</option>
{/foreach}
</select>
</div>
</div>
{if $form_is_exit}
<div class="layui-form-item">
<label class="layui-form-label">卡项表单:</label>
<div class="layui-input-block len-mid">
<select name="form_id">
<option value="0">请选择卡项表单</option>
{foreach name="$form_list" item="vo"}
<option value="{$vo.id}" {if $goods_info.form_id == $vo.id} selected {/if}>{$vo.form_name}</option>
{/foreach}
</select>
</div>
<div class="word-aux">
<a href="{:href_url('form://shop/form/addform?form_type=goods')}" class="text-color" target="_blank">创建卡项表单</a>
<a href="javascript:;" onclick="refreshFormList()" class="text-color">刷新</a>
</div>
</div>
{/if}
</div>
</div>
</div>
</div>
<input type="hidden" name="goods_id" value="{$goods_info['goods_id']}" />
<input type="hidden" name="goods_spec_format" value="{$goods_info['goods_spec_format']}" />
<input type="hidden" name="goods_image" value="{$goods_info['goods_image']}" />
<input type="hidden" name="goods_attr_format" value="{$goods_info['goods_attr_format']}" />
<input type="hidden" name="relation_goods" value="{$goods_info['relation_goods']|json_encode}" />
<input type="hidden" name="has_stock_records" value='{$has_stock_records ?? 0}' />
<div class="fixed-btn">
<button class="layui-btn layui-btn-primary border-color text-color js-prev" lay-filter="prev">上一步</button>
<button class="layui-btn js-save" lay-submit="" lay-filter="save">保存</button>
<button class="layui-btn layui-btn-primary border-color text-color js-next" lay-submit="" lay-filter="next">下一步</button>
</div>
</div>
<!--规格项模板-->
<script type="text/html" id="specTemplate">
{{# for(var i=0;i<d.list.length;i++){ }}
<div class="spec-item" data-index="{{i}}">
<div class="layui-form-item spec">
<label class="layui-form-label">规格项{{i+1}}</label>
<div class="layui-input-inline">
<select name="spec_item">
<option value="0"></option>
{{# if(d.list[i].spec_name != ''){ }}
<option value="{{d.list[i].spec_id}}" data-attr-name="{{d.list[i].spec_name}}" selected>{{d.list[i].spec_name}}</option>
{{# }else{ }}
{{# } }}
</select>
<i class="layui-icon layui-icon-close" data-index="{{i}}"></i>
</div>
{{# if(i==0){ }}
<div class="layui-input-inline">
{{# if(d.add_spec_img){ }}
<input type="checkbox" name="add_spec_img" title="添加规格图片" lay-skin="primary" lay-filter="add_spec_img" checked>
{{# }else{ }}
<input type="checkbox" name="add_spec_img" title="添加规格图片" lay-skin="primary" lay-filter="add_spec_img">
{{# } }}
</div>
{{# } }}
</div>
{{# if(d.list[i].spec_name != ''){ }}
<div class="layui-form-item spec-value">
{{# }else{ }}
<div class="layui-form-item spec-value" style="display:none;">
{{# } }}
<label class="layui-form-label"></label>
<div class="layui-input-block spec-value">
{{# if(d.list[i].value.length){ }}
<ul>
{{# for(var j=0;j<d.list[i].value.length;j++){ }}
<li data-index="{{j}}" data-parent-index="{{i}}" >
{{# if(i==0 && d.add_spec_img){ }}
<div class="img-wrap">
{{# if(d.list[i].value[j].image){ }}
<img src="{{ns.img(d.list[i].value[j].image)}}" alt="">
{{# }else{ }}
<img src="SHOP_IMG/goods_spec_value_empty.png" alt="">
{{# } }}
</div>
{{# } }}
<span title="双击可编辑规格值" ondblclick="$(this).attr('contenteditable',true);$(this).focus()" class="spec-txt" data-spec_value_name="{{d.list[i].value[j].spec_value_name}}" data-parent-index="{{i}}" data-index="{{j}}">{{d.list[i].value[j].spec_value_name}}</span>
<!--{{1# if(d.list[i].value[j].is_delete === undefined){ }}-->
<i class="layui-icon layui-icon-close" data-parent-index="{{i}}" data-index="{{j}}"></i>
<!--{{1# } }}-->
</li>
{{# } }}
</ul>
{{# } }}
<a class="text-color" href="javascript:;" data-index="{{i}}">+添加规格值</a>
<div class="add-spec-value-popup" data-index="{{i}}">
<select name="spec_value_item"></select>
<button class="layui-btn layui-btn-primary border-color text-color js-cancel-spec-value">取消</button>
</div>
</div>
</div>
</div>
{{# } }}
</script>
<!--SKU列表模板-->
<script type="text/html" id="skuTableTemplate">
{{# if(d.skuList.length){ }}
<table class="layui-table">
<colgroup></colgroup>
<thead>
<tr>
{{# if(d.showSpecName){ }}
<th colspan="{{d.colSpan}}" style="min-width: 60px;">卡项规格</th>
{{# } }}
<th rowspan="{{d.rowSpan}}">SKU图片</th>
<th rowspan="{{d.rowSpan}}">副标题</th>
<th rowspan="{{d.rowSpan}}"><span class="required">*</span></th>
<th rowspan="{{d.rowSpan}}">划线价</th>
<th rowspan="{{d.rowSpan}}">成本价</th>
<th rowspan="{{d.rowSpan}}"><span class="required">*</span></th>
<th rowspan="{{d.rowSpan}}">库存预警</th>
<th rowspan="{{d.rowSpan}}">服务时长</th>
<th rowspan="{{d.rowSpan}}">商品编码多个编码以英文逗号分割</th>
<th rowspan="{{d.rowSpan}}" style="white-space: nowrap;">默认展示</th>
</tr>
{{# if(d.colSpan>1){ }}
<tr>
{{# for(var i=0;i<d.specList.length;i++){ }}
{{# if(d.specList[i].spec_name && d.specList[i].value.length> 0){ }}
<th>{{d.specList[i].spec_name}}</th>
{{# } }}
{{# } }}
</tr>
{{# } }}
</thead>
<tbody>
{{# for(var i=0;i<d.skuList.length;i++){ }}
<tr>
<td class="sku_imgs" id="sku_img_{{i}}" style="width: 130px;">
{{# for(var j=0;j<d.skuList[i].sku_images_arr.length;j++){ }}
<div class="img-wrap" data-index="{{j}}" data-parent-index="{{i}}">
<a href="javascript:void(0)">
<img src="{{ns.img(d.skuList[i].sku_images_arr[j])}}" layer-src />
</a>
<div class="operation">
<i title="图片预览" class="iconfont iconreview js-preview"></i>
<i title="删除图片" class="layui-icon layui-icon-delete js-delete"></i>
</div>
</div>
{{# } }}
{{# if(d.skuList[i].sku_images_arr.length<d.goods_sku_max){ }}
<div class="upload-sku-img" data-index="{{i}}"><i class="layui-icon layui-icon-add-1"></i></div>
{{# } }}
</td>
<td>
<input type="text" name="spec_name" placeholder="副标题" maxlength="100" value="{{d.skuList[i].spec_name}}" class="layui-input" autocomplete="off" data-index="{{i}}">
</td>
<td>
<input type="text" name="price" placeholder="销售价" lay-verify="sku_price" value="{{d.skuList[i].price}}" class="layui-input" autocomplete="off" data-index="{{i}}">
</td>
<td>
<input type="text" name="market_price" placeholder="划线价" value="{{d.skuList[i].market_price}}" lay-verify="sku_market_price" class="layui-input" autocomplete="off" data-index="{{i}}">
</td>
<td>
<input type="text" name="cost_price" placeholder="成本价" value="{{d.skuList[i].cost_price}}" lay-verify="sku_cost_price" class="layui-input" autocomplete="off" data-index="{{i}}">
</td>
<td>
<input type="text" name="stock" placeholder="库存" value="{{d.skuList[i].stock}}" lay-verify="sku_stock" class="layui-input" autocomplete="off" data-index="{{i}}">
</td>
<td>
<input type="text" name="stock_alarm" placeholder="库存预警" value="{{d.skuList[i].stock_alarm}}" lay-verify="sku_stock_alarm" class="layui-input" autocomplete="off" data-index="{{i}}">
</td>
<td>
<input type="number" name="service_length" placeholder="服务时长" value="{{d.skuList[i].service_length}}" maxlength="50" class="layui-input" autocomplete="off" data-index="{{i}}" lay-verify="verify_num">
</td>
<td>
<input type="text" name="sku_no" placeholder="商品编码" value="{{d.skuList[i].sku_no}}" maxlength="50" class="layui-input" autocomplete="off" data-index="{{i}}">
</td>
<td style="min-width: 40px;">
{{# if(d.skuList[i].is_default == 1) { }}
<input type="checkbox" data-index="{{i}}" name="is_default" lay-filter="is_default" lay-skin="switch" checked>
{{# }else { }}
<input type="checkbox" data-index="{{i}}" name="is_default" lay-filter="is_default" lay-skin="switch">
{{# } }}
</td>
</tr>
{{# } }}
</tbody>
</table>
{{# } }}
<div class="word-aux text-color" style="margin: 10px 0 0 0;">默认展示是多规格卡项在客户访问卡项时默认显示的卡项规格</div>
</script>
<!--卡项主图列表-->
<script type="text/html" id="goodsImage">
{{# if(d.list.length){ }}
{{# for(var i=0;i<d.list.length;i++){ }}
<div class="item upload_img_square_item" data-index="{{i}}">
<div class="img-wrap">
<img src="{{ns.img(d.list[i],'small')}}" layer-src="{{ns.img(d.list[i],'big')}}">
</div>
<div class="operation">
<i title="图片预览" class="iconfont iconreview js-preview"></i>
<i title="删除图片" class="layui-icon layui-icon-delete js-delete" data-index="{{i}}"></i>
<div class="replace_img" data-index="{{i}}">点击替换</div>
</div>
</div>
{{# } }}
{{# if(d.list.length < d.max){ }}
<div class="item js-add-goods-image upload_img_square">+</div>
{{# } }}
{{# }else{ }}
<div class="item js-add-goods-image upload_img_square">+</div>
{{# } }}
</script>
<script>
{notempty name="$goods_info.relation_goods"}
var relationGoods = {:json_encode($goods_info.relation_goods)};
{else/}
var relationGoods = [];
{/notempty}
</script>
<script src="__STATIC__/ext/drag-arrange.js"></script>
<script src="__STATIC__/ext/video/videojs-ie8.min.js"></script>
<script src="__STATIC__/ext/video/video.min.js"></script>
<script src="__STATIC__/ext/searchable_select/searchable_select.js"></script>
<script src="SHOP_JS/goods_edit_common.js?time=20250527"></script>
<script src="ADDON_CARDSERVICE_JS/card_goods_edit.js?v=1"></script>

View File

@@ -0,0 +1,296 @@
<style>
.screen{margin-bottom: 15px;}
.contraction span {
cursor: pointer;
display: inline-block;
width: 17px;
height: 17px;
text-align: center;
line-height: 14px;
user-select: none;
}
.card-list {
overflow: hidden;
padding: 0 45px;
}
.card-list li .img-wrap {
vertical-align: middle;
margin-right: 8px;
width: 80px;
height: 80px;
text-align: center;
border: 1px solid #e2e2e2;
}
.card-list li .img-wrap img {
max-width: 100%;
max-height: 100%;
}
.card-list li .info-wrap{
flex: 1;
display: flex;
flex-direction: column;
}
.card-list li .name-wrap{
flex: 1;
}
.card-list li .info-wrap span.sku-name {
-webkit-line-clamp: 2;
margin-bottom: 5px;
line-height: 1.3;
margin-top: 0;
color: #333;
font-size: 14px;
}
.card-list li .info-wrap span {
display: -webkit-box;
margin-top: 5px;
overflow: hidden;
text-overflow: ellipsis;
white-space: normal;
word-break: break-all;
-webkit-box-orient: vertical;
-webkit-line-clamp: 1;
line-height: 1;
font-size: 12px;
}
.card-list li {
float: left;
display: flex;
padding: 10px;
margin-right: 10px;
margin-bottom: 10px;
border: 1px solid #EFEFEF;
width: 294px;
align-items: center;
}
.table-title .title-content p{overflow: hidden;text-overflow:ellipsis;white-space: nowrap;}
.goods-box{
display: flex;
padding: 10px;
justify-content: space-between;
margin-bottom: 20px;
}
.goods-box .goods-info{
width: 700px;
}
.goods-box .goods-info .goods-content{
display: flex;
justify-content: space-between;
}
.goods-box .goods-info .goods-name{
text-overflow: ellipsis;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
display: -moz-box;
-moz-line-clamp: 2;
-moz-box-orient: vertical;
overflow-wrap: break-word;
word-break: break-all;
white-space: normal;
overflow: hidden;
height: 38px;
}
.goods-box .goods-img{
margin-right: 15px;
display: flex;
align-items: center;
}
.goods-box .goods-img img{
width: 80px;
max-height: 80px;
}
.goods-box .box-left{
display: flex;
}
.goods-box .box-right{
display: flex;
align-items: center;
}
.user-detail{
cursor: pointer;
}
.table-title .title-content{
overflow: unset;
}
</style>
<!--商品信息-->
<div class="goods-box">
<div class="box-left">
<div class="goods-img">
<img src="{:img(explode(',', $goods_info['goods_image'])[0])}">
</div>
<div class="goods-info">
<div class="goods-name">{$goods_info['goods_name']}</div>
<div class="goods-content">
<div>卡类型:{$card_info.card_type_name}</div>
<div>价格:{$goods_info['price']}</div>
<div>库存:{$goods_info['goods_stock']}</div>
<div>销量:{$goods_info['sale_num']}</div>
</div>
</div>
</div>
<div class="box-right">
<button class="layui-btn layui-btn-primary" onclick="location.hash='{:hash_url('shop/goods/lists')}'">返回</button>
</div>
</div>
<!-- 搜索框 -->
<div class="screen layui-collapse" lay-filter="selection_panel">
<div class="layui-colla-item">
<form class="layui-colla-content layui-form layui-show">
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label">购买人:</label>
<div class="layui-input-inline">
<input type="text" name="search_text" placeholder="请输入购买人名称" autocomplete="off" class="layui-input">
</div>
</div>
</div>
<div class="form-row">
<button class="layui-btn" lay-submit lay-filter="search">筛选</button>
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
</div>
</form>
</div>
</div>
<!-- 列表 -->
<table id="card_list" lay-filter="card_list"></table>
<!-- 工具栏操作 -->
<script type="text/html" id="operation">
<div class="table-btn">
<a class="layui-btn" lay-event="order">订单</a>
<a class="layui-btn" lay-event="detail">详情</a>
</div>
</script>
<script type="text/html" id="userdetail">
<div class='table-title user-detail' onclick="memberDetail({{d.member_id}})">
<div class='title-pic'>
<img layer-src src="{{ns.img(d.headimg)}}" onerror="this.src = '{:img('public/static/img/default_img/head.png')}' ">
</div>
<div class='title-content'>{{d.nickname}}</div>
</div>
</script>
<script type="text/html" id="goodsDetail">
<div class="table-title">
<div class=" table-title">
<div class="title-pic"><img src="{{ns.img(d.goods_image.split(',')[0], 'mid')}}"></div>
<div class="title-content">
<p title="{{ d.sku_name }}">{{ d.goods_name }}</p>
</div>
</div>
</div>
</script>
<script>
var laytpl;
$(function () {
layui.use(['form', 'laydate','laytpl'], function () {
laytpl = layui.laytpl;
var table,
form = layui.form,
laydate = layui.laydate;
form.render();
//渲染时间
laydate.render({
elem: '#start_time',
type: 'datetime'
});
laydate.render({
elem: '#end_time',
type: 'datetime'
});
/**
* 加载表格
*/
table = new Table({
elem: '#card_list',
url: ns.url("cardservice://shop/card/goodscard"), //数据接口
where: {goods_id:"{$goods_id}"},
cols: [
[{
field: 'nickname',
title: '买家信息',
templet: '#userdetail'
},
{
title: '总次数/已使用',
templet: function (data) {
var totalNum = data.card_type == 'timecard' ? '不限' : data.total_num;
return totalNum + '/' + data.total_use_num;
}
},{
title: '创建时间',
width: '15%',
templet: function (data) {
return ns.time_to_date(data.create_time)
}
},{
title: '到期时间',
width: '15%',
templet: function (data) {
if (data.end_time > 0) {
return ns.time_to_date(data.end_time);
} else {
return '永久有效';
}
}
}, {
title: '操作',
toolbar: '#operation',
unresize: 'false',
align : 'right'
}]
]
});
/**
* 监听工具栏操作
*/
table.tool(function(obj) {
var data = obj.data;
switch (obj.event) {
case 'order':
window.open(ns.href("shop/order/detail?order_id=" + data.order_id));
break;
case 'detail':
window.open(ns.href("cardservice://shop/card/detail?card_id=" + data.card_id));
break;
}
});
/**
* 搜索功能
*/
form.on('submit(search)', function (data) {
table.reload({
page: {
curr: 1
},
where: data.field
});
return false;
});
//批量导出
form.on('submit(export_card)', function (data) {
location.href = ns.url("shop/card/exportVerify?request_mode=download", data.field);
return false;
});
});
});
function memberDetail(member_id){
window.open(ns.href("shop/member/editmember", {'member_id':member_id}))
}
</script>

View File

@@ -0,0 +1,123 @@
<!-- 搜索框 -->
<div class="single-filter-box" style="margin:15px 0;">
<div class="layui-form">
<div class="layui-input-inline">
<input type="text" name="search_text" placeholder="请输入商品名称" class="layui-input" autocomplete="off">
<button type="button" class="layui-btn layui-btn-primary" lay-filter="goods_card_search" lay-submit>
<i class="layui-icon">&#xe615;</i>
</button>
</div>
</div>
</div>
<!-- 列表 -->
<table id="card_list" lay-filter="card_list"></table>
<!-- 商品 -->
<script type="text/html" id="goodsCardInfo">
<div class="table-title">
<div class="title-pic">
{{# if(d.goods_image){ }}
<img layer-src src="{{ns.img(d.goods_image.split(',')[0],'small')}}"/>
{{# } }}
</div>
<div class="title-content">
<a href="javascript:;" class="multi-line-hiding text-color-sub">{{d.goods_name}}</a>
</div>
</div>
</script>
<!-- 工具栏操作 -->
<script type="text/html" id="goods_card_operation">
<div class="table-btn">
<a class="layui-btn" lay-event="detail">详情</a>
</div>
</script>
<script>
var form, goods_card_table, laytpl;
layui.use(['form', 'laytpl'], function () {
form = layui.form;
laytpl = layui.laytpl;
form.render();
goods_card_table = new Table({
elem: '#card_list',
url: ns.url("cardservice://shop/card/membergoodscard"),
async: false,
where: {'member_id': "{$member_id}"},
parseData: function (res) {
return {
"code": res.code,
"msg": res.message,
"count": res.data.count,
"data": res.data.list,
};
},
cols: [
[{
title: '商品',
unresize: 'false',
width: '25%',
templet: '#goodsCardInfo'
}, {
field: 'card_code',
title: '卡号',
unresize: 'false',
width: '15%',
align: 'left',
}, {
field: 'card_type_name',
title: '卡类型',
unresize: 'false',
width: '10%',
align: 'left',
}, {
field: '',
title: '总次数/已使用',
templet: function (data) {
return data.total_num + '/' + data.total_use_num;
}
}, {
title: '创建时间',
width: '15%',
templet: function (data) {
return ns.time_to_date(data.create_time)
}
}, {
title: '到期时间',
width: '15%',
templet: function (data) {
return data.end_time > 0 ? ns.time_to_date(data.end_time) : '永久有效';
}
}, {
title: '操作',
toolbar: '#goods_card_operation',
unresize: 'false',
align: 'right'
}]
]
});
goods_card_table.tool(function (obj) {
var data = obj.data;
switch (obj.event) {
case 'detail':
window.open(ns.href("cardservice://shop/card/detail?card_id=" + data.card_id))
break;
}
});
/**
* 搜索功能
*/
form.on('submit(goods_card_search)', function (data) {
goods_card_table.reload({
page: {
curr: 1
},
where: data.field
});
});
});
</script>

View File

@@ -0,0 +1,145 @@
<style>
.layui-input-inline.js-pid a{margin-left: 20px;}
.link-url-show{margin-right: 10px}
.click-link{height: 34px;line-height: 34px;display: inline-block;white-space: nowrap;text-align: center;border-radius: 2px;cursor: pointer;padding: 0 16px;border: 1px solid #C9C9C9;background-color: #fff;color: #555;}
</style>
<form class="layui-form form-wrap">
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>分类名称:</label>
<div class="layui-input-block len-long">
<input name="category_name" type="text" placeholder="请输入分类名称" maxlength="30" lay-verify="required" class="layui-input" autocomplete="off">
</div>
<div class="word-aux">
<p>分类名称最长不超过30个字符</p>
</div>
</div>
<div class="layui-form-item layui-hide">
<label class="layui-form-label">上级分类:</label>
<div class="layui-input-block js-pid">
<span class="input-text">顶级分类</span>
<input type="hidden" name="pid" value="0">
<input type="hidden" name="level" value="1">
<input type="hidden" name="category_id_1" value="0">
<input type="hidden" name="category_id_2" value="0">
<a class="text-color" href="javascript:selectedCategoryPopup();">选择分类</a>
</div>
<div class="word-aux">
<p>如果选择上级分类,那么新增的分类则为被选择上级分类的子分类,不选择上级分类默认为顶级分类</p>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">分类图片:</label>
<div class="layui-input-block">
<div class="upload-img-block">
<div class="upload-img-box">
<div class="upload-default" id="imgUpload">
<div class="upload">
<i class="iconfont iconshangchuan"></i>
<p>点击上传</p>
</div>
</div>
<div class="operation">
<div>
<i title="图片预览" class="iconfont iconreview js-preview" style="margin-right: 20px;"></i>
<i title="删除图片" class="layui-icon layui-icon-delete js-delete"></i>
</div>
<div class="replace_img js-replace">点击替换</div>
</div>
<input type="hidden" name="image">
</div>
</div>
</div>
<div class="word-aux">
<p>建议图片尺寸不能大于100k。图片格式jpg、png、jpeg。</p>
</div>
<a id="imageUploadAction"></a>
</div>
<div class="layui-form-item">
<label class="layui-form-label">分类广告图:</label>
<div class="layui-input-block">
<div class="upload-img-block">
<div class="upload-img-box">
<div class="upload-default" id="imgUploadAdv">
<div class="upload">
<i class="iconfont iconshangchuan"></i>
<p>点击上传</p>
</div>
</div>
<div class="operation">
<div>
<i title="图片预览" class="iconfont iconreview js-preview" style="margin-right: 20px;"></i>
<i title="删除图片" class="layui-icon layui-icon-delete js-delete"></i>
</div>
<div class="replace_img js-replace">点击替换</div>
</div>
<input type="hidden" name="image_adv" value="">
</div>
</div>
</div>
<div class="word-aux">
<p>该图片只对一级使用, 建议图片尺寸550px * 250px。图片格式jpg、png、jpeg。</p>
</div>
<a id="imageAdvUploadAction"></a>
</div>
<div class="layui-form-item link-url-show-wrap">
<label class="layui-form-label">广告链接:</label>
<div class="layui-input-block">
<input name="link_url" type="hidden" class="layui-input len-long" autocomplete="off">
<a class="click-link" onclick="selectedLink()">选择链接</a>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">是否显示</label>
<div class="layui-input-block">
<input type="radio" name="is_show" value="0" title="显示" checked="">
<input type="radio" name="is_show" value="-1" title="不显示">
</div>
</div>
<div class="form-row">
<button class="layui-btn bg-color" lay-submit lay-filter="save">保存</button>
<button type="reset" class="layui-btn layui-btn-primary" onclick="backCardServiceCategoryList()">返回</button>
</div>
</form>
<script type="text/html" id="selectedCategory">
<form class="layui-form">
<div class="layui-form-item">
<label class="layui-form-label sm">一级分类</label>
<div class="layui-input-block len-mid">
<select name="category_id_1" lay-filter="category_id_1">
<option value="0" data-level="0">顶级分类</option>
{{# for(var i=0;i<d.category_list_1.length;i++){ }}
{{# if(d.category_id_1 ==d.category_list_1[i].category_id){ }}
<option value="{{ d.category_list_1[i].category_id }}" data-level="{{d.category_list_1[i].level}}" selected>{{ d.category_list_1[i].category_name }}</option>
{{# }else{ }}
<option value="{{ d.category_list_1[i].category_id }}" data-level="{{d.category_list_1[i].level}}">{{ d.category_list_1[i].category_name }}</option>
{{# } }}
{{# } }}
</select>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label sm">二级分类</label>
<div class="layui-input-block len-mid">
<select name="category_id_2" lay-filter="category_id_2"></select>
</div>
</div>
<div class="form-row sm">
<button class="layui-btn bg-color" lay-submit lay-filter="save_pid">保存</button>
</div>
</form>
</script>
<script src="ADDON_CARDSERVICE_JS/edit_category.js"></script>

View File

@@ -0,0 +1,266 @@
<style>
.js-pid a{
margin-left: 20px;
}
.form-wrap {
margin-top: 0;
}
.link-url-show{margin-right: 10px}
.click-link{height: 34px;line-height: 34px;display: inline-block;white-space: nowrap;text-align: center;border-radius: 2px;cursor: pointer;padding: 0 16px;border: 1px solid #C9C9C9;background-color: #fff;color: #555;}
.goods-category-list .layui-table td{border-left: 0;border-right: 0;}
.goods-category-list .layui-table .switch{font-size: 16px;cursor: pointer;width: 12px;line-height: 1;display: inline-block;text-align: center;vertical-align: middle;}
.goods-category-list .layui-table img{width: 40px;}
/* 分类样式*/
.table_div{color:#666}
.table_head{display: flex;font-weight: bold;background-color: #F7F7F7;}
.table_head li{height: 50px;line-height: 50px;border: 0;padding: 0 15px;font-size: 14px;font-weight: 400;color: #333;}
.table_head .operate{text-align: right;}
.table_head li:first-child{padding-right: 0;}
.table_tr{display: flex;border-bottom: 1px solid #e6e6e6;background: #fff;align-items: center;}
.table_tr .table_td{position: relative;padding: 5px 15px;font-size: 14px;display: flex;align-items: center;}
.table_tr .table_td span{cursor: pointer;}
.table_tr .table_td span>img{width:12px;height:12px}
.table_tr .table_td span>img.rotate{transform:rotate(90deg);}
.table_tr .table_td .img-box{width:30px;height:30px;line-height: 30px;}
.table_tr .table_td:first-child{padding-right:0}
.table_tr .table-btn{display: flex;flex-wrap: wrap;justify-content: flex-end;}
.table_tr .layui-btn{display: flex;justify-content: center;align-items: center;height: 23px;border-radius: 50px;background-color: transparent;color: var(--base-color);text-align: center;padding: 2px 0;margin: 5px 0 5px 10px;position: relative;}
.table_two_div{display: none;}
.table_three{display: none;}
.empty_switch{display: inline-block;width:30px;height:25px;padding-right:15px;}
.js-switch{display: inline-block;width:30px;text-align: center;}
.table_move{float:left;margin-right: 10px;}
.table_moves{float:left;margin-right: 10px;}
.tables_move{float:left;margin-right: 20px;padding-left: 70px;}
.select-category .layui-layer-content{overflow: auto!important;}
.table_three .table_td.checkbox{
padding-left: 70px;
}
</style>
<form class="layui-form form-wrap">
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>分类名称:</label>
<div class="layui-input-block">
<input name="category_name" type="text" value="{$goods_category_info['category_name']}" placeholder="请输入分类名称" maxlength="30" lay-verify="required" class="layui-input len-long" autocomplete="off">
</div>
<div class="word-aux">
<p>分类名称最长不超过30个字符</p>
</div>
</div>
<div class="layui-form-item layui-hide">
<label class="layui-form-label">上级分类:</label>
<div class="layui-input-block len-mid js-pid">
{if $goods_category_info['pid'] == 0}
<span class="input-text">顶级分类</span>
{else/}
<span class="input-text">{$goods_category_parent_info['category_name']}</span>
{/if}
<input type="hidden" name="pid" value="{$goods_category_info['pid']}">
<input type="hidden" name="level" value="{$goods_category_info['level']}">
<input type="hidden" name="category_id_1" value="{$goods_category_info['category_id_1']}">
<input type="hidden" name="category_id_2" value="{$goods_category_info['category_id_2']}">
<input type="hidden" name="category_id_3" value="{$goods_category_info['category_id_3']}">
<input type="hidden" name="category_name_1" value="">
<a class="text-color" href="javascript:selectedCategoryPopup();">选择分类</a>
</div>
<div class="word-aux">
{if $goods_category_info['level'] == 1}
<p>注意:顶级分类不能修改</p>
{elseif $goods_category_info['level'] == 2}
<p>注意:二级分类可以修改一级分类</p>
{elseif $goods_category_info['level'] == 3}
<p>注意:三级分类可以修改二级分类</p>
{/if}
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">分类图片:</label>
<div class="layui-input-block">
<div class="upload-img-block">
<div class="upload-img-box {notempty name="$goods_category_info['image']"}hover{/notempty}">
<div class="upload-default" id="imgUpload">
{notempty name="$goods_category_info['image']"}
<div id="preview_imgUpload" class="preview_img">
<img layer-src src="{:img($goods_category_info['image'])}" class="img_prev"/>
</div>
{else/}
<div class="upload">
<i class="iconfont iconshangchuan"></i>
<p>点击上传</p>
</div>
{/notempty}
</div>
<div class="operation">
<div>
<i title="图片预览" class="iconfont iconreview js-preview" style="margin-right: 20px;"></i>
<i title="删除图片" class="layui-icon layui-icon-delete js-delete"></i>
</div>
<div class="replace_img js-replace">点击替换</div>
</div>
<input type="hidden" name="image" value="{$goods_category_info['image']}">
</div>
</div>
</div>
<div class="word-aux">
<p>建议图片尺寸不能大于100k。图片格式jpg、png、jpeg。</p>
</div>
<a id="imageUploadAction"></a>
</div>
<div class="layui-form-item">
<label class="layui-form-label">分类广告图:</label>
<div class="layui-input-block">
<div class="upload-img-block ">
<div class="upload-img-box {notempty name="$goods_category_info['image_adv']"} hover {/notempty}" >
<div class="upload-default" id="imgUploadAdv">
{notempty name="$goods_category_info['image_adv']"}
<div id="preview_imgUploadAdv" class="preview_img">
<img layer-src src="{:img($goods_category_info['image_adv'])}" class="img_prev"/>
</div>
{else/}
<div class="upload">
<i class="iconfont iconshangchuan"></i>
<p>点击上传</p>
</div>
{/notempty}
</div>
<div class="operation">
<div>
<i title="图片预览" class="iconfont iconreview js-preview" style="margin-right: 20px;"></i>
<i title="删除图片" class="layui-icon layui-icon-delete js-delete"></i>
</div>
<div class="replace_img js-replace">点击替换</div>
</div>
<input type="hidden" name="image_adv" value="{$goods_category_info['image_adv']}">
</div>
</div>
</div>
<div class="word-aux">
<p>该图片只对一级使用, 建议图片尺寸550px * 250px。图片格式jpg、png、jpeg。</p>
</div>
<a id="imageAdvUploadAction"></a>
</div>
<div class="layui-form-item link-url-show-wrap">
<label class="layui-form-label">广告链接:</label>
<div class="layui-input-block">
<input name="link_url" type="hidden" class="layui-input len-long" autocomplete="off" value="{$goods_category_info.link_url}">
<a class="click-link" onclick="selectedLink()">选择链接</a>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">是否显示</label>
<div class="layui-input-block">
<input type="radio" name="is_show" value="0" title="显示" {if $goods_category_info['is_show'] == 0} checked="" {/if}>
<input type="radio" name="is_show" value="-1" title="不显示" {if $goods_category_info['is_show'] == -1} checked="" {/if}>
</div>
</div>
<input type="hidden" id="category_id" name="category_id" value="{$goods_category_info['category_id']}">
<input type="hidden" name="category_full_name" value="{$goods_category_info['category_full_name']}">
<div class="form-row">
<button class="layui-btn" lay-submit lay-filter="save">保存</button>
<button type="reset" class="layui-btn layui-btn-primary" onclick="backCardServiceCategoryList()">返回</button>
</div>
</form>
<script type="text/html" id="selectedCategory">
<div class="goods-category-list layui-form">
<div class="table_div" >
<ul class="table_head">
<li style="width:60px"></li>
<li style="flex:6">分类名称</li>
<li style="flex:2">是否显示</li>
</ul>
<div class="table_body">
{if condition="$list"}
{foreach name="$list" item="vo" key="index"}
<li class="table_one" data-index="{$index}" data-sort="{$vo['sort']}" data-cateid="{$vo['category_id']}">
<div class="table_tr">
<div class="table_td" style="width:60px">
<div class="table_move">
<input type="checkbox" name="category_id" title="" lay-skin="primary" data-name="{$vo['category_name']}" value="{$vo['category_id']}" data-category-id="{$vo['category_id']}" data-level="{$vo['level']}" data-open="0" lay-filter="category">
</div>
{notempty name="$vo['child_list']"}
<span class="switch text-color js-switch" data-category-id="{$vo['category_id']}" data-level="{$vo['level']}" data-open="0">
+
</span>
{/notempty}
</div>
<div class="table_td" style="flex:6">{$vo['category_name']}</div>
<div class="table_td" style="flex:2">
{if $vo['is_show'] == 0} 显示 {else /} {/if}
</div>
</div>
{notempty name="$vo['child_list']"}
<div class="table_two_div">
{foreach name="$vo['child_list']" item="second"}
<div class="table_two" data-index="{$index}" data-sort="{$second['sort']}" data-cateid="{$second['category_id']}">
<div class="table_tr">
<div class="table_td" style="width: 36px">
</div>
<div class="table_td" style="flex:6.4">
<div class="table_move">
<input type="checkbox" name="category_id" title="" lay-skin="primary" value="{$second['category_id']}" data-category-id="{$second['category_id']}" data-level="{$second['level']}" data-open="0" data-name="{$second['category_name']}" lay-filter="category">
</div>
<!-- <span class="switch text-color empty_switch" > </span>-->
<span>{$second['category_name']}</span>
</div>
<div class="table_td" style="flex:2">
{if $second['is_show'] == 0} 显示 {else /} {/if}
</div>
</div>
{notempty name="$second['child_list']"}
<div class="table_three layui-hide">
{foreach name="$second['child_list']" item="third"}
<div class="table_tr table_three_tr" data-sort="{$third['sort']}" data-cateid="{$third['category_id']}">
<div class="table_td" style="width: 36px">
</div>
<div class="table_td checkbox" style="flex:5.5">
<input type="checkbox" name="category_id" title="" lay-skin="primary" data-name="{$third['category_name']}" value="{$third['category_id']}" data-category-id="{$third['category_id']}" data-level="{$third['level']}" data-open="0">
<div>{$third['category_name']}</div>
</div>
<div class="table_td" style="flex:2">
{if $third['is_show'] == 0} 显示 {else /} {/if}
</div>
</div>
{/foreach}
</div>
{/notempty}
</div>
{/foreach}
</div>
{/notempty}
</li>
{/foreach}
{else/}
<div class="table_tr">
<div class="table_td" style="flex:1;text-align: center;">暂无数据</div>
</div>
{/if}
</div>
</div>
</div>
</script>
<script src="ADDON_CARDSERVICE_JS/edit_category.js"></script>

View File

@@ -0,0 +1,368 @@
<style>
.table_body{font-family: arial;-webkit-user-select: none;-moz-user-select: none;-ms-user-select: none;user-select: none;}
.goods-category-list .layui-table td{border-left: 0;border-right: 0;}
.goods-category-list .layui-table .switch{font-size: 16px;cursor: pointer;width: 12px;line-height: 1;display: inline-block;text-align: center;vertical-align: middle;}
.goods-category-list .layui-table img{width: 40px;}
/* 分类样式*/
.table_div{color:#666}
.table_head{display: flex;font-weight: bold;background-color: #F7F7F7;}
.table_head li{height: 50px;line-height: 50px;border: 0;padding: 0 15px;font-size: 14px;font-weight: 400;color: #333;}
.table_head .operate{text-align: right;}
.table_head li:first-child{padding-right: 0;}
.table_tr{display: flex;border-bottom: 1px solid #e6e6e6;background: #fff;align-items: center;}
.table_tr .table_td{position: relative;padding: 5px 15px;font-size: 14px;}
.table_tr .table_td span{cursor: pointer;}
.table_tr .table_td span>img{width:12px;height:12px}
.table_tr .table_td span>img.rotate{transform:rotate(90deg);}
.table_tr .table_td .img-box{width:30px;height:30px;line-height: 30px;}
.table_tr .table_td:first-child{padding-right:0}
.table_tr .table-btn{display: flex;flex-wrap: wrap;justify-content: flex-end;}
.table_tr .layui-btn{display: flex;justify-content: center;align-items: center;height: 23px;border-radius: 50px;background-color: transparent;color: var(--base-color);text-align: center;padding: 2px 0;margin: 5px 0 5px 10px;position: relative;}
.table_two_div{display: none;}
.table_three{display: none;}
.empty_switch{display: inline-block;width:30px;height:25px;padding-right:15px;}
.js-switch{display: inline-block;height:30px;width:30px;text-align: center;}
.table_move{cursor: move;float:left;margin-right: 10px;}
.table_moves{cursor: move;float:left;margin-right: 10px;}
.tables_move{cursor: move;float:left;margin-right: 20px;padding-left: 70px;}
</style>
<div class="single-filter-box">
<button class="layui-btn" onclick="addCategory()">添加项目分类</button>
</div>
<div class="goods-category-list">
<div class="table_div" >
<ul class="table_head">
<li style="width:60px"></li>
<li style="flex:6">分类名称</li>
<li style="flex:2">图片</li>
<!-- <li style="flex:2">排序</li> -->
<li style="flex:2">是否显示</li>
<li class="operate" style="flex:2">操作</li>
</ul>
<div class="table_body">
{if condition="$list"}
{foreach name="$list" item="vo" key="index"}
<li class="table_one" data-index="{$index}" data-sort="{$vo['sort']}" data-cateid="{$vo['category_id']}">
<div class="table_tr">
<div class="table_td" style="width:60px">
<div class="table_move iconfont icontuodong"></div>
{notempty name="$vo['child_list']"}
<span class="switch text-color js-switch" data-category-id="{$vo['category_id']}" data-level="{$vo['level']}" data-open="0">+</span>
{/notempty}
</div>
<div class="table_td" style="flex:6">{$vo['category_name']}</div>
<div class="table_td" style="flex:2">
{notempty name="$vo['image']"}
<div class="img-box">
<img layer-src src="{:img($vo['image'])}"/>
</div>
{/notempty}
</div>
<!-- <div class="table_td" style="flex:2">
<input type="number" class="layui-input len-short" value="{$vo['sort']}" onchange="editSort('{$vo.category_id}')" id="category_sort{$vo.category_id}">
</div> -->
<!-- <div class="table_td" style="flex:2">-->
<!-- {if $vo['is_show'] == 0} 显示 {else /} 不显示 {/if}-->
<!-- </div>-->
<div class="table_td layui-form" style="flex:2">
<input type="checkbox" name="is_show" value="{$vo['category_id']}" lay-skin="switch" lay-text="" lay-filter="is_show" {if $vo['is_show'] == 0} checked {/if}>
</div>
<div class="table_td" style="flex:2">
<div class="table-btn">
<a class="layui-btn" href="{:href_url('cardservice://shop/servicecategory/editcategory',['category_id'=>$vo['category_id']])}">编辑</a>
<a class="layui-btn" href="javascript:deleteCategory({$vo['category_id']});">删除</a>
</div>
</div>
</div>
{notempty name="$vo['child_list']"}
<div class="table_two_div">
{foreach name="$vo['child_list']" item="second"}
<div class="table_two" data-index="{$index}" data-sort="{$second['sort']}" data-cateid="{$second['category_id']}">
<div class="table_tr">
<div class="table_td" style="width: 36px">
</div>
<div class="table_td" style="flex:6.2">
<div class="table_moves iconfont icontuodong"></div>
{notempty name="$second['child_list']"}
<span class="switch text-color js-switch" data-category-id="{$second['category_id']}" data-level="{$second['level']}" data-open="0" style="padding-right: 15px;">+</span>
{else /}
<span class="switch text-color empty_switch" > </span>
{/notempty}
<span>{$second['category_name']}</span>
</div>
<div class="table_td" style="flex:2">
{notempty name="$second['image']"}
<div class="img-box">
<img layer-src src="{:img($second['image'])}"/>
</div>
{/notempty}
</div>
<!-- <div class="table_td" style="flex:2">
<input type="number" class="layui-input len-short" value="{$second['sort']}" onchange="editSort('{$second.category_id}')" id="category_sort{$second.category_id}">
</div> -->
<div class="table_td" style="flex:2">
{if $second['is_show'] == 0} 显示 {else /} 不显示 {/if}
</div>
<div class="table_td" style="flex:2">
<div class="table-btn">
<a class="layui-btn" href="{:href_url('cardservice://shop/servicecategory/editcategory',['category_id'=>$second['category_id']])}">编辑</a>
<a class="layui-btn" href="javascript:deleteCategory({$second['category_id']});">删除</a>
</div>
</div>
</div>
{notempty name="$second['child_list']"}
<div class="table_three">
{foreach name="$second['child_list']" item="third"}
<div class="table_tr table_three_tr" data-sort="{$third['sort']}" data-cateid="{$third['category_id']}">
<div class="table_td" style="width: 36px">
</div>
<div class="table_td" style="flex:6.2">
<div class="tables_move iconfont icontuodong"></div>
<div>{$third['category_name']}</div>
</div>
<div class="table_td" style="flex:2">
{notempty name="$third['image']"}
<div class="img-box">
<img layer-src src="{:img($third['image'])}"/>
</div>
{/notempty}
</div>
<!-- <div class="table_td" style="flex:2">
<input type="number" class="layui-input len-short" value="{$second['sort']}" onchange="editSort('{$second.category_id}')" id="category_sort{$second.category_id}">
</div> -->
<div class="table_td" style="flex:2">
{if $third['is_show'] == 0} 显示 {else /} 不显示 {/if}
</div>
<div class="table_td" style="flex:2">
<div class="table-btn">
<a class="layui-btn" href="{:href_url('cardservice://shop/servicecategory/editcategory',['category_id'=>$third['category_id']])}">编辑</a>
<a class="layui-btn" href="javascript:deleteCategory({$third['category_id']});">删除</a>
</div>
</div>
</div>
{/foreach}
</div>
{/notempty}
</div>
{/foreach}
</div>
{/notempty}
</li>
{/foreach}
{else/}
<div class="table_tr">
<div class="table_td" style="flex:1;text-align: center;">暂无数据</div>
</div>
{/if}
</div>
</div>
</div>
<script src="STATIC_EXT/drag-arrange.js"></script>
<script src="STATIC_EXT/diyview/js/ddsort.js"></script>
<script>
var form;
layui.use(['form'], function(){
form = layui.form;
form.on('switch(is_show)', function(data){
$.ajax({
url: ns.url("cardservice://shop/servicecategory/modifyShow"),
data: {id:data.value,is_show:data.elem.checked ? 0 : -1},
dataType: 'JSON',
type: 'POST',
async: false,
success: function (res) {
layer.msg(res.message);
}
});
console.log(data.elem); // 获取当前 checkbox 的 DOM 对象
console.log(data.elem.checked); // 获取当前 checkbox 的选中状态true 或 false
console.log(data.value); // 获取当前 checkbox 的 value 值,即 name 属性的值或者自定义的 value 值(如果有的话)
console.log(data.othis); // 获取当前 checkbox 的 jQuery 对象
});
form.render();
});
$(function() {
var tempPos = '';
$('li').arrangeable({
dragSelector: '.table_move',
callback:function(e){
var temparr = [];
$('.table_one').each(function(index,item){
var tempObj = {};
tempObj.category_id = item.getAttribute('data-cateid');
tempObj.sort = index;
temparr.push(tempObj)
})
setTimeout(function(){
$.ajax({
url: ns.url("cardservice://shop/servicecategory/modifySort"),
data: {category_sort_array : JSON.stringify(temparr)},
dataType: 'JSON',
type: 'POST',
async: false,
success: function (res) {
layer.msg(res.message);
}
});
},100);
}
});
$('.table_two').arrangeable({
dragSelector: '.table_moves',
callback:function(e){
var temparrs = [];
$('.table_two').each(function(index,item){
var tempObjs = {};
tempObjs.category_id = item.getAttribute('data-cateid');
tempObjs.sort = index;
temparrs.push(tempObjs)
});
setTimeout(function(){
$.ajax({
url: ns.url("cardservice://shop/servicecategory/modifySort"),
data: {category_sort_array : JSON.stringify(temparrs)},
dataType: 'JSON',
type: 'POST',
async: false,
success: function (res) {
layer.msg(res.message);
}
});
},100);
}
});
$('.table_three_tr').arrangeable({
dragSelector: '.tables_move',
callback:function(e){
var temparres = [];
$('.table_three_tr').each(function(index,item){
var tempObjes = {};
tempObjes.category_id = item.getAttribute('data-cateid');
tempObjes.sort = index;
temparres.push(tempObjes)
});
setTimeout(function(){
$.ajax({
url: ns.url("cardservice://shop/servicecategory/modifySort"),
data: {category_sort_array : JSON.stringify(temparres)},
dataType: 'JSON',
type: 'POST',
async: false,
success: function (res) {
layer.msg(res.message);
}
});
},100);
}
});
});
// var tempPos = '';
// bindDragSort('.table_body' ,'.table_one');
// bindDragSort('.table_two_div' ,'.table_two');
// bindDragSort('.table_three' ,'.table_tr');
// function bindDragSort(paremtElem,childElem){
// $(paremtElem ).DDSort({
// target: childElem,
// floatStyle: {
// 'border': '1px solid #ccc',
// 'background-color': '#fff'
// },
// down:function(e){
// tempPos = $(this).data('sort');
// },
// up:function(e){
// var index = $(this).index(),self = $(this);
// if(index != tempPos){
// var temparr = [];
// $(childElem).each(function(index,item){
// var tempObj = {};
// tempObj.category_id = item.getAttribute('data-cateid');
// tempObj.sort = index;
// temparr.push(tempObj)
// })
// setTimeout(function(){
// $.ajax({
// url: ns.url("cardservice://shop/servicecategory/modifySort"),
// data: {category_sort_array : JSON.stringify(temparr)},
// dataType: 'JSON',
// type: 'POST',
// async: false,
// success: function (res) {
// self.data('sort',index)
// layer.msg(res.message);
// }
// });
// },100);
// }
//
// }
// });
// }
$(function () {
loadImgMagnify(); //图片放大
//展开收齐点击事件
$(".js-switch").click(function (event) {
event.stopPropagation();
var category_id = $(this).attr("data-category-id");
var level = $(this).attr("data-level");
var open = parseInt($(this).attr("data-open").toString());
if(open){
$(".goods-category-list .layui-table tr[data-category-id-"+ level+"='" + category_id + "']").hide();
// $(this).children("img").removeClass('rotate');
$(this).text("+");
if(level == 1) $(this).parents('.table_tr').siblings('.table_two_div').hide();
else if(level == 2) $(this).parents('.table_tr').siblings('.table_three').hide();
}else{
$(".goods-category-list .layui-table tr[data-category-id-"+ level+"='" + category_id + "']").show();
$(this).text("-");
// $(this).children("img").addClass('rotate');
if(level == 1) $(this).parents('.table_tr').siblings('.table_two_div').show();
else if(level == 2) $(this).parents('.table_tr').siblings('.table_three').show();
}
$(this).attr("data-open", (open ? 0 : 1));
});
});
function deleteCategory(category_id) {
layer.confirm('确认要删除该分类吗,请谨慎操作', function(index) {
$.ajax({
url: ns.url("cardservice://shop/servicecategory/deleteCategory"),
data: {category_id : category_id},
dataType: 'JSON',
type: 'POST',
async: false,
success: function (res) {
layer.msg(res.message);
layer.close(index);
if (res.code == 0) {
listenerHash(); // 刷新页面
}
}
});
});
}
function addCategory() {
location.hash = ns.hash("cardservice://shop/servicecategory/addcategory");
}
</script>

View File

@@ -0,0 +1,242 @@
html,body,.main-wrap {
height: 100%;
width: 100%;
background: #fff;
}
.main-wrap {
padding: 20px;
box-sizing: border-box;
}
.error {
font-size: 12px;
color: #f00;
line-height: 1;
margin-top: 10px;
display: none;
margin-left: 130px;
}
.layui-input-inline i {
position: absolute;
top: 50%;
right: 10px;
transform: translateY(-50%);
}
.search-wrap {
position: relative;
}
.search-wrap i {
border-left: 1px solid #E6E6E6;
line-height: 30px;
padding-left: 10px;
cursor: pointer;
}
.layui-form-label {
width: 130px;
}
.word-aux {
margin-left: 130px!important;
}
.layui-form-label + .layui-input-block {
margin-left: 130px;
}
.select-time .time-wrap {
width: 330px;
padding: 15px;
display: flex;
flex-wrap: wrap;
}
.select-time .no-today {
display: none;
}
.select-time .time-item {
height: 30px;
line-height: 30px;
width: 60px;
cursor: pointer;
}
.select-time .time-item:hover,.select-time .time-item.active {
color: var(--base-color);
}
.select-time .time-item.no-select {
color: #999;
cursor: not-allowed;
}
.align-center {
text-align: center!important;
}
.service-item,.servicer-item {
display: flex;
border: 1px solid #E6E6E6;
align-items: center;
cursor: pointer;
height: 52px;
}
.service-item .iconfont, .servicer-item .iconfont {
margin-right: 5px;
}
.service-item .info, .servicer-item .info {
flex: 1;
padding: 6px 10px;
}
.service-item .info .desc, .servicer-item .info .desc{
font-size: 12px;
color: #999;
}
.service-item .info .title, .servicer-item .info .title {
width: 100%;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.select-service {
width: 660px;
height: 240px;
box-sizing: border-box;
padding: 15px;
}
.select-service .service-wrap {
overflow-y: scroll;
height: 100%;
}
.select-service .service-wrap .empty {
line-height: 200px;
text-align: center;
width: 100%;
}
.select-service .service-wrap::-webkit-scrollbar {
width: 6px;
height: 6px;
background-color: transparent;
}
.select-service .service-wrap::-webkit-scrollbar-button {
display: none;
}
.select-service .service-wrap::-webkit-scrollbar-thumb {
border-radius: .06rem;
box-shadow: inset 0 0 .06rem rgba(45,43,43,.45);
background-color: #ddd;
}
.select-service .service-wrap::-webkit-scrollbar-track {
background-color: transparent;
}
.select-service .service-wrap .flex-wrap{
display: flex;
flex-wrap: wrap;
}
.select-service .service-wrap .item {
margin: 0 8px 8px 0;
background: #eee;
padding: 8px;
width: 186px;
cursor: pointer;
transition: all .3s;
}
.select-service .service-wrap .item:hover{
background: #fff5ed;
}
.select-service .service-wrap .item:nth-child(3n+3) {
margin-right: 0;
}
.select-service .service-wrap .title{
width: 100%;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.select-service .service-wrap .desc {
font-size: 12px;
color: #999;
}
.save-wrap {
position: fixed;
bottom: 0;
left: 0;
background: #fff;
height: 50px;
display: flex;
align-items: center;
justify-content: center;
border-top: 1px solid #eee;
width: 100%;
}
.member-info {
display: inline-flex;
padding: 10px;
border: 1px solid #e6e6e6;
min-width: 300px;
max-width: 590px;
}
.member-info img {
width: 50px;
height: 50px;
}
.member-info .info {
flex: 1;
display: flex;
flex-direction: column;
padding-left: 10px;
justify-content: space-around;
}
.member-info .info div {
line-height: 1;
}
.member-info .info span{
margin-right: 10px;
}
.select-servicer {
width: 150px;
height: 240px;
box-sizing: border-box;
padding: 15px 10px;
overflow-y: scroll;
}
.select-servicer .select-item {
width: 100%;
height: 40px;
line-height: 40px;
overflow: hidden;
text-overflow: ellipsis;
padding: 0 10px;
background: #f5f5f5;
cursor: pointer;
margin-bottom: 10px;
transition: all .3s;
box-sizing: border-box;
}
.select-servicer .select-item:hover {
background: #fff5ed;
}
.select-servicer::-webkit-scrollbar {
width: 6px;
height: 6px;
background-color: transparent;
}
.select-servicer::-webkit-scrollbar-button {
display: none;
}
.select-servicer::-webkit-scrollbar-thumb {
border-radius: .06rem;
box-shadow: inset 0 0 .06rem rgba(45,43,43,.45);
background-color: #ddd;
}
.select-servicer::-webkit-scrollbar-track {
background-color: transparent;
}
.layui-dropdown {
position: absolute;
left: -999999px;
top: -999999px;
z-index: 66666666;
margin: 5px 0;
min-width: 100px
}
.layui-dropdown:before {
content: "";
position: absolute;
width: 100%;
height: 6px;
left: 0;
top: -6px
}

View File

@@ -0,0 +1,68 @@
.card-type {
display: flex;
flex-wrap: wrap;
}
.card-type .card-type-item {
padding: 15px;
border: 1px solid #ddd;
line-height: 1;
margin: 0 10px 10px 0;
/*border-radius: 4px;*/
cursor: pointer;
position: relative;
overflow: hidden;
width: 285px;
}
.card-type .card-type-item:hover,.card-type .card-type-item.active {
border-color: var(--base-color);
color: var(--base-color);
}
.card-type .card-type-item .title{
font-size: 14px;
font-weight: bold;
}
.card-type .card-type-item .desc{
margin-top: 8px;
color: #999;
}
.card-type .card-type-item .iconfont {
position: absolute;
right: 0;
display: none;
}
.card-type .card-type-item.active .iconfont {
display: block;
}
.relation-goods-table {
margin-right: 50px;
max-width: 800px;
}
.relation-goods-table .layui-table-body {
max-height: 300px;
}
.relation-goods-table .table-bottom{
display: none;
}
.relation-goods-table .len-short {
width: 80px!important;
}
.relation-goods-table .layui-table-view {
margin-top: 10px;
}
.card-type-content .batch-set {
font-size: 14px;
display: none;
}
.card-type-content .batch-set .batch-set-wrap{
display: flex;
align-items: center;
}
.card-type-content .batch-set .len-short {
width: 80px!important;
}
.card-type-content .batch-set .set-content-wrap {
display: none;
}
.card-type-content .batch-set .layui-btn+.layui-btn{
margin-left: 0;
}

View File

@@ -0,0 +1,337 @@
.layui-body {
padding-bottom: 0!important;
}
.uni-flex {
display: flex;
flex-direction: row;
}
.uni-flex-item {
flex: 1;
}
.uni-row {
flex-direction: row;
}
.uni-column {
flex-direction: column;
}
.panel-head {
align-items: center;
}
.panel-head button {
margin: 0 10px 0 0;
}
.panel-head .status {
align-items: center;
}
.panel-head .status div {
line-height: 1;
}
.panel-head .status .color {
width: 16px;
height: 16px;
margin: 0 10px 0 30px;
}
.stay-confirm {
background: #8558FA;
border-color: #8558FA;
}
.stay-tostore {
background: #1475FA;
border-color: #1475FA;
}
.arrived-store {
background: #FA5B14;
border-color: #FA5B14;
}
.completed {
background-color: #10C610;
border-color: #10C610;
}
.cancelled {
background-color: #E6E6E6;
border-color: #E6E6E6;
}
.panel-body {
margin-top: 20px;
position: relative;
}
.panel-body .time-type{
position:absolute;
top:14px;
right:0px;
display:flex;
flex-direction: row;
}
.panel-body .time-type span{
width:32px;
line-height:32px;
text-align: center;
border:1px solid #E6E6E6;
font-size:14px;
cursor: pointer;
}
.panel-body .time-type span:nth-child(1){
border-right:none;
}
.panel-body .time-type span:nth-child(2){
border-left:none;
}
.panel-body .time-type span.on{
background: #8558FA;
border-color:#8558FA;
color:#fff;
}
.panel-body .time-data{
height:100%;
}
.panel-body .head > div, .panel-body .body > div {
display: flex;
align-items: center;
justify-content: center;
flex: 1;
border-right: 1px solid #E6E6E6;
}
.panel-body .head > div:last-child, .panel-body .body > div:last-child {
border-right: 0;
}
.panel-body .head {
height: 60px;
border: 1px solid #E6E6E6;
}
.panel-body .head button {
font-size: 12px;
padding: 0 10px;
}
.panel-body .head span {
font-size: 12px;
margin-left: 5px;
}
.panel-body .body {
height: 50vh;
border: 1px solid #E6E6E6;
border-top:none;
}
.panel-body .time-wrap {
font-size: 18px;
align-items: center;
justify-content: center;
height: 60px;
}
.panel-body .time-wrap .date{
flex: unset;
margin: 0 20px;
border: none;
}
.panel-body .time-wrap .iconfont {
font-size: 18px;
cursor: pointer;
font-weight: bold;
}
.panel-body .prev,.panel-body .next {
cursor: pointer;
}
.panel-body .body > div {
height: 100%;
}
.panel-body .body .common-scrollbar {
overflow-y: scroll;
}
.panel-body .body .iconqianhou1, .panel-body .body .iconqianhou2 {
font-size: 0.28rem;
color: #E6E6E6;
}
.panel-body .body .box {
width: 100%;
}
.panel-body .body .panel-item {
width: calc(100% - 20px);
margin: 20px 10px 0 10px;
padding: 10px;
border-width: 4px 1px 1px 1px;
border-style: solid;
box-sizing: border-box;
border-radius: 4px;
background-color: #fff !important;
}
.panel-body .body .panel-item:last-child {
margin-bottom: 20px;
}
.panel-body .body .common-scrollbar {
display: block;
}
.panel-body .body .username {
font-size: 14px;
line-height: 1;
}
.panel-body .body .time {
color: #fff;
font-size: 12px;
padding: 5px;
line-height: 1;
width: auto;
display: inline-block;
margin-top: 10px;
border-radius: 2px;
}
.panel-body .body .service {
margin-top: 10px;
line-height: 1;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
.panel-body .body .action {
text-align: right;
margin-top: 5px;
}
.panel-body .body .action:after{
clear: both;
}
.panel-body .body .action .iconfont {
font-size: 14px;
color: #E6E6E6;
cursor: pointer;
border: 1.5px solid #ccc;
border-radius: 50%;
padding: 2px;
}
.common-scrollbar {
overflow-y: scroll;
box-sizing: border-box;
}
.common-scrollbar::-webkit-scrollbar {
width: 6px;
height: 6px;
background-color: rgba(0, 0, 0, 0);
}
.common-scrollbar::-webkit-scrollbar-button {
display: none;
}
.common-scrollbar::-webkit-scrollbar-thumb {
border-radius: 6px;
box-shadow: inset 0 0 6px rgba(45, 43, 43, 0.45);
background-color: #ddd;
}
.common-scrollbar::-webkit-scrollbar-track {
background-color: transparent;
}
.panel-body .month-table .table-tr{
display:flex;
flex-direction: row;
border:1px solid #E6E6E6;
border-bottom:none;
}
.panel-body .month-table .table-body .table-tr:last-child{
border-bottom:1px solid #E6E6E6;
}
.panel-body .month-table .table-tr .table-td{
width:100%;
border-right:1px solid #E6E6E6;
}
.panel-body .month-table .table-tr .table-td:last-child{
border-right: none;
}
.panel-body .month-table .table-head .table-td{
text-align: center;
line-height:40px;
}
.panel-body .month-table .table-body .table-td{
text-align: left;
}
.panel-body .month-table .table-body .table-td .top{
border-bottom:1px solid #E6E6E6;
line-height: 26px;
text-indent: 8px;
}
.panel-body .month-table .table-body .table-td.not-curr-month .top{
color:#909399;
}
.panel-body .month-table .table-body .table-td .bottom{
height:78px;
}
.panel-body .month-table .table-body .table-td .bottom .item-box{
position: relative;
}
.panel-body .month-table .table-body .table-td .bottom .item{
display:flex;
flex-direction: row;
align-items: center;
cursor: pointer;
}
.panel-body .month-table .table-body .table-td .bottom .item span:first-child{
display:block;
width:4px;
height:4px;
min-width: 4px;
border-radius: 50%;
/*background: #60BECA;*/
margin:0 6px;
}
.panel-body .month-table .table-body .table-td .bottom .item span:last-child{
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 1;
overflow: hidden;
}
.panel-body .month-table .table-body .table-td .bottom .item-box .detail-card{
position: absolute;
bottom:25px;
left:30px;
border:1px solid #ccc;
width:150px;
padding:8px 8px;
background: #fff;
z-index:1;
border-radius: 3px;
display:none;
}
.panel-body .month-table .table-body .table-td .bottom .item-box .detail-card:after {
position: absolute;
left: 40px;
bottom: -6px;
width: 10px;
height: 10px;
margin-top: -2px;
border-right: 1px solid #ccc;
border-bottom: 1px solid #ccc;
-webkit-transform: rotate(45deg);
content: '';
background: #ffffff;
}
.panel-body .month-table .table-body .table-td .bottom .item-box .detail-card .time{
display:inline-block;
color:#fff;
padding:2px 5px;
border-radius: 2px;
margin-top:2px;
margin-bottom:2px;
}
.panel-body .month-table .table-body .table-td .bottom .item-box .detail-card .state{
text-align: right;
margin-top:2px;
}
.panel-body .month-table .table-body .table-td .bottom .item-box .detail-card .service{
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
overflow: hidden;
}
.panel-body .month-table .table-body .table-td .bottom .item-box:hover .detail-card{
display: block;
}
.panel-body .month-table .table-body .table-td .bottom .more{
text-indent: 6px;
cursor: pointer;
}
.panel-body .month-table .table-body .table-td .bottom .more a{
color:#8558FA;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 146 KiB

View File

@@ -0,0 +1,347 @@
requestAdd = 'cardservice://shop/card/addGoods';
requestEdit = 'cardservice://shop/card/editGoods';
goodsTag = '卡项';
var relationGoods = [];
// 追加刷新商品sku数据
appendRefreshGoodsSkuData = {
service_length: 0
};
// 追加单规格数据
function appendSingleGoodsData(data) {
return {
service_length: data.field.service_length
};
}
// 追加保存数据
function appendSaveData(data) {
var card_type = $('.card-type-item.active').attr('data-value');
if (card_type == 'oncecard') {
relationGoods.forEach(function (item, index) {
item.num = $('.relation-goods-table.oncecard .layui-table-body tr:eq(' + index + ') .num').val();
})
} else {
relationGoods.forEach(function (item, index) {
item.discount = $('.relation-goods-table.discountcard .layui-table-body tr:eq(' + index + ') .discount').val();
})
}
return {
card_type: card_type,
validity_type: $('[name="validity_type"]:checked').val(),
relation_goods: JSON.stringify(relationGoods) // 卡项参数格式
};
}
// 编辑初始化数据回调
function initEditDataCallBack() {
relationGoods = $('[name="relation_goods"]').val() ? JSON.parse($('[name="relation_goods"]').val()) : [];
}
$(function () {
layui.use(['element', 'laytpl', 'form', 'laydate', 'table'], function () {
form = layui.form;
element = layui.element;
laytpl = layui.laytpl;
laydate = layui.laydate;
laytable = layui.table;
form.render();
var time = new Date();
var currentTime = time.toLocaleDateString + " " + time.getHours() + ":" + time.getMinutes() + ":" + time.getSeconds();
//卡项有效期
laydate.render({
elem: '#validity_time', //指定元素
type: 'datetime',
min: currentTime
});
//核销有效期类型
form.on('radio(validity_type)', function (data) {
var value = parseInt(data.value);
$('.validity-type').addClass('layui-hide');
$('.validity-type.validity-type-' + value).removeClass('layui-hide');
});
// 选择卡项类型
$('.card-type-item').click(function () {
if ($(this).hasClass('active')) return;
var value = $(this).attr('data-value');
$(this).addClass('active').siblings('.card-type-item').removeClass('active');
$('.card-type-content').hide();
$('.card-type-content.' + value).show();
fetchRelationGoods();
});
// 选择关联商品
$('.add-relation-goods').click(function () {
var skuids = [];
relationGoods.forEach(function (item) {
skuids.push(item.sku_id)
});
var select_goods_class = $(this).data('goods-class');
goodsSelect(function (data) {
var skuList = [];
for (var key in data) {
for (var sku in data[key].selected_sku_list) {
var item = data[key].selected_sku_list[sku];
skuList.push(item);
}
}
relationGoods = skuList;
fetchRelationGoods();
}, skuids, {mode: 'sku', goods_class: select_goods_class ?? '1,4'});
});
function fetchRelationGoods() {
var cardType = $('.card-type-item.active').attr('data-value');
var elem = cardType == 'discountcard' ? '#relationDiscountGoods' : '#relationGoods';
var cols = [
{
field: 'sku_name',
title: '商品/项目名称',
width: '35%'
},
{
field: 'goods_class_name',
title: '商品类型',
},
{
field: 'sex',
title: '售价',
width: '15%',
align: 'right',
templet: function (data) {
return '¥' + data.price;
}
},
{
title: '操作',
align: 'right',
templet: function (data) {
return `<a href="javascript:;" class="text-color delete">删除</a>`;
}
}
];
switch (cardType) {
case 'oncecard':
cols.splice(2, 0, {
title: '可用次数/数量',
align: 'center',
templet: function (data) {
return `<input type="text" placeholder="0" lay-verify="use_num" value="` + (data.num ? data.num : '') + `" class="layui-input len-short num" autocomplete="off">`;
}
});
break;
case 'discountcard':
cols.splice(2, 0, {
title: '可享折扣',
align: 'center',
templet: function (data) {
return `<input type="text" placeholder="0" lay-verify="discount" value="` + (data.discount ? data.discount : '') + `" class="layui-input len-short discount" autocomplete="off"> %`;
}
});
break;
}
var _table = laytable.render({
elem: elem,
data: relationGoods,
cols: [cols],
skin: 'nob',
done: function () {
if (cardType == 'oncecard' || cardType == 'discountcard') $('.card-type-content .batch-set').show();
else $('.card-type-content .batch-set').hide();
$('body').off('click', '.relation-goods-table .delete').on('click', '.relation-goods-table .delete', function () {
$(this).parents('tr').remove();
relationGoods.splice($(this).parents('tr').index(), 1);
})
}
});
if (!relationGoods.length) {
$(elem).next('.layui-table-view').remove();
$('.card-type-content .batch-set').hide();
}
}
fetchRelationGoods();
// 关联商品批量设置
$('.batch-set .set').click(function () {
var parents = $(this).parents('.batch-set');
parents.find('.set-item').hide();
parents.find('.set-content-wrap').show();
});
$('.batch-set .cancel').click(function () {
var parents = $(this).parents('.batch-set');
parents.find('.value').val('');
parents.find('.set-item').show();
parents.find('.set-content-wrap').hide();
});
$('.batch-set .confirm').click(function () {
var parents = $(this).parents('.batch-set');
var value = parents.find('.value').val();
var type = parents.find('.value').attr('data-type');
if (!regExp.required.test(value)) {
layer.msg('请输入要设置的值');
return;
}
if (type == 'num') {
if (!regExp.number.test(value)) {
layer.msg('可用次数格式错误');
return;
}
if (parseInt(value) < 1) {
layer.msg('可用次数不能小于等于0');
return;
}
}
if (type == 'discount') {
if (!regExp.number.test(value)) {
layer.msg('折扣格式错误');
return;
}
if (parseInt(value) < 1 || parseInt(value) > 99) {
layer.msg('折扣需在[1-99]之间设置');
return;
}
}
// 批量设置值
$(this).parents('.layui-form-item').find('.' + type).val(value);
parents.find('.value').val('');
parents.find('.set-item').show();
parents.find('.set-content-wrap').hide();
});
form.on('radio(discount_goods_type)', function (data) {
$('.discount-goods').hide();
$('.discount-goods.' + data.value).show();
});
form.verify({
//销售价
price: function (value) {
if (!$("input[name='spec_type']").is(":checked")) {
if (value.length == 0) {
element.tabChange('goods_tab', "price-stock");
return "请输入卡项开卡价";
}
if (isNaN(value) || !regExp.digit.test(value)) {
element.tabChange('goods_tab', "price-stock");
return '[卡项开卡价]格式输入错误';
}
}
},
renew_price: function (value) {
if (value.length == 0) {
element.tabChange('goods_tab', "price-stock");
return "请输入卡项续费价";
}
if (isNaN(parseInt(value)) || !regExp.digit.test(value)) {
element.tabChange('goods_tab', "price-stock");
return '[卡项续费价]格式输入错误';
}
},
//有效期
validity_day: function (value) {
var verify_validity_type = $('[name="validity_type"]:checked').val();
if (verify_validity_type == 1) {
if (isNaN(value) || !regExp.number.test(value)) {
element.tabChange('goods_tab', "basic");
return '[卡项有效期]格式输入错误';
}
if (value < 1) {
element.tabChange('goods_tab', "basic");
return '卡项有效期不能小于1天';
}
}
},
validity_time: function (value) {
var verify_validity_type = $('[name="validity_type"]:checked').val();
if (verify_validity_type == 2 && value.length == 0) {
element.tabChange('goods_tab', "basic");
return "请输入有效期";
}
},
relation_goods: function () {
var cardType = $('.card-type-item.active').attr('data-value');
if (cardType != 'discountcard' && !$('.relation-goods-table.oncecard .layui-table-body tr').length) {
return '请选择卡项内容';
}
},
relation_discount_goods: function () {
var cardType = $('.card-type-item.active').attr('data-value');
if (cardType == 'discountcard' && $('[name="discount_goods_type"]:checked').val() != 'all' && !$('.relation-goods-table.discountcard .layui-table-body tr').length) {
return '请选择卡项内容';
}
},
use_num: function (value) {
var cardType = $('.card-type-item.active').attr('data-value');
if (cardType == 'oncecard') {
if (!regExp.required.test(value)) {
return '请输入可用次数/数量';
}
if (!regExp.number.test(value)) {
return '次数/数量格式错误';
}
if (parseInt(value) < 1) {
return '可用次数/数量不能小于等于0';
}
}
},
discount: function (value) {
var cardType = $('.card-type-item.active').attr('data-value');
if (cardType == 'discountcard' && $('[name="discount_goods_type"]:checked').val() != 'all') {
if (!regExp.required.test(value)) {
return '请输入折扣卡折扣';
}
if (!regExp.number.test(value)) {
return '折扣卡折扣格式错误';
}
if (parseInt(value) < 1 || parseInt(value) > 99) {
return '折扣卡折扣需在[1-99]之间设置';
}
}
},
common_discount: function (value) {
var cardType = $('.card-type-item.active').attr('data-value');
if (cardType == 'discountcard' && $('[name="discount_goods_type"]:checked').val() == 'all') {
if (!regExp.required.test(value)) {
return '请输入折扣卡折扣';
}
if (!regExp.number.test(value)) {
return '折扣卡折扣格式错误';
}
if (parseInt(value) < 1 || parseInt(value) > 99) {
return '折扣卡折扣需在[1-99]之间设置';
}
}
},
common_num: function (value) {
var cardType = $('.card-type-item.active').attr('data-value');
if (cardType == 'commoncard') {
if (!regExp.required.test(value)) {
return '请输入卡项可用次数/数量';
}
if (!regExp.number.test(value)) {
return '卡项可用次数/数量格式错误';
}
if (parseInt(value) < 1) {
return '卡项可用次数/数量不能小于等于0';
}
}
}
});
});
});

View File

@@ -0,0 +1,109 @@
var layCascader, goodsCategory = [];
layui.use(['layCascader'], function () {
layCascader = layui.layCascader;
$('.goods-category-con-wrap .layui-block').each(function () {
var category_id = $(this).find('.category_id').val();
var _this = this;
fetchCategory({elem: $(this).find('.select-category'), value: category_id ? parseInt(category_id.split(',').splice(-1)) : ''},
function (value, node) {
var categoryId = [];
node.path.forEach(function (item) {
categoryId.push(item.value)
});
$(_this).find('.category_id').val(categoryId.toString())
}
)
});
});
// 刷新项目分类,更新选择项目分类数据
$('body').off('click', '.goods-category-con-wrap .js-refresh-category').on('click', '.goods-category-con-wrap .js-refresh-category', function () {
$.ajax({
url : ns.url("cardservice://shop/servicecategory/lists"),
dataType: 'JSON',
type: 'POST',
async: false,
success: function(res) {
goodsCategory = res.data;
// 刷新商品分类下拉框数据
$('.goods-category-con-wrap .layui-block').each(function () {
$(this).find('.el-cascader').remove(); // 清空渲染
var category_id = $(this).find('.category_id').val();
var _this = this;
fetchCategory({elem: $(this).find('.select-category'), value: category_id ? parseInt(category_id.split(',').splice(-1)) : ''},
function (value, node) {
var categoryId = [];
node.path.forEach(function (item) {
categoryId.push(item.value)
});
$(_this).find('.category_id').val(categoryId.toString())
}
)
});
}
});
});
$('body').off('click', '.goods-category-wrap-box .js-add-category').on('click', '.goods-category-wrap-box .js-add-category', function () {
if ($('.goods-category-con-wrap .layui-block').length >= 10) {
layer.msg('最多添加十个分类');
return;
}
var h = `<div class="layui-block">
<div class="layui-input-inline cate-input-default">
<input type="text" readonly lay-verify="required" autocomplete="off" class="layui-input len-mid select-category" />
<input type="hidden" class="category_id" />
</div>
<a href="javascript:;" class="text-color js-delete-category">删除</a>
</div>`;
$('.goods-category-con-wrap').append(h);
fetchCategory({elem: $('.goods-category-con-wrap .layui-block:last-child').find('.select-category')}, function (value, node) {
var categoryId = [];
node.path.forEach(function (item) {
categoryId.push(item.value)
});
$('.goods-category-con-wrap .layui-block:last-child').find('.category_id').val(categoryId.toString());
})
});
$('body').off('click', '.goods-category-con-wrap .js-delete-category').on('click', '.goods-category-con-wrap .js-delete-category', function () {
$(this).parents('.layui-block').remove();
});
/**
* 渲染分类选择
* @param option
* @param callback
*/
function fetchCategory(option, callback){
if (!goodsCategory.length) {
$.ajax({
url : ns.url("cardservice://shop/servicecategory/lists"),
dataType: 'JSON',
type: 'POST',
async: false,
success: function(res) {
goodsCategory = res.data;
}
})
}
var _option = {
options: goodsCategory,
props: {
value: 'category_id',
label: 'category_name',
children: 'child_list'
}
};
if (option) Object.assign(_option, option);
var _cascader = layCascader(_option);
_cascader.changeEvent(function (value, node) {
typeof callback == 'function' && callback(value, node)
});
}

View File

@@ -0,0 +1,407 @@
var link_url_json = $("input[name='link_url']").val();
if(link_url_json) {
link_url_json = JSON.parse(link_url_json);
$(".link-url-show").text(link_url_json.title);
}
var laytpl, form, layerIndex;
var categoryFullName = [];//组装名称
var saveData = null;
var totalUploadNum = 0;
var completeUploadNum = 0;
$(function () {
//编辑时赋值组装名称
if ($("input[name='category_full_name']").length > 0) {
categoryFullName = $("input[name='category_full_name']").val().split("/").slice(0, $("input[name='category_full_name']").val().split("/").length - 1);
}
layui.use(['form', 'laytpl'], function () {
var repeat_flag = false;//防重复标识
laytpl = layui.laytpl;
form = layui.form;
/**
* 表单验证
*/
form.verify({
commission_rate: function (value) {
var reg = /^\d{0,2}(.?\d{0,2})$/;
if (value.length > 0) {
if (isNaN(value)) {
return '佣金比率输入错误';
}
if (!reg.test(value) || value < 0 || value > 100) {
return '佣金比率范围:0~100%';
}
}
},
num: function (value) {
if (value == '') {
return;
}
if (value % 1 != 0) {
return '排序数值必须为整数';
}
if (value < 0) {
return '排序数值必须为大于0';
}
}
});
var upload = new Upload({
elem: '#imgUpload',
size:100,
auto:false,
bindAction:'#imageUploadAction',
callback: function(res) {
uploadComplete('image', res.data.pic_path);
}
});
var adv_upload = new Upload({
elem: '#imgUploadAdv',
auto:false,
bindAction:'#imageAdvUploadAction',
callback: function(res) {
uploadComplete('image_adv', res.data.pic_path);
}
});
function uploadComplete(field, pic_path) {
saveData.field[field] = pic_path;
completeUploadNum += 1;
if(completeUploadNum == totalUploadNum){
saveFunc();
}
}
form.on('submit(save)', function (data) {
saveData = data;
var obj = $("img.img_prev[data-prev='1']");
totalUploadNum = obj.length;
if(totalUploadNum > 0){
obj.each(function(){
var actionId = $(this).attr('data-action-id');
$(actionId).click();
})
}else{
saveFunc();
}
return false;
});
function saveFunc(){
var data = saveData;
categoryFullName.push(data.field.category_name);
data.field.category_full_name = categoryFullName.join("/");
data.field.attr_class_name = $("select[name='attr_class_id'] option:checked").text();
// 删除图片
if(!data.field.image) upload.delete();
if(!data.field.image_adv) adv_upload.delete();
if (repeat_flag) return false;
repeat_flag = true;
var url = ns.url("cardservice://shop/servicecategory/addCategory");
if (data.field.category_id) url = ns.url("cardservice://shop/servicecategory/editCategory");
$.ajax({
url: url,
data: data.field,
dataType: 'json',
type: 'post',
success: function (data) {
layer.msg(data.message);
if (data.code == 0) {
location.hash = ns.hash("cardservice://shop/servicecategory/lists");
} else {
repeat_flag = false;
}
}
});
}
//保存上级分类
form.on('submit(save_pid)', function (data) {
var option_category_id_1 = $("select[name='category_id_1'] option:checked");
var option_category_id_2 = $("select[name='category_id_2'] option:checked[value!='0']");
categoryFullName = [];
var level, category_name, pid;
if (option_category_id_1.length) {
level = parseInt(option_category_id_1.attr("data-level"));
category_name = option_category_id_1.text();
pid = option_category_id_1.val();//上级分类id
var category_id_1 = option_category_id_1.val();//一级分类id
if (category_id_1 > 0) {
$("input[name='category_id_1']").val(category_id_1);
categoryFullName.push(category_name);
}
}
if($("input[name='category_name_1']").length){
categoryFullName.push($("input[name='category_name_1']").val());
}
// 选中了二级商品分类
if (option_category_id_2.length) {
level = parseInt(option_category_id_2.attr("data-level"));
category_name = option_category_id_2.text();
pid = option_category_id_2.val();
var category_id_2 = option_category_id_2.val();//二级分类id
if (category_id_2 > 0) {
$("input[name='category_id_2']").val(category_id_2);
categoryFullName.push(category_name);
}
}
$(".js-pid span").text(category_name);
$("input[name='pid']").val(pid);
$("input[name='level']").val(level + 1);//当前添加的层级+1
layer.close(layerIndex);
return false;
});
setTimeout(()=>{
form.render();
},600)
});
});
//选择商品分类弹出框
function selectedCategoryPopup() {
if ($("input[name='category_id']").length) {
// 修改
editSelectedPid();
} else {
//添加
addSelectedPid();
}
}
/**
* 获取商品分类列表
* @param data
* @param callback
*/
function getCategoryList(data, callback) {
$.ajax({
url: ns.url("cardservice://shop/servicecategory/getCategoryList"),
data: data,
dataType: 'json',
type: 'post',
async: false,
success: function (res) {
var data = res.data;
if (callback) callback(data);
}
});
}
/**
* 添加时,选择上级分类
*/
function addSelectedPid() {
//查询一级商品分类
getCategoryList({pid: 0}, function (list) {
var html = $("#selectedCategory").html();
var data = {
category_id_1: $("input[name='category_id_1']").val(),
category_list_1: list
};
laytpl(html).render(data, function (html) {
layerIndex = layer.open({
title: '选择商品分类',
skin: 'layer-tips-class',
type: 1,
area: ['450px'],
content: html,
success: function () {
form.render();
form.on('select(category_id_1)', function (item) {
if (item.value > 0) {
getCategoryList({pid: item.value}, function (list) {
var h = '<option value="0">请选择</option>';
for (var i = 0; i < list.length; i++) {
if ($("input[name='category_id_2']").val() == list[i].category_id) {
h += '<option value="' + list[i].category_id + '" data-level="' + list[i].level + '" selected>' + list[i].category_name + '</option>';
} else {
h += '<option value="' + list[i].category_id + '" data-level="' + list[i].level + '">' + list[i].category_name + '</option>';
}
}
$("select[name='category_id_2']").html(h);
form.render("select");
});
} else {
//顶级分类不需要查询
$("select[name='category_id_2']").html('<option value="0">请选择</option>');
form.render("select");
}
});
$("select[name='category_id_1']").siblings("div.layui-form-select").find("dl dd[lay-value='" + $("input[name='category_id_1']").val() + "']").click();
}
});
});
});
}
/**
* 编辑时,选择上级分类
*/
function editSelectedPid() {
var html = $("#selectedCategory").html();
laytpl(html).render({}, function (html) {
layerIndex = layer.open({
title: '选择商品分类',
skin: 'select-category',
type: 1,
area: ['650px'],
content: html,
btn: ['确定', '取消'],
success: function () {
var pid = $('input[name="pid"]').val();
var level = $('input[name="level"]').val();
$('.table_div input[name="category_id"][data-category-id="'+pid+'"]').attr('checked', true);
if(level == 3) $('.table_div div[data-cateid="'+pid+'"]').parents('.table_two_div').show().prev('.table_tr').find('.switch').attr('data-open', 1).html('-');
form.render();
$(".js-switch").click(function (event) {
event.stopPropagation();
var category_id = $(this).attr("data-category-id");
var level = $(this).attr("data-level");
var open = parseInt($(this).attr("data-open").toString());
if(open){
$(".goods-category-list .layui-table tr[data-category-id-"+ level+"='" + category_id + "']").hide();
// $(this).children("img").removeClass('rotate');
$(this).text("+");
if(level == 1) $(this).parents('.table_tr').siblings('.table_two_div').hide();
else if(level == 2) $(this).parents('.table_tr').siblings('.table_three').hide();
}else{
$(".goods-category-list .layui-table tr[data-category-id-"+ level+"='" + category_id + "']").show();
$(this).text("-");
// $(this).children("img").addClass('rotate');
if(level == 1) $(this).parents('.table_tr').siblings('.table_two_div').show();
else if(level == 2) $(this).parents('.table_tr').siblings('.table_three').show();
}
$(this).attr("data-open", (open ? 0 : 1));
});
form.on('checkbox(category)', function (data) {
if(data.elem.checked==true){
$('.table_move').children('div').removeClass('layui-form-checked');
$(".table_move input").prop("checked",false);
}
$(this).parents('.table_move').children('div').addClass('layui-form-checked');
$(this).parents('.table_move').find('input').prop("checked",true);
return false;
});
},
yes: function(index, layero){
var obj = $('.table_div input[name="category_id"]:checked');
var num = $(obj).length;
if(num > 1){
layer.msg('只能选择一个上级');
return false;
}
var parent_level = $(obj).attr('data-level');
var pid = $(obj).val();
var parent_name = $(obj).attr('data-name');
if(num < 1){
parent_level = 0;
pid = 0;
parent_name = '顶级分类';
}
$.ajax({
url: ns.url("cardservice://shop/servicecategory/checkEditCategory"),
data: {
category_id: $('#category_id').val(),
pid : pid
},
dataType: 'json',
type: 'post',
async: false,
success: function (res) {
if(res.code >= 0){
$(".js-pid span").text(parent_name);
$("input[name='pid']").val(pid);
$("input[name='level']").val(parseInt(parent_level) + 1);//当前添加的层级+1
layer.close(layerIndex);
}else{
layer.msg(res.message)
}
}
});
}
});
});
}
/**
* 获取商品分类信息
* @param category_id
* @param callback
*/
function getCategoryInfo(category_id, callback) {
$.ajax({
url: ns.url("cardservice://shop/servicecategory/getCategoryInfo"),
data: {category_id: category_id},
dataType: 'json',
type: 'post',
async: false,
success: function (res) {
var data = res.data;
if (callback) callback(data);
}
});
}
function backCardServiceCategoryList() {
location.hash = ns.hash("cardservice://shop/servicecategory/lists")
}
function selectedLink() {
if (link_url_json == "") {
link_url_json = {};
}
ns.select_link(link_url_json, function (data) {
for (var o in data) {
if (data[o] == null) delete data[o];
}
$("input[name='link_url']").val(JSON.stringify(data));
$(".link-url-show-wrap .layui-input-block").find('.link-url-show').remove();
$(".link-url-show-wrap .layui-input-block").prepend(`<span class="link-url-show">${data.title}</span>`);
});
}

View File

@@ -0,0 +1,104 @@
requestAdd = 'cardservice://shop/service/addGoods';
requestEdit = 'cardservice://shop/service/editGoods';
goodsTag = '项目';
// 追加刷新商品sku数据
appendRefreshGoodsSkuData = {
service_length: 0
};
// 追加单规格数据
function appendSingleGoodsData(data) {
return {
service_length: data.field.service_length
};
}
// 追加保存数据
function appendSaveData(data) {
return {
verify_validity_type: $('[name="verify_validity_type"]:checked').val()
};
}
$(function () {
layui.use(['element', 'laytpl', 'form', 'laydate'], function () {
form = layui.form;
element = layui.element;
laytpl = layui.laytpl;
laydate = layui.laydate;
form.render();
var time = new Date();
var currentTime = time.toLocaleDateString + " " + time.getHours() + ":" + time.getMinutes() + ":" + time.getSeconds();
//核销有效期
laydate.render({
elem: '#virtual_time', //指定元素
type: 'datetime',
min: currentTime
});
//卡项有效期类型
form.on('radio(verify_validity_type)', function (data) {
var value = parseInt(data.value);
$('.validity-type').addClass('layui-hide');
$('.validity-type.validity-type-' + value).removeClass('layui-hide');
});
form.verify({
//有效期
virtual_indate: function (value) {
var verify_validity_type = $('[name="verify_validity_type"]:checked').val();
if (verify_validity_type == 1) {
if (isNaN(value) || !regExp.number.test(value)) {
element.tabChange('goods_tab', "basic");
return '[核销有效期]格式输入错误';
}
if (value < 1) {
element.tabChange('goods_tab', "basic");
return '核销有效期不能小于1天';
}
}
},
virtual_time: function (value) {
var verify_validity_type = $('[name="verify_validity_type"]:checked').val();
if (value.length == 0 && verify_validity_type == 2) {
element.tabChange('goods_tab', "basic");
return "请输入有效期";
}
},
service_length: function (value) {
if (value.length > 0) {
value = parseInt(value);
if (isNaN(value) || !regExp.number.test(value)) {
element.tabChange('goods_tab', "price-stock");
return '[服务时长]格式输入错误';
}
if (value < 0) {
element.tabChange('goods_tab', "price-stock");
return '[服务时长]不能小于0';
}
}
},
//销售价
service_price: function (value) {
if (!$("input[name='spec_type']").is(":checked")) {
if (value.length == 0) {
element.tabChange('goods_tab', "basic");
return "请输入销售价";
}
if (isNaN(value) || !regExp.digit.test(value)) {
element.tabChange('goods_tab', "basic");
return '[销售价]格式输入错误';
}
}
},
});
});
});

View File

@@ -0,0 +1,537 @@
<link rel="stylesheet" href="ADDON_CARDSERVICE_CSS/add_reserve.css">
<div class="main-wrap">
<div class="layui-form" lay-filter="form">
<br>
{empty name="info"}
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>手机号:</label>
<div class="layui-input-inline search-wrap">
<input type="text" class="layui-input len-mid" name="mobile" placeholder="请输入客户手机号" autocomplete="off" lay-verify="required">
<i class="iconfont iconsousuo"></i>
</div>
</div>
{else/}
<input type="hidden" name="reserve_id" value="{$info.reserve_id}">
{/empty}
<div class="error">请输入正确的手机号</div>
<div class="layui-form-item" lay-verify="member">
<label class="layui-form-label"><span class="required">*</span>客户:</label>
<div class="layui-input-block member">
{notempty name="info"}
<div class="member-info">
<input type="hidden" name="member_id" value="{$info.member_id}">
{notempty name="$info.headimg"}
<img src="{:img($info.headimg)}" onerror="this.src = 'STATIC_IMG/default_img/head.png' " alt="">
{else/}
<img src="STATIC_IMG/default_img/head.png" alt="">
{/notempty}
<div class="info">
<div class="name">{$info.nickname}</div>
<div>
<span>手机号:{$info.mobile}</span>
</div>
</div>
</div>
{/notempty}
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>预约门店:</label>
<div class="layui-input-inline len-mid">
<select name="store_id" lay-filter="store" {notempty name="info"}disabled{/notempty}>
{foreach $store_list as $k=> $v}
<option value="{$v.store_id}" {if !empty($info) && $info['store_id'] == $v['store_id']} selected {/if}>{$v.store_name}</option>
{/foreach}
</select>
</div>
</div>
<div class="layui-form-item" lay-verify="service">
<label class="layui-form-label"><span class="required">*</span>项目:</label>
<div class="layui-input-block service-table">
<table class="layui-table" lay-skin="line">
<colgroup>
<col width="50%">
<col width="30%">
<col width="20%">
</colgroup>
<thead>
<tr>
<th>预约项目</th>
<th>员工</th>
<th class="align-center">操作</th>
</tr>
</thead>
<tbody>
{notempty name="info"}
{foreach name="info.item" item="vo"}
<tr>
<td>
<div class="service-item service-item-btn">
<div class="info" >
<input type="hidden" name="sku" value="{$vo.sku_id}">
<input type="hidden" name="goods" value="{$vo.goods_id}">
<div class="title" title="{$vo.goods_name}">{$vo.goods_name}</div>
<div class="desc">项目时长:{$vo.service_length}分钟 ¥{$vo.price}</div>
</div>
<i class="iconfont iconlower-triangle"></i>
</div>
</td>
<td>
<div class="servicer-item servicer-item-btn">
{if $vo.reserve_user_id}
<div class="info">
<input type="hidden" name="servicer_id" value="{$vo.reserve_user_id}">
<div class="title" title="{$vo.username}">{$vo.username}</div>
</div>
{else/}
<div class="info">请选择员工</div>
{/if}
<i class="iconfont iconlower-triangle"></i>
</div>
</td>
<td class="align-center"><a href="javascript:;" class="text-color delete">删除</a></td>
</tr>
{/foreach}
{else/}
<tr>
<td>
<div class="service-item service-item-btn" id="">
<div class="info">请选择项目</div>
<i class="iconfont iconlower-triangle"></i>
</div>
</td>
<td>
<div class="servicer-item servicer-item-btn">
<div class="info">请选择员工</div>
<i class="iconfont iconlower-triangle"></i>
</div>
</td>
<td class="align-center"><a href="javascript:;" class="text-color delete">删除</a></td>
</tr>
{/notempty}
</tbody>
</table>
<button class="layui-btn layui-btn-primary add">添加</button>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>到店时间:</label>
<div class="layui-input-block">
<div class="layui-input-inline">
{notempty name="info"}
<input type="text" id="reserveDate" name="date" autocomplete="off" class="layui-input" placeholder="请选择到店日期" value="{:date('Y-m-d', $info.reserve_time)}" lay-verify="required">
{else/}
<input type="text" id="reserveDate" name="date" autocomplete="off" class="layui-input" placeholder="请选择到店日期" value="{:date('Y-m-d')}" lay-verify="required">
{/notempty}
<i class="iconfont iconriqi"></i>
</div>
<div class="layui-input-inline">
{notempty name="info"}
<input type="text" id="reserveTime" name="time" autocomplete="off" class="layui-input" value="{:date('H:i', $info.reserve_time)}" placeholder="请选择到店时间" readonly lay-verify="required">
{else/}
<input type="text" id="reserveTime" name="time" autocomplete="off" class="layui-input" placeholder="请选择到店时间" readonly lay-verify="required">
{/notempty}
</div>
</div>
<div class="word-aux">预约需提前{$config.advance}小时预约</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">备注:</label>
<div class="layui-input-block">
<textarea name="remark" cols="30" rows="6" class="layui-textarea len-long">{$info.remark ?? ''}</textarea>
</div>
</div>
<div class="save-wrap">
<button class="layui-btn" lay-submit lay-filter="save">保存</button>
</div>
</div>
</div>
{php}$today = strtotime(date('Y-m-d')) {/php}
<script type="text/html" id="selectTime">
<div class="select-time">
<div class="time-wrap today">
{for start="$config.start" end="$config.end + 1800" name="i" step="1800"}
{if $today + $i > time()}
<div class="time-item" data-value="{:date('H:i', ($today + $i) )}">{:date('H:i', ($today + $i) )}</div>
{/if}
{/for}
</div>
<div class="time-wrap no-today">
{for start="$config.start" end="$config.end + 1800" name="i" step="1800"}
<div class="time-item" data-value="{:date('H:i', ($today + $i) )}">{:date('H:i', ($today + $i) )}</div>
{/for}
</div>
</div>
</script>
<script type="text/html" id="selectService">
<div class="select-service">
<div class="service-wrap">
{notempty name="$service"}
<div class="flex-wrap">
{foreach name="$service" item="vo"}
<div class="item">
<input type="hidden" name="sku" value="{$vo.sku_id}">
<input type="hidden" name="goods" value="{$vo.goods_id}">
<div class="title" title="{$vo.goods_name}">{$vo.goods_name}</div>
<div class="desc">项目时长{$vo.service_length}分钟 {$vo.price}</div>
</div>
{/foreach}
</div>
{else/}
<div class="flex-wrap">
<div class="empty">暂无可预约的项目</div>
<div>
{/notempty}
</div>
</div>
</script>
<script type="text/html" id="selectServicer">
</script>
<script>
var today = "{$today}";
var laydate, dropdown, form, target, repeat = false;
layui.use(['laytpl', 'laydate', 'dropdown', 'form'], function(){
laytpl = layui.laytpl;
laydate = layui.laydate;
dropdown = layui.dropdown;
form = layui.form;
$('.search-wrap .iconfont').click(function () {
var mobile = $('[name="mobile"]').val();
if (mobile.length == 0) {
$('.error').text('请输入客户手机号').show();
return;
}
if (!ns.parse_mobile(mobile)) {
$('.error').text('请输入正确的手机号').show();
return;
}
$('.error').hide();
$.ajax({
url: ns.url("shop/member/searchMember"),
data: {
search_text: mobile
},
dataType: 'JSON',
type: 'POST',
success: function (res) {
if (res.code == 0 && res.data) {
$('.error').hide();
var info = res.data;
$('.member').html(` <div class="member-info">
<input type="hidden" name="member_id" value="` + info.member_id + `">
`+ (info.headimg ? `<img src="${ns.img(info.headimg)}" onerror="this.src = \'STATIC_IMG/default_img/head.png\' " alt="">` : '<img src="STATIC_IMG/default_head_square.png" alt="">') + `
<div class="info">
<div class="name">` + info.nickname + `</div>
<div>
<span>手机号:` + info.mobile + `</span>
</div>
</div>
</div>`);
} else {
$('.member').html('');
$('.error').text('未查找到该客户').show();
}
}
});
});
// 切换门店
form.on('select(store)', function (data) {
$.ajax({
url: ns.url("cardservice://shop/reserve/getconfig"),
data: {'store_id' : data.value},
dataType: 'JSON',
type: 'POST',
success: function (res) {
if (res.code == 0) {
let data = res.data.value;
let time = "{:time()}";
let html = `
<div class="select-time">
<div class="time-wrap today">
`;
for (let i = data.start; i <= (data.end + 1800); i+=1800){
if(parseInt(today) + parseInt(i) > time){
let data_value = ns.time_to_date(parseInt(today)+parseInt(i), 'H:i');
data_value = $.trim(data_value);
html += `<div class="time-item" data-value="${data_value}">${data_value}</div>`;
}
}
html += '</div>';
html += '<div class="time-wrap no-today">';
for (let i = data.start; i <= (data.end + 1800); i+=1800){
let data_value = ns.time_to_date(parseInt(today)+parseInt(i), 'H:i');
data_value = $.trim(data_value);
html += `
<div class="time-item" data-value="${data_value}">${data_value}</div>
`;
}
html += `
</div>
</div>
`;
$('#selectTime').html(html);
$('#reserveTime').val('');
initTime(data.week);
$('.servicer-item-btn .info').html('请选择员工');
getServicer();
}
}
})
});
laydate.render({
elem: '#reserveDate',
type: 'date',
min: 0,
done: function(value, date, endDate){
$('[name="time"]').val('');
}
});
initTime("{:implode($config.week)}");
$('body').off('click', '.time-wrap .time-item').on('click', '.time-wrap .time-item', function () {
if ($(this).hasClass('no-select')) {
layer.msg('不在可预约时间内');
return;
}
dropdown.hide('#reserveTime');
$('[name="time"]').val($(this).text());
});
getServicer();
initDropdown();
$('.service-table .add').click(function () {
var service_id = ns.gen_non_duplicate(5);
var servicer_id = ns.gen_non_duplicate(5);
$('.service-table tbody').append(`<tr>
<td>
<div class="service-item service-item-btn" id="${service_id}">
<div class="info">请选择项目</div>
<i class="iconfont iconlower-triangle"></i>
</div>
</td>
<td>
<div class="servicer-item servicer-item-btn" id="${servicer_id}">
<div class="info">请选择员工</div>
<i class="iconfont iconlower-triangle"></i>
</div>
</td>
<td class="align-center"><a href="javascript:;" class="text-color delete">删除</a></td>
</tr>`);
dropdown.suite("#"+service_id, {
template: "selectService",
maxWidth:'660',
success: function ($dom) {
$dom.addClass('border-color').css({
'outline':'none',
'border':'2px solid'
});
}
});
dropdown.suite("#"+servicer_id, {
template: "selectServicer",
maxWidth:'660',
success: function ($dom) {
$dom.addClass('border-color').css({
'outline':'none',
'border':'2px solid'
});
}
});
});
// 选择项目
$('body').off('click', '.service-wrap .item').on('click', '.service-wrap .item', function () {
var id = $(this).parents('.layu-dropdown-root').prev().attr('id');
dropdown.hide('#'+id);
var target = $('#'+id).find('.info');
if ($(this).find('[name="sku"]').val() != $(target).find('[name="sku"]').val()) {
$(target).html($(this).html());
$(target).parents('tr').find('.servicer-item .info').html('请选择员工');
}
});
// 选择员工
$('body').off('click', '.select-servicer .select-item').on('click', '.select-servicer .select-item', function () {
var id = $(this).parents('.layu-dropdown-root').prev().attr('id');
dropdown.hide('#'+id);
var target = $('#'+id).find('.info');
$(target).html($(this).html());
});
$('body').off('click', '.service-table .delete').on('click', '.service-table .delete', function () {
if ($('.service-table tbody tr').length == 1) {
layer.msg('至少需要有一项项目');
return;
}
$(this).parents('tr').remove();
});
form.verify({
member: function () {
if (!$('[name="member_id"]').val()) {
return '请选择客户';
}
},
service: function () {
if (!$('[name="sku"]').val()) {
return '请选择项目';
}
}
});
form.on('submit(save)', function (data) {
if (repeat) return;
repeat = false;
data.field.goods = [];
$('.service-table tbody tr').each(function () {
data.field.goods.push({
sku_id: $(this).find('[name="sku"]').val(),
uid: $(this).find('[name="servicer"]').val() ? $(this).find('[name="servicer"]').val() : 0
})
});
data.field.goods = JSON.stringify(data.field.goods);
$.ajax({
url: data.field.reserve_id ? ns.url("cardservice://shop/reserve/updatereserve") : ns.url("cardservice://shop/reserve/addreserve"),
data: data.field,
dataType: 'JSON',
type: 'POST',
success: function (res) {
if (res.code == 0) {
layer.msg("保存成功");
setTimeout(function(){
parent.listenerHash(); // 刷新页面
parent.layer.closeAll();
},500)
} else {
layer.msg(res.message);
repeat = false;
}
}
})
})
});
function initDropdown(){
$('.service-item-btn').each(function (i, e) {
var id = ns.gen_non_duplicate(5);
if($(e).attr('id') == '' || $(e).attr('id') == undefined) $(e).attr('id', id);
id = $(e).attr('id');
dropdown.suite("#"+id, {
template: "selectService",
maxWidth:'660',
success: function ($dom) {
$dom.addClass('border-color').css({
'outline':'none',
'border':'2px solid'
});
}
});
})
}
function initTime(config){
// 选择预约时间
dropdown.suite("#reserveTime", {
template: "selectTime",
maxWidth:'660',
success: function ($dom) {
var date = $('[name="date"]').val();
$('.time-wrap').css('display', 'none');
if (date == "{:date('Y-m-d')}") {
$('.today').css('display', 'flex')
} else {
$('.no-today').css('display', 'flex')
}
var dateArr = date.split('-'),
dateEl = new Date(dateArr[0], parseInt(dateArr[1] - 1), dateArr[2]);
if (config.indexOf(dateEl.getDay()) == -1) {
$('.time-wrap .time-item').addClass('no-select');
}
var time = $('[name="time"]').val();
$('.time-wrap .time-item[data-value="'+ time +'"]').addClass('active');
}
});
}
function getServicer(){
let store_id = $('[name="store_id"]').val();
$.ajax({
url: ns.url("cardservice://shop/reserve/servicerlist"),
data: {'store_id':store_id},
dataType: 'JSON',
type: 'POST',
success: function (res) {
if (res.code == 0) {
let html = '';
let store_html = '';
for(let i in res.data){
let item = res.data[i];
store_html += `
<div class="select-item">
<div class="title">${item.username}</div>
<input type="hidden" name="servicer" value="${item.uid}">
</div>
`;
}
html += `
<div class="select-servicer">
<div class="select-item">
<div class="title">不选择员工</div>
<input type="hidden" name="servicer" value="0">
</div>
${store_html}
</div>
`;
$('#selectServicer').html(html);
$('.servicer-item-btn').each(function (i, e) {
var id = ns.gen_non_duplicate(5);
if($(e).attr('id') == '' || $(e).attr('id') == undefined) $(e).attr('id', id);
id = $(e).attr('id');
dropdown.suite("#"+id, {
template: "selectServicer",
maxWidth:'660',
success: function ($dom) {
$dom.addClass('border-color').css({
'outline':'none',
'border':'2px solid'
});
}
});
})
}
}
})
}
</script>

View File

@@ -0,0 +1,108 @@
<style>
.layui-input {
display: inline-block;
}
</style>
<div class="layui-form main-wrap form-wrap" lay-filter="form">
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>预约时间:</label>
<div class="layui-input-block">
<input type="checkbox" title="周一" lay-skin="primary" name="week[]" value="1" {if in_array(1, $config.week)}checked{/if}>
<input type="checkbox" title="周二" lay-skin="primary" name="week[]" value="2" {if in_array(2, $config.week)}checked{/if}>
<input type="checkbox" title="周三" lay-skin="primary" name="week[]" value="3" {if in_array(3, $config.week)}checked{/if}>
<input type="checkbox" title="周四" lay-skin="primary" name="week[]" value="4" {if in_array(4, $config.week)}checked{/if}>
<input type="checkbox" title="周五" lay-skin="primary" name="week[]" value="5" {if in_array(5, $config.week)}checked{/if}>
<input type="checkbox" title="周六" lay-skin="primary" name="week[]" value="6" {if in_array(6, $config.week)}checked{/if}>
<input type="checkbox" title="周日" lay-skin="primary" name="week[]" value="0" {if in_array(0, $config.week)}checked{/if}>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"></label>
<div class="layui-input-inline len-short">
{php}$today = strtotime(date('Y-m-d')) {/php}
<select name="start">
{for start="0" end="48" name="i"}
<option value="{$i * 1800}" {if $config.start == ($i * 1800)}selected{/if}>{:date('H:i', $today + ($i * 1800))}</option>
{/for}
</select>
</div>
<div class="layui-form-mid layui-word-aux">-</div>
<div class="layui-input-inline len-short">
<select name="end" id="">
{for start="0" end="48" name="i"}
<option value="{$i * 1800}" {if $config.end == ($i * 1800)}selected{/if}>{:date('H:i', $today + ($i * 1800))}</option>
{/for}
</select>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>预约时间间隔:</label>
<div class="layui-input-block">
<input type="radio" title="30分钟" lay-skin="primary" name="interval" value="30" {if empty($config) || $config.interval == 30}checked{/if}>
<input type="radio" title="1小时" lay-skin="primary" name="interval" value="60" {if !empty($config) && $config.interval == 60}checked{/if}>
<input type="radio" title="90分钟" lay-skin="primary" name="interval" value="90" {if !empty($config) && $config.interval == 90}checked{/if}>
<input type="radio" title="2小时" lay-skin="primary" name="interval" value="120" {if !empty($config) && $config.interval == 120}checked{/if}>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>预约提前:</label>
<div class="layui-input-block">
<input type="number" name="advance" value="{$config.advance ?? 1}" class="layui-input len-short" lay-verify="advance">
<div class="layui-word-aux">小时</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>每时段可预约:</label>
<div class="layui-input-block">
<input type="number" name="max" value="{$config.max ?? 1}" class="layui-input len-short" lay-verify="max">
<div class="layui-word-aux"></div>
</div>
</div>
<div class="form-row">
<button class="layui-btn bg-color " lay-submit="" lay-filter="save">保存</button>
</div>
</div>
<script>
var repeat_flag = false, form;
layui.use(['form'], function () {
form = layui.form;
form.verify({
advance(value) {
if (isNaN(value) || !/(^[1-9]\d*$)/.test(value)) {
return "预约提前时间格式输入错误";
}
if (value < 0) {
return "预约提前时间不能小于0";
}
},
max(value) {
if (isNaN(value) || !/(^[1-9]\d*$)/.test(value)) {
return "每时段可预约人数格式输入错误";
}
if (value < 0) {
return "每时段可预约人数不能小于0";
}
}
})
form.on('submit(save)', function (data) {
if (repeat_flag) return false;
repeat_flag = true;
$.ajax({
url: ns.url("cardservice://shop/reserve/config"),
data: data.field,
dataType: 'JSON',
type: 'POST',
success: function (res) {
layer.msg(res.message, { time: 1000 }, function () {});
repeat_flag = false;
}
});
})
})
</script>

View File

@@ -0,0 +1,75 @@
<style>
.align-right {text-align: right!important;}
.service-table {width: 600px!important;}
</style>
<div class="main-wrap">
<div class="layui-form-item">
<label class="layui-form-label">预约客户:</label>
<div class="layui-input-inline">
<a href="{:href_url('shop/member/editmember?member_id='.$info.member_id)}" target="_blank">{$info.nickname} {$info.mobile}</a>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">预约门店:</label>
<div class="layui-input-inline">{$info.store_name ? $info.store_name : ''}</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">预约状态:</label>
<div class="layui-input-inline">{$info.reserve_state_name}</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">预约到店时间:</label>
<div class="layui-input-inline">{:date('Y-m-d H:i', $info.reserve_time)}</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">创建时间:</label>
<div class="layui-input-inline">{:date('Y-m-d H:i', $info.create_time)}</div>
</div>
{if $info.to_store_time}
<div class="layui-form-item">
<label class="layui-form-label">到店时间:</label>
<div class="layui-input-inline">{:date('Y-m-d H:i', $info.to_store_time)}</div>
</div>
{/if}
{if $info.cancel_time}
<div class="layui-form-item">
<label class="layui-form-label">取消时间:</label>
<div class="layui-input-inline">{:date('Y-m-d H:i', $info.cancel_time)}</div>
</div>
{/if}
<div class="layui-form-item">
<label class="layui-form-label">预约项目:</label>
<div class="layui-input-inline service-table">
<table class="layui-table" lay-skin="line">
<colgroup>
<col width="62%">
<col width="18%">
<col>
</colgroup>
<thead>
<tr>
<th>项目</th>
<th>技师</th>
<th class="align-right">项目时长</th>
</tr>
</thead>
<tbody>
{foreach name="info.item" item="item"}
<tr>
<td>{$item.goods_name}</td>
<td>{if $item.reserve_user_id}{$item.username}{else/}未选择员工{/if}</td>
<td class="align-right">{$item.service_length}分钟</td>
</tr>
{/foreach}
</tbody>
</table>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">备注:</label>
<div class="layui-input-inline">{$info.remark ? $info.remark : '-'}</div>
</div>
<div class="form-row">
<button class="layui-btn layui-btn-primary" onclick="layer.closeAll();">返回</button>
</div>
</div>

View File

@@ -0,0 +1,461 @@
<link rel="stylesheet" href="ADDON_CARDSERVICE_CSS/reserve_index.css">
<style>
.layui-layer-loading {
box-shadow: unset!important;
}
.screen.reserve {
padding: 0;
margin-top: 20px;
}
{foreach name="reserve_state" item="vo"}
.{$vo.state} {
background-color: {$vo.color};
border-color: {$vo.color};
}
.{$vo.state}-color {
color: {$vo.color};
}
{/foreach}
</style>
<div class="layui-card layui-form reserve-data">
<div class="uni-flex panel-head">
<button class="layui-btn" onclick="addReserve()">添加预约</button>
<div class="status uni-flex">
{foreach name="reserve_state" item="vo"}
<div class="color {$vo.state}"></div>
<div>{$vo.name}</div>
{/foreach}
</div>
</div>
<div class="screen reserve">
<div class="layui-colla-item">
<div class="layui-colla-content layui-form layui-show">
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label">客户:</label>
<div class="layui-input-inline">
<input type="text" name="search_text" placeholder="请输入客户名称/客户手机号" autocomplete="off" class="layui-input ">
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">预约门店:</label>
<div class="layui-input-inline">
<select name="store_id">
<option value="">全部</option>
{foreach $store_list as $k=> $v}
<option value="{$v.store_id}">{$v.store_name}</option>
{/foreach}
</select>
</div>
</div>
</div>
<div class="form-row">
<button class="layui-btn bg-color" lay-submit lay-filter="search">筛选</button>
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
</div>
</div>
</div>
</div>
<div class="panel-body">
<!-- 看板类型 -->
<!-- <div class="time-type">-->
<!-- <span class="on" data-type="week">周</span>-->
<!-- <span data-type="month">月</span>-->
<!-- </div>-->
<!-- 看板数据 -->
<div class="time-data" id="time-data">
<div class="uni-flex time-wrap">
<span class="iconfont iconback_light" onclick="prevWeek()"></span>
<div class="date">{$data[0]['date']} - {$data[6]['date']}</div>
<span class="iconfont iconyoujiantou" onclick="nextWeek()"></span>
</div>
<div class="head uni-flex">
{foreach name="$data" item="item"}
<div>
<button class="layui-btn {if $item.currday eq 0}layui-btn-primary{/if}">{$item.week}<span>{$item.date}</span></button>
</div>
{/foreach}
</div>
<div class="body uni-flex">
{foreach name="$data" item="item"}
<div class="common-scrollbar" data-page="1" data-total="{$item.data.page_count}" data-start="{$item.start}" data-end="{$item.end}">
<div class="box">
{notempty name="item.data.list"}
{foreach name="item.data.list" item="vo"}
<div class="panel-item {$vo.reserve_state}">
<div class="username">{$vo.nickname}</div>
<div class="time {$vo.reserve_state}">{:date('H:i', $vo.reserve_time)}</div>
{php}
$vo['reserve_item'] = explode(',', $vo['reserve_item']);
{/php}
{foreach name="$vo.reserve_item" item="goods_name"}
<div class="service">{$goods_name}</div>
{/foreach}
<div class="action" data-state="{$vo.reserve_state}" data-id="{$vo.reserve_id}">
<span class="iconfont iconyuandian"></span>
</div>
</div>
{/foreach}
{/notempty}
</div>
</div>
{/foreach}
</div>
</div>
</div>
</div>
<!-- 周看板数据 -->
<script type="text/html" id="dataTpl">
<div class="uni-flex time-wrap">
<span class="iconfont iconback_light" onclick="prevWeek()"></span>
<div class="date">{{ d[0].date }} - {{ d[6].date }}</div>
<span class="iconfont iconyoujiantou" onclick="nextWeek()"></span>
</div>
<div class="head uni-flex">
{{# layui.each(d, function(index, item){ }}
<div>
<button class="layui-btn {{# if(item.currday == 0){ }}layui-btn-primary{{# } }}">{{ item.week }}<span>{{ item.date }}</span></button>
</div>
{{# }); }}
</div>
<div class="body uni-flex">
{{# layui.each(d, function(index, item){ }}
<div class="common-scrollbar" data-page="0" data-total="1" data-start="{{item.start}}" data-end="{{item.end}}">
<div class="box"></div>
</div>
{{# }); }}
</div>
</script>
<script type="text/html" id="reserveTpl">
{{# layui.each(d, function(vindex, vo){ }}
<div class="panel-item {{ vo.reserve_state }}">
<div class="username">{{ vo.nickname }}</div>
<div class="time {{ vo.reserve_state }}">{{ ns.time_to_date(vo.reserve_time, 'H:i') }}</div>
{{# vo.reserve_item.split(',').forEach(function(goods_name){ }}
<div class="service">{{ goods_name }}</div>
{{# }); }}
<div class="action" data-state="{{ vo.reserve_state }}" data-id="{{ vo.reserve_id }}">
<span class="iconfont iconyuandian"></span>
</div>
</div>
{{# }); }}
</script>
<!-- 月看板日期模板 -->
<script type="text/html" id="month-table-tpl">
<div class="uni-flex time-wrap">
<span class="iconfont iconback_light" onclick="prevMonth()"></span>
<div class="date">{{ data_year }}/{{ data_month < 10 ? '0' + data_month : data_month }}</div>
<span class="iconfont iconyoujiantou" onclick="nextMonth()"></span>
</div>
<div class="month-table">
<div class="table-head">
<div class="table-tr">
<div class="table-td">周一</div>
<div class="table-td">周二</div>
<div class="table-td">周三</div>
<div class="table-td">周四</div>
<div class="table-td">周五</div>
<div class="table-td">周六</div>
<div class="table-td">周日</div>
</div>
</div>
<div class="table-body">
{{# d.forEach(function(week_days, week_index){ }}
<div class="table-tr">
{{# week_days.forEach(function(item, index){ }}
<div class="table-td {{ item.is_curr_month ? '' : 'not-curr-month' }}">
<div class="top">{{ item.day }}</div>
<div class="bottom" id="{{item.month}}_month_{{item.day}}_day">
<!-- 每日数据 -->
</div>
</div>
{{# }) }}
</div>
{{# }) }}
</div>
</div>
</script>
<!-- 月看板每日数据模板 -->
<script type="text/html" id="month-table-td-tpl">
{{# d.list.forEach(function(item, index){ }}
<div class="item-box">
<div class="item" data-reserve_id="{{ item.reserve_id }}">
<span class="{{ item.reserve_state }}"></span>
<span>{{ item.reserve_item }}</span>
</div>
<div class="detail-card">
<div class="username">{{ item.nickname }}</div>
<div class="time {{ item.reserve_state }}">{{ ns.time_to_date(item.reserve_time, 'H:i') }}</div>
{{# item.reserve_item.split(',').forEach(function(goods_name){ }}
<div class="service">{{ goods_name }}</div>
{{# }); }}
<div class="state {{ item.reserve_state }}-color">{{ item.reserve_state_name }}</div>
</div>
</div>
{{# }) }}
{{# if(d.count > d.list.length){ }}
{{# let more_url = ns.href('cardservice://shop/reserve/lists', {start_time:d.start_time, end_time:d.end_time}); }}
<div class="more"><a href="{{ more_url }}" target="_blank">查看全部{{ d.count }}条预约 ></a></div>
{{# } }}
</script>
{include file="reserve/reserve_action"}
<script>
var dropdown, laytpl, form, _dropdown = {};
var data_year = (new Date()).getFullYear();
var data_month = (new Date()).getMonth() + 1;
layui.use(['form', 'laytpl', 'dropdown'], function(){
dropdown = layui.dropdown;
laytpl = layui.laytpl;
form = layui.form;
init();
/**
* 搜索功能
*/
form.on('submit(search)', function(data) {
curr = 0;
getWeekData();
return false;
});
});
// 触底加载
$('.panel-body .common-scrollbar').scroll(function () {
var top = $(this).scrollTop();
var windowHeight = $(this).height();
var documentHeight = $(this).find('.box').height();
if (documentHeight - top - windowHeight < 20) {
loadinfo($(this))
}
});
function addReserve() {
layer.open({
title: '添加预约',
type: 2,
content: ns.url('cardservice://shop/reserve/addreserve?request_mode=iframe'),
area: ['800px', '690px'],
success: function (layero, index) {
}
})
}
var curr = 0, repeat = false;
function prevWeek() { curr -= 1; getWeekData(); }
function nextWeek() { curr += 1; getWeekData(); }
function getWeekData() {
if (repeat) return;
repeat = true;
layer.load(3,{shade: [0.8, '#fff']});
$.ajax({
url: ns.url("cardservice://shop/reserve/getweekday"),
data: {
length: curr
},
dataType: 'JSON',
type: 'POST',
success: function (res) {
repeat = false;
if (res.code == 0) {
laytpl($('#dataTpl').html()).render(res.data, function(string){
$('#time-data').html(string);
layer.closeAll();
$('.panel-body .common-scrollbar').scroll(function () {
var top = $(this).scrollTop();
var windowHeight = $(this).height();
var documentHeight = $(this).find('.box').height();
if (documentHeight - top - windowHeight < 20) {
loadinfo($(this))
}
});
$('.panel-body .common-scrollbar').each(function (index, item) {
loadinfo($(item))
})
});
} else {
layer.msg('请求错误');
}
}
});
}
function loadinfo(elem) {
var page = parseInt(elem.attr('data-page')),
total = elem.attr('data-total');
if (page >= total) return;
page += 1;
$.ajax({
url: ns.url("cardservice://shop/reserve/lists"),
data: {
page: page,
start_time: elem.attr('data-start'),
end_time: elem.attr('data-end'),
store_id: $('[name="store_id"]').val(),
search_text: $('[name="search_text"]').val(),
},
dataType: 'JSON',
type: 'POST',
success: function (res) {
if (res.code == 0 && res.data.list.length) {
elem.attr('data-page', page);
laytpl($('#reserveTpl').html()).render(res.data.list, function(string) {
elem.find('.box').append(string);
init();
})
}
}
});
}
function getMonthDays() {
layer.load(3,{shade: [0.8, '#fff']});
$.ajax({
url: ns.url("cardservice://shop/reserve/getMonthDays"),
data: {
year : data_year,
month : data_month,
},
dataType: 'JSON',
type: 'POST',
success: function (res) {
if (res.code == 0) {
var month_data = [];
var week_data = [];
var month_day_num = res.data.length;
res.data.forEach(function(item, index){
week_data.push(item);
if(week_data.length === 7 || index === month_day_num - 1){
month_data.push(week_data);
week_data = [];
}
});
laytpl($('#month-table-tpl').html()).render(month_data, function(string){
$("#time-data").html(string);
layer.closeAll();
res.data.forEach(function(item, index){
getDayData(item);
})
});
}
}
});
}
function getDayData(item) {
$.ajax({
url: ns.url("cardservice://shop/reserve/lists"),
data: {
page: 1,
page_size:3,
start_time: ns.date_to_time(item.start_time),
end_time: ns.date_to_time(item.end_time),
store_id: $('[name="store_id"]').val(),
search_text: $('[name="search_text"]').val(),
},
dataType: 'JSON',
type: 'POST',
success: function (res) {
if (res.code == 0 && res.data.list.length) {
res.data.start_time = item.start_time;
res.data.end_time = item.end_time;
laytpl($('#month-table-td-tpl').html()).render(res.data, function(string) {
$(`#${item.month}_month_${item.day}_day`).html(string);
init();
})
}
}
});
}
$("#time-data").on('click', '.table-td .bottom .item', function(){
let reserve_id = $(this).attr('data-reserve_id');
reserveEvent('detail', {reserve_id: reserve_id});
});
function prevMonth(){
if(data_month > 1){
data_month --;
}else{
data_month = 12;
data_year --;
}
getMonthDays();
}
function nextMonth(){
if(data_month < 12){
data_month ++;
}else{
data_month = 1;
data_year ++;
}
getMonthDays();
}
$(".time-type span").on('click', function(){
$(this).addClass('on').siblings().removeClass('on');
var type = $(this).attr('data-type');
if(type === 'week'){
curr = 0;
getWeekData();
}else{
data_year = (new Date()).getFullYear();
data_month = (new Date()).getMonth() + 1;
getMonthDays();
}
});
function init(){
$('body .panel-item .action').each(function () {
var state = $(this).attr('data-state');
var reserveId = $(this).attr('data-id');
var menuData = getMemuData(state);
var elem = $(this);
let id = $(elem).attr('id');
if(id == '' || id == undefined){
id = ns.gen_non_duplicate(5);
$(elem).attr('id', id)
}
if (!_dropdown['reserve_id' + reserveId]) {
dropdown.suite("#"+id, {
menus: menuData,
success: function ($dom) {
$dom.addClass('border-color').css({
'outline':'none',
'border':'2px solid'
});
},
onItemClick: function (event, menu) {
let data_id = $('#'+id).attr('data-id');
reserveEvent(event, {reserve_id: data_id}, function (res) {
getWeekData()
});
},
});
}
})
}
</script>

View File

@@ -0,0 +1,373 @@
<style>
.layui-layout-admin .layui-form-item .layui-input-inline {
background-color: #fff;
}
.table-btn .more-operation {
display: none;
font-size: 14px;
line-height: 20px;
background-color: #fff;
box-shadow: 0 2px 8px 0 rgba(200, 201, 204, .5);
position: absolute;
z-index: 2000;
border-radius: 2px;
padding: 13px 12px;
top: 40px;
right: 5px;
transform: translateX(10px);
}
.main-wrap{
padding-bottom: 20px;
}
.body-content {
padding-top: 0!important;
}
.table-btn .more-operation:before {
right: 7px;
top: -14px;
border: solid transparent;
content: "";
height: 0;
width: 0;
position: absolute;
pointer-events: none;
border-bottom-color: #fff;
border-width: 8px;
}
.table-btn .more-operation .operation {
display: block;
text-align: right;
margin-bottom: 12px;
cursor: pointer;
}
.table-btn .more-operation .operation:last-child {
margin-bottom: 0
}
.layui-table-view td:last-child>div {
overflow: inherit;
}
.operation-wrap {
position: relative;
}
</style>
<div class="main-wrap">
<div class="single-filter-box single-filter-box">
<button class="layui-btn" onclick="addReserve()">添加预约</button>
</div>
<div class="screen layui-collapse" lay-filter="selection_panel">
<div class="layui-colla-item">
<div class="layui-form layui-colla-content layui-form layui-show" >
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label">客户</label>
<div class="layui-input-inline">
<input type="text" name="search_text" placeholder="请输入客户名称/客户手机号" autocomplete="off" class="layui-input ">
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">预约门店</label>
<div class="layui-input-inline">
<select name="store_id">
<option value="">全部</option>
{foreach $store_list as $k=> $v}
<option value="{$v.store_id}">{$v.store_name}</option>
{/foreach}
</select>
</div>
</div>
</div>
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label">预约时间</label>
<div class="layui-input-inline">
<input type="text" class="layui-input" name="start_time" placeholder="开始时间" id="start_time" readonly>
<i class=" iconrili iconfont calendar"></i>
</div>
<div class="layui-form-mid">-</div>
<div class="layui-input-inline">
<input type="text" class="layui-input" name="end_time" placeholder="结束时间" id="end_time" readonly>
<i class=" iconrili iconfont calendar"></i>
</div>
<button class="layui-btn layui-btn-primary date-picker-btn" onclick="datePick(7, this);return false;">近7天</button>
<button class="layui-btn layui-btn-primary date-picker-btn" onclick="datePick(30, this);return false;">近30天</button>
</div>
</div>
<div class="form-row">
<button class="layui-btn bg-color" lay-submit lay-filter="search">筛选</button>
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
</div>
</div>
</div>
</div>
<!-- 列表 -->
<div class="table-tab layui-tab" lay-filter="list_tab">
<div class="table-tab-list">
<ul class="layui-tab-title">
<li class="layui-this" lay-id="all">全部</li>
{foreach name="$reserve_state" item="vo"}
<li lay-id="{$vo.state}" data-type="reserve_state">{$vo.name}</li>
{/foreach}
</ul>
</div>
<div class="layui-tab-content">
<table id="reserve_list" lay-filter="reserve_list"></table>
</div>
</div>
</div>
<!-- 用户信息 -->
<script type="text/html" id="detail">
<div class='table-title'>
<div class='title-pic'>
<img layer-src src="{{ns.img(d.headimg)}}" onerror="this.src = 'STATIC_IMG/default_img/head.png' ">
</div>
<div class='title-content'>
<p class="layui-elip" title="{{d.nickname}}">{{d.nickname}}</p>
{{# if(d.member_id != 0 && d.mobile){ }}
<p title="{{d.mobile}}">{{d.mobile}}</p>
{{# } }}
</div>
</div>
</script>
<!-- 工具栏操作 -->
<script type="text/html" id="operation">
<div class="operation-wrap">
<div class="table-btn">
<a class="layui-btn" lay-event="detail">详情</a>
{{# if(d.reserve_state == 'cancelled'){ }} <a class="layui-btn" lay-event="delete">删除预约</a> {{# } }}
{{# if(d.reserve_state != 'completed' && d.reserve_state != 'cancelled'){ }} <a class="layui-btn" lay-event="more">更多</a>{{# } }}
<div class="more-operation">
{{# if(d.reserve_state == 'wait_confirm'){ }}
<a class="operation" lay-event="confirm">确认预约</a>
<a class="operation" lay-event="update">更改预约</a>
{{# } }}
{{# if(d.reserve_state == 'wait_to_store'){ }}
<a class="operation" lay-event="tostore">确认到店</a>
<a class="operation" lay-event="update">更改预约</a>
{{# } }}
{{# if(d.reserve_state == 'arrived_store'){ }} <a class="operation" lay-event="complet">确认完成</a> {{# } }}
{{# if(d.reserve_state == 'wait_confirm' || d.reserve_state == 'wait_to_store' || d.reserve_state == 'arrived_store'){ }} <a class="operation" lay-event="cancel">取消预约</a> {{# } }}
</div>
</div>
</div>
</script>
{include file="reserve/reserve_action"}
<script type="text/javascript">
var table, form, laytpl, element, currentDate = new Date(), minDate = "",laydate;
layui.use(['form', 'element', 'laydate'], function() {
form = layui.form;
laydate = layui.laydate;
element = layui.element;
currentDate.setDate(currentDate.getDate() - 7);
form.render();
laydate.render({
elem: '#start_time'
,type: 'datetime'
,change: function(value, date, endDate){
$(".date-picker-btn").removeClass("selected");
}
});
laydate.render({
elem: '#end_time'
,type: 'datetime'
,change: function(value, date, endDate){
$(".date-picker-btn").removeClass("selected");
}
});
element.on('tab(list_tab)', function (data) {
var state = $(data.elem).find('li:eq('+ data.index + ')').attr('lay-id');
$('[name="reserve_state"]').val(state);
table.reload({
where: {
reserve_state: state,
search_text: $('input[name="search_text"]').val(),
store_id: $('select[name="store_id"]').val(),
start: $('input[name="start"]').val() ? new Date($('input[name="start"]').val()).valueOf / 100 : '',
end: $('input[name="end"]').val() ? new Date($('input[name="end"]').val()).valueOf / 100 : ''
},
page: {
curr: 1
}
});
});
var cols = [
[
{
title: '客户信息',
width: '15%',
templet: '#detail'
},
{
field: 'service',
title: '预约项目',
width: '15%',
templet: function (data) {
var text = '';
data.reserve_item.split(',').forEach(function (goods_name) {
text += '<div class="goods-name">'+ goods_name +'</div>';
});
return text;
}
},
{
field: 'service',
title: '预约门店',
width: '15%',
templet: function (data) {
return data.store_name ? data.store_name : '';
}
},
{
title: '预约到店时间',
width: '10%',
templet: function (data) {
if (data.reserve_time) {
let time = ns.time_to_date(data.reserve_time).split(' ');
let text = '<div class="time-line-height"><p>'+ time[0] +'</p><p>'+ time[1] +'</p></div>';
if ((data.reserve_time == 'wait_confirm' || data.reserve_time == 'wait_to_store') && data.reserve_time < {:time()}) text += '<div class="error">已超时</div>';
return text;
} else {
return '';
}
}
},
{
title: '下单时间',
width: '10%',
templet: function (data) {
let time = ns.time_to_date(data.create_time).split(' ');
return '<div class="time-line-height"><p>'+ time[0] +'</p><p>'+ time[1] +'</p></div>';
}
},
{
field: 'reserve_state_name',
title: '预约状态',
width: '10%',
align: 'center',
},
{
title: '来源',
width: '10%',
align: 'center',
templet: function (data) {
return data.source == 'store' ? '门店添加' : '客户预约';
}
},
{
title: '操作',
width: '15%',
align: 'right',
toolbar: '#operation'
}
]
];
/**
* 加载表格
*/
table = new Table({
elem: '#reserve_list',
url: ns.url("cardservice://shop/reserve/lists"),
where:{
start_time : '{$start_time}',
end_time : '{$end_time}',
},
cols: cols
});
/**
* 监听工具栏操作
*/
table.tool(function(obj) {
var data = obj.data;
switch (obj.event) {
case 'more': //更多
$('.more-operation').css('display', 'none');
$(obj.tr).find('.more-operation').css('display', 'block');
break;
default:
reserveEvent(obj.event, data, function () {
table.reload();
});
break;
}
});
$(document).click(function(event) {
if ($(event.target).attr('lay-event') != 'more' && $('.more-operation').not(':hidden').length) {
$('.more-operation').css('display', 'none');
}
});
/**
* 搜索功能
*/
form.on('submit(search)', function(data) {
if (data.field.start_time && data.field.start_time != '') data.field.start_time = new Date(data.field.start_time).valueOf() / 1000;
if (data.field.end_time && data.field.end_time != '') data.field.end_time = new Date(data.field.end_time).valueOf() / 1000;
table.reload({
page: {
curr: 1
},
where: data.field
});
return false;
});
});
function addReserve() {
layer.open({
title: '添加预约',
type: 2,
content: ns.url('cardservice://shop/reserve/addreserve', {request_mode: 'iframe'}),
area: ['800px', '690px']
})
}
/**
* 七天时间
*/
function datePick(date_num,event_obj){
$(".date-picker-btn").removeClass("selected");
$(event_obj).addClass('selected');
var now_date = new Date();
Date.prototype.Format = function (fmt,date_num) { //author: meizz
this.setDate(this.getDate()-date_num);
var o = {
"M+": this.getMonth() + 1, //月份
"d+": this.getDate(), //日
"H+": this.getHours(), //小时
"m+": this.getMinutes(), //分
"s+": this.getSeconds(), //秒
"q+": Math.floor((this.getMonth() + 3) / 3), //季度
"S": this.getMilliseconds() //毫秒
};
if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
for (var k in o)
if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
return fmt;
};
// var now_time = new Date().Format("yyyy-MM-dd HH:mm:ss",0);//当前日期
var now_time = new Date().Format("yyyy-MM-dd 23:59:59",0);//当前日期
var before_time = new Date().Format("yyyy-MM-dd 00:00:00",date_num-1);//前几天日期
$("input[name=start_time]").val(before_time,0);
$("input[name=end_time]").val(now_time,date_num-1);
}
</script>

View File

@@ -0,0 +1,253 @@
<script>
var show_link_box_flag = true;
function reserveEvent(event, data, callback) {
switch (event) {
case 'detail':
var url = ns.url("cardservice://shop/reserve/detail");
if (show_link_box_flag) {
show_link_box_flag = false;
$.post(url, {
id: data.reserve_id
}, function (str) {
window.linkIndex = layer.open({
type: 1,
title: "预约详情",
content: str,
btn: [],
area: ['850px'], //宽高
maxWidth: 1920,
cancel: function (index, layero) {
show_link_box_flag = true;
},
end: function () {
show_link_box_flag = true;
}
});
});
}
break;
case 'confirm':
confirmReserve(data, callback);
break;
case 'update':
updateReserve(data);
break;
case 'tostore':
confirmToStore(data, callback);
break;
case 'complet':
confirmComplete(data, callback);
break;
case 'cancel':
cancelReserve(data, callback);
break;
case 'delete':
deleteReserve(data, callback);
break;
}
}
function getMemuData(state) {
var menuData = [{txt: '预约详情', event: 'detail'}];
switch (state) {
case 'wait_confirm':
menuData.push({txt: '确认预约', event: 'confirm'});
menuData.push({txt: '更改预约', event: 'update'});
menuData.push({txt: '取消预约', event: 'cancel'});
break;
case 'wait_to_store':
menuData.push({txt: '确认到店', event: 'tostore'});
menuData.push({txt: '更改预约', event: 'update'});
menuData.push({txt: '取消预约', event: 'cancel'});
break;
case 'arrived_store':
menuData.push({txt: '确认完成', event: 'complet'});
break;
case 'cancelled':
menuData.push({txt: '删除预约', event: 'delete'});
break;
}
return menuData;
}
var repeat = false;
function confirmReserve(data, callback) {
layer.confirm('是否要确认该预约?', function(index){
if (repeat) return;
repeat = true;
layer.close(index);
$.ajax({
url: ns.url("cardservice://shop/reserve/confirm"),
data: {
reserve_id: data.reserve_id
},
dataType: 'JSON',
type: 'POST',
success: function (res) {
repeat = false;
if (res.code == 0) {
try {
data.elem.attr('data-state', 'wait_to_store');
data.elem.parents('.panel-item').attr('class', 'panel-item wait_to_store');
data.elem.parents('.panel-item').find('.time').attr('class', 'time wait_to_store');
var menuData = getMemuData('wait_to_store');
_dropdown['reserve_id' + data.reserve_id].reload({
data: menuData,
show: false
})
} catch (e) {
}
typeof callback == 'function' && callback(data);
} else {
layer.msg(res.message)
}
}
})
})
}
function confirmToStore(data, callback) {
layer.confirm('是否确认客户已经到店?', function(index){
if (repeat) return;
repeat = true;
layer.close(index);
$.ajax({
url: ns.url("cardservice://shop/reserve/confirmtostore"),
data: {
reserve_id: data.reserve_id
},
dataType: 'JSON',
type: 'POST',
success: function (res) {
repeat = false;
if (res.code == 0) {
try {
data.elem.attr('data-state', 'arrived_store');
data.elem.parents('.panel-item').attr('class', 'panel-item arrived_store');
data.elem.parents('.panel-item').find('.time').attr('class', 'time arrived_store');
var menuData = getMemuData('arrived_store');
_dropdown['reserve_id' + data.reserve_id].reload({
data: menuData,
show: false
})
} catch (e) {
}
typeof callback == 'function' && callback(data);
} else {
layer.msg(res.message)
}
}
})
})
}
function confirmComplete(data, callback) {
layer.confirm('确认已完成预约?', function(index){
if (repeat) return;
repeat = true;
layer.close(index);
$.ajax({
url: ns.url("cardservice://shop/reserve/complete"),
data: {
reserve_id: data.reserve_id
},
dataType: 'JSON',
type: 'POST',
success: function (res) {
repeat = false;
if (res.code == 0) {
try {
data.elem.attr('data-state', 'completed');
data.elem.parents('.panel-item').attr('class', 'panel-item completed');
data.elem.parents('.panel-item').find('.time').attr('class', 'time completed');
var menuData = getMemuData('completed');
_dropdown['reserve_id' + data.reserve_id].reload({
data: menuData,
show: false
})
} catch (e) {
}
typeof callback == 'function' && callback(data);
} else {
layer.msg(res.message)
}
}
})
})
}
function cancelReserve(data, callback) {
layer.confirm('确认要取消该预约?', function(index){
if (repeat) return;
repeat = true;
layer.close(index);
$.ajax({
url: ns.url("cardservice://shop/reserve/cancel"),
data: {
reserve_id: data.reserve_id
},
dataType: 'JSON',
type: 'POST',
success: function (res) {
repeat = false;
if (res.code == 0) {
try {
data.elem.attr('data-state', 'cancelled');
data.elem.parents('.panel-item').attr('class', 'panel-item cancelled');
data.elem.parents('.panel-item').find('.time').attr('class', 'time cancelled');
var menuData = getMemuData('cancelled');
_dropdown['reserve_id' + data.reserve_id].reload({
data: menuData,
show: false
})
} catch (e) {
}
typeof callback == 'function' && callback(data);
} else {
layer.msg(res.message)
}
}
})
});
}
function deleteReserve(data, callback) {
layer.confirm('确认要删除该预约?', function(index){
if (repeat) return;
repeat = true;
layer.close(index);
$.ajax({
url: ns.url("cardservice://shop/reserve/deletereserve"),
data: {
reserve_id: data.reserve_id
},
dataType: 'JSON',
type: 'POST',
success: function (res) {
repeat = false;
if (res.code == 0) {
try {
data.elem.parents('.panel-item').remove();
} catch (e) {
}
typeof callback == 'function' && callback(data);
} else {
layer.msg(res.message)
}
}
})
});
}
function updateReserve(data) {
layer.open({
title: '修改预约',
type: 2,
content: ns.url('cardservice://shop/reserve/updatereserve',{
request_mode: 'iframe',
id:data.reserve_id
}),
area: ['800px', '620px'],
})
}
</script>

View File

@@ -0,0 +1,701 @@
<link rel="stylesheet" href="__STATIC__/ext/video/video.css">
<link rel="stylesheet" type="text/css" href="__STATIC__/ext/searchable_select/searchable_select.css" />
<link rel="stylesheet" type="text/css" href="__STATIC__/ext/layui/extend/cascader/cascader.css"/>
<link rel="stylesheet" type="text/css" href="SHOP_CSS/goods_edit.css?time=20250527" />
<div class="layui-form">
<div class="layui-tab layui-tab-brief" lay-filter="goods_tab">
<ul class="layui-tab-title">
<li class="layu1i-this" lay-id="basic">基础设置</li>
<li lay-id="price-stock">价格库存</li>
<li lay-id="detail">项目详情</li>
<li lay-id="senior">高级设置</li>
</ul>
<div class="layui-tab-content">
<!-- 基础设置 -->
<div class="layui-tab-item layui-show">
<!-- 项目类型 -->
<div class="layui-card card-common card-brief head">
<div class="layui-card-header">
<span class="card-title">商品类型</span>
</div>
<div class="layui-card-body commodity-type-box" >
{foreach name="all_goodsclass" item="vo"}
<div class="commodity-type-item {if $vo.goods_class eq $goods_class.id}border-color{/if}" onclick="location.hash = ns.hash('{$vo.add_url}')">
<span>{$vo.goods_class_name}</span>
<span>{$vo.is_virtual ? '(无需物流)' : '(需要物流)'}</span>
</div>
{/foreach}
</div>
</div>
<div class="layui-card card-common card-brief head">
<div class="layui-card-header">
<span class="card-title">基础信息</span>
</div>
<div class="layui-card-body">
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>项目名称:</label>
<div class="layui-input-inline">
<input name="goods_name" type="text" placeholder="请输入项目名称不能超过60个字符" maxlength="60" autocomplete="off" lay-verify="goods_name" class="layui-input len-long">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">促销语:</label>
<div class="layui-input-inline">
<textarea class="layui-textarea len-long" name="introduction" maxlength="100" lay-verify="introduction" placeholder="请输入促销语不能超过100个字符"></textarea>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">关键词:</label>
<div class="layui-input-block">
<input type="text" name="keywords" placeholder="项目关键词用于SEO搜索不能超过100个字符" maxlength="100" autocomplete="off" class="layui-input len-long">
</div>
</div>
<div class="layui-form-item goods-image-wrap">
<label class="layui-form-label"><span class="required">*</span>项目主图:</label>
<div class="layui-input-block">
<!--项目主图项-->
<div class="js-goods-image"></div>
</div>
<div class="word-aux">第一张图片将作为项目主图,支持同时上传多张图片,多张图片之间可随意调整位置;</div>
<div class="word-aux">支持jpg、gif、png格式上传或从图片空间中选择建议使用尺寸800x800像素以上、大小不超过1M的正方形图片</div>
<div class="word-aux">上传后的图片将会自动保存在图片空间的默认分类中最多上传10张至少1张</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">项目视频:</label>
<div class="layui-input-block">
<div class="video-thumb">
<video id="goods_video" class="video-js vjs-big-play-centered" controls="" poster="SHOP_IMG/goods_video_preview.png" preload="auto"></video>
</div>
<div id="videoUpload2" class="up-video " title="项目视频" >
<span class="delete-video hide" onclick="deleteVideo()"><img class="del-img" src="SHOP_IMG/delete.png">删除</span>
<span class=" replace-video hide js-add-goods-video" ><img class="up-img" src="SHOP_IMG/upload.png">上传视频</span>
</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"></label>
<div class="layui-input-block">
<input type="text" name="video_url" placeholder="在此输入外链视频地址" autocomplete="off" class="layui-input len-long">
</div>
<div class="file-title word-aux">
<div>注意事项:</div>
<ul>
<li>1、检查upload文件夹是否有读写权限。</li>
<li>2、PHP默认上传限制为2MB需要在php.ini配置文件中修改“post_max_size”和“upload_max_filesize”的大小。</li>
<li>3、视频支持手动输入外链视频地址或者上传本地视频文件</li>
<li>4、必须上传.mp4视频格式</li>
<li>5、视频文件大小不能超过500MB</li>
</ul>
</div>
</div>
{notempty name="$service_list"}
<div class="layui-form-item">
<label class="layui-form-label">项目服务:</label>
<div class="layui-input-block">
{foreach name="$service_list" item="vo"}
<input type="checkbox" name="goods_service_ids" value="{$vo.id}" title="{$vo.service_name}" lay-skin="primary">
{/foreach}
</div>
</div>
{/notempty}
<div class="layui-form-item goods-category-wrap">
<label class="layui-form-label"><span class="required">*</span>项目分类:</label>
<div class="layui-input-block" id="category_select_box">
</div>
<input type="hidden" lay-verify="category_id"/>
<div class="word-aux">项目可以属于多个分类最多10个</div>
</div>
<div class="layui-form-item goods_state">
<label class="layui-form-label"><span class="required">*</span>是否上架:</label>
<div class="layui-input-block">
<input type="radio" name="goods_state" value="1" title="立刻上架" checked lay-filter="goods_state">
<input type="radio" name="goods_state" value="0" title="放入仓库" lay-filter="goods_state">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">定时下架:</label>
<div class="layui-input-block">
<input type="radio" name="timer_off_status" value="1" title="启用" lay-filter="timer_off">
<input type="radio" name="timer_off_status" value="2" title="不启用" lay-filter="timer_off" checked>
</div>
<div class="word-aux">启用定时下架后,到达设定时间,此项目将自动下架。</div>
</div>
<div class="layui-form-item timer_off" style="display: none;">
<label class="layui-form-label"></label>
<div class="layui-input-inline">
<input type="text" id="timer_off" name="timer_off" class="layui-input len-mid" autocomplete="off" readonly>
<i class=" iconrili iconfont calendar"></i>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">是否需要预约:</label>
<div class="layui-input-block">
<input type="radio" name="is_reserve" value="1" title="是" >
<input type="radio" name="is_reserve" value="0" title="否"checked>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">服务模式:</label>
<div class="layui-input-block">
<input type="radio" name="service_mode" value="onsite" title="上门服务" lay-filter="service_mode">
<input type="radio" name="service_mode" value="in_store" title="到店服务" lay-filter="service_mode" checked>
</div>
</div>
<div class="layui-form-item onsite-price" style="display: none">
<label class="layui-form-label">费用形式:</label>
<div class="layui-input-block">
<input type="radio" name="service_price_way" value="reserve_price" title="预约定金">
<input type="radio" name="service_price_way" value="fixed_price" title="一口价格" checked>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>销售价:</label>
<div class="layui-input-block">
<input type="text" name="price" placeholder="0.00" lay-verify="service_price" class="layui-input len-short" autocomplete="off">
<div class="layui-form-mid"></div>
</div>
</div>
{if addon_is_exit('cashier') == 1}
<div class="layui-form-item">
<label class="layui-form-label">销售渠道:</label>
<div class="layui-input-block">
<input type="radio" name="sale_channel" value="all" title="线上线下销售" checked>
<input type="radio" name="sale_channel" value="online" title="线上销售">
<input type="radio" name="sale_channel" value="offline" title="线下销售">
</div>
</div>
{/if}
{if $store_is_exit}
<div class="layui-form-item">
<label class="layui-form-label">适用门店:</label>
<div class="layui-input-block">
<input type="radio" name="sale_store" value="all" title="全部门店" checked lay-filter="sale_store">
<input type="radio" name="sale_store" value="" title="部分门店" lay-filter="sale_store">
</div>
</div>
<div class="layui-form-item sale-store-select" style="display: none" lay-verify="sale_store">
<label class="layui-form-label"></label>
<div class="layui-input-block">
<button class="layui-btn select-store">选择门店</button>
<div style="width: 700px">
<table class="layui-table" lay-skin="nob">
<colgroup>
<col width="30%">
<col width="60%">
<col width="10%">
</colgroup>
<tr>
<th>门店名称</th>
<th>门店地址</th>
<th>操作</th>
</tr>
<tbody class="sale-store"></tbody>
</table>
</div>
</div>
</div>
<div class="need-verify">
<div class="layui-form-item">
<label class="layui-form-label">项目有效期:</label>
<div class="layui-input-block">
<input type="radio" name="verify_validity_type" value="0" title="永久" checked lay-filter="verify_validity_type">
<input type="radio" name="verify_validity_type" value="1" title="购买后几日有效" lay-filter="verify_validity_type">
<input type="radio" name="verify_validity_type" value="2" title="指定过期日期" lay-filter="verify_validity_type">
</div>
</div>
<div class="layui-form-item validity-type validity-type-1 layui-hide">
<label class="layui-form-label"><span class="required">*</span>有效期:</label>
<div class="layui-input-inline">
<input type="text" name="virtual_indate" placeholder="0" class="layui-input len-short" lay-verify="virtual_indate" autocomplete="off">
</div>
<div class="layui-form-mid layui-word-aux"></div>
</div>
<div class="layui-form-item validity-type validity-type-2 layui-hide">
<label class="layui-form-label"><span class="required">*</span>有效期:</label>
<div class="layui-input-inline">
<input type="text" id="virtual_time" name="virtual_time" class="layui-input len-mid" lay-verify="virtual_time" autocomplete="off" readonly>
<i class=" iconrili iconfont calendar"></i>
</div>
<div class="word-aux" style="clear:both;top: 5px;position: relative;">无论何时购买此项目,到达指定时间后都将过期,无法核销。</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">是否统一售价:</label>
<div class="layui-input-block">
<input type="radio" name="is_unify_price" value="1" title="是" checked >
<input type="radio" name="is_unify_price" value="0" title="否" >
</div>
<div class="word-aux">价格设置之后门店不能修改价格,门店按照平台设置的价格售卖</div>
</div>
{/if}
</div>
</div>
</div>
<!-- 价格库存 -->
<div class="layui-tab-item">
<div class="layui-form-item layui-hide">
<label class="layui-form-label">启用多规格:</label>
<div class="layui-input-inline">
<input type="checkbox" value="1" lay-skin="switch" name="spec_type" lay-filter="spec_type" lay-verify="spec_type">
<input type="hidden" id="spec_type_status" value="0">
</div>
</div>
<!-- 单规格 -->
<div class="js-single-spec">
<div class="layui-form-item">
<label class="layui-form-label">划线价:</label>
<div class="layui-input-block">
<input type="text" name="market_price" placeholder="0.00" lay-verify="market_price" class="layui-input len-short" autocomplete="off">
<div class="layui-form-mid"></div>
</div>
<div class="word-aux">项目没有优惠活动显示的划线价格,如果项目有折扣等优惠活动划线价显示销售价</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">成本价:</label>
<div class="layui-input-block">
<input type="text" name="cost_price" placeholder="0.00" class="layui-input len-short" lay-verify="cost_price" autocomplete="off">
<div class="layui-form-mid"></div>
</div>
<div class="word-aux">成本价将不会对前台会员展示,用于商家统计使用</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">项目编码:</label>
<div class="layui-input-inline">
<input type="text" name="sku_no" placeholder="请输入项目编码" maxlength="50" class="layui-input len-long" autocomplete="off">
</div>
</div>
</div>
<!-- 多规格 -->
<div class="js-more-spec">
<!--规格项/规格值-->
<div class="spec-edit-list"></div>
<div class="layui-form-item js-add-spec">
<label class="layui-form-label"></label>
<div class="layui-input-inline">
<button class="layui-btn" type="button">添加规格</button>
</div>
</div>
<div class="layui-form-item batch-operation-sku">
<label class="layui-form-label">批量操作:</label>
<div class="layui-input-inline">
<span class="text-color" data-field="spec_name">副标题</span>
<span class="text-color" data-field="price" data-verify="price">销售价</span>
<span class="text-color" data-field="market_price" data-verify="market_price">划线价</span>
<span class="text-color" data-field="cost_price" data-verify="cost_price">成本价</span>
<span class="text-color" data-field="stock" data-verify="stock">库存</span>
<span class="text-color" data-field="stock_alarm" data-verify="stock_alarm">库存预警</span>
<span class="text-color" data-field="sku_no" data-verify="">项目编码</span>
<input type="text" class="layui-input len-short" name="batch_operation_sku" autocomplete="off" />
<button class="layui-btn confirm" type="button">确定</button>
<button class="layui-btn layui-btn-primary cancel" type="button">取消</button>
</div>
</div>
<!--sku列表-->
<div class="layui-form-item sku-table">
<label class="layui-form-label"></label>
<div class="layui-input-block"></div>
</div>
</div>
<div class="layui-form-item js-goods-stock-wrap">
<label class="layui-form-label"><span class="required">*</span>库存:</label>
<div class="layui-input-block">
<input type="number" name="goods_stock" placeholder="0" lay-verify="goods_stock" class="layui-input len-short" autocomplete="off">
<div class="layui-form-mid"></div>
</div>
</div>
<div class="layui-form-item js-goods-stock-wrap">
<label class="layui-form-label">库存预警:</label>
<div class="layui-input-block">
<input type="number" name="goods_stock_alarm" placeholder="0" lay-verify="goods_stock_alarm" class="layui-input len-short" autocomplete="off">
<div class="layui-form-mid"></div>
</div>
<div class="word-aux">项目库存少于预警数量项目列表库存数量标红显示0为不预警。</div>
</div>
<div class="layui-form-item js-goods-stock-wrap">
<label class="layui-form-label">服务时长:</label>
<div class="layui-input-block">
<input type="number" name="service_length" placeholder="0" lay-verify="service_length" class="layui-input len-short" autocomplete="off">
<div class="layui-form-mid">分钟</div>
</div>
</div>
<div class="layui-form-item ">
<label class="layui-form-label">虚拟销量:</label>
<div class="layui-input-block">
<input type="number" name="virtual_sale" placeholder="0" lay-verify="virtual_sale" class="layui-input len-short" autocomplete="off">
<div class="layui-form-mid"></div>
</div>
<div class="word-aux">该设置不计入项目统计数据</div>
</div>
<div class="layui-form-item is_limit">
<label class="layui-form-label">是否限购:</label>
<div class="layui-input-block">
<input type="radio" name="is_limit" value="0" title="否" lay-filter="is_limit" checked>
<input type="radio" name="is_limit" value="1" title="是" lay-filter="is_limit">
</div>
<div class="word-aux">启用限购后,购买项目时,会对该项目购买量做限制判断。</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">起售:</label>
<div class="layui-input-block">
<input type="number" name="min_buy" placeholder="" lay-verify="min_buy" class="layui-input len-short" autocomplete="off">
<div class="layui-form-mid"></div>
</div>
<div class="word-aux">起售数量超出项目库存时,买家无法购买该项目</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">会员等级折扣:</label>
<div class="layui-input-block">
<div class="layui-input-inline">
<input type="radio" name="is_consume_discount" value="1" title="参与" checked>
<input type="radio" name="is_consume_discount" value="0" title="不参与">
</div>
</div>
<div class="word-aux">按照默认会员等级折扣优惠</div>
</div>
</div>
<!-- 项目详情 -->
<div class="layui-tab-item">
<div class="layui-form-item">
<label class="layui-form-label sm"></label>
<div class="layui-input-inline special-length">
<script id="editor" type="text/plain" style="width:100%;height:500px;"></script>
</div>
</div>
<script type="text/javascript" charset="utf-8" src="__STATIC__/ext/ueditor/ueditor.config.js"></script>
<script type="text/javascript" charset="utf-8" src="__STATIC__/ext/ueditor/ueditor.all.js"> </script>
<script type="text/javascript" charset="utf-8" src="__STATIC__/ext/ueditor/lang/zh-cn/zh-cn.js"></script>
</div>
<div class="layui-tab-item layui-card card-common card-brief head">
<div class="layui-card-header">
<span class="card-title">高级设置</span>
</div>
<div class="layui-card-body">
<div class="layui-form-item">
<label class="layui-form-label">排序:</label>
<div class="layui-input-block">
<input type="number" name="sort" class="layui-input len-short" value="{$sort_config['default_value']}" placeholder="0" autocomplete="off">
</div>
<div class="word-aux">项目默认排序号为0数字越大排序越靠前数字重复则最新添加的靠前。</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">项目详情显示库存:</label>
<div class="layui-input-block">
<input type="radio" name="stock_show" value="1" title="显示" checked >
<input type="radio" name="stock_show" value="0" title="隐藏" >
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">划线价显示:</label>
<div class="layui-input-block">
<input type="radio" name="market_price_show" value="1" title="显示" checked>
<input type="radio" name="market_price_show" value="0" title="隐藏" >
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">项目详情显示弹幕:</label>
<div class="layui-input-block">
<input type="radio" name="barrage_show" value="1" title="显示" checked>
<input type="radio" name="barrage_show" value="0" title="隐藏" >
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">项目详情显示销量:</label>
<div class="layui-input-block">
<input type="radio" name="sale_show" value="1" title="显示" checked>
<input type="radio" name="sale_show" value="0" title="隐藏" >
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">项目海报:</label>
<div class="layui-input-inline">
<select name="template_id" lay-search="" lay-verify="">
<option value="">请选择项目海报</option>
{foreach name="$poster_list" item="vo"}
<option value="{$vo['template_id']}">{$vo['poster_name']}</option>
{/foreach}
</select>
</div>
</div>
{if $form_is_exit}
<div class="layui-form-item">
<label class="layui-form-label">项目表单:</label>
<div class="layui-input-block len-mid">
<select name="form_id">
<option value="0">请选择项目表单</option>
{foreach name="$form_list" item="vo"}
<option value="{$vo.id}">{$vo.form_name}</option>
{/foreach}
</select>
</div>
<div class="word-aux">
<a href="{:href_url('form://shop/form/addform?form_type=goods')}" class="text-color" target="_blank">创建项目表单</a>
<a href="javascript:;" onclick="refreshFormList()" class="text-color">刷新</a>
</div>
</div>
{/if}
</div>
</div>
</div>
</div>
<div class="fixed-btn">
<button class="layui-btn layui-btn-primary border-color text-color js-prev" lay-filter="prev">上一步</button>
<button class="layui-btn js-save" lay-submit="" lay-filter="save">保存</button>
<button class="layui-btn layui-btn-primary border-color text-color js-next" lay-submit="" lay-filter="next">下一步</button>
</div>
</div>
<!--规格项模板-->
<script type="text/html" id="specTemplate">
{{# for(var i=0;i<d.list.length;i++){ }}
<div class="spec-item" data-index="{{i}}">
<div class="layui-form-item spec">
<label class="layui-form-label">规格项{{i+1}}</label>
<div class="layui-input-inline">
<select name="spec_item">
<option value="0"></option>
{{# if(d.list[i].spec_name != ''){ }}
<option value="{{d.list[i].spec_id}}" data-attr-name="{{d.list[i].spec_name}}" selected>{{d.list[i].spec_name}}</option>
{{# }else{ }}
{{# } }}
</select>
<i class="layui-icon layui-icon-close" data-index="{{i}}"></i>
</div>
{{# if(i==0){ }}
<div class="layui-input-inline">
{{# if(d.add_spec_img){ }}
<input type="checkbox" name="add_spec_img" title="添加规格图片" lay-skin="primary" lay-filter="add_spec_img" checked>
{{# }else{ }}
<input type="checkbox" name="add_spec_img" title="添加规格图片" lay-skin="primary" lay-filter="add_spec_img">
{{# } }}
</div>
{{# } }}
</div>
{{# if(d.list[i].spec_name != ''){ }}
<div class="layui-form-item spec-value">
{{# }else{ }}
<div class="layui-form-item spec-value" style="display:none;">
{{# } }}
<label class="layui-form-label"></label>
<div class="layui-input-block spec-value">
{{# if(d.list[i].value.length){ }}
<ul>
{{# for(var j=0;j<d.list[i].value.length;j++){ }}
<li data-index="{{j}}" data-parent-index="{{i}}" >
{{# if(i==0 && d.add_spec_img){ }}
<div class="img-wrap">
{{# if(d.list[i].value[j].image){ }}
<img src="{{ns.img(d.list[i].value[j].image)}}" alt="">
{{# }else{ }}
<img src="SHOP_IMG/goods_spec_value_empty.png" alt="">
{{# } }}
</div>
{{# } }}
<span title="双击可编辑规格值" ondblclick="$(this).attr('contenteditable',true);$(this).focus()" class="spec-txt" data-spec_value_name="{{d.list[i].value[j].spec_value_name}}" data-parent-index="{{i}}" data-index="{{j}}">{{d.list[i].value[j].spec_value_name}}</span>
<i class="layui-icon layui-icon-close" data-parent-index="{{i}}" data-index="{{j}}"></i>
</li>
{{# } }}
</ul>
{{# } }}
<a class="text-color" href="javascript:;" data-index="{{i}}">+添加规格值</a>
<div class="add-spec-value-popup" data-index="{{i}}">
<select name="spec_value_item"></select>
<button class="layui-btn layui-btn-primary border-color text-color js-cancel-spec-value">取消</button>
</div>
</div>
</div>
</div>
{{# } }}
</script>
<!--SKU列表模板-->
<script type="text/html" id="skuTableTemplate">
{{# if(d.skuList.length){ }}
<table class="layui-table">
<colgroup></colgroup>
<thead>
<tr>
{{# if(d.showSpecName){ }}
<th colspan="{{d.colSpan}}" style="min-width: 60px;">项目规格</th>
{{# } }}
<th rowspan="{{d.rowSpan}}">SKU图片</th>
<th rowspan="{{d.rowSpan}}">副标题</th>
<th rowspan="{{d.rowSpan}}"><span class="required">*</span></th>
<th rowspan="{{d.rowSpan}}">划线价</th>
<th rowspan="{{d.rowSpan}}">成本价</th>
<th rowspan="{{d.rowSpan}}"><span class="required">*</span></th>
<th rowspan="{{d.rowSpan}}">库存预警</th>
<th rowspan="{{d.rowSpan}}">服务时长</th>
<th rowspan="{{d.rowSpan}}">商品编码多个编码以英文逗号分割</th>
<th rowspan="{{d.rowSpan}}" style="white-space: nowrap;">默认展示</th>
</tr>
{{# if(d.colSpan>1){ }}
<tr>
{{# for(var i=0;i<d.specList.length;i++){ }}
{{# if(d.specList[i].spec_name && d.specList[i].value.length> 0){ }}
<th>{{d.specList[i].spec_name}}</th>
{{# } }}
{{# } }}
</tr>
{{# } }}
</thead>
<tbody>
{{# for(var i=0;i<d.skuList.length;i++){ }}
<tr>
<td class="sku_imgs" id="sku_img_{{i}}" style="width: 130px;">
{{# for(var j=0;j<d.skuList[i].sku_images_arr.length;j++){ }}
<div class="img-wrap" data-index="{{j}}" data-parent-index="{{i}}">
<a href="javascript:void(0)">
<img src="{{ns.img(d.skuList[i].sku_images_arr[j])}}" layer-src />
</a>
<div class="operation">
<i title="图片预览" class="iconfont iconreview js-preview"></i>
<i title="删除图片" class="layui-icon layui-icon-delete js-delete"></i>
</div>
</div>
{{# } }}
{{# if(d.skuList[i].sku_images_arr.length<d.goods_sku_max){ }}
<div class="upload-sku-img" data-index="{{i}}"><i class="layui-icon layui-icon-add-1"></i></div>
{{# } }}
</td>
<td>
<input type="text" name="spec_name" placeholder="副标题" maxlength="100" value="{{d.skuList[i].spec_name}}" class="layui-input" autocomplete="off" data-index="{{i}}">
</td>
<td>
<input type="text" name="price" placeholder="销售价" lay-verify="sku_price" value="{{d.skuList[i].price}}" class="layui-input" autocomplete="off" data-index="{{i}}">
</td>
<td>
<input type="text" name="market_price" placeholder="划线价" value="{{d.skuList[i].market_price}}" lay-verify="sku_market_price" class="layui-input" autocomplete="off" data-index="{{i}}">
</td>
<td>
<input type="text" name="cost_price" placeholder="成本价" value="{{d.skuList[i].cost_price}}" lay-verify="sku_cost_price" class="layui-input" autocomplete="off" data-index="{{i}}">
</td>
<td>
<input type="text" name="stock" placeholder="库存" value="{{d.skuList[i].stock}}" lay-verify="sku_stock" class="layui-input" autocomplete="off" data-index="{{i}}">
</td>
<td>
<input type="text" name="stock_alarm" placeholder="库存预警" value="{{d.skuList[i].stock_alarm}}" lay-verify="sku_stock_alarm" class="layui-input" autocomplete="off" data-index="{{i}}">
</td>
<td>
<input type="number" name="service_length" placeholder="服务时长" value="{{d.skuList[i].service_length}}" maxlength="50" class="layui-input" autocomplete="off" data-index="{{i}}" lay-verify="service_length">
</td>
<td>
<input type="text" name="sku_no" placeholder="商品编码" value="{{d.skuList[i].sku_no}}" maxlength="50" class="layui-input" autocomplete="off" data-index="{{i}}">
</td>
<td style="min-width: 40px;">
{{# if(d.skuList[i].is_default == 1) { }}
<input type="checkbox" data-index="{{i}}" name="is_default" lay-filter="is_default" lay-skin="switch" checked>
{{# }else { }}
<input type="checkbox" data-index="{{i}}" name="is_default" lay-filter="is_default" lay-skin="switch">
{{# } }}
</td>
</tr>
{{# } }}
</tbody>
</table>
{{# } }}
<div class="word-aux text-color" style="margin: 10px 0 0 0;">默认展示是多规格项目在客户访问项目时默认显示的项目规格</div>
</script>
<!--项目主图列表-->
<script type="text/html" id="goodsImage">
{{# if(d.list.length){ }}
{{# for(var i=0;i<d.list.length;i++){ }}
<div class="item upload_img_square_item" data-index="{{i}}">
<div class="img-wrap">
<img src="{{ns.img(d.list[i],'small')}}" layer-src="{{ns.img(d.list[i],'big')}}">
</div>
<div class="operation">
<i title="图片预览" class="iconfont iconreview js-preview"></i>
<i title="删除图片" class="layui-icon layui-icon-delete js-delete" data-index="{{i}}"></i>
<div class="replace_img" data-index="{{i}}">点击替换</div>
</div>
</div>
{{# } }}
{{# if(d.list.length < d.max){ }}
<div class="item js-add-goods-image upload_img_square">+</div>
{{# } }}
{{# }else{ }}
<div class="item js-add-goods-image upload_img_square">+</div>
{{# } }}
</script>
<script src="__STATIC__/ext/drag-arrange.js"></script>
<script src="__STATIC__/ext/video/videojs-ie8.min.js"></script>
<script src="__STATIC__/ext/video/video.min.js"></script>
<script src="__STATIC__/ext/searchable_select/searchable_select.js"></script>
<script src="SHOP_JS/category_select.js?time=20240821"></script>
<script src="SHOP_JS/goods_edit_common.js?time=20250527"></script>
<script src="ADDON_CARDSERVICE_JS/service_goods_edit.js?v=1.1"></script>

View File

@@ -0,0 +1,773 @@
<link rel="stylesheet" href="__STATIC__/ext/video/video.css">
<link rel="stylesheet" type="text/css" href="__STATIC__/ext/searchable_select/searchable_select.css" />
<link rel="stylesheet" type="text/css" href="__STATIC__/ext/layui/extend/cascader/cascader.css"/>
<link rel="stylesheet" type="text/css" href="SHOP_CSS/goods_edit.css?time=20250527" />
<div class="layui-form">
<div class="layui-tab layui-tab-brief" lay-filter="goods_tab">
<ul class="layui-tab-title">
<li class="layu1i-this" lay-id="basic">基础设置</li>
<li lay-id="price-stock">价格库存</li>
<li lay-id="detail">项目详情</li>
<li lay-id="senior">高级设置</li>
</ul>
<div class="layui-tab-content">
<!-- 基础设置 -->
<div class="layui-tab-item layui-show">
<div class="layui-card card-common card-brief head">
<div class="layui-card-header">
<span class="card-title">基础信息</span>
</div>
<div class="layui-card-body">
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>项目名称:</label>
<div class="layui-input-inline">
<input name="goods_name" type="text" value="{$goods_info['goods_name']}" placeholder="请输入项目名称不能超过60个字符" maxlength="60" autocomplete="off" lay-verify="goods_name" class="layui-input len-long">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">促销语:</label>
<div class="layui-input-inline">
<textarea class="layui-textarea len-long" name="introduction" maxlength="100" lay-verify="introduction" placeholder="请输入促销语不能超过100个字符">{$goods_info['introduction']}</textarea>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">关键词:</label>
<div class="layui-input-block">
<input type="text" name="keywords" value="{$goods_info['keywords']}" placeholder="项目关键词用于SEO搜索不能超过100个字符" maxlength="100" autocomplete="off" class="layui-input len-long">
</div>
</div>
<div class="layui-form-item goods-image-wrap">
<label class="layui-form-label"><span class="required">*</span>项目主图:</label>
<div class="layui-input-block">
<!--项目主图项-->
<div class="js-goods-image"></div>
</div>
<div class="word-aux">第一张图片将作为项目主图,支持同时上传多张图片,多张图片之间可随意调整位置;</div>
<div class="word-aux">支持jpg、gif、png格式上传或从图片空间中选择建议使用尺寸800x800像素以上、大小不超过1M的正方形图片</div>
<div class="word-aux">上传后的图片将会自动保存在图片空间的默认分类中最多上传10张至少1张</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">项目视频:</label>
<div class="layui-input-block">
<div class="video-thumb">
<video id="goods_video" class="video-js vjs-big-play-centered" controls="" poster="SHOP_IMG/goods_video_preview.png" preload="auto"></video>
</div>
<div id="videoUpload2" class="up-video " title="项目视频" >
<span class="delete-video hide" onclick="deleteVideo()"><img class="del-img" src="SHOP_IMG/delete.png">删除</span>
<span class=" replace-video hide js-add-goods-video" ><img class="up-img" src="SHOP_IMG/upload.png">上传视频</span>
</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"></label>
<div class="layui-input-block">
<input type="text" name="video_url" placeholder="在此输入外链视频地址" value="{$goods_info['video_url']}" autocomplete="off" class="layui-input len-long">
</div>
<div class="file-title word-aux">
<div>注意事项:</div>
<ul>
<li>1、检查upload文件夹是否有读写权限。</li>
<li>2、PHP默认上传限制为2MB需要在php.ini配置文件中修改“post_max_size”和“upload_max_filesize”的大小。</li>
<li>3、视频支持手动输入外链视频地址或者上传本地视频文件</li>
<li>4、必须上传.mp4视频格式</li>
<li>5、视频文件大小不能超过500MB</li>
</ul>
</div>
</div>
{notempty name="$service_list"}
<div class="layui-form-item">
<label class="layui-form-label">项目服务:</label>
<div class="layui-input-block">
{foreach name="$service_list" item="vo"}
<input type="checkbox" name="goods_service_ids" value="{$vo.id}" title="{$vo.service_name}" lay-skin="primary" {if strpos($goods_info['goods_service_ids'],(string)$vo['id'])>-1}checked{/if}>
{/foreach}
</div>
</div>
{/notempty}
<div class="layui-form-item goods-category-wrap">
<label class="layui-form-label"><span class="required">*</span>项目分类:</label>
<div class="layui-input-block" id="category_select_box">
</div>
<input type="hidden" lay-verify="category_id"/>
<input type="hidden" id="category_data" value='{:json_encode($goods_info.goods_category_data)}'>
<div class="word-aux">项目可以属于多个分类最多10个</div>
</div>
<div class="layui-form-item goods_state">
<label class="layui-form-label"><span class="required">*</span>是否上架:</label>
<div class="layui-input-block">
<input type="radio" name="goods_state" value="1" title="立刻上架" lay-filter="goods_state" {if $goods_info['goods_state'] == 1 }checked{/if}>
<input type="radio" name="goods_state" value="0" title="放入仓库" lay-filter="goods_state" {if $goods_info['goods_state'] == 0 }checked{/if}>
</div>
</div>
{if $goods_info['goods_state'] == 0}
<div class="layui-form-item timer_on">
<label class="layui-form-label">定时上架:</label>
<div class="layui-input-block">
<input type="radio" name="timer_on_status" class="timer_on_status_true" value="1" title="启用" lay-filter="timer_on" {if $goods_info['timer_on'] > 0} checked {/if}>
<input type="radio" name="timer_on_status" value="2" title="不启用" lay-filter="timer_on" {if $goods_info['timer_on'] == 0} checked {/if}>
</div>
<div class="word-aux">启用定时上架后,到达设定时间,此项目将自动上架。</div>
</div>
{if $goods_info['timer_on'] > 0}
<div class="layui-form-item timer_on_time">
<label class="layui-form-label"></label>
<div class="layui-input-inline">
<input type="text" id="timer_on" name="timer_on" value="{:date('Y-m-d H:i:s',$goods_info['timer_on'])}" lay-verify="required" class="layui-input len-mid" autocomplete="off" readonly>
<i class=" iconrili iconfont calendar"></i>
</div>
</div>
{else/}
<div class="layui-form-item timer_on_time layui-hide">
<label class="layui-form-label"></label>
<div class="layui-input-inline">
<input type="text" id="timer_on" name="timer_on" lay-verify="" class="layui-input len-mid" autocomplete="off" readonly>
<i class=" iconrili iconfont calendar"></i>
</div>
</div>
{/if}
{/if}
<div class="layui-form-item">
<label class="layui-form-label">定时下架:</label>
<div class="layui-input-block">
<input type="radio" name="timer_off_status" value="1" title="启用" lay-filter="timer_off" {if $goods_info['timer_off'] > 0} checked {/if}>
<input type="radio" name="timer_off_status" value="2" title="不启用" lay-filter="timer_off" {if $goods_info['timer_off'] == 0} checked {/if}>
</div>
<div class="word-aux">启用定时下架后,到达设定时间,此项目将自动下架。</div>
</div>
{if $goods_info['timer_off'] > 0}
<div class="layui-form-item timer_off">
<label class="layui-form-label"></label>
<div class="layui-input-inline">
<input type="text" id="timer_off" name="timer_off" value="{:date('Y-m-d H:i:s',$goods_info['timer_off'])}" lay-verify="required" class="layui-input len-mid" autocomplete="off" readonly>
<i class=" iconrili iconfont calendar"></i>
</div>
</div>
{else/}
<div class="layui-form-item timer_off" style="display:none">
<label class="layui-form-label"></label>
<div class="layui-input-inline">
<input type="text" id="timer_off" name="timer_off" lay-verify="" class="layui-input len-mid" autocomplete="off" readonly>
<i class=" iconrili iconfont calendar"></i>
</div>
</div>
{/if}
<div class="layui-form-item">
<label class="layui-form-label">是否需要预约:</label>
<div class="layui-input-block">
<input type="radio" name="is_reserve" value="1" title="是" {if $goods_info['is_reserve'] == 1 }checked{/if}>
<input type="radio" name="is_reserve" value="0" title="否" {if $goods_info['is_reserve'] == 0 }checked{/if}>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">服务模式:</label>
<div class="layui-input-block">
<input type="radio" name="service_mode" value="onsite" title="上门服务" lay-filter="service_mode" {if $goods_info['service_mode'] == 'onsite' }checked{/if}>
<input type="radio" name="service_mode" value="in_store" title="到店服务" lay-filter="service_mode" {if $goods_info['service_mode'] == 'in_store' }checked{/if}>
</div>
</div>
<div class="layui-form-item onsite-price" {if $goods_info['service_mode'] == 'in_store' }style="display: none"{/if}>
<label class="layui-form-label">费用形式:</label>
<div class="layui-input-block">
<input type="radio" name="service_price_way" value="reserve_price" title="预约定金" {if $goods_info['service_price_way'] == 'reserve_price' }checked{/if}>
<input type="radio" name="service_price_way" value="fixed_price" title="一口价格" {if $goods_info['service_price_way'] == 'fixed_price' }checked{/if}>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><span class="required">*</span>销售价:</label>
<div class="layui-input-block">
<input type="text" name="price" value="{$goods_info['price']}" placeholder="0.00" lay-verify="service_price" class="layui-input len-short" autocomplete="off">
<div class="layui-form-mid"></div>
</div>
</div>
{if addon_is_exit('cashier') == 1}
<div class="layui-form-item">
<label class="layui-form-label">销售渠道:</label>
<div class="layui-input-block">
<input type="radio" name="sale_channel" value="all" title="线上线下销售" {if $goods_info.sale_channel eq 'all'}checked{/if}>
<input type="radio" name="sale_channel" value="online" title="线上销售" {if $goods_info.sale_channel eq 'online'}checked{/if}>
<input type="radio" name="sale_channel" value="offline" title="线下销售" {if $goods_info.sale_channel eq 'offline'}checked{/if}>
</div>
</div>
{/if}
{if $store_is_exit}
<div class="layui-form-item">
<label class="layui-form-label">适用门店:</label>
<div class="layui-input-block">
<input type="radio" name="sale_store" value="all" title="全部门店" {if $goods_info.sale_store eq 'all'}checked{/if} lay-filter="sale_store">
<input type="radio" name="sale_store" value="" title="部分门店" {if $goods_info.sale_store neq 'all'}checked{/if} lay-filter="sale_store">
</div>
</div>
<div class="layui-form-item sale-store-select" {if $goods_info.sale_store eq 'all'}style="display: none"{/if} lay-verify="sale_store">
<label class="layui-form-label"></label>
<div class="layui-input-block">
<button class="layui-btn select-store">选择门店</button>
<div style="width: 700px">
<table class="layui-table" lay-skin="nob">
<colgroup>
<col width="30%">
<col width="60%">
<col width="10%">
</colgroup>
<tr>
<th>门店名称</th>
<th>门店地址</th>
<th>操作</th>
</tr>
<tbody class="sale-store">
{if isset($store_list) && !empty($store_list)}
{foreach name="$store_list" item="vo"}
<tr data-store="{$vo.store_id}">
<td>{$vo.store_name}</td>
<td>{$vo.full_address}{$vo.address}</td>
<td><a href="javascript:;" class="del">删除</a></td>
</tr>
{/foreach}
{/if}
</tbody>
</table>
</div>
</div>
</div>
<div class="need-verify">
<div class="layui-form-item">
<label class="layui-form-label">核销有效期:</label>
<div class="layui-input-block">
<input type="radio" name="verify_validity_type" value="0" title="永久" lay-filter="verify_validity_type" {if $goods_info['verify_validity_type'] eq 0}checked{/if}>
<input type="radio" name="verify_validity_type" value="1" title="购买后几日有效" lay-filter="verify_validity_type" {if $goods_info['verify_validity_type'] eq 1}checked{/if}>
<input type="radio" name="verify_validity_type" value="2" title="指定过期日期" lay-filter="verify_validity_type" {if $goods_info['verify_validity_type'] eq 2}checked{/if}>
</div>
</div>
<div class="layui-form-item validity-type validity-type-1 {if $goods_info['verify_validity_type'] neq 1}layui-hide{/if}">
<label class="layui-form-label"><span class="required">*</span>有效期:</label>
<div class="layui-input-inline">
<input type="text" name="virtual_indate" placeholder="0" class="layui-input len-short" lay-verify="virtual_indate" autocomplete="off" {if $goods_info['verify_validity_type'] eq 1}value="{$goods_info['virtual_indate']}"{/if}>
</div>
<div class="layui-form-mid layui-word-aux"></div>
</div>
<div class="layui-form-item validity-type validity-type-2 {if $goods_info['verify_validity_type'] neq 2}layui-hide{/if}">
<label class="layui-form-label"><span class="required">*</span>有效期:</label>
<div class="layui-input-inline">
<input type="text" id="virtual_time" name="virtual_time" class="layui-input len-mid" lay-verify="virtual_time" autocomplete="off" readonly {if $goods_info['verify_validity_type'] eq 2}value="{:time_to_date($goods_info['virtual_indate'])}"{/if}>
<i class=" iconrili iconfont calendar"></i>
</div>
<div class="word-aux" style="clear:both;top: 5px;position: relative;">无论何时购买此商品,到达指定时间后都将过期,无法核销。</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">是否统一售价:</label>
<div class="layui-input-block">
<input type="radio" name="is_unify_price" value="1" title="是" {if $goods_info.is_unify_price eq '1'}checked{/if} >
<input type="radio" name="is_unify_price" value="0" title="否" {if $goods_info.is_unify_price eq '0'}checked{/if}>
</div>
<div class="word-aux">价格设置之后门店不能修改价格,门店按照平台设置的价格售卖</div>
</div>
{/if}
</div>
</div>
</div>
<!-- 价格库存 -->
<div class="layui-tab-item">
<div class="layui-form-item layui-hide">
<label class="layui-form-label">启用多规格:</label>
<div class="layui-input-inline">
<input type="checkbox" value="1" lay-skin="switch" name="spec_type" lay-filter="spec_type" lay-verify="spec_type" {notempty name="$goods_info['goods_spec_format']" }checked{/notempty}>
<input type="hidden" id="spec_type_status" {if empty($goods_info['goods_spec_format'])} value="0" {else/} value="1" {/if}>
</div>
</div>
<!-- 单规格 -->
<div class="js-single-spec" {notempty name="$goods_info['goods_spec_format']" }style="display:none;"{/notempty}>
<div class="layui-form-item">
<label class="layui-form-label">划线价:</label>
<div class="layui-input-block">
<input type="text" name="market_price" value="{$goods_info['market_price']}" placeholder="0.00" lay-verify="market_price" class="layui-input len-short" autocomplete="off">
<div class="layui-form-mid"></div>
</div>
<div class="word-aux">项目没有优惠活动显示的划线价格,如果项目有折扣等优惠活动划线价显示销售价</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">成本价:</label>
<div class="layui-input-block">
<input type="text" name="cost_price" value="{$goods_info['cost_price']}" placeholder="0.00" class="layui-input len-short" lay-verify="cost_price" autocomplete="off">
<div class="layui-form-mid"></div>
</div>
<div class="word-aux">成本价将不会对前台会员展示,用于商家统计使用</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">项目编码:</label>
<div class="layui-input-inline">
<input type="text" name="sku_no" value="{$goods_info['sku_list'][0]['sku_no']}" placeholder="请输入项目编码" maxlength="50" class="layui-input len-long" autocomplete="off">
</div>
</div>
</div>
<!-- 多规格 -->
<div class="js-more-spec" {notempty name="$goods_info['goods_spec_format']" }style="display:block;"{/notempty}>
<!--规格项/规格值-->
<div class="spec-edit-list"></div>
<div class="layui-form-item js-add-spec">
<label class="layui-form-label"></label>
<div class="layui-input-inline">
<button class="layui-btn" type="button">添加规格</button>
</div>
</div>
<div class="layui-form-item batch-operation-sku">
<label class="layui-form-label">批量操作:</label>
<div class="layui-input-inline">
<span class="text-color" data-field="spec_name">副标题</span>
<span class="text-color" data-field="price" data-verify="price">销售价</span>
<span class="text-color" data-field="market_price" data-verify="market_price">划线价</span>
<span class="text-color" data-field="cost_price" data-verify="cost_price">成本价</span>
<span class="text-color" data-field="stock" data-verify="stock">库存</span>
<span class="text-color" data-field="stock_alarm" data-verify="stock_alarm">库存预警</span>
<span class="text-color" data-field="sku_no" data-verify="">项目编码</span>
<input type="text" class="layui-input len-short" name="batch_operation_sku" autocomplete="off" />
<button class="layui-btn confirm" type="button">确定</button>
<button class="layui-btn layui-btn-primary cancel" type="button">取消</button>
</div>
</div>
<!--编辑时用到的SKU列表-->
<div class="js-edit-sku-list">
{foreach name="$goods_info['sku_list']" item="vo" key="k"}
<div data-index="{$k}">
<input type="hidden" name="edit_sku_id" value="{$vo['sku_id']}" />
<input type="hidden" name="edit_spec_name" value="{$vo['spec_name']}" />
<input type="hidden" name="edit_sku_no" value="{$vo['sku_no']}" />
<input type="hidden" name="edit_sku_spec_format" value="{$vo['sku_spec_format']}" />
<input type="hidden" name="edit_price" value="{$vo['price']}" />
<input type="hidden" name="edit_market_price" value="{$vo['market_price']}" />
<input type="hidden" name="edit_cost_price" value="{$vo['cost_price']}" />
<input type="hidden" name="edit_stock" value="{$vo['stock']}" />
<input type="hidden" name="edit_stock_alarm" value="{$vo['stock_alarm']}" />
<input type="hidden" name="edit_sku_image" value="{$vo['sku_image']}" />
<input type="hidden" name="edit_sku_images" value="{$vo['sku_images']}" />
<input type="hidden" name="edit_is_default" value="{$vo['is_default']}" />
<input type="hidden" name="edit_service_length" value="{$vo['service_length']}" />
</div>
{/foreach}
</div>
<!--sku列表-->
<div class="layui-form-item sku-table">
<label class="layui-form-label"></label>
<div class="layui-input-block"></div>
</div>
</div>
<div class="layui-form-item js-goods-stock-wrap" {notempty name="$goods_info['goods_spec_format']" }style="display:none;"{/notempty}>
<label class="layui-form-label"><span class="required">*</span>库存:</label>
<div class="layui-input-block">
<input type="number" name="goods_stock" value="{$goods_info['goods_stock']}" placeholder="0" lay-verify="goods_stock" class="layui-input len-short" autocomplete="off" {notempty name="$goods_info['goods_spec_format']" }disabled{/notempty}>
<div class="layui-form-mid"></div>
</div>
</div>
<div class="layui-form-item js-goods-stock-wrap" {notempty name="$goods_info['goods_spec_format']" }style="display:none;"{/notempty}>
<label class="layui-form-label">库存预警:</label>
<div class="layui-input-block">
<input type="number" name="goods_stock_alarm" value="{$goods_info['goods_stock_alarm']}" placeholder="0" lay-verify="goods_stock_alarm" class="layui-input len-short" autocomplete="off">
<div class="layui-form-mid"></div>
</div>
<div class="word-aux">项目库存少于预警数量项目列表库存数量标红显示0为不预警。</div>
</div>
<div class="layui-form-item js-goods-stock-wrap">
<label class="layui-form-label">服务时长:</label>
<div class="layui-input-block">
<input type="number" name="service_length" value="{$goods_info['sku_list'][0]['service_length']}" placeholder="请输入服务时长" autocomplete="off" class="layui-input len-short" lay-verify="service_length">
<div class="layui-form-mid">分钟</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">虚拟销量:</label>
<div class="layui-input-block">
<input type="number" name="virtual_sale" placeholder="0" value="{$goods_info['virtual_sale']}" lay-verify="virtual_sale" class="layui-input len-short" autocomplete="off">
<div class="layui-form-mid"></div>
</div>
<div class="word-aux">该设置不计入项目统计数据</div>
</div>
<div class="layui-form-item is_limit">
<label class="layui-form-label">是否限购:</label>
<div class="layui-input-block">
<input type="radio" name="is_limit" value="0" title="否" lay-filter="is_limit" {if $goods_info['is_limit'] == 0} checked {/if}>
<input type="radio" name="is_limit" value="1" title="是" lay-filter="is_limit" {if $goods_info['is_limit'] == 1} checked {/if}>
</div>
<div class="word-aux">启用限购后,购买项目时,会对该项目购买量做限制判断。</div>
</div>
{if $goods_info['is_limit'] == 1}
<div class="layui-form-item limit_type" >
<label class="layui-form-label">限购类型:</label>
<div class="layui-input-block">
<input type="radio" name="limit_type" class="limit_type" value="1" title="单次限购" lay-filter="limit_type" {if $goods_info['limit_type'] == 1 } checked {/if}>
<input type="radio" name="limit_type" class="limit_type" value="2" title="长期限购" lay-filter="limit_type" {if $goods_info['limit_type'] == 2} checked {/if}>
<input type="number" name="max_buy" placeholder="" lay-verify="max_buy" value="{$goods_info['max_buy']}" class="layui-input len-short" autocomplete="off">
<div class="layui-form-mid">&nbsp件</div>
</div>
<div class="word-aux">单次限购是针对于每次下单不能超过限购数量,长期限购是针对于会员账号购买这个项目的总数不能超过限购数量。</div>
</div>
{/if}
<div class="layui-form-item">
<label class="layui-form-label">起售:</label>
<div class="layui-input-block">
<input type="number" name="min_buy" placeholder="" lay-verify="min_buy" value="{$goods_info['min_buy']}" class="layui-input len-short" autocomplete="off">
<div class="layui-form-mid"></div>
</div>
<div class="word-aux">起售数量超出项目库存时,买家无法购买该项目</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">会员等级折扣:</label>
<div class="layui-input-block">
<div class="layui-input-inline">
<input type="radio" name="is_consume_discount" value="1" title="参与" {if $goods_info['is_consume_discount'] > 0} checked {/if}>
<input type="radio" name="is_consume_discount" value="0" title="不参与" {if $goods_info['is_consume_discount'] == 0} checked {/if}>
</div>
</div>
<div class="word-aux">如果该项目未单独配置过优惠规则,则按照默认会员等级折扣优惠</div>
</div>
</div>
<!-- 项目详情 -->
<div class="layui-tab-item">
<div class="layui-form-item">
<label class="layui-form-label sm"></label>
<div class="layui-input-inline special-length">
<input type="hidden" name="goods_content" value="{$goods_info['goods_content']}" />
<script id="editor" type="text/plain" style="width:100%;height:500px;"></script>
</div>
</div>
<script type="text/javascript" charset="utf-8" src="__STATIC__/ext/ueditor/ueditor.config.js"></script>
<script type="text/javascript" charset="utf-8" src="__STATIC__/ext/ueditor/ueditor.all.js"> </script>
<script type="text/javascript" charset="utf-8" src="__STATIC__/ext/ueditor/lang/zh-cn/zh-cn.js"></script>
</div>
<div class="layui-tab-item layui-card card-common card-brief head">
<div class="layui-card-header">
<span class="card-title">高级设置</span>
</div>
<div class="layui-card-body">
<div class="layui-form-item">
<label class="layui-form-label">排序:</label>
<div class="layui-input-block">
<input type="number" name="sort" value="{$goods_info['sort']}" class="layui-input len-short" placeholder="0" autocomplete="off">
</div>
<div class="word-aux">项目默认排序号为0数字越大排序越靠前数字重复则最新添加的靠前。</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">项目详情显示库存:</label>
<div class="layui-input-block">
<input type="radio" name="stock_show" value="1" title="显示" {if $goods_info['stock_show'] > 0} checked {/if}>
<input type="radio" name="stock_show" value="0" title="隐藏" {if $goods_info['stock_show'] == 0} checked {/if}>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">划线价显示:</label>
<div class="layui-input-block">
<input type="radio" name="market_price_show" value="1" title="显示" {if $goods_info['market_price_show'] > 0} checked {/if}>
<input type="radio" name="market_price_show" value="0" title="隐藏" {if $goods_info['market_price_show'] == 0} checked {/if}>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">项目详情显示弹幕:</label>
<div class="layui-input-block">
<input type="radio" name="barrage_show" value="1" title="显示" {if $goods_info['barrage_show'] > 0} checked {/if}>
<input type="radio" name="barrage_show" value="0" title="隐藏" {if $goods_info['barrage_show'] == 0} checked {/if}>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">项目详情显示销量:</label>
<div class="layui-input-block">
<input type="radio" name="sale_show" value="1" title="显示" {if $goods_info['sale_show'] > 0} checked {/if}>
<input type="radio" name="sale_show" value="0" title="隐藏" {if $goods_info['sale_show'] == 0} checked {/if}>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">项目海报:</label>
<div class="layui-input-inline">
<select name="template_id" lay-search="" lay-verify="">
<option value="">请选择项目海报</option>
{foreach name="$poster_list" item="vo"}
<option value="{$vo['template_id']}" {if $goods_info.template_id == $vo.template_id} selected {/if}>{$vo['poster_name']}</option>
{/foreach}
</select>
</div>
</div>
{if $form_is_exit}
<div class="layui-form-item">
<label class="layui-form-label">项目表单:</label>
<div class="layui-input-block len-mid">
<select name="form_id">
<option value="0">请选择项目表单</option>
{foreach name="$form_list" item="vo"}
<option value="{$vo.id}" {if $goods_info.form_id == $vo.id} selected {/if}>{$vo.form_name}</option>
{/foreach}
</select>
</div>
<div class="word-aux">
<a href="{:href_url('form://shop/form/addform?form_type=goods')}" class="text-color" target="_blank">创建项目表单</a>
<a href="javascript:;" onclick="refreshFormList()" class="text-color">刷新</a>
</div>
</div>
{/if}
</div>
</div>
</div>
</div>
<input type="hidden" name="goods_id" value="{$goods_info['goods_id']}" />
<input type="hidden" name="goods_spec_format" value="{$goods_info['goods_spec_format']}" />
<input type="hidden" name="goods_image" value="{$goods_info['goods_image']}" />
<input type="hidden" name="goods_attr_format" value="{$goods_info['goods_attr_format']}" />
<div class="fixed-btn">
<button class="layui-btn layui-btn-primary border-color text-color js-prev" lay-filter="prev">上一步</button>
<button class="layui-btn js-save" lay-submit="" lay-filter="save">保存</button>
<button class="layui-btn layui-btn-primary border-color text-color js-next" lay-submit="" lay-filter="next">下一步</button>
</div>
</div>
<!--规格项模板-->
<script type="text/html" id="specTemplate">
{{# for(var i=0;i<d.list.length;i++){ }}
<div class="spec-item" data-index="{{i}}">
<div class="layui-form-item spec">
<label class="layui-form-label">规格项{{i+1}}</label>
<div class="layui-input-inline">
<select name="spec_item">
<option value="0"></option>
{{# if(d.list[i].spec_name != ''){ }}
<option value="{{d.list[i].spec_id}}" data-attr-name="{{d.list[i].spec_name}}" selected>{{d.list[i].spec_name}}</option>
{{# }else{ }}
{{# } }}
</select>
<i class="layui-icon layui-icon-close" data-index="{{i}}"></i>
</div>
{{# if(i==0){ }}
<div class="layui-input-inline">
{{# if(d.add_spec_img){ }}
<input type="checkbox" name="add_spec_img" title="添加规格图片" lay-skin="primary" lay-filter="add_spec_img" checked>
{{# }else{ }}
<input type="checkbox" name="add_spec_img" title="添加规格图片" lay-skin="primary" lay-filter="add_spec_img">
{{# } }}
</div>
{{# } }}
</div>
{{# if(d.list[i].spec_name != ''){ }}
<div class="layui-form-item spec-value">
{{# }else{ }}
<div class="layui-form-item spec-value" style="display:none;">
{{# } }}
<label class="layui-form-label"></label>
<div class="layui-input-block spec-value">
{{# if(d.list[i].value.length){ }}
<ul>
{{# for(var j=0;j<d.list[i].value.length;j++){ }}
<li data-index="{{j}}" data-parent-index="{{i}}" >
{{# if(i==0 && d.add_spec_img){ }}
<div class="img-wrap">
{{# if(d.list[i].value[j].image){ }}
<img src="{{ns.img(d.list[i].value[j].image)}}" alt="">
{{# }else{ }}
<img src="SHOP_IMG/goods_spec_value_empty.png" alt="">
{{# } }}
</div>
{{# } }}
<span title="双击可编辑规格值" ondblclick="$(this).attr('contenteditable',true);$(this).focus()" class="spec-txt" data-spec_value_name="{{d.list[i].value[j].spec_value_name}}" data-parent-index="{{i}}" data-index="{{j}}">{{d.list[i].value[j].spec_value_name}}</span>
<!--{{1# if(d.list[i].value[j].is_delete === undefined){ }}-->
<i class="layui-icon layui-icon-close" data-parent-index="{{i}}" data-index="{{j}}"></i>
<!--{{1# } }}-->
</li>
{{# } }}
</ul>
{{# } }}
<a class="text-color" href="javascript:;" data-index="{{i}}">+添加规格值</a>
<div class="add-spec-value-popup" data-index="{{i}}">
<select name="spec_value_item"></select>
<button class="layui-btn layui-btn-primary border-color text-color js-cancel-spec-value">取消</button>
</div>
</div>
</div>
</div>
{{# } }}
</script>
<!--SKU列表模板-->
<script type="text/html" id="skuTableTemplate">
{{# if(d.skuList.length){ }}
<table class="layui-table">
<colgroup></colgroup>
<thead>
<tr>
{{# if(d.showSpecName){ }}
<th colspan="{{d.colSpan}}" style="min-width: 60px;">项目规格</th>
{{# } }}
<th rowspan="{{d.rowSpan}}">SKU图片</th>
<th rowspan="{{d.rowSpan}}">副标题</th>
<th rowspan="{{d.rowSpan}}"><span class="required">*</span></th>
<th rowspan="{{d.rowSpan}}">划线价</th>
<th rowspan="{{d.rowSpan}}">成本价</th>
<th rowspan="{{d.rowSpan}}"><span class="required">*</span></th>
<th rowspan="{{d.rowSpan}}">库存预警</th>
<th rowspan="{{d.rowSpan}}">服务时长</th>
<th rowspan="{{d.rowSpan}}">商品编码多个编码以英文逗号分割</th>
<th rowspan="{{d.rowSpan}}" style="white-space: nowrap;">默认展示</th>
</tr>
{{# if(d.colSpan>1){ }}
<tr>
{{# for(var i=0;i<d.specList.length;i++){ }}
{{# if(d.specList[i].spec_name && d.specList[i].value.length> 0){ }}
<th>{{d.specList[i].spec_name}}</th>
{{# } }}
{{# } }}
</tr>
{{# } }}
</thead>
<tbody>
{{# for(var i=0;i<d.skuList.length;i++){ }}
<tr>
<td class="sku_imgs" id="sku_img_{{i}}" style="width: 130px;">
{{# for(var j=0;j<d.skuList[i].sku_images_arr.length;j++){ }}
<div class="img-wrap" data-index="{{j}}" data-parent-index="{{i}}">
<a href="javascript:void(0)">
<img src="{{ns.img(d.skuList[i].sku_images_arr[j])}}" layer-src />
</a>
<div class="operation">
<i title="图片预览" class="iconfont iconreview js-preview"></i>
<i title="删除图片" class="layui-icon layui-icon-delete js-delete"></i>
</div>
</div>
{{# } }}
{{# if(d.skuList[i].sku_images_arr.length<d.goods_sku_max){ }}
<div class="upload-sku-img" data-index="{{i}}"><i class="layui-icon layui-icon-add-1"></i></div>
{{# } }}
</td>
<td>
<input type="text" name="spec_name" placeholder="副标题" maxlength="100" value="{{d.skuList[i].spec_name}}" class="layui-input" autocomplete="off" data-index="{{i}}">
</td>
<td>
<input type="text" name="price" placeholder="销售价" lay-verify="sku_price" value="{{d.skuList[i].price}}" class="layui-input" autocomplete="off" data-index="{{i}}">
</td>
<td>
<input type="text" name="market_price" placeholder="划线价" value="{{d.skuList[i].market_price}}" lay-verify="sku_market_price" class="layui-input" autocomplete="off" data-index="{{i}}">
</td>
<td>
<input type="text" name="cost_price" placeholder="成本价" value="{{d.skuList[i].cost_price}}" lay-verify="sku_cost_price" class="layui-input" autocomplete="off" data-index="{{i}}">
</td>
<td>
<input type="text" name="stock" placeholder="库存" value="{{d.skuList[i].stock}}" lay-verify="sku_stock" class="layui-input" autocomplete="off" data-index="{{i}}">
</td>
<td>
<input type="text" name="stock_alarm" placeholder="库存预警" value="{{d.skuList[i].stock_alarm}}" lay-verify="sku_stock_alarm" class="layui-input" autocomplete="off" data-index="{{i}}">
</td>
<td>
<input type="number" name="service_length" placeholder="服务时长" value="{{d.skuList[i].service_length}}" maxlength="50" class="layui-input" autocomplete="off" data-index="{{i}}" lay-verify="verify_num">
</td>
<td>
<input type="text" name="sku_no" placeholder="商品编码" value="{{d.skuList[i].sku_no}}" maxlength="50" class="layui-input" autocomplete="off" data-index="{{i}}">
</td>
<td style="min-width: 40px;">
{{# if(d.skuList[i].is_default == 1) { }}
<input type="checkbox" data-index="{{i}}" name="is_default" lay-filter="is_default" lay-skin="switch" checked>
{{# }else { }}
<input type="checkbox" data-index="{{i}}" name="is_default" lay-filter="is_default" lay-skin="switch">
{{# } }}
</td>
</tr>
{{# } }}
</tbody>
</table>
{{# } }}
<div class="word-aux text-color" style="margin: 10px 0 0 0;">默认展示是多规格项目在客户访问项目时默认显示的项目规格</div>
</script>
<!--项目主图列表-->
<script type="text/html" id="goodsImage">
{{# if(d.list.length){ }}
{{# for(var i=0;i<d.list.length;i++){ }}
<div class="item upload_img_square_item" data-index="{{i}}">
<div class="img-wrap">
<img src="{{ns.img(d.list[i],'small')}}" layer-src="{{ns.img(d.list[i],'big')}}">
</div>
<div class="operation">
<i title="图片预览" class="iconfont iconreview js-preview"></i>
<i title="删除图片" class="layui-icon layui-icon-delete js-delete" data-index="{{i}}"></i>
<div class="replace_img" data-index="{{i}}">点击替换</div>
</div>
</div>
{{# } }}
{{# if(d.list.length < d.max){ }}
<div class="item js-add-goods-image upload_img_square">+</div>
{{# } }}
{{# }else{ }}
<div class="item js-add-goods-image upload_img_square">+</div>
{{# } }}
</script>
<script src="__STATIC__/ext/drag-arrange.js"></script>
<script src="__STATIC__/ext/video/videojs-ie8.min.js"></script>
<script src="__STATIC__/ext/video/video.min.js"></script>
<script src="__STATIC__/ext/searchable_select/searchable_select.js"></script>
<script src="SHOP_JS/category_select.js?time=20240821"></script>
<script src="SHOP_JS/goods_edit_common.js?time=20250527"></script>
<script src="ADDON_CARDSERVICE_JS/service_goods_edit.js?v=1.1"></script>