index.vue 43 KB

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