commodity_detail_edit.html 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <title>商品明细</title>
  6. <meta name="renderer" content="webkit">
  7. <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
  8. <meta name="viewport"
  9. content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0">
  10. <link rel="stylesheet" href="../../layuiadmin/layui/css/layui.css" media="all">
  11. <link rel="stylesheet" href="../../layuiadmin/style/admin.css" media="all">
  12. <style type="text/css">
  13. /*您可以将下列样式写入自己的样式表中*/
  14. /*layui 元素样式改写*/
  15. .layui-btn-sm {
  16. line-height: normal;
  17. font-size: 12.5px;
  18. }
  19. .layui-table-view .layui-table-body {
  20. min-height: 256px;
  21. }
  22. .layui-table-cell .layui-input.layui-unselect {
  23. height: 30px;
  24. line-height: 30px;
  25. }
  26. /*设置 layui 表格中单元格内容溢出可见样式*/
  27. .table-overlay .layui-table-view,
  28. .table-overlay .layui-table-box,
  29. .table-overlay .layui-table-body {
  30. overflow: visible;
  31. }
  32. .table-overlay .layui-table-cell {
  33. height: auto;
  34. overflow: visible;
  35. }
  36. .imgStyle {
  37. padding-left: 10px;
  38. width: 80px;
  39. height: 50px;
  40. }
  41. .layui-table-cell {
  42. font-size: 14px;
  43. padding: 0 5px;
  44. height: auto;
  45. overflow: visible;
  46. text-overflow: inherit;
  47. white-space: normal;
  48. word-break: break-all;
  49. }
  50. </style>
  51. </head>
  52. <body>
  53. <div class="layui-fluid">
  54. <div class="layui-col-md12">
  55. <div class="layui-card">
  56. <form id='fm' class="layui-form" action="" lay-filter="component-form-element">
  57. <button class="layui-btn" id="id_save" lay-submit lay-filter="component-form-element"
  58. style="display: none">保存
  59. </button>
  60. </form>
  61. </div>
  62. <div class="layui-card">
  63. <div class="layui-card-body">
  64. <div class="layui-row layui-col-space10">
  65. <div class="layui-col-xs8" style="text-align: left">
  66. <button class="layui-btn layui-btn-sm layui-btn-normal" id="btn_add">
  67. <i class="layui-icon layui-icon-add "></i> 添加
  68. </button>
  69. </div>
  70. </div>
  71. <div style="height: 5px"></div>
  72. <div id="tableRes" class="table-overlay">
  73. <table id="dataTable" lay-filter="dataTable" class="layui-hide"></table>
  74. </div>
  75. </div>
  76. </div>
  77. </div>
  78. </div>
  79. <script src="../../layuiadmin/layui/layui.js"></script>
  80. <script type="text/html" id="statusTpl">
  81. <a lay-event="type_status"></a>
  82. <input type="checkbox" name="status" lay-skin="switch" lay-text="上架|下架" lay-filter="status"
  83. value="{{ d.status }}" {{ d.status == "1" ? 'checked' : "" }} >
  84. </script>
  85. <script type="text/html" id="paramImage">
  86. <a lay-event="type_button"></a>
  87. <a class="layui-btn layui-btn-xs" id="param_img{{ d.LAY_TABLE_INDEX }}" lay-event="param_img_event">上传</a>
  88. {{# if(d.images_url){ }}
  89. <img src="{{ d.images_url }}" class="imgStyle"/>
  90. {{# } }}
  91. </script>
  92. <script>
  93. layui.config({
  94. base: '../../../layuiadmin/' //静态资源所在路径
  95. }).extend({
  96. index: 'lib/index' //主入口模块
  97. }).use(['index', 'table', 'upload', 'layer', 'form',], function () {
  98. var $ = layui.$
  99. , admin = layui.admin
  100. , upload = layui.upload
  101. , form = layui.form
  102. , table = layui.table
  103. , layer = layui.layer;
  104. var parameter1_list = [];
  105. var parameter2_list = [];
  106. var id = layui.view.getParameterByName('id');
  107. var editdata = JSON.parse(JSON.stringify(parent.layui.table.editdata)); // 框架有Bug所以这么转换
  108. var _data_index = 0
  109. var parameter1_text = ""
  110. var parameter2_text = ""
  111. if (editdata.parameter_text) {
  112. var parameter_text = editdata.parameter_text.split(',')
  113. var parameter_len = parameter_text.length
  114. if (parameter_len >= 1) {
  115. parameter1_text = parameter_text[0]
  116. }
  117. if (parameter_len === 2) {
  118. parameter2_text = parameter_text[1]
  119. }
  120. }
  121. window.viewObj = {
  122. renderSelectOptions: function (data, settings) {
  123. settings = settings || {};
  124. var valueField = settings.valueField || 'value',
  125. textField = settings.textField || 'text',
  126. selectedValue = settings.selectedValue || "";
  127. var html = [];
  128. for (var i = 0, item; i < data.length; i++) {
  129. item = data[i];
  130. html.push('<option value="');
  131. html.push(item[valueField]);
  132. html.push('"');
  133. if (selectedValue && item[valueField] == selectedValue) {
  134. html.push(' selected="selected"');
  135. }
  136. html.push('>');
  137. html.push(item[textField]);
  138. html.push('</option>');
  139. }
  140. return html.join('');
  141. }
  142. };
  143. var permissions = layui.data(layui.setter.tableName)['permissions'];
  144. var editStock = permissions.indexOf('commodity.edit_commodity_stock') > -1 ? true : false;
  145. var editPrice = permissions.indexOf('commodity.edit_commodity_price') > -1 ? true : false;
  146. var tbWidth = $("#tableRes").width();
  147. var layTableId = "layTable";
  148. var tableIns = table.render({
  149. elem: '#dataTable',
  150. id: layTableId,
  151. data: [],
  152. width: tbWidth,
  153. page: false,
  154. limit: 100,
  155. loading: true,
  156. even: true, //不开启隔行背景
  157. cols: [[
  158. {title: '序号', type: 'numbers'},
  159. {field: 'price', title: '销售价格', edit: editPrice ? 'text' : '', width: '10%',},
  160. {field: 'stock', title: '库存', edit: editStock ? 'text' : '', width: '8%',},
  161. {field: 'no', title: '编号', edit: 'text', width: '10%',},
  162. {field: 'name', title: '过账名称', edit: 'text', width: '10%',},
  163. {
  164. field: 'parameter1',
  165. title: parameter1_text,
  166. hide: parameter1_text ? false : true,
  167. width: '15%',
  168. templet: function (d) {
  169. var options = viewObj.renderSelectOptions(parameter1_list, {
  170. valueField: "id",
  171. textField: "name",
  172. selectedValue: d.parameter1
  173. });
  174. return '<a lay-event="type_parameter1"></a><select name="parameter1" lay-filter="parameter_filter"><option value="">请选择参数1</option>' + options + '</select>';
  175. }
  176. },
  177. {
  178. field: 'parameter2',
  179. title: parameter2_text,
  180. hide: parameter2_text ? false : true,
  181. width: '15%',
  182. templet: function (d) {
  183. var options = viewObj.renderSelectOptions(parameter2_list, {
  184. valueField: "id",
  185. textField: "name",
  186. selectedValue: d.parameter2
  187. });
  188. return '<a lay-event="type_parameter2"></a><select name="parameter2" lay-filter="parameter_filter"><option value="">请选择参数2</option>' + options + '</select>';
  189. }
  190. },
  191. {field: 'status', title: '状态', templet: '#statusTpl', width: '10%',},
  192. {field: 'images_url', title: '明细图', templet: '#paramImage', width: '20%',},
  193. {
  194. field: 'id', title: '操作', width: '10%',templet: function (d) {
  195. if (d.id) {
  196. return ''
  197. } else {
  198. return '<a class="layui-btn layui-btn-xs layui-btn-danger" lay-event="del" lay-id="' + d.id + '"><i class="layui-icon layui-icon-delete"></i>删除</a>';
  199. }
  200. }
  201. }
  202. ]],
  203. done: function (data, date, total) {
  204. //重新绑定,upload方法
  205. bindTableToolbarFunction(total)
  206. }
  207. });
  208. function bindTableToolbarFunction(data_index) {
  209. for (var i = 0, item; i < data_index; i++) {
  210. upload.render({
  211. elem: "#param_img" + i, // 和html中的param_img对应
  212. auto: false,
  213. choose: function (obj) {
  214. obj.preview(
  215. function (i, file, result) {
  216. // 把数据索引给图片,便于后续的查找对应。
  217. file.data_index = _data_index
  218. var oldData = table.cache[layTableId];
  219. $.extend(oldData[_data_index], {images_url: result, file: file});
  220. tableIns.reload({
  221. data: oldData
  222. });
  223. }
  224. )
  225. },
  226. });
  227. }
  228. }
  229. admin.req({
  230. url: '/commodity/' + id + '/get_parameter/',
  231. done: function (res) {
  232. if (res.code === 0) {
  233. parameter1_list = res.data.parameter1;
  234. parameter2_list = res.data.parameter2;
  235. }
  236. else {
  237. layer.msg('获取参数失败', {icon: 5});
  238. }
  239. admin.req({
  240. url: '/commodity/' + id + '/get_details/',
  241. done: function (res) {
  242. if (res.code === 0) {
  243. var rows = res.data;
  244. var oldData = table.cache[layTableId];
  245. for (var k in rows) {
  246. oldData.push(
  247. {
  248. id: rows[k].id,
  249. price: rows[k].price,
  250. stock: rows[k].stock,
  251. no: rows[k].no,
  252. name: rows[k].name,
  253. status: rows[k].status,
  254. parameter1: rows[k].parameter1,
  255. parameter2: rows[k].parameter2,
  256. images_url: rows[k].images_url,
  257. }
  258. )
  259. }
  260. tableIns.reload({
  261. data: oldData
  262. });
  263. }
  264. else
  265. layer.msg('获取商品明细失败', {icon: 5});
  266. }
  267. });
  268. }
  269. });
  270. var active = {
  271. removeItem: function (index) {
  272. var oldData = table.cache[layTableId];
  273. oldData.splice(index, 1); //删除一项
  274. tableIns.reload({
  275. data: oldData
  276. });
  277. },
  278. onParameterChange: function (obj) {
  279. var oldData = table.cache[layTableId];
  280. $.extend(oldData[obj.data_index], obj);
  281. tableIns.reload({
  282. data: oldData
  283. });
  284. },
  285. }
  286. //激活事件
  287. var activeByType = function (type, arg) {
  288. if (arguments.length === 2) {
  289. active[type] ? active[type].call(this, arg) : '';
  290. } else {
  291. active[type] ? active[type].call(this) : '';
  292. }
  293. }
  294. //注册按钮事件
  295. $('.layui-btn[data-type]').on('click', function () {
  296. var type = $(this).data('type');
  297. activeByType(type);
  298. });
  299. //监听select下拉选中事件
  300. form.on('select(parameter_filter)', function (data) {
  301. var elem = data.elem; //得到select原始DOM对象
  302. $(elem).prev("a[lay-event='type_parameter1']").trigger("click");
  303. $(elem).prev("a[lay-event='type_parameter2']").trigger("click");
  304. });
  305. //监听指定开关
  306. form.on('switch(status)', function (data) {
  307. var elem = data.elem; //得到select原始DOM对象
  308. $(elem).prev("a[lay-event='type_status']").trigger("click");
  309. //$(elem).html("lay-event='type_status2'").trigger("click");
  310. });
  311. //监听工具条
  312. table.on('tool(dataTable)', function (obj) {
  313. var data = obj.data, event = obj.event, tr = obj.tr; //获得当前行 tr 的DOM对象;
  314. var data_index = tr.attr("data-index");
  315. switch (event) {
  316. case "type_parameter2":
  317. var select = tr.find("select[name='parameter2']");
  318. if (select) {
  319. var selectedVal = select.val();
  320. if (!selectedVal) {
  321. layer.tips("请选择一个参数", select.next('.layui-form-select'), {tips: [3, '#FF5722']}); //吸附提示
  322. }
  323. $.extend(data, {'parameter2': selectedVal});
  324. data.data_index = data_index
  325. activeByType('onParameterChange', data); //更新行记录对象
  326. }
  327. break;
  328. case "type_parameter1":
  329. var select = tr.find("select[name='parameter1']");
  330. if (select) {
  331. var selectedVal = select.val();
  332. if (!selectedVal) {
  333. layer.tips("请选择一个参数", select.next('.layui-form-select'), {tips: [3, '#FF5722']}); //吸附提示
  334. }
  335. $.extend(data, {'parameter1': selectedVal});
  336. data.data_index = data_index
  337. activeByType('onParameterChange', data); //更新行记录对象
  338. }
  339. break;
  340. case "type_status":
  341. var stateVal = tr.find("input[name='status']").val() === "1" ? "0" : "1";
  342. $.extend(data, {'status': stateVal})
  343. data.data_index = data_index
  344. activeByType('onParameterChange', data); //更新行记录对象
  345. break;
  346. case "param_img_event":
  347. // 给图片传tabel索引
  348. _data_index = data_index
  349. break;
  350. case "del":
  351. obj.del(); //删除对应行(tr)的DOM结构,并更新缓存
  352. activeByType('removeItem', data_index);
  353. layer.msg('删除成功', {icon: 6});
  354. break;
  355. }
  356. });
  357. $('#btn_add').on('click', function () {
  358. var oldData = table.cache[layTableId];
  359. var newRow = {
  360. id: '',
  361. price: '',
  362. stock: '',
  363. no: '',
  364. name: '',
  365. file: '',
  366. images_url: '',
  367. status: "1",
  368. parameter1: '',
  369. parameter2: '',
  370. }
  371. oldData.push(newRow);
  372. tableIns.reload({
  373. data: oldData
  374. });
  375. });
  376. //保存
  377. form.on('submit(component-form-element)', function (data) {
  378. var rows = table.cache[layTableId];
  379. var items = [];
  380. var formData = new FormData();
  381. var para_items = [] // 验证选择的参数是否重复
  382. for (var k in rows) {
  383. if (isNaN(rows[k].price) || isNaN(rows[k].stock)) {
  384. layer.msg("第" + (parseInt(k) + 1) + "行,请填写销售价格或库存", {icon: 2})
  385. return false
  386. }
  387. var param = rows[k].parameter1 + "," + rows[k].parameter2
  388. if (param.length > 1 && para_items.indexOf(param) > -1) {
  389. layer.msg("第" + (parseInt(k) + 1) + "行,选择的参数重复,请重新选择", {icon: 2})
  390. return false
  391. }
  392. para_items.push(param)
  393. var item = {
  394. id: rows[k].id,
  395. price: rows[k].price,
  396. stock: rows[k].stock,
  397. no: rows[k].no,
  398. name: rows[k].name,
  399. status: rows[k].status,
  400. parameter1: rows[k].parameter1,
  401. parameter2: rows[k].parameter2,
  402. };
  403. if (rows[k].file) {
  404. formData.append(`file${rows[k].file.data_index}`, rows[k].file)
  405. item['data_index'] = rows[k].file.data_index
  406. }
  407. items.push(item);
  408. }
  409. formData.append('items', JSON.stringify(items))
  410. if (items.length === 0) {
  411. layer.msg('请添加参数内容', {icon: 2});
  412. return false;
  413. }
  414. admin.req({
  415. url: '/commodity/' + id + '/add_details/'
  416. , data: formData
  417. , contentType: false
  418. , processData: false
  419. , type: 'post'
  420. , done: function (res) {
  421. parent.layui.onSubmitChild(res);
  422. }
  423. });
  424. return false;
  425. });
  426. parent.layui.submitChild = function () {
  427. $("#id_save").click();
  428. };
  429. });
  430. </script>
  431. </body>
  432. </html>