detail.html 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487
  1. {extend name="app/shop/view/base.html"/}
  2. {block name="resources"}
  3. <style>
  4. .card-common {margin-top: 15px;margin-bottom: 0;box-shadow: initial;}
  5. .card-common .layui-card-body{padding-top: 0;}
  6. .promotion-view{display:flex;flex-wrap:wrap}
  7. .promotion-view-item{width:33.3%;padding-right:10px;box-sizing:border-box;line-height:30px}
  8. .promotion-view-item-line{padding-right:10px;box-sizing:border-box;line-height:30px;overflow: hidden;width: 100%}
  9. .promotion-view-item-custom-label{float:left}
  10. .promotion-view-item-custom-box{float:left}
  11. .promotion-stat-view{display:flex;flex-wrap:wrap}
  12. .promotion-stat-view .promotion-stat-item{width:25%;padding:0 15px 10px 15px;box-sizing:border-box}
  13. .promotion-stat-view .promotion-stat-item .promotion-stat-item-title{color:#909399;font-size:14px;margin-top:5px}
  14. .promotion-stat-view .promotion-stat-item .promotion-stat-item-value{color:#303133;font-size:26px;margin-top:10px}
  15. .todo-list .promotion-stat-item{flex:1;width:0;cursor:pointer}
  16. .layui-layout-admin .layui-body .body-content {background: 0 0;padding: 0;}
  17. .gift-card-goods span{cursor: pointer; color: var(--base-color);}
  18. .layui-tab-title{margin-bottom: 15px;}
  19. .layui-layout-admin .single-filter-box.top {padding-top: 0 !important;}
  20. .add-way .add-way-item{display: flex;margin: 8px 0;align-items: center;}
  21. .add-way .add-way-item input{margin: 0 10px;}
  22. .add-way .add-way-item .layui-form-radio{margin-right: 0;}
  23. .disabled-click{pointer-events: none;color: #999 !important;}
  24. #addFile{margin-left: 10px; cursor: pointer;color: var(--base-color);}
  25. .card-goods .layui-table{margin-bottom: 0;margin-top: 0;}
  26. #card_right_type_goods #goods{border: 0;}
  27. .card-goods .layui-table .goods-title{display: flex;align-items: center;}
  28. .card-goods .layui-table .goods-title .goods-img{width: 55px;height: 55px;line-height: 55px;flex-shrink: 0;margin-right: 10px;}
  29. .card-goods .layui-table .goods-title .goods-img img{max-width: 100%;max-height: 100%;}
  30. .card-goods .layui-table-body{overflow: auto;max-height: 425px;margin-bottom: 15px;border-bottom: 1px solid #e6e6e6;}
  31. .card-goods .layui-table-body .layui-table{border: none;}
  32. .card-goods .layui-table-body tbody tr:last-of-type td{border: none;}
  33. .card-goods .layui-table-head tr th:last-of-type{text-align: right;}
  34. .card-goods .layui-table-body tr td:last-of-type{text-align: right;}
  35. .card-tab{margin-bottom: 15px;margin-top: 15px;}
  36. /* 商品列表 */
  37. .shop-information-table > p{padding-left: 5px;padding-bottom: 5px;}
  38. .shop-information-table table {width: 100%;border: 1px solid rgb(238,238,238);}
  39. .shop-information-table .table-body {max-height: 400px;overflow: auto;}
  40. .table-trOne{height: 48px;background:rgb(245,245,245) ;}
  41. .shop-information-table th{text-align: left;padding-left:28px;box-sizing: border-box;font-weight: 500;color:#333333;}
  42. .shop-information-table th:last-child{border:none;}
  43. .table-trTow{width:100%;height:60px;border-top:1px solid rgb(238,238,238);}
  44. .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);}
  45. .table-trTow>td:nth-child(5){color:rgb(255,106,0)}
  46. </style>
  47. {/block}
  48. {block name="main"}
  49. <div class="layui-card card-common card-brief">
  50. <div class="layui-card-header">
  51. <div>
  52. <span class="card-title">基本信息</span>
  53. </div>
  54. </div>
  55. <div class="layui-card-body">
  56. <div class="promotion-view">
  57. <div class="promotion-view-item">
  58. <label>礼品卡名称:</label>
  59. <span>{$detail.card_name}</span>
  60. </div>
  61. <div class="promotion-view-item grouping">
  62. <label>分组:</label>
  63. <span>{$detail.category_name}</span>
  64. </div>
  65. <div class="promotion-view-item grouping">
  66. <label>卡类型:</label>
  67. <span>{$detail.card_type_name}</span>
  68. </div>
  69. <div class="promotion-view-item">
  70. <label>权益类型:</label>
  71. <span>{$detail.card_right_type=='goods' ? '礼品卡' : '储值卡'}</span>
  72. </div>
  73. {if $detail.card_right_type=='balance'}
  74. <div class="promotion-view-item">
  75. <label>储值余额:</label>
  76. <span>{$detail.balance}元</span>
  77. </div>
  78. {/if}
  79. {if $detail.card_type=='virtual'}
  80. <div class="promotion-view-item">
  81. <label>销售价:</label>
  82. <span>{$detail.card_price}元</span>
  83. </div>
  84. {/if}
  85. <div class="promotion-view-item">
  86. <label>有效期:</label>
  87. <span>
  88. {if $detail.validity_type=='forever'}
  89. 永久有效
  90. {elseif $detail.validity_type=='date'/}
  91. 有效期至{:date('Y-m-d H:i:s',$detail.validity_time)}
  92. {elseif $detail.validity_type=='day'/}
  93. 领取后{$detail.validity_day}天有效
  94. {/if}
  95. </span>
  96. </div>
  97. {if $detail.card_type=='virtual'}
  98. <div class="promotion-view-item">
  99. <label>是否允许转赠:</label>
  100. <span>{if $detail.is_allow_transfer == 1}是{else/}否{/if}</span>
  101. </div>
  102. {/if}
  103. </div>
  104. </div>
  105. </div>
  106. <div class="layui-card card-common card-brief">
  107. <div class="layui-card-header">
  108. <div>
  109. <span class="card-title">数据统计</span>
  110. </div>
  111. </div>
  112. <div class="layui-card-body">
  113. <div class="promotion-stat-view todo-list">
  114. {if $detail.card_type=='virtual'}
  115. <div class="promotion-stat-item" >
  116. <div class="promotion-stat-item-title">卡销量</div>
  117. <div class="promotion-stat-item-value">{$detail.sale_num}</div>
  118. </div>
  119. <div class="promotion-stat-item" >
  120. <div class="promotion-stat-item-title">已使用</div>
  121. <div class="promotion-stat-item-value">{$detail.use_count}</div>
  122. </div>
  123. <div class="promotion-stat-item" >
  124. <div class="promotion-stat-item-title">未使用</div>
  125. <div class="promotion-stat-item-value">{$detail.sale_num - $detail.use_count}</div>
  126. </div>
  127. {/if}
  128. {if $detail.card_type=='real'}
  129. <div class="promotion-stat-item" >
  130. <div class="promotion-stat-item-title">制卡数</div>
  131. <div class="promotion-stat-item-value">{$detail.card_count}</div>
  132. </div>
  133. <div class="promotion-stat-item" >
  134. <div class="promotion-stat-item-title">激活数</div>
  135. <div class="promotion-stat-item-value">{$detail.activate_count}</div>
  136. </div>
  137. <div class="promotion-stat-item" >
  138. <div class="promotion-stat-item-title">已使用</div>
  139. <div class="promotion-stat-item-value">{$detail.use_count}</div>
  140. </div>
  141. <div class="promotion-stat-item" >
  142. <div class="promotion-stat-item-title">未使用</div>
  143. <div class="promotion-stat-item-value">{$detail.activate_count - $detail.use_count}</div>
  144. </div>
  145. {/if}
  146. </div>
  147. </div>
  148. </div>
  149. <div class="layui-card card-common card-brief">
  150. <div class="layui-card-header">
  151. <div>
  152. <span class="card-title">使用规则</span>
  153. </div>
  154. </div>
  155. <div class="layui-card-body">
  156. {if $detail.card_right_type=='goods'}
  157. {if $detail.card_right_goods_type == 'all'}
  158. <p>礼品卡持卡人兑换时可从以下商品列表中任选{$detail.card_right_goods_count}件。</p>
  159. {else/}
  160. <p>礼品卡持卡人兑换时可从按照商品列表中商品数量进行兑换。</p>
  161. {/if}
  162. {else/}
  163. <p>礼品卡持卡人兑换时将储值卡的储值余额充值到持卡人账户余额中</p>
  164. {/if}
  165. </div>
  166. </div>
  167. <!-- 商品信息 -->
  168. {if $detail['card_right_type'] == 'goods'}
  169. <div class="layui-card card-common card-brief">
  170. <div class="layui-card-header">
  171. <div>
  172. <span class="card-title">商品信息</span>
  173. </div>
  174. </div>
  175. <div class="layui-card-body shop-information-table">
  176. <div class="table-head">
  177. <table lay-skin="line">
  178. <colgroup>
  179. <col width="80%">
  180. {if $detail.card_right_goods_type == 'all'}
  181. <col width="20%">
  182. {/if}
  183. {if $detail.card_right_goods_type != 'all'}
  184. <col width="10%">
  185. <col width="10%">
  186. {/if}
  187. <col>
  188. </colgroup>
  189. <thead>
  190. <tr class="table-trOne">
  191. <th lay-data="{field:'product_name', width:200}">商品</th>
  192. <th lay-data="{field:'price'}">价格</th>
  193. {if $detail.card_right_goods_type != 'all'}
  194. <th lay-data="{field:'sale_num'}">数量</th>
  195. {/if}
  196. </tr>
  197. </thead>
  198. </table>
  199. </div>
  200. <div class="table-body">
  201. <table lay-skin="line">
  202. <colgroup>
  203. <col width="80%">
  204. {if $detail.card_right_goods_type == 'all'}
  205. <col width="20%">
  206. {/if}
  207. {if $detail.card_right_goods_type != 'all'}
  208. <col width="10%">
  209. <col width="10%">
  210. {/if}
  211. <col>
  212. </colgroup>
  213. <tbody>
  214. {foreach $detail['goods_list'] as $list_k => $order_goods_item}
  215. <tr class="table-trTow">
  216. <td>{$order_goods_item.sku_info ? $order_goods_item.sku_info.sku_name : ''}</td>
  217. <td>{$order_goods_item.sku_info ? $order_goods_item.sku_info.price : ''}</td>
  218. {if $detail.card_right_goods_type != 'all'}
  219. <td>{$order_goods_item.goods_num}</td>
  220. {/if}
  221. </tr>
  222. {/foreach}
  223. </tbody>
  224. </table>
  225. </div>
  226. </div>
  227. </div>
  228. {/if}
  229. <div class="layui-card card-common card-brief">
  230. <div class="layui-card-header">
  231. <div>
  232. <span class="card-title">礼品卡列表</span>
  233. </div>
  234. </div>
  235. <div class="layui-card-body">
  236. <div class="screen layui-collapse card-tab" lay-filter="card_tab">
  237. <div class="layui-colla-item">
  238. <form class="layui-colla-content layui-form layui-show">
  239. <div class="layui-form-item">
  240. <div class="layui-inline">
  241. <label class="layui-form-label">礼品卡编号</label>
  242. <div class="layui-input-inline">
  243. <input type="text" name="search_text" placeholder="请输入礼品卡编号" autocomplete="off" class="layui-input">
  244. </div>
  245. </div>
  246. </div>
  247. <div class="form-row">
  248. <button type="button" class="layui-btn" lay-filter="search" lay-submit>筛选</button>
  249. <button type="reset" class="layui-btn layui-btn-primary">重置</button>
  250. </div>
  251. </form>
  252. </div>
  253. </div>
  254. <div class="layui-tab table-tab" lay-filter="card_state_tab">
  255. <ul class="layui-tab-title">
  256. <li class="layui-this" data-status="all">全部</li>
  257. {foreach $status_list as $k => $v}
  258. <li data-status="{$k}">{$v}</li>
  259. {/foreach}
  260. </ul>
  261. <div class="layui-tab-content poster_list">
  262. <!-- 列表 -->
  263. <table id="poster_list" lay-filter="poster_list"></table>
  264. </div>
  265. </div>
  266. </div>
  267. </div>
  268. {/block}
  269. {block name="script"}
  270. <script type='text/html' id="promotion_list_item_box_html">
  271. <div class="promotion-list-item-title">
  272. <div class="promotion-list-item-title-icon">
  273. <img src="{{ ns.img(d.sku_image) }}" alt="">
  274. </div>
  275. <p class="promotion-list-item-title-name multi-line-hiding">{{ d.sku_name }}</p>
  276. </div>
  277. </script>
  278. <script type="text/html" id="operation">
  279. <div class="table-btn">
  280. {{# if(d.status == 'to_activate'){ }}
  281. <a class="layui-btn" lay-event="delete">删除</a>
  282. {{# } }}
  283. {{# if(d.status != 'to_activate'){ }}
  284. <a class="layui-btn" lay-event="info">详情</a>
  285. {{# } }}
  286. </div>
  287. </script>
  288. <script>
  289. var categoryList = {:json_encode($category_list)} ? {:json_encode($category_list)} : [];
  290. var category_id = {$detail.category_id};
  291. var giftcard_id = {$detail.giftcard_id};
  292. categoryList.forEach(item => {
  293. if(item.category_id == category_id){
  294. $(".grouping span").text(item.name);
  295. }
  296. });
  297. var table,element,form,laytpl,repeat_flag=false;
  298. layui.use(['form', 'element', 'laytpl','laydate'], function () {
  299. laytpl = layui.laytpl;
  300. element = layui.element;
  301. form = layui.form;
  302. form.render();
  303. //监听Tab切换,以改变地址hash值
  304. element.on('tab(card_state_tab)', function () {
  305. table.reload({
  306. page: {
  307. curr: 1
  308. },
  309. where: {
  310. 'status': this.getAttribute('data-status')
  311. }
  312. });
  313. });
  314. /**
  315. * 搜索功能
  316. */
  317. form.on('submit(search)', function (data) {
  318. table.reload({
  319. page: {curr: 1},
  320. where: data.field
  321. });
  322. });
  323. table = new Table({
  324. elem: '#poster_list',
  325. url: ns.url("giftcard://shop/card/lists", {'giftcard_id': giftcard_id}),
  326. cols: [
  327. {if $detail.card_type=='virtual'}
  328. [{
  329. field: 'card_no',
  330. title: '卡号',
  331. unresize: 'false',
  332. width: '20%',
  333. }, {
  334. field: 'member_nickname',
  335. title: '所属会员',
  336. unresize: 'false',
  337. width: '15%',
  338. templet: function (data) {
  339. var html = `<a class="text-color" href="${ns.url('shop/member/editmember',{'member_id':data.member_id})}" target="_blank">${data.member_nickname || '--'}</a>`
  340. return html;
  341. }
  342. }, {
  343. title: '获取时间',
  344. unresize: 'false',
  345. width: '15%',
  346. templet: function (data) {
  347. return ns.time_to_date(data.create_time);
  348. }
  349. }, {
  350. field: 'status_name',
  351. title: '状态',
  352. unresize: 'false',
  353. width: '15%'
  354. }, {
  355. field: 'order_no',
  356. title: '订单',
  357. unresize: 'false',
  358. width: '15%',
  359. templet: function (data) {
  360. var html = `<a class="text-color" href="${ns.url('giftcard://shop/order/detail',{'order_id':data.order_id})}" target="_blank">${data.order_no}</a>`
  361. return html;
  362. }
  363. },{
  364. title: '操作',
  365. toolbar: '#operation',
  366. unresize: 'false',
  367. align : 'right'
  368. }]
  369. {else /}
  370. [{
  371. field: 'card_no',
  372. title: '卡号',
  373. unresize: 'false',
  374. width: '20%',
  375. },{
  376. field: 'card_cdk',
  377. title: '秘钥',
  378. unresize: 'false',
  379. width: '20%',
  380. }, {
  381. title: '生成时间',
  382. unresize: 'false',
  383. width: '15%',
  384. templet: function (data) {
  385. return ns.time_to_date(data.create_time);
  386. }
  387. }, {
  388. field: 'member_nickname',
  389. title: '激活会员',
  390. unresize: 'false',
  391. width: '10%',
  392. templet: function (data) {
  393. var html;
  394. if(data.member_id)
  395. html = `<a class="text-color" href="${ns.url('shop/member/editmember',{'member_id':data.member_id})}" target="_blank">${data.member_nickname}</a>`;
  396. else
  397. html = `<a>--</a>`;
  398. return html;
  399. }
  400. }, {
  401. field: 'sort',
  402. unresize: 'false',
  403. title: '激活时间',
  404. width: '15%',
  405. templet: function (data) {
  406. if(data.activate_time == 0)
  407. return "--";
  408. else
  409. return ns.time_to_date(data.activate_time);
  410. }
  411. }, {
  412. field: 'status_name',
  413. title: '状态',
  414. unresize: 'false',
  415. width: '10%'
  416. },{
  417. title: '操作',
  418. toolbar: '#operation',
  419. unresize: 'false',
  420. align : 'right'
  421. }]
  422. {/if}
  423. ]
  424. });
  425. /**
  426. * 监听工具栏操作
  427. */
  428. table.tool(function (obj) {
  429. var data = obj.data;
  430. switch (obj.event) {
  431. case 'delete': //删除
  432. deleteCard(data.card_id);
  433. break;
  434. case 'info': //删除
  435. window.open(ns.url("giftcard://shop/card/detail",{card_id:data.card_id}))
  436. break;
  437. }
  438. });
  439. /**
  440. * 删除
  441. */
  442. function deleteCard(id) {
  443. layer.confirm('确定要删除该卡项记录吗?', function () {
  444. if (repeat_flag) return;
  445. repeat_flag = true;
  446. $.ajax({
  447. url: ns.url("giftcard://shop/card/delete"),
  448. data: {
  449. card_id: id
  450. },
  451. dataType: 'JSON',
  452. type: 'POST',
  453. success: function (res) {
  454. layer.msg(res.message);
  455. repeat_flag = false;
  456. if (res.code == 0) {
  457. table.reload({
  458. page: {
  459. curr: 1
  460. },
  461. });
  462. }
  463. }
  464. });
  465. }, function () {
  466. layer.close();
  467. repeat_flag = false;
  468. });
  469. }
  470. })
  471. </script>
  472. {/block}