index.php 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496
  1. <?php
  2. use common\helpers\ComponentHelper;
  3. ComponentHelper::loadComponentView('components/com-goods-detail', \Yii::$app->controller->module->viewPath);
  4. ?>
  5. <div id="app" v-cloak>
  6. <el-card shadow="never" style="border:0;min-width: 1200px;" body-style="background-color: #f3f3f3;padding: 10px 0 0;">
  7. <div slot="header">
  8. <span>精选好货</span>
  9. </div>
  10. <div class="table-body">
  11. <el-form size="small" :inline="true" flex="dir:left cross:center">
  12. <div class="item-box" style="margin-right: 15px">
  13. <el-input clearable size="small" style="width: 200px" v-model="search.goods_id" placeholder="请输入商品ID"></el-input>
  14. </div>
  15. <div class="item-box" style="margin-right: 15px">
  16. <el-input clearable size="small" style="width: 200px" v-model="search.goods_name" placeholder="请输入商品名称"></el-input>
  17. </div>
  18. <div class="item-box" style="margin-right: 15px">
  19. <el-select v-model="search.cate_id" placeholder="请选择类目" clearable size="small">
  20. <el-option v-for="(item, index) in cats" :key="index" :label="item.cate_name" :value="item.third_cate_id"></el-option>
  21. </el-select>
  22. </div>
  23. <div class="item-box" style="margin-right: 15px">
  24. <el-select v-model="search.goods_type" placeholder="商品类型" clearable size="small">
  25. <el-option label="礼品" :value="2"></el-option>
  26. <el-option label="通货" :value="3"></el-option>
  27. </el-select>
  28. </div>
  29. <div class="item-box" style="margin-right: 15px">
  30. <el-select v-model="search.discount" placeholder="折扣" clearable size="small">
  31. <el-option label="1折及以下" :value="1"></el-option>
  32. <el-option label="1~2折(含2折)" :value="2"></el-option>
  33. <el-option label="2~3折(含3折)" :value="3"></el-option>
  34. <el-option label="3~4折(含4折) " :value="4"></el-option>
  35. <el-option label="4折以上" :value="5"></el-option>
  36. </el-select>
  37. </div>
  38. <div class="item-box" flex="dir:left cross:center">
  39. <el-button size="small" type="primary" style="padding: 9px 15px !important;" @click="searchs">搜索</el-button>
  40. </div>
  41. </el-form>
  42. </div>
  43. <div class="table-body">
  44. <el-row>
  45. <el-col :xs="1" :sm="1">
  46. <el-checkbox v-model="checked" @change="allSelect">全选</el-checkbox>
  47. </el-col>
  48. <!--最新上架,本月销量,协议价,指导价,营销价,常规利润率-->
  49. <el-col :sm="2" class="search-sort" v-for="(item,key) in sort_list">
  50. <div @click="searchSort" :data-key="item.key" :data-type="item.sort" :data-index="key">
  51. <span class="">{{item.name}}</span>
  52. <span class="caret-wrapper">
  53. <i class="caret-top " :class="item.sort == 'desc' ? 'top-active' : ''"></i>
  54. <i class="caret-bottom" :class="item.sort == 'asc' ? 'bottom-active' : ''"></i>
  55. </span>
  56. </div>
  57. </el-col>
  58. <el-col :sm="8" style="text-align: right">
  59. <span style="margin-right: 20px;">已选{{ countIsSelect() }}件</span>
  60. <el-button size="mini" :disabled="btnLoading" v-loading="btnLoading" type="primary" @click="batchAdd">批量加入</el-button>
  61. </el-col>
  62. </el-row>
  63. <!--商品信息-->
  64. <el-row class="goods-list"
  65. v-loading="listLoading"
  66. v-if="list"
  67. element-loading-text="拼命加载中"
  68. element-loading-spinner="el-icon-loading"
  69. >
  70. <el-col v-for="(goods,index) in list" :sm="4" :span="8" :gutter="4" style="padding: 10px">
  71. <div class="goods-wrapper" @click="selectGoods(index)" :class="goods.is_select == true ? 'goods-select' : ''">
  72. <el-col class="goods" style="padding: 5px;">
  73. <el-col><img :src="goods.default_image" style="height: 200px;width: 100%;" width="100%"></el-col>
  74. <el-col class="ellipsis">{{goods.goods_name}}</el-col>
  75. <el-col>
  76. <el-col class="goods-price agreement_price" :span="8">
  77. <div>
  78. <div class="title">供货价</div>
  79. <div class="number price">{{goods.price|addZero(rate)}}</div>
  80. </div>
  81. </el-col>
  82. <el-col class="goods-price rate" :span="8">
  83. <div>
  84. <div class="title">建议零售价</div>
  85. <div class="number price">{{goods.retail_price|addZero(rate)}}</div>
  86. </div>
  87. </el-col>
  88. <el-col class="goods-price rate" :span="8">
  89. <div>
  90. <div class="title">最低售价</div>
  91. <div class="number price">{{goods.lowest_price|addZero(rate)}}</div>
  92. </div>
  93. </el-col>
  94. </el-col>
  95. <el-col class="bottom-price">
  96. <el-col class="goods-action">
  97. <el-col :span="12" style="text-align: center">
  98. <div>
  99. <el-button @click="detailUrl(goods)" type="primary" plain size="mini">查看详情</el-button>
  100. </div>
  101. </el-col>
  102. <el-col :span="12" style="text-align: center">
  103. <div>
  104. <el-button type="info" disabled plain size="mini" v-if="goods.is_storage">已加入</el-button>
  105. <el-button v-else type="primary" plain @click="oneAdd(goods)" size="mini">加入选品库</el-button>
  106. </div>
  107. </el-col>
  108. </el-col>
  109. </el-col>
  110. </el-col>
  111. </div>
  112. </el-col>
  113. </el-row>
  114. <!-- 无数据 -->
  115. <el-row class="goods-list" v-loading="listLoading" v-else>
  116. <el-empty description="暂无商品"></el-empty>
  117. </el-row>
  118. <!-- 分页 -->
  119. <el-row type="flex" class="page" justify="end">
  120. <el-pagination @current-change="pagination" background layout="prev, pager, next" :page-count="pageCount" v-if="list"></el-pagination>
  121. </el-row>
  122. </div>
  123. <com-goods-detail :goods-id="goodsDetailId"></com-goods-detail>
  124. </el-card>
  125. </div>
  126. <script>
  127. const app = new Vue({
  128. el: '#app',
  129. data: {
  130. page: 1,
  131. time: [], //本地存时间,请求时不发送
  132. search: {
  133. goods_name: '',
  134. cate_id: '',
  135. goods_type: '',
  136. discount: '',
  137. sort: '',
  138. sort_type: '',
  139. goods_id: '',
  140. },
  141. loading: false,
  142. activeName: '-1',
  143. list: [], //列表数据
  144. btnLoading: false,
  145. listLoading: false,
  146. checked: false,
  147. sort_list: [
  148. {
  149. name: "最新上架",
  150. key: 'time',
  151. is_active: false,
  152. sort: '',
  153. },
  154. {
  155. name: "供货价",
  156. key: 'price',
  157. is_active: false,
  158. sort: '',
  159. },
  160. ],
  161. type: '',
  162. sort: '',
  163. goodsDetailId: 0,
  164. pageCount: 0,
  165. cats: <?= $cats ?>,
  166. rate: <?= $rate ?>,
  167. },
  168. mounted() {
  169. // 获取列表首页数据
  170. this.loadData(this.page, this.search); //获取列表数据
  171. },
  172. filters: {
  173. addZero: function(data, rate) {
  174. return (Math.floor(data * rate * 100) * 0.01).toFixed(2) + '元';
  175. },
  176. getRate: function(rate) {
  177. return Math.round(Number(rate) * 100, 2)
  178. },
  179. },
  180. methods: {
  181. // 1.0 获取视频列表
  182. loadData(page, others) {
  183. this.loading = true;
  184. request({
  185. method: 'get',
  186. params: {
  187. r: 'qi-ding-dong/goods/index',
  188. page: page,
  189. limit: 18,
  190. ...others, //其他搜索字段
  191. },
  192. }).then(e => {
  193. this.loading = false;
  194. if (e.data.code === 0) {
  195. this.list = e.data.data.list;
  196. this.pageCount = Math.ceil(e.data.data.count / 18);
  197. } else {
  198. this.$message.error(e.data.msg);
  199. }
  200. }).catch(e => {});
  201. },
  202. pagination(page) {
  203. this.page = page;
  204. this.loadData(this.page, this.search);
  205. },
  206. searchs() {
  207. this.page = 1;
  208. this.loadData(this.page, this.search);
  209. },
  210. detailUrl(goods) {
  211. this.goodsDetailId = goods.goods_id
  212. },
  213. // 选择商品
  214. selectGoods(index) {
  215. if (this.list[index].is_storage) {
  216. return false;
  217. }
  218. if (this.list[index].is_select) {
  219. Vue.set(this.list[index], 'is_select', false);
  220. } else {
  221. Vue.set(this.list[index], 'is_select', true);
  222. }
  223. },
  224. // 计算
  225. countIsSelect () {
  226. let count = 0
  227. this.list.forEach(item => {
  228. if (item.is_select == true) {
  229. count++
  230. }
  231. })
  232. return count
  233. },
  234. // 单个加入
  235. oneAdd(goods) {
  236. this.post([goods]);
  237. },
  238. // 批量加入
  239. batchAdd() {
  240. let num = 0;
  241. let goods = []
  242. this.list.forEach(function(item, index) {
  243. if (item.is_select) {
  244. num++;
  245. goods.push(item);
  246. }
  247. })
  248. if (num <= 0) {
  249. this.$message.error('请选择商品');
  250. return false;
  251. }
  252. this.post(goods);
  253. },
  254. post(goods) {
  255. this.btnLoading = true
  256. request({
  257. method: 'post',
  258. params: {
  259. r: 'qi-ding-dong/goods/import',
  260. },
  261. data: {
  262. 'goods': JSON.stringify(goods)
  263. },
  264. }).then(e => {
  265. this.btnLoading = false;
  266. if (e.data.code === 0) {
  267. this.loadData(this.page, this.search);
  268. this.$message.success(e.data.msg);
  269. } else {
  270. this.$message.error(e.data.msg);
  271. }
  272. }).catch(e => {
  273. this.btnLoading = false;
  274. });
  275. },
  276. // 全选
  277. allSelect() {
  278. if (this.checked) {
  279. this.list.forEach(function(item, index) {
  280. if (!item.storage) {
  281. item.is_select = true;
  282. }
  283. })
  284. } else {
  285. this.list.forEach(function(item, index) {
  286. item.is_select = false;
  287. })
  288. }
  289. },
  290. searchSort(event) {
  291. let el = event.currentTarget;
  292. this.search.sort_type = el.dataset.key;
  293. let index = el.dataset.index;
  294. let data = this.sort_list[index];
  295. if (data.sort == '' || data.sort == 'asc') {
  296. this.sort_list[index].sort = 'desc';
  297. } else {
  298. this.sort_list[index].sort = 'asc';
  299. }
  300. this.sort_list.forEach(function(item, key) {
  301. if (key != index) {
  302. item.sort = '';
  303. }
  304. })
  305. this.search.sort = this.sort_list[index].sort;
  306. this.searchs()
  307. },
  308. },
  309. });
  310. </script>
  311. <style>
  312. .table-body {
  313. padding: 20px;
  314. background-color: #fff;
  315. }
  316. .input-item {
  317. display: inline-block;
  318. width: 150px;
  319. margin: 0 0 20px;
  320. }
  321. .input-item .el-input__inner {
  322. border-right: 1px solid #dcdfe6;
  323. }
  324. .input-item .el-input__inner:hover {
  325. border: 1px solid #dcdfe6;
  326. border-right: 0;
  327. outline: 0;
  328. }
  329. .input-item .el-input__inner:focus {
  330. border: 1px solid #dcdfe6;
  331. border-right: 0;
  332. outline: 0;
  333. }
  334. .input-item .el-input-group__append {
  335. background-color: #fff;
  336. border-left: 0;
  337. width: 10%;
  338. padding: 0;
  339. }
  340. .input-item .el-input-group__append .el-button {
  341. padding: 0;
  342. }
  343. .input-item .el-input-group__append .el-button {
  344. margin: 0;
  345. }
  346. .select {
  347. float: left;
  348. width: 100px;
  349. margin-right: 10px;
  350. }
  351. .el-table th>.cell {
  352. color: #333;
  353. font-weight: bold;
  354. font-size: 14px;
  355. }
  356. .el-table__footer-wrapper,
  357. .el-table__header-wrapper {
  358. border-bottom: 1.4px solid #D6D6D6;
  359. }
  360. .search-sort {
  361. display: inline-block;
  362. margin: 0px 10px;
  363. cursor: pointer;
  364. color: rgb(51, 51, 51);
  365. }
  366. .caret-wrapper {
  367. display: inline-flex;
  368. flex-direction: column;
  369. align-items: center;
  370. height: 25px;
  371. width: 11px;
  372. vertical-align: middle;
  373. cursor: pointer;
  374. overflow: initial;
  375. position: relative;
  376. }
  377. .caret-top {
  378. border: 5px solid transparent;
  379. margin: 1px 0;
  380. border-bottom-color: rgb(51, 51, 51);
  381. }
  382. .caret-bottom {
  383. border: 5px solid transparent;
  384. margin: 1px 0;
  385. border-top-color: rgb(51, 51, 51);
  386. }
  387. .active {
  388. border-top-color: rgb(41, 186, 156);
  389. }
  390. .ellipsis {
  391. height: 40px;
  392. font-size: 14px;
  393. color: #333;
  394. overflow: hidden;
  395. text-overflow: ellipsis;
  396. }
  397. .goods-wrapper {
  398. border: 2px solid #CCCCCC;
  399. display: inline-block;
  400. border-radius: 2px;
  401. }
  402. .goods-select {
  403. border: 2px solid #bb730c;
  404. }
  405. .goods-price {
  406. text-align: center;
  407. }
  408. .goods-price .number {
  409. color: red;
  410. font-weight: 600;
  411. font-size: 14px;
  412. }
  413. .goods-price .title {
  414. padding: 5px 0;
  415. color: #999;
  416. ;
  417. font-size: 10px;
  418. font-weight: 600;
  419. }
  420. .bottom-price .title {
  421. padding: 5px 0;
  422. color: #8b8888;
  423. ;
  424. font-size: 10px;
  425. }
  426. .bottom-price .number {
  427. color: #ff5100;
  428. font-size: 10px;
  429. }
  430. .goods-action {
  431. margin-top: 8px;
  432. }
  433. .goods-action .title {
  434. color: #0634aa;
  435. }
  436. .bottom-active {
  437. border-bottom-color: rgb(186, 41, 92);
  438. }
  439. .top-active {
  440. border-top-color: rgb(186, 41, 92);
  441. }
  442. .price {
  443. white-space: nowrap;
  444. }
  445. .goods-list {
  446. min-height: 100px;
  447. margin-top: 5px;
  448. }
  449. .page {
  450. padding: 10px 0;
  451. }
  452. </style>