You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1490 lines
59 KiB

  1. <template>
  2. <div class="content">
  3. <div class="div-card1">
  4. <el-card class="card1" style="margin-bottom: 0.5vh; min-height: 110px;">
  5. <div class="row1">
  6. <div class="rowItem">
  7. <el-text style="width: 4vw;">精网号</el-text>
  8. <el-input v-model="searchData.jwcode" placeholder="请输入精网号" style="width:10vw;"
  9. clearable></el-input>
  10. </div>
  11. <div class="rowItem">
  12. <el-text style="width: 4vw;">客户姓名</el-text>
  13. <el-input v-model="searchData.name" placeholder="请输入客户姓名" style="width:10vw;"
  14. clearable></el-input>
  15. </div>
  16. <div class="rowItem">
  17. <el-text style="width: 4vw;">所属地区</el-text>
  18. <el-select v-model="searchData.market" placeholder="请选择所属地区" style="width:10vw;" clearable>
  19. <el-option v-for="item in marketList" :key="item" :label="item" :value="item" />
  20. </el-select>
  21. </div>
  22. <!-- 地区财务固定显示付款币种删除客服的订单状态 -->
  23. <div class="rowItem">
  24. <el-text style="width: 4vw;">付款币种</el-text>
  25. <el-select v-model="searchData.paymentCurrency" placeholder="请选择付款币种" style="width: 10vw;"
  26. clearable>
  27. <el-option v-for="item in customOptions" :key="item" :label="item" :value="item" />
  28. </el-select>
  29. </div>
  30. <div class="rowItem">
  31. <el-text style="width: 4vw;">支付方式</el-text>
  32. <el-select v-model="searchData.payType" placeholder="请选择支付方式" style="width: 10vw;" clearable>
  33. <el-option v-for="item in paytypeList" :key="item" :label="item" :value="item" />
  34. </el-select>
  35. </div>
  36. </div>
  37. <div class="row2" style="margin-top: 10px;">
  38. <div class="left">
  39. <div class="rowItem">
  40. <el-text style="width: 4vw;">活动名称</el-text>
  41. <el-select v-model="searchData.activity" placeholder="请选择活动方式" style="width: 10vw;"
  42. clearable>
  43. <el-option v-for="item in activityList" :key="item.id" :label="item.activityName"
  44. :value="item.id" />
  45. </el-select>
  46. </div>
  47. <div class="rowItem">
  48. <el-text style="width: 4vw;">产品名称</el-text>
  49. <el-cascader v-model="searchData.goodsName" :options="productList" style="width: 10vw;"
  50. clearable />
  51. </div>
  52. <div class="rowItem" style="width: 25vw">
  53. <el-text style="width: 4vw; margin-left: 0.5vw;">付款时间</el-text>
  54. <el-date-picker v-model="getTime" type="datetimerange" range-separator=""
  55. start-placeholder="起始时间" end-placeholder="结束时间" style="width: 22vw; "
  56. @change="handleDatePickerChange" :default-time="defaultTime"
  57. :disabled-date="disabledDate" />
  58. </div>
  59. </div>
  60. <el-button style="width: 3vw;" type="primary" @click="search">查询</el-button>
  61. <el-button style="width: 3vw;" type="success" @click="reset">重置</el-button>
  62. <el-button v-if="activeTab == 'done'" style="width: 5vw;" type="warning"
  63. @click="exportExcel()">导出excel</el-button>
  64. <el-button v-if="activeTab == 'done'" style="width: 6vw;" type="primary"
  65. @click="openExportList">查看导出列表</el-button>
  66. </div>
  67. </el-card>
  68. </div>
  69. <div class="div-card2">
  70. <el-card class="card2">
  71. <div class="btns">
  72. <div class="tabs">
  73. <el-button-group>
  74. <el-button class="btnItem"
  75. :style="{ backgroundColor: activeTab === 'pass' ? '#2741DE' : '#E5EBFE', color: activeTab === 'pass' ? 'white' : '#666' }"
  76. @click="navigateTo('pass')">
  77. 已通过
  78. </el-button>
  79. <el-button class="btnItem"
  80. :style="{ backgroundColor: activeTab === 'done' ? '#2741DE' : '#E5EBFE', color: activeTab === 'done' ? 'white' : '#666' }"
  81. @click="navigateTo('done')">
  82. 已完成
  83. </el-button>
  84. </el-button-group>
  85. </div>
  86. <!-- 删除客服的添加收款按钮 -->
  87. <div class="btnAdd"></div>
  88. </div>
  89. <div class="table">
  90. <el-table :data="tableData" style="width: 80vw;height:64vh;" @sort-change="handleSortChange"
  91. :row-style="{ height: '60px' }" :header-cell-style="{ textAlign: 'center' }"
  92. :cell-style="{ textAlign: 'center' }">
  93. <el-table-column type="index" label="序号" width="100px" fixed="left">
  94. <template #default="scope">
  95. <span>{{ scope.$index + 1 + (pageInfo.pageNum - 1) * pageInfo.pageSize }}</span>
  96. </template>
  97. </el-table-column>
  98. <el-table-column fixed="left" prop="jwcode" label="Homily ID" width="110px" />
  99. <el-table-column fixed="left" prop="name" label="姓名" width="110px" />
  100. <el-table-column prop="marketName" label="所属地区" width="80px" />
  101. <el-table-column prop="activity" label="活动名称" width="120px" show-overflow-tooltip />
  102. <el-table-column prop="goodsName" label="产品名称" width="120px" />
  103. <el-table-column prop="goodNum" label="产品数量" width="130px">
  104. <template #default="scope">
  105. <span v-if="scope.row.goodsName == '金币充值'">{{ scope.row.permanentGold }}</span>
  106. <span v-else>{{ scope.row.goodNum }}</span>
  107. </template>
  108. </el-table-column>
  109. <el-table-column prop="paymentCurrency" label="付款币种" width="100px" />
  110. <el-table-column prop="paymentAmount" label="付款金额" width="120px" />
  111. <!-- 总部财务显示到账币种/金额/手续费已通过/已完成标签页 -->
  112. <el-table-column prop="receivedCurrency" label="到账币种"
  113. v-if="activeTab == 'pass' || activeTab == 'done'" width="150px"></el-table-column>
  114. <el-table-column prop="receivedAmount" label="到账金额"
  115. v-if="activeTab == 'pass' || activeTab == 'done'" width="150px">
  116. <template #default="scope">
  117. <div v-if="!scope.row.receivedAmount">
  118. <text style="color: #FA5A1E;">待补充</text>
  119. </div>
  120. </template>
  121. </el-table-column>
  122. <el-table-column prop="handlingCharge" label="手续费"
  123. v-if="activeTab == 'pass' || activeTab == 'done'" width="150px">
  124. <template #default="scope">
  125. <div v-if="scope.row.handlingCharge == null">
  126. <text style="color: #FA5A1E;">待补充</text>
  127. </div>
  128. </template>
  129. </el-table-column>
  130. <el-table-column prop="payType" label="支付方式" width="130px" />
  131. <el-table-column prop="payTime" label="付款时间" width="180px" />
  132. <el-table-column prop="voucher" label="转账凭证" width="110px">
  133. <template #default="scope">
  134. <div v-if="scope.row.voucher"
  135. style="display: flex; justify-content: center; align-items: center; cursor: pointer;"
  136. @click="previewImage(scope.row.voucher)">
  137. <img :src="scope.row.voucher" alt="支付凭证" style="width: auto; height: 40px;">
  138. </div>
  139. <div v-else
  140. style="display: flex; justify-content: center; align-items: center; height: 40px;">
  141. </div>
  142. </template>
  143. </el-table-column>
  144. <el-table-column prop="submitterName" label="提交人" width="150px"
  145. show-overflow-tooltip></el-table-column>
  146. <!-- 总部财务显示审核人已通过/已驳回/已完成标签页 -->
  147. <el-table-column prop="auditName" label="审核人"
  148. v-if="activeTab == 'pass' || activeTab == 'reject' || activeTab == 'done'" width="150px"
  149. show-overflow-tooltip></el-table-column>
  150. <el-table-column prop="receivedTime" label="到账时间"
  151. v-if="activeTab == 'pass' || activeTab == 'done'" width="180px" />
  152. <el-table-column prop="remark" label="备注" v-if="activeTab != 'reject'" width="150px"
  153. show-overflow-tooltip></el-table-column>
  154. <el-table-column prop="status" fixed="right" label="订单状态" v-if="activeTab == 'done'"
  155. width="150px" show-overflow-tooltip>
  156. <template #default="scope">
  157. <span style="color: rgb(242, 84, 83);" v-if="scope.row.status == 6">退款</span>
  158. <span style="color: rgb(127,204,133);" v-else>正常</span>
  159. </template>
  160. </el-table-column>
  161. <el-table-column prop="auditTime" label="驳回时间" v-if="activeTab == 'reject'" width="180px"
  162. show-overflow-tooltip></el-table-column>
  163. <el-table-column prop="rejectReason" label="驳回理由" v-if="activeTab == 'reject'" width="150px">
  164. <template #default="scope">
  165. <div class="ellipsis-container"
  166. @mouseenter="handleMouseEnter($event, scope.row.rejectReason)"
  167. @mouseleave="handleMouseLeave" @mousemove="handleMouseMove($event)">
  168. <span class="ellipsis-text">
  169. {{ scope.row.rejectReason || '—' }}
  170. </span>
  171. <!-- 自定义提示框 -->
  172. <div v-if="showTooltip && tooltipContent" class="custom-tooltip" :style="{
  173. left: `${tooltipLeft}px`,
  174. top: `${tooltipTop}px`
  175. }">
  176. {{ tooltipContent }}
  177. </div>
  178. </div>
  179. </template>
  180. </el-table-column>
  181. <!-- 总部财务表格操作待审核审核已通过编辑 -->
  182. <el-table-column fixed="right" label="操作" width="120px" v-if="activeTab != 'reject'">
  183. <template #default=scope>
  184. <el-link v-if="activeTab == 'wait'" style="color: #2741DE;"
  185. @click="openAuditForm(scope.row)">审核
  186. </el-link>
  187. <el-link
  188. v-else-if="activeTab == 'pass' && !(scope.row.status == 6 || scope.row.status == 4)"
  189. style="color: #2741DE;" @click="openEditForm(scope.row)">编辑
  190. </el-link>
  191. <el-link
  192. v-else-if="activeTab == 'done' && scope.row.status == 4 && startsWith(scope.row.orderCode, 'GOLDCOIN')"
  193. style="color: rgb(242, 84, 83);" @click="openRefundConfirm(scope.row)">退款
  194. </el-link>
  195. </template>
  196. </el-table-column>
  197. </el-table>
  198. </div>
  199. <div class="pagination">
  200. <el-pagination background :current-page="pageInfo.pageNum" :page-size="pageInfo.pageSize"
  201. :page-sizes="[5, 10, 20, 50, 100]" layout="total, sizes, prev, pager, next, jumper"
  202. :total="total" @size-change="handlePagination('size', $event)"
  203. @current-change="handlePagination('page', $event)"></el-pagination>
  204. </div>
  205. </el-card>
  206. </div>
  207. <!-- 退款确认弹窗 -->
  208. <div class="recallDialog" v-show="refundConfirmDialog">
  209. <div class="close">
  210. <button @click="closeConfirmRefund" class="Btn">关闭</button>
  211. </div>
  212. <div class="text">
  213. <text class="txt">{{ textContent }}</text>
  214. </div>
  215. <div class="cancle">
  216. <button @click="closeConfirmRefund" class="Btn">取消</button>
  217. </div>
  218. <div class="confirm">
  219. <button @click="openRefundDialog" class="Btn">确定</button>
  220. </div>
  221. </div>
  222. <!-- 编辑填手续费弹窗总部财务核心编辑功能 -->
  223. <el-dialog class="editdialog" v-model="editFormisible" width="20vw" :before-close="closeEditForm">
  224. <div class="content">
  225. <div class="left">
  226. <el-form class="editForm" label-width="4.5vw" label-position="left">
  227. <el-form-item label="精网号">
  228. <el-input disabled="true" v-model="editFormData.jwcode" placeholder="精网号" />
  229. </el-form-item>
  230. <el-form-item label="客户姓名">
  231. <el-input disabled="true" v-model="editFormData.name" placeholder="客户姓名" />
  232. </el-form-item>
  233. <el-form-item label="所属地区">
  234. <el-input disabled="true" v-model="editFormData.marketName" placeholder="所属地区" />
  235. </el-form-item>
  236. <el-form-item label="活动名称">
  237. <el-input disabled="true" v-model="editFormData.activity" placeholder="活动名称" />
  238. </el-form-item>
  239. <el-form-item label="产品名称">
  240. <el-select disabled="true" v-model="editFormData.goodsName" placeholder="产品名称"
  241. clearable></el-select>
  242. </el-form-item>
  243. <!-- 金币产品特殊显示 -->
  244. <el-form-item v-show="!isEditGold" label="产品数量">
  245. <div style="display: flex;">
  246. <el-input disabled="true" style="padding-right: 30px; flex: 3;"
  247. v-model="editFormData.goodNum" placeholder="请输入产品数量" />
  248. <CurrencySelect disabled="true" v-model="editFormData.numUnit" :items="numUnitList"
  249. style="flex: 1.5;" placeholder="单位" />
  250. </div>
  251. </el-form-item>
  252. <div v-show="isEditGold" style="margin-bottom: 15px; display: flex;">
  253. <div style=" display: flex; margin-right: 10px;">
  254. <span
  255. style="color: #999999; display: flex; white-space: nowrap;align-items: center;">永久金币</span>
  256. <el-input disabled="true"
  257. style="padding-right: 10px; padding-left: 10px; height: 30px; width: 110px;"
  258. v-model="editFormData.permanentGold" />
  259. </div>
  260. <div style="padding-right: 5px; display: flex;">
  261. <span
  262. style="color: #999999; display: flex; white-space: nowrap;align-items: center;">免费金币</span>
  263. <el-input disabled="true"
  264. style="padding-right: 10px; padding-left: 10px; height: 30px; width: 110px;"
  265. v-model="editFormData.freeGold" />
  266. </div>
  267. </div>
  268. <el-form-item label="付款币种">
  269. <CurrencySelect :disabled="!ifOnline" v-model="editFormData.paymentCurrency"
  270. :items="customOptions" placeholder="付款币种" />
  271. </el-form-item>
  272. <el-form-item label="付款金额">
  273. <el-input :disabled="!ifOnline" v-model="editFormData.paymentAmount" placeholder="付款金额" />
  274. </el-form-item>
  275. <el-form-item label="支付方式">
  276. <el-select disabled="true" v-model="editFormData.payType" placeholder="支付方式"
  277. clearable></el-select>
  278. </el-form-item>
  279. <el-form-item label="到账地区">
  280. <el-select disabled="true" v-model="editFormData.receivedMarket" placeholder="到账地区"
  281. clearable></el-select>
  282. </el-form-item>
  283. <el-form-item label="付款时间">
  284. <el-date-picker disabled="true" type="datetime" v-model="editFormData.payTime"
  285. placeholder="付款时间" />
  286. </el-form-item>
  287. <el-form-item label="转账凭证">
  288. <div class="pic">
  289. <el-upload disabled="true" ref="uploadRef" class="uploader" :show-file-list="false"
  290. list-type="picture-card" :auto-upload="false" :before-upload="beforeUpload"
  291. :on-error="handelImgErr" :on-change="handleImageChange"
  292. :http-request="customUpload">
  293. <img v-if="editFormData.voucher" :src="editFormData.voucher" class="avatar"
  294. style="height: 100%; width: 100%; object-fit: cover;" />
  295. <el-icon v-else class="avatar-uploader-icon">
  296. <Plus />
  297. </el-icon>
  298. </el-upload>
  299. <el-text class="picText">仅支持.jpg .png格式文件 1 MB</el-text>
  300. </div>
  301. </el-form-item>
  302. <el-form-item label="备注">
  303. <el-input disabled="true" v-model="editFormData.remark" type="textarea" :rows="4"
  304. placeholder="备注" maxlength="100" show-word-limit />
  305. </el-form-item>
  306. </el-form>
  307. </div>
  308. <div class="right">
  309. <!-- 总部财务可编辑项仅到账相关信息 -->
  310. <el-form ref="editFormRef" :rules="editFormRule" :model="editFormData" class="editFormRighrt"
  311. label-width="4.5vw" label-position="left">
  312. <el-form-item label="到账货币" required>
  313. <CurrencySelect v-model="editFormData.receivedCurrency" :items="customOptions"
  314. placeholder="请选择到账货币" />
  315. </el-form-item>
  316. <el-form-item label="到账金额" prop="receivedAmount">
  317. <el-input v-model="editFormData.receivedAmount" placeholder="请输入到账金额" type="number" />
  318. </el-form-item>
  319. <el-form-item label="手续费" prop="handlingCharge">
  320. <el-input v-model="editFormData.handlingCharge" placeholder="请输入手续费" type="number" />
  321. </el-form-item>
  322. <el-form-item label="到账时间" required>
  323. <el-date-picker type="datetime" v-model="editFormData.receivedTime" placeholder="请选择到账时间" />
  324. </el-form-item>
  325. </el-form>
  326. <span class="editBtns">
  327. <button class="editBtn1" @click="closeEditForm">
  328. <text class="txt">取消</text>
  329. </button>
  330. <button class="editBtn2" @click="throttledsubmitEditForm">
  331. <text class="txt">提交</text>
  332. </button>
  333. </span>
  334. </div>
  335. </div>
  336. </el-dialog>
  337. <!-- 新增退款 -->
  338. <el-dialog v-model="refundDialog" title="退款" class="refundDialog" overflow draggable style="width: 40vw;"
  339. :before-close="closeRefundForm">
  340. <div style="display: flex;">
  341. <div class="left">
  342. <div class="add-item">
  343. <el-text style="width:4vw;">精网号</el-text>
  344. <el-input v-model="refundFormData.jwcode" style="width:10vw;" disabled />
  345. </div>
  346. <div class="add-item">
  347. <el-text style="width:4vw;">客户姓名</el-text>
  348. <el-input v-model="refundFormData.name" style="width:10vw;" disabled />
  349. </div>
  350. <div class="add-item">
  351. <el-text style="width:4vw;">所属地区</el-text>
  352. <el-input v-model="refundFormData.marketName" style="width:10vw;" disabled />
  353. </div>
  354. <div class="add-item">
  355. <el-text style="width:4vw;">活动名称</el-text>
  356. <el-input v-model="refundFormData.activity" style="width:10vw;" disabled />
  357. </div>
  358. <div class="add-item">
  359. <el-text style="width:4vw;">产品名称</el-text>
  360. <el-input v-model="refundFormData.goodsName" style="width:10vw;" disabled />
  361. </div>
  362. <div v-show="!isRefundGold" class="add-item">
  363. <el-text style="width:4vw;">产品数量</el-text>
  364. <el-input style="padding-right: 10px; width:6.5vw;" v-model="refundFormData.goodNum"
  365. placeholder="请输入产品数量" disabled />
  366. <CurrencySelect disabled="true" v-model="refundFormData.numUnit" :items="numUnitList"
  367. style=" width: 3.5vw;" placeholder="单位" />
  368. </div>
  369. <div v-show="isRefundGold" style="display: flex; margin-bottom: 10px;">
  370. <div style=" display: flex; align-items: center;justify-content: center; ">
  371. <span style="color: #999999; white-space: nowrap;">永久金币</span>
  372. <el-input style="padding-right: 10px; height: 30px; width: 70px;"
  373. v-model="refundFormData.permanentGold" disabled />
  374. </div>
  375. <div style=" display: flex; align-items: center;justify-content: center; ">
  376. <span style="color: #999999; white-space: nowrap;">免费金币</span>
  377. <el-input style="padding-right: 10px; height: 30px; width: 70px;"
  378. v-model="refundFormData.freeGold" disabled />
  379. </div>
  380. </div>
  381. <div class="add-item">
  382. <el-text style="width:4vw;">付款币种</el-text>
  383. <el-input v-model="refundFormData.paymentCurrency" style="width:10vw;" disabled />
  384. </div>
  385. <div class="add-item">
  386. <el-text style="width:4vw;">付款金额</el-text>
  387. <el-input v-model="refundFormData.paymentAmount" style="width:10vw;" disabled />
  388. </div>
  389. <div class="add-item">
  390. <el-text style="width:4vw;">支付方式</el-text>
  391. <el-input v-model="refundFormData.payType" style="width:10vw;" disabled />
  392. </div>
  393. <div class="add-item">
  394. <el-text style="width:4vw;">付款时间</el-text>
  395. <el-date-picker v-model="refundFormData.payTime" type="datetime" style="width:10vw;" disabled />
  396. </div>
  397. <div class="add-item">
  398. <el-text style="width:4vw;" size="small">转账凭证</el-text>
  399. <el-form-item :rules="{ required: true, message: '请上传图片', trigger: 'change' }">
  400. <el-upload ref="uploadRef" :auto-upload="false" list-type="picture-card"
  401. :show-file-list="false">
  402. <template #default>
  403. <img v-if="refundFormData.voucher" :src="refundFormData.voucher"
  404. style="width: 100%; height: 100%; object-fit: cover;">
  405. <el-icon v-else>
  406. <Plus />
  407. </el-icon>
  408. </template>
  409. </el-upload>
  410. </el-form-item>
  411. </div>
  412. <div class="add-item">
  413. <el-text style="width:4vw;">备注</el-text>
  414. <el-input v-model="refundFormData.remark" style="width:10vw;" :rows="2" type="textarea"
  415. maxLength="100" disabled show-word-limit />
  416. </div>
  417. </div>
  418. <div class="right">
  419. <div class="add-item">
  420. <el-text style="width:4vw;">退款模式</el-text>
  421. <el-radio-group v-model="refundFormData.refundModel">
  422. <el-radio value="0">全部退款</el-radio>
  423. <el-radio value="1">部分退款</el-radio>
  424. </el-radio-group>
  425. </div>
  426. <div v-show="refundFormData.refundModel == '1'" style="display: flex; margin-bottom: 10px;">
  427. <div style=" display: flex; align-items: center;justify-content: center; ">
  428. <span style="color: #999999; white-space: nowrap;">永久金币</span>
  429. <el-input style="padding-right: 10px; height: 30px; width: 70px;"
  430. v-model="refundFormData.partRefundGold" dsabled />
  431. </div>
  432. <div style=" display: flex; align-items: center;justify-content: center; ">
  433. <span style="color: #999999; white-space: nowrap;">免费金币</span>
  434. <el-input style="padding-right: 10px; height: 30px; width: 70px;"
  435. v-model="refundFormData.partRefundFree" />
  436. </div>
  437. </div>
  438. <div class="add-item">
  439. <el-text style="width:4vw;">退款理由</el-text>
  440. <el-input v-model="refundFormData.refundReason" style="width:10vw;" :rows="5" maxlength="150"
  441. show-word-limit type="textarea" />
  442. </div>
  443. <div>ps:请在退款理由表明用户的退款需求</div>
  444. <div style="display:flex;justify-content: center;margin-top: 5vh;">
  445. <el-button type="default" @click="resetRefund">重置</el-button>
  446. <el-button type="primary" @click="throttledsubmitRefund">提交</el-button>
  447. </div>
  448. </div>
  449. </div>
  450. </el-dialog>
  451. <!-- 导出列表 -->
  452. <el-dialog v-model="exportListVisible" title="导出列表" width="60vw">
  453. <el-table :data="exportList" style="width: 100% ;height: 60vh;" :loading="exportListLoading">
  454. <el-table-column prop="fileName" label="文件名" />
  455. <el-table-column prop="state" label="状态">
  456. <template #default="scope">
  457. <el-tag :type="getTagType(scope.row.state)" :effect="scope.row.state === 3 ? 'light' : 'plain'">
  458. {{ getTagText(scope.row.state) }}
  459. </el-tag>
  460. </template>
  461. </el-table-column>
  462. <el-table-column prop="createTime" label="创建时间">
  463. <template #default="scope">
  464. {{ moment(scope.row.createTime).format('YYYY-MM-DD HH:mm:ss') }}
  465. </template>
  466. </el-table-column>
  467. <el-table-column label="操作">
  468. <template #default="scope">
  469. <el-button type="primary" size="small" @click="downloadExportFile(scope.row)"
  470. :disabled="scope.row.state !== 2">
  471. 下载
  472. </el-button>
  473. </template>
  474. </el-table-column>
  475. </el-table>
  476. <template #footer>
  477. <div class="dialog-footer">
  478. <el-button text @click="exportListVisible = false">关闭</el-button>
  479. </div>
  480. </template>
  481. </el-dialog>
  482. </div>
  483. </template>
  484. <script setup>
  485. // 仅导入总部财务所需依赖
  486. import { ref, watch, onMounted } from 'vue';
  487. import { storeToRefs } from 'pinia';
  488. import { ElMessage, ElMessageBox } from 'element-plus';
  489. import API from '@/util/http.js';
  490. import request from '@/util/http.js';
  491. import moment from 'moment';
  492. import _ from 'lodash';
  493. import { Plus } from '@element-plus/icons-vue';
  494. import { startsWith } from './utils/util.js'
  495. // 总部财务专属组件
  496. import CurrencySelect from '@/components/MoneyManage/CurrencySelect.vue';
  497. // 静态数据与规则(仅保留必要项)
  498. import { editFormRule } from './utils/recriveFormRules.js';
  499. import { productList, MarketNameForId, CurrencyForId, marketList } from './utils/staticData.js';
  500. import { useAdminStore } from '@/store/index.js';
  501. import { hasMenuPermission } from '@/utils/menuTreePermission.js';
  502. // ===================== 1. 核心状态管理(仅总部财务) =====================
  503. const adminStore = useAdminStore();
  504. const { menuTree } = storeToRefs(adminStore);
  505. // 表格与分页数据
  506. const tableData = ref([]);
  507. const total = ref(0);
  508. const pageInfo = ref({ pageSize: 10, pageNum: 1 });
  509. // 搜索条件
  510. const searchData = ref({});
  511. const defaultTime = [new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 2, 1, 23, 59, 59)];
  512. const getTime = ref([]);
  513. // 标签页
  514. const activeTab = ref('pass');
  515. // 编辑弹窗状态
  516. const editFormisible = ref(false);
  517. const editFormData = ref({});
  518. const editFormRef = ref(null);
  519. const isEditGold = ref(false); // 金币产品标记
  520. const ifOnline = ref(false); // 在线支付标记
  521. // 辅助状态:图片上传、悬浮提示
  522. const uploadRef = ref(null);
  523. const showTooltip = ref(false);
  524. const tooltipContent = ref('');
  525. const tooltipLeft = ref(0);
  526. const tooltipTop = ref(0);
  527. // 退款确认弹窗
  528. const refundConfirmDialog = ref(false)
  529. const textContent = ref('')
  530. //退款弹窗
  531. const refundDialog = ref(false)
  532. const refundFormData = ref({})
  533. const openRefundDialog = () => {
  534. refundDialog.value = true
  535. closeConfirmRefund()
  536. }
  537. const closeRefundForm = () => {
  538. refundDialog.value = false
  539. refundFormData.value = {}
  540. }
  541. const isRefundGold = ref(false)
  542. const ifRefundGold = () => {
  543. if (refundFormData.value.goodsName === '金币充值') {
  544. isRefundGold.value = true
  545. refundFormData.value.goodNum = 0
  546. } else {
  547. isRefundGold.value = false
  548. }
  549. }
  550. //导出相关
  551. const exportListVisible = ref(false)
  552. const exportList = ref([])
  553. const exportListLoading = ref(false)
  554. const exportExcel = async function () {
  555. let payCurrencySelect = '';
  556. let goodsName = '';
  557. // 处理时间范围
  558. if (getTime.value && getTime.value.length === 2) {
  559. searchData.value.startTime = moment(getTime.value[0]).format('YYYY-MM-DD HH:mm:ss');
  560. searchData.value.endTime = moment(getTime.value[1]).format('YYYY-MM-DD HH:mm:ss');
  561. } else {
  562. searchData.value.startTime = '';
  563. searchData.value.endTime = '';
  564. }
  565. // 处理产品名称(级联选择取最后一级)
  566. if (searchData.value.goodsName) {
  567. goodsName = searchData.value.goodsName[searchData.value.goodsName.length - 1];
  568. }
  569. // 处理付款币种(转ID)
  570. if (searchData.value.paymentCurrency) {
  571. payCurrencySelect = CurrencyForId(searchData.value.paymentCurrency);
  572. }
  573. const cashRoleId = '2';
  574. const submitterMarket = adminData.value.markets;
  575. searchData.value.status = 46;
  576. const params = {
  577. ...pageInfo.value,
  578. cashCollection: {
  579. ...searchData.value,
  580. submitterId: adminData.value.id,
  581. receivedMarket: MarketNameForId(submitterMarket),
  582. cashRoleId: cashRoleId,
  583. paymentCurrency: payCurrencySelect,
  584. submitterMarket: submitterMarket,
  585. goodsName: goodsName,
  586. market: MarketNameForId(searchData.value.market)
  587. }
  588. }
  589. const res = await API({ url: '/export/exportCash', data: params })
  590. if (res.code === 200) {
  591. ElMessage.success('导出成功')
  592. } else {
  593. ElMessage.error(res.msg || '导出失败')
  594. }
  595. }
  596. const openExportList = () => {
  597. getExportList()
  598. console.log('daoshiu');
  599. exportListVisible.value = true
  600. }
  601. //获取导出列表
  602. const getExportList = async () => {
  603. exportListLoading.value = true
  604. try {
  605. const result = await API({ url: '/export/export' })
  606. if (result.code === 200) {
  607. const filteredData = result.data.filter(item => {
  608. return item.type === 13
  609. })
  610. exportList.value = filteredData
  611. } else {
  612. ElMessage.error(result.msg || '获取导出列表失败')
  613. }
  614. } catch (error) {
  615. console.error('获取导出列表出错:', error)
  616. ElMessage.error('获取导出列表失败,请稍后重试')
  617. } finally {
  618. exportListLoading.value = false
  619. }
  620. }
  621. const downloadExportFile = (item) => {
  622. if (item.state === 2) {
  623. const link = document.createElement('a')
  624. link.href = item.url
  625. link.download = item.fileName
  626. link.click()
  627. } else {
  628. ElMessage.warning('文件还在导出中,请稍后再试')
  629. }
  630. }
  631. //根据状态返回对应的标签类型
  632. const getTagType = (state) => {
  633. switch (state) {
  634. case 0:
  635. return 'info';
  636. case 1:
  637. return 'primary';
  638. case 2:
  639. return 'success';
  640. case 3:
  641. return 'danger';
  642. default:
  643. return 'info';
  644. }
  645. }
  646. //根据状态返回对应的标签文案
  647. const getTagText = (state) => {
  648. switch (state) {
  649. case 0:
  650. return '待执行';
  651. case 1:
  652. return '执行中';
  653. case 2:
  654. return '执行完成';
  655. case 3:
  656. return '执行出错';
  657. default:
  658. return '未知状态';
  659. }
  660. }
  661. // 基础数据
  662. const adminData = ref({});
  663. const activityList = ref([]);
  664. const customOptions = ref(['美元(USD)', '港币(HKD)', '新币(SGD)', '马币(MYR)', '泰铢(THB)', '加币(CAD)', '越南盾(VDN)', '韩元(KRW)']);
  665. const paytypeList = ["Stripe-链接收款", "PaymentAsia-链接收款", "Ipay88-链接收款", "银行转账", "刷卡", "现金", "支票", "Grabpay", "Nets", "E-Transfer", "Paypal"];
  666. const paytypeOptions = ref([...paytypeList]);
  667. // ===================== 2. 核心功能函数(仅总部财务) =====================
  668. //确认退款弹窗
  669. const openRefundConfirm = (row) => {
  670. textContent.value = '将要对该订单退款!'
  671. refundConfirmDialog.value = true
  672. refundFormData.value = { ...row }
  673. ifRefundGold()
  674. console.log(row);
  675. }
  676. const closeConfirmRefund = () => {
  677. refundConfirmDialog.value = false
  678. textContent.value = ''
  679. }
  680. // 2.1 数据加载:获取总部财务订单列表
  681. const getlist = async () => {
  682. try {
  683. let payCurrencySelect = '';
  684. let goodsName = '';
  685. // 处理时间范围
  686. if (getTime.value && getTime.value.length === 2) {
  687. searchData.value.startTime = moment(getTime.value[0]).format('YYYY-MM-DD HH:mm:ss');
  688. searchData.value.endTime = moment(getTime.value[1]).format('YYYY-MM-DD HH:mm:ss');
  689. } else {
  690. searchData.value.startTime = '';
  691. searchData.value.endTime = '';
  692. }
  693. // 处理产品名称(级联选择取最后一级)
  694. if (searchData.value.goodsName) {
  695. goodsName = searchData.value.goodsName[searchData.value.goodsName.length - 1];
  696. }
  697. // 处理付款币种(转ID)
  698. if (searchData.value.paymentCurrency) {
  699. payCurrencySelect = CurrencyForId(searchData.value.paymentCurrency);
  700. }
  701. // 总部财务固定参数:角色ID=1,按标签页筛选状态
  702. const cashRoleId = '2';
  703. const receivedMarket = adminData.value.markets;
  704. if (activeTab.value === 'pass') searchData.value.status = 13;
  705. else if (activeTab.value === 'done') searchData.value.status = 46;
  706. const result = await request({
  707. url: '/cashCollection/selectCollection',
  708. data: {
  709. ...pageInfo.value,
  710. cashCollection: {
  711. ...searchData.value,
  712. submitterId: adminData.value.id,
  713. receivedMarket: MarketNameForId(receivedMarket),
  714. cashRoleId: cashRoleId,
  715. paymentCurrency: payCurrencySelect,
  716. submitterMarket: receivedMarket,
  717. goodsName: goodsName,
  718. market: MarketNameForId(searchData.value.market)
  719. }
  720. }
  721. });
  722. if (result.code === 200) {
  723. tableData.value = result.data.list;
  724. total.value = result.data.total;
  725. } else {
  726. ElMessage.error('订单数据加载失败');
  727. }
  728. } catch (error) {
  729. console.error('总部财务订单列表请求异常:', error);
  730. ElMessage.error('网络异常,请重试');
  731. }
  732. };
  733. //重置退款
  734. const resetRefund = () => {
  735. refundFormData.value.refundModel = ''
  736. refundFormData.value.refundReason = ''
  737. }
  738. //提交退款
  739. const submitRefund = async () => {
  740. try {
  741. if (refundFormData.value.goodsName != '金币充值') {
  742. return ElMessage.error('线上数据仅支持金币充值退款');
  743. }
  744. if (!refundFormData.value.refundModel) {
  745. return ElMessage.error('请选择退款方式');
  746. }
  747. if (!refundFormData.value.refundReason) {
  748. return ElMessage.error('请输入退款原因');
  749. }
  750. if (refundFormData.value.refundModel == 0) {
  751. refundFormData.value.partRefundGold = refundFormData.value.permanentGold,
  752. refundFormData.value.partRefundFree = refundFormData.value.freeGold
  753. }
  754. const result = await request({
  755. url: '/Money/addOnline',
  756. data: {
  757. jwcode: refundFormData.value.jwcode,
  758. name: refundFormData.value.name,
  759. market: refundFormData.value.marketName,
  760. submitterId: adminData.value.id,
  761. submitterMarket: adminData.value.markets,
  762. remark: refundFormData.value.remark,
  763. refundReason: refundFormData.value.refundReason,
  764. refundModel: refundFormData.value.refundModel,
  765. id: refundFormData.value.id,
  766. orderCode: refundFormData.value.orderCode,
  767. permanentGold: (refundFormData.value.permanentGold) * 100 || 0,
  768. freeGold: (refundFormData.value.freeGold) * 100 || 0,
  769. partRefundGold: (refundFormData.value.partRefundGold) * 100 || 0,
  770. partRefundFree: (refundFormData.value.partRefundFree) * 100 || 0,
  771. }
  772. })
  773. if (result.code == 200) {
  774. ElMessage.success('新增退款成功')
  775. getlist()
  776. closeRefundForm()
  777. } else {
  778. ElMessage.error(result.msg)
  779. getlist()
  780. }
  781. console.log('返回参数:', result);
  782. } catch (error) {
  783. console.log(error);
  784. }
  785. }
  786. // 2.2 搜索与重置
  787. const search = () => {
  788. getlist();
  789. ElMessage.success('查询成功');
  790. };
  791. const reset = () => {
  792. searchData.value = {};
  793. // 重置页码
  794. pageInfo.value.pageNum = 1;
  795. getlist();
  796. };
  797. // 2.3 标签页切换
  798. const navigateTo = async (tab) => {
  799. activeTab.value = tab;
  800. await getlist();
  801. };
  802. // 2.4 审核功能
  803. // 打开审核弹窗
  804. const openAuditForm = (row) => {
  805. auditFormData.value = { ...row, market: row.marketName };
  806. ifGold(auditFormData.value)
  807. console.log('isGold', isGold.value);
  808. auditFormisible.value = true;
  809. };
  810. // 关闭审核弹窗
  811. const closeAuditForm = () => {
  812. ifReject.value = false;
  813. auditFormisible.value = false;
  814. auditFormData.value = {};
  815. };
  816. // 审核通过
  817. const handelAudit = async () => {
  818. try {
  819. const result = await request({
  820. url: '/cashAudit/collectionAudit',
  821. data: {
  822. orderCode: auditFormData.value.orderCode,
  823. action: 1,
  824. auditId: adminData.value.id
  825. }
  826. });
  827. if (result.code === 200) {
  828. ElMessage.success('审核通过');
  829. getlist();
  830. closeAuditForm();
  831. } else {
  832. ElMessage.error(result.msg || '审核失败');
  833. }
  834. } catch (error) {
  835. console.error('审核通过请求异常:', error);
  836. ElMessage.error('网络异常,请重试');
  837. }
  838. };
  839. //判断产品类型
  840. const isGold = ref(false)
  841. const ifGold = (data) => {
  842. console.log('data', data);
  843. if (data.goodsName === '金币充值') {
  844. isGold.value = true
  845. } else {
  846. isGold.value = false
  847. }
  848. }
  849. // 2.5 编辑手续费功能
  850. // 打开编辑弹窗
  851. const openEditForm = (row) => {
  852. editFormData.value = { ...row };
  853. // 区分金币产品与普通产品
  854. if (row.goodsName === '金币充值') isEditGold.value = true;
  855. else isEditGold.value = false;
  856. // 在线支付订单允许修改付款信息
  857. if (row.status === 3) ifOnline.value = true;
  858. else ifOnline.value = false;
  859. editFormisible.value = true;
  860. };
  861. // 关闭编辑弹窗
  862. const closeEditForm = () => {
  863. editFormisible.value = false;
  864. editFormData.value = {};
  865. editFormRef.value.resetFields();
  866. };
  867. // 提交编辑(补充手续费)
  868. const submitEditForm = async () => {
  869. try {
  870. await editFormRef.value.validate();
  871. // 处理时间格式
  872. if (editFormData.value.receivedTime) {
  873. editFormData.value.receivedTime = moment(editFormData.value.receivedTime).format('YYYY-MM-DD HH:mm:ss');
  874. }
  875. const result = await request({
  876. url: '/cashCollection/complete',
  877. data: {
  878. orderCode: editFormData.value.orderCode,
  879. handlingCharge: editFormData.value.handlingCharge * 100, // 转为分单位
  880. paymentCurrency: CurrencyForId(editFormData.value.paymentCurrency),
  881. paymentAmount: editFormData.value.paymentAmount * 100, // 转为分单位
  882. receivedCurrency: CurrencyForId(editFormData.value.receivedCurrency),
  883. receivedAmount: editFormData.value.receivedAmount * 100, // 转为分单位
  884. receivedTime: editFormData.value.receivedTime,
  885. receivedRemark: editFormData.value.receivedRemark || ''
  886. }
  887. });
  888. if (result.code === 200) {
  889. ElMessage.success('编辑提交成功');
  890. getlist();
  891. closeEditForm();
  892. } else {
  893. ElMessage.error(result.msg || '提交失败');
  894. }
  895. } catch (error) {
  896. console.error('编辑提交请求异常:', error);
  897. ElMessage.error('表单验证失败,请检查数据格式');
  898. }
  899. };
  900. // 2.6 辅助功能
  901. // 图片预览
  902. const previewImage = (imageUrl) => {
  903. if (!imageUrl) return;
  904. const imageElement = document.createElement('img');
  905. imageElement.src = imageUrl;
  906. imageElement.style.maxWidth = '80vw';
  907. imageElement.style.maxHeight = '80vh';
  908. imageElement.style.objectFit = 'contain';
  909. const viewer = document.createElement('div');
  910. viewer.style.position = 'fixed';
  911. viewer.style.top = '0';
  912. viewer.style.left = '0';
  913. viewer.style.width = '100vw';
  914. viewer.style.height = '100vh';
  915. viewer.style.backgroundColor = 'rgba(0, 0, 0, 0.7)';
  916. viewer.style.display = 'flex';
  917. viewer.style.justifyContent = 'center';
  918. viewer.style.alignItems = 'center';
  919. viewer.style.zIndex = '9999';
  920. viewer.appendChild(imageElement);
  921. // 点击关闭预览
  922. viewer.addEventListener('click', () => {
  923. document.body.removeChild(viewer);
  924. });
  925. document.body.appendChild(viewer);
  926. };
  927. // 2.7 基础数据加载(初始化)
  928. // 获取管理员信息
  929. const getAdminData = async () => {
  930. try {
  931. const result = await API({ url: '/admin/userinfo', data: {} });
  932. adminData.value = result;
  933. // 超级管理员判断(仅用于角色切换权限)
  934. if (adminData.value.roleId === 2) {
  935. // 管理员所属地区提示
  936. if (adminData.value.markets === '总部' || adminData.value.markets === '研发部') {
  937. ElMessageBox.alert(
  938. '管理员账号仅显示所属地区的财务数据,请确认地区设置',
  939. '温馨提示',
  940. { type: 'warning' }
  941. );
  942. }
  943. }
  944. } catch (error) {
  945. console.error('管理员信息获取失败:', error);
  946. ElMessage.error('管理员信息加载异常');
  947. }
  948. };
  949. // 获取活动列表
  950. const getActivitys = async () => {
  951. try {
  952. const result = await API({ url: '/cashCollection/getActivityList', data: {} });
  953. if (result.code === 200) {
  954. activityList.value = result.data;
  955. } else {
  956. ElMessage.error('活动列表加载失败');
  957. }
  958. } catch (error) {
  959. console.error('活动列表获取失败:', error);
  960. ElMessage.error('活动数据加载异常');
  961. }
  962. };
  963. // 2.8 节流函数(防止重复提交)
  964. const throttledsubmitEditForm = _.throttle(submitEditForm, 3000, { trailing: false });
  965. const throttledsubmitRefund = _.throttle(submitRefund, 5000, {
  966. trailing: false
  967. })
  968. // 2.9 页面初始化
  969. onMounted(async () => {
  970. await getAdminData();
  971. await getActivitys();
  972. // 初始化加载总部财务订单数据
  973. await getlist();
  974. // 菜单权限校验(确保总部财务权限)
  975. if (!hasMenuPermission(menuTree.value, 91)) {
  976. ElMessageBox.alert(
  977. '您暂无该页面操作权限,请联系管理员',
  978. '权限提示',
  979. { type: 'error' }
  980. ).then(() => {
  981. window.history.back();
  982. });
  983. }
  984. //背景预加载
  985. const bgImg = new Image();
  986. bgImg.src = '/src/assets/receive-recall.png';
  987. });
  988. // 2.10 未使用函数占位(避免报错)
  989. const beforeUpload = () => true;
  990. const handelImgErr = () => { };
  991. const handleImageChange = () => { };
  992. const customUpload = () => { };
  993. const handleDatePickerChange = () => { };
  994. const disabledDate = () => false;
  995. const handleSortChange = () => { };
  996. const handlePagination = (type, val) => {
  997. if (type === 'size') pageInfo.value.pageSize = val;
  998. else pageInfo.value.pageNum = val;
  999. getlist();
  1000. };
  1001. </script>
  1002. <style scoped lang="scss">
  1003. .content {
  1004. height: 100%;
  1005. width: 80vw;
  1006. .card1 {
  1007. width: 100%;
  1008. background: #F3FAFE;
  1009. .rowItem {
  1010. display: flex;
  1011. width: 15vw;
  1012. align-items: center;
  1013. justify-content: center;
  1014. margin-right: 0.5vw;
  1015. }
  1016. el-button {
  1017. margin-left: 10px;
  1018. }
  1019. .row1 {
  1020. height: 4vh;
  1021. width: 80vw;
  1022. display: flex;
  1023. min-height: 40px;
  1024. }
  1025. .row2 {
  1026. height: 4vh;
  1027. width: 80vw;
  1028. display: flex;
  1029. align-items: center;
  1030. min-height: 40px;
  1031. .left {
  1032. height: 4vh;
  1033. width: 58vw;
  1034. display: flex;
  1035. min-height: 40px;
  1036. }
  1037. }
  1038. }
  1039. .div-card2 {
  1040. width: 100%;
  1041. margin-top: 2vh;
  1042. .card2 {
  1043. background: #E7F4FD;
  1044. }
  1045. .btns {
  1046. display: flex;
  1047. align-items: center;
  1048. justify-content: space-between;
  1049. padding-bottom: 10px;
  1050. .tabs {
  1051. min-width: 300px;
  1052. .btnItem {
  1053. margin-left: 10px;
  1054. border-radius: 5px;
  1055. }
  1056. }
  1057. }
  1058. .table {
  1059. margin: 10px;
  1060. border-radius: 20px;
  1061. .ellipsis-container {
  1062. position: relative;
  1063. width: 100%;
  1064. .ellipsis-text {
  1065. display: inline-block;
  1066. width: 100%;
  1067. white-space: nowrap;
  1068. overflow: hidden;
  1069. text-overflow: ellipsis;
  1070. cursor: pointer;
  1071. }
  1072. .custom-tooltip {
  1073. position: fixed;
  1074. z-index: 9999;
  1075. padding: 8px 12px;
  1076. width: 200px;
  1077. background-color: #E4F0FC;
  1078. color: #333333;
  1079. border: 1px solid #e5e7eb;
  1080. border-radius: 4px;
  1081. box-shadow: 0 2px 12px rgba(0, 0, 0, 0.1);
  1082. min-height: 30px;
  1083. max-height: 300px;
  1084. overflow-y: auto;
  1085. font-size: 14px;
  1086. line-height: 1.5;
  1087. }
  1088. }
  1089. }
  1090. .pagination {
  1091. margin-top: 10px;
  1092. padding: 10px 10px;
  1093. }
  1094. }
  1095. :deep(.adddialog) {
  1096. min-width: 500px;
  1097. background-color: #F3FAFE !important;
  1098. margin-top: 8vh;
  1099. border-radius: 8px;
  1100. .addForm {
  1101. padding: 0 60px 1vh 60px;
  1102. .el-date-editor {
  1103. display: flex;
  1104. flex: 1;
  1105. }
  1106. .pic {
  1107. display: flex;
  1108. align-items: center;
  1109. .uploader {
  1110. height: 80px;
  1111. width: 80px;
  1112. .el-upload {
  1113. height: 100%;
  1114. width: 100%;
  1115. }
  1116. }
  1117. .picText {
  1118. color: #999999;
  1119. font-family: "PingFang SC";
  1120. font-size: 10px;
  1121. font-style: normal;
  1122. font-weight: 400;
  1123. line-height: 20px;
  1124. margin-left: 10px;
  1125. }
  1126. }
  1127. }
  1128. .dialog-footer {
  1129. display: flex;
  1130. justify-content: center;
  1131. padding-bottom: 1.5vh;
  1132. }
  1133. }
  1134. :deep(.editdialog) {
  1135. min-width: 990px;
  1136. background-color: #F3FAFE !important;
  1137. margin-top: 8vh;
  1138. border-radius: 8px;
  1139. .editForm {
  1140. padding: 0 60px 1vh 60px;
  1141. .el-date-editor {
  1142. display: flex;
  1143. flex: 1;
  1144. }
  1145. .pic {
  1146. display: flex;
  1147. align-items: center;
  1148. .uploader {
  1149. height: 80px;
  1150. width: 80px;
  1151. .el-upload {
  1152. height: 100%;
  1153. width: 100%;
  1154. }
  1155. }
  1156. .picText {
  1157. color: #999999;
  1158. font-family: "PingFang SC";
  1159. font-size: 10px;
  1160. font-style: normal;
  1161. font-weight: 400;
  1162. line-height: 20px;
  1163. margin-left: 10px;
  1164. }
  1165. }
  1166. }
  1167. .content {
  1168. display: flex;
  1169. height: 100%;
  1170. width: 100%;
  1171. .left {
  1172. min-width: 500px;
  1173. }
  1174. .right {
  1175. flex: 1;
  1176. .editFormRighrt {
  1177. padding: 0 60px 0 40px;
  1178. .el-date-editor {
  1179. display: flex;
  1180. flex: 1;
  1181. }
  1182. }
  1183. .editBtns {
  1184. display: flex;
  1185. justify-content: center;
  1186. margin-top: 60px;
  1187. .txt {
  1188. color: #f3fafe;
  1189. text-align: center;
  1190. font-family: "PingFang SC";
  1191. font-size: 14px;
  1192. font-style: normal;
  1193. font-weight: 700;
  1194. line-height: 22px;
  1195. }
  1196. .editBtn1 {
  1197. min-width: 80px;
  1198. padding: 5px 12px;
  1199. justify-content: center;
  1200. align-items: center;
  1201. gap: 4px;
  1202. border-radius: 4px;
  1203. background: #7E91FF;
  1204. border: none;
  1205. box-shadow: 0 0 4px 0 #00000040;
  1206. }
  1207. .editBtn2 {
  1208. display: flex;
  1209. width: 80px;
  1210. min-width: 80px;
  1211. padding: 5px 12px;
  1212. justify-content: center;
  1213. align-items: center;
  1214. gap: 4px;
  1215. border-radius: 4px;
  1216. background: #2741DE;
  1217. border: none;
  1218. box-shadow: 0 0 4px 0 #00000040;
  1219. margin-left: 60px;
  1220. }
  1221. }
  1222. }
  1223. }
  1224. }
  1225. :deep(.adddialog .el-form-item__label) {
  1226. min-width: 80px;
  1227. width: auto;
  1228. font-weight: 800;
  1229. padding-bottom: 15px;
  1230. }
  1231. .refundDialog {
  1232. .left {
  1233. width: 50%;
  1234. height: 70vh;
  1235. min-height: 700px;
  1236. padding: 0 2vw;
  1237. .add-item {
  1238. display: flex;
  1239. align-items: center;
  1240. margin-bottom: 1vh;
  1241. }
  1242. .image {
  1243. width: 4vw !important;
  1244. height: 4vw !important;
  1245. }
  1246. }
  1247. .right {
  1248. width: 50%;
  1249. height: 50vh;
  1250. .add-item {
  1251. display: flex;
  1252. align-items: center;
  1253. margin-bottom: 1vh;
  1254. }
  1255. }
  1256. }
  1257. }
  1258. // 表格样式统一
  1259. :deep(.el-table__header-wrapper),
  1260. :deep(.el-table__body-wrapper),
  1261. :deep(.el-table__cell),
  1262. :deep(.el-table__body td) {
  1263. background-color: #F3FAFE !important;
  1264. }
  1265. :deep(.el-table__header th) {
  1266. background-color: #F3FAFE !important;
  1267. }
  1268. :deep(.el-table__row:hover > .el-table__cell) {
  1269. background-color: #E5EBFE !important;
  1270. }
  1271. // 驳回理由弹窗样式
  1272. .reject-reason-box {
  1273. --el-message-box-height: 500px;
  1274. }
  1275. .reject-reason-box .el-message-box__content {
  1276. max-height: 350px;
  1277. overflow-y: auto;
  1278. white-space: pre-wrap;
  1279. }
  1280. .recallDialog {
  1281. //撤回弹窗提示
  1282. height: 392px;
  1283. width: 700px;
  1284. background-image: url('/src/assets/receive-recall.png');
  1285. position: fixed; // 固定定位,相对于浏览器窗口
  1286. top: 50%; // 距离顶部50%
  1287. left: 50%; // 距离左侧50%
  1288. transform: translate(-50%, -50%); // 向左、向上平移自身宽高的50%,实现居中
  1289. z-index: 1000; // 确保在其他元素上层显示
  1290. .close {
  1291. position: absolute;
  1292. left: 625px;
  1293. top: 20px;
  1294. height: 38px;
  1295. width: 38px;
  1296. opacity: 0;
  1297. .Btn {
  1298. height: 100%;
  1299. width: 100%;
  1300. border-radius: 10px;
  1301. }
  1302. }
  1303. .text {
  1304. position: absolute;
  1305. left: 185px;
  1306. top: 190px;
  1307. height: 67px;
  1308. width: 500px;
  1309. .txt {
  1310. height: 100%;
  1311. width: 100%;
  1312. color: #001a42;
  1313. font-family: "PingFang SC";
  1314. font-size: 48px;
  1315. font-style: normal;
  1316. font-weight: 900;
  1317. line-height: normal;
  1318. }
  1319. }
  1320. .cancle {
  1321. position: absolute;
  1322. left: 185px;
  1323. top: 304px;
  1324. height: 55px;
  1325. width: 150px;
  1326. opacity: 0;
  1327. .Btn {
  1328. height: 100%;
  1329. width: 100%;
  1330. border-radius: 20px;
  1331. }
  1332. }
  1333. .confirm {
  1334. position: absolute;
  1335. left: 375px;
  1336. top: 304px;
  1337. height: 55px;
  1338. width: 150px;
  1339. opacity: 0;
  1340. .Btn {
  1341. height: 100%;
  1342. width: 100%;
  1343. border-radius: 20px;
  1344. }
  1345. }
  1346. }
  1347. </style>