index.vue 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. <template>
  2. <ele-page flex-table>
  3. <page-search @search="reload"></page-search>
  4. <common-table ref="pageRef" :pageConfig="pageConfig" :columns="columns">
  5. <template #toolbar>
  6. <el-button
  7. type="primary"
  8. plain
  9. :icon="PlusOutlined"
  10. v-permission="'recycle:inventory:add'"
  11. @click="handleUpdate()"
  12. >
  13. 新增图书商品
  14. </el-button>
  15. <el-button
  16. type="primary"
  17. plain
  18. v-permission="'recycle:inventory:import'"
  19. @click="handleImportExcel"
  20. :icon="UploadOutlined"
  21. >
  22. 批量导入
  23. </el-button>
  24. <el-button
  25. type="success"
  26. plain
  27. v-permission="'recycle:inventory:checkNew'"
  28. @click="handleCheckNew"
  29. :icon="CloudUploadOutlined"
  30. >
  31. 检测上新
  32. </el-button>
  33. </template>
  34. <template #cover="{ row }">
  35. <el-image
  36. style="width: 80px; height: 100px"
  37. fit="cover"
  38. :src="row?.bookInfo?.cover"
  39. :preview-src-list="[row?.bookInfo?.cover]"
  40. :initial-index="0"
  41. preview-teleported
  42. />
  43. </template>
  44. <template #baseInfo="{ row }">
  45. <book-base-info
  46. :row="row?.bookInfo"
  47. @click="handleUpdate"
  48. ></book-base-info>
  49. </template>
  50. <template #stock="{ row }">
  51. <book-stock :row="row"></book-stock>
  52. </template>
  53. <template #action="{ row }">
  54. <div>
  55. <el-button
  56. type="success"
  57. link
  58. v-permission="'recycle:inventory:update'"
  59. @click="handleUpdate(row)"
  60. >
  61. [编辑]
  62. </el-button>
  63. <el-button
  64. type="danger"
  65. link
  66. v-permission="'recycle:inventory:recycleDetail'"
  67. @click="handleRecycleDetail(row)"
  68. >
  69. [回收明细]
  70. </el-button>
  71. <el-button
  72. type="warning"
  73. link
  74. v-permission="'recycle:inventory:saleDetail'"
  75. @click="handleSaleDetail(row)"
  76. >
  77. [销售明细]
  78. </el-button>
  79. </div>
  80. </template>
  81. </common-table>
  82. <books-edit ref="editRef" @success="reload()"></books-edit>
  83. <books-import
  84. ref="importRef"
  85. v-model="showImport"
  86. @done="reload()"
  87. ></books-import>
  88. <book-check-new ref="checkNewRef"></book-check-new>
  89. <recycle-detail ref="recycleDetailRef"></recycle-detail>
  90. <sale-detail ref="saleDetailRef"></sale-detail>
  91. </ele-page>
  92. </template>
  93. <script setup>
  94. import { ref, reactive } from 'vue';
  95. import {
  96. PlusOutlined,
  97. UploadOutlined,
  98. CloudUploadOutlined
  99. } from '@/components/icons';
  100. import { ElMessage } from 'element-plus';
  101. import pageSearch from './components/page-search.vue';
  102. import CommonTable from '@/components/CommonPage/CommonTable.vue';
  103. import booksEdit from '@/views/data/books/components/books-edit.vue';
  104. import booksImport from '@/views/data/books/components/books-import.vue';
  105. import bookBaseInfo from './components/book-base-info.vue';
  106. import bookCheckNew from './components/book-check-new.vue';
  107. import bookStock from './components/book-stock.vue';
  108. import recycleDetail from './components/recycle-detail.vue';
  109. import saleDetail from './components/sale-detail.vue';
  110. import { useDictData } from '@/utils/use-dict-data';
  111. defineOptions({ name: 'recycleOrderCancelled' });
  112. const [perCheckDicts] = useDictData(['is_common_yes']);
  113. /** 表格列配置 */
  114. const columns = ref([
  115. {
  116. type: 'selection',
  117. columnKey: 'selection',
  118. width: 50,
  119. align: 'center',
  120. fixed: 'left'
  121. },
  122. {
  123. label: '图片',
  124. prop: 'cover',
  125. slot: 'cover',
  126. align: 'center'
  127. },
  128. {
  129. label: '基础信息',
  130. prop: 'baseInfo',
  131. slot: 'baseInfo',
  132. align: 'center',
  133. minWidth: 320
  134. },
  135. {
  136. label: '商品类型',
  137. prop: 'goodsType',
  138. formatter: (row) => '图书商品',
  139. align: 'center'
  140. },
  141. {
  142. label: '售价',
  143. prop: 'salePrice',
  144. align: 'center',
  145. minWidth: 100,
  146. formatter: (row) => '¥' + (row?.salePrice ? row.salePrice : 0)
  147. },
  148. {
  149. label: '库存',
  150. prop: 'stock',
  151. align: 'center',
  152. minWidth: 100,
  153. slot: 'stock'
  154. },
  155. {
  156. label: '销量',
  157. prop: 'salesNum',
  158. align: 'center',
  159. minWidth: 100,
  160. formatter: (row) => row.salesNum || 0
  161. },
  162. {
  163. columnKey: 'action',
  164. label: '操作',
  165. width: 200,
  166. align: 'center',
  167. slot: 'action'
  168. }
  169. ]);
  170. /** 页面组件实例 */
  171. const pageRef = ref(null);
  172. const pageConfig = reactive({
  173. pageUrl: '/book/stock/pagelist',
  174. fileName: '库存数据',
  175. cacheKey: 'books-stock-data'
  176. });
  177. //导入
  178. const showImport = ref(false);
  179. function handleImportExcel() {
  180. showImport.value = true;
  181. }
  182. //刷新表格
  183. function reload(where) {
  184. pageRef.value?.reload(where);
  185. }
  186. //新增编辑图书
  187. const editRef = ref(null);
  188. function handleUpdate(row) {
  189. editRef.value?.handleOpen(row);
  190. }
  191. //检测上新
  192. const checkNewRef = ref(null);
  193. function handleCheckNew() {
  194. checkNewRef.value?.handleOpen();
  195. }
  196. //回收明细
  197. const recycleDetailRef = ref(null);
  198. function handleRecycleDetail(row) {
  199. recycleDetailRef.value?.handleOpen(row);
  200. }
  201. //销售明细
  202. const saleDetailRef = ref(null);
  203. function handleSaleDetail(row) {
  204. saleDetailRef.value?.handleOpen(row);
  205. }
  206. </script>