index.vue 42 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279
  1. <template>
  2. <div class="app-container">
  3. <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="100px">
  4. <el-form-item label="订单类型" prop="orderTypeFilter">
  5. <el-select v-model="queryParams.orderTypeFilter" placeholder="请选择订单类型" clearable size="small">
  6. <el-option label="全部" :value="null" />
  7. <el-option label="销售订单" :value="1" />
  8. <el-option label="直播订单" :value="3" />
  9. </el-select>
  10. </el-form-item>
  11. <el-form-item label="销售名称" prop="salesName">
  12. <el-input
  13. v-model="queryParams.salesName"
  14. placeholder="请输入销售名称"
  15. clearable
  16. size="small"
  17. @keyup.enter.native="handleQuery"
  18. />
  19. </el-form-item>
  20. <el-form-item label="订单号" prop="orderCodes">
  21. <div class="tag-input-container">
  22. <div class="tags-wrapper" @click="focusInput">
  23. <el-tag
  24. v-for="(code, index) in queryParams.orderCodes"
  25. :key="index"
  26. closable
  27. size="small"
  28. @close="removeOrderCode(index)"
  29. class="order-tag"
  30. >
  31. {{ code }}
  32. </el-tag>
  33. <el-input
  34. ref="tagInput"
  35. v-model="currentInput"
  36. v-show="inputVisible || queryParams.orderCodes.length === 0"
  37. :placeholder="queryParams.orderCodes.length === 0 ? '请输入订单号,按回车或逗号分隔' : '继续输入...'"
  38. size="small"
  39. class="tag-input"
  40. @keydown.native="handleKeyDown"
  41. @keyup.native="handleKeyUp"
  42. @blur="handleInputConfirm"
  43. @focus="inputVisible = true"
  44. clearable
  45. />
  46. <el-button
  47. v-if="!inputVisible && queryParams.orderCodes.length > 0"
  48. class="button-new-tag"
  49. size="small"
  50. @click="showInput"
  51. icon="el-icon-plus"
  52. type="text"
  53. >
  54. 添加订单号
  55. </el-button>
  56. </div>
  57. <div class="input-tips">
  58. <span class="tip-text">
  59. 支持:回车、逗号、空格分隔 |
  60. 已添加 {{ queryParams.orderCodes.length }} 个订单号
  61. </span>
  62. </div>
  63. </div>
  64. </el-form-item>
  65. <el-form-item label="运单号" prop="deliveryId">
  66. <el-input
  67. v-model="queryParams.deliveryId"
  68. placeholder="请输入运单号"
  69. clearable
  70. size="small"
  71. @keyup.enter.native="handleQuery"
  72. />
  73. </el-form-item>
  74. <el-form-item label="银行交易流水号" prop="bankTransactionId">
  75. <el-input
  76. v-model="queryParams.bankTransactionId"
  77. placeholder="请输入银行交易流水号"
  78. clearable
  79. size="small"
  80. @keyup.enter.native="handleQuery"
  81. />
  82. </el-form-item>
  83. <el-form-item label="产品名称" prop="productName">
  84. <el-input
  85. v-model="queryParams.productName"
  86. placeholder="请输入产品名称"
  87. clearable
  88. size="small"
  89. @keyup.enter.native="handleQuery"
  90. />
  91. </el-form-item>
  92. <el-form-item label="手机号" prop="userPhone">
  93. <el-input
  94. v-model="queryParams.userPhone"
  95. placeholder="请输入手机号"
  96. clearable
  97. size="small"
  98. @keyup.enter.native="handleQuery"
  99. />
  100. </el-form-item>
  101. <el-form-item label="收件人" prop="realName">
  102. <el-input
  103. v-model="queryParams.realName"
  104. placeholder="请输入收件人姓名"
  105. clearable
  106. size="small"
  107. @keyup.enter.native="handleQuery"
  108. />
  109. </el-form-item>
  110. <el-form-item label="支付方式" prop="payType">
  111. <el-select v-model="queryParams.payType" placeholder="请选择支付方式" clearable size="small">
  112. <el-option
  113. v-for="item in payTypeOptions"
  114. :key="item.dictValue"
  115. :label="item.dictLabel"
  116. :value="item.dictValue"
  117. />
  118. </el-select>
  119. </el-form-item>
  120. <!-- <el-form-item label="上传凭证" prop="isUpload">-->
  121. <!-- <el-select v-model="queryParams.isUpload" placeholder="请选择" clearable size="small">-->
  122. <!-- <el-option key="0" label="未上传" value="0" />-->
  123. <!-- <el-option key="1" label="已上传" value="1" />-->
  124. <!-- </el-select>-->
  125. <!-- </el-form-item>-->
  126. <!-- <el-form-item label="物流状态" prop="deliveryStatus">-->
  127. <!-- <el-select v-model="queryParams.deliveryStatus" placeholder="请选择物流状态" clearable size="small">-->
  128. <!-- <el-option-->
  129. <!-- v-for="item in deliveryStatusOptions"-->
  130. <!-- :key="item.dictValue"-->
  131. <!-- :label="item.dictLabel"-->
  132. <!-- :value="item.dictValue"-->
  133. <!-- />-->
  134. <!-- </el-select>-->
  135. <!-- </el-form-item>-->
  136. <!-- <el-form-item label="结算状态" prop="deliveryPayStatus">-->
  137. <!-- <el-select v-model="queryParams.deliveryPayStatus" placeholder="请选择物流结算状态" clearable size="small">-->
  138. <!-- <el-option-->
  139. <!-- v-for="item in deliveryPayStatusOptions"-->
  140. <!-- :key="item.dictValue"-->
  141. <!-- :label="item.dictLabel"-->
  142. <!-- :value="item.dictValue"-->
  143. <!-- />-->
  144. <!-- </el-select>-->
  145. <!-- </el-form-item>-->
  146. <!-- <el-form-item label="小程序" prop="appId">-->
  147. <!-- <el-select v-model="queryParams.appId" placeholder="请选择所属小程序" clearable size="small">-->
  148. <!-- <el-option-->
  149. <!-- v-for="dict in appMallOptions"-->
  150. <!-- :key="dict.appid"-->
  151. <!-- :label="dict.name + '(' + dict.appid + ')'"-->
  152. <!-- :value="dict.appid"-->
  153. <!-- />-->
  154. <!-- </el-select>-->
  155. <!-- </el-form-item>-->
  156. <!-- <el-form-item label="商品规格" prop="productSpec">-->
  157. <!-- <el-input-->
  158. <!-- v-model="queryParams.productSpec"-->
  159. <!-- placeholder="请输入商品规格"-->
  160. <!-- clearable-->
  161. <!-- size="small"-->
  162. <!-- @keyup.enter.native="handleQuery"-->
  163. <!-- />-->
  164. <!-- </el-form-item>-->
  165. <!-- <el-form-item label="商品数量" prop="totalNum">-->
  166. <!-- <el-input-->
  167. <!-- v-model="queryParams.totalNum"-->
  168. <!-- placeholder="请输入商品数量"-->
  169. <!-- clearable-->
  170. <!-- size="small"-->
  171. <!-- @keyup.enter.native="handleQuery"-->
  172. <!-- />-->
  173. <!-- </el-form-item>-->
  174. <!-- <el-form-item label="销售价格" prop="price">-->
  175. <!-- <el-input-->
  176. <!-- v-model="queryParams.price"-->
  177. <!-- placeholder="请输入销售价格"-->
  178. <!-- clearable-->
  179. <!-- size="small"-->
  180. <!-- @keyup.enter.native="handleQuery"-->
  181. <!-- />-->
  182. <!-- </el-form-item>-->
  183. <el-form-item label="收货地址" prop="userAddress">
  184. <el-input
  185. v-model="queryParams.userAddress"
  186. placeholder="请输入收货地址"
  187. clearable
  188. size="small"
  189. @keyup.enter.native="handleQuery"
  190. />
  191. </el-form-item>
  192. <el-form-item label="商品ID" prop="productId">
  193. <el-input
  194. v-model="queryParams.productId"
  195. placeholder="请输入商品ID"
  196. clearable
  197. size="small"
  198. @keyup.enter.native="handleQuery"
  199. />
  200. </el-form-item>
  201. <!-- <el-form-item label="成本价格" prop="cost">-->
  202. <!-- <el-input-->
  203. <!-- v-model="queryParams.cost"-->
  204. <!-- placeholder="请输入成本价格"-->
  205. <!-- clearable-->
  206. <!-- size="small"-->
  207. <!-- @keyup.enter.native="handleQuery"-->
  208. <!-- />-->
  209. <!-- </el-form-item>-->
  210. <!-- <el-form-item label="供应商" prop="supplierName">-->
  211. <!-- <el-input-->
  212. <!-- v-model="queryParams.supplierName"-->
  213. <!-- placeholder="请输入供应商名称"-->
  214. <!-- clearable-->
  215. <!-- size="small"-->
  216. <!-- @keyup.enter.native="handleQuery"-->
  217. <!-- />-->
  218. <!-- </el-form-item>-->
  219. <!-- <el-form-item label="档期归属" prop="scheduleId">-->
  220. <!-- <el-select filterable style="width: 215px" v-model="queryParams.scheduleId" placeholder="请选择档期" clearable size="small">-->
  221. <!-- <el-option-->
  222. <!-- v-for="item in scheduleOptions"-->
  223. <!-- :key="item.id"-->
  224. <!-- :label="item.name"-->
  225. <!-- :value="item.id"-->
  226. <!-- />-->
  227. <!-- </el-select>-->
  228. <!-- </el-form-item>-->
  229. <el-form-item label="代服账户" prop="erpAccount" v-if="SFDFopen">
  230. <el-select v-model="queryParams.erpAccount" style="width: 215px" placeholder="ERP账户" clearable size="small">
  231. <el-option
  232. v-for="dict in erpAccountQueryList"
  233. :key="dict"
  234. :label="dict"
  235. :value="dict"
  236. />
  237. </el-select>
  238. </el-form-item>
  239. <el-form-item label="代服电话" prop="erpPhoneNumber" v-if="SFDFopen">
  240. <el-input
  241. v-model="queryParams.erpPhoneNumber"
  242. placeholder="ERP电话"
  243. clearable
  244. size="small"
  245. @keyup.enter.native="handleQuery"
  246. />
  247. </el-form-item>
  248. <el-form-item label="下单时间" prop="createTimeRange">
  249. <el-date-picker
  250. style="width:215px"
  251. clearable
  252. size="small"
  253. v-model="createTimeRange"
  254. type="datetimerange"
  255. value-format="yyyy-MM-dd HH:mm:ss"
  256. format="yyyy-MM-dd HH:mm:ss"
  257. range-separator="至"
  258. start-placeholder="开始日期"
  259. end-placeholder="结束日期"
  260. :default-time="['00:00:00', '23:59:59']"
  261. @change="handleOrderTimeChange"
  262. />
  263. </el-form-item>
  264. <el-form-item label="支付时间" prop="payTimeRange">
  265. <el-date-picker
  266. style="width: 215px"
  267. clearable
  268. size="small"
  269. v-model="payTimeRange"
  270. type="datetimerange"
  271. value-format="yyyy-MM-dd HH:mm:ss"
  272. format="yyyy-MM-dd HH:mm:ss"
  273. start-placeholder="开始日期"
  274. end-placeholder="结束日期"
  275. :default-time="['00:00:00', '23:59:59']"
  276. @change="handlePayTimeChange"
  277. />
  278. </el-form-item>
  279. <!-- <el-form-item label="发货时间" prop="deliverySendTimeRange">-->
  280. <!-- <el-date-picker-->
  281. <!-- style="width:215px"-->
  282. <!-- clearable-->
  283. <!-- size="small"-->
  284. <!-- v-model="deliverySendTimeRange"-->
  285. <!-- type="daterange"-->
  286. <!-- value-format="yyyy-MM-dd"-->
  287. <!-- start-placeholder="开始日期"-->
  288. <!-- end-placeholder="结束日期"-->
  289. <!-- />-->
  290. <!-- </el-form-item>-->
  291. <!-- <el-form-item label="回单时间" prop="deliveryImportTimeRange">-->
  292. <!-- <el-date-picker-->
  293. <!-- style="width:215px"-->
  294. <!-- clearable-->
  295. <!-- size="small"-->
  296. <!-- v-model="deliveryImportTimeRange"-->
  297. <!-- type="daterange"-->
  298. <!-- value-format="yyyy-MM-dd"-->
  299. <!-- start-placeholder="开始日期"-->
  300. <!-- end-placeholder="结束日期"-->
  301. <!-- />-->
  302. <!-- </el-form-item>-->
  303. <el-form-item>
  304. <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
  305. <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
  306. </el-form-item>
  307. </el-form>
  308. <el-row :gutter="10" class="mb8">
  309. <!-- <el-col :span="1.5">-->
  310. <!-- <el-button-->
  311. <!-- plain-->
  312. <!-- type="info"-->
  313. <!-- icon="el-icon-upload2"-->
  314. <!-- size="mini"-->
  315. <!-- @click="handleImport"-->
  316. <!-- >导入银行回单</el-button>-->
  317. <!-- </el-col>-->
  318. <el-col :span="1.5">
  319. <el-button
  320. type="warning"
  321. icon="el-icon-download"
  322. size="mini"
  323. :loading="exportLoading"
  324. @click="handleExport"
  325. v-hasPermi="['live:order:export']"
  326. >导出订单</el-button>
  327. </el-col>
  328. <!-- <el-col :span="1.5">-->
  329. <!-- <el-button-->
  330. <!-- type="warning"-->
  331. <!-- icon="el-icon-download"-->
  332. <!-- size="mini"-->
  333. <!-- @click="handleExportItems"-->
  334. <!-- >导出订单明细</el-button>-->
  335. <!-- </el-col>-->
  336. <!-- <el-col :span="1.5">-->
  337. <!-- <el-button-->
  338. <!-- type="warning"-->
  339. <!-- icon="el-icon-s-order"-->
  340. <!-- size="mini"-->
  341. <!-- @click="openDeliveryNote"-->
  342. <!-- >批量导入物流单号</el-button>-->
  343. <!-- </el-col>-->
  344. <el-col :span="1.5">
  345. <el-button
  346. type="warning"
  347. icon="el-icon-download"
  348. size="mini"
  349. @click="handleExportDetails"
  350. v-hasPermi="['live:order:exportAll']"
  351. >导出订单(明文)</el-button>
  352. </el-col>
  353. <!-- <el-col :span="1.5">-->
  354. <!-- <el-button-->
  355. <!-- type="warning"-->
  356. <!-- icon="el-icon-download"-->
  357. <!-- size="mini"-->
  358. <!-- @click="handleExportItemsDetails"-->
  359. <!-- >导出订单明细(明文)</el-button>-->
  360. <!-- </el-col>-->
  361. <el-col :span="1.5">
  362. <el-button
  363. icon="el-icon-tickets"
  364. size="mini"
  365. type="success"
  366. :loading="exportShippingLoading"
  367. @click="handleExportShippingOrder"
  368. >导出发货单</el-button>
  369. </el-col>
  370. <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
  371. </el-row>
  372. <el-tabs type="card" v-model="activeName" @tab-click="handleClick">
  373. <el-tab-pane label="全部订单" name="00"></el-tab-pane>
  374. <el-tab-pane label="待支付" name="0"></el-tab-pane>
  375. <el-tab-pane label="待发货" name="1"></el-tab-pane>
  376. <el-tab-pane label="待收货" name="2"></el-tab-pane>
  377. <el-tab-pane label="交易完成" name="3"></el-tab-pane>
  378. <el-tab-pane label="退款中" name="-1"></el-tab-pane>
  379. <el-tab-pane label="已退款" name="-2"></el-tab-pane>
  380. <el-tab-pane label="已取消" name="-3"></el-tab-pane>
  381. </el-tabs>
  382. <el-table
  383. ref="orderTable"
  384. border
  385. v-loading="loading"
  386. :data="orderList"
  387. @selection-change="handleSelectionChange"
  388. :default-sort="{prop: 'createTime', order: 'descending'}"
  389. >
  390. <el-table-column type="selection" width="55" align="center" />
  391. <el-table-column label="订单类型" align="center" prop="orderTypeName" width="100px">
  392. <template slot-scope="scope">
  393. <el-tag :type="getOrderTypeTagType(scope.row.orderType)">
  394. {{ scope.row.orderTypeName }}
  395. </el-tag>
  396. </template>
  397. </el-table-column>
  398. <el-table-column label="订单号" align="center" prop="orderCode" width="200px" />
  399. <el-table-column label="银行交易流水号" align="center" prop="bankTransactionId" width="200px" />
  400. <el-table-column label="所属公司" align="center" prop="companyName" />
  401. <el-table-column label="销售名称" align="center" prop="salesName" width="120px" />
  402. <el-table-column label="员工昵称" align="center" prop="companyUserNickName" width="120px" />
  403. <el-table-column label="用户昵称" align="center" prop="nickname" width="150px" />
  404. <el-table-column label="收件人" align="center" prop="realName" width="120px" />
  405. <el-table-column label="手机号" align="center" prop="userPhone" width="120px" />
  406. <el-table-column label="商品规格" align="center" prop="productSpec" width="120px" />
  407. <el-table-column label="商品数量" align="center" prop="totalNum" width="100px" />
  408. <el-table-column label="订单金额" align="center" prop="totalPrice" width="100px">
  409. <template slot-scope="scope">
  410. <span v-if="scope.row.totalPrice != null">{{ scope.row.totalPrice.toFixed(2) }}</span>
  411. </template>
  412. </el-table-column>
  413. <el-table-column label="应付金额" align="center" prop="payPrice" width="100px">
  414. <template slot-scope="scope">
  415. <span v-if="scope.row.payPrice != null">{{ scope.row.payPrice.toFixed(2) }}</span>
  416. </template>
  417. </el-table-column>
  418. <el-table-column label="实付金额" align="center" prop="payMoney" width="100px">
  419. <template slot-scope="scope">
  420. <span v-if="scope.row.payMoney != null">{{ scope.row.payMoney.toFixed(2) }}</span>
  421. </template>
  422. </el-table-column>
  423. <el-table-column label="下单时间" align="center" prop="createTime" width="180" />
  424. <el-table-column label="支付时间" align="center" prop="payTime" width="180" />
  425. <el-table-column label="支付方式" align="center" prop="payType" width="100px">
  426. <template slot-scope="scope">
  427. <el-tag v-for="(item, index) in payTypeOptions" :key="index" v-if="scope.row.payType == item.dictValue" size="mini">
  428. {{ item.dictLabel }}
  429. </el-tag>
  430. </template>
  431. </el-table-column>
  432. <el-table-column label="状态" align="center" prop="status" width="100px">
  433. <template slot-scope="scope">
  434. <el-tag v-for="(item, index) in statusOptions" :key="index" v-if="scope.row.status == item.dictValue" size="mini">
  435. {{ item.dictLabel }}
  436. </el-tag>
  437. </template>
  438. </el-table-column>
  439. <!-- <el-table-column label="物流状态" align="center" prop="deliveryStatus" width="100px">-->
  440. <!-- <template slot-scope="scope">-->
  441. <!-- <el-tag v-for="(item, index) in deliveryStatusOptions" :key="index" v-if="scope.row.deliveryStatus == item.dictValue" size="mini">-->
  442. <!-- {{ item.dictLabel }}-->
  443. <!-- </el-tag>-->
  444. <!-- </template>-->
  445. <!-- </el-table-column>-->
  446. <el-table-column label="运单号" align="center" prop="deliveryId" width="150px" />
  447. <el-table-column label="商品ID" align="center" prop="productId" width="120px" />
  448. <el-table-column label="商品名称" align="center" prop="productName" width="150px" />
  449. <el-table-column label="条码" align="center" prop="barCode" width="120px" />
  450. <el-table-column label="分类" align="center" prop="cateName" width="120px" />
  451. <el-table-column label="运费" align="center" prop="payDelivery" width="100px">
  452. <template slot-scope="scope">
  453. <span v-if="scope.row.payDelivery != null">{{ scope.row.payDelivery }}</span>
  454. </template>
  455. </el-table-column>
  456. <el-table-column label="成本价" align="center" prop="cost" width="100px">
  457. <template slot-scope="scope">
  458. <span v-if="scope.row.cost != null">{{ scope.row.cost }}</span>
  459. </template>
  460. </el-table-column>
  461. <el-table-column label="操作" fixed="right" width="80px" align="center">
  462. <template slot-scope="scope">
  463. <el-button
  464. size="mini"
  465. type="text"
  466. @click="handleDetails(scope.row)"
  467. >查看</el-button>
  468. </template>
  469. </el-table-column>
  470. </el-table>
  471. <pagination
  472. v-show="total > 0"
  473. :total="total"
  474. :page.sync="queryParams.pageNum"
  475. :limit.sync="queryParams.pageSize"
  476. @pagination="getList"
  477. />
  478. <!-- 订单详情侧边栏 -->
  479. <el-drawer
  480. :title="drawerTitle"
  481. :visible.sync="drawerVisible"
  482. direction="rtl"
  483. size="75%"
  484. :before-close="closeDrawer"
  485. >
  486. <div v-loading="drawerLoading" style="min-height: 200px;">
  487. <!-- 直播订单详情 -->
  488. <liveDetail
  489. v-if="currentOrderType === 3 && drawerVisible"
  490. ref="liveDetailRef"
  491. :order-id="currentOrderId"
  492. />
  493. <!-- 销售订单详情 -->
  494. <userDetail
  495. v-if="currentOrderType === 1 && drawerVisible"
  496. ref="userDetailRef"
  497. :order-id="currentOrderId"
  498. />
  499. <!-- 商城订单详情 -->
  500. <storeDetail
  501. v-if="currentOrderType === 2 && drawerVisible"
  502. ref="storeDetailRef"
  503. :order-id="currentOrderId"
  504. />
  505. </div>
  506. </el-drawer>
  507. <!-- 批量导入物流单号对话框 -->
  508. <el-dialog
  509. :before-close="cancelResetDeliveryNote"
  510. :visible.sync="deliveryNoteOpen"
  511. center
  512. title="批量发货"
  513. width="35%"
  514. >
  515. <el-form :model="ruleForm" :rules="rules" ref="ruleForm" label-width="100px" class="demo-ruleForm">
  516. <el-form-item label="小程序:" prop="miniAppId">
  517. <el-select
  518. v-model="ruleForm.miniAppId"
  519. clearable
  520. placeholder="请选择发货小程序"
  521. style="width: 100%"
  522. >
  523. <el-option
  524. v-for="item in miniAppList"
  525. :key="item.appId"
  526. :label="item.appName"
  527. :value="item.appId"
  528. />
  529. </el-select>
  530. </el-form-item>
  531. </el-form>
  532. <el-upload ref="upload" :action="uploadUrl" :auto-upload="false" :disabled="orderUpload.isUploading" :headers="orderUpload.headers"
  533. :limit="1" :on-progress="handleFileUploadProgress"
  534. :on-success="handleFileSuccess" accept=".xlsx, .xls" drag
  535. >
  536. <i class="el-icon-upload"></i>
  537. <div class="el-upload__text">
  538. 将文件拖到此处,或
  539. <em>点击上传</em>
  540. </div>
  541. <div slot="tip" class="el-upload__tip">
  542. <el-link style="font-size:12px" type="info" @click="importDeliveryNoteTemplate">下载模板</el-link>
  543. </div>
  544. <div slot="tip" class="el-upload__tip" style="color:red">提示:仅允许导入"xls"或"xlsx"格式文件!</div>
  545. </el-upload>
  546. <div slot="footer" class="dialog-footer">
  547. <el-button @click="cancelResetDeliveryNote">取 消</el-button>
  548. <el-button type="primary" @click="submitDeliveryNote('ruleForm')">确 定</el-button>
  549. </div>
  550. </el-dialog>
  551. <!-- 导入银行回单对话框 -->
  552. <el-dialog :title="upload.title" :visible.sync="upload.open" append-to-body width="400px">
  553. <el-upload ref="upload" :action="upload.url + '?updateSupport=' + upload.updateSupport" :auto-upload="false" :disabled="upload.isUploading"
  554. :headers="upload.headers" :limit="1"
  555. :on-progress="handleFileUploadProgress" :on-success="handleFileSuccess" accept=".xlsx, .xls" drag
  556. >
  557. <i class="el-icon-upload"></i>
  558. <div class="el-upload__text">
  559. 将文件拖到此处,或
  560. <em>点击上传</em>
  561. </div>
  562. <div slot="tip" class="el-upload__tip" style="color:red">提示:仅允许导入"xls"或"xlsx"格式文件!</div>
  563. </el-upload>
  564. <div slot="footer" class="dialog-footer">
  565. <el-button type="primary" @click="submitFileForm">确 定</el-button>
  566. <el-button @click="upload.open = false">取 消</el-button>
  567. </div>
  568. </el-dialog>
  569. </div>
  570. </template>
  571. <script>
  572. import { listMergedOrder, exportMergedOrder, exportMergedShipping, exportMergedOrderItems, exportMergedOrderDetails, exportMergedOrderItemsDetails, importDeliveryNoteExpressTemplate } from '@/api/live/mergedOrder'
  573. import { getCompanyList } from '@/api/company/company'
  574. import { treeselect } from '@/api/company/companyDept'
  575. import Treeselect from '@riophae/vue-treeselect'
  576. import '@riophae/vue-treeselect/dist/vue-treeselect.css'
  577. import liveDetail from './liveDetail.vue'
  578. import userDetail from './userDetail.vue'
  579. import storeDetail from './storeDetail.vue'
  580. import { getToken } from '@/utils/auth'
  581. import { getTcmScheduleList } from '@/api/company/schedule'
  582. import { list as getAppMallOptions } from '@/api/course/coursePlaySourceConfig'
  583. import { getErpAccount } from '@/api/hisStore/storeOrder'
  584. import { getConfigByKey } from '@/api/system/config'
  585. export default {
  586. name: 'MergedOrder',
  587. components: {Treeselect, liveDetail, userDetail, storeDetail },
  588. data() {
  589. return {
  590. // 遮罩层
  591. loading: true,
  592. // 选中数组
  593. ids: [],
  594. exportLoading: false,
  595. exportShippingLoading: false,
  596. // 非单个禁用
  597. single: true,
  598. // 非多个禁用
  599. multiple: true,
  600. // 显示搜索条件
  601. showSearch: true,
  602. // 总条数
  603. total: 0,
  604. // 订单表格数据
  605. orderList: [],
  606. // 公司列表
  607. companys: [],
  608. companyId: null,
  609. // 部门树选项
  610. deptOptions: [],
  611. // 字典
  612. payTypeOptions: [],
  613. deliveryStatusOptions: [],
  614. deliveryPayStatusOptions: [],
  615. statusOptions: [],
  616. orderTypeOptions: [],
  617. appMallOptions: [],
  618. scheduleOptions: [],
  619. erpAccountQueryList: [],
  620. SFDFopen: false,
  621. // 订单号标签输入相关
  622. maxOrderCodes: 50,
  623. inputVisible: false,
  624. currentInput: '',
  625. // 弹出层标题
  626. title: '',
  627. // 是否显示弹出层
  628. open: false,
  629. createTimeRange: [],
  630. payTimeRange: [],
  631. deliverySendTimeRange: [],
  632. deliveryImportTimeRange: [],
  633. activeName: '00',
  634. // 侧边栏相关
  635. drawerVisible: false,
  636. drawerTitle: '订单详情',
  637. currentOrderType: null,
  638. currentOrderId: null,
  639. drawerLoading: false,
  640. // 上传相关
  641. upload: {
  642. open: false,
  643. title: '',
  644. isUploading: false,
  645. updateSupport: 0,
  646. headers: { Authorization: 'Bearer ' + getToken() },
  647. url: process.env.VUE_APP_BASE_API + '/order/importExpress'
  648. },
  649. orderUpload: {
  650. open: false,
  651. title: '',
  652. isUploading: false,
  653. updateSupport: 0,
  654. headers: { Authorization: 'Bearer ' + getToken() }
  655. },
  656. deliveryNoteOpen: false,
  657. miniAppList: [],
  658. ruleForm: {
  659. miniAppId: null
  660. },
  661. rules: {
  662. miniAppId: [
  663. { required: true, message: '发货小程序不能为空' }
  664. ]
  665. },
  666. // 查询参数
  667. queryParams: {
  668. pageNum: 1,
  669. pageSize: 10,
  670. companyId: null,
  671. deptId: null,
  672. orderTypeFilter: 1,
  673. salesName: null,
  674. orderCodes: [],
  675. orderCode: null,
  676. orderCodeList: null,
  677. deliveryId: null,
  678. userPhone: null,
  679. realName: null,
  680. productName: null,
  681. bankTransactionId: null,
  682. productSpec: null,
  683. productId: null,
  684. totalNum: null,
  685. price: null,
  686. userAddress: null,
  687. cost: null,
  688. supplierName: null,
  689. companyUserNickName: null,
  690. orderType: null,
  691. isUpload: null,
  692. payType: null,
  693. deliveryStatus: null,
  694. deliveryPayStatus: null,
  695. appId: null,
  696. scheduleId: null,
  697. erpAccount: null,
  698. erpPhoneNumber: null,
  699. status: null,
  700. createTimeStart: null,
  701. createTimeEnd: null,
  702. createTimeRange: null,
  703. payTimeRange: null,
  704. deliverySendTimeRange: null,
  705. deliveryImportTimeRange: null
  706. }
  707. }
  708. },
  709. created() {
  710. // 初始化公司列表
  711. getCompanyList().then(response => {
  712. this.companys = response.data || []
  713. if (this.companys != null && this.companys.length > 0) {
  714. this.companyId = this.companys[0].companyId
  715. this.getTreeselect()
  716. }
  717. }).catch(error => {
  718. console.error('获取公司列表失败:', error)
  719. this.companys = []
  720. })
  721. // 初始化支付方式字典
  722. this.getDicts('store_pay_type').then((response) => {
  723. this.payTypeOptions = response.data || []
  724. }).catch(error => {
  725. console.error('获取支付方式字典失败:', error)
  726. this.payTypeOptions = []
  727. })
  728. // 初始化订单状态字典
  729. this.getDicts('store_order_status').then((response) => {
  730. this.statusOptions = response.data || []
  731. }).catch(error => {
  732. console.error('获取订单状态字典失败:', error)
  733. this.statusOptions = []
  734. })
  735. // 初始化物流状态字典
  736. this.getDicts('store_order_delivery_status').then((response) => {
  737. this.deliveryStatusOptions = response.data || []
  738. }).catch(error => {
  739. console.error('获取物流状态字典失败:', error)
  740. this.deliveryStatusOptions = []
  741. })
  742. // 初始化物流结算状态字典
  743. this.getDicts('store_delivery_pay_status').then((response) => {
  744. this.deliveryPayStatusOptions = response.data || []
  745. }).catch(error => {
  746. console.error('获取物流结算状态字典失败:', error)
  747. this.deliveryPayStatusOptions = []
  748. })
  749. // // 初始化订单类型字典
  750. // this.getDicts('store_order_type').then((response) => {
  751. // this.orderTypeOptions = response.data || []
  752. // }).catch(error => {
  753. // console.error('获取订单类型字典失败:', error)
  754. // this.orderTypeOptions = []
  755. // })
  756. // 初始化档期归属列表
  757. // getTcmScheduleList().then(response => {
  758. // this.scheduleOptions = response.data || []
  759. // }).catch(error => {
  760. // console.error('获取档期归属列表失败:', error)
  761. // this.scheduleOptions = []
  762. // })
  763. // 初始化小程序列表
  764. // this.getAppMallOptions()
  765. // 初始化ERP账户列表
  766. //this.getErpAccountList()
  767. // 加载订单列表
  768. this.getList()
  769. },
  770. computed: {
  771. uploadUrl() {
  772. return process.env.VUE_APP_BASE_API +
  773. '/order/importDeliveryNoteExpress?miniAppId=' +
  774. this.ruleForm.miniAppId
  775. }
  776. },
  777. methods: {
  778. /** 查询订单列表 */
  779. getList() {
  780. this.loading = true
  781. if (this.queryParams.status == '00') {
  782. this.queryParams.status = null
  783. }
  784. // 处理订单号数组
  785. if (this.queryParams.orderCodes && this.queryParams.orderCodes.length > 0) {
  786. this.queryParams.orderCodeList = this.queryParams.orderCodes.join(',')
  787. } else {
  788. this.queryParams.orderCodeList = null
  789. }
  790. // 处理时间范围
  791. if (this.createTimeRange != null && this.createTimeRange.length === 2) {
  792. this.queryParams.createTimeRange = this.createTimeRange[0] + '--' + this.createTimeRange[1]
  793. } else {
  794. this.queryParams.createTimeRange = null
  795. }
  796. if (this.payTimeRange != null && this.payTimeRange.length === 2) {
  797. this.queryParams.payTimeRange = this.payTimeRange[0] + '--' + this.payTimeRange[1]
  798. } else {
  799. this.queryParams.payTimeRange = null
  800. }
  801. if (this.deliverySendTimeRange != null && this.deliverySendTimeRange.length === 2) {
  802. this.queryParams.deliverySendTimeRange = this.deliverySendTimeRange[0] + '--' + this.deliverySendTimeRange[1]
  803. } else {
  804. this.queryParams.deliverySendTimeRange = null
  805. }
  806. if (this.deliveryImportTimeRange != null && this.deliveryImportTimeRange.length === 2) {
  807. this.queryParams.deliveryImportTimeRange = this.deliveryImportTimeRange[0] + '--' + this.deliveryImportTimeRange[1]
  808. } else {
  809. this.queryParams.deliveryImportTimeRange = null
  810. }
  811. listMergedOrder(this.queryParams).then(response => {
  812. this.orderList = response.rows
  813. this.total = response.total
  814. this.loading = false
  815. if (response.msg == 'knt') {
  816. this.SFDFopen = true
  817. } else {
  818. this.SFDFopen = false
  819. }
  820. }).catch(error => {
  821. console.error('查询失败:', error)
  822. this.loading = false
  823. this.$message.error('查询数据失败')
  824. })
  825. },
  826. /** 搜索按钮操作 */
  827. handleQuery() {
  828. this.queryParams.pageNum = 1
  829. this.getList()
  830. },
  831. /** 重置按钮操作 */
  832. resetQuery() {
  833. this.createTimeRange = []
  834. this.payTimeRange = []
  835. this.deliverySendTimeRange = []
  836. this.deliveryImportTimeRange = []
  837. this.queryParams.orderCodes = []
  838. this.currentInput = ''
  839. this.inputVisible = false
  840. this.resetForm('queryForm')
  841. this.handleQuery()
  842. },
  843. // 多选框选中数据
  844. handleSelectionChange(selection) {
  845. this.ids = selection.map(item => item.id || item.orderId)
  846. this.single = selection.length !== 1
  847. this.multiple = !selection.length
  848. },
  849. handleClick(tab, event) {
  850. this.activeName = tab.name
  851. this.queryParams.status = tab.name
  852. this.getList()
  853. },
  854. handleOrderTimeChange(value) {
  855. },
  856. handlePayTimeChange(value) {
  857. },
  858. /** 导出订单 */
  859. handleExport() {
  860. this.prepareExportParams()
  861. this.$confirm('是否确认导出所有订单数据项?', '警告', {
  862. confirmButtonText: '确定',
  863. cancelButtonText: '取消',
  864. type: 'warning'
  865. }).then(() => {
  866. this.exportLoading = true
  867. return exportMergedOrder(this.queryParams)
  868. }).then(response => {
  869. this.download(response.msg)
  870. this.exportLoading = false
  871. }).catch(() => {
  872. this.exportLoading = false
  873. })
  874. },
  875. /** 导出发货单 */
  876. handleExportShippingOrder() {
  877. this.prepareExportParams()
  878. this.$confirm('是否确认导出所有订单明细数据项?', '警告', {
  879. confirmButtonText: '确定',
  880. cancelButtonText: '取消',
  881. type: 'warning'
  882. }).then(() => {
  883. this.exportShippingLoading = true
  884. return exportMergedShipping(this.queryParams)
  885. }).then(response => {
  886. this.download(response.msg)
  887. this.exportShippingLoading = false
  888. }).catch(() => {
  889. this.exportShippingLoading = false
  890. })
  891. },
  892. handleDetails(row) {
  893. // 根据订单类型打开对应的侧边栏详情
  894. this.currentOrderType = row.orderType
  895. if (row.orderType === 1) {
  896. // 销售订单
  897. this.currentOrderId = row.id
  898. this.drawerTitle = '销售订单详情'
  899. } else if (row.orderType === 2) {
  900. // 商城订单
  901. this.currentOrderId = row.id
  902. this.drawerTitle = '商城订单详情'
  903. } else if (row.orderType === 3) {
  904. // 直播订单
  905. this.currentOrderId = row.orderId
  906. this.drawerTitle = '直播订单详情'
  907. }
  908. this.drawerVisible = true
  909. },
  910. closeDrawer() {
  911. this.drawerVisible = false
  912. this.currentOrderType = null
  913. this.currentOrderId = null
  914. },
  915. getOrderTypeTagType(orderType) {
  916. const typeMap = {
  917. 1: 'success', // 销售订单
  918. 2: 'warning', // 商城订单
  919. 3: 'info' // 直播订单
  920. }
  921. return typeMap[orderType] || ''
  922. },
  923. /** 查询部门下拉树结构 */
  924. getTreeselect() {
  925. var param = { companyId: this.companyId }
  926. treeselect(param).then((response) => {
  927. this.deptOptions = response.data
  928. })
  929. },
  930. companyChange(val) {
  931. this.companyId = val
  932. this.getTreeselect()
  933. },
  934. // 订单号标签输入相关方法
  935. handleKeyDown(event) {
  936. const { key, target } = event
  937. if (key === 'Backspace' && !target.value && this.queryParams.orderCodes.length > 0) {
  938. event.preventDefault()
  939. this.removeOrderCode(this.queryParams.orderCodes.length - 1)
  940. }
  941. if ([',', ',', ' ', 'Enter'].includes(key)) {
  942. event.preventDefault()
  943. this.handleInputConfirm()
  944. }
  945. },
  946. handleKeyUp(event) {
  947. const value = event.target.value
  948. if (/[,,\s]/.test(value)) {
  949. this.handleInputConfirm()
  950. }
  951. },
  952. handleInputConfirm() {
  953. const inputValue = this.currentInput.trim()
  954. if (inputValue) {
  955. const codes = inputValue.split(/[,,\s]+/).filter(code => code.trim())
  956. codes.forEach(code => {
  957. this.addOrderCode(code.trim())
  958. })
  959. }
  960. this.currentInput = ''
  961. },
  962. addOrderCode(code) {
  963. if (!code) return
  964. if (this.maxOrderCodes > 0 && this.queryParams.orderCodes.length >= this.maxOrderCodes) {
  965. this.$message.warning(`最多只能添加 ${this.maxOrderCodes} 个订单号`)
  966. return
  967. }
  968. if (this.queryParams.orderCodes.includes(code)) {
  969. this.$message.warning(`订单号 "${code}" 已存在`)
  970. return
  971. }
  972. this.queryParams.orderCodes.push(code)
  973. },
  974. removeOrderCode(index) {
  975. this.queryParams.orderCodes.splice(index, 1)
  976. },
  977. showInput() {
  978. this.inputVisible = true
  979. this.$nextTick(() => {
  980. if (this.$refs.tagInput) {
  981. this.$refs.tagInput.focus()
  982. }
  983. })
  984. },
  985. focusInput() {
  986. if (!this.inputVisible) {
  987. this.showInput()
  988. }
  989. },
  990. // 导出相关方法
  991. handleExportItems() {
  992. this.prepareExportParams()
  993. this.$confirm('是否确认导出所有订单明细数据项?', '警告', {
  994. confirmButtonText: '确定',
  995. cancelButtonText: '取消',
  996. type: 'warning'
  997. }).then(() => {
  998. return exportMergedOrderItems(this.queryParams)
  999. }).then(response => {
  1000. this.download(response.msg)
  1001. }).catch(() => {})
  1002. },
  1003. handleExportDetails() {
  1004. this.prepareExportParams()
  1005. this.$confirm('是否确认导出所有订单数据项(明文)?', '警告', {
  1006. confirmButtonText: '确定',
  1007. cancelButtonText: '取消',
  1008. type: 'warning'
  1009. }).then(() => {
  1010. return exportMergedOrderDetails(this.queryParams)
  1011. }).then(response => {
  1012. this.download(response.msg)
  1013. }).catch(() => {})
  1014. },
  1015. handleExportItemsDetails() {
  1016. this.prepareExportParams()
  1017. this.$confirm('是否确认导出所有订单明细数据项(明文)?', '警告', {
  1018. confirmButtonText: '确定',
  1019. cancelButtonText: '取消',
  1020. type: 'warning'
  1021. }).then(() => {
  1022. return exportMergedOrderItemsDetails(this.queryParams)
  1023. }).then(response => {
  1024. this.download(response.msg)
  1025. }).catch(() => {})
  1026. },
  1027. prepareExportParams() {
  1028. if (this.queryParams.status == '00') {
  1029. this.queryParams.status = null
  1030. }
  1031. if (this.createTimeRange != null && this.createTimeRange.length === 2) {
  1032. this.queryParams.createTimeRange = this.createTimeRange[0] + '--' + this.createTimeRange[1]
  1033. } else {
  1034. this.queryParams.createTimeRange = null
  1035. }
  1036. if (this.payTimeRange != null && this.payTimeRange.length === 2) {
  1037. this.queryParams.payTimeRange = this.payTimeRange[0] + '--' + this.payTimeRange[1]
  1038. } else {
  1039. this.queryParams.payTimeRange = null
  1040. }
  1041. if (this.deliverySendTimeRange != null && this.deliverySendTimeRange.length === 2) {
  1042. this.queryParams.deliverySendTimeRange = this.deliverySendTimeRange[0] + '--' + this.deliverySendTimeRange[1]
  1043. } else {
  1044. this.queryParams.deliverySendTimeRange = null
  1045. }
  1046. if (this.deliveryImportTimeRange != null && this.deliveryImportTimeRange.length === 2) {
  1047. this.queryParams.deliveryImportTimeRange = this.deliveryImportTimeRange[0] + '--' + this.deliveryImportTimeRange[1]
  1048. } else {
  1049. this.queryParams.deliveryImportTimeRange = null
  1050. }
  1051. if (this.queryParams.orderCodes && this.queryParams.orderCodes.length > 0) {
  1052. this.queryParams.orderCodeList = this.queryParams.orderCodes.join(',')
  1053. } else {
  1054. this.queryParams.orderCodeList = null
  1055. }
  1056. },
  1057. // 导入相关方法
  1058. handleImport() {
  1059. this.upload.title = '导入银行回单'
  1060. this.upload.open = true
  1061. },
  1062. submitFileForm() {
  1063. this.$refs.upload.submit()
  1064. },
  1065. handleFileUploadProgress(event, file, fileList) {
  1066. this.upload.isUploading = true
  1067. },
  1068. handleFileSuccess(response, file, fileList) {
  1069. this.upload.open = false
  1070. this.upload.isUploading = false
  1071. if (this.$refs.upload) {
  1072. this.$refs.upload.clearFiles()
  1073. }
  1074. this.$message.success('导入成功')
  1075. this.getList()
  1076. },
  1077. // 批量导入物流单号
  1078. openDeliveryNote() {
  1079. this.deliveryNoteOpen = true
  1080. this.getAppList()
  1081. },
  1082. getAppList() {
  1083. this.miniAppList = []
  1084. const key = 'courseMa.config'
  1085. getConfigByKey(key).then(response => {
  1086. const { code, data } = response
  1087. if (code === 200) {
  1088. let value = data?.configValue
  1089. if (value) {
  1090. try {
  1091. const appList = JSON.parse(value)
  1092. this.miniAppList = appList.filter(v => v.type === '1').map(v => {
  1093. return { appId: v.appid, appName: v.name }
  1094. })
  1095. } catch (parseError) {
  1096. console.error('解析小程序配置失败:', parseError)
  1097. this.miniAppList = []
  1098. }
  1099. }
  1100. }
  1101. }).catch(error => {
  1102. console.error('获取小程序配置失败:', error)
  1103. this.miniAppList = []
  1104. })
  1105. },
  1106. importDeliveryNoteTemplate() {
  1107. importDeliveryNoteExpressTemplate().then((response) => {
  1108. this.download(response.msg)
  1109. })
  1110. },
  1111. submitDeliveryNote(formName) {
  1112. this.$refs[formName].validate((valid) => {
  1113. if (valid) {
  1114. const uploadFiles = this.$refs.upload.uploadFiles
  1115. if (uploadFiles.length === 0) {
  1116. this.$message.error('请选择要上传的文件')
  1117. return
  1118. }
  1119. this.$refs.upload.submit()
  1120. } else {
  1121. return false
  1122. }
  1123. })
  1124. },
  1125. cancelResetDeliveryNote() {
  1126. this.deliveryNoteOpen = false
  1127. this.resetForm('ruleForm')
  1128. },
  1129. // 获取小程序选项列表
  1130. getAppMallOptions() {
  1131. getAppMallOptions({ pageNum: 1, pageSize: 100, isMall: 1 }).then(response => {
  1132. this.appMallOptions = response.rows || []
  1133. }).catch(error => {
  1134. console.error('获取小程序选项列表失败:', error)
  1135. this.appMallOptions = []
  1136. })
  1137. },
  1138. // 获取ERP账户列表
  1139. async getErpAccountList() {
  1140. try {
  1141. const response = await getErpAccount()
  1142. if (response.code === 200) {
  1143. const list = response.data || []
  1144. this.erpAccountQueryList = [...list, '未分拣']
  1145. } else {
  1146. this.erpAccountQueryList = []
  1147. }
  1148. } catch (error) {
  1149. console.error('获取ERP账户列表失败:', error)
  1150. this.erpAccountQueryList = []
  1151. }
  1152. }
  1153. }
  1154. }
  1155. </script>
  1156. <style scoped>
  1157. .tag-input-container {
  1158. min-width: 445px;
  1159. }
  1160. .tags-wrapper {
  1161. min-height: 32px;
  1162. padding: 4px 8px;
  1163. border: 1px solid #dcdfe6;
  1164. border-radius: 4px;
  1165. cursor: text;
  1166. display: flex;
  1167. flex-wrap: wrap;
  1168. align-items: center;
  1169. gap: 4px;
  1170. transition: border-color 0.2s;
  1171. }
  1172. .tags-wrapper:hover {
  1173. border-color: #c0c4cc;
  1174. }
  1175. .tags-wrapper:focus-within {
  1176. border-color: #409eff;
  1177. box-shadow: 0 0 0 2px rgba(64, 158, 255, 0.2);
  1178. }
  1179. .order-tag {
  1180. margin: 2px;
  1181. flex-shrink: 0;
  1182. }
  1183. .tag-input {
  1184. border: none;
  1185. outline: none;
  1186. flex: 1;
  1187. min-width: 120px;
  1188. }
  1189. .tag-input >>> .el-input__inner {
  1190. border: none;
  1191. padding: 0;
  1192. height: 24px;
  1193. line-height: 24px;
  1194. }
  1195. .button-new-tag {
  1196. height: 24px;
  1197. line-height: 22px;
  1198. padding: 0 8px;
  1199. margin: 2px;
  1200. }
  1201. .input-tips {
  1202. margin-top: 4px;
  1203. font-size: 12px;
  1204. color: #909399;
  1205. }
  1206. .tip-text {
  1207. display: flex;
  1208. align-items: center;
  1209. gap: 8px;
  1210. }
  1211. </style>