index.vue 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485
  1. <template>
  2. <div v-loading="loading">
  3. <div class="white-box">
  4. <div class="filter-box">
  5. <filter-user :filter-types="filterTypes" @select-value="handleFilterUser"></filter-user>
  6. </div>
  7. <el-table class="table-box" ref="multipleTable" :data="tableData" stripe style="width: 100%;" :height="tool.getTableHeight()" @selection-change="handleSelectionChange">
  8. <el-table-column fixed type="selection" width="55" v-if="tableHeaders" :selectable="checkSelectable"></el-table-column>
  9. <el-table-column v-for="(tableHeader, key) in tableHeaders" :key="key" :label="tableHeader.header" :width="tableHeader.other.width ? tableHeader.other.width : ''" :prop="tableHeader.other.prop ? tableHeader.other.prop : null">
  10. <template slot-scope="scope">
  11. <template v-if="scope.row[tableHeader.index].other.tag" >
  12. <el-tag :type="scope.row[tableHeader.index].other.tag.type ? scope.row[tableHeader.index].other.tag.type : null" :size="scope.row[tableHeader.index].other.tag.size ? scope.row[tableHeader.index].other.tag.size : null" :class="scope.row[tableHeader.index].other.tag.class ? scope.row[tableHeader.index].other.tag.class : null" >{{scope.row[tableHeader.index].value}}</el-tag>
  13. </template>
  14. <template v-else>
  15. <div v-html="scope.row[tableHeader.index].value"></div>
  16. </template>
  17. </template>
  18. </el-table-column>
  19. <el-table-column fixed="right" label="Action" width="180"><!-- 操作 -->
  20. <template slot-scope="scope">
  21. <el-dropdown size="small" trigger="click" v-if="permission.hasPermission(`shop/goods-edit`) || permission.hasPermission(`shop/goods-delete`)">
  22. <el-button type="primary" size="small" @click.stop="">
  23. Action<!-- 操作该数据 --><i class="el-icon-arrow-down el-icon--right"></i>
  24. </el-button>
  25. <el-dropdown-menu slot="dropdown">
  26. <el-dropdown-item command="goods-edit" @click.native="handleEditShow(scope.row)">Edit<!-- 修改数据 --> </el-dropdown-item>
  27. <el-dropdown-item command="del" @click.native="handleDel(scope.row.ID)" v-show="permission.hasPermission(`shop/goods-delete`)">
  28. Delete<!-- 删除数据 -->
  29. </el-dropdown-item>
  30. <el-dropdown-item command="goods-edit" @click.native="handleGoodUp(scope.row.ID)">On sale<!-- 商品上架 --> </el-dropdown-item>
  31. <el-dropdown-item command="goods-edit" @click.native="handleGoodDown(scope.row.ID)">Sold out<!-- 商品下架 --> </el-dropdown-item>
  32. </el-dropdown-menu>
  33. </el-dropdown>
  34. </template>
  35. </el-table-column>
  36. <!-- <el-table-column label="操作">
  37. <template slot-scope="scope">
  38. <el-button type="success" size="small" @click="handleGroupManage(scope.row)" >
  39. 状态管理
  40. </el-button>
  41. </template></el-table-column>-->
  42. </el-table>
  43. <div class="white-box-footer">
  44. <!-- <el-dropdown size="small" trigger="click">
  45. <el-button type="primary" size="small">
  46. 所选数据<i class="el-icon-arrow-down el-icon&#45;&#45;right"></i>
  47. </el-button>
  48. <el-dropdown-menu slot="dropdown">
  49. <el-dropdown-item command="delete" @click.native="handleMuliDel()">上架</el-dropdown-item>
  50. </el-dropdown-menu>
  51. </el-dropdown>-->
  52. <el-button type="primary" size="small" @click="handlestate" icon="el-icon-plus" v-if="permission.hasPermission(`shop/goods-add`)">
  53. <!-- 商品添加 -->Add Product
  54. </el-button>
  55. <el-button type="success" size="small" @click="handleExport" v-show="permission.hasPermission(`shop/goods-list-export`)">Export Excel</el-button>
  56. <!-- <el-button-group>
  57. <el-button type="success" size="mini" @click.native="handleup(scope.row.ID)">上架</el-button>
  58. <el-button type="danger" size="mini">下架</el-button>
  59. </el-button-group> -->
  60. <pagination :total="totalCount" :page_size="pageSize" @size-change="handleSizeChange" @current-change="handleCurrentChange"></pagination>
  61. </div>
  62. </div>
  63. <el-dialog title="Edit Products" :visible.sync="dialogEditFormVisible"><!-- 修改商品 -->
  64. <el-form :model="form" label-width="250px" class="form-dialog" v-loading="dialogEditLoading">
  65. <el-form-item label="Product Name"><!-- 商品名称 -->
  66. <el-input v-model="form.goodsName"></el-input>
  67. </el-form-item>
  68. <!-- <el-form-item label="商品来源">
  69. <el-select v-model="form.type">
  70. <el-option v-for="(item,index) in goodsType" :key="index" :label="item.name"
  71. :value="index"></el-option>
  72. </el-select>
  73. </el-form-item> -->
  74. <el-form-item label="Member discount"><!-- 会员折扣 -->
  75. <el-input v-model="form.sellDiscount"></el-input>
  76. </el-form-item>
  77. <el-form-item label="Product type"><!-- 商品类型 -->
  78. <el-checkbox v-for="(value,index) in GiftTypeArr" v-model="value.checked" :key="index" >{{value.name}}</el-checkbox>
  79. </el-form-item>
  80. <!-- <el-form-item label="复消购买方式">
  81. <el-checkbox v-for="(value,index) in sell_type" v-model="value.checked" :key="index" >{{value.name}}</el-checkbox>
  82. </el-form-item> -->
  83. <el-form-item label="BV split">
  84. <!-- <el-checkbox v-model="form.pvSplit" :checked="form.pvSplit">Yes</el-checkbox>-->
  85. <el-select v-model="form.pvSplit" placeholder="">
  86. <el-option
  87. v-for="item in pvSplitOptions"
  88. :key="item.value"
  89. :label="item.label"
  90. :value="item.value">
  91. </el-option>
  92. </el-select>
  93. </el-form-item>
  94. <el-form-item label="Product Category"> <!-- 商品分类 -->
  95. <el-select v-model="form.categoryType">
  96. <el-option v-for="item in categoryType" :key="item.id" :label="item.name" :value="item.id" ></el-option>
  97. </el-select>
  98. </el-form-item>
  99. <el-form-item label="Product Code"><!-- 商品编号 -->
  100. <el-input v-model="form.goodsNo"></el-input>
  101. </el-form-item>
  102. <el-form-item label="Unit"><!-- 单位 -->
  103. <el-input v-model="form.unit"></el-input>
  104. </el-form-item>
  105. <el-form-item label="Tax Rate"><!-- 税率 -->
  106. <el-input v-model="form.taxRate">
  107. <template slot="append">%</template>
  108. </el-input>
  109. </el-form-item>
  110. <el-form-item label="Member Price($)" p>
  111. <el-input v-model="form.sellPriceStandard"></el-input>
  112. </el-form-item>
  113. <el-form-item label="Member Price(₦)" p>
  114. <el-input v-model="form.sellPrice"></el-input>
  115. </el-form-item>
  116. <el-form-item label="Retail Price(₦)">
  117. <el-input v-model="form.marketPrice"></el-input>
  118. </el-form-item>
  119. <el-form-item label="Price BV" v-show="pvDisabled"> <!-- 价格BV -->
  120. <el-input v-model="form.pricePv"></el-input>
  121. </el-form-item>
  122. <!-- <el-form-item label="Exchange points" v-show="false"> &lt;!&ndash; 兑换积分 &ndash;&gt;-->
  123. <!-- <el-input v-model="form.point"></el-input>-->
  124. <!-- </el-form-item>-->
  125. <el-form-item label="Inventory"> <!-- 库存 -->
  126. <el-input v-model="form.storeNums"></el-input>
  127. </el-form-item>
  128. <el-form-item label="Product details"><!-- 商品详情 -->
  129. <el-input
  130. type="textarea"
  131. :rows="2"
  132. placeholder="Please enter the content"
  133. v-model="form.content">
  134. </el-input><!-- 请输入内容 -->
  135. </el-form-item>
  136. <el-form-item label="Order"> <!-- 排序 -->
  137. <el-input v-model="form.sort"></el-input>
  138. </el-form-item>
  139. <el-form-item label="Upload Images"> <!-- 上传图片 -->
  140. <div class='up_load'>
  141. <!-- <img v-if="form.cover&&img_show" :src="form.cover" alt=""> -->
  142. <leo-uploader
  143. @on-success='upLoadSuccess'
  144. :request-route="'shop/upload'"
  145. ref='up_load'
  146. :defaultImageUrl='form.cover'
  147. ></leo-uploader>
  148. </div>
  149. </el-form-item>
  150. </el-form>
  151. <div slot="footer" class="dialog-footer">
  152. <el-button @click="dialogEditFormVisible = false">Cancel<!-- 取 消 --></el-button>
  153. <el-button type="primary" @click.native="handleEdit">Edit<!-- 修 改 --></el-button>
  154. </div>
  155. </el-dialog>
  156. </div>
  157. </template>
  158. <script>
  159. import network from '@/utils/network'
  160. import tool from '@/utils/tool'
  161. import baseInfo from '@/utils/baseInfo'
  162. import FilterUser from '../../components/FilterUser'
  163. import permission from '@/utils/permission'
  164. import Pagination from '@/components/Pagination'
  165. import filterHelper from '@/utils/filterHelper'
  166. import {FRONTEND_SERVER,SERVER_API_HTTP_TYPE,SERVER_API_DOMAIN,CDN_BASE_URL} from '@/utils/config'
  167. import store from './../../utils/vuexStore'
  168. import LeoUploader from '@/components/Uploader';
  169. export default {
  170. name: 'index',
  171. components: {FilterUser, Pagination, LeoUploader},
  172. mounted () {
  173. this.getData()
  174. // this.$refs.up_load.successImageUrl='';
  175. },
  176. data () {
  177. return {
  178. tableHeaders: null,
  179. tableData: null,
  180. loading: true,
  181. currentPage: 1,
  182. totalPages: 1,
  183. totalCount: 1,
  184. pageSize: 20,
  185. multipleSelection: [],
  186. tool: tool,
  187. permission: permission,
  188. baseDecLevels: baseInfo.decLevels(),
  189. baseEmpLevels: baseInfo.empLevels(),
  190. filterTypes: null,
  191. dialogVisible: false,
  192. dialogLoading: false,
  193. filterModel: {},
  194. value: [],
  195. selectedIds: '',
  196. dialogEditFormVisible: false,
  197. dialogEditLoading: false,
  198. pvSplitOptions: [
  199. {
  200. value: '0',
  201. label: 'No'
  202. },
  203. {
  204. value: '1',
  205. label: 'Yes'
  206. }],
  207. form: {
  208. // sellType: [],
  209. goodsName: '',
  210. type: '',
  211. giftType: [],
  212. goodsNo: '',
  213. unit: '',
  214. marketPrice: '',
  215. sellPrice: '',
  216. sellPriceStandard: '',
  217. pricePv: '',
  218. point: '',
  219. storeNums: '',
  220. content: '',
  221. sort: '',
  222. discount: '',
  223. cover: '',
  224. textarea: '',
  225. sellDiscount: '',
  226. pvSplit: '',
  227. categoryType: '',
  228. sellType: 1,
  229. taxRate: 0
  230. },
  231. submitButtonStat: false,
  232. goodsType: [],
  233. GiftTypeArr: [],
  234. sell_type: [],
  235. categoryType: [],
  236. img_show: true,
  237. pvDisabled: true,
  238. exchangeRate: baseInfo.exchangeRate()
  239. }
  240. },
  241. methods: {
  242. handleSelectionChange (val) {
  243. this.multipleSelection = val
  244. },
  245. handleCurrentChange (page) {
  246. this.getData(page, this.pageSize)
  247. },
  248. handleSizeChange (pageSize) {
  249. this.getData(this.currentPage, pageSize)
  250. },
  251. handleFilterUser (filterData) {
  252. filterHelper.handleFilterUser(this, filterData)
  253. },
  254. checkSelectable (row) {
  255. return row.DONT_DEL !== '1'
  256. },
  257. handleFilter () {
  258. this.getData()
  259. },
  260. handlestate () {
  261. this.$router.push({path: `/shop/goods-add`})
  262. },
  263. upLoadSuccess (file) {
  264. // this.form.cover=file;
  265. this.form.cover = tool.getArImage(file, '/files/')
  266. this.form.coverOrigin = file
  267. this.img_show = false
  268. },
  269. handleEditShow (row) {
  270. this.dialogEditLoading = true
  271. this.auditId = row.ID
  272. this.dialogEditFormVisible = true
  273. let vueObj = this
  274. network.getData('shop/goods-edit', {id: this.auditId}).then(response => {
  275. vueObj.dialogEditLoading = false
  276. vueObj.goodsType = response.goodsType
  277. vueObj.categoryType = response.categoryType
  278. let gift = response.goodsInfo.GIFT_TYPE;
  279. let gift_type = response.giftType
  280. let giftType = []
  281. if (gift.length > 0) {
  282. for (let i in gift_type) {
  283. giftType.push({key: i, name: gift_type[i].name, checked: false})
  284. gift.map((v, k) => {
  285. if (v === i) {
  286. giftType[i - 1].checked = true
  287. }
  288. })
  289. }
  290. }
  291. vueObj.GiftTypeArr = giftType
  292. // let sell = response.goodsInfo.SELL_TYPE;
  293. // let sell_type = response.sellType;
  294. // let sellType=[];
  295. // if(sell.length>0){
  296. // for(let i in sell_type){
  297. // sellType.push({key:i,name:sell_type[i].name,checked:false})
  298. // sell.map((item,index)=>{
  299. // if(item==i){
  300. // sellType[i-1].checked=true;
  301. // }
  302. // })
  303. // }
  304. // }
  305. vueObj.sell_type = response.goodsInfo.SELL_TYPE;
  306. vueObj.form.goodsName = response.goodsInfo.GOODS_NAME
  307. vueObj.form.sellDiscount = response.goodsInfo.SELL_DISCOUNT
  308. vueObj.form.goodsNo = response.goodsInfo.GOODS_NO
  309. vueObj.form.type = response.goodsInfo.TYPE
  310. vueObj.form.unit = response.goodsInfo.UNIT
  311. vueObj.form.marketPrice = response.goodsInfo.MARKET_PRICE
  312. vueObj.form.sellPrice = response.goodsInfo.SELL_PRICE
  313. vueObj.form.sellPriceStandard = response.goodsInfo.SELL_PRICE_STANDARD
  314. vueObj.form.pricePv = response.goodsInfo.PRICE_PV
  315. vueObj.form.point = response.goodsInfo.POINT
  316. vueObj.form.storeNums = response.goodsInfo.STORE_NUMS
  317. vueObj.form.content = response.goodsInfo.CONTENT
  318. vueObj.form.sort = response.goodsInfo.SORT
  319. vueObj.form.id = response.goodsInfo.ID
  320. vueObj.form.pvSplit = response.goodsInfo.PV_SPLIT
  321. // vueObj.form.cover = response.goodsInfo.COVER
  322. vueObj.form.categoryType = parseInt(response.goodsInfo.CATEGORY_TYPE)
  323. vueObj.form.taxRate = response.goodsInfo.TAX_RATE
  324. // vueObj.form.sellType=vueObj.form.sellType.map((item,index)=>{
  325. // return response.goodsInfo.SELL_TYPE.some(val=>(index+1).toString()==val)
  326. // })
  327. vueObj.form.coverOrigin = response.goodsInfo.COVER
  328. vueObj.form.cover = tool.getArImage(response.goodsInfo.COVER, '/files/')
  329. this.$forceUpdate()
  330. })
  331. },
  332. handleEdit () {
  333. this.dialogEditFormVisible = false
  334. this.$message({
  335. message: 'Modifying data', // 正在修改数据
  336. type: 'info'
  337. })
  338. let path = 'shop/goods-edit'
  339. // let sen_sell=[];
  340. // this.sell_type.map((item,index)=>{
  341. // if(item.checked){
  342. // sen_sell.push(item.key);
  343. // }
  344. // })
  345. // this.form.sellType=sen_sell;
  346. let sen_gift = []
  347. this.GiftTypeArr.map((item, index) => {
  348. if (item.checked) {
  349. sen_gift.push(item.key)
  350. }
  351. })
  352. this.form.giftType = sen_gift
  353. this.form.sellType = 1
  354. this.form.cover = this.form.coverOrigin
  355. delete this.form.coverOrigin
  356. network.postData(path, {...this.form}).then(response => {
  357. this.$message({
  358. message: response,
  359. type: 'success'
  360. })
  361. this.getData(this.currentPage, this.pageSize)
  362. }).catch(response => {
  363. })
  364. },
  365. handleDel (id = null) {
  366. let obj = this
  367. this.$confirm('Determine to delete the selected data?', 'Hint', { // '确定删除选定的数据?', '提示'
  368. confirmButtonText: 'Confirm', // 确定
  369. cancelButtonText: 'Cancel', // 取消
  370. type: 'warning'
  371. }).then(() => {
  372. let selectedIds = []
  373. if (id === null) {
  374. for (let val of obj.multipleSelection) {
  375. selectedIds.push(val.ID)
  376. }
  377. } else {
  378. selectedIds.push(id)
  379. }
  380. return network.postData(`shop/goods-delete`, {
  381. selected: selectedIds
  382. })
  383. }).then(response => {
  384. this.$message({
  385. message: response,
  386. type: 'success'
  387. })
  388. obj.getData(obj.currentPage, obj.pageSize)
  389. }).catch(response => {
  390. })
  391. },
  392. getData (page, pageSize) {
  393. let filterData = this.filterModel
  394. /* this.allData = response */
  395. network.getPageData(this, 'shop/index', page, pageSize, this.filterModel, response => {
  396. this.filterTypes = response.filterTypes
  397. })
  398. },
  399. handleGoodUp (id) {
  400. console.log(id)
  401. network.postData('shop/goods-status', {selectedIds: id, status: 1})
  402. .then(response => {
  403. this.$message({
  404. message: response,
  405. type: 'success'
  406. })
  407. this.getData(this.currentPage, this.pageSize)
  408. })
  409. },
  410. handleGoodDown (id) {
  411. network.postData('shop/goods-status', {selectedIds: id, status: 0})
  412. .then(response => {
  413. this.$message({
  414. message: response,
  415. type: 'success'
  416. })
  417. this.getData(this.currentPage, this.pageSize)
  418. })
  419. },
  420. handleExport () {
  421. this.$confirm(`Determine to export the selected data?`, 'Hint', { // 确定要导出当前数据吗?`, '提示'
  422. confirmButtonText: 'Confirm', // 确定
  423. cancelButtonText: 'Cancel', // 取消
  424. type: 'warning'
  425. }).then(() => {
  426. return network.getData(`shop/goods-list-export`, this.filterModel)
  427. }).then(response => {
  428. this.$message({
  429. message: response,
  430. type: 'success'
  431. })
  432. }).catch(response => {
  433. })
  434. }
  435. },
  436. watch: {
  437. // 监听商品分类,控制PV是否展示
  438. 'form.categoryType': {
  439. deep: true,
  440. handler (modern, origin) {
  441. this.pvDisabled = (parseInt(modern) === 1)
  442. }
  443. }
  444. // // 监听商品标准价格,自动计算销售价格
  445. // 'form.sellPriceStandard': {
  446. // deep: true,
  447. // handler(modern, origin) {
  448. // this.form.sellPrice = modern * this.exchangeRate
  449. // }
  450. // },
  451. }
  452. }
  453. </script>
  454. <style scoped>
  455. .table-box .el-form-item__label {
  456. width: 100px;
  457. color: #99a9bf;
  458. }
  459. .table-box .el-form-item {
  460. width: 30%;
  461. margin-right: 0;
  462. margin-bottom: 0;
  463. }
  464. </style>