importUniacid.blade.php 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403
  1. @extends('layouts.base')
  2. @section('content')
  3. @section('title', trans('公众号导入商品'))
  4. <style>
  5. body{background-color: #F2F2F2;}
  6. .transition{transition: all .5s;}
  7. .modular{padding: 10px;border-radius: 10px;background-color: #fff;margin: 10px 0;}
  8. .tips{margin-top: 10px;line-height: 30px;height: 230px;min-width: 920px;overflow-y: hidden;}
  9. .close-tips{height: 48px;}
  10. .isShow{height: 30px;overflow-y: hidden;cursor:pointer}
  11. .put-away{transform: translateY(-30px);}
  12. .open{transform: translateY(0);}
  13. .major-tips{color: #F25353;}
  14. .tips-title{display: flex;align-items: center;width: 100%;}
  15. .tips-title .el-icon-arrow-down{transform: rotate(-180deg);margin: 0 2px;cursor:pointer}
  16. .tips .arrow-down{transform: rotate(0deg);}
  17. .el-collapse{padding: 10px;border-radius: 10px;}
  18. .search-box{display: flex;flex-wrap: wrap;}
  19. .search-box>div{max-width: 240px;margin: 10px 10px 0 0;}
  20. .list-title{display: flex;}
  21. .list-title .icon-box{display: flex;flex-wrap: wrap;width: 14px;}
  22. .list-title .icon-box i{font-size: 14px;}
  23. .list-title .el-icon-caret-bottom{margin-top: -12px;}
  24. .list{display: flex;grid-gap: 10px;text-align: justify;justify-items: center;flex-wrap: wrap;}
  25. .list-item{width: 220px;height: 330px;border: 1px solid #ccc;}
  26. .list-item:hover{border-color: #F25353;}
  27. .img-box,.list-item img{width: 100%;height: 230px;position: relative;}
  28. .checkbox{position: absolute;left: 4px;top: -8px;opacity: 0;}
  29. .isImport{position: absolute;width: 100%;height: 30px;line-height: 30px;color: #fff;background-color: #F25353;text-align: center;opacity: 0;bottom: 0;}
  30. .list-item:hover .isImport,.list-item:hover .checkbox{opacity: 1;}
  31. .product-title{text-overflow: ellipsis;overflow: hidden;display: -webkit-box;-webkit-line-clamp: 2;line-clamp: 2;-webkit-box-orient: vertical;margin: 6px;line-height: 20px;height: 40px;text-indent: 2rem;word-wrap:keep-all;}
  32. .price-box{width: 100%;height: calc(100% - 52px - 230px);display: flex;justify-content: space-around;align-items: center;text-align: center;line-height: 20px;}
  33. .foort{position: fixed;width: calc(100vw - 295px);height: 80px;background-color: #fff;bottom: 0;border-radius: 10px 10px 0 0;box-shadow: 0px -1px 10px rgb(0 0 0 / 10%);padding: 10px;}
  34. .foort-top,.foort-buttom{display: flex;align-items: center;}
  35. .--mb--rich-text{flex: 1;color: #F25353;}
  36. .foort-buttom>div{margin-right: 10px;}
  37. </style>
  38. <div class="all">
  39. <div id="app">
  40. <div class="tips modular transition" :class="{'close-tips':!isShow}">
  41. <div class="tips-title">
  42. <span style="flex: 1;">功能介绍</span>
  43. <span class="major-tips isShow" @click="setIsShow">
  44. <!-- [[isShow?"收起":"展开"]] -->
  45. <div class="put-away transition" :class="{'open':!isShow}">
  46. <div>展开</div>
  47. <div>收起</div>
  48. </div>
  49. </span>
  50. <span class="el-icon-arrow-down major-tips transition" :class="{'arrow-down':!isShow}" @click="setIsShow"></span>
  51. </div>
  52. <div>1. 选择公众号快速导入商品</div>
  53. <div>2. <span class="major-tips">导入公众号后点击导入后请不要关闭页面,或者重新刷新页面,这样会导致程序崩溃,造成不可预计的错误</span></div>
  54. <div>3. 导入会把导入公众号的商品信息:商品基本信息,分类,品牌,视频,属性,规格等导入当前公众号。<span class="major-tips">(先导入分类/品牌可增加导入的成功率)</span> </div>
  55. <div>
  56. <span>4. 如果数据你的商品描述中添加了大量的文字样式等,导入时需要更改mysql配置,步骤如下:</span>
  57. <div style="text-indent: 2rem;">1. 找到服务器my.conf文件,针对宝塔用户</div>
  58. <div style="text-indent: 2rem;">2. 查找max_allowed_packet,把max_allowed_packet值改为500M,值根据情况来定</div>
  59. </div>
  60. </div>
  61. <div class="modular">
  62. 选择公众号:
  63. <el-select v-model="search.uniacid" placeholder="请选择" size="small" @change="changeuniacid">
  64. <el-option v-for="(item,i) in PublicNumber" :key="i" :label="item.name" :value="item.uniacid"></el-option>
  65. </el-select>
  66. <div class="search-box">
  67. <el-select v-model="search.category.parentid" placeholder="请选择一级分类" size="small" @change="changeCategory(search.category.parentid,'category','category1')" clearable>
  68. <el-option v-for="(item,i) in category" :key="i" :label="item.name" :value="item.id"></el-option>
  69. </el-select>
  70. <el-select v-model="search.category.childid" placeholder="请选择二级分类" size="small" @change="changeCategory(search.category.childid,'category1','category2')" clearable>
  71. <el-option v-for="(item,i) in category1" :key="i" :label="item.name" :value="item.id"></el-option>
  72. </el-select>
  73. <el-select v-model="search.category.thirdid" placeholder="请选择三级分类" size="small" v-if="cat_level == 3">
  74. <el-option v-for="(item,i) in category2" :key="i" :label="item.name" :value="item.id"></el-option>
  75. </el-select>
  76. <div style="display: flex;align-items: center;max-width:400px;">
  77. <div style="margin-right:4px;">价格区间</div>
  78. <el-input v-model="search.min_price" placeholder="商品最低价" size="small" clearable style="flex: 1;"></el-input>
  79. <div style="margin:0 2px;">至</div>
  80. <el-input v-model="search.max_price" placeholder="商品最高价" size="small" clearable style="flex: 1;"></el-input>
  81. </div>
  82. <el-select v-model="search.is_presence" placeholder="是否已导入" size="small" clearable>
  83. <el-option label="已导入" value="1"></el-option>
  84. <el-option label="未导入" value="0"></el-option>
  85. </el-select>
  86. <el-select v-model="search.brand_id" placeholder="请选择品牌名称" size="small" clearable>
  87. <el-option v-for="(item,i) in brandList" :key="i" :label="item.name" :value="item.id"></el-option>
  88. </el-select>
  89. <!-- <el-input v-model="form.keyword" placeholder="请输入商品ID或关键字" size="small"></el-input>
  90. <el-input v-model="form.brank" placeholder="请输入品牌名称" size="small"></el-input> -->
  91. <div style="display: flex;max-width: 370px;min-width: 370px;align-items: center;">
  92. <div style="margin-right:8px;">商品类型</div>
  93. <el-checkbox-group v-model="search.product_attr" style="margin-top:6px;">
  94. <el-checkbox label="is_new">新品</el-checkbox>
  95. <el-checkbox label="is_hot">热卖</el-checkbox>
  96. <el-checkbox label="is_recommand">推荐</el-checkbox>
  97. <el-checkbox label="is_discount">促销</el-checkbox>
  98. </el-checkbox-group>
  99. </div>
  100. <div>
  101. <el-button size="small" style="width: 80px;" @click="initFrom">重置</el-button>
  102. <el-button size="small" type="primary" style="width: 80px;" @click="searchList">搜索</el-button>
  103. </div>
  104. </div>
  105. </div>
  106. <div class="modular">
  107. <div class="list-title">
  108. <el-checkbox v-model="change" @change="changeAll"></el-checkbox>
  109. <span class="" style="margin: 0 10px 0 4px;" @click="changeAll(!change)">全选</span>
  110. <span @click="setreal_sales">销量</span>
  111. <div class="icon-box" @click="setreal_sales">
  112. <i class="el-icon-caret-top transition" :class="{'major-tips':search.real_sales == '0'}"></i>
  113. <i class="el-icon-caret-bottom transition" :class="{'major-tips':search.real_sales == '1'}"></i>
  114. </div>
  115. </div>
  116. <div class="list">
  117. <div class="list-item transition" v-for="(item,i) in listData">
  118. <div class="img-box">
  119. <img :src="item.thumb" alt="">
  120. <div class="isImport transition" v-if="item.is_presence == 1">已导入</div>
  121. <el-checkbox class="checkbox transition" v-model="item.change" v-else></el-checkbox>
  122. </div>
  123. <div class="product-title">[[item.title]]</div>
  124. <div class="price-box">
  125. <div>
  126. <div>现价</div>
  127. <div class="major-tips">¥[[item.price]]</div>
  128. </div>
  129. <div>
  130. <div>成本</div>
  131. <div class="major-tips">¥[[item.cost_price]]</div>
  132. </div>
  133. </div>
  134. </div>
  135. </div>
  136. </div>
  137. <div style="height: 100px;"></div>
  138. <div class="foort" style="height: 120px">
  139. <div class="foort-top" style="margin-bottom: 20px">
  140. <div class="--mb--rich-text">如不选择导入分类则自动匹配或创建分类!</div>
  141. <el-pagination @current-change="handleCurrentChange" :current-page.sync="currentPage" :page-size="per_page" v-if="total > 0" layout="total, prev, pager, next, jumper" :total="total" background>
  142. </el-pagination>
  143. </div>
  144. <div class="foort-buttom">
  145. 选择导入的分类:
  146. <el-select v-model="importForm.parentid" placeholder="请选择一级分类" size="small" @change="changeCategory(importForm.parentid,'importcategory','importcategory1')" clearable>
  147. <el-option v-for="(item,i) in importcategory" :key="i" :label="item.name" :value="item.id"></el-option>
  148. </el-select>
  149. <el-select v-model="importForm.childid" placeholder="请选择二级分类" size="small" @change="changeCategory(importForm.childid,'importcategory1','importcategory2')" clearable>
  150. <el-option v-for="(item,i) in importcategory1" :key="i" :label="item.name" :value="item.id"></el-option>
  151. </el-select>
  152. <el-select v-model="importForm.thirdid" placeholder="请选择三级分类" size="small" clearable v-if="import_cat_level == 3">
  153. <el-option v-for="(item,i) in importcategory2" :key="i" :label="item.name" :value="item.id"></el-option>
  154. </el-select>
  155. <div style="flex: 1;">
  156. <el-button size="small" type="primary" @click="importGoods">导入商品</el-button>
  157. <el-button size="small" type="primary" @click="importAllGoods">导入全部筛选商品</el-button>
  158. </div>
  159. </div>
  160. </div>
  161. </div>
  162. </div>
  163. <script>
  164. let vm = new Vue({
  165. el:"#app",
  166. delimiters: ['[[', ']]'],
  167. data(){
  168. return{
  169. search:{
  170. uniacid:"",
  171. category:{
  172. parentid:"",
  173. childid:"",
  174. thirdid:"",
  175. },
  176. real_sales:"0",
  177. brand_id:"",
  178. is_presence:"",
  179. max_price:"",
  180. min_price:"",
  181. product_attr:[]
  182. },
  183. category:[],
  184. category1:[],
  185. category2:[],
  186. importcategory:[],
  187. importcategory1:[],
  188. importcategory2:[],
  189. importForm:{
  190. parentid:"",
  191. childid:"",
  192. thirdid:""
  193. },
  194. isShow:true,
  195. form:{},
  196. currentPage:1,
  197. total:0,
  198. listData:[],
  199. PublicNumber:[],//公众号列表
  200. value: '',
  201. isChange:false,
  202. change:false,
  203. brandList:[],
  204. per_page:20,
  205. cat_level:"2",
  206. import_cat_level:"2",
  207. }
  208. },
  209. created(){
  210. this.initFrom();
  211. this.getPublicNumber();
  212. },
  213. methods:{
  214. changeuniacid(){
  215. this.getBrand();
  216. this.getCategory();
  217. this.getImportCategory();
  218. setTimeout(this.getList,0);
  219. },
  220. changeAll(change){
  221. this.change = change;
  222. this.listData.forEach(item=>{
  223. item.change = change;
  224. })
  225. },
  226. changeCategory(value,key,ckildKey){
  227. for (let i = 0; i < this[key].length; i++) {
  228. let item = this[key][i];
  229. if (item.id == value) {
  230. this[ckildKey] = item.childrens;
  231. return false;
  232. }
  233. }
  234. },
  235. setIsShow(){
  236. this.isShow = !this.isShow;
  237. },
  238. initFrom(){
  239. this.search = {
  240. category:{
  241. parentid:"",
  242. childid:"",
  243. thirdid:""
  244. },
  245. brand_id:"",
  246. is_presence:"",
  247. max_price:"",
  248. min_price:"",
  249. product_attr:[],
  250. real_sales:"0"
  251. }
  252. },
  253. loading(text){
  254. return this.$loading({
  255. lock: true,
  256. text,
  257. spinner: 'el-icon-loading',
  258. background: 'rgba(0, 0, 0, 0.7)'
  259. });
  260. },
  261. getBrand(){
  262. this.$http.post("{!! yzWebFullUrl('plugin.goods-assistant.admin.ImportUniacid.getBrand') !!}",{uniacids:this.search.uniacid}).then(({data:{result,msg,data}})=>{
  263. if (result == 1) this.brandList = data || [];
  264. })
  265. },
  266. getPublicNumber(){
  267. let loading = this.loading("加载公众号中...");
  268. this.$http.post("{!! yzWebFullUrl('plugin.goods-assistant.admin.ImportUniacid.getPublicNumber') !!}").then(({data:{result,data,msg}})=>{
  269. loading.close();
  270. if(result == 1){
  271. if(!data || data.length<=0){
  272. this.$message.error("公众号列表为空");
  273. this.PublicNumber = [];
  274. return false;
  275. }
  276. this.PublicNumber = data;
  277. this.search.uniacid = data[0].uniacid;
  278. this.getBrand();
  279. this.getCategory();
  280. this.getImportCategory();
  281. setTimeout(this.getList,0);
  282. }else this.$message.error(msg);
  283. })
  284. },
  285. getjson(){
  286. //后端需要为空或者不选择的不需要传key过去
  287. let {search} = this;
  288. let json = {};
  289. for (let key in search) {
  290. let item = search[key];
  291. if(key == "category"){
  292. for (const key1 in item) {
  293. let items = item[key1];
  294. if(items !=""){
  295. if(!json.category) json.category = {};
  296. json.category[key1] = items;
  297. }
  298. }
  299. }else if(key == "product_attr"){
  300. if(item.length>0) json.product_attr = item;
  301. }else{
  302. if(item != "") json[key] = item;
  303. }
  304. }
  305. return json;
  306. },
  307. getList(){
  308. let loading = this.loading("加载数据中...");
  309. let json = this.getjson();
  310. this.$http.post("{!! yzWebFullUrl('plugin.goods-assistant.admin.ImportUniacid.getGoodsData') !!}",{search:json,page:this.currentPage},"加载数据中...").then(({data:{result,data,msg}})=>{
  311. loading.close();
  312. if(result == 1){
  313. this.listData = data.data;
  314. this.total = data.total;
  315. this.per_page = data.per_page;
  316. }else this.$message.error(msg);
  317. })
  318. },
  319. getCategory(){
  320. this.$http.post("{!! yzWebFullUrl('plugin.goods-assistant.admin.ImportUniacid.getCategory') !!}",{uniacids:this.search.uniacid}).then(({data:{result,data,msg}})=>{
  321. if(result == 1){
  322. this.import_cat_level = data.cat_level;
  323. this.importcategory = data.category;
  324. }
  325. // this.category = data.category || [];
  326. })
  327. },
  328. getImportCategory(){
  329. this.$http.post("{!! yzWebFullUrl('plugin.goods-assistant.admin.ImportUniacid.getImportCategory') !!}",{uniacids:this.search.uniacid}).then(({data:{result,data,msg}})=>{
  330. if(result == 1){
  331. this.cat_level = data.cat_level;
  332. this.category = data.category || [];
  333. }
  334. //this.category = data.category || [];
  335. console.log(data);
  336. })
  337. },
  338. importGoods(){
  339. let goods_ids = this.listData.map(item=>{
  340. if(item.change) return item.id;
  341. })
  342. if(!goods_ids || goods_ids.length<=0) return this.$message.error("请选择导入商品");
  343. let loading = this.loading("正在导入中...");
  344. this.$http.post("{!! yzWebFullUrl('plugin.goods-assistant.admin.ImportUniacid.isImport') !!}",{uniacids:this.search.uniacid,goods_ids,import_category:this.importForm}).then(({data:{result,msg}})=>{
  345. loading.close();
  346. this.$message[result==1?"success":"error"](msg);
  347. if(result==1) {
  348. this.change = false;
  349. setTimeout(this.getList,500);
  350. }
  351. })
  352. },
  353. importAllGoods(){
  354. let loading = this.loading("正在导入中...");
  355. let json = this.getjson();
  356. json.page = this.currentPage;
  357. let import_category = false;
  358. for (let key in this.importForm) {
  359. if(this.importForm[key]!==""){
  360. if(!import_category)import_category = {};
  361. import_category[key] = this.importForm[key];
  362. }
  363. }
  364. this.$http.post("{!! yzWebFullUrl('plugin.goods-assistant.admin.ImportUniacid.screenImport') !!}",{search:json,import_category}).then(({data:{result,msg}})=>{
  365. loading.close();
  366. this.$message[result==1?"success":"error"](msg);
  367. if(result==1) {
  368. this.change = false;
  369. setTimeout(this.getList,500);
  370. }
  371. })
  372. },
  373. searchList(){
  374. this.currentPage = 1;
  375. this.getList();
  376. },
  377. handleCurrentChange(){
  378. this.getList();
  379. },
  380. setreal_sales(){
  381. this.search.real_sales = this.search.real_sales == 1?"0":"1";
  382. this.getList();
  383. }
  384. },
  385. watch:{
  386. "search.category.parentid"(value){
  387. if(value === "") this.$set(this.search.category,"childid","");
  388. },
  389. "search.category.childid"(value){
  390. if(value === "") this.$set(this.search.category,"thirdid","");
  391. },
  392. "importForm.parentid"(value){
  393. if(value === "") this.$set(this.importForm,"childid","");
  394. },
  395. "importForm.childid"(value){
  396. if(value === "") this.$set(this.importForm,"thirdid","");
  397. }
  398. }
  399. })
  400. </script>
  401. @endsection('content')