index.php 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271
  1. <?php
  2. use common\helpers\ComponentHelper;
  3. ComponentHelper::loadComponentView('com-list-page');
  4. ComponentHelper::loadComponentView('com-list-table');
  5. ?>
  6. <com-list-page :crumbs="crumbs" id="application">
  7. <com-list-table
  8. ref="table"
  9. :api="'star-chain/storage/index'"
  10. :search-list="searchList"
  11. @selection-change="handleSelectionChange"
  12. >
  13. <el-table-column type="selection"></el-table-column>
  14. <el-table-column prop="spu_id" align="center" label="SPU_ID">
  15. </el-table-column>
  16. <el-table-column prop="goods" align="center" width="200px" label="商品">
  17. <template slot-scope="scope">
  18. <div class="goods">
  19. <div class="goods-img">
  20. <el-image :src="scope.row.goods.carousel_img_list[0]" fit="fill" style="width: 60px; height: 60px"></el-image>
  21. </div>
  22. <div class="goods-name">
  23. <span>{{ sub(scope.row.goods.name) }}</span>
  24. </div>
  25. </div>
  26. </template>
  27. </el-table-column>
  28. <el-table-column prop="category_name" align="center" label="分类">
  29. <template slot-scope="scope">
  30. {{ scope.row.goods.category1.name }}
  31. {{ scope.row.goods.category2.name }}
  32. {{ scope.row.goods.category3.name }}
  33. </template>
  34. </el-table-column>
  35. <el-table-column prop="status" label="商品状态" align="center">
  36. <template slot-scope="scope">
  37. <!-- {{ scope.row.goods.status == 1 ? '下架' : '上架' }} -->
  38. <el-tag type="success" v-if="scope.row.goods.status == 0">上架</el-tag>
  39. <el-tag type="warning" v-if="scope.row.goods.status == 1">下架</el-tag>
  40. </template>
  41. </el-table-column>
  42. <el-table-column prop="mall_goods" label="商城ID" align="center">
  43. <template slot-scope="scope">
  44. <a href="javascript:;" @click="mallGoods(scope.row.mall_goods_id)" v-if="scope.row.import == 2">
  45. {{ scope.row.mall_goods_id }}
  46. </a>
  47. <span v-if="scope.row.import == 1">
  48. 导入中
  49. </span>
  50. <span v-if="scope.row.import == 0">
  51. 未导入
  52. </span>
  53. <span v-if="scope.row.import == -1">
  54. {{ scope.row.error }}
  55. </span>
  56. </template>
  57. </el-table-column>
  58. <el-table-column prop="import" label="添加时间" align="center">
  59. <template slot-scope="scope">
  60. <span v-if="scope.row.import == 2">
  61. {{ scope.row.updated_at|dateTimeFormat('Y-m-d H:i:s') }}
  62. </span>
  63. <span v-else>
  64. --
  65. </span>
  66. </template>
  67. </el-table-column>
  68. <el-table-column align="center" label="操作">
  69. <template slot-scope="scope">
  70. <el-button type="text" :loading="btnLoading" @click="againImport([scope.row.id])">重新导入</el-button>
  71. <el-button type="text" :loading="btnLoading" @click="removeImport([scope.row.id])">移除</el-button>
  72. </template>
  73. </el-table-column>
  74. <template slot="footer-button">
  75. <el-button size="mini" :loading="btnLoading" type="primary" @click="batchAgainImport">批量导入</el-button>
  76. <el-button size="mini" :loading="btnLoading" type="danger" @click="batchRemoveImport">批量移除</el-button>
  77. </template>
  78. </com-list-table>
  79. </com-list-page>
  80. <script>
  81. const application = new Vue({
  82. el: '#application',
  83. data: {
  84. crumbs: [
  85. {
  86. title: '首页',
  87. router: 'mall/overview/index',
  88. },
  89. {
  90. title: '选品管理',
  91. }
  92. ],
  93. searchList: [
  94. {
  95. key: 'name',
  96. title: '商品名称',
  97. type: 'text',
  98. },
  99. {
  100. key: 'import',
  101. title: '导入状态',
  102. type: 'select',
  103. options: [
  104. {
  105. label: '未导入',
  106. value: 0,
  107. },
  108. {
  109. label: '导入中',
  110. value: 1,
  111. },
  112. {
  113. label: '已导入',
  114. value: 2,
  115. }
  116. ],
  117. valueKey: {
  118. label: 'label',
  119. value: 'value',
  120. },
  121. },
  122. {
  123. key: 'category_ids',
  124. title: '分类',
  125. type: 'cascader',
  126. props: {
  127. checkStrictly: true,
  128. lazy: true,
  129. lazyLoad (node, resolve) {
  130. let pid = node.value ?? 0
  131. setTimeout(() => {
  132. request({
  133. params: {
  134. r: 'star-chain/goods/category',
  135. pid: pid,
  136. },
  137. }).then(e => {
  138. if (e.data.code === 0) {
  139. let nodes = e.data.data.map(item => ({
  140. value: item.id,
  141. label: item.name,
  142. level: item.level,
  143. leaf: item.level > 2
  144. }))
  145. resolve(nodes);
  146. }
  147. })
  148. }, 50);
  149. }
  150. }
  151. },
  152. ],
  153. btnLoading: false,
  154. },
  155. methods: {
  156. /**
  157. * 字符串裁剪
  158. */
  159. sub (string) {
  160. string = string + ''
  161. var reg = /[\u4e00-\u9fa5]/g, //专业匹配中文
  162. slice = string.substring(0, 15),
  163. chineseCharNum = (~~(slice.match(reg) && slice.match(reg).length)),
  164. realen = slice.length*2 - chineseCharNum;
  165. return string.substr(0, realen) + (realen < string.length ? "..." : "");
  166. },
  167. /**
  168. * 跳转到商城商品
  169. */
  170. mallGoods (id) {
  171. this.$navigate({
  172. r: 'mall/goods/edit',
  173. id: id
  174. })
  175. },
  176. /**
  177. * 移除商品
  178. */
  179. removeImport (ids) {
  180. this.btnLoading = true
  181. request({
  182. method: 'post',
  183. params: {
  184. r: 'star-chain/storage/remove-import',
  185. },
  186. data: {
  187. ids: ids
  188. },
  189. }).then(e => {
  190. if (e.data.code === 0) {
  191. this.$message.success(e.data.msg);
  192. setTimeout(() => {
  193. this.$refs['table'].reload()
  194. this.btnLoading = false
  195. }, 2000)
  196. } else {
  197. this.$message.error(e.data.msg)
  198. this.btnLoading = false
  199. }
  200. }).catch(e => {})
  201. },
  202. /**
  203. * 重新导入
  204. */
  205. againImport (ids) {
  206. this.btnLoading = true
  207. request({
  208. method: 'post',
  209. params: {
  210. r: 'star-chain/storage/again-import',
  211. },
  212. data: {
  213. ids: ids
  214. },
  215. }).then(e => {
  216. if (e.data.code === 0) {
  217. this.$message.success('导入成功')
  218. this.btnLoading = false
  219. setTimeout(() => {
  220. this.getStorageList()
  221. }, 1500)
  222. } else {
  223. this.$message.error(e.data.msg)
  224. this.btnLoading = false
  225. }
  226. })
  227. },
  228. /**
  229. * 批量移除
  230. */
  231. batchRemoveImport() {
  232. this.$confirm('确认操作吗?').then(() => {
  233. this.removeImport(this.selectIds)
  234. })
  235. },
  236. /**
  237. * 批量导入
  238. */
  239. batchAgainImport() {
  240. this.$confirm('确认操作吗?').then(() => {
  241. this.againImport(this.selectIds)
  242. })
  243. },
  244. /**
  245. * 全选
  246. */
  247. handleSelectionChange(val) {
  248. this.selectIds = val.map(item => {
  249. return item.id
  250. })
  251. },
  252. },
  253. mounted: function() {
  254. this.getCategoryList()
  255. },
  256. })
  257. </script>
  258. <style>
  259. .goods {
  260. display: flex;
  261. }
  262. .goods-name {
  263. margin-left: 5px;
  264. }
  265. .page {
  266. margin-top: 10px;
  267. }
  268. </style>