com-dialog-select-goods.php 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. <style>
  2. .com-dialog-dialog {
  3. min-width: 1200px;
  4. }
  5. </style>
  6. <template id="com-dialog-screen-select">
  7. <div class="com-dialog-screen-select">
  8. <el-dialog append-to-body :title="title" :visible.sync="visible" :close-on-click-modal="false"
  9. custom-class="com-dialog-dialog" :before-close="close" @close="close">
  10. <div>
  11. <div class="search-box">
  12. <div class="input-item" style="margin-right:5px;display:flex;min-width:600px;flex-direction: row;">
  13. <el-input style="width: 300px;" @keyup.enter.native="getDetail(1)" size="small"
  14. placeholder="根据商品名称或商品ID搜索"
  15. v-model="keyword"> </el-input>
  16. <el-button type="primary" size="small" @click="getDetail(1)" style="margin-left:20px">搜索</el-button>
  17. <el-button type="warning" size="small" @click="clereSearch" v-if="keyword" style="padding: 9px 15px !important;">重置</el-button>
  18. </div>
  19. </div>
  20. <slot name="inputslot"></slot>
  21. <el-tabs v-model="activeName" @tab-click="handleClick">
  22. <el-tab-pane v-for="item in tabs" :key="item.id" :label="item.name"
  23. :name="item.id">
  24. </el-tab-pane>
  25. </el-tabs>
  26. <el-table ref="multipleTable" border v-loading="listLoading" :data="list" style="margin-top: 24px;"
  27. @selection-change="handleSelectionChange" multipe>
  28. <el-table-column type="selection" width="60px" label="ID" props="id" v-if="multiple">
  29. </el-table-column>
  30. <el-table-column width="100px" label="ID" props="id" v-else>
  31. <template slot-scope="props">
  32. <el-radio-group v-model="radioSelection" @change="handleSelectionChange(props.row)">
  33. <el-radio :label="props.row.id"></el-radio>
  34. </el-radio-group>
  35. </template>
  36. </el-table-column>
  37. <el-table-column label="分类" align="center" width="200">
  38. <template slot-scope="scope">
  39. <div class="goods-cat">
  40. <el-tag v-if="scope.row.cats && scope.row.cats.length > 0" size="mini">
  41. {{scope.row.cats[0].name}}
  42. </el-tag>
  43. <el-tooltip v-if="scope.row.cats && scope.row.cats.length > 1" placement="top">
  44. <div slot="content">
  45. <span v-for="item in scope.row.cats" :key="item.id">{{item.name}}&nbsp;</span>
  46. </div>
  47. <span>...</span>
  48. </el-tooltip>
  49. </div>
  50. </template>
  51. </el-table-column>
  52. <el-table-column v-if="multiple" prop="id" label="ID" width="80" align="center"></el-table-column>
  53. <el-table-column label="商品信息">
  54. <template slot-scope="props">
  55. <div style="display: flex;">
  56. <el-image fit="cover" style="width: 40px;height: 40px;display: block;margin-right: 5px;" :src="props.row.cover_pic"></el-image>
  57. <div>
  58. <div style="overflow: hidden; text-overflow: ellipsis; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical;">
  59. {{props.row[listKey]}}
  60. </div>
  61. <div style="font-size: 12px;color: red;">¥{{props.row.price}}</div>
  62. </div>
  63. </div>
  64. </template>
  65. </el-table-column>
  66. <el-table-column label="库存" width="100" prop="stock"></el-table-column>
  67. <el-table-column label="购买数量" width="120" prop="buy_num">
  68. <template slot-scope="props">
  69. <el-input v-model="props.row.buy_num" :min="1" :max="props.row.stock" size="small"
  70. type="number"
  71. style="width:
  72. 80px;
  73. "></el-input>
  74. </template>
  75. </el-table-column>
  76. </el-table>
  77. </div>
  78. <div style="margin-top: 24px;">
  79. <el-row>
  80. <el-pagination
  81. v-if="pagination"
  82. style="display: inline-block;"
  83. background
  84. :page-size="pagination.pageSize"
  85. @current-change="getDetail"
  86. layout="prev, pager, next"
  87. :total="pagination.total_count">
  88. </el-pagination>
  89. <el-button type="primary" size="small" style="float: right" @click="confirm">选择</el-button>
  90. </el-row>
  91. </div>
  92. </el-dialog>
  93. <div @click="click" style="display: inline-block">
  94. <slot></slot>
  95. </div>
  96. </div>
  97. </template>
  98. <script>
  99. Vue.component('com-dialog-screen-select', {
  100. template: '#com-dialog-screen-select',
  101. props: {
  102. url: {
  103. type: String,
  104. default: 'mall/goods/search'
  105. },
  106. multiple: Boolean,//是否开启选
  107. title: {
  108. type: String,
  109. default: '商品选择'
  110. },
  111. listKey: { //键值
  112. type: String,
  113. default: 'goods_name'
  114. },
  115. params: Object,
  116. display: Boolean,
  117. extraSearch: Object,
  118. },
  119. data() {
  120. return {
  121. activeName:'0',
  122. visible: false,
  123. listLoading: false,
  124. list: [],
  125. total_count:1,
  126. pageSize:20,
  127. pagination: null,
  128. radioSelection: 0,
  129. keyword: null,
  130. multipleSelection: [],
  131. select_main_goods_id:'',
  132. tabs: [
  133. {
  134. name: '全部',
  135. id: '0',
  136. },
  137. ],
  138. }
  139. },
  140. methods: {
  141. handleClick(){
  142. this.getDetail(1)
  143. },
  144. close(){
  145. this.visible=false;
  146. this.$emit('close');
  147. },
  148. click() {
  149. this.getDetail(1);
  150. this.visible = !this.visible;
  151. },
  152. getDetail(page) {
  153. this.list = [];
  154. let self = this;
  155. this.listLoading = true;
  156. let baseParams = {
  157. r: this.url,
  158. keyword: this.keyword,
  159. label_id: this.activeName,
  160. page: page
  161. };
  162. let params = Object.assign({}, baseParams, this.params);
  163. request({
  164. params: params
  165. }).then(e => {
  166. this.listLoading = false;
  167. if (e.data.code === 0) {
  168. this.list = e.data.data.list;
  169. this.pagination = e.data.data.pagination;
  170. this.pagination.pageSize = e.data.data.page_size;
  171. this.pagination.total_count = this.pagination.totalCount;
  172. if(self.tabs.length==1)
  173. {
  174. self.tabs=self.tabs.concat(e.data.data.goods_label)
  175. }
  176. } else {
  177. this.$message.error(e.data.msg);
  178. }
  179. }).catch(e => {
  180. this.listLoading = false;
  181. });
  182. },
  183. chooseAll(){
  184. this.list.forEach(row => {
  185. this.$refs.multipleTable.toggleRowSelection(row);
  186. });
  187. },
  188. clear(){
  189. this.$refs.multipleTable.clearSelection();
  190. },
  191. handleSelectionChange(val) {
  192. this.multipleSelection = val;
  193. },
  194. confirm() {
  195. this.visible = false;
  196. this.$emit('selected', this.multipleSelection);
  197. this.$emit('input', this.multipleSelection);
  198. },
  199. clereSearch() {
  200. this.keyword = '';
  201. this.getDetail(1);
  202. },
  203. }
  204. });
  205. </script>