add_entity.html 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432
  1. {extend name="app/shop/view/base.html"/}
  2. {block name="resources"}
  3. <link rel="stylesheet" href="SHOP_CSS/game.css">
  4. <link rel="stylesheet" href="__STATIC__/ext/video/video.css">
  5. <link rel="stylesheet" type="text/css" href="__STATIC__/ext/searchable_select/searchable_select.css" />
  6. <link rel="stylesheet" type="text/css" href="SHOP_CSS/goods_edit.css" />
  7. <link rel="stylesheet" type="text/css" href="ADDON_VIRTUALCARD_CSS/goods_edit.css" />
  8. <style>
  9. .len-short {
  10. width: 180px !important;
  11. }
  12. </style>
  13. {/block}
  14. {block name="main"}
  15. <div class="layui-form">
  16. <!-- 礼品卡类型 -->
  17. <div class="layui-tab layui-tab-brief" lay-filter="goods_tab">
  18. <div class="layui-tab-content">
  19. <div class="layui-tab-item layui-show">
  20. <div class="layui-card card-common">
  21. <div class="layui-card-header">
  22. <span class="card-title">礼品卡类型</span>
  23. </div>
  24. <div class="layui-card-body commodity-type-box" >
  25. <div class="commodity-type-item" onclick="location.href = ns.url('giftcard://shop/giftcard/addelectgiftcard')">
  26. <span>电子卡</span>
  27. <span class="text-color-gray">(线上购买)</span>
  28. </div>
  29. <div class="commodity-type-item border-color" onclick="location.href = ns.url('giftcard://shop/giftcard/addentitygiftcard')">
  30. <span class="text-color">实体卡</span>
  31. <span class="text-color-gray">(线下发放)</span>
  32. </div>
  33. </div>
  34. </div>
  35. </div>
  36. </div>
  37. </div>
  38. <div class="layui-card card-common">
  39. <div class="layui-card-header">
  40. <span class="card-title">基础设置</span>
  41. </div>
  42. <div class="layui-card-body">
  43. <div class="layui-form-item">
  44. <label class="layui-form-label"><span class="required">*</span>礼品卡名称:</label>
  45. <div class="layui-input-block">
  46. <input type="text" name="card_name" value="" lay-verify="required" autocomplete="off" class="layui-input len-long" maxlength="40">
  47. </div>
  48. </div>
  49. <div class="layui-form-item">
  50. <label class="layui-form-label"><span class="required">*</span>礼品卡数量:</label>
  51. <div class="layui-input-block">
  52. <input type="number" min="1" name="card_count" lay-verify="required|number" onchange="detectionNumType(this,'integral')" class="layui-input len-short" autocomplete="off" value="10">
  53. </div>
  54. </div>
  55. <div class="layui-form-item">
  56. <label class="layui-form-label">排序:</label>
  57. <div class="layui-input-block">
  58. <input type="number" min="0" name="sort" value="0" lay-verify = 'sort' onchange="detectionNumType(this,'integral')" autocomplete="off" class="layui-input len-short">
  59. </div>
  60. </div>
  61. </div>
  62. <div class="layui-card-header">
  63. <span class="card-title">生成规则</span>
  64. </div>
  65. <div class="layui-card-body">
  66. <div class="layui-form-item">
  67. <label class="layui-form-label"><span class="required">*</span>兑换码位数:</label>
  68. <div class="layui-input-block">
  69. <input type="number" min="4" name="carmichael_length" lay-verify="required" onchange="detectionNumType(this,'integral')" class="layui-input len-short" autocomplete="off" value="6">
  70. </div>
  71. </div>
  72. <div class="layui-form-item participation-condition">
  73. <label class="layui-form-label"><span class="required">*</span>兑换码内容:</label>
  74. <div class="layui-input-block">
  75. <input type="checkbox" name="carmichael_type[]" value="0-9" lay-skin="primary" title="0-9" checked>
  76. <input type="checkbox" name="carmichael_type[]" value="a-z" lay-skin="primary" title="a-z">
  77. <input type="checkbox" name="carmichael_type[]" value="A-Z" lay-skin="primary" title="A-Z">
  78. </div>
  79. </div>
  80. <div class="layui-form-item">
  81. <label class="layui-form-label">兑换码前缀:</label>
  82. <div class="layui-input-block">
  83. <input type="text" name="carmichael_prefix" value="" autocomplete="off" class="layui-input len-long">
  84. </div>
  85. </div>
  86. <div class="layui-form-item">
  87. <label class="layui-form-label">兑换码后缀:</label>
  88. <div class="layui-input-block">
  89. <input type="text" name="carmichael_suffix" value="" autocomplete="off" class="layui-input len-long">
  90. </div>
  91. </div>
  92. </div>
  93. <div class="layui-card-header">
  94. <span class="card-title">礼品卡权益</span>
  95. </div>
  96. <div class="layui-card-body">
  97. <div class="layui-form-item">
  98. <label class="layui-form-label">商品:</label>
  99. <div class="layui-input-block">
  100. <table class="layui-table" id="goods" lay-skin="line" lay-size="lg">
  101. <colgroup>
  102. <col width="45%">
  103. <col width="15%">
  104. <col width="15%">
  105. <col width="10%">
  106. <col width="15%">
  107. </colgroup>
  108. <thead>
  109. <tr>
  110. <th>商品名称</th>
  111. <th>价格</th>
  112. <th>库存</th>
  113. <th>数量</th>
  114. <th class="operation">操作</th>
  115. </tr>
  116. </thead>
  117. <tbody>
  118. <tr>
  119. <td colspan="5">
  120. <div class="goods-empty">未添加商品</div>
  121. </td>
  122. </tr>
  123. </tbody>
  124. </table>
  125. <button class="layui-btn" onclick="addGoods()">添加商品</button>
  126. </div>
  127. </div>
  128. <div class="word-aux">说明:请务必保证库存充足,否则会导致权益赠送失败</div>
  129. <!--<div class="layui-form-item">-->
  130. <!--<label class="layui-form-label"><span class="required">*</span>是否开启余额抵扣:</label>-->
  131. <!--<div class="layui-input-block" >-->
  132. <!--<input type="checkbox" name="status" lay-skin="switch" checked value="1" lay-filter="status" >-->
  133. <!--</div>-->
  134. <!--</div>-->
  135. <label class="layui-form-label">积分:</label>
  136. <div class="layui-input-block">
  137. <input type="number" min="0" name="point" onchange="detectionNumType(this,'integral')" class="layui-input len-short integral " autocomplete="off" value="0">
  138. </div>
  139. <label class="layui-form-label">余额:</label>
  140. <div class="layui-input-block">
  141. <input type="number" min="0" name="balance" onchange="detectionNumType(this,'positiveNumber')" class="layui-input len-short" autocomplete="off" value="0">
  142. </div>
  143. <!-- <label class="layui-form-label"><span class="required">*</span>优惠卷:</label>-->
  144. <!-- <div class="layui-input-inline">-->
  145. <!-- <select name="coupon" lay-search="" lay-verify="coupon" class="layui-input len-short">-->
  146. <!-- <option value="">无优惠卷</option>-->
  147. <!-- {foreach name="$coupon_lists" item="vo"}-->
  148. <!-- <option value="{$vo['coupon_type_id']}">{$vo['coupon_name']}</option>-->
  149. <!-- {/foreach}-->
  150. <!-- </select>-->
  151. <!-- </div>-->
  152. </div>
  153. <div class="layui-card-header">
  154. <span class="card-title">其他设置</span>
  155. </div>
  156. <div class="layui-card-body">
  157. <div class="layui-form-item">
  158. <label class="layui-form-label"><span class="required">*</span>有效期:</label>
  159. <div class="layui-input-block">
  160. <div>
  161. <input type="radio" name="time_type" value="1" title="永久有效" checked>
  162. </div>
  163. <div>
  164. <input type="radio" name="time_type" value="2" title="有效期至">
  165. <div class="layui-input-inline" style="float: none">
  166. <input type="text" class="layui-input" name="youxiao_time" lay-verify="time" placeholder="有效期限" id="start_time" readonly>
  167. <i class=" iconrili iconfont calendar"></i>
  168. </div>
  169. </div>
  170. <!-- <div>-->
  171. <!-- <input type="radio" name="time_type" value="3" title="领取后&emsp;">-->
  172. <!-- <div class="layui-input-inline" style="float: none">-->
  173. <!-- <input type="number" min="0" name="youxiao_day" autocomplete="off" lay-verify="time_day" class="layui-input len-short" value="0">&nbsp天&nbsp&nbsp有效-->
  174. <!-- </div>-->
  175. <!-- </div>-->
  176. </div>
  177. </div>
  178. </div>
  179. </div>
  180. <div class="form-row">
  181. <button class="layui-btn" lay-submit lay-filter="save">保存</button>
  182. <button class="layui-btn layui-btn-primary" onclick="back()">返回</button>
  183. </div>
  184. </div>
  185. {/block}
  186. {block name="script"}
  187. <script>
  188. var form, laytpl, tableData = [],
  189. repeat_flag = false,
  190. awardId = 0,
  191. selectGoodsSkuId = [],
  192. num_list = [],
  193. goods = [],
  194. is_balance = 1 ,
  195. currentDate = new Date(),
  196. minDate = "";
  197. layui.use(['form', 'laytpl','laydate'], function () {
  198. var laydate = layui.laydate;
  199. form = layui.form;
  200. laytpl = layui.laytpl;
  201. currentDate.setDate(currentDate.getDate() + 30);
  202. form.render();
  203. laydate.render({
  204. elem: '#start_time'
  205. ,type: 'datetime'
  206. ,change: function(value, date, endDate){
  207. $(".date-picker-btn").removeClass("selected");
  208. }
  209. });
  210. //表单验证
  211. form.verify({
  212. number:function(value){
  213. if( value <= 0 ){
  214. return "数量不能小于或等于0"
  215. }
  216. },
  217. sort:function(value){
  218. if(value < 0 ){
  219. return "排序不能小于0"
  220. }
  221. },
  222. nums:function(value){
  223. if(value < 10){
  224. return "请输入大于10的数"
  225. }
  226. },
  227. Conversion:function(value){
  228. if(value == 0){
  229. return "兑换码位数不能为0";
  230. }
  231. },
  232. // gral:function(value){
  233. // if(value == 0){
  234. // return "积分不能为0"
  235. // }
  236. // },
  237. // balance:function(value){
  238. // if(value == 0){
  239. // return "余额不能为0"
  240. // }
  241. // },
  242. // intergralBalance:function(value){
  243. // var intergral_balance = $('.integral').val()
  244. // if(intergral_balance == 0 && (value == 0 || value == 0.00) ){
  245. // return '积分和余额不能同时为0'
  246. // }
  247. // },
  248. time:function(value){
  249. var time_type = $('[name="time_type"]:checked').val();
  250. if (time_type == 2) {
  251. var now_time = (new Date()).getTime();
  252. var end_time = (new Date(value)).getTime();
  253. if(!end_time){
  254. return '有效期不能为空'
  255. }
  256. if (now_time > end_time) {
  257. return '有效期不能小于当前时间!'
  258. }
  259. }
  260. },
  261. time_day:function(value){
  262. var time_type = $('[name="time_type"]:checked').val();
  263. if(time_type == 3) {
  264. if(value <= 0) {
  265. return '有效期天数至少为一天!'
  266. }
  267. }
  268. }
  269. });
  270. form.on('switch(status)', function(data){
  271. if(this.checked){
  272. is_balance = 1;
  273. }else{
  274. is_balance = 0;
  275. }
  276. });
  277. /**
  278. * 表单提交
  279. */
  280. form.on('submit(save)', function (data) {
  281. if (repeat_flag) return;
  282. repeat_flag = true;
  283. $("input[name='goods_num']").each(function(){
  284. num_list.push($(this).val());
  285. });
  286. for(var i = 0 ; i < selectGoodsSkuId.length; i++){
  287. var obj = {};
  288. obj.sku_id = selectGoodsSkuId[i];
  289. obj.num = num_list[i];
  290. goods.push(obj)
  291. }
  292. if(goods.length == 0 && data.field.balance == 0 && data.field.point == 0){
  293. layer.msg("礼品卡权益最少设置一个");
  294. return;
  295. }
  296. data.field.goods = goods;
  297. data.field.is_balance = is_balance;
  298. $.ajax({
  299. type: 'POST',
  300. dataType: 'JSON',
  301. url: ns.url("giftcard://shop/giftcard/addentitygiftcard"),
  302. data: data.field,
  303. async: false,
  304. success: function (res) {
  305. repeat_flag = false;
  306. if (res.code == 0) {
  307. layer.confirm('添加成功', {
  308. title: '操作提示',
  309. btn: ['返回列表', '继续添加'],
  310. closeBtn: 0,
  311. yes: function () {
  312. location.href = ns.url("giftcard://shop/giftcard/lists");
  313. },
  314. btn2: function () {
  315. location.href = ns.url("giftcard://shop/giftcard/addentitygiftcard");
  316. }
  317. });
  318. } else {
  319. layer.msg(res.message);
  320. }
  321. }
  322. })
  323. });
  324. });
  325. //删除奖品
  326. function delAward(data) {
  327. for (var i = 0; i < tableData.length; i++) {
  328. if (tableData[i].ident == data) {
  329. tableData.splice(i, 1);
  330. renderTable(tableData);
  331. }
  332. }
  333. }
  334. function back() {
  335. location.href = ns.url("giftcard://shop/giftcard/lists");
  336. }
  337. //检测数据类型
  338. function detectionNumType(el, type) {
  339. var value = $(el).val();
  340. //大于零 且 不是小数
  341. if (value < 0 && type == 'integral')
  342. $(el).val(0);
  343. else if (type == 'integral')
  344. $(el).val(Math.round(value));
  345. //大于1 且 不是小数
  346. if (value < 1 && type == 'positiveInteger')
  347. $(el).val(1);
  348. else if (type == 'positiveInteger')
  349. $(el).val(Math.round(value));
  350. //大于零可以是小数
  351. if (type == 'positiveNumber') {
  352. value = parseFloat(value).toFixed(2);
  353. if (value < 0)
  354. $(el).val(0);
  355. else
  356. $(el).val(value);
  357. }
  358. }
  359. /**
  360. * 添加商品
  361. */
  362. function addGoods() {
  363. goodsSelect(function (res) {
  364. if (!res.length) return false;
  365. var price = 0.00;
  366. selectGoodsSkuId = [];
  367. $("#goods tbody").html("");
  368. var html = $("#goods tbody .goods-empty").length ? '' : $("#goods tbody").html();
  369. for (var i = 0; i < res.length; i++) {
  370. for (var k = 0; k < res[i].selected_sku_list.length; k++) {
  371. var item = res[i].selected_sku_list[k];
  372. html += `<tr data-sku_id="${item.sku_id}">`;
  373. html += `
  374. <td>
  375. <div class="goods-title">
  376. <div class="goods-img">
  377. <img layer-src src="${item.sku_image ? ns.img(item.sku_image) : ''}" alt="">
  378. </div>
  379. <p class="multi-line-hiding goods-name">${item.sku_name}</p>
  380. </div>
  381. </td>
  382. `;
  383. html += `<td class='price-one'>${item.price }</td>`;
  384. html += `<td>${item.stock}</td>`;
  385. html += `<td><input type="number" name="goods_num" onchange="detectionNumType(this,'integral')" lay-verify="required|number" min="1" class="layui-input" value='1'></td>`;
  386. html += `<td class='operation'> <div class='table-btn '><a href='javascript:;' class='layui-btn' onclick='deleteGoods(this)'>删除商品</a></div></td>`;
  387. html += `</tr>`;
  388. price += Number(item.price);
  389. selectGoodsSkuId.push(item.sku_id);
  390. }
  391. }
  392. $("#goods tbody").html(html);
  393. }, selectGoodsSkuId, {mode: "sku"});
  394. }
  395. /**
  396. * 删除商品
  397. */
  398. function deleteGoods(data) {
  399. var obj = $(data).parent().parent().parent();
  400. $(obj).remove();
  401. for (var i in selectGoodsSkuId) {
  402. if (selectGoodsSkuId[i] == Number($(obj).attr("data-sku_id"))) {
  403. selectGoodsSkuId.splice(i, 1);
  404. num_list.splice(i, 1);
  405. }
  406. }
  407. }
  408. </script>
  409. {/block}