list.vue 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319
  1. <template>
  2. <div class="app-container" style="padding: 0 20px;">
  3. <el-menu :router="true" default-active="/goods/list" class="el-menu-demo" mode="horizontal">
  4. <el-menu-item index="/goods/list">全部商品</el-menu-item>
  5. <el-menu-item v-if="modules && modules.firstModulesName" index="/goods/list/preferred">{{ modules.firstModulesName }}</el-menu-item>
  6. <el-menu-item v-if="modules && modules.secondModulesName" index="/goods/list/preferential">{{ modules.secondModulesName }}</el-menu-item>
  7. <el-menu-item v-if="modules && modules.thirdModulesName" index="/goods/list/commonly">{{ modules.thirdModulesName }}</el-menu-item>
  8. </el-menu>
  9. <div class="filter-container" style="padding: 20px 0;">
  10. <el-form class="demo-form-inline goods-list">
  11. <el-form-item label="商品ID:" style="width:225px;float: left;">
  12. <el-input v-model="listQuery.id" type="number" placeholder="请输入商品ID" maxlength="30" style="width: 150px;" class="filter-item" @keyup.enter.native="handleFilter" />
  13. </el-form-item>
  14. <el-form-item label="商品名称:" style="width:240px;float: left;">
  15. <el-input v-model="listQuery.productName" placeholder="请输入商品名称" style="width: 150px;" class="filter-item" @keyup.enter.native="handleFilter" />
  16. </el-form-item>
  17. <el-form-item label="供应商名称:" style="width:250px;float: left;">
  18. <el-input v-model="listQuery.shopName" placeholder="请输入供应商名称" style="width: 150px;" class="filter-item" @keyup.enter.native="handleFilter" />
  19. </el-form-item>
  20. <el-form-item label="商品状态:" style="width:190px;float: left;">
  21. <el-select v-model="listQuery.validFlag" placeholder="商品状态" clearable style="width: 110px" class="filter-item" value="" @change="handleFilter">
  22. <el-option label="全部" value="" />
  23. <el-option label="已上架" value="1" />
  24. <el-option label="已下架" value="2" />
  25. </el-select>
  26. </el-form-item>
  27. <el-form-item label="商品分类:" style="width:200px;float: left;">
  28. <el-select v-model="listQuery.classifyID" placeholder="商品分类" clearable style="width: 110px" class="filter-item" value="" @change="handleFilter">
  29. <template v-for="item in classify">
  30. <el-option v-if="item.status*1 === 1" :key="item.id" :label="item.classifyName" :value="item.id" />
  31. </template>
  32. </el-select>
  33. </el-form-item>
  34. <el-form-item v-if="modules && modules.firstModulesName" :label="modules.firstModulesName+':'" style="width:180px;float: left;">
  35. <el-select v-model="listQuery.preferredProduct" placeholder="请选择" clearable style="width: 90px" class="filter-item" value="" @change="handleFilter">
  36. <!-- <el-option label="全部" value="" /> -->
  37. <el-option label="是" value="1" />
  38. <el-option label="否" value="0" />
  39. </el-select>
  40. </el-form-item>
  41. <el-form-item v-if="modules && modules.secondModulesName" :label="modules.secondModulesName+':'" style="width:180px;float: left;">
  42. <el-select v-model="listQuery.preferentialProduct" placeholder="请选择" clearable style="width: 90px" class="filter-item" value="" @change="handleFilter">
  43. <!-- <el-option label="全部" value="" /> -->
  44. <el-option label="是" value="1" />
  45. <el-option label="否" value="0" />
  46. </el-select>
  47. </el-form-item>
  48. <el-form-item v-if="modules && modules.thirdModulesName" :label="modules.thirdModulesName+':'" style="width:200px;float: left;">
  49. <el-select v-model="listQuery.commonlyProduct" placeholder="请选择" clearable style="width: 90px" class="filter-item" value="" @change="handleFilter">
  50. <!-- <el-option label="全部" value="" /> -->
  51. <el-option label="是" value="1" />
  52. <el-option label="否" value="0" />
  53. </el-select>
  54. </el-form-item>
  55. <el-form-item style="width:100px;float: left;">
  56. <el-button class="filter-item" type="primary" icon="el-icon-search" @click="handleFilter">
  57. 搜索
  58. </el-button>
  59. </el-form-item>
  60. </el-form>
  61. </div>
  62. <el-table
  63. v-loading="listLoading"
  64. :data="list"
  65. element-loading-text="Loading"
  66. border
  67. fit
  68. highlight-current-row
  69. style="width:100%;margin-top:20px;"
  70. :header-cell-style="{background:'#eef1f6',color:'#606266'}"
  71. >
  72. <el-table-column align="center" label="序号" width="35">
  73. <template slot-scope="scope">
  74. <span style="white-space:nowrap">{{ ((pageNum-1)*listQuery.pageSize)+scope.$index+1 }}</span>
  75. </template>
  76. </el-table-column>
  77. <el-table-column label="商品ID" align="center" prop="id" width="50" />
  78. <el-table-column label="商品图片" align="center" prop="mainImage">
  79. <template slot-scope="{row}">
  80. <img :src="row.mainImage" alt="" width="50">
  81. </template>
  82. </el-table-column>
  83. <el-table-column label="商品名称" align="center" prop="productName" min-width="200" />
  84. <el-table-column label="供应商" align="center" prop="shopName" min-width="110" />
  85. <el-table-column label="市场价" align="center" prop="normalPrice" />
  86. <el-table-column label="成本价" align="center" prop="costPrice" />
  87. <el-table-column label="售价" align="center" prop="retailPrice" />
  88. <el-table-column label="起订量" align="center" prop="minBuyNumber" width="70" />
  89. <el-table-column v-if="modules && modules.firstModulesName" :label="modules.firstModulesName" align="center" prop="preferredProduct" width="50">
  90. <template slot-scope="{row}">
  91. <!--<el-tag :type="row.preferredProduct | statusFilter">{{ row.preferredProduct*1 === 1 ? '启用' : '停用' }}</el-tag>-->
  92. <i v-if="row.preferredProduct*1 === 1" class="el-icon-success" type="success" />
  93. </template>
  94. </el-table-column>
  95. <el-table-column v-if="modules && modules.secondModulesName" :label="modules.secondModulesName" align="center" prop="preferentialProduct" width="50">
  96. <template slot-scope="{row}">
  97. <!--<el-tag :type="row.preferentialProduct | statusFilter">{{ row.preferentialProduct*1 === 1 ? '启用' : '停用' }}</el-tag>-->
  98. <i v-if="row.preferentialProduct*1 === 1" class="el-icon-success" type="success" />
  99. </template>
  100. </el-table-column>
  101. <el-table-column v-if="modules && modules.thirdModulesName" :label="modules.thirdModulesName" align="center" prop="commonlyProduct" width="50">
  102. <template slot-scope="{row}">
  103. <!--<el-tag :type="row.commonlyProduct | statusFilter">{{ row.commonlyProduct*1 === 1 ? '启用' : '停用' }}</el-tag>-->
  104. <i v-if="row.commonlyProduct*1 === 1" class="el-icon-success" type="success" />
  105. </template>
  106. </el-table-column>
  107. <el-table-column class-name="status-col" label="商品状态" align="center" prop="validFlag">
  108. <template slot-scope="{row}">
  109. <el-tag :type="row.validFlag | statusFilter">{{ row.validFlag*1 === 1 ? '已上架' : '已下架' }}</el-tag>
  110. </template>
  111. </el-table-column>
  112. <el-table-column label="商品分类" align="center" prop="productClassifyName" width="100" />
  113. <el-table-column align="center" label="添加时间" prop="addTime">
  114. <template v-if="row.addTime" slot-scope="{row}">
  115. <span>{{ row.addTime | parseTime('{y}-{m}-{d} {h}:{i}:{s}') }}</span>
  116. </template>
  117. </el-table-column>
  118. <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
  119. <template slot-scope="{row}">
  120. <el-button type="primary" size="mini" style="width: 70px;margin:5px 0 0 0;" @click="handleEdit(row)">编辑</el-button>
  121. <el-button :type="row.validFlag*1 === 1 ? 'danger' : 'success'" size="mini" style="width: 70px;margin:5px 0 0 0;" @click="handleSwitch(row)">{{ row.validFlag*1 === 1 ? '下架' : '上架' }}</el-button>
  122. </template>
  123. </el-table-column>
  124. </el-table>
  125. <pagination v-show="total>20" :total="total" :page.sync="listQuery.index" :limit.sync="listQuery.pageSize" @pagination="fetchData" />
  126. <el-dialog :title="dialogTitle" :visible.sync="dialogFormVisible">
  127. <el-form ref="dataForm" :rules="rules" :model="dialog" label-position="left" label-width="220px" style="width:360px; margin:0 auto;">
  128. <el-form-item label="商品分类" prop="classifyID">
  129. <el-select v-model="dialog.classifyID" placeholder="商品分类" :label="dialog.productClassifyName" clearable class="filter-item" :value="dialog.classifyID*1">
  130. <template v-for="item in classify">
  131. <el-option v-if="item.status*1 === 1" :key="item.id" :label="item.classifyName" :value="item.id" />
  132. </template>
  133. </el-select>
  134. </el-form-item>
  135. <el-form-item :label="'市场价(' + dialog.normalPrice + '),修改为:'" prop="normalPrice">
  136. <el-input v-model="dialog.normalPrice" />
  137. </el-form-item>
  138. <el-form-item :label="'成本价(' + dialog.costPrice + '),修改为:'" prop="costPrice">
  139. <el-input v-model="dialog.costPrice" />
  140. </el-form-item>
  141. <el-form-item :label="'售价(' + dialog.retailPrice + '),修改为:'" prop="retailPrice">
  142. <el-input v-model="dialog.retailPrice" />
  143. </el-form-item>
  144. <el-form-item :label="'起订量(' + dialog.minBuyNumber + '),修改为:'" prop="minBuyNumber">
  145. <el-input v-model="dialog.minBuyNumber" />
  146. </el-form-item>
  147. </el-form>
  148. <div slot="footer" class="dialog-footer">
  149. <el-button @click="dialogFormVisible = false">
  150. 关闭
  151. </el-button>
  152. <el-button type="primary" @click="updateGoods">
  153. 确认
  154. </el-button>
  155. </div>
  156. </el-dialog>
  157. <template>
  158. <el-backtop style="right: 40px; bottom: 40px;">
  159. <i class="el-icon-upload2" />
  160. </el-backtop>
  161. </template>
  162. </div>
  163. </template>
  164. <script>
  165. import { getList, getModule, switchGoods, saveGoods } from '@/api/goods'
  166. import Pagination from '@/components/Pagination'
  167. export default {
  168. components: { Pagination },
  169. filters: {
  170. statusFilter(status) {
  171. const statusMap = {
  172. 1: 'success',
  173. 0: 'danger'
  174. }
  175. return statusMap[status]
  176. }
  177. },
  178. data: function() {
  179. return {
  180. pageNum: 0,
  181. activeIndex: '0',
  182. list: null,
  183. modules: null,
  184. classify: null,
  185. listLoading: true,
  186. total: 0,
  187. listQuery: {
  188. index: 1,
  189. pageSize: 20,
  190. organizeID: this.$store.getters.organizeID,
  191. id: '',
  192. productName: '',
  193. shopName: '',
  194. classifyID: '', // 商品分类
  195. validFlag: '', // '商品状态,1已上架,2已下架',
  196. preferredProduct: '', // 是否是优选商品:0不是优选,1优选商品',
  197. commonlyProduct: '', // 是否是常用商品:0不是常用,1常用商品',
  198. preferentialProduct: '', // 是否是星范精品:0不是精品,1星范精品商品',
  199. productClassifyName: '' // '对应cm_mall_products_classify商品分类表id',
  200. },
  201. dialogFormVisible: false,
  202. dialogStatus: '',
  203. dialogTitle: '编辑',
  204. dialog: {
  205. id: '',
  206. classifyID: 0,
  207. normalPrice: '',
  208. costPrice: '',
  209. retailPrice: '',
  210. minBuyNumber: '',
  211. productClassifyName: ''
  212. },
  213. rules: {
  214. classifyID: [{ required: true, message: '请选择分类', trigger: 'change' }],
  215. normalPrice: [{ required: true, message: '市场价不能为空', trigger: 'blur' }],
  216. costPrice: [{ required: true, message: '成本价不能为空', trigger: 'blur' }],
  217. retailPrice: [{ required: true, message: '售价不能为空', trigger: 'blur' }],
  218. minBuyNumber: [{ required: true, message: '起订量不能为空', trigger: 'blur' }]
  219. }
  220. }
  221. },
  222. computed: {
  223. organizeID() {
  224. return this.$store.getters.organizeID
  225. }
  226. },
  227. created() {
  228. this.getModuleType()
  229. this.fetchData()
  230. },
  231. methods: {
  232. getModuleType() {
  233. getModule({ organizeID: this.$store.getters.organizeID }).then(response => {
  234. this.modules = response.data[0]
  235. })
  236. },
  237. fetchData() {
  238. this.listLoading = true
  239. getList(this.listQuery).then(response => {
  240. const { organizeProductsPage, listByEffective } = response.data
  241. this.pageNum = organizeProductsPage.index
  242. this.list = organizeProductsPage.results
  243. this.total = organizeProductsPage.totalRecord
  244. this.classify = listByEffective
  245. this.listLoading = false
  246. })
  247. },
  248. handleFilter() {
  249. this.fetchData()
  250. },
  251. handleSwitch(row) {
  252. if (row.validFlag === '1') {
  253. this.$confirm('确定下架该商品吗?下架后该商品将不会出现在小程序商城。', '系统提示', {
  254. confirmButtonText: '确定',
  255. cancelButtonText: '取消',
  256. type: 'warning'
  257. }).then(() => {
  258. this.handSwithGoods(row)
  259. })
  260. } else {
  261. this.$confirm('确定上架该商品吗?', '系统提示', {
  262. confirmButtonText: '确定',
  263. cancelButtonText: '取消',
  264. type: 'warning'
  265. }).then(() => {
  266. this.handSwithGoods(row)
  267. })
  268. }
  269. },
  270. handSwithGoods(row) {
  271. switchGoods({ id: row.id }).then(() => {
  272. this.fetchData()
  273. }).catch(() => {
  274. this.fetchData()
  275. })
  276. },
  277. handleEdit(row) {
  278. this.dialog = Object.assign({}, row)
  279. this.dialog.classifyID = this.dialog.classifyID * 1
  280. this.dialogFormVisible = true
  281. this.$nextTick(() => {
  282. this.$refs['dataForm'].clearValidate()
  283. })
  284. },
  285. updateGoods() {
  286. this.$refs['dataForm'].validate((valid) => {
  287. if (valid) {
  288. saveGoods(this.dialog).then(response => {
  289. this.$notify({
  290. title: response.code * 1 === 1 ? 'Success' : 'Error',
  291. message: response.code * 1 === 1 ? '编辑成功' : response.msg,
  292. type: response.code * 1 === 1 ? 'success' : 'error',
  293. duration: 2000
  294. })
  295. this.fetchData()
  296. this.dialogFormVisible = false
  297. })
  298. }
  299. })
  300. }
  301. }
  302. }
  303. </script>
  304. <style lang="scss" scoped>
  305. i[type=success]{
  306. color:#67C23A;
  307. }
  308. .goods-list .el-form-item{
  309. margin-bottom: 8px;
  310. }
  311. </style>