index.vue 22 KB

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