order.vue 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756
  1. <template>
  2. <view class="app-main app-content">
  3. <view style="position:fixed;top:100upx;background-color:white;z-index:999999;height:auto;font-size:33upx;color:#333333;width:100%;">
  4. <view style="width:80%;border:1upx solid #CCCCCC;margin:0 auto;padding:10upx 0 0 20upx;overflow: scroll;" v-if="showSearch">
  5. <block v-if="!$util.isEmpty(searchList)">
  6. <block v-for="(item, index) in searchList" :key="index">
  7. <view style="margin-bottom:30upx;" @click="getCustom(item)">
  8. <view style="font-size:37upx;margin-bottom:10upx;">{{item.name}}</view>
  9. <view style="font-size:29upx;color:#999999;">
  10. {{item.visitTime?item.visitTime.substr(5,11):''}}
  11. <text v-if="item.overTimeUnExpend && item.overTimeUnExpend == 10000" style="margin-left:20upx;color:green;">没有下过单</text>
  12. <text v-if="item.overTimeUnExpend && item.overTimeUnExpend == 7" style="margin-left:20upx;color:green;">超1周未下单</text>
  13. <text v-if="item.overTimeUnExpend && item.overTimeUnExpend == 30" style="margin-left:20upx;color:green;">超1个月未下单</text>
  14. <text v-if="item.overTimeUnExpend && item.overTimeUnExpend == 180" style="margin-left:20upx;color:green;">超半年未下单</text>
  15. <text v-if="item.overTimeUnExpend && item.overTimeUnExpend == 365" style="margin-left:20upx;color:green;">超1年未下单</text>
  16. </view>
  17. </view>
  18. </block>
  19. </block>
  20. </view>
  21. </view>
  22. <view class="input-wrap_box">
  23. <view class="select-dn_bx">
  24. <DateSelect class="bar" top="0" @selectDateFn="selectDateFn" defaultShowName='时间' />
  25. </view>
  26. <button class="admin-button-com middle" @click="changeSearchStyle()">{{searchStyle==0?'客户':'编号'}}</button>
  27. <view class="search-container">
  28. <AppSearchModule ref="searchRef" placeholder="填写" v-model="searchText" @input="searchFn"/>
  29. <view v-if="customId != 0" class="search-clear-overlay" @click.stop="clearFn">清空</view>
  30. </view>
  31. <button class="admin-button-com middle blue filter-btn" @click.stop="openFilterPanel">
  32. 筛选
  33. <text v-if="hasActiveFilters" class="filter-dot"></text>
  34. </button>
  35. </view>
  36. <app-tabs :tabs="tabs" class="app-tabs" :isFixed="false" :top="50" :currentTab="tabIndex" :height="100" @change="change" itemWidth="20%" />
  37. <view class="list-wrap">
  38. <block v-if="!$util.isEmpty(list.data)">
  39. <view class="list" v-for="(item, index) in list.data" :key="index" @click="$util.pageTo({ url: '/admin/order/detail', query: { id: item.id } })" >
  40. <view class="list-top flex-center-between" style="border-bottom:1upx solid #EEEEEE;">
  41. <view class="app-color-3" style="font-size:28upx;font-weight:bold;color:#333333;">{{ item.customName||'' }}<text v-if="item.bookName!=''" style="margin-left:30upx;color:#866b6b;font-weight: normal;">{{item.bookName}}</text></view>
  42. <view style="border:1upx solid red;border-radius:18upx;font-size:19upx;padding:5upx 10upx;background-color: red;color:white;" v-if="item.debt == 1">赊账</view>
  43. <view style="border:1upx solid #0e7ed8;border-radius:18upx;font-size:19upx;color:white;padding:5upx 10upx;background-color: #0e7ed8;" v-if="item.refund == 1">有售后</view>
  44. <view style="font-size:28upx;" class='app-price app-green' v-if="item.status==2&&item.sendType==1">待取货</view>
  45. <view style="font-size:28upx;" class='app-price app-green' v-else>{{ item.status | constantfilter('ORDER_STATUS') }}</view>
  46. </view>
  47. <view class="list-blo">
  48. <orderItem :info="item"></orderItem>
  49. </view>
  50. <view class="list-bottom" style="padding-top:0upx;">
  51. <view style="border-bottom:1upx solid #EEEEEE;padding-bottom:8upx;">
  52. <text v-if="item.sendCost > 0" class="freight-text">运费 ¥{{ item.sendCost ? parseFloat(item.sendCost) : 0 }}</text>
  53. <text class="app-size-30 app-bold" v-if="item.forward==0">
  54. <text v-if="item.orderPrice == item.actPrice">¥{{ item.orderPrice ? parseFloat(item.orderPrice):0 }}</text>
  55. <text v-else>
  56. <text style="text-decoration: line-through;color:#847676;">¥{{ item.orderPrice ? parseFloat(item.orderPrice):0 }}</text>
  57. <text style="margin-left:10upx;">¥{{ item.actPrice ? parseFloat(item.actPrice):0 }}</text>
  58. </text>
  59. </text>
  60. <text class="app-size-30 app-bold" v-else>售后付款 -¥{{ item.orderPrice ? parseFloat(item.orderPrice) :0 }}</text>
  61. </view>
  62. <view v-if="item.sameTimeIdsNum && item.sameTimeIdsNum>1" style="text-align: center;color:white;
  63. margin-top:20upx;font-size:34upx;background-color:#09C567;padding-top:12upx;padding-bottom:12upx;display: flex;justify-content: center;"
  64. @click.stop="$util.pageTo({url:'/admin/order/itemOrder?ids='+item.sameTimeIds})">
  65. 本客户共有{{item.sameTimeIdsNum?item.sameTimeIdsNum:0}}个订单,可合并发货
  66. </view>
  67. <view class="list-button">
  68. <view class="admin-button-com middle" v-if="item.payStatus == 1 && (item.hasWork == 0 || item.hasWork == 2)" @click.stop="sendWork(item)">通知制作</view>
  69. <view class="admin-button-com default" v-else>通知制作</view>
  70. <block v-if="item.status == 2">
  71. <view class="admin-button-com middle" v-if="item.sendType == 1" @click.stop="getOrderFn(item)">已取货</view>
  72. <view class="admin-button-com middle" v-else @click.stop="sendOrderFn(item)">自配送</view>
  73. </block>
  74. <block v-if="item.status == 3">
  75. <view class="admin-button-com middle" @click.stop="confirmReach(item)">确认送达</view>
  76. </block>
  77. <view class="admin-button-com middle" v-if="item.payStatus == 1" @click.stop="printOrder(item)">打印</view>
  78. <view class="admin-button-com default" v-else @click.stop="">打印</view>
  79. <block v-if="item.payStatus == 0">
  80. <view class="admin-button-com middle default" @click.stop="">呼叫跑腿</view>
  81. </block>
  82. <block v-else>
  83. <view class="admin-button-com middle" v-if="item.sendStatus == -4 && item.status == 2" @click.stop="openExpressPage(item.id)">呼叫跑腿</view>
  84. <view class="admin-button-com middle" v-else-if="[-1, -2].includes(Number(item.sendStatus)) && item.status == 2" @click.stop="openExpressPage(item.id)">重叫跑腿</view>
  85. <view class="admin-button-com default" v-else-if="item.sendStatus == 5">跑腿完成</view>
  86. <view class="admin-button-com default" v-else-if="[0, 1, 2, 3, 4, 10, 20, 30].includes(Number(item.sendStatus)) && item.payStatus == 1">已发跑腿</view>
  87. </block>
  88. </view>
  89. </view>
  90. </view>
  91. </block>
  92. <block v-else>
  93. <app-wrapper-empty title="暂无数据" :is-empty="$util.isEmpty(list.data)" />
  94. </block>
  95. </view>
  96. <NotLogin></NotLogin>
  97. <!--选择员工 -->
  98. <uni-popup ref="getStaffRef" background-color="#fff" type="center" :animation="false">
  99. <view style="display:flex;padding:20upx;min-height:25vh;justify-content: space-between;align-items:center;flex-wrap:wrap;">
  100. <text v-for="(item, index) in staffList" :key="index" @click="getCurrentStaff(item.id)"
  101. style="margin-left:25upx;border:1upx solid #999999;width:100upx;height:100upx;border-radius:20upx;justify-content:center;align-items:center;display:flex;">
  102. {{item.name}}
  103. </text>
  104. </view>
  105. </uni-popup>
  106. <!-- 筛选下拉面板 -->
  107. <view v-if="showFilterPanel" class="filter-overlay" @click="closeFilterPanel">
  108. <view class="filter-panel" @click.stop>
  109. <view class="filter-header">筛选订单</view>
  110. <!-- 扫码筛选 -->
  111. <view class="filter-section">
  112. <view class="filter-title">扫码</view>
  113. <view class="filter-options">
  114. <view
  115. v-for="(item, index) in repeatOptions"
  116. :key="index"
  117. class="filter-option"
  118. :class="{ 'active': repeat === item.value }"
  119. @click="selectRepeat(item.value)"
  120. >
  121. {{ item.label }}
  122. </view>
  123. </view>
  124. </view>
  125. <!-- 员工筛选 -->
  126. <view class="filter-section">
  127. <view class="filter-title">下单人</view>
  128. <view class="filter-options">
  129. <view
  130. class="filter-option"
  131. :class="{ 'active': shopAdminId === 0 }"
  132. @click="selectStaff(0)"
  133. >全部</view>
  134. <view
  135. v-for="(item, index) in staffList"
  136. :key="index"
  137. class="filter-option"
  138. :class="{ 'active': shopAdminId === item.id }"
  139. @click="selectStaff(item.id)"
  140. >
  141. {{ item.name }}
  142. </view>
  143. </view>
  144. </view>
  145. <!-- 操作按钮 -->
  146. <view class="filter-actions">
  147. <button class="filter-action-btn clear-btn middle" @click="clearFilters">重置</button>
  148. <button class="filter-action-btn confirm-btn middle blue" @click="confirmFilters">确定</button>
  149. </view>
  150. </view>
  151. </view>
  152. </view>
  153. </template>
  154. <script>
  155. import AppTabs from "@/components/plugin/tabs";
  156. import orderItem from "./components/order-item";
  157. import AppWrapperEmpty from "@/components/app-wrapper-empty";
  158. import { list } from "@/mixins";
  159. import { onlinePrintOrder } from '@/api/order'
  160. import { getListB, sendOrder,fetchOrder,sendReach } from "@/api/order";
  161. import NotLogin from "@/components/not-login";
  162. import {getStaffList} from '@/api/staff'
  163. import AppSearchModule from "@/components/module/app-search"
  164. import { cancelExpressOrder } from '@/api/shop-express'
  165. import DateSelect from "@/components/module/dateSelect";
  166. import { getList } from "@/api/member";
  167. import { needWork } from "@/api/work"
  168. export default {
  169. name: "order",
  170. components: {
  171. orderItem,
  172. AppTabs,
  173. AppWrapperEmpty,
  174. NotLogin,
  175. AppSearchModule,
  176. DateSelect
  177. },
  178. mixins: [list],
  179. data () {
  180. return {
  181. tabIndex: 0,
  182. tabs: [ { name: "全部", value: 0 }, { name: "待付款", value: 0 }, { name: "待发货", value: 0 }, { name: "配送中", value: 0 }, { name: "已完成", value: 0 } ],
  183. staffList:[],
  184. shopAdminId:0,
  185. refreshPage:1,
  186. showSearch:false,
  187. searchList:[],
  188. customId:0,
  189. searchTime:'',
  190. startTime:'',
  191. endTime:'',
  192. repeat:-1,
  193. searchStyle:0,//0客户 1编号
  194. searchText:'',
  195. lastSearchText:'',
  196. searchKey: 0,
  197. // 面板相关
  198. showFilterPanel: false,
  199. repeatOptions: [
  200. { label: '全部', value: -1 },
  201. { label: '扫码单', value: 1 }
  202. ]
  203. };
  204. },
  205. computed: {
  206. // 是否存在激活的筛选条件
  207. hasActiveFilters () {
  208. return this.repeat !== -1 || this.shopAdminId !== 0;
  209. }
  210. },
  211. onLoad() {
  212. uni.$on('updateOrderStatus', this.updateOrderStatus);
  213. },
  214. onUnload() {
  215. uni.$off('updateOrderStatus', this.updateOrderStatus);
  216. },
  217. onPullDownRefresh () {
  218. this.resetList();
  219. this.getOrderList().then(res => {
  220. uni.stopPullDownRefresh()
  221. });
  222. },
  223. onReachBottom () {
  224. if (!this.list.finished) {
  225. this.getOrderList().then(res => {
  226. uni.stopPullDownRefresh()
  227. });
  228. } else {
  229. uni.stopPullDownRefresh()
  230. }
  231. },
  232. onShow () {
  233. let tabIndex = uni.getStorageSync("switchTabQuery") || null;
  234. if (tabIndex) {
  235. uni.removeStorageSync("switchTabQuery");
  236. this.tabIndex = parseInt(tabIndex.tabIndex);
  237. }
  238. // 重置搜索
  239. if (this.customId !== 0) {
  240. this.clearFn()
  241. }
  242. //需要控制订单详情页,返回到列表页时不需要刷新页面
  243. if(this.refreshPage == 1){
  244. this.resetList();
  245. this.getOrderList()
  246. }else{
  247. this.refreshPage = 1
  248. }
  249. },
  250. methods: {
  251. init () {
  252. getStaffList().then(res=>{
  253. if(res.code ==1){
  254. this.staffList = res.data.list
  255. }
  256. })
  257. },
  258. // 面板相关
  259. openFilterPanel () {
  260. this.showFilterPanel = true
  261. },
  262. closeFilterPanel () {
  263. this.showFilterPanel = false
  264. },
  265. selectRepeat (value) {
  266. this.repeat = value
  267. },
  268. selectStaff (id) {
  269. this.shopAdminId = id
  270. },
  271. clearFilters () {
  272. // 恢复默认筛选
  273. this.repeat = -1
  274. this.shopAdminId = 0
  275. // 关闭面板并刷新
  276. this.closeFilterPanel()
  277. this.resetList()
  278. this.getOrderList()
  279. },
  280. confirmFilters () {
  281. // 关闭面板并刷新
  282. this.closeFilterPanel()
  283. this.resetList()
  284. this.getOrderList()
  285. },
  286. getCustom(item){
  287. this.showSearch = false
  288. this.customId = item.id
  289. this.resetList()
  290. this.getOrderList()
  291. },
  292. selectDateFn(val) {
  293. this.searchTime = val.searchTime
  294. this.startTime = val.startTime
  295. this.endTime = val.endTime
  296. this.resetList();
  297. this.getOrderList();
  298. },
  299. searchFn(e) {
  300. let that = this
  301. if(this.searchStyle == 0){
  302. // 首次点击搜索框:searchText 为空,lastSearchText 也为空 → 跳过搜索
  303. if (this.$util.isEmpty(this.searchText) && this.$util.isEmpty(this.lastSearchText)) {
  304. return;
  305. } else {
  306. // console.log('000002')
  307. }
  308. if(that.$util.isEmpty(e)){
  309. that.showSearch = false
  310. that.searchList = []
  311. }else{
  312. this.lastSearchText = this.searchText;
  313. getList({ page:1, name:e, type:0}).then((res) => {
  314. if (!that.$util.isEmpty(res.data) && !that.$util.isEmpty(res.data.list)){
  315. that.showSearch = true
  316. that.searchList = res.data.list
  317. }else{
  318. that.showSearch = false
  319. that.searchList = []
  320. }
  321. })
  322. }
  323. }else{
  324. // 首次点击搜索框:searchText 为空,lastSearchText 也为空 → 跳过搜索
  325. if (this.$util.isEmpty(this.searchText) && this.$util.isEmpty(this.lastSearchText)) {
  326. return;
  327. }
  328. if (this.searchText === this.lastSearchText) {
  329. return;
  330. }
  331. this.lastSearchText = this.searchText;
  332. this.resetList()
  333. this.getOrderList()
  334. }
  335. },
  336. sendWork(item){
  337. let that = this
  338. that.$util.confirmModal({content:'确认通知制作?'},() => {
  339. needWork({id:item.id}).then(res=>{
  340. if(res.code == 1){
  341. item.hasWork = 1
  342. that.$msg(res.msg)
  343. }
  344. })
  345. })
  346. },
  347. getOrderFn(item){
  348. let that = this
  349. that.$util.confirmModal({content:'确认取货?'},() => {
  350. fetchOrder({id:item.id}).then(res=>{
  351. if(res.code == 1){
  352. that.$msg('操作成功')
  353. that.resetList()
  354. that.getOrderList()
  355. }
  356. })
  357. })
  358. },
  359. confirmReach(item){
  360. let that = this
  361. that.$util.confirmModal({content:'确认送达?'},() => {
  362. sendReach({id:item.id}).then(res=>{
  363. if(res.code == 1){
  364. that.$msg('操作成功')
  365. that.resetList()
  366. that.getOrderList()
  367. }
  368. })
  369. })
  370. },
  371. sendOrderFn(item){
  372. let that = this
  373. that.$util.confirmModal({content:'确认自配送?'},() => {
  374. sendOrder({id:item.id}).then(res=>{
  375. if(res.code == 1){
  376. that.$msg('操作成功')
  377. that.resetList()
  378. that.getOrderList()
  379. }
  380. })
  381. })
  382. },
  383. changeSearchStyle(){
  384. this.searchStyle = this.searchStyle ==0 ? 1 : 0
  385. this.showSearch = false
  386. this.customId = 0
  387. this.searchText=''
  388. this.resetList()
  389. this.getOrderList()
  390. },
  391. getScanOrder(){
  392. this.repeat = this.repeat == -1 ? 1 : -1
  393. this.resetList()
  394. this.getOrderList()
  395. },
  396. getCurrentStaff(id){
  397. this.resetList();
  398. this.shopAdminId = id
  399. this.$refs.getStaffRef.close()
  400. this.getOrderList()
  401. },
  402. selectStaffFn(){
  403. this.$refs.getStaffRef.open('top')
  404. },
  405. clearFn(){
  406. this.resetList();
  407. this.shopAdminId = 0
  408. this.searchText = ''
  409. this.lastSearchText = ''
  410. this.showSearch = false
  411. this.customId = 0
  412. this.searchTime = ''
  413. this.startTime = ''
  414. this.endTime = ''
  415. if (this.$refs && this.$refs.searchRef) {
  416. this.$refs.searchRef.search = ''
  417. }
  418. this.getOrderList()
  419. },
  420. printOrder(item){
  421. onlinePrintOrder({id:item.id}).then(res=>{
  422. if(res.code == 1){
  423. this.$msg('操作成功')
  424. }
  425. })
  426. },
  427. getOrderList () {
  428. let status = JSON.parse(JSON.stringify(this.tabIndex));
  429. return getListB({
  430. searchTime: this.searchTime,
  431. startTime: this.startTime,
  432. endTime: this.endTime,
  433. status: status,
  434. shopAdminId:this.shopAdminId,
  435. searchText:this.searchText,
  436. page: this.list.page,
  437. customId:this.customId,
  438. repeat:this.repeat,
  439. searchStyle:this.searchStyle
  440. }).then(res => {
  441. this.completes(res);
  442. if (this.$util.isEmpty(res.data)){
  443. return false
  444. }
  445. this.tabs[0].value = 0;
  446. this.tabs[1].value = 0;
  447. this.tabs[2].value = 0;
  448. this.tabs[3].value = 0;
  449. this.tabs[4].value = 0;
  450. })
  451. },
  452. change (e) {
  453. if (this.tabIndex == e.index) {
  454. return false;
  455. } else {
  456. this.tabIndex = e.index;
  457. this.resetList();
  458. this.getOrderList();
  459. }
  460. },
  461. /**
  462. * 更新订单状态及配送状态
  463. * @param orderId 订单ID
  464. * @param orderStatus 订单状态
  465. * @param sendStatus 配送状态
  466. */
  467. updateOrderStatus(orderId, orderStatus, sendStatus) {
  468. if (this.list && this.list.data) {
  469. const item = this.list.data.find(item => item.id == orderId);
  470. if (item) {
  471. item.status = orderStatus;
  472. item.sendStatus = Number(sendStatus);
  473. }
  474. }
  475. },
  476. /**
  477. * 打开配送页面
  478. */
  479. openExpressPage(orderId) {
  480. //this.$util.pageTo({url:'/admin/express/create?orderId='+orderId})
  481. this.$util.pageTo({url:'/admin/delivery/allDelivery?orderId='+orderId})
  482. },
  483. /**
  484. * 取消配送订单
  485. */
  486. async cancelExpress(orderId) {
  487. this.$util.confirmModal({content: '确认取消?(若配送员接单1分钟后取消,扣2元违约金)'}, async () => {
  488. const res = await cancelExpressOrder({orderId: orderId})
  489. if (res.code === 1) {
  490. this.$msg('取消成功')
  491. this.resetList()
  492. this.getOrderList()
  493. }
  494. })
  495. },
  496. /**
  497. * 查看配送成功详情
  498. */
  499. selectExpress(orderId) {
  500. this.$util.pageTo({ url: '/admin/express/success', query: { orderId: orderId } })
  501. }
  502. }
  503. };
  504. </script>
  505. <style lang="scss" scoped>
  506. .app-content {
  507. padding-top: 100upx;
  508. padding-bottom: 1px;
  509. .select-dn_bx {
  510. padding-left: 14upx;
  511. padding-right:10upx;
  512. }
  513. .app-tabs {
  514. position: fixed;
  515. /* 手机mobile屏幕小于1000px */
  516. @media screen and (max-width: 1100px) {
  517. width: 100%;
  518. }
  519. z-index: 9;
  520. }
  521. .input-wrap_box {
  522. background-color: #fff;
  523. position: fixed;
  524. top: 0;
  525. z-index: 10;
  526. @media screen and (max-width: 1100px) {
  527. width: 100%;
  528. }
  529. height: 100upx;
  530. display: flex;
  531. align-items: center;
  532. padding: 0 20upx;
  533. gap: 10upx;
  534. .select-dn_bx {
  535. flex-shrink: 0;
  536. }
  537. .search-container {
  538. flex: 1;
  539. min-width: 0;
  540. position: relative;
  541. }
  542. button {
  543. flex-shrink: 0;
  544. white-space: nowrap;
  545. }
  546. /* 筛选按钮样式(含红点) */
  547. .filter-btn {
  548. position: relative;
  549. .filter-dot {
  550. position: absolute;
  551. top: 5upx;
  552. right: 5upx;
  553. width: 15upx;
  554. height: 15upx;
  555. background-color: white;
  556. border-radius: 50%;
  557. animation: filterDotBlink 2s infinite;
  558. }
  559. }
  560. }
  561. .search-clear-overlay {
  562. position: absolute;
  563. top: 50%;
  564. right: 20upx;
  565. transform: translateY(-50%);
  566. z-index: 11;
  567. padding: 10upx 20upx;
  568. border-radius: 24upx;
  569. font-size: 24upx;
  570. color: #09C567;
  571. border: 1upx solid #09C567;
  572. background-color: rgba(255,255,255,0.9);
  573. }
  574. .list-wrap {
  575. padding-top: 115upx;
  576. .list {
  577. padding: 0 30upx;
  578. background-color: #fff;
  579. margin-bottom: 20upx;
  580. .list-top,.list-bottom {
  581. padding: 20upx 0;
  582. color: #999999;
  583. .app-bold {
  584. color: #333;
  585. }
  586. .freight-text {
  587. margin-right: 60upx;
  588. }
  589. .app-green {
  590. color: green;
  591. }
  592. }
  593. .list-bottom {
  594. & > view {
  595. @include disFlex(center, flex-end);
  596. }
  597. .list-button {
  598. margin-top: 26upx;
  599. display: flex;
  600. justify-content: flex-end;
  601. flex-wrap: nowrap;
  602. .admin-button-com {
  603. margin-left: 30upx;
  604. padding: 16upx 20upx;
  605. white-space: nowrap;
  606. }
  607. }
  608. }
  609. }
  610. }
  611. }
  612. .input-wrap {
  613. padding: 10upx 10upx 0upx 10upx;
  614. height:110upx;
  615. .search-bar {
  616. display:inline-block;
  617. width:190upx;
  618. }
  619. }
  620. /* 筛选面板样式(参考 goods/list.vue) */
  621. .filter-overlay {
  622. position: fixed;
  623. top: 0;
  624. left: 0;
  625. right: 0;
  626. bottom: 0;
  627. background-color: rgba(0, 0, 0, 0.5);
  628. z-index: 9999;
  629. display: flex;
  630. align-items: flex-start;
  631. justify-content: center;
  632. }
  633. .filter-panel {
  634. background-color: #fff;
  635. border-radius: 0 0 20upx 20upx;
  636. width: 100%;
  637. max-height: 90vh;
  638. overflow-y: auto;
  639. animation: slideDown 0.3s ease-out;
  640. }
  641. @keyframes slideDown {
  642. from {
  643. opacity: 0;
  644. transform: translateY(-50upx);
  645. }
  646. to {
  647. opacity: 1;
  648. transform: translateY(0);
  649. }
  650. }
  651. @keyframes filterDotBlink {
  652. 0%, 100% {
  653. background-color: #ffffff;
  654. }
  655. 50% {
  656. background-color: #ff3b30;
  657. }
  658. }
  659. .filter-header {
  660. text-align: center;
  661. padding: 16upx 0;
  662. font-size: 32upx;
  663. font-weight: bold;
  664. border-bottom: 1upx solid #f0f0f0;
  665. color: #333;
  666. }
  667. .filter-section {
  668. padding: 28upx 40upx;
  669. border-bottom: 1upx solid #f0f0f0;
  670. &:last-child {
  671. border-bottom: none;
  672. }
  673. }
  674. .filter-title {
  675. font-size: 28upx;
  676. font-weight: 600;
  677. color: #333;
  678. margin-bottom: 20upx;
  679. }
  680. .filter-options {
  681. display: flex;
  682. flex-wrap: wrap;
  683. gap: 20upx;
  684. }
  685. .filter-option {
  686. padding: 16upx 32upx;
  687. border: 2upx solid #e0e0e0;
  688. border-radius: 25upx;
  689. font-size: 26upx;
  690. color: #666;
  691. background-color: #fff;
  692. text-align: center;
  693. min-width: 120upx;
  694. transition: all 0.3s ease;
  695. &.active {
  696. border-color: #52c41a;
  697. background-color: #f6ffed;
  698. color: #52c41a;
  699. font-weight: 600;
  700. }
  701. }
  702. .filter-actions {
  703. display: flex;
  704. padding: 30upx 40upx;
  705. gap: 20upx;
  706. }
  707. .filter-action-btn {
  708. flex: 1;
  709. padding: 14upx 0;
  710. border-radius: 12upx;
  711. font-size: 28upx;
  712. border: none;
  713. font-weight: 600;
  714. &.clear-btn {
  715. background-color: #f5f5f5;
  716. color: #666;
  717. }
  718. &.confirm-btn {
  719. background-color: #09C567;
  720. color: #fff;
  721. }
  722. }
  723. </style>