index.vue 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457
  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="operation" 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. Operate on this data<!-- 操作该数据 --><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)"
  28. v-show="permission.hasPermission(`shop/goods-delete`)">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"
  53. v-if="permission.hasPermission(`shop/goods-add`)"><!-- 商品添加 -->Products add
  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="Products 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="Product Category"> <!-- 商品分类 -->
  84. <el-select v-model="form.categoryType">
  85. <el-option v-for="item in categoryType" :key="item.id" :label="item.name" :value="item.id" ></el-option>
  86. </el-select>
  87. </el-form-item>
  88. <el-form-item label="Product Code"><!-- 商品编号 -->
  89. <el-input v-model="form.goodsNo"></el-input>
  90. </el-form-item>
  91. <el-form-item label="Unit"><!-- 单位 -->
  92. <el-input v-model="form.unit"></el-input>
  93. </el-form-item>
  94. <el-form-item label="标准价格($)" p>
  95. <el-input v-model="form.sellPriceStandard"></el-input>
  96. </el-form-item>
  97. <el-form-item label="市场价格(n)">
  98. <el-input v-model="form.marketPrice"></el-input>
  99. </el-form-item>
  100. <el-form-item label="销售价格(n)" p>
  101. <el-input v-model="form.sellPrice"></el-input>
  102. </el-form-item>
  103. <el-form-item label="Price BV" v-show="pvDisabled"> <!-- 价格BV -->
  104. <el-input v-model="form.pricePv"></el-input>
  105. </el-form-item>
  106. <el-form-item label="Exchange points" v-show="false"> <!-- 兑换积分 -->
  107. <el-input v-model="form.point"></el-input>
  108. </el-form-item>
  109. <el-form-item label="Inventory"> <!-- 库存 -->
  110. <el-input v-model="form.storeNums"></el-input>
  111. </el-form-item>
  112. <el-form-item label="Product details"><!-- 商品详情 -->
  113. <el-input
  114. type="textarea"
  115. :rows="2"
  116. placeholder="Please enter the content"
  117. v-model="form.content">
  118. </el-input><!-- 请输入内容 -->
  119. </el-form-item>
  120. <el-form-item label="order"> <!-- 排序 -->
  121. <el-input v-model="form.sort"></el-input>
  122. </el-form-item>
  123. <el-form-item label="upload images"> <!-- 上传图片 -->
  124. <div class='up_load'>
  125. <!-- <img v-if="form.cover&&img_show" :src="form.cover" alt=""> -->
  126. <leo-uploader
  127. @on-success='upLoadSuccess'
  128. :request-route="'shop/upload'"
  129. ref='up_load'
  130. :defaultImageUrl='form.cover'
  131. ></leo-uploader>
  132. </div>
  133. </el-form-item>
  134. </el-form>
  135. <div slot="footer" class="dialog-footer">
  136. <el-button @click="dialogEditFormVisible = false">Cancel<!-- 取 消 --></el-button>
  137. <el-button type="primary" @click.native="handleEdit">Edit<!-- 修 改 --></el-button>
  138. </div>
  139. </el-dialog>
  140. </div>
  141. </template>
  142. <script>
  143. import network from '@/utils/network'
  144. import tool from '@/utils/tool'
  145. import baseInfo from '@/utils/baseInfo'
  146. import FilterUser from '../../components/FilterUser'
  147. import permission from '@/utils/permission'
  148. import Pagination from '@/components/Pagination'
  149. import filterHelper from '@/utils/filterHelper'
  150. import {FRONTEND_SERVER} from '@/utils/config'
  151. import store from './../../utils/vuexStore'
  152. import LeoUploader from '@/components/Uploader';
  153. export default {
  154. name: 'index',
  155. components: {FilterUser,Pagination,LeoUploader},
  156. mounted () {
  157. this.getData();
  158. // this.$refs.up_load.successImageUrl='';
  159. },
  160. data () {
  161. return {
  162. tableHeaders: null,
  163. tableData: null,
  164. loading: true,
  165. currentPage: 1,
  166. totalPages: 1,
  167. totalCount: 1,
  168. pageSize: 20,
  169. multipleSelection: [],
  170. tool: tool,
  171. permission: permission,
  172. baseDecLevels: baseInfo.decLevels(),
  173. baseEmpLevels: baseInfo.empLevels(),
  174. filterTypes: null,
  175. dialogVisible: false,
  176. dialogLoading: false,
  177. filterModel: {},
  178. value:[],
  179. selectedIds:'',
  180. dialogEditFormVisible: false,
  181. dialogEditLoading: false,
  182. form:{
  183. // sellType:[],
  184. goodsName:'',
  185. type:'',
  186. giftType:[],
  187. goodsNo:'',
  188. unit:'',
  189. marketPrice:'',
  190. sellPrice:'',
  191. sellPriceStandard: '',
  192. pricePv:'',
  193. point:'',
  194. storeNums:'',
  195. content:'',
  196. sort:'',
  197. discount:'',
  198. cover:'',
  199. textarea:'',
  200. sellDiscount:'',
  201. categoryType: '',
  202. sellType: 1,
  203. },
  204. submitButtonStat: false,
  205. goodsType:[],
  206. GiftTypeArr:[],
  207. sell_type:[],
  208. categoryType: [],
  209. img_show:true,
  210. pvDisabled: true,
  211. exchangeRate: baseInfo.exchangeRate(),
  212. }
  213. },
  214. methods: {
  215. handleSelectionChange(val) {
  216. this.multipleSelection = val
  217. },
  218. handleCurrentChange (page) {
  219. this.getData(page, this.pageSize)
  220. },
  221. handleSizeChange (pageSize) {
  222. this.getData(this.currentPage, pageSize)
  223. },
  224. handleFilterUser(filterData){
  225. filterHelper.handleFilterUser(this, filterData)
  226. },
  227. checkSelectable(row) {
  228. return row.DONT_DEL !== '1'
  229. },
  230. handleFilter() {
  231. this.getData()
  232. },
  233. handlestate(){
  234. this.$router.push({path: `/shop/goods-add`})
  235. },
  236. upLoadSuccess(file){
  237. this.form.cover=file;
  238. this.img_show=false;
  239. },
  240. handleEditShow(row) {
  241. this.dialogEditLoading = true
  242. this.auditId = row.ID
  243. this.dialogEditFormVisible = true
  244. let vueObj = this
  245. network.getData('shop/goods-edit', {id: this.auditId}).then(response => {
  246. vueObj.dialogEditLoading = false
  247. vueObj.goodsType=response.goodsType
  248. vueObj.categoryType = response.categoryType
  249. let gift=response.goodsInfo.GIFT_TYPE;
  250. let gift_type=response.giftType;
  251. let giftType=[];
  252. if(gift.length>0){
  253. for(let i in gift_type){
  254. giftType.push({key:i,name:gift_type[i].name,checked:false})
  255. gift.map((v,k)=>{
  256. if(v==i){
  257. giftType[i-1].checked=true;
  258. }
  259. })
  260. }
  261. }
  262. vueObj.GiftTypeArr=giftType
  263. // let sell=response.goodsInfo.SELL_TYPE;
  264. // let sell_type=response.sellType;
  265. // let sellType=[];
  266. // if(sell.length>0){
  267. // for(let i in sell_type){
  268. // sellType.push({key:i,name:sell_type[i].name,checked:false})
  269. // sell.map((item,index)=>{
  270. // if(item==i){
  271. // sellType[i-1].checked=true;
  272. // }
  273. // })
  274. // }
  275. // }
  276. vueObj.sell_type=response.goodsInfo.SELL_TYPE;
  277. vueObj.form.goodsName=response.goodsInfo.GOODS_NAME
  278. vueObj.form.sellDiscount=response.goodsInfo.SELL_DISCOUNT
  279. vueObj.form.goodsNo=response.goodsInfo.GOODS_NO
  280. vueObj.form.type=response.goodsInfo.TYPE
  281. vueObj.form.unit=response.goodsInfo.UNIT
  282. vueObj.form.marketPrice=response.goodsInfo.MARKET_PRICE
  283. vueObj.form.sellPrice=response.goodsInfo.SELL_PRICE
  284. vueObj.form.sellPriceStandard=response.goodsInfo.SELL_PRICE_STANDARD
  285. vueObj.form.pricePv=response.goodsInfo.PRICE_PV
  286. vueObj.form.point=response.goodsInfo.POINT
  287. vueObj.form.storeNums=response.goodsInfo.STORE_NUMS
  288. vueObj.form.content=response.goodsInfo.CONTENT
  289. vueObj.form.sort=response.goodsInfo.SORT
  290. vueObj.form.id=response.goodsInfo.ID
  291. vueObj.form.cover=response.goodsInfo.COVER
  292. vueObj.form.categoryType=parseInt(response.goodsInfo.CATEGORY_TYPE)
  293. // vueObj.form.sellType=vueObj.form.sellType.map((item,index)=>{
  294. // return response.goodsInfo.SELL_TYPE.some(val=>(index+1).toString()==val)
  295. // })
  296. this.$forceUpdate()
  297. })
  298. },
  299. handleEdit() {
  300. this.dialogEditFormVisible = false
  301. this.$message({
  302. message: 'Modifying data',//正在修改数据
  303. type: 'info'
  304. })
  305. let path = 'shop/goods-edit'
  306. // let sen_sell=[];
  307. // this.sell_type.map((item,index)=>{
  308. // if(item.checked){
  309. // sen_sell.push(item.key);
  310. // }
  311. // })
  312. // this.form.sellType=sen_sell;
  313. let sen_gift=[];
  314. this.GiftTypeArr.map((item,index)=>{
  315. if(item.checked){
  316. sen_gift.push(item.key);
  317. }
  318. })
  319. this.form.giftType=sen_gift;
  320. this.form.sellType = 1
  321. network.postData(path, {...this.form}).then(response => {
  322. this.$message({
  323. message: response,
  324. type: 'success'
  325. })
  326. this.getData(this.currentPage, this.pageSize)
  327. }).catch(response => {
  328. })
  329. },
  330. handleDel(id = null) {
  331. let obj = this
  332. this.$confirm('Determine to delete the selected data?', 'Hint', {//'确定删除选定的数据?', '提示'
  333. confirmButtonText: 'Confirm',//确定
  334. cancelButtonText: 'Cancel',//取消
  335. type: 'warning'
  336. }).then(() => {
  337. let selectedIds = []
  338. if (id === null) {
  339. for (let val of obj.multipleSelection) {
  340. selectedIds.push(val.ID)
  341. }
  342. } else {
  343. selectedIds.push(id)
  344. }
  345. return network.postData(`shop/goods-delete`, {
  346. selected: selectedIds
  347. })
  348. }).then(response => {
  349. this.$message({
  350. message: response,
  351. type: 'success'
  352. })
  353. obj.getData(obj.currentPage, obj.pageSize)
  354. }).catch(response => {
  355. })
  356. },
  357. getData (page, pageSize) {
  358. let filterData = this.filterModel
  359. /*this.allData = response*/
  360. network.getPageData(this, 'shop/index', page, pageSize, this.filterModel, response=>{
  361. console.log(response)
  362. this.filterTypes = response.filterTypes
  363. })
  364. },
  365. handleGoodUp(id){
  366. console.log(id);
  367. network.postData('shop/goods-status',{selectedIds:id,status:1})
  368. .then(response=>{
  369. this.$message({
  370. message: response,
  371. type: 'success'
  372. })
  373. this.getData(this.currentPage, this.pageSize)
  374. })
  375. },
  376. handleGoodDown(id){
  377. network.postData('shop/goods-status',{selectedIds:id,status:0})
  378. .then(response=>{
  379. this.$message({
  380. message: response,
  381. type: 'success'
  382. })
  383. this.getData(this.currentPage, this.pageSize)
  384. })
  385. },
  386. handleExport(){
  387. this.$confirm(`Determine to export the selected data?`, 'Hint', {//确定要导出当前数据吗?`, '提示'
  388. confirmButtonText: 'Confirm',//确定
  389. cancelButtonText: 'Cancel',//取消
  390. type: 'warning'
  391. }).then(() => {
  392. return network.getData(`shop/goods-list-export`, this.filterModel)
  393. }).then(response => {
  394. this.$message({
  395. message: response,
  396. type: 'success'
  397. })
  398. }).catch(response => {
  399. })
  400. },
  401. },
  402. watch:{
  403. // 监听商品分类,控制PV是否展示
  404. 'form.categoryType': {
  405. deep: true,
  406. handler(modern, origin) {
  407. this.pvDisabled = (parseInt(modern) === 1)
  408. }
  409. },
  410. // 监听商品标准价格,自动计算销售价格
  411. 'form.sellPriceStandard': {
  412. deep: true,
  413. handler(modern, origin) {
  414. this.form.sellPrice = modern * this.exchangeRate
  415. }
  416. },
  417. },
  418. }
  419. </script>
  420. <style scoped>
  421. .table-box .el-form-item__label {
  422. width: 100px;
  423. color: #99a9bf;
  424. }
  425. .table-box .el-form-item {
  426. width: 30%;
  427. margin-right: 0;
  428. margin-bottom: 0;
  429. }
  430. </style>