handsel.vue 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329
  1. <template>
  2. <div class="app-container">
  3. <div class="section">
  4. <!-- 选择供应商 -->
  5. <div class="item">
  6. <div class="label"><span>*</span>供应商:</div>
  7. <el-button size="mini" type="primary" @click="handleChooseSupplier">选择供应商</el-button>
  8. </div>
  9. <!-- 选中的供应商列表 -->
  10. <el-table :data="currentSupplierList" class="table-cell" empty-text="请选择供应商">
  11. <el-table-column label="序号" type="index" width="80" align="center" />
  12. <el-table-column property="name" label="供应商名称" />
  13. <el-table-column label="供应商类型" align="center" width="120">
  14. <template slot-scope="{ row }">
  15. <span v-if="row.shopType === 1">品牌方</span>
  16. <span v-else>代理商</span>
  17. </template>
  18. </el-table-column>
  19. <el-table-column label="登录账号" align="center">
  20. <template slot-scope="{ row }">
  21. <span v-if="row.loginAccount">{{ row.loginAccount }}</span>
  22. <span v-else>未绑定</span>
  23. </template>
  24. </el-table-column>
  25. <el-table-column prop="mobile" label="手机号" align="center" />
  26. <el-table-column prop="linkMan" label="联系人" align="center" />
  27. <el-table-column label="操作" align="center">
  28. <template>
  29. <el-button type="primary" size="mini" @click="removeSupplier">删除</el-button>
  30. </template>
  31. </el-table-column>
  32. </el-table>
  33. <!-- 选择套餐 -->
  34. <div class="item">
  35. <div class="label"><span>*</span>套餐:</div>
  36. <el-select v-model="selected" placeholder="请选择" @change="handlePackageChange">
  37. <el-option v-for="item in packageList" :key="item.id" :label="item.name" :value="item.id" />
  38. </el-select>
  39. </div>
  40. <!-- 选中的套餐 -->
  41. <el-table :data="currentPackageList" class="table-cell" empty-text="请选择会员套餐">
  42. <el-table-column label="序号" type="index" width="80" align="center" />
  43. <el-table-column prop="name" label="套餐名称" align="center" />
  44. <el-table-column label="会员期限" align="center">
  45. <template slot-scope="{ row }">
  46. <span v-if="row.unit === 1">{{ row.duration }}月</span>
  47. <span v-if="row.unit === 2">{{ row.duration }}年</span>
  48. </template>
  49. </el-table-column>
  50. <el-table-column label="原价" align="center">
  51. <template slot-scope="{ row }">
  52. <span>{{ row.originalPrice | formatPrice }}</span>
  53. </template>
  54. </el-table-column>
  55. <el-table-column label="现价" align="center">
  56. <template slot-scope="{ row }">
  57. <span>{{ row.price | formatPrice }}</span>
  58. </template>
  59. </el-table-column>
  60. </el-table>
  61. </div>
  62. <!-- 确认 取消 -->
  63. <div class="control-box">
  64. <el-button type="warning" @click="navigateBack">返回</el-button>
  65. <el-button type="primary" @click="onSubmit">开通</el-button>
  66. </div>
  67. <!-- 选择供应商dialog -->
  68. <el-dialog title="选择供应商" :visible.sync="dialogTableVisible" width="66%" @closed="handleDialogClosed">
  69. <div>
  70. <div class="filter-container">
  71. <div class="filter-control">
  72. <div class="filter-control">
  73. <span>供应商名称:</span>
  74. <el-input
  75. v-model="listQuery.shopName"
  76. size="mini"
  77. placeholder="供应商名称"
  78. clearable
  79. @keyup.enter.native="fetchSupplierList"
  80. />
  81. </div>
  82. <div class="filter-control">
  83. <span>供应商类型:</span>
  84. <el-select
  85. v-model="listQuery.shopType"
  86. placeholder="供应商类型"
  87. size="mini"
  88. clearable
  89. @change="fetchSupplierList"
  90. >
  91. <el-option label="所有类型" value="" />
  92. <el-option label="代理商" :value="2" />
  93. <el-option label="品牌方" :value="1" />
  94. </el-select>
  95. </div>
  96. <div class="filter-control">
  97. <span>手机号:</span>
  98. <el-input
  99. v-model="listQuery.mobile"
  100. clearable
  101. size="mini"
  102. placeholder="手机号"
  103. @keyup.enter.native="fetchSupplierList"
  104. />
  105. </div>
  106. <div class="filter-control">
  107. <span>联系人:</span>
  108. <el-input
  109. v-model="listQuery.linkMan"
  110. clearable
  111. size="mini"
  112. placeholder="联系人"
  113. @keyup.enter.native="fetchSupplierList"
  114. />
  115. </div>
  116. <div class="filter-control">
  117. <el-button type="primary" size="mini" @click="filterSupplierList">查询</el-button>
  118. </div>
  119. </div>
  120. </div>
  121. <el-table
  122. v-infinite-scroll="onLoad"
  123. :data="supplierList"
  124. class="infinite-list hide-table-check-all"
  125. style="overflow: auto"
  126. :infinite-scroll-delay="300"
  127. :infinite-scroll-immediate="false"
  128. header-row-class-name="tableHeader"
  129. highlight-current-row
  130. @row-click="handleSelectSupplier"
  131. >
  132. >
  133. <el-table-column label="选择" width="55" align="center">
  134. <template slot-scope="{ row }">
  135. <el-radio v-model="selectedAuthUserId" :label="row.authUserId"><span v-show="false">1</span></el-radio>
  136. </template>
  137. </el-table-column>
  138. <el-table-column label="序号" type="index" width="80" align="center" />
  139. <el-table-column property="name" label="供应商名称" />
  140. <el-table-column label="供应商类型" align="center" width="120">
  141. <template slot-scope="{ row }">
  142. <span v-if="row.shopType === 1">品牌方</span>
  143. <span v-else>代理商</span>
  144. </template>
  145. </el-table-column>
  146. <el-table-column label="登录账号" align="center">
  147. <template slot-scope="{ row }">
  148. <span v-if="row.loginAccount">{{ row.loginAccount }}</span>
  149. <span v-else>未绑定</span>
  150. </template>
  151. </el-table-column>
  152. <el-table-column prop="mobile" label="手机号" align="center" width="160" />
  153. <el-table-column prop="linkMan" label="联系人" align="center" />
  154. </el-table>
  155. <!-- <div class="loading">没有更多了</div> -->
  156. </div>
  157. <div slot="footer" class="dialog-footer">
  158. <el-button @click="dialogTableVisible = false">取 消</el-button>
  159. <el-button type="primary" @click="handleSubmitSupplier">确 定</el-button>
  160. </div>
  161. </el-dialog>
  162. </div>
  163. </template>
  164. <script>
  165. import { fetchSupplierList } from '@/api/supplier'
  166. import { fetchConfigureList, handselVip } from '@/api/member'
  167. export default {
  168. name: 'Handsel',
  169. filters: {
  170. formatPrice(price) {
  171. return `¥${price.toFixed(2)}`
  172. }
  173. },
  174. data() {
  175. return {
  176. loading: false,
  177. dialogTableVisible: false,
  178. selected: '',
  179. listQuery: {
  180. shopName: '',
  181. shopType: '',
  182. mobile: '',
  183. state: '',
  184. linkMan: '',
  185. pageNum: 1,
  186. pageSize: 10
  187. },
  188. supplierList: [],
  189. hasNextPage: false,
  190. total: 0,
  191. // 选中的供应商id
  192. selectedAuthUserId: '',
  193. // 选中的供应商信息
  194. selectedSupplierInfo: {},
  195. // 选中的供应商
  196. currentSupplierList: [],
  197. // 选中的套餐
  198. currentPackageList: [],
  199. // 套餐列表
  200. packageList: []
  201. }
  202. },
  203. created() {
  204. this.fetchConfigureList()
  205. },
  206. methods: {
  207. // 提交赠送
  208. onSubmit() {
  209. handselVip({ authUserId: this.selectedAuthUserId, packageId: this.selected })
  210. .then((res) => {
  211. console.log(res)
  212. this.$message.success('赠送会员成功')
  213. this.$store.dispatch('tagsView/delView', this.$route)
  214. this.$router.back()
  215. })
  216. .catch((error) => {
  217. console.log(error)
  218. })
  219. },
  220. // 移除选中的供应商
  221. removeSupplier() {
  222. this.currentSupplierList = []
  223. this.selectedSupplierInfo = {}
  224. },
  225. // 确认选中的供应商
  226. handleSubmitSupplier() {
  227. this.dialogTableVisible = false
  228. this.currentSupplierList = [this.selectedSupplierInfo]
  229. },
  230. // 选择供应商
  231. handleSelectSupplier(e) {
  232. this.selectedAuthUserId = e.authUserId
  233. this.selectedSupplierInfo = e
  234. },
  235. // 选择供应商对话框关闭事件
  236. handleDialogClosed() {
  237. this.listQuery.pageNum = 1
  238. this.listQuery.shopName = ''
  239. this.listQuery.shopType = ''
  240. this.listQuery.mobile = ''
  241. this.listQuery.linkMan = ''
  242. },
  243. // 筛选供应商
  244. filterSupplierList() {
  245. this.pageNum = 1
  246. this.supplierList = []
  247. this.fetchSupplierList()
  248. },
  249. // 获取供应商列表
  250. fetchSupplierList() {
  251. fetchSupplierList(this.listQuery)
  252. .then((res) => {
  253. console.log(res)
  254. this.supplierList = [...this.supplierList, ...res.data.list]
  255. this.hasNextPage = res.data.hasNextPage
  256. this.total = res.data.total
  257. })
  258. .catch((error) => {
  259. console.log(error)
  260. })
  261. },
  262. handlePackageChange(id) {
  263. console.log(id)
  264. const current = this.packageList.find((item) => item.id === id)
  265. this.currentPackageList = [current]
  266. },
  267. handleChooseSupplier() {
  268. this.filterSupplierList()
  269. this.dialogTableVisible = true
  270. },
  271. onLoad() {
  272. if (!this.hasNextPage) return
  273. this.listQuery.pageNum++
  274. this.fetchSupplierList()
  275. },
  276. // 获取套餐列表
  277. fetchConfigureList() {
  278. fetchConfigureList()
  279. .then((res) => {
  280. this.packageList = res.data.packageList.map((item, index) => {
  281. item.name = `套餐${index + 1}`
  282. // item.originalPrice = `${item.originalPrice.toFixed(2)}`
  283. // item.price = item.price.toFixed(2)
  284. return item
  285. })
  286. })
  287. .catch((error) => {
  288. console.log(error)
  289. })
  290. }
  291. }
  292. }
  293. </script>
  294. <style scoped lang="scss">
  295. .app-container {
  296. max-width: 1000px;
  297. margin: 0 auto;
  298. .item {
  299. display: flex;
  300. justify-content: flex-start;
  301. align-items: center;
  302. margin: 25px 0;
  303. .label {
  304. width: 80px;
  305. text-align: right;
  306. }
  307. span {
  308. color: #f56c6c;
  309. }
  310. }
  311. .infinite-list {
  312. height: 400px;
  313. }
  314. .loading {
  315. margin-top: 16px;
  316. text-align: center;
  317. }
  318. .section {
  319. min-height: 600px;
  320. }
  321. }
  322. </style>