index.html 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513
  1. {include file="/shopro/common/script" /}
  2. <style>
  3. .order-index .dashboard-content {
  4. padding: 20px 20px 0;
  5. background: var(--sa-table-header-bg);
  6. border-radius: 8px;
  7. margin-bottom: 20px;
  8. }
  9. .order-index .dashboard-content .dashboard-item {
  10. text-align: center;
  11. margin-bottom: 20px;
  12. }
  13. .order-index .dashboard-content .dashboard-item .top {
  14. line-height: 24px;
  15. font-size: 20px;
  16. font-weight: 400;
  17. color: var(--sa-subtitle);
  18. }
  19. .order-index .dashboard-content .dashboard-item .top .unit {
  20. font-size: 12px;
  21. margin-left: 4px;
  22. }
  23. .order-index .dashboard-content .dashboard-item .bottom {
  24. line-height: 16px;
  25. font-size: 12px;
  26. font-weight: 400;
  27. color: var(--sa-font);
  28. }
  29. .order-index .order-content {
  30. font-size: 12px;
  31. font-weight: 400;
  32. color: var(--sa-subtitle);
  33. }
  34. .order-index .goods-item .goods-title {
  35. height: 14px;
  36. line-height: 14px;
  37. font-size: 12px;
  38. font-weight: 500;
  39. margin-bottom: 4px;
  40. }
  41. .order-index .goods-item .goods-title .goods-id {
  42. color: var(--el-color-primary);
  43. cursor: pointer;
  44. }
  45. .order-index .goods-item .goods-sku-text {
  46. height: 14px;
  47. line-height: 14px;
  48. margin-bottom: 10px;
  49. }
  50. .order-index .sa-table-wrap {
  51. height: 100%;
  52. margin-left: -48px;
  53. overflow: hidden;
  54. }
  55. .order-index .sa-table-wrap .sa-table .el-table__header-wrapper {
  56. margin-bottom: 4px;
  57. }
  58. .order-index .sa-table-wrap .sa-table .el-table__row {
  59. background: var(--sa-background-hex-hover);
  60. }
  61. .order-index .sa-table-wrap .sa-table .el-table__expanded-cell {
  62. padding: 0;
  63. }
  64. .order-index .sa-table-wrap .sa-expand-table .el-table__header-wrapper {
  65. margin-bottom: 0;
  66. display: none;
  67. }
  68. .order-index .sa-table-wrap .sa-expand-table .el-table__row {
  69. background: var(--el-table-tr-bg-color);
  70. }
  71. .order-index .rewards-item {
  72. margin-right: 8px;
  73. }
  74. .order-index .rewards-item:last-of-type {
  75. margin-right: 0;
  76. }
  77. .order-index .rewards-item .rewards-agent-id {
  78. line-height: 32px;
  79. }
  80. .rewards-popover {
  81. line-height: 16px;
  82. font-size: 12px;
  83. font-weight: 400;
  84. color: var(--sa-font);
  85. margin-bottom: 4px;
  86. }
  87. .rewards-popover .nickname {
  88. height: 20px;
  89. line-height: 20px;
  90. }
  91. .rewards-popover .id {
  92. line-height: 16px;
  93. font-size: 12px;
  94. font-weight: 400;
  95. color: var(--sa-subfont);
  96. }
  97. .rewards-popover .rewards-status {
  98. height: 16px;
  99. overflow: hidden;
  100. }
  101. .rewards-popover .rewards-commission {
  102. width: 80px;
  103. }
  104. </style>
  105. <div id="index" class="order-index panel panel-default panel-intro" v-cloak>
  106. <el-container class="panel-block">
  107. <el-header class="sa-header">
  108. <div class="sa-title sa-flex sa-row-between">
  109. <div class="sa-title-left">
  110. <div class="left-name">分销订单</div>
  111. <sa-filter-condition v-model="state.filter" @filter-delete="onChangeFilter">
  112. </sa-filter-condition>
  113. </div>
  114. <div class="sa-title-right">
  115. <el-button class="sa-button-refresh" icon="RefreshRight" @click="getData"></el-button>
  116. <el-button class="sa-button-refresh" icon="Search" @click="onOpenFilter"></el-button>
  117. {if $auth->check('shopro/commission/order/export')}
  118. <el-button :loading="exportLoading" :disabled="exportLoading" @click="onExport('export')">订单导出
  119. </el-button>
  120. {/if}
  121. </div>
  122. </div>
  123. <el-row class="dashboard-content">
  124. <el-col class="dashboard-item" :xs="8" :sm="8" :md="6" :lg="6" :xl="6">
  125. <div class="top"> {{ state.count.total }}<span class="unit">单</span> </div>
  126. <div class="bottom">商品总订单数</div>
  127. </el-col>
  128. <el-col class="dashboard-item" :xs="8" :sm="8" :md="3" :lg="3" :xl="3">
  129. <div class="top">
  130. {{ state.count.total_amount?.toFixed(2) }}<span class="unit">元</span>
  131. </div>
  132. <div class="bottom">商品结算总金额</div>
  133. </el-col>
  134. <el-col class="dashboard-item" :xs="8" :sm="8" :md="3" :lg="3" :xl="3">
  135. <div class="top">
  136. {{ state.count.total_commission?.toFixed(2) }}<span class="unit">元</span>
  137. </div>
  138. <div class="bottom">分佣总金额</div>
  139. </el-col>
  140. <el-col class="dashboard-item" :xs="8" :sm="8" :md="3" :lg="3" :xl="3">
  141. <div class="top">
  142. {{ state.count.total_commission_cancel?.toFixed(2) }}<span class="unit">元</span>
  143. </div>
  144. <div class="bottom">已取消佣金</div>
  145. </el-col>
  146. <el-col class="dashboard-item" :xs="8" :sm="8" :md="3" :lg="3" :xl="3">
  147. <div class="top">
  148. {{ state.count.total_commission_back?.toFixed(2) }}<span class="unit">元</span>
  149. </div>
  150. <div class="bottom">已退回佣金</div>
  151. </el-col>
  152. <el-col class="dashboard-item" :xs="8" :sm="8" :md="3" :lg="3" :xl="3">
  153. <div class="top">
  154. {{ state.count.total_commission_pending?.toFixed(2) }}<span class="unit">元</span>
  155. </div>
  156. <div class="bottom">未结算佣金</div>
  157. </el-col>
  158. <el-col class="dashboard-item" :xs="8" :sm="8" :md="3" :lg="3" :xl="3">
  159. <div class="top">
  160. {{ state.count.total_commission_accounted?.toFixed(2) }}<span class="unit">元</span>
  161. </div>
  162. <div class="bottom">已结算佣金</div>
  163. </el-col>
  164. </el-row>
  165. </el-header>
  166. <el-main class="sa-main">
  167. <div class="sa-table-wrap">
  168. <el-table height="100%" class="sa-table" :data="state.data" :span-method="arraySpanMethod"
  169. default-expand-all>
  170. <el-table-column type="expand">
  171. <template #default="props">
  172. <el-table class="sa-table sa-expand-table" :data="[props.row]">
  173. <el-table-column width="48"></el-table-column>
  174. <el-table-column min-width="300">
  175. <template #default>
  176. <div v-if="props.row.order_item" class="goods-item sa-flex">
  177. <sa-image class="mr-2" :url="props.row.order_item.goods_image" size="58">
  178. </sa-image>
  179. <div>
  180. <div class="goods-title sa-table-line-1">
  181. <span class="goods-id mr-1"
  182. @click="onOpenGoodsDetail(props.row.order_item.goods_id)">
  183. #{{props.row.order_item.goods_id }}
  184. </span>
  185. {{ props.row.order_item.goods_title }}
  186. </div>
  187. <div class="goods-sku-text sa-table-line-1">
  188. <span v-if="props.row.order_item.goods_sku_text">{{
  189. props.row.order_item.goods_sku_text
  190. }}</span>
  191. </div>
  192. <div class="sa-flex">
  193. <span class="goods-price mr-2">¥{{
  194. props.row.order_item.goods_price }}</span>
  195. <span class="goods-num">x{{
  196. props.row.order_item.goods_num }}</span>
  197. </div>
  198. </div>
  199. </div>
  200. <div v-else>{{ props.row.order_item }}</div>
  201. </template>
  202. </el-table-column>
  203. <el-table-column min-width="100">
  204. <template #default>
  205. <!-- 0=未退款|1=申请退款|2=退款完成 -->
  206. <span
  207. :class="props.row.order_item?.refund_status==0?'sa-color--info':'sa-color--success'">
  208. {{ props.row.order_item?.refund_status_text || '-' }}
  209. </span>
  210. </template>
  211. </el-table-column>
  212. <el-table-column min-width="100" align="center">
  213. <template #default>
  214. <sa-user-profile :user="props.row.buyer" :id="props.row.buyer_id" mode="col">
  215. </sa-user-profile>
  216. </template>
  217. </el-table-column>
  218. <el-table-column min-width="100" align="center">
  219. <template #default>
  220. <sa-user-profile :user="props.row.agent" :id="props.row.agent_id" mode="col">
  221. </sa-user-profile>
  222. </template>
  223. </el-table-column>
  224. <el-table-column min-width="200" align="center">
  225. <template #default>
  226. <el-scrollbar>
  227. <div class="sa-flex sa-row-center">
  228. <template v-for="(rewards, index) in props.row.rewards" :key="rewards">
  229. <el-popover placement="top-start" :width="240" trigger="click">
  230. <div class="rewards-popover">
  231. <div class="mb-2">
  232. <div v-if="rewards.agent" class="sa-flex">
  233. <sa-image :url="rewards.agent.avatar" size="32"
  234. radius="16"></sa-image>
  235. <div class="ml-2">
  236. <div class="nickname sa-table-line-1">
  237. {{ rewards.agent.nickname }}
  238. </div>
  239. <div class="id">#{{ rewards.agent.id }}</div>
  240. </div>
  241. </div>
  242. <div v-else>#{{ rewards.agent_id }}</div>
  243. </div>
  244. <div>用户等级:等级{{ rewards.agent_level }}</div>
  245. <div> 用户层级:{{ rewards.commission_level }}级分销 </div>
  246. <div>
  247. 比例/佣金:
  248. <template v-if="rewards.commission_rules">
  249. <template v-if="rewards.commission_rules.rate">
  250. {{ rewards.commission_rules.rate }}%
  251. </template>
  252. <template v-if="rewards.commission_rules.money">
  253. {{ rewards.commission_rules.money }}元
  254. </template>
  255. </template>
  256. </div>
  257. <div class="rewards-status sa-flex">
  258. 佣金状态:
  259. <span class="mr-1">{{rewards.status_text}}</span>
  260. <template v-if="rewards.status == 0">
  261. {if $auth->check('shopro/commission/order/confirm')}
  262. <el-button type="primary" link size="small"
  263. @click="onConfirm({commission_reward_id: rewards.id})">
  264. 手动结算</el-button>
  265. {/if}
  266. {if $auth->check('shopro/commission/order/cancel')}
  267. <el-button class="ml-1" type="info" link
  268. size="small"
  269. @click="onCancel({commission_reward_id: rewards.id})">
  270. 取消
  271. </el-button>
  272. {/if}
  273. </template>
  274. <el-popconfirm v-if="rewards.status == 1"
  275. width="fit-content" confirm-button-text="确认"
  276. cancel-button-text="取消" title="确认?"
  277. @confirm="onBack({commission_reward_id: rewards.id})">
  278. <template #reference>
  279. {if
  280. $auth->check('shopro/commission/order/back')}
  281. <el-button type="danger" link size="small">
  282. 手动退回
  283. </el-button>
  284. {/if}
  285. </template>
  286. </el-popconfirm>
  287. </div>
  288. <div>入账方式:{{ rewards.type_text }}</div>
  289. <div class="sa-flex sa-col-top">
  290. <span class="sa-flex-0">佣金金额:</span>
  291. <div class="sa-flex sa-flex-wrap">
  292. <template v-if="!rewardsPopover.flag[index]">
  293. <span>{{ rewards.commission }}元</span>
  294. {if
  295. $auth->check('shopro/commission/order/edit')}
  296. <el-button v-if="rewards.status == 0"
  297. class="ml-1" type="primary" link
  298. size="small"
  299. @click="rewardsPopover.flag[index] = true">
  300. 修改
  301. </el-button>
  302. {/if}
  303. </template>
  304. <template v-if="rewardsPopover.flag[index]">
  305. <el-input class="rewards-commission"
  306. v-model="rewardsPopover.commission"
  307. size="small">
  308. <template #append>元</template>
  309. </el-input>
  310. <el-button class="ml-1" type="info" link
  311. size="small"
  312. @click="onCancelRewardsPopover(index)">取消
  313. </el-button>
  314. <el-button class="ml-1" type="primary" link
  315. size="small"
  316. @click="onConfirmRewardsPopover(index,rewards.id)">
  317. 确定</el-button>
  318. </template>
  319. <s v-if="rewards.original_commission != rewards.commission"
  320. class="ml-1">
  321. {{rewards.original_commission}}
  322. </s>
  323. </div>
  324. </div>
  325. </div>
  326. <template #reference>
  327. <div class="rewards-item sa-flex sa-flex-col sa-row-center">
  328. <template v-if="rewards.agent">
  329. <sa-image :url="rewards.agent.avatar" size="32"
  330. radius="16" :ispreview="false"></sa-image>
  331. </template>
  332. <div v-if="!rewards.agent" class="rewards-agent-id">
  333. {{ rewards.agent_id }}
  334. </div>
  335. <div class="commission mt-1"> {{ rewards.commission }}元
  336. </div>
  337. </div>
  338. </template>
  339. </el-popover>
  340. </template>
  341. </div>
  342. </el-scrollbar>
  343. </template>
  344. </el-table-column>
  345. <el-table-column min-width="80">
  346. <template #default>
  347. <!-- commission_reward_status -2=已退回|-1=已取消|0=未结算|1=已结算 -->
  348. <span
  349. :class="`sa-color--${state.statusStyle[props.row.commission_reward_status]}`">
  350. {{ props.row.commission_reward_status_text }}
  351. </span>
  352. </template>
  353. </el-table-column>
  354. <el-table-column min-width="172">
  355. <template #default>
  356. <div>{{ props.row.reward_event_text }}</div>
  357. {{ props.row.commission_time }}
  358. </template>
  359. </el-table-column>
  360. <el-table-column min-width="110">
  361. <template #default>
  362. <div>{{ props.row.reward_type_text }}</div>
  363. {{ props.row.amount }}元
  364. </template>
  365. </el-table-column>
  366. <el-table-column min-width="100">
  367. <template #default>
  368. <!-- commission_order_status -2=已扣除|-1=已取消|0=不计入|1=已计入 -->
  369. <span
  370. :class="`sa-color--${state.statusStyle[props.row.commission_order_status]}`">
  371. {{ props.row.commission_order_status_text }}
  372. </span>
  373. </template>
  374. </el-table-column>
  375. <el-table-column min-width="160">
  376. <template #default>
  377. {{ countRewards(props.row.rewards) }}
  378. </template>
  379. </el-table-column>
  380. <el-table-column min-width="160">
  381. <template #default>
  382. <el-popover v-model:visible="commissionPopover.flag[props.$index]"
  383. placement="top-start" :width="312" trigger="click">
  384. <div class="commission-popover">
  385. <div class="title sa-flex">
  386. <el-icon class="sa-color--warning mr-1">
  387. <question-filled />
  388. </el-icon>
  389. <template v-if="props.row.commission_reward_status == 0">
  390. <template v-if="commissionPopover.type == 'confirm'">
  391. 手动提前结算,佣金将不再按结算方式自动执行。
  392. </template>
  393. <template v-if="commissionPopover.type == 'cancel'">
  394. 取消结算,佣金将不再结算。
  395. </template>
  396. </template>
  397. <template v-if="props.row.commission_reward_status == 1">
  398. 您确定要手动退回佣金?
  399. </template>
  400. </div>
  401. <div class="sa-flex sa-row-between">
  402. <div>
  403. <el-checkbox
  404. v-if="commissionPopover.type == 'back' || commissionPopover.type == 'cancel'"
  405. v-model="commissionPopover.isDelete" true-label="1"
  406. false-label="0">扣除推广分销商业绩
  407. </el-checkbox>
  408. </div>
  409. <div>
  410. <el-button type="info" link size="small"
  411. @click="onCancelCommissionPopover(props.$index)">
  412. 取消</el-button>
  413. <el-button size="small" type="primary"
  414. @click="onConfirmCommissionPopover(props.$index,props.row.id)">
  415. 确定</el-button>
  416. </div>
  417. </div>
  418. </div>
  419. <template #reference>
  420. <div class="sa-flex">
  421. <template v-if="props.row.commission_reward_status == 0">
  422. {if $auth->check('shopro/commission/order/confirm')}
  423. <el-button type="primary" link
  424. @click="commissionPopover.type = 'confirm'">手动结算</el-button>
  425. {/if}
  426. {if $auth->check('shopro/commission/order/cancel')}
  427. <el-button type="info" link
  428. @click="commissionPopover.type = 'cancel'">
  429. 取消结算
  430. </el-button>
  431. {/if}
  432. </template>
  433. {if $auth->check('shopro/commission/order/back')}
  434. <el-button v-if="props.row.commission_reward_status == 1"
  435. type="danger" link @click="commissionPopover.type = 'back'">
  436. 手动退回
  437. </el-button>
  438. {/if}
  439. </div>
  440. </template>
  441. </el-popover>
  442. <template v-if="props.row.commission_reward_status < 0">-</template>
  443. </template>
  444. </el-table-column>
  445. </el-table>
  446. </template>
  447. </el-table-column>
  448. <el-table-column label="商品信息" min-width="300">
  449. <template #default="scope">
  450. <div class="order-content sa-flex">
  451. <div class="id mr-4">ID:{{ scope.row.id }}</div>
  452. <template v-if="scope.row.order">
  453. <div class="order-sn sa-flex mr-4">
  454. 订单号:{{ scope.row.order.order_sn }}
  455. <el-icon class="copy-document" @click="onClipboard(scope.row.order.order_sn)">
  456. <copy-document />
  457. </el-icon>
  458. </div>
  459. <div class="mr-4">下单时间:{{ scope.row.order.createtime }}</div>
  460. <div class="mr-4">订单状态:{{ scope.row.order.status_text }}</div>
  461. </template>
  462. </div>
  463. </template>
  464. </el-table-column>
  465. <el-table-column label="退款状态" min-width="100"></el-table-column>
  466. <el-table-column label="下单用户" min-width="100" align="center"></el-table-column>
  467. <el-table-column label="推广分销商" min-width="100" align="center"></el-table-column>
  468. <el-table-column label="佣金详情" min-width="200" align="center"></el-table-column>
  469. <el-table-column label="佣金状态" min-width="80"></el-table-column>
  470. <el-table-column label="结算方式/结算时间" min-width="172"></el-table-column>
  471. <el-table-column label="商品结算金额" min-width="110"> </el-table-column>
  472. <el-table-column label="分销商业绩" min-width="100"> </el-table-column>
  473. <el-table-column label="分销总金额/到账金额" min-width="160">
  474. </el-table-column>
  475. <el-table-column label="操作" min-width="160">
  476. <template #default="scope">
  477. <el-button type="primary" link @click="onOpenOrderDetail(scope.row.order_id)">订单详情
  478. </el-button>
  479. </template>
  480. </el-table-column>
  481. </el-table>
  482. </div>
  483. </el-main>
  484. <el-footer class="sa-footer sa-flex sa-row-right">
  485. <sa-pagination v-model="pagination" @pagination-change="getData"></sa-pagination>
  486. </el-footer>
  487. </el-container>
  488. <sa-filter v-model="state.filter" @filter-change="onChangeFilter"></sa-filter>
  489. </div>