shopList.vue 56 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833
  1. <template>
  2. <div class="m-container">
  3. <h2>
  4. <div class="squrt"></div>
  5. 商品列表
  6. </h2>
  7. <div class="m-core">
  8. <el-button
  9. type="primary"
  10. @click="onShopOperation('create')"
  11. v-permission="'/shopOperation'"
  12. style="margin-bottom: 20px"
  13. >添加</el-button
  14. >
  15. <!-- <el-upload
  16. v-permission="'import/goods'"
  17. style="display: inline-block; margin: 0 10px"
  18. action="/api-web/import/goods"
  19. :show-file-list="false"
  20. :before-upload="beforeUpload"
  21. accept=".xlsx,.xls"
  22. :headers="headers"
  23. :on-error="handleError"
  24. :on-success="handleSuccess"
  25. >
  26. <el-button type="primary" style="margin-bottom: 20px">商品导入</el-button>
  27. </el-upload> -->
  28. <!-- <el-upload v-permission="'export/goods'"
  29. style="display: inline-block; margin: 0 10px;"
  30. action="/api-web/export/goods"
  31. :show-file-list="false"
  32. :before-upload="beforeUpload"
  33. accept=".xlsx,.xls"
  34. :headers="headers"
  35. :on-error="handleError"
  36. :on-success="handleSuccess">
  37. <el-button >商品导出</el-button>
  38. </el-upload> -->
  39. <el-button
  40. v-permission="'export/goods'"
  41. type="primary"
  42. style="margin-bottom: 20px"
  43. @click="exportShopList"
  44. >商品导出</el-button
  45. >
  46. <!-- <el-button
  47. type="primary"
  48. style="margin-bottom: 20px"
  49. @click="onDownload"
  50. v-permission="'import/downloadTemplate'"
  51. >下载模板</el-button
  52. > -->
  53. <el-button
  54. type="primary"
  55. style="margin-bottom: 20px"
  56. v-permission="'goods/add/commonAdd'"
  57. @click="onShopComAdd"
  58. >添加组合商品</el-button
  59. >
  60. <!-- 搜索类型 -->
  61. <save-form
  62. :inline="true"
  63. class="searchForm"
  64. ref="searchForm"
  65. @submit="onSearch"
  66. @reset="onReset"
  67. :model="searchForm"
  68. >
  69. <el-form-item prop="search">
  70. <el-input
  71. v-model.trim="searchForm.search"
  72. clearable
  73. placeholder="商品编号/货号/商品名称"
  74. ></el-input>
  75. </el-form-item>
  76. <!-- <el-form-item prop="organId">
  77. <el-select
  78. v-model.trim="searchForm.organId"
  79. clearable
  80. placeholder="所属分部"
  81. >
  82. <el-option
  83. v-for="item in selects.branchs"
  84. :key="item.id"
  85. :label="item.name"
  86. :value="item.id.toString()"
  87. ></el-option>
  88. </el-select>
  89. </el-form-item> -->
  90. <!-- <el-form-item prop="studentShowOrganId">
  91. <el-select
  92. v-model.trim="searchForm.studentShowOrganId"
  93. clearable
  94. placeholder="学生端可见分部"
  95. >
  96. <el-option
  97. v-for="item in selects.branchs"
  98. :key="item.id"
  99. :label="item.name"
  100. :value="item.id.toString()"
  101. ></el-option>
  102. </el-select>
  103. </el-form-item> -->
  104. <el-form-item prop="educationShowOrganId">
  105. <el-select
  106. v-model.trim="searchForm.educationShowOrganId"
  107. clearable
  108. placeholder="管理端APP可售分部"
  109. >
  110. <el-option
  111. v-for="item in selects.branchs"
  112. :key="item.id"
  113. :label="item.name"
  114. :value="item.id.toString()"
  115. ></el-option>
  116. </el-select>
  117. </el-form-item>
  118. <el-form-item prop="courseFeeShowOrganId">
  119. <el-select
  120. v-model.trim="searchForm.courseFeeShowOrganId"
  121. clearable
  122. placeholder="课程收费团可售分部"
  123. >
  124. <el-option
  125. v-for="item in selects.branchs"
  126. :key="item.id"
  127. :label="item.name"
  128. :value="item.id.toString()"
  129. ></el-option>
  130. </el-select>
  131. </el-form-item>
  132. <el-form-item prop="memberFeeShowOrganId">
  133. <el-select
  134. v-model.trim="searchForm.memberFeeShowOrganId"
  135. clearable
  136. placeholder="会员收费团可见分部"
  137. >
  138. <el-option
  139. v-for="item in selects.branchs"
  140. :key="item.id"
  141. :label="item.name"
  142. :value="item.id.toString()"
  143. ></el-option>
  144. </el-select>
  145. </el-form-item>
  146. <el-form-item prop="replacementShowOrganId" v-if="tenantId==1">
  147. <el-select
  148. v-model.trim="searchForm.replacementShowOrganId"
  149. clearable
  150. placeholder="乐器置换可见分部"
  151. >
  152. <el-option
  153. v-for="item in selects.branchs"
  154. :key="item.id"
  155. :label="item.name"
  156. :value="item.id.toString()"
  157. ></el-option>
  158. </el-select>
  159. </el-form-item>
  160. <el-form-item prop="type">
  161. <el-select
  162. v-model.trim="searchForm.type"
  163. clearable
  164. placeholder="商品类型"
  165. >
  166. <el-option
  167. v-for="(item, index) in goodsType"
  168. :key="index"
  169. :label="item.label"
  170. :value="item.value"
  171. ></el-option>
  172. </el-select>
  173. </el-form-item>
  174. <el-form-item prop="goodsCategoryId">
  175. <el-select
  176. v-model.trim="searchForm.goodsCategoryId"
  177. clearable
  178. placeholder="商品分类"
  179. >
  180. <el-option
  181. v-for="(item, index) in categoryList"
  182. :key="index"
  183. :label="item.label"
  184. :value="item.value"
  185. ></el-option>
  186. </el-select>
  187. </el-form-item>
  188. <el-form-item prop="status">
  189. <el-select
  190. v-model.trim="searchForm.status"
  191. clearable
  192. placeholder="是否是上架"
  193. >
  194. <el-option label="是" value="1"></el-option>
  195. <el-option label="否" value="0"></el-option>
  196. </el-select>
  197. </el-form-item>
  198. <el-form-item prop="groupGoods">
  199. <el-select
  200. v-model.trim="searchForm.groupGoods"
  201. clearable
  202. placeholder="是否是组合商品"
  203. >
  204. <el-option label="是" value="1"></el-option>
  205. <el-option label="否" value="0"></el-option>
  206. </el-select>
  207. </el-form-item>
  208. <!-- <el-form-item prop="clientShow">
  209. <el-select
  210. v-model.trim="searchForm.clientShow"
  211. clearable
  212. placeholder="学生端是否是展示"
  213. >
  214. <el-option label="是" value="1"></el-option>
  215. <el-option label="否" value="0"></el-option>
  216. </el-select>
  217. </el-form-item> -->
  218. <!-- <el-form-item prop="educationalShow">
  219. <el-select
  220. v-model.trim="searchForm.educationalShow"
  221. clearable
  222. placeholder="管理端是否是展示"
  223. >
  224. <el-option label="是" value="1"></el-option>
  225. <el-option label="否" value="0"></el-option>
  226. </el-select>
  227. </el-form-item> -->
  228. <!-- <el-form-item prop="musicGroupShow">
  229. <el-select
  230. v-model.trim="searchForm.musicGroupShow"
  231. clearable
  232. placeholder="乐团是否是展示"
  233. >
  234. <el-option label="是" value="1"></el-option>
  235. <el-option label="否" value="0"></el-option>
  236. </el-select>
  237. </el-form-item> -->
  238. <!-- <el-form-item prop="courseViewType">
  239. <el-select
  240. v-model.trim="searchForm.courseViewType"
  241. placeholder="乐团收费模式"
  242. clearable
  243. >
  244. <el-option label="课程收费" value="0"></el-option>
  245. <el-option label="系统收费" value="1"></el-option>
  246. <el-option label="团练宝收费" value="2"></el-option>
  247. </el-select>
  248. </el-form-item> -->
  249. <!-- <el-form-item prop="replacementShow">
  250. <el-select
  251. v-model.trim="searchForm.replacementShow"
  252. clearable
  253. placeholder="是否参与置换"
  254. >
  255. <el-option label="是" value="1"></el-option>
  256. <el-option label="否" value="0"></el-option>
  257. </el-select>
  258. </el-form-item> -->
  259. <!-- <el-form-item>
  260. <el-date-picker v-model.trim="orderDate" style="width:410px;" type="daterange" value-format="yyyy-MM-dd"
  261. @change="searchOrderDate" range-separator="至" :picker-options="{ firstDayOfWeek: 1 }" start-placeholder="开始日期"
  262. end-placeholder="结束日期"></el-date-picker>
  263. </el-form-item> -->
  264. <el-form-item>
  265. <el-button type="danger" native-type="submit">搜索</el-button>
  266. <el-button type="primary" native-type="reset">重置</el-button>
  267. </el-form-item>
  268. </save-form>
  269. <!-- 列表 -->
  270. <div class="tableWrap">
  271. <el-table
  272. :data="tableList"
  273. :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
  274. >
  275. <el-table-column align="center" prop="id" label="商品编号">
  276. </el-table-column>
  277. <el-table-column align="center" prop="sn" label="货号">
  278. </el-table-column>
  279. <el-table-column align="center" prop="brand" label="品牌">
  280. </el-table-column>
  281. <el-table-column
  282. align="center"
  283. prop="name"
  284. label="商品名称"
  285. width="150px"
  286. >
  287. <template slot-scope="scope">
  288. <overflow-text :text="scope.row.name" width="100%" />
  289. </template>
  290. </el-table-column>
  291. <el-table-column align="center" label="是否组合商品">
  292. <template slot-scope="scope">
  293. {{ scope.row.complementGoodsIdList ? "是" : "否" }}
  294. </template>
  295. </el-table-column>
  296. <!-- <el-table-column align="center" label="学员是否展示">
  297. <template slot-scope="scope">
  298. {{ scope.row.clientShow ? "是" : "否" }}
  299. </template>
  300. </el-table-column> -->
  301. <!-- <el-table-column align="center" label="教务端是否展示">
  302. <template slot-scope="scope">
  303. {{ scope.row.educationalShow ? "是" : "否" }}
  304. </template>
  305. </el-table-column> -->
  306. <!-- <el-table-column align="center" label="乐团是否展示">
  307. <template slot-scope="scope">
  308. {{ scope.row.musicGroupShow ? "是" : "否" }}
  309. </template>
  310. </el-table-column> -->
  311. <!-- <el-table-column align="center" label="乐团收费模式">
  312. <template slot-scope="scope">
  313. <Tooltip
  314. :content="scope.row.courseViewType | courseViewTypeFormat"
  315. />
  316. </template>
  317. </el-table-column> -->
  318. <el-table-column align="center" label="是否库存预警" v-if="tenantId==1">
  319. <template slot-scope="scope">
  320. <span v-if="!scope.row.complementGoodsIdList">
  321. {{ scope.row.stockWarning ? "是" : "否" }}
  322. </span>
  323. </template>
  324. </el-table-column>
  325. <!-- <el-table-column align="center" label="是否参与置换">
  326. <template slot-scope="scope">
  327. <span>
  328. {{ scope.row.replacementShow ? "是" : "否" }}
  329. </span>
  330. </template>
  331. </el-table-column> -->
  332. <el-table-column align="center" label="商品类型">
  333. <template slot-scope="scope">
  334. {{ scope.row.type | shopType }}
  335. </template>
  336. </el-table-column>
  337. <el-table-column
  338. align="center"
  339. prop="goodsCategoryName"
  340. label="商品分类"
  341. >
  342. </el-table-column>
  343. <el-table-column align="center" prop="specification" label="具体型号">
  344. <template slot-scope="scope">
  345. <span style="max-height: 64px; display: block">{{
  346. scope.row.specification
  347. }}</span>
  348. </template>
  349. </el-table-column>
  350. <el-table-column align="center" prop="stockCount" label="内部库存" v-if="tenantId==1">
  351. <template slot-scope="scope">
  352. <!-- 先判断是否是组合商品 -->
  353. <span v-if="scope.row.complementGoodsIdList">
  354. {{ scope.row.stockCount ? scope.row.stockCount : "" }}
  355. </span>
  356. <span v-else>{{ scope.row.stockCount }}</span>
  357. </template>
  358. </el-table-column>
  359. <el-table-column align="center" prop="taxStockCount" label="税务库存">
  360. <template slot-scope="scope">
  361. <!-- 先判断是否是组合商品 -->
  362. <span v-if="scope.row.complementGoodsIdList">
  363. {{ scope.row.taxStockCount ? scope.row.taxStockCount : "" }}
  364. </span>
  365. <span v-else>{{ scope.row.taxStockCount }}</span>
  366. </template>
  367. </el-table-column>
  368. <el-table-column align="center" prop="stockType" label="库存类型" v-if="tenantId==1">
  369. <template slot-scope="scope">
  370. {{ scope.row.stockType | stockTypeStatus }}
  371. </template>
  372. </el-table-column>
  373. <el-table-column align="center" prop="marketPrice" label="市场价(元)">
  374. <template slot-scope="scope">
  375. {{ scope.row.marketPrice | moneyFormat }}
  376. </template>
  377. </el-table-column>
  378. <el-table-column align="center" prop="marketPrice" label="零售价(元)">
  379. <template slot-scope="scope">
  380. {{ scope.row.discountPrice | moneyFormat }}
  381. </template>
  382. </el-table-column>
  383. <el-table-column
  384. align="center"
  385. prop="groupPurchasePrice"
  386. label="商品团购价(元)"
  387. >
  388. <template slot-scope="scope">
  389. {{ scope.row.groupPurchasePrice | moneyFormat }}
  390. </template>
  391. </el-table-column>
  392. <el-table-column
  393. align="center"
  394. cell-style="padding: 0"
  395. label="商品缩略图"
  396. >
  397. <template slot-scope="scope">
  398. <img class="shopImage" :src="scope.row.image" alt="" srcset="" />
  399. </template>
  400. </el-table-column>
  401. <!-- <el-table-column align="center" label="所属分部">
  402. <template slot-scope="scope">
  403. <div>
  404. <Tooltip :content="scope.row.organName" />
  405. </div>
  406. </template>
  407. </el-table-column> -->
  408. <el-table-column align="center" label="商品描述">
  409. <template slot-scope="scope">
  410. <Tooltip :content="scope.row.brief" />
  411. </template>
  412. </el-table-column>
  413. <el-table-column align="center" label="商品详情">
  414. <template slot-scope="scope">
  415. <Tooltip :content="scope.row.desc" />
  416. </template>
  417. </el-table-column>
  418. <el-table-column
  419. align="center"
  420. width="180px"
  421. label="操作"
  422. fixed="right"
  423. >
  424. <template slot-scope="scope">
  425. <!-- 组合商品没有进货清单按钮 v-permission="'/purchaseLlist'" -->
  426. <el-button
  427. v-if="
  428. !scope.row.complementGoodsIdList &&
  429. permission('/purchaseLlist')
  430. "
  431. @click="onPurchaseList(scope.row)"
  432. type="text"
  433. >进货清单</el-button
  434. >
  435. <el-button
  436. v-if="
  437. scope.row.status == 0 && permission('goods/updateGoodsStatus')
  438. "
  439. @click="onUpdate(scope.row, 0)"
  440. type="text"
  441. >上架</el-button
  442. >
  443. <el-button
  444. v-if="
  445. scope.row.status == 1 &&
  446. permission('goods/updateGoodsStatus/downGoods')
  447. "
  448. @click="onUpdate(scope.row, 1)"
  449. type="text"
  450. >下架</el-button
  451. >
  452. <el-button
  453. v-if="
  454. scope.row.status == 0 &&
  455. permission('/shopOperation/updateShop')
  456. "
  457. @click="onShopOperation('update', scope.row)"
  458. type="text"
  459. >修改</el-button
  460. >
  461. <el-button
  462. v-if="
  463. scope.row.status == 1 && permission('/shopOperation/shopLook')
  464. "
  465. @click="onShopOperation('look', scope.row)"
  466. type="text"
  467. >查看</el-button
  468. >
  469. <el-button
  470. v-if="permission('/shopOperation/copyShop')"
  471. @click="onShopOperation('copy', scope.row)"
  472. type="text"
  473. >复制</el-button
  474. >
  475. <!-- <el-button v-if="scope.row.status == 0"
  476. v-permission="'goods/del'"
  477. @click="onDelete(scope.row)"
  478. type="text">删除</el-button> -->
  479. </template>
  480. </el-table-column>
  481. </el-table>
  482. <pagination
  483. sync
  484. :total.sync="pageInfo.total"
  485. :page.sync="pageInfo.page"
  486. :limit.sync="pageInfo.limit"
  487. :page-sizes="pageInfo.page_size"
  488. @pagination="getList"
  489. />
  490. </div>
  491. </div>
  492. <el-dialog
  493. :title="addString[addType] + '组合商品'"
  494. v-if="routeShopStatus"
  495. :visible.sync="routeShopStatus"
  496. @close="onFormClose('ruleForm')"
  497. width="1000px"
  498. >
  499. <el-form :model="form" :rules="rules" ref="ruleForm" :inline="true">
  500. <el-alert
  501. title="基础信息"
  502. :closable="false"
  503. class="alert"
  504. type="info"
  505. />
  506. <el-form-item
  507. label="商品名称"
  508. prop="name"
  509. :label-width="formLabelWidth"
  510. >
  511. <el-input
  512. style="width: 220px !important"
  513. placeholder="请输入商品名称"
  514. type="text"
  515. :disabled="addDisabled"
  516. v-model.trim="form.name"
  517. ></el-input>
  518. </el-form-item>
  519. <el-form-item label="货号" prop="sn" :label-width="formLabelWidth">
  520. <el-input
  521. style="width: 220px !important"
  522. placeholder="请输入货号"
  523. type="text"
  524. :disabled="addDisabled"
  525. v-model.trim="form.sn"
  526. ></el-input>
  527. </el-form-item>
  528. <el-form-item label="品牌" prop="brand" :label-width="formLabelWidth">
  529. <el-input
  530. style="width: 220px !important"
  531. v-model.trim="form.brand"
  532. :disabled="addDisabled"
  533. placeholder="请输入品牌"
  534. ></el-input>
  535. </el-form-item>
  536. <!-- <el-form-item label="所属分部" :label-width="formLabelWidth" prop="organIdList">
  537. <select-all v-model.trim="form.organIdList"
  538. filterable
  539. placeholder="请选择所属分部"
  540. style="width: 100% !important"
  541. multiple
  542. :disabled="addDisabled || addType == 'update'"
  543. @change="onOrganChange"
  544. clearable>
  545. <el-option v-for="item in selects.branchs"
  546. :key="item.id"
  547. :label="item.name"
  548. :value="item.id.toString()"></el-option>
  549. </select-all>
  550. </el-form-item> -->
  551. <el-form-item
  552. label="商品类型"
  553. prop="type"
  554. :label-width="formLabelWidth"
  555. >
  556. <el-select
  557. v-model.trim="form.type"
  558. :disabled="addDisabled"
  559. style="width: 220px !important"
  560. placeholder="请选择商品类型"
  561. >
  562. <el-option
  563. v-for="(item, index) in goodsType"
  564. :key="index"
  565. :label="item.label"
  566. :value="item.value"
  567. ></el-option>
  568. </el-select>
  569. </el-form-item>
  570. <el-form-item
  571. label="商品分类"
  572. prop="goodsCategoryId"
  573. :label-width="formLabelWidth"
  574. >
  575. <el-select
  576. v-model.trim="form.goodsCategoryId"
  577. style="width: 220px !important"
  578. placeholder="请选择商品分类"
  579. :disabled="addDisabled"
  580. filterable
  581. >
  582. <el-option
  583. v-for="item in categoryList"
  584. :key="item.value"
  585. :label="item.label"
  586. :value="item.value"
  587. >
  588. </el-option>
  589. </el-select>
  590. </el-form-item>
  591. <el-form-item
  592. label="商品型号"
  593. prop="specification"
  594. :label-width="formLabelWidth"
  595. >
  596. <el-input
  597. v-model.trim="form.specification"
  598. :disabled="addDisabled"
  599. style="width: 220px !important"
  600. placeholder="请输入商品型号"
  601. ></el-input>
  602. </el-form-item>
  603. <div v-for="(goodsList, index) in form.goodsList" :key="index">
  604. <el-form-item
  605. :label="'商品' + (index + 1)"
  606. :label-width="formLabelWidth"
  607. style="display: inline-block; width: 80% !important"
  608. :prop="'goodsList.' + index + '.id'"
  609. :rules="[
  610. { required: true, message: '请选择商品', trigger: 'change' },
  611. ]"
  612. >
  613. <el-select
  614. v-model.trim="goodsList.id"
  615. @change="onGoodsChange"
  616. filterable
  617. style="width: 220px !important"
  618. :disabled="addDisabled"
  619. placeholder="请选择商品"
  620. >
  621. <el-option
  622. v-for="(item, index) in selectGoodsList"
  623. :key="index"
  624. :disabled="item.disabled"
  625. :label="item.name"
  626. :value="item.id"
  627. ></el-option>
  628. </el-select>
  629. </el-form-item>
  630. <div v-if="!addDisabled" style="display: inline-block">
  631. <el-button
  632. icon="el-icon-minus"
  633. v-if="form.goodsList.length > 1"
  634. @click.prevent="removeGoodsList(goodsList)"
  635. circle
  636. ></el-button>
  637. <el-button
  638. icon="el-icon-plus"
  639. @click.prevent="addGoodsList"
  640. circle
  641. style="margin-left: 5px"
  642. ></el-button>
  643. </div>
  644. </div>
  645. <el-alert
  646. title="价格信息"
  647. :closable="false"
  648. class="alert"
  649. type="info"
  650. />
  651. <el-form-item
  652. label="市场价"
  653. class="hiddenStart"
  654. prop="marketPrice"
  655. :label-width="formLabelWidth"
  656. >
  657. <template slot="label">
  658. <p style="position: relative">
  659. <span style="color: #f56c6c; margin-right: 4px">*</span>
  660. 市场价
  661. <el-tooltip placement="top" popper-class="mTooltip">
  662. <div slot="content">
  663. 商品标价,仅在商品购买时做展示,不以该价格向学员销售商品
  664. </div>
  665. <i
  666. class="el-icon-question"
  667. style="
  668. font-size: 18px;
  669. color: #f56c6c;
  670. position: relative;
  671. top: 2px;
  672. "
  673. ></i>
  674. </el-tooltip>
  675. </p>
  676. </template>
  677. <el-input
  678. type="number"
  679. placeholder="请输入市场价"
  680. :disabled="addDisabled"
  681. @mousewheel.native.prevent
  682. v-model.trim="form.marketPrice"
  683. style="width: 220px !important"
  684. ></el-input>
  685. </el-form-item>
  686. <el-form-item
  687. label="零售价"
  688. class="hiddenStart"
  689. prop="discountPrice"
  690. :label-width="formLabelWidth"
  691. >
  692. <template slot="label">
  693. <p style="position: relative">
  694. <span style="color: #f56c6c; margin-right: 4px">*</span>
  695. 零售价
  696. <el-tooltip placement="top" popper-class="mTooltip">
  697. <div slot="content">
  698. 管理端APP、乐器维修时学员购买该商品的价格
  699. </div>
  700. <i
  701. class="el-icon-question"
  702. style="
  703. font-size: 18px;
  704. color: #f56c6c;
  705. position: relative;
  706. top: 2px;
  707. "
  708. ></i>
  709. </el-tooltip>
  710. </p>
  711. </template>
  712. <el-input
  713. type="number"
  714. placeholder="请输入零售价"
  715. :disabled="addDisabled"
  716. @mousewheel.native.prevent
  717. v-model.trim="form.discountPrice"
  718. style="width: 220px !important"
  719. ></el-input>
  720. </el-form-item>
  721. <el-form-item
  722. label="商品团购价"
  723. prop="groupPurchasePrice"
  724. class="hiddenStart"
  725. :label-width="formLabelWidth"
  726. >
  727. <template slot="label">
  728. <p style="position: relative">
  729. <span style="color: #f56c6c; margin-right: 4px">*</span>
  730. 团购价
  731. <el-tooltip placement="top" popper-class="mTooltip">
  732. <div slot="content">乐团报名缴费时学员购买该商品的价格</div>
  733. <i
  734. class="el-icon-question"
  735. style="
  736. font-size: 18px;
  737. color: #f56c6c;
  738. position: relative;
  739. top: 2px;
  740. "
  741. ></i>
  742. </el-tooltip>
  743. </p>
  744. </template>
  745. <el-input
  746. type="number"
  747. placeholder="请输入商品团购价"
  748. :disabled="addDisabled"
  749. @mousewheel.native.prevent
  750. v-model.trim="form.groupPurchasePrice"
  751. style="width: 220px !important"
  752. ></el-input>
  753. </el-form-item>
  754. <!-- <el-form-item
  755. label="学员是否展示"
  756. prop="clientShow"
  757. :label-width="formLabelWidth"
  758. >
  759. <el-select
  760. v-model="form.clientShow"
  761. style="width: 100% !important"
  762. :disabled="addDisabled"
  763. placeholder="请选择学员是否展示"
  764. >
  765. <el-option label="是" :value="1"></el-option>
  766. <el-option label="否" :value="0"></el-option>
  767. </el-select>
  768. </el-form-item>
  769. <el-form-item
  770. label="教务端是否展示"
  771. prop="educationalShow"
  772. :label-width="formLabelWidth"
  773. >
  774. <el-select
  775. v-model="form.educationalShow"
  776. style="width: 100% !important"
  777. :disabled="addDisabled"
  778. placeholder="请选择教务端是否展示"
  779. >
  780. <el-option label="是" :value="1"></el-option>
  781. <el-option label="否" :value="0"></el-option>
  782. </el-select>
  783. </el-form-item>
  784. <el-form-item
  785. label="乐团是否展示"
  786. prop="musicGroupShow"
  787. :label-width="formLabelWidth"
  788. >
  789. <el-select
  790. v-model="form.musicGroupShow"
  791. style="width: 100% !important"
  792. :disabled="addDisabled"
  793. placeholder="请选择乐团是否展示"
  794. >
  795. <el-option label="是" :value="1"></el-option>
  796. <el-option label="否" :value="0"></el-option>
  797. </el-select>
  798. </el-form-item>
  799. <el-form-item
  800. label="乐团收费模式"
  801. :label-width="formLabelWidth"
  802. prop="courseViewType"
  803. >
  804. <select-all
  805. v-model.trim="form.courseViewType"
  806. filterable
  807. placeholder="请选择乐团收费模式"
  808. multiple
  809. :disabled="
  810. addDisabled ||
  811. (form.musicGroupShow != 0 && form.musicGroupShow != 1)
  812. "
  813. clearable
  814. >
  815. <el-option label="课程收费" value="0"></el-option>
  816. <el-option label="系统收费" value="1"></el-option>
  817. <el-option label="团练宝收费" value="2"></el-option>
  818. </select-all> -->
  819. <!-- <el-select
  820. v-model="form.courseViewType"
  821. multiple
  822. placeholder="请选择乐团收费模式"
  823. :disabled="addDisabled"
  824. >
  825. <el-option label="课程收费" :value="0"></el-option>
  826. <el-option label="系统收费" :value="1"></el-option>
  827. <el-option label="团练宝收费" :value="2"></el-option>
  828. </el-select> -->
  829. <!-- </el-form-item> -->
  830. <!-- <el-form-item
  831. label="是否参与置换"
  832. prop="replacementShow"
  833. :label-width="formLabelWidth"
  834. >
  835. <el-select
  836. v-model="form.replacementShow"
  837. style="width: 100% !important"
  838. :disabled="addDisabled"
  839. placeholder="是否参与置换"
  840. >
  841. <el-option label="是" :value="1"></el-option>
  842. <el-option label="否" :value="0"></el-option>
  843. </el-select>
  844. </el-form-item> -->
  845. <el-alert
  846. title="销售渠道"
  847. :closable="false"
  848. class="alert"
  849. type="info"
  850. />
  851. <!-- :disabled="pageDisabled || pageType == 'update'" -->
  852. <!-- <el-form-item
  853. label="学员可见分部"
  854. prop="studentShowOrganId"
  855. :label-width="formLabelWidth"
  856. >
  857. <select-all
  858. v-model.trim="form.studentShowOrganId"
  859. filterable
  860. placeholder="请选择学员可见分部"
  861. style="width: 400px !important"
  862. multiple
  863. clearable
  864. :disabled="addDisabled"
  865. >
  866. <el-option
  867. v-for="item in selects.branchs"
  868. :key="item.id"
  869. :label="item.name"
  870. :value="item.id.toString()"
  871. ></el-option>
  872. </select-all>
  873. </el-form-item> -->
  874. <!-- :disabled="pageDisabled || pageType == 'update'" -->
  875. <el-form-item
  876. label="管理端APP可售分部"
  877. prop="educationShowOrganId"
  878. :label-width="formLabelWidth"
  879. >
  880. <select-all
  881. v-model.trim="form.educationShowOrganId"
  882. filterable
  883. placeholder="管理端APP可售分部"
  884. style="width: 400px !important"
  885. multiple
  886. clearable
  887. :disabled="addDisabled"
  888. >
  889. <el-option
  890. v-for="item in selects.branchs"
  891. :key="item.id"
  892. :label="item.name"
  893. :value="item.id.toString()"
  894. ></el-option>
  895. </select-all>
  896. </el-form-item>
  897. <!-- :disabled="pageDisabled || pageType == 'update'" -->
  898. <el-form-item
  899. label="课程收费乐团可售分部"
  900. prop="courseFeeShowOrganId"
  901. :label-width="formLabelWidth"
  902. >
  903. <select-all
  904. v-model.trim="form.courseFeeShowOrganId"
  905. filterable
  906. placeholder="课程收费乐团可售分部"
  907. style="width: 400px !important"
  908. multiple
  909. clearable
  910. :disabled="addDisabled"
  911. >
  912. <el-option
  913. v-for="item in selects.branchs"
  914. :key="item.id"
  915. :label="item.name"
  916. :value="item.id.toString()"
  917. ></el-option>
  918. </select-all>
  919. </el-form-item>
  920. <!-- :disabled="pageDisabled || pageType == 'update'" -->
  921. <el-form-item
  922. label="会员收费乐团可售分部"
  923. prop="memberFeeShowOrganId"
  924. :label-width="formLabelWidth"
  925. >
  926. <select-all
  927. v-model.trim="form.memberFeeShowOrganId"
  928. filterable
  929. placeholder="请选择会员收费团可见分部"
  930. style="width: 400px !important"
  931. multiple
  932. clearable
  933. :disabled="addDisabled"
  934. >
  935. <el-option
  936. v-for="item in selects.branchs"
  937. :key="item.id"
  938. :label="item.name"
  939. :value="item.id.toString()"
  940. ></el-option>
  941. </select-all>
  942. </el-form-item>
  943. <!-- :disabled="pageDisabled || pageType == 'update'" -->
  944. <el-form-item v-if="tenantId==1"
  945. label="乐器置换可售分部"
  946. prop="replacementShowOrganId"
  947. :label-width="formLabelWidth"
  948. >
  949. <select-all
  950. v-model.trim="form.replacementShowOrganId"
  951. filterable
  952. placeholder="请选择乐器置换可售分部"
  953. style="width: 400px !important"
  954. multiple
  955. clearable
  956. :disabled="addDisabled"
  957. >
  958. <el-option
  959. v-for="item in selects.branchs"
  960. :key="item.id"
  961. :label="item.name"
  962. :value="item.id.toString()"
  963. ></el-option>
  964. </select-all>
  965. </el-form-item>
  966. <el-alert
  967. title="商品信息"
  968. :closable="false"
  969. class="alert"
  970. type="info"
  971. />
  972. <el-form-item
  973. label="商品图片"
  974. prop="image"
  975. :label-width="formLabelWidth"
  976. >
  977. <!-- <upload
  978. v-model="form.image"
  979. :imageWidthM="400"
  980. :disabled="addDisabled"
  981. :imageHeightM="400"
  982. ></upload> -->
  983. <image-cropper :options="cropperOptions" :disabled="addDisabled" :imgSize="2" :imageUrl="form.image" @crop-upload-success="cropSuccess" />
  984. <p style="color: red">
  985. 请上传大小2M以内,格式为jpg、png、gif图片
  986. </p>
  987. </el-form-item>
  988. <br />
  989. <el-form-item
  990. label="商品描述"
  991. prop="brief"
  992. :label-width="formLabelWidth"
  993. >
  994. <el-input
  995. type="textarea"
  996. :disabled="addDisabled"
  997. v-model.trim="form.brief"
  998. style="width: 400px"
  999. ></el-input>
  1000. </el-form-item>
  1001. <el-form-item
  1002. label="商品详情"
  1003. prop="desc"
  1004. :label-width="formLabelWidth"
  1005. >
  1006. <el-input
  1007. type="textarea"
  1008. :disabled="addDisabled"
  1009. v-model.trim="form.desc"
  1010. style="width: 400px"
  1011. ></el-input>
  1012. </el-form-item>
  1013. </el-form>
  1014. <span slot="footer" v-if="!addDisabled" class="dialog-footer">
  1015. <el-button @click="routeShopStatus = false">取 消</el-button>
  1016. <el-button @click="onShopSubmit('ruleForm')" type="primary"
  1017. >确 定</el-button
  1018. >
  1019. </span>
  1020. </el-dialog>
  1021. </div>
  1022. </template>
  1023. <script>
  1024. import pagination from "@/components/Pagination/index";
  1025. import Upload from "@/components/Upload/index";
  1026. import {
  1027. categoryListTree,
  1028. goodsQuery,
  1029. goodsAdd,
  1030. goodsUpdate,
  1031. goodsDelete,
  1032. updateGoodsStatus,
  1033. } from "@/api/businessManager";
  1034. import qs from "qs";
  1035. import cleanDeep from "clean-deep";
  1036. import store from "@/store";
  1037. import Tooltip from "@/components/Tooltip/index";
  1038. import { Export } from "@/utils/downLoadFile";
  1039. import { getToken, getTenantId } from "@/utils/auth";
  1040. import { goodsType } from "@/utils/searchArray";
  1041. import load from "@/utils/loading";
  1042. import { permission } from "@/utils/directivePage";
  1043. import ImageCropper from '@/components/ImageCropper'
  1044. // import courseEvaluateVue from '@/views/teamDetail/componentCourse/courseEvaluate.vue';
  1045. let validPrice = (rule, value, callback) => {
  1046. if ((value == "" && typeof value == "string") || value == null) {
  1047. callback(new Error("请输入金额"));
  1048. } else if (value < 0) {
  1049. callback(new Error("输入金额必须大于或等于0"));
  1050. } else if (value >= 100000) {
  1051. callback(new Error("输入金额必须小于100000"));
  1052. } else {
  1053. callback();
  1054. }
  1055. };
  1056. let validStock = (rule, value, callback) => {
  1057. if ((value == "" && typeof value == "string") || value == null) {
  1058. callback(new Error("请输入库存"));
  1059. } else if (value < 0) {
  1060. callback(new Error("库存数量必须大于或等于0"));
  1061. } else {
  1062. callback();
  1063. }
  1064. };
  1065. export default {
  1066. components: {
  1067. pagination,
  1068. Tooltip,
  1069. Upload,
  1070. ImageCropper
  1071. },
  1072. name: "shopList",
  1073. data() {
  1074. return {
  1075. goodsType: goodsType,
  1076. categoryList: [],
  1077. goodsLoading: false,
  1078. organId: null,
  1079. orderDate: null,
  1080. searchForm: {
  1081. search: null,
  1082. groupGoods: null,
  1083. organId: null,
  1084. type: null,
  1085. status: null,
  1086. goodsCategoryId: null,
  1087. startTime: null,
  1088. endTime: null,
  1089. status: null,
  1090. clientShow: null,
  1091. educationalShow: null,
  1092. musicGroupShow: null,
  1093. courseViewType: null,
  1094. replacementShow: null,
  1095. courseFeeShowOrganId:null,
  1096. educationShowOrganId:null,
  1097. memberFeeShowOrganId:null,
  1098. replacementShowOrganId:null,
  1099. studentShowOrganId:null
  1100. },
  1101. headers: {
  1102. Authorization: getToken(),
  1103. tenantId: getTenantId()
  1104. },
  1105. searchLsit: [],
  1106. tableList: [],
  1107. pageInfo: {
  1108. // 分页规则
  1109. limit: 10, // 限制显示条数
  1110. page: 1, // 当前页
  1111. total: 0, // 总条数
  1112. page_size: [10, 20, 40, 50], // 选择限制显示条数
  1113. },
  1114. formLabelWidth: "160px",
  1115. routeShopStatus: false,
  1116. addType: "create",
  1117. addString: {
  1118. create: "添加",
  1119. update: "修改",
  1120. look: "查看",
  1121. copy: "复制",
  1122. },
  1123. addDisabled: false,
  1124. form: {
  1125. sn: null,
  1126. brand: null,
  1127. supplyChannel: null,
  1128. name: null,
  1129. type: null,
  1130. organIdList: [],
  1131. goodsCategoryId: null,
  1132. specification: null,
  1133. marketPrice: null,
  1134. discountPrice: null,
  1135. groupPurchasePrice: null,
  1136. clientShow: null,
  1137. educationalShow: null,
  1138. musicGroupShow: null,
  1139. courseViewType: [],
  1140. stockWarning: null,
  1141. image: null,
  1142. complementGoodsIdList: null,
  1143. goodsList: [
  1144. {
  1145. id: null,
  1146. },
  1147. ],
  1148. brief: null,
  1149. desc: null,
  1150. replacementShow: null,
  1151. studentShowOrganId: null,
  1152. educationShowOrganId: null,
  1153. courseFeeShowOrganId: null,
  1154. memberFeeShowOrganId: null,
  1155. replacementShowOrganId: null,
  1156. },
  1157. goodsTree: [], // 选择商品列表
  1158. rules: {
  1159. sn: [
  1160. {
  1161. required: true,
  1162. message: "请输入商品货号",
  1163. trigger: "blur",
  1164. },
  1165. ],
  1166. brand: [
  1167. {
  1168. required: true,
  1169. message: "请输入品牌",
  1170. trigger: "blur",
  1171. },
  1172. {
  1173. min: 2,
  1174. max: 30,
  1175. message: "长度在 2 到 30 个字符",
  1176. trigger: "blur",
  1177. },
  1178. ],
  1179. supplyChannel: [
  1180. {
  1181. required: true,
  1182. message: "请输入备查货号",
  1183. trigger: "blur",
  1184. },
  1185. ],
  1186. name: [
  1187. {
  1188. required: true,
  1189. message: "请输入商品名称",
  1190. trigger: "blur",
  1191. },
  1192. {
  1193. min: 2,
  1194. max: 30,
  1195. message: "长度在 2 到 30 个字符",
  1196. trigger: "blur",
  1197. },
  1198. ],
  1199. type: [
  1200. {
  1201. required: true,
  1202. message: "请选择商品分类",
  1203. trigger: "change",
  1204. },
  1205. ],
  1206. organIdList: [
  1207. {
  1208. required: true,
  1209. message: "请选择所属分部",
  1210. trigger: "change",
  1211. },
  1212. ],
  1213. goodsCategoryId: [
  1214. {
  1215. required: true,
  1216. message: "请选择商品类型",
  1217. trigger: "change",
  1218. },
  1219. ],
  1220. specification: [
  1221. {
  1222. required: true,
  1223. message: "请输入商品型号",
  1224. trigger: "blur",
  1225. },
  1226. {
  1227. min: 2,
  1228. max: 30,
  1229. message: "长度在 2 到 30 个字符",
  1230. trigger: "blur",
  1231. },
  1232. ],
  1233. marketPrice: [
  1234. {
  1235. required: true,
  1236. validator: validPrice,
  1237. trigger: "blur",
  1238. },
  1239. ],
  1240. discountPrice: [
  1241. {
  1242. required: true,
  1243. validator: validPrice,
  1244. trigger: "blur",
  1245. },
  1246. ],
  1247. groupPurchasePrice: [
  1248. {
  1249. required: true,
  1250. validator: validPrice,
  1251. trigger: "blur",
  1252. },
  1253. ],
  1254. clientShow: [
  1255. {
  1256. required: true,
  1257. message: "请选择学员是否展示",
  1258. trigger: "change",
  1259. },
  1260. ],
  1261. educationalShow: [
  1262. {
  1263. required: true,
  1264. message: "请选择教务端是否展示",
  1265. trigger: "change",
  1266. },
  1267. ],
  1268. musicGroupShow: [
  1269. {
  1270. required: true,
  1271. message: "请选择乐团是否展示",
  1272. trigger: "change",
  1273. },
  1274. ],
  1275. courseViewType: [
  1276. { required: true, message: "请选乐团收费模式", trigger: "change" },
  1277. ],
  1278. replacementShow: [
  1279. {
  1280. required: true,
  1281. message: "请选择是否参与置换",
  1282. trigger: "change",
  1283. },
  1284. ],
  1285. stockWarning: [
  1286. {
  1287. required: true,
  1288. message: "请选择是否库存预警",
  1289. trigger: "change",
  1290. },
  1291. ],
  1292. image: [
  1293. {
  1294. required: true,
  1295. message: "请选择图片",
  1296. trigger: "blur",
  1297. },
  1298. ],
  1299. brief: [
  1300. {
  1301. required: true,
  1302. message: "请输入商品描述",
  1303. trigger: "blur",
  1304. },
  1305. ],
  1306. desc: [
  1307. {
  1308. required: true,
  1309. message: "请输入商品详情",
  1310. trigger: "blur",
  1311. },
  1312. ],
  1313. },
  1314. selectGoodsList: [],
  1315. tenantId:'',
  1316. cropperOptions: {
  1317. autoCrop: true, //是否默认生成截图框
  1318. autoCropWidth: 300, //默认生成截图框宽度
  1319. autoCropHeight: 300, //默认生成截图框高度
  1320. fixedBox: true, //是否固定截图框大小 不允许改变
  1321. previewsCircle: false, //预览图是否是圆形
  1322. title: '商品图片', //模态框上显示的标题
  1323. },
  1324. };
  1325. },
  1326. async mounted() {
  1327. // 获取分部
  1328. this.tenantId = this.$helpers.tenantId
  1329. await this.$store.dispatch("setBranchs");
  1330. this.init();
  1331. },
  1332. methods: {
  1333. permission(str) {
  1334. return permission(str);
  1335. },
  1336. init() {
  1337. this.getList();
  1338. this.getCategory();
  1339. },
  1340. getCategory() {
  1341. let params = {
  1342. delFlag: 0,
  1343. rows: 9999,
  1344. };
  1345. categoryListTree(params).then((res) => {
  1346. let result = res.data;
  1347. if (res.code == 200) {
  1348. let tempArray = [];
  1349. result.rows.forEach((row) => {
  1350. tempArray.push({
  1351. label: row.name,
  1352. value: row.id,
  1353. });
  1354. });
  1355. this.categoryList = tempArray;
  1356. }
  1357. });
  1358. },
  1359. cropSuccess(data) {
  1360. this.form.image = data.data.url;
  1361. },
  1362. async onUpdate(row, type) {
  1363. let title = type == 1 ? "你是否下架该商品?" : "你是否上架该商品?";
  1364. this.$confirm(title, "提示", {
  1365. confirmButtonText: "确定",
  1366. cancelButtonText: "取消",
  1367. type: "warning",
  1368. })
  1369. .then(async () => {
  1370. await updateGoodsStatus({
  1371. goodsId: row.id,
  1372. status: row.status ? 0 : 1,
  1373. }).then((res) => {
  1374. this.messageTips(row.status ? "下架" : "上架", res);
  1375. });
  1376. })
  1377. .catch(() => {});
  1378. },
  1379. onPurchaseList(row) {
  1380. this.$router.push({
  1381. path: "/shopManager/purchaseLlist",
  1382. query: {
  1383. name: row.name,
  1384. goodsId: row.id,
  1385. },
  1386. });
  1387. },
  1388. onDelete(row) {
  1389. this.$confirm("您确定删除该商品吗?", "提示", {
  1390. confirmButtonText: "确定",
  1391. cancelButtonText: "取消",
  1392. type: "warning",
  1393. })
  1394. .then(() => {
  1395. goodsDelete(row.id).then((res) => {
  1396. this.messageTips("删除", res);
  1397. });
  1398. })
  1399. .catch(() => {});
  1400. },
  1401. searchOrderDate(value) {
  1402. if (value) {
  1403. this.searchForm.startTime = value[0];
  1404. this.searchForm.endTime = value[1];
  1405. } else {
  1406. this.searchForm.startTime = null;
  1407. this.searchForm.endTime = null;
  1408. }
  1409. },
  1410. messageTips(title, res) {
  1411. if (res.code == 200) {
  1412. this.$message.success(title + "成功");
  1413. this.typeStatus = false;
  1414. this.getList();
  1415. } else {
  1416. this.$message.error(res.msg);
  1417. }
  1418. },
  1419. getList() {
  1420. let params = Object.assign({}, this.searchForm);
  1421. params.organId = this.organId;
  1422. params.rows = this.pageInfo.limit;
  1423. params.page = this.pageInfo.page;
  1424. goodsQuery(params).then((res) => {
  1425. if (res.code == 200 && res.data) {
  1426. this.tableList = res.data.rows;
  1427. this.pageInfo.total = res.data.total;
  1428. }
  1429. });
  1430. },
  1431. getAllGoodsList(organId) {
  1432. // 获取所有商品
  1433. goodsQuery({
  1434. rows: 9999,
  1435. page: 1,
  1436. groupGoods: 0,
  1437. organId,
  1438. status: 1,
  1439. }).then((res) => {
  1440. if (res.code == 200 && res.data) {
  1441. this.selectGoodsList = res.data.rows;
  1442. }
  1443. });
  1444. },
  1445. onSearch() {
  1446. this.pageInfo.page = 1;
  1447. this.getList();
  1448. },
  1449. onReset() {
  1450. // 重置
  1451. this.$refs.searchForm.resetFields();
  1452. this.getList();
  1453. },
  1454. onShopComAdd() {
  1455. this.form = {
  1456. sn: null,
  1457. brand: null,
  1458. supplyChannel: null,
  1459. name: null,
  1460. type: null,
  1461. goodsCategoryId: null,
  1462. specification: null,
  1463. marketPrice: null,
  1464. discountPrice: null,
  1465. groupPurchasePrice: null,
  1466. clientShow: null,
  1467. educationalShow: null,
  1468. musicGroupShow: null,
  1469. organIdList: [],
  1470. courseViewType: [],
  1471. stockWarning: null,
  1472. image: null,
  1473. complementGoodsIdList: null,
  1474. goodsList: [
  1475. {
  1476. id: null,
  1477. },
  1478. ],
  1479. brief: null,
  1480. desc: null,
  1481. replacementShow: null,
  1482. };
  1483. this.onValidGoodsStatus();
  1484. this.routeShopStatus = true;
  1485. this.addType = "create";
  1486. this.addDisabled = false;
  1487. this.$nextTick((res) => {
  1488. if (this.$refs["ruleForm"]) {
  1489. this.$refs["ruleForm"].resetFields();
  1490. }
  1491. });
  1492. },
  1493. onOrganChange(val) {
  1494. if (val && val.length > 0) {
  1495. // 获取所有商品
  1496. this.getAllGoodsList(val.join(","));
  1497. }
  1498. },
  1499. async onValidGoodsStatus() {
  1500. // 更新商品选择状态
  1501. await this.getAllGoodsList();
  1502. console.log(this.form.goodsList);
  1503. let goodsList = this.form.goodsList;
  1504. let tempIds = [];
  1505. goodsList.forEach((item) => {
  1506. tempIds.push(item.id);
  1507. });
  1508. this.selectGoodsList.forEach((item) => {
  1509. item.disabled = false;
  1510. if (tempIds.includes(item.id)) {
  1511. item.disabled = true;
  1512. }
  1513. });
  1514. },
  1515. onShopOperation(type, row) {
  1516. // 添加或修改
  1517. let params = {
  1518. type: type,
  1519. };
  1520. if (row) {
  1521. params.id = row.id;
  1522. }
  1523. let paramInfo = JSON.stringify(params);
  1524. this.addType = type;
  1525. this.addDisabled = type == "look" ? true : false;
  1526. // 判断是否是修改组合商品
  1527. if (
  1528. (type == "update" || type == "look" || type == "copy") &&
  1529. row.complementGoodsIdList
  1530. ) {
  1531. this.routeShopStatus = true;
  1532. let form = this.form;
  1533. for (let i in form) {
  1534. form[i] = row[i];
  1535. }
  1536. let ids = row.complementGoodsIdList.split(",");
  1537. let goodsList = [];
  1538. ids.forEach((item) => {
  1539. goodsList.push({
  1540. id: Number(item),
  1541. });
  1542. });
  1543. form.goodsList = goodsList;
  1544. form.id = row.id;
  1545. if (row.courseViewType) {
  1546. form.courseViewType = row.courseViewType.split(",");
  1547. }
  1548. if (row.studentShowOrganId) {
  1549. form.studentShowOrganId = row.studentShowOrganId.split(",");
  1550. }
  1551. if (row.educationShowOrganId) {
  1552. form.educationShowOrganId = row.educationShowOrganId.split(",");
  1553. }
  1554. if (row.courseFeeShowOrganId) {
  1555. form.courseFeeShowOrganId = row.courseFeeShowOrganId.split(",");
  1556. }
  1557. if (row.memberFeeShowOrganId) {
  1558. form.memberFeeShowOrganId = row.memberFeeShowOrganId.split(",");
  1559. }
  1560. if (row.replacementShowOrganId) {
  1561. form.replacementShowOrganId = row.replacementShowOrganId.split(",");
  1562. }
  1563. // if (row.organIdList) {
  1564. // form.organIdList = row.organIdList.split(",");
  1565. // }
  1566. this.getAllGoodsList();
  1567. this.onValidGoodsStatus();
  1568. } else {
  1569. let pageTitle = "添加";
  1570. if (type == "update") {
  1571. pageTitle = "修改";
  1572. } else if (type == "look") {
  1573. pageTitle = "查看";
  1574. } else if (type == "copy") {
  1575. pageTitle = "复制";
  1576. }
  1577. this.$router.push(
  1578. {
  1579. path: "/shopManager/shopOperation",
  1580. query: {
  1581. paramInfo,
  1582. },
  1583. },
  1584. (route) => {
  1585. route.meta.title = pageTitle + "商品";
  1586. }
  1587. );
  1588. }
  1589. },
  1590. beforeUpload(file) {
  1591. // console.log(file.type)
  1592. // const isJPG = file.type === '.xlsx' || file.type === '.xls';
  1593. // // const isLt2M = file.size / 1024 / 1024 < 2;
  1594. // if (!isJPG) {
  1595. // this.$message.error('上传头像图片只能是 JPG 格式!');
  1596. // }
  1597. // return isJPG;
  1598. // this.goodsLoading = true
  1599. load.startLoading();
  1600. },
  1601. handleSuccess(response, file, fileList) {
  1602. // 导入商品
  1603. // 报表导出
  1604. load.endLoading();
  1605. if (response.code == 200) {
  1606. this.$message.success("导入成功");
  1607. this.getList();
  1608. } else {
  1609. this.$message.error(response.msg);
  1610. }
  1611. },
  1612. handleError(err, file, fileList) {
  1613. load.endLoading();
  1614. },
  1615. onDownload() {
  1616. // 下载模板
  1617. // // 报表导出
  1618. Export(this, {
  1619. url: "/api-web/import/downloadTemplate",
  1620. params: {
  1621. templateType: "GOODS",
  1622. },
  1623. fileName: "商品导入模板.xls",
  1624. });
  1625. },
  1626. exportShopList() {
  1627. Export(
  1628. this,
  1629. {
  1630. url: "/api-web/export/goods",
  1631. params: qs.stringify(cleanDeep(this.searchForm)),
  1632. fileName: "商品导出.xls",
  1633. method: "post",
  1634. },
  1635. "确定导出商品"
  1636. );
  1637. },
  1638. onFormClose(formName) {
  1639. // 关闭弹窗重置验证
  1640. this.$refs[formName].resetFields();
  1641. },
  1642. onGoodsChange() {
  1643. let selectGoodsList = this.selectGoodsList;
  1644. let goodsList = this.form.goodsList;
  1645. let tempIds = [];
  1646. goodsList.forEach((item) => {
  1647. if (item.id) {
  1648. tempIds.push(item.id);
  1649. }
  1650. });
  1651. selectGoodsList.forEach((item) => {
  1652. if (tempIds.includes(item.id)) {
  1653. item.disabled = true;
  1654. } else {
  1655. item.disabled = false;
  1656. }
  1657. });
  1658. this.calcPrice();
  1659. },
  1660. removeGoodsList(item) {
  1661. let tempId = item.id;
  1662. let selectGoodsList = this.selectGoodsList;
  1663. selectGoodsList.forEach((item) => {
  1664. if (item.id == tempId) {
  1665. item.disabled = false;
  1666. }
  1667. });
  1668. const index = this.form.goodsList.indexOf(item);
  1669. if (index !== -1) {
  1670. this.form.goodsList.splice(index, 1);
  1671. }
  1672. this.calcPrice();
  1673. },
  1674. addGoodsList() {
  1675. this.form.goodsList.push({
  1676. id: null,
  1677. });
  1678. },
  1679. onShopSubmit(formName) {
  1680. this.$refs[formName].validate((valid) => {
  1681. if (valid) {
  1682. let form = Object.assign({}, this.form);
  1683. let tempIds = [];
  1684. form.goodsList.forEach((item) => {
  1685. if (item.id) {
  1686. tempIds.push(item.id);
  1687. }
  1688. });
  1689. form.complementGoodsIdList = tempIds.join(",");
  1690. // form.courseViewType = form.courseViewType.join(",");
  1691. // form.organIdList = form.courseViewType.join(",");
  1692. if (form.studentShowOrganId) {
  1693. form.studentShowOrganId = form.studentShowOrganId.join(",");
  1694. }
  1695. if (form.educationShowOrganId) {
  1696. form.educationShowOrganId = form.educationShowOrganId.join(",");
  1697. }
  1698. if (form.courseFeeShowOrganId) {
  1699. form.courseFeeShowOrganId = form.courseFeeShowOrganId.join(",");
  1700. }
  1701. if (form.memberFeeShowOrganId) {
  1702. form.memberFeeShowOrganId = form.memberFeeShowOrganId.join(",");
  1703. }
  1704. if (form.replacementShowOrganId) {
  1705. form.replacementShowOrganId = form.replacementShowOrganId.join(",");
  1706. }
  1707. if(!form.studentShowOrganId&&!form.educationShowOrganId&&!form.courseFeeShowOrganId&&!form.courseFeeShowOrganId&&!form.replacementShowOrganId){
  1708. this.$message.error('请至少选择一个可见分部')
  1709. return
  1710. }
  1711. form.goodsList = null;
  1712. if (this.addType == "create" || this.addType == "copy") {
  1713. if (this.form.id) {
  1714. // 判断有没有Id,如果有则删除
  1715. delete this.form.id;
  1716. }
  1717. form.status = "NO"; // 默认上架
  1718. goodsAdd(cleanDeep(form)).then((res) => {
  1719. this.messageTips("保存", res);
  1720. });
  1721. } else if (this.addType == "update") {
  1722. goodsUpdate(cleanDeep(form)).then((res) => {
  1723. this.messageTips("保存", res);
  1724. });
  1725. }
  1726. } else {
  1727. this.$nextTick(() => {
  1728. let isError = document.getElementsByClassName("is-error");
  1729. isError[0].scrollIntoView({
  1730. block: "center",
  1731. behavior: "smooth",
  1732. });
  1733. });
  1734. return false;
  1735. }
  1736. });
  1737. },
  1738. messageTips(title, res) {
  1739. if (res.code == 200) {
  1740. this.$message.success(title + "成功");
  1741. this.getList();
  1742. this.routeShopStatus = false;
  1743. } else {
  1744. this.$message.error(res.msg);
  1745. }
  1746. },
  1747. calcPrice() {
  1748. let selectGoodsList = this.selectGoodsList;
  1749. let form = this.form;
  1750. let goodsList = form.goodsList;
  1751. let tempIds = [];
  1752. goodsList.forEach((item) => {
  1753. if (item.id) {
  1754. tempIds.push(item.id);
  1755. }
  1756. });
  1757. let groupPurchasePrice = 0,
  1758. marketPrice = 0,
  1759. discountPrice = 0;
  1760. selectGoodsList.forEach((item) => {
  1761. if (tempIds.includes(item.id)) {
  1762. groupPurchasePrice += item.groupPurchasePrice;
  1763. marketPrice += item.marketPrice;
  1764. discountPrice += item.discountPrice;
  1765. }
  1766. });
  1767. form.groupPurchasePrice = Number(groupPurchasePrice.toFixed(2));
  1768. form.discountPrice = Number(discountPrice.toFixed(2));
  1769. form.marketPrice = Number(marketPrice.toFixed(2));
  1770. },
  1771. },
  1772. filters: {
  1773. courseViewTypeFormat(value) {
  1774. let template = ["课程收费", "AMR收费", "会员收费"];
  1775. if (!value) {
  1776. return "";
  1777. }
  1778. let ids = value.split(",");
  1779. let str = [];
  1780. ids.forEach((item) => {
  1781. str.push(template[item]);
  1782. });
  1783. return str.join(",");
  1784. },
  1785. },
  1786. };
  1787. </script>
  1788. <style lang="scss" scoped>
  1789. .alert {
  1790. margin-bottom: 22px;
  1791. }
  1792. .shopImage {
  1793. width: 60px;
  1794. height: 60px;
  1795. }
  1796. .shopDesc {
  1797. max-height: 70px;
  1798. overflow: hidden;
  1799. }
  1800. .el-select__tags .el-tag.el-tag--info.el-tag--small.el-tag--light {
  1801. max-width: 95px;
  1802. }
  1803. .hiddenStart {
  1804. /deep/.el-form-item__label:before {
  1805. content: "" !important;
  1806. position: absolute;
  1807. color: transparent;
  1808. margin-right: 4px;
  1809. }
  1810. }
  1811. </style>