goods_select.html 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303
  1. {extend name="base"/}
  2. {block name="resources"}
  3. <style>
  4. .select-goods{padding: 20px 20px 0;}
  5. .contraction{display: inline-block;margin-right: 5px;}
  6. .contraction span{cursor: pointer;display: inline-block;width: 17px;height: 17px;text-align: center;line-height: 14px;/* border: 1px solid #e9e9e9;*/user-select: none;/* background: #fff;*/}
  7. .sku-list{display: none;border-bottom: 1px solid #e6e6e6;}
  8. .sku-list td:nth-of-type(2){display: flex;align-items: center;}
  9. .sku-list td{border-bottom: 0;padding: 5px 15px !important;}
  10. </style>
  11. {/block}
  12. {block name="body"}
  13. <div class="select-goods">
  14. <div class="ns-single-filter-box">
  15. <div class="layui-form">
  16. <div class="layui-input-inline">
  17. <input type="text" name="goods_name" placeholder="请输入商品名称" class="layui-input">
  18. <button type="button" class="layui-btn layui-btn-primary" lay-submit lay-filter="search">
  19. <i class="layui-icon">&#xe615;</i>
  20. </button>
  21. </div>
  22. </div>
  23. </div>
  24. <!-- 列表 -->
  25. <table id="goods_list" lay-filter="goods_list"></table>
  26. </div>
  27. {/block}
  28. {block name="script"}
  29. <script type="text/html" id="checkbox">
  30. {{# if(mode == "spu" && $.inArray(d.goods_id.toString(), selected_id_arr) != -1){ }}
  31. {{# if(disabled == 1){ }}
  32. <input type="checkbox" data-goods-id="{{d.goods_id}}" name="goods_checkbox" lay-skin="primary" lay-filter="goods_checkbox" checked disabled>
  33. {{# }else{ }}
  34. <input type="checkbox" data-goods-id="{{d.goods_id}}" name="goods_checkbox" lay-skin="primary" lay-filter="goods_checkbox" checked>
  35. {{# } }}
  36. {{# }else{ }}
  37. <input type="checkbox" data-goods-id="{{d.goods_id}}" name="goods_checkbox" lay-skin="primary" lay-filter="goods_checkbox">
  38. {{# } }}
  39. <input type="hidden" data-goods-id="{{d.goods_id}}" name="goods_json" value='{{ JSON.stringify(d) }}' />
  40. <input type="hidden" data-goods-id="{{d.goods_id}}" name="goods_sku_list_json" value='{{ JSON.stringify(d.sku_list) }}' />
  41. </script>
  42. <!-- 商品信息 -->
  43. <script type="text/html" id="goods_info">
  44. <div class="ns-table-title">
  45. {{# if(mode == "sku"){ }}
  46. <div class="contraction" data-goods-id="{{d.goods_id}}" data-open="0">
  47. <span>+</span>
  48. </div>
  49. {{# } }}
  50. <div class="ns-title-pic" id="goods_img_{{d.goods_id}}">
  51. <img layer-src src="{{ns.img(d.goods_image.split(',')[0], 'small')}}"/>
  52. </div>
  53. <div class="ns-title-content">
  54. <a href="javascript:;" class="ns-multi-line-hiding ns-text-color" title="{{d.goods_name}}">{{d.goods_name}}</a>
  55. <a href="javascript:;" class="ns-multi-line-hiding ns-text-color" >¥{{d.price}}</a>
  56. </div>
  57. </div>
  58. </script>
  59. <!-- SKU商品列表 -->
  60. <script type="text/html" id="skuList">
  61. {{# for(var i=0;i<d.list.length;i++){ }}
  62. <tr class="sku-list js-sku-list-{{d.list[i].goods_id}}" id="sku_img_{{d.list[i].goods_id}}">
  63. <td></td>
  64. <td>
  65. {{# if(d.checked || (mode == "sku" && $.inArray(d.list[i].sku_id.toString(), selected_id_arr) != -1) ){ }}
  66. {{# if(disabled == 1){ }}
  67. <input type="checkbox" data-goods-id="{{d.list[i].goods_id}}" data-sku-id="{{d.list[i].sku_id}}" name="goods_sku_checkbox" lay-skin="primary" lay-filter="goods_sku_checkbox" checked disabled>
  68. {{# }else{ }}
  69. <input type="checkbox" data-goods-id="{{d.list[i].goods_id}}" data-sku-id="{{d.list[i].sku_id}}" name="goods_sku_checkbox" lay-skin="primary" lay-filter="goods_sku_checkbox" checked>
  70. {{# } }}
  71. {{# }else{ }}
  72. <input type="checkbox" data-goods-id="{{d.list[i].goods_id}}" data-sku-id="{{d.list[i].sku_id}}" name="goods_sku_checkbox" lay-skin="primary" lay-filter="goods_sku_checkbox">
  73. {{# } }}
  74. <input type="hidden" data-sku-id="{{d.list[i].sku_id}}" value='{{ JSON.stringify(d.list[i]) }}' name="goods_sku_json" />
  75. <div class="ns-table-title">
  76. <div class="ns-title-pic" id="sku_img_{{d.sku_id}}">
  77. <img layer-src src="{{ns.img(d.list[i].sku_image, 'small')}}"/>
  78. </div>
  79. <div class="ns-title-content">
  80. <a href="javascript:;" class="ns-multi-line-hiding ns-text-color" title="{{d.list[i].sku_name}}" lay-event="preview">{{d.list[i].sku_name}}</a>
  81. <a href="javascript:;" class="ns-multi-line-hiding ns-text-color" >¥{{d.list[i].price}}</a>
  82. </div>
  83. </div>
  84. </td>
  85. <td>{{d.list[i].stock}}</td>
  86. <td>{{d.list[i].goods_class_name}}</td>
  87. </tr>
  88. {{# } }}
  89. </script>
  90. <script>
  91. var select_id = "{$select_id}",
  92. mode = "{$mode}",
  93. max_num = "{$max_num}",
  94. min_num = "{$min_num}",
  95. disabled = "{$disabled}",
  96. selected_id_arr = select_id.length ? select_id.split(',') : [],
  97. table, form,laytpl;
  98. $(function () {
  99. layui.use(['form','laytpl'], function () {
  100. form = layui.form;
  101. laytpl = layui.laytpl;
  102. table = new Table({
  103. elem: '#goods_list',
  104. url: '{:addon_url("shop/goods/goodsselect")}',
  105. where: {is_virtual: "{$is_virtual}"},
  106. cols: [
  107. [
  108. {
  109. unresize: 'false',
  110. width: '8%',
  111. templet: '#checkbox'
  112. },
  113. {
  114. title: '商品',
  115. unresize: 'false',
  116. width: '62%',
  117. templet: '#goods_info'
  118. },
  119. {
  120. field: 'goods_stock',
  121. title: '库存',
  122. unresize: 'false',
  123. width: '15%'
  124. },
  125. {
  126. field: 'goods_class_name',
  127. title: '商品类型',
  128. unresize: 'false',
  129. width: '15%'
  130. }
  131. ]
  132. ],
  133. done: function(res, curr, count){
  134. //如果是异步请求数据方式,res即为你接口返回的信息。
  135. //如果是直接赋值的方式,res即为:{data: [], count: 99} data为当前页数据、count为数据总长度
  136. console.log(res);
  137. console.log(1111);
  138. //得到当前页码
  139. console.log(curr);
  140. //得到数据总量
  141. console.log(count);
  142. },
  143. callback : function () {
  144. if(mode == "sku") {
  145. $("input[name='goods_checkbox'][data-goods-id]").each(function () {
  146. var goods_id = $(this).attr("data-goods-id");
  147. var tr = $(this).parent().parent().parent();
  148. var data = getGoodsSkuData(goods_id);
  149. laytpl(data.sku_list).render(data, function (html) {
  150. tr.after(html);
  151. form.render();
  152. layer.photos({
  153. photos: '.img-wrap',
  154. anim: 5
  155. });
  156. });
  157. });
  158. }
  159. // 更新商品复选框状态
  160. for (var i=0;i<selected_id_arr.length;i++) {
  161. if(mode == 'spu') {
  162. var selected_goods = $("input[name='goods_checkbox'][data-goods-id='" + selected_id_arr[i] + "']");
  163. if (selected_goods.length) {
  164. $("input[name='goods_checkbox'][data-goods-id='" + selected_id_arr[i] + "']").prop("checked", true);
  165. if(disabled == 1){
  166. $("input[name='goods_checkbox'][data-goods-id='" + selected_id_arr[i] + "']").attr("disabled", "disabled");
  167. }
  168. }
  169. }
  170. if(mode == 'sku'){
  171. var selected_goods_sku = $("input[name='goods_sku_checkbox'][data-sku-id='" + selected_id_arr[i] + "']:checked");
  172. if(selected_goods_sku.length){
  173. $("input[name='goods_checkbox'][data-goods-id='" + selected_goods_sku.attr("data-goods-id") + "']").prop("checked", true);
  174. if(disabled == 1){
  175. $("input[name='goods_checkbox'][data-goods-id='" + selected_goods_sku.attr("data-goods-id") + "']").attr("disabled", "disabled");
  176. }
  177. }
  178. }
  179. }
  180. form.render();
  181. }
  182. });
  183. /**
  184. * 监听搜索
  185. */
  186. form.on('submit(search)', function (data) {
  187. table.reload({
  188. page: {
  189. curr: 1
  190. },
  191. where: data.field
  192. });
  193. });
  194. // 勾选商品
  195. form.on('checkbox(goods_checkbox)', function(data) {
  196. var goods_id = $(data.elem).attr("data-goods-id");
  197. $("input[name='goods_sku_checkbox'][data-goods-id='" + goods_id + "']").prop("checked",data.elem.checked);
  198. form.render();
  199. });
  200. // 勾选商品SKU
  201. form.on('checkbox(goods_sku_checkbox)', function(data) {
  202. var goods_id = $(data.elem).attr("data-goods-id");
  203. if($("input[name='goods_sku_checkbox'][data-goods-id='" + goods_id + "']:checked").length) {
  204. $("input[name='goods_checkbox'][data-goods-id='" + goods_id + "']").prop("checked", true);
  205. }else{
  206. $("input[name='goods_checkbox'][data-goods-id='" + goods_id + "']").prop("checked", false);
  207. }
  208. form.render();
  209. });
  210. });
  211. $("body").on("click", ".contraction", function () {
  212. var goods_id = $(this).attr("data-goods-id");
  213. var open = $(this).attr("data-open");
  214. if (open == 1) {
  215. $(this).children("span").text("+");
  216. $(".js-sku-list-" + goods_id).hide();
  217. } else {
  218. $(this).children("span").text("-");
  219. $(".js-sku-list-" + goods_id).show();
  220. }
  221. $(this).attr("data-open", (open == 0 ? 1 : 0));
  222. });
  223. });
  224. function getGoodsSkuData(goods_id) {
  225. var list = JSON.parse($("input[name='goods_sku_list_json'][data-goods-id='" + goods_id + "']").val().toString());
  226. var sku_list = $("#skuList").html();
  227. var checked = $("input[name='goods_checkbox'][data-goods-id='" + goods_id + "']:checked").length ? true : false;
  228. var data = {
  229. checked : checked,
  230. sku_list : sku_list,
  231. list: list
  232. };
  233. return data;
  234. }
  235. function selectGoods(callback) {
  236. var res = [];
  237. $("input[name='goods_checkbox'][data-goods-id]:checked").each(function () {
  238. var goods_id = $(this).attr("data-goods-id");
  239. var goods_info = JSON.parse($("input[name='goods_json'][data-goods-id='" + goods_id + "']").val().toString());
  240. delete goods_info.LAY_INDEX;
  241. delete goods_info.LAY_TABLE_INDEX;
  242. delete goods_info.create_time;
  243. var goods_sku = $("input[name='goods_sku_checkbox'][data-goods-id='" + goods_id + "']:checked");
  244. var sku_list = [];
  245. if (goods_sku.length) {
  246. goods_sku.each(function () {
  247. var sku_id = $(this).attr("data-sku-id");
  248. sku_list.push(JSON.parse($("input[name='goods_sku_json'][data-sku-id='" + sku_id + "']").val().toString()));
  249. });
  250. } else {
  251. // 得多全部SKU商品
  252. var sku_data = getGoodsSkuData(goods_id);
  253. sku_list = sku_data.list;
  254. }
  255. var obj = goods_info;
  256. obj.selected_sku_list = sku_list;// 具体选的的SKU商品
  257. res.push(obj);
  258. });
  259. var num = 0;
  260. if (mode == "spu") {
  261. for (var i = 0; i < res.length; i++) {
  262. num++;
  263. }
  264. } else if (mode == "sku") {
  265. for (var i = 0; i < res.length; i++) {
  266. for (var k = 0; k < res[i].selected_sku_list.length; k++) {
  267. num++;
  268. }
  269. }
  270. }
  271. if (max_num && max_num > 0 && num > max_num) {
  272. layer.msg("所选商品数量不能超过" + max_num + '件');
  273. return;
  274. }
  275. if (min_num && min_num > 0 && num < min_num) {
  276. layer.msg("所选商品数量最少不能少于" + min_num + '件');
  277. return;
  278. }
  279. callback(res);
  280. }
  281. </script>
  282. {/block}