config.html 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512
  1. {extend name="app/shop/view/base.html"/}
  2. {block name="resources"}
  3. <style>
  4. .good-name, .good-price {
  5. line-height: 34px;
  6. }
  7. @media screen and (min-width: 1514px) {
  8. .len-short {
  9. display: inline-block;
  10. width: 80px !important;
  11. }
  12. }
  13. @media screen and (max-width: 1513px) {
  14. .len-short {
  15. display: inline-block;
  16. width: 58px !important;
  17. }
  18. }
  19. #rule_list .layui-input {
  20. display: inline-block;
  21. }
  22. .layui-table[lay-size=lg] td, .layui-table[lay-size=lg] th {
  23. padding: 0px;
  24. }
  25. input[disabled] {
  26. background-color: #F5F5F5;
  27. }
  28. .vip_type{
  29. background-color: #393D49;
  30. color:#F9F9A3 !important;
  31. padding:2px 4px;
  32. border-radius:3px;
  33. margin-right: 6px;
  34. }
  35. .layui-form-label{
  36. width: 150px;
  37. }
  38. .layui-form-label + .layui-input-block{
  39. margin-left: 150px;
  40. }
  41. .word-aux{
  42. margin-left: 150px;
  43. }
  44. </style>
  45. {/block}
  46. {block name="body"}
  47. <div class="layui-form">
  48. <div class="layui-card card-common">
  49. <div class="layui-card-body">
  50. <div class="layui-form-item goods-image-wrap">
  51. <label class="layui-form-label">是否参与:</label>
  52. <div class="layui-input-block">
  53. <input type="radio" name="is_consume_discount" lay-filter="is_consume_discount" value="0" title="不参与" {if $goods_info['is_consume_discount'] == 0 }checked{/if}>
  54. <input type="radio" name="is_consume_discount" lay-filter="is_consume_discount" value="1" title="参与" {if $goods_info['is_consume_discount'] == 1 }checked{/if}>
  55. </div>
  56. <div class="word-aux">商品参与会员价后指定会员等级会按照下面会员优惠设置价格购买。</div>
  57. </div>
  58. {if condition="$goods_info.is_consume_discount == 0"}
  59. <div class="layui-form-item discount_config layui-hide">
  60. {else/}
  61. <div class="layui-form-item discount_config">
  62. {/if}
  63. <label class="layui-form-label">优惠设置:</label>
  64. <div class="layui-input-inline good-name">
  65. <input type="radio" name="discount_config" lay-filter="discount_config" value="0" title="默认规则" {if $goods_info['discount_config'] == 0 }checked{/if}>
  66. <input type="radio" name="discount_config" lay-filter="discount_config" value="1" title="单独设置" {if $goods_info['discount_config'] == 1 }checked{/if}>
  67. </div>
  68. </div>
  69. {if condition="$goods_info.is_consume_discount == 0"}
  70. <div class="layui-form-item discount_config_rule layui-hide">
  71. {else/}
  72. {if condition="$goods_info.discount_config == 0"}
  73. <div class="layui-form-item discount_config_rule">
  74. {else/}
  75. <div class="layui-form-item discount_config_rule layui-hide">
  76. {/if}
  77. {/if}
  78. <label class="layui-form-label"></label>
  79. <div class="layui-input-block">
  80. <table id="discount_set"></table>
  81. </div>
  82. </div>
  83. {if condition="$goods_info.is_consume_discount == 0"}
  84. <div class="layui-form-item discount_method layui-hide">
  85. {else/}
  86. {if condition="$goods_info.discount_config == 0"}
  87. <div class="layui-form-item discount_method layui-hide">
  88. {else/}
  89. <div class="layui-form-item discount_method">
  90. {/if}
  91. {/if}
  92. <label class="layui-form-label">优惠方式:</label>
  93. <div class="layui-input-inline good-name">
  94. <input type="radio" name="discount_method" value="discount" lay-filter="discount_method" title="打折" checked>
  95. <input type="radio" name="discount_method" value="manjian" lay-filter="discount_method" title="减现" {if $goods_info['discount_method'] == "manjian" }checked{/if}>
  96. <input type="radio" name="discount_method" value="fixed_price" lay-filter="discount_method" title="指定价格" {if $goods_info['discount_method'] == "fixed_price" }checked{/if}>
  97. </div>
  98. </div>
  99. {if condition="$goods_info.is_consume_discount == 0"}
  100. <div class="layui-form-item member_price_table layui-hide" id="personal_rule">
  101. {else/}
  102. {if condition="$goods_info.discount_config == 0"}
  103. <div class="layui-form-item member_price_table layui-hide" id="personal_rule">
  104. {else/}
  105. <div class="layui-form-item member_price_table" id="personal_rule">
  106. {/if}
  107. {/if}
  108. <label class="layui-form-label"></label>
  109. <div class="layui-input-block">
  110. <table id="discount_type" lay-filter="discount_type"></table>
  111. </div>
  112. </div>
  113. <div class="form-row">
  114. <button class="layui-btn" lay-submit lay-filter="save" id="save_member_price">保存</button>
  115. <button class="layui-btn layui-btn-primary" onclick="back()" id="back_goods_list">返回</button>
  116. </div>
  117. <input type="hidden" name="goods_id" value="{$goods_info.goods_id}"/>
  118. </div>
  119. </div>
  120. <div class="single-filter-box">
  121. </div>
  122. </div>
  123. {/block}
  124. {block name="script"}
  125. <script type="text/html" id="toolbarOperation">
  126. {foreach $level_list as $k => $v}
  127. <button class="layui-btn layui-btn-primary" lay-event="member_price_{$v.level_id}">{$v.level_name}</button>
  128. {/foreach}
  129. </script>
  130. <script>
  131. var param = 0;
  132. var goods_id = "";
  133. var is_consume_discount = {$goods_info.is_consume_discount}; // 是否参与折扣
  134. var discount_config = {$goods_info.discount_config}; // 优惠规则设置
  135. var level = {:json_encode($level_list, JSON_UNESCAPED_UNICODE)}; // 等级
  136. var goods_info = {:json_encode($goods_info, JSON_UNESCAPED_UNICODE)}; // 商品信息
  137. var dis_type = goods_info.discount_method; // 优惠方式
  138. var sku_data = goods_info.sku_data; // sku列表
  139. var table, tableType, form, laydate, repeat_flag = false;
  140. layui.use(['form', 'laydate'], function () {
  141. form = layui.form;
  142. laydate = layui.laydate;
  143. table = new Table({
  144. elem: "#discount_set",
  145. cols: [
  146. [{
  147. field: 'goods_name',
  148. title: '会员等级',
  149. width: 120,
  150. unresize: 'false',
  151. fixed: 'left',
  152. templet: function(data) {
  153. return '会员享受折扣';
  154. }
  155. },
  156. {foreach $level_list as $k => $v}
  157. {
  158. title: '{if $v.level_type ==1}<span class="vip_type">SVIP</span>{/if}{$v.level_name}',
  159. unresize: 'false',
  160. width: 170,
  161. templet: function(data) {
  162. return {$v.consume_discount} + '%';
  163. }
  164. },
  165. {/foreach}
  166. ]],
  167. data: [{}],
  168. page: false
  169. });
  170. if (is_consume_discount == 1 && discount_config == 1) {
  171. sku_list = skuList(dis_type);
  172. renderTableType(sku_list);
  173. }
  174. $(".layui-input").each(function () {
  175. $(this).on('input', function () {
  176. var _this = $(this);
  177. if (_this.val() > 0) {
  178. $(this).siblings().attr('disabled', true);
  179. $(this).siblings().removeAttr("lay-verify");
  180. } else {
  181. $(this).siblings().attr('disabled', false);
  182. $(this).siblings().attr("lay-verify", "required|flnum");
  183. }
  184. });
  185. });
  186. /**
  187. * 表单提交
  188. */
  189. form.on('submit(save)', function (data) {
  190. if (repeat_flag) return;
  191. repeat_flag = true;
  192. $.ajax({
  193. type: 'POST',
  194. dataType: 'JSON',
  195. url: ns.url("memberprice://shop/goods/config"),
  196. data: data.field,
  197. async: false,
  198. success: function (res) {
  199. repeat_flag = false;
  200. layer.msg(res.message);
  201. if (res.code == 0) {
  202. param = 1;
  203. }
  204. }
  205. })
  206. });
  207. //监听是否参与会员等级折扣
  208. form.on('radio(is_consume_discount)', function(data){
  209. var value = data.value;
  210. is_consume_discount = value;
  211. if(value == 1){
  212. //获取优惠设置值
  213. var discount_config = $("input[name='discount_config']:checked").val();
  214. if(discount_config == 1){
  215. $(".discount_config").removeClass("layui-hide");
  216. $(".discount_config_rule").addClass("layui-hide");
  217. $(".discount_method").removeClass("layui-hide");
  218. $(".member_price_table").removeClass("layui-hide");
  219. } else {
  220. $(".discount_config").removeClass("layui-hide");
  221. $(".discount_config_rule").removeClass("layui-hide");
  222. }
  223. sku_list = skuList(dis_type);
  224. renderTableType(sku_list);
  225. }
  226. if(value == 0){
  227. $(".discount_config").addClass("layui-hide");
  228. $(".discount_config_rule").addClass("layui-hide");
  229. $(".discount_method").addClass("layui-hide");
  230. $(".member_price_table").addClass("layui-hide");
  231. }
  232. });
  233. //监听优惠设置
  234. form.on('radio(discount_config)', function(data){
  235. var value = data.value;
  236. if(value == 1){
  237. $(".discount_config_rule").addClass("layui-hide");
  238. $(".discount_method").removeClass("layui-hide");
  239. $(".member_price_table").removeClass("layui-hide");
  240. sku_list = skuList(dis_type);
  241. renderTableType(sku_list);
  242. }
  243. if(value == 0){
  244. $(".discount_config_rule").removeClass("layui-hide");
  245. $(".discount_method").addClass("layui-hide");
  246. $(".member_price_table").addClass("layui-hide");
  247. $("#personal_rule input").attr("lay-verify", "");
  248. }
  249. });
  250. //监听成为分销商条件选择
  251. form.on('radio(discount_method)', function(data){
  252. var value = data.value;
  253. if(value == "discount"){
  254. dis_type = "discount";
  255. sku_list = skuList(dis_type);
  256. renderTableType(sku_list);
  257. }
  258. if(value == 'manjian'){
  259. dis_type = "manjian";
  260. sku_list = skuList(dis_type);
  261. renderTableType(sku_list);
  262. }
  263. if(value == 'fixed_price'){
  264. dis_type = "fixed_price";
  265. sku_list = skuList(dis_type);
  266. renderTableType(sku_list);
  267. }
  268. });
  269. /**
  270. * 表单验证
  271. */
  272. form.verify({
  273. discount: function (value) {
  274. if (is_consume_discount == 1) {
  275. if (value.trim() == "") {
  276. return '会员等级折扣不能为空!';
  277. }
  278. if (parseFloat(value) <= 0) {
  279. return '会员等级折扣必须大于0!';
  280. }
  281. if (parseFloat(value) > 10) {
  282. return '会员等级折扣必须小于10!';
  283. }
  284. var arrMen = value.split(".");
  285. var val = 0;
  286. if (arrMen.length == 2) {
  287. val = arrMen[1];
  288. }
  289. if (val.length > 2) {
  290. return "会员等级折扣最多可保留两位小数";
  291. }
  292. }
  293. },
  294. manjian: function (value, item) {
  295. if (is_consume_discount == 1) {
  296. var price = $(item).parents("tr").find(".sku-price").text();
  297. if (value.trim() == "") {
  298. return '满减金额不能为空!';
  299. }
  300. if (parseFloat(value) < 0) {
  301. return '满减金额必须大于0!';
  302. }
  303. if (parseFloat(value) > Number(price)) {
  304. return '满减金额不能大于商品价格!';
  305. }
  306. var arrMen = value.split(".");
  307. var val = 0;
  308. if (arrMen.length == 2) {
  309. val = arrMen[1];
  310. }
  311. if (val.length > 2) {
  312. return "满减金额最多可保留两位小数";
  313. }
  314. }
  315. },
  316. fixed_price: function (value, item) {
  317. if (is_consume_discount == 1) {
  318. var price = $(item).parents("tr").find(".sku-price").text();
  319. if (value.trim() == "") {
  320. return '指定价格不能为空!';
  321. }
  322. if (parseFloat(value) <= 0) {
  323. return '指定价格必须大于0!';
  324. }
  325. if (parseFloat(value) > Number(price)) {
  326. return '指定价格不能大于商品价格!';
  327. }
  328. var arrMen = value.split(".");
  329. var val = 0;
  330. if (arrMen.length == 2) {
  331. val = arrMen[1];
  332. }
  333. if (val.length > 2) {
  334. return "指定价格最多可保留两位小数";
  335. }
  336. }
  337. }
  338. });
  339. });
  340. // 表格数据
  341. function skuList(dis_type) {
  342. var sku_list = [];
  343. $.each(sku_data, function(index, item) {
  344. var sku = {};
  345. sku.sku_id = item.sku_id;
  346. sku.sku_name = item.sku_name;
  347. sku.price = item.price;
  348. if (dis_type == "discount" || dis_type == "") {
  349. $.each(item.member_price.discount, function(key, value) {
  350. sku[key] = value;
  351. })
  352. } else if (dis_type == "fixed_price") {
  353. $.each(item.member_price.fixed_price, function(key, value) {
  354. sku[key] = value;
  355. })
  356. } else if (dis_type == "manjian") {
  357. $.each(item.member_price.manjian, function(key, value) {
  358. sku[key] = value;
  359. })
  360. }
  361. sku_list.push(sku);
  362. });
  363. return sku_list;
  364. }
  365. // 表格渲染
  366. function renderTableType(sku_list) {
  367. tableType = new Table({
  368. elem: "#discount_type",
  369. cols: [
  370. [
  371. {
  372. type: 'checkbox',
  373. unresize: 'false',
  374. fixed: 'left'
  375. },{
  376. field: 'sku_name',
  377. title: '商品规格',
  378. minWidth: 140,
  379. unresize: 'false',
  380. {if count($level_list) > 2}
  381. fixed: 'left',
  382. {/if}
  383. templet: function(data) {
  384. return '<p class="multi-line-hiding" title="'+ data.sku_name +'">'+ data.sku_name +'</p>';
  385. }
  386. }, {
  387. field: 'price',
  388. title: '价格',
  389. minWidth: 140,
  390. unresize: 'false',
  391. {if count($level_list) > 2}
  392. fixed: 'left',
  393. {/if}
  394. align: 'center',
  395. templet: function(data) {
  396. return '¥<span class="sku-price">' + data.price + '</span>';
  397. }
  398. },
  399. {foreach $level_list as $k => $v}
  400. {
  401. field: '{$v.level_id}',
  402. title: '{if $v.level_type ==1}<span class="vip_type">SVIP</span>{/if}<span title="{$v.level_name}">{$v.level_name}</span>',
  403. unresize: 'false',
  404. width: 130,
  405. templet: function(data) {
  406. var html = '';
  407. if (dis_type == "discount" || dis_type == "") {
  408. var num = data[{$v.level_id}] ? data[{$v.level_id}] : 10;
  409. html = `<input type="number" name="member_price[${data.sku_id}][discount][{$v.level_id}]" value="${num}" min="0" class="layui-input len-short member_price_{$v.level_id} member_sku_${data.sku_id}" lay-verify="discount" /> 折`
  410. } else if (dis_type == "fixed_price") {
  411. var num = data[{$v.level_id}] ? data[{$v.level_id}] : data.price;
  412. html = `<input type="number" name="member_price[${data.sku_id}][fixed_price][{$v.level_id}]" value="${num}" min="0" class="layui-input len-short member_price_{$v.level_id} member_sku_${data.sku_id}" lay-verify="fixed_price" /> 元`
  413. } else if (dis_type == "manjian") {
  414. var num = data[{$v.level_id}] ? data[{$v.level_id}] : 0;
  415. html = `减¥ <input type="number" name="member_price[${data.sku_id}][manjian][{$v.level_id}]" value="${num}" min="0" class="layui-input len-short member_price_{$v.level_id} member_sku_${data.sku_id}" lay-verify="manjian" />`
  416. }
  417. return html;
  418. }
  419. },
  420. {/foreach}
  421. ]
  422. ],
  423. data: sku_list,
  424. page: false,
  425. limit:sku_list.length,
  426. toolbar: '#toolbarOperation'
  427. });
  428. tableType.toolbar(function(obj) {
  429. if (obj.data.length < 1) {
  430. layer.msg('请选择要操作的数据');
  431. return;
  432. }
  433. var level_id = obj.event;
  434. var layerIndex = layer.open({
  435. type: 1,
  436. title:"修改会员价",
  437. shade: 0,
  438. area:['600px'],
  439. btn:["保存","返回"],
  440. content: `
  441. <div class="layui-form-item">
  442. <label class="layui-form-label"><span class="required">*</span>会员价:</label>
  443. <div class="layui-input-block">
  444. <input type="text" name="bargain_edit_input" lay-verify="required" autocomplete="off" class="layui-input len-mid" placeholder="请输入数值">
  445. </div>
  446. </div>
  447. `,
  448. yes: function(index, layero){
  449. var val = $("input[name='bargain_edit_input']").val();
  450. if (!val){
  451. layer.msg("请输入正确数值");
  452. return false;
  453. }
  454. if (obj.isAll){
  455. $("input.layui-input."+level_id).val(val);
  456. }else{
  457. obj.data.forEach(function (item,index) {
  458. $("input.layui-input."+level_id + ".member_sku_"+item.sku_id).val(val);
  459. })
  460. }
  461. layer.close(layerIndex);
  462. }
  463. });
  464. });
  465. }
  466. // 表单提交
  467. function formSubmit(callback) {
  468. callback(param);
  469. }
  470. function back() {
  471. param = 1;
  472. }
  473. </script>
  474. {/block}