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.

2191 lines
87 KiB

2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
1 month ago
2 months ago
2 months ago
1 month ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
1 month ago
2 months ago
2 months ago
2 months ago
1 month ago
1 month ago
2 months ago
1 month ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
1 month ago
2 months ago
2 months ago
2 months ago
2 months ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
2 months ago
1 month ago
2 months ago
1 month ago
2 months ago
1 month ago
1 month ago
2 months ago
1 month ago
1 month ago
2 months ago
1 month ago
2 months ago
1 month ago
2 months ago
2 months ago
2 months ago
1 month ago
2 months ago
2 months ago
1 month ago
2 months ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
2 months ago
1 month ago
2 months ago
1 month ago
2 months ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
2 months ago
1 month ago
2 months ago
2 months ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
2 months ago
1 month ago
2 months ago
1 month ago
2 months ago
2 months ago
1 month ago
2 months ago
1 month ago
2 months ago
1 month ago
2 months ago
1 month ago
2 months ago
1 month ago
2 months ago
1 month ago
1 month ago
2 months ago
1 month ago
2 months ago
2 months ago
1 month ago
2 months ago
1 month ago
2 months ago
1 month ago
2 months ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
2 months ago
1 month ago
1 month ago
2 months ago
2 months ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
2 months ago
2 months ago
2 months ago
1 month ago
1 month ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
1 month ago
1 month ago
1 month ago
1 month ago
2 months ago
1 month ago
2 months ago
1 month ago
2 months ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
2 months ago
2 months ago
1 month ago
1 month ago
2 months ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
1 month ago
1 month ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
1 month ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
2 months ago
1 month ago
1 month ago
1 month ago
1 month ago
2 months ago
1 month ago
2 months ago
1 month ago
2 months ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
2 months ago
1 month ago
2 months ago
2 months ago
1 month ago
1 month ago
2 months ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
2 months ago
2 months ago
2 months ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
2 months ago
2 months ago
2 months ago
2 months ago
1 month ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
1 month ago
  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="row">
  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. <div v-if="kefu" class="rowItem">
  23. <el-text style="width: 4vw;">订单状态</el-text>
  24. <el-select v-model="searchData.status" placeholder="请选择订单状态" style="width: 10vw;" clearable>
  25. <el-option v-for="item in statusList" :key="item.name" :label="item.name"
  26. :value="item.value" /></el-select>
  27. </div>
  28. <div v-if="!kefu" class="rowItem">
  29. <el-text style="width: 4vw;">付款币种</el-text>
  30. <el-select v-model="searchData.paymentCurrency" placeholder="请选择付款币种" style="width: 10vw;"
  31. clearable>
  32. <el-option v-for="item in customOptions" :key="item" :label="item"
  33. :value="item" /></el-select>
  34. </div>
  35. <div class="rowItem">
  36. <el-text style="width: 4vw;">支付方式</el-text>
  37. <el-select v-model="searchData.payType" placeholder="请选择支付方式" style="width: 10vw;" clearable>
  38. <el-option v-for="item in paytypeList" :key="item" :label="item" :value="item" />
  39. </el-select>
  40. </div>
  41. </div>
  42. <div class="row" style="margin-top: 10px;">
  43. <div class="rowItem">
  44. <el-text style="width: 4vw;">活动名称</el-text>
  45. <el-select v-model="searchData.activity" placeholdert="请选择活动方式" style="width: 10vw;" clearable>
  46. <el-option v-for="item in activityList" :key="item" :label="item" :value="item" />
  47. </el-select>
  48. </div>
  49. <div class="rowItem">
  50. <el-text style="width: 4vw;">产品名称</el-text>
  51. <el-cascader v-model="searchData.goodsName" :options="productList" style="width: 10vw;"
  52. clearable />
  53. </div>
  54. <div class="rowItem" style="width: 30vw">
  55. <el-text style="width: 4vw; margin-left: 0.5vw;">付款时间</el-text>
  56. <el-date-picker v-model="getTime" type="datetimerange" range-separator=""
  57. start-placeholder="起始时间" end-placeholder="结束时间" style="width: 22vw; "
  58. @change="handleDatePickerChange" :default-time="defaultTime"
  59. :disabled-date="disabledDate" />
  60. </div>
  61. <div v-if="!superAdmin" class="buttons">
  62. <el-button type="primary" @click="search">查询</el-button>
  63. <el-button type="success" @click="reset">重置</el-button>
  64. <!-- <el-button type="primary">导出excel</el-button>
  65. <el-button type="primary" style="background-color: #5870FF;">导出列表</el-button> -->
  66. </div>
  67. </div>
  68. <div v-if="superAdmin" class="row" style="margin-top: 10px;">
  69. <div class="buttons">
  70. <el-button type="primary" @click="search">查询</el-button>
  71. <el-button type="success" @click="reset">重置</el-button>
  72. <!-- <el-button type="primary">导出excel</el-button>
  73. <el-button type="primary" style="background-color: #5870FF;">导出列表</el-button> -->
  74. <el-button v-if="superAdmin" type="primary" @click="checkKefu">切换客服</el-button>
  75. <el-button v-if="superAdmin" type="success" @click="checkCaiwu">切换地区财务</el-button>
  76. <el-button v-if="superAdmin" type="success" @click="checkHqCaiwu">切换总部财务</el-button>
  77. </div>
  78. </div>
  79. </el-card>
  80. </div>
  81. <div class="div-card2">
  82. <el-card class="card2">
  83. <div class="btns">
  84. <div class="tabs" v-if="caiwu || HQcaiwu">
  85. <el-button-group>
  86. <el-button class="btnItem" v-if="caiwu"
  87. :style="{ backgroundColor: activeTab === 'wait' ? '#2741DE' : '#E5EBFE', color: activeTab === 'wait' ? 'white' : '#666' }"
  88. @click="navigateTo('wait')">
  89. 待审核
  90. </el-button>
  91. <el-button class="btnItem"
  92. :style="{ backgroundColor: activeTab === 'pass' ? '#2741DE' : '#E5EBFE', color: activeTab === 'pass' ? 'white' : '#666' }"
  93. @click="navigateTo('pass')">
  94. 已通过
  95. </el-button>
  96. <el-button class="btnItem"
  97. :style="{ backgroundColor: activeTab === 'done' ? '#2741DE' : '#E5EBFE', color: activeTab === 'done' ? 'white' : '#666' }"
  98. @click="navigateTo('done')">
  99. 已完成
  100. </el-button>
  101. <el-button class="btnItem" v-if="caiwu"
  102. :style="{ backgroundColor: activeTab === 'reject' ? '#2741DE' : '#E5EBFE', color: activeTab === 'reject' ? 'white' : '#666' }"
  103. @click="navigateTo('reject')">
  104. 已驳回
  105. </el-button>
  106. </el-button-group>
  107. </div>
  108. <div class="btnAdd">
  109. <el-button @click="openAddForm" type="success" v-if="kefu">添加收款</el-button>
  110. </div>
  111. </div>
  112. <div class="table">
  113. <el-table :data="tableData" style="width: 80vw;height:54vh;" @sort-change="handleSortChange"
  114. :row-style="{ height: '60px' }" :header-cell-style="{ textAlign: 'center' }"
  115. :cell-style="{ textAlign: 'center' }">
  116. <el-table-column type="index" label="序号" width="100px" fixed="left">
  117. <template #default="scope">
  118. <span>{{ scope.$index + 1 + (pageInfo.pageNum - 1) * pageInfo.pageSize }}</span>
  119. </template>
  120. </el-table-column>
  121. <el-table-column fixed="left" prop="jwcode" label="Homily ID" width="110px" />
  122. <el-table-column fixed="left" prop="name" label="姓名" width="110px" />
  123. <el-table-column prop="marketName" label="所属地区" width="80px" />
  124. <el-table-column prop="activity" label="活动名称" width="120px" show-overflow-tooltip />
  125. <el-table-column prop="goodsName" label="产品名称" width="120px" />
  126. <el-table-column prop="goodNum" label="产品数量" width="130px">
  127. <template #default="scope">
  128. <span v-if="scope.row.goodsName == '金币充值'">{{ scope.row.permanentGold }}</span>
  129. <span v-else>{{ scope.row.goodNum }}</span>
  130. </template>
  131. </el-table-column>
  132. <el-table-column prop="paymentCurrency" label="付款币种" width="100px">
  133. </el-table-column>
  134. <el-table-column prop="paymentAmount" label="付款金额" width="120px">
  135. </el-table-column>
  136. <el-table-column prop="receivedCurrency" label="到账币种"
  137. v-if="!kefu && activeTab == 'pass' || activeTab == 'done'" width="150px"></el-table-column>
  138. <el-table-column prop="receivedAmount" label="到账金额"
  139. v-if="!kefu && activeTab == 'pass' || activeTab == 'done'" width="150px">
  140. <template #default="scope">
  141. <div v-if="!scope.row.receivedAmount">
  142. <text style="color: #FA5A1E;">待补充</text>
  143. </div>
  144. </template>
  145. </el-table-column>
  146. <el-table-column prop="handlingCharge" label="手续费"
  147. v-if="!kefu && activeTab == 'pass' || activeTab == 'done'" width="150px">
  148. <template #default="scope">
  149. <div v-if="!scope.row.handlingCharge">
  150. <text style="color: #FA5A1E;">待补充</text>
  151. </div>
  152. </template>
  153. </el-table-column>
  154. <el-table-column prop="payType" label="支付方式" width="130px">
  155. </el-table-column>
  156. <el-table-column prop="payTime" label="付款时间" width="180px" />
  157. <el-table-column prop="voucher" label="转账凭证" width="110px">
  158. <template #default="scope">
  159. <div v-if="scope.row.voucher"
  160. style="display: flex; justify-content: center; align-items: center; cursor: pointer;"
  161. @click="previewImage(scope.row.voucher)">
  162. <img :src="scope.row.voucher" alt="支付凭证" style="width: auto; height: 40px;">
  163. </div>
  164. <div v-else
  165. style="display: flex; justify-content: center; align-items: center; height: 40px;">
  166. </div>
  167. </template>
  168. </el-table-column>
  169. <!-- <el-table-column prop="bankCode" label="银行流水订单号" v-if="caiwu && activeTab == 'pass'"
  170. width="150px" show-overflow-tooltip></el-table-column> -->
  171. <el-table-column prop="submitterName" label="提交人" width="150px"
  172. show-overflow-tooltip></el-table-column>
  173. <el-table-column prop="auditName" label="审核人"
  174. v-if="!kefu && activeTab == 'pass' || activeTab == 'reject' || activeTab == 'done'"
  175. width="150px" show-overflow-tooltip></el-table-column>
  176. <el-table-column prop="receivedTime" label="到账时间"
  177. v-if="caiwu && activeTab == 'pass' || activeTab == 'done'" width="180px">
  178. </el-table-column>
  179. <el-table-column prop="remark" label="备注" v-if="activeTab != 'reject'" width="150px"
  180. show-overflow-tooltip></el-table-column>
  181. <el-table-column prop="status" label="订单状态" v-if="activeTab == 'done' && !kefu" width="150px"
  182. show-overflow-tooltip>
  183. <template #default="scope">
  184. <span v-if="scope.row.status == 6">退款</span>
  185. <span v-else>正常</span>
  186. </template>
  187. </el-table-column>
  188. <el-table-column prop="auditTime" label="驳回时间" v-if="activeTab == 'reject' && !kefu"
  189. width="180px" show-overflow-tooltip></el-table-column>
  190. <el-table-column prop="rejectReason" label="驳回理由" v-if="activeTab == 'reject' && !kefu"
  191. width="150px">
  192. <template #default="scope">
  193. <div class="ellipsis-container"
  194. @mouseenter="handleMouseEnter($event, scope.row.rejectReason)"
  195. @mouseleave="handleMouseLeave" @mousemove="handleMouseMove($event)">
  196. <span class="ellipsis-text">
  197. {{ scope.row.rejectReason || '—' }}
  198. </span>
  199. <!-- 自定义提示框 -->
  200. <div v-if="showTooltip && tooltipContent" class="custom-tooltip" :style="{
  201. left: `${tooltipLeft}px`,
  202. top: `${tooltipTop}px`
  203. }">
  204. {{ tooltipContent }}
  205. </div>
  206. </div>
  207. </template>
  208. </el-table-column>
  209. <el-table-column v-if="kefu" fixed="right" prop="status" label="订单状态" width="100px">
  210. <template #default="scope">
  211. <span v-if="scope.row.status == 0">待审核</span>
  212. <span v-else-if="scope.row.status == 1 || scope.row.status == 4">已通过</span>
  213. <span v-else-if="scope.row.status == 2">已驳回</span>
  214. <span v-else-if="scope.row.status == 5">已撤回</span>
  215. <span v-else-if="scope.row.status == 6">退款</span>
  216. <span v-else></span>
  217. </template>
  218. </el-table-column>
  219. <el-table-column fixed="right" label="操作" width="120px"
  220. v-if="activeTab != 'reject' && activeTab != 'done'">
  221. <template #default=scope>
  222. <span v-if="kefu && scope.row.status == 4" style="color: #FA5A1E;"
  223. @click="openConfirm('refund', scope.row)">退款</span>
  224. <span v-else-if="kefu && scope.row.status == 1" style="color: #2741DE;">待填写手续费</span>
  225. <span v-else-if="kefu && scope.row.status == 5" style="color: #2741DE;"
  226. @click="openAddForm(scope.row)">编辑</span>
  227. <span v-else-if="kefu && scope.row.status == 0" style="color: #FA5A1E;"
  228. @click="openConfirm('recall', scope.row)">撤回</span>
  229. <span v-else-if="kefu && scope.row.status == 2" style="color: #FA5A1E;"
  230. @click="openRejectReason(scope.row.rejectReason)">查看驳回理由</span>
  231. <span v-else-if="activeTab == 'wait' && !kefu" style="color: #2741DE;"
  232. @click="openAuditForm(scope.row)">审核</span>
  233. <span
  234. v-else-if="activeTab == 'pass' && !kefu && !(scope.row.status == 6 || scope.row.status == 4)"
  235. style="color: #2741DE;" @click="openEditForm(scope.row)">编辑</span>
  236. </template>
  237. </el-table-column>
  238. </el-table>
  239. </div>
  240. <div class="pagination">
  241. <el-pagination background :page-size="pageInfo.pageSize" :page-sizes="[5, 10, 20, 50, 100]"
  242. layout="total, sizes, prev, pager, next, jumper" :total="total"
  243. @size-change="handlePagination('size', $event)"
  244. @current-change="handlePagination('page', $event)"></el-pagination>
  245. </div>
  246. </el-card>
  247. </div>
  248. <!-- 撤回确认 -->
  249. <div class="recallDialog" v-show="recallDialog">
  250. <div class="close">
  251. <button @click="closeRecall" class="Btn">关闭</button>
  252. </div>
  253. <div class="text">
  254. <text class="txt">{{ textContent }}</text>
  255. </div>
  256. <div class="cancle">
  257. <button @click="closeRecall" class="Btn">取消</button>
  258. </div>
  259. <div class="confirm">
  260. <button @click="handleRecall" class="Btn">确定</button>
  261. </div>
  262. </div>
  263. <!-- 退款确认 -->
  264. <div class="recallDialog" v-show="refundConfirmDialog">
  265. <div class="close">
  266. <button @click="closeConfirmRefund" class="Btn">关闭</button>
  267. </div>
  268. <div class="text">
  269. <text class="txt">{{ textContent }}</text>
  270. </div>
  271. <div class="cancle">
  272. <button @click="closeConfirmRefund" class="Btn">取消</button>
  273. </div>
  274. <div class="confirm">
  275. <button @click="openRefundDialog" class="Btn">确定</button>
  276. </div>
  277. </div>
  278. <!-- 客服新增弹窗 -->
  279. <el-dialog class="adddialog" v-model="addFormisible" width="20vw" :before-close="closeAddForm">
  280. <el-form class="addForm" ref="addFormRef" :rules="addFormRule" :model="addFormData" label-width="4vw"
  281. label-position="left">
  282. <el-form-item label="精网号" required prop="jwcode">
  283. <el-input v-model="addFormData.jwcode" placeholder="请输入精网号" @blur="jwcodeSeachMarket" />
  284. </el-form-item>
  285. <el-form-item label="客户姓名" required prop="name">
  286. <el-input disabled="true" v-model="addFormData.name" placeholder="请输入客户姓名" />
  287. </el-form-item>
  288. <el-form-item label="所属地区" required prop="market">
  289. <el-input disabled="true" v-model="addFormData.market" :value="addFormData.marketName"
  290. placeholder="请输入所属地区" />
  291. </el-form-item>
  292. <el-form-item label="活动名称" required prop="activity">
  293. <el-input v-model="addFormData.activity" placeholder="请输入活动名称" />
  294. </el-form-item>
  295. <el-form-item label="产品名称" required @change="ifGold" prop="goodsName">
  296. <ProductSelect ref="productSelectRef" v-model="addFormData.goodsName"></ProductSelect>
  297. </el-form-item>
  298. <el-form-item v-show="!isGold" label="产品数量" required prop="goodNum">
  299. <div style="padding-right: 50px; display: flex;">
  300. <el-input style="padding-right: 10px;" v-model="addFormData.goodNum" placeholder="请输入产品数量" />
  301. <span style="color: #999999;">{{ productUnit }}</span>
  302. </div>
  303. </el-form-item>
  304. <div v-show="isGold" style="margin-bottom: 15px; display: flex;">
  305. <div style=" display: flex; ">
  306. <span
  307. style="color: #999999; display: flex; white-space: nowrap;align-items: center;">永久金币</span>
  308. <el-input style="padding-right: 10px; padding-left: 10px; height: 30px; width: 110px;"
  309. v-model="addFormData.permanentGold" />
  310. </div>
  311. <div style="padding-right: 5px; display: flex;">
  312. <span
  313. style="color: #999999; display: flex; white-space: nowrap;align-items: center;">免费金币</span>
  314. <el-input style="padding-right: 10px; padding-left: 10px; height: 30px; width: 110px;"
  315. v-model="addFormData.freeGold" />
  316. </div>
  317. </div>
  318. <el-form-item label="付款币种" required prop="paymentCurrency">
  319. <CurrencySelect v-model="addFormData.paymentCurrency" :items="customOptions" placeholder="请选择付款币种"
  320. @change="handleCurrencyChange" />
  321. </el-form-item>
  322. <el-form-item label="付款金额" required prop="paymentAmount">
  323. <el-input v-model="addFormData.paymentAmount" placeholder="请输入付款金额" />
  324. </el-form-item>
  325. <el-form-item label="支付方式" required prop="payType">
  326. <CurrencySelect v-model="addFormData.payType" :items="paytypeOptions" placeholder="请选择支付方式"
  327. @change="ifGroup">
  328. </CurrencySelect>
  329. </el-form-item>
  330. <el-form-item label="到账地区" required prop="receivedMarket">
  331. <CurrencySelect v-model="addFormData.receivedMarket" :items="MoneyAddressOptions"
  332. :disabled="isGroup" placeholder="请选择到账地区">
  333. </CurrencySelect>
  334. </el-form-item>
  335. <el-form-item label="付款时间" required prop="payTime">
  336. <el-date-picker type="datetime" placement="right" v-model="addFormData.payTime"
  337. placeholder="请选择付款时间" />
  338. </el-form-item>
  339. <el-form-item label="转账凭证" required prop="voucher">
  340. <div class="pic">
  341. <el-upload ref="uploadRef" class="uploader" :show-file-list="false" list-type="picture-card"
  342. :auto-upload="false" :before-upload="beforeUpload" :on-error="handelImgErr"
  343. :on-change="handleImageChange" :http-request="customUpload">
  344. <img v-if="addFormData.voucher" :src="addFormData.voucher" class="avatar"
  345. style="height: 100%; width: 100%; object-fit: cover;" />
  346. <el-icon v-else class="avatar-uploader-icon">
  347. <Plus />
  348. </el-icon>
  349. </el-upload>
  350. </div>
  351. </el-form-item>
  352. <el-form-item label="备注" required prop="remark">
  353. <el-input v-model="addFormData.remark" type="textarea" :rows="4" placeholder="请输入备注" maxlength="100"
  354. show-word-limit />
  355. </el-form-item>
  356. </el-form>
  357. <template #footer>
  358. <span class="dialog-footer">
  359. <el-button style="background-color: #7E91FF;" @click="closeAddForm">取消</el-button>
  360. <el-button v-if="addOrEdit == 1" style="background-color: #2741DE; margin-left: 2.5vw;"
  361. type="primary" @click="throttledhandleAddForm">确定</el-button>
  362. <el-button v-else-if="addOrEdit == 2" style="background-color: #2741DE; margin-left: 2.5vw;"
  363. type="primary" @click="throttledhandleEditForm">编辑</el-button>
  364. </span>
  365. </template>
  366. </el-dialog>
  367. <!-- 审核弹窗 -->
  368. <el-dialog class="adddialog" v-model="auditFormisible" width="20vw" :before-close="closeAuditForm">
  369. <el-form class="addForm" label-width="4vw" label-position="left">
  370. <el-form-item label="精网号">
  371. <el-input disabled="true" v-model="auditFormData.jwcode" placeholder="请输入驳回理由" />
  372. </el-form-item>
  373. <el-form-item label="客户姓名">
  374. <el-input disabled="true" v-model="auditFormData.name" placeholder="请输入客户姓名" />
  375. </el-form-item>
  376. <el-form-item label="所属地区">
  377. <el-input disabled="true" v-model="auditFormData.market" />
  378. </el-form-item>
  379. <el-form-item label="活动名称">
  380. <el-input disabled="true" v-model="auditFormData.activity" placeholder="请输入活动名称" />
  381. </el-form-item>
  382. <el-form-item label="产品名称">
  383. <el-select disabled="true" v-model="auditFormData.goodsName" />
  384. </el-form-item>
  385. <el-form-item label="付款币种">
  386. <el-select disabled="true" v-model="auditFormData.paymentCurrency" placeholder="请选择付款币种"
  387. @change="handleCurrencyChange" />
  388. </el-form-item>
  389. <el-form-item label="付款金额">
  390. <el-input disabled="true" v-model="auditFormData.paymentAmount" placeholder="请输入付款金额" />
  391. </el-form-item>
  392. <el-form-item label="支付方式">
  393. <el-select disabled="true" v-model="auditFormData.payType" :items="paytypeOptions"
  394. placeholder="请选择支付方式" />
  395. </el-form-item>
  396. <el-form-item label="到账地区">
  397. <el-select disabled="true" v-model="auditFormData.receivedMarket" placeholder="到账地区" />
  398. </el-form-item>
  399. <el-form-item label="付款时间">
  400. <el-date-picker disabled="true" type="datetime" v-model="auditFormData.payTime"
  401. placeholder="请选择付款时间" />
  402. </el-form-item>
  403. <el-form-item label="转账凭证">
  404. <div class="pic">
  405. <el-upload ref="uploadRef" class="uploader" :show-file-list="false" list-type="picture-card"
  406. :auto-upload="false" :before-upload="beforeUpload" :on-error="handelImgErr"
  407. :on-change="handleImageChange" :http-request="customUpload">
  408. <img v-if="auditFormData.voucher" :src="auditFormData.voucher" class="avatar"
  409. style="height: 100%; width: 100%; object-fit: cover;" />
  410. <el-icon v-else class="avatar-uploader-icon">
  411. <Plus />
  412. </el-icon>
  413. </el-upload>
  414. <el-text class="picText">
  415. 仅支持.jpg .png格式文件 1 MB
  416. </el-text>
  417. </div>
  418. </el-form-item>
  419. <el-form-item label="备注">
  420. <el-input disabled="true" v-model="auditFormData.remark" type="textarea" :rows="3"
  421. placeholder="请输入备注" maxlength="100" show-word-limit />
  422. </el-form-item>
  423. <el-form-item label="驳回理由" v-if="ifReject" required>
  424. <el-input v-model="auditFormData.rejectReason" type="textarea" :rows="3" placeholder="请输入驳回理由"
  425. maxlength="100" show-word-limit />
  426. </el-form-item>
  427. </el-form>
  428. <template #footer>
  429. <span class="dialog-footer" v-if="!ifReject">
  430. <el-button style="background-color: #7E91FF;" @click="ifReject = true">驳回</el-button>
  431. <el-button :style="{
  432. backgroundColor: isBtnDisabled ? '#E5E5E5FF' : '#2741DEFF',
  433. marginLeft: '60px',
  434. color: isBtnDisabled ? '#8A8A8A' : '#F3FAFE'
  435. }" @click="handelAudit" :disabled="isBtnDisabled">{{ btnText }}</el-button>
  436. </span>
  437. <span class="dialog-footer" v-if="ifReject">
  438. <el-button style="background-color: #7E91FF;" @click="closeAuditForm">取消</el-button>
  439. <el-button style="background-color: #2741DE; margin-left: 2.5vw;" type="primary"
  440. @click="throttledhandelAuditReject">确定</el-button>
  441. </span>
  442. </template>
  443. </el-dialog>
  444. <!-- 编辑填手续费弹窗 -->
  445. <el-dialog class="editdialog" v-model="editFormisible" width="20vw" :before-close="closeEditForm">
  446. <div class="content">
  447. <div class="left">
  448. <el-form class="editForm" label-width="4.5vw" label-position="left">
  449. <el-form-item label="精网号">
  450. <el-input disabled="true" v-model="editFormData.jwcode" placeholder="请输入驳回理由" />
  451. </el-form-item>
  452. <el-form-item label="客户姓名">
  453. <el-input disabled="true" v-model="editFormData.name" placeholder="请输入客户姓名" />
  454. </el-form-item>
  455. <el-form-item label="所属地区">
  456. <el-input disabled="true" v-model="editFormData.marketName" placeholder="请输入所属地区" />
  457. </el-form-item>
  458. <el-form-item label="活动名称">
  459. <el-input disabled="true" v-model="editFormData.activity" placeholder="请输入活动名称" />
  460. </el-form-item>
  461. <el-form-item label="产品名称">
  462. <el-select disabled="true" v-model="editFormData.goodsName" placeholder="请选择产品名称"
  463. clearable></el-select>
  464. </el-form-item>
  465. <el-form-item v-show="!isEditGold" label="产品数量">
  466. <div style="padding-right: 50px; display: flex;">
  467. <el-input disabled="true" style="padding-right: 10px;" v-model="editFormData.goodNum"
  468. placeholder="请输入产品数量" />
  469. <span style="color: #999999;"></span>
  470. </div>
  471. </el-form-item>
  472. <div v-show="isEditGold" style="margin-bottom: 15px; display: flex;">
  473. <div style=" display: flex; ">
  474. <span
  475. style="color: #999999; display: flex; white-space: nowrap;align-items: center;">永久金币</span>
  476. <el-input disabled="true"
  477. style="padding-right: 10px; padding-left: 10px; height: 30px; width: 110px;"
  478. v-model="editFormData.permanentGold" />
  479. </div>
  480. <div style="padding-right: 5px; display: flex;">
  481. <span
  482. style="color: #999999; display: flex; white-space: nowrap;align-items: center;">免费金币</span>
  483. <el-input disabled="true"
  484. style="padding-right: 10px; padding-left: 10px; height: 30px; width: 110px;"
  485. v-model="editFormData.freeGold" />
  486. </div>
  487. </div>
  488. <el-form-item label="付款币种">
  489. <CurrencySelect :disabled="!ifOnline" v-model="editFormData.paymentCurrency"
  490. :items="customOptions" placeholder="请选择付款币种" />
  491. </el-form-item>
  492. <el-form-item label="付款金额">
  493. <el-input :disabled="!ifOnline" v-model="editFormData.paymentAmount"
  494. placeholder="请输入付款金额" />
  495. </el-form-item>
  496. <el-form-item label="支付方式">
  497. <el-select disabled="true" v-model="editFormData.payType" placeholder="请选择支付方式"
  498. clearable></el-select>
  499. </el-form-item>
  500. <el-form-item label="到账地区">
  501. <el-select disabled="true" v-model="editFormData.receivedMarket" placeholder="请选择到账地区"
  502. clearable></el-select>
  503. </el-form-item>
  504. <el-form-item label="付款时间">
  505. <el-date-picker disabled="true" type="datetime" v-model="editFormData.payTime"
  506. placeholder="请选择付款时间" />
  507. </el-form-item>
  508. <el-form-item label="转账凭证">
  509. <div class="pic">
  510. <el-upload disabled="true" ref="uploadRef" class="uploader" :show-file-list="false"
  511. list-type="picture-card" :auto-upload="false" :before-upload="beforeUpload"
  512. :on-error="handelImgErr" :on-change="handleImageChange"
  513. :http-request="customUpload">
  514. <img v-if="editFormData.voucher" :src="editFormData.voucher" class="avatar"
  515. style="height: 100%; width: 100%; object-fit: cover;" />
  516. <el-icon v-else class="avatar-uploader-icon">
  517. <Plus />
  518. </el-icon>
  519. </el-upload>
  520. <el-text class="picText">
  521. 仅支持.jpg .png格式文件 1 MB
  522. </el-text>
  523. </div>
  524. </el-form-item>
  525. <el-form-item label="备注">
  526. <el-input disabled="true" v-model="editFormData.remark" type="textarea" :rows="4"
  527. placeholder="请输入驳回理由" maxlength="100" show-word-limit />
  528. </el-form-item>
  529. </el-form>
  530. </div>
  531. <div class="right">
  532. <el-form ref="editFormRef" :rules="editFormRule" :model="editFormData" class="editFormRighrt"
  533. label-width="4.5vw" label-position="left">
  534. <el-form-item label="到账货币">
  535. <CurrencySelect v-model="editFormData.receivedCurrency" :items="customOptions"
  536. placeholder="请选择到账货币" />
  537. </el-form-item>
  538. <el-form-item label="到账金额" prop="receivedAmount">
  539. <el-input v-model="editFormData.receivedAmount" placeholder="请输入到账金额" />
  540. </el-form-item>
  541. <el-form-item label="手续费" prop="handlingCharge">
  542. <el-input v-model="editFormData.handlingCharge" placeholder="请输入手续费" />
  543. </el-form-item>
  544. <!-- <el-form-item label="银行流水订单号">
  545. <el-input v-model="editFormData.jwcode" placeholder="请输入银行流水订单号" />
  546. </el-form-item> -->
  547. <el-form-item label="到账时间">
  548. <el-date-picker type="datetime" v-model="editFormData.receivedTime" placeholder="请输入到账时间" />
  549. </el-form-item>
  550. </el-form>
  551. <span class="editBtns">
  552. <button class="editBtn1" @click="closeEditForm">
  553. <text class="txt">
  554. 取消
  555. </text>
  556. </button>
  557. <button class="editBtn2" @click="throttledsubmitEditForm">
  558. <text class="txt">
  559. 提交
  560. </text>
  561. </button>
  562. </span>
  563. </div>
  564. </div>
  565. </el-dialog>
  566. <!-- 新增退款 -->
  567. <el-dialog v-model="refundDialog" title="退款" class="refundDialog" overflow draggable style="width: 40vw;"
  568. :before-close="closeRefundForm">
  569. <div style="display: flex;">
  570. <div class="left">
  571. <div class="add-item">
  572. <el-text style="width:4vw;">精网号</el-text>
  573. <el-input v-model="refundFormData.jwcode" style="width:10vw;" disabled />
  574. </div>
  575. <div class="add-item">
  576. <el-text style="width:4vw;">客户姓名</el-text>
  577. <el-input v-model="refundFormData.name" style="width:10vw;" disabled />
  578. </div>
  579. <div class="add-item">
  580. <el-text style="width:4vw;">所属地区</el-text>
  581. <el-input v-model="refundFormData.marketName" style="width:10vw;" disabled />
  582. </div>
  583. <div class="add-item">
  584. <el-text style="width:4vw;">活动名称</el-text>
  585. <el-input v-model="refundFormData.activity" style="width:10vw;" disabled />
  586. </div>
  587. <div class="add-item">
  588. <el-text style="width:4vw;">产品名称</el-text>
  589. <el-input v-model="refundFormData.goodsName" style="width:10vw;" disabled />
  590. </div>
  591. <div class="add-item">
  592. <el-text style="width:4vw;">产品数量</el-text>
  593. <el-input v-model="refundFormData.goodNum" style="width:10vw;" disabled />
  594. &nbsp;
  595. </div>
  596. <div class="add-item">
  597. <el-text style="width:4vw;">付款币种</el-text>
  598. <el-input v-model="refundFormData.paymentCurrency" style="width:10vw;" disabled />
  599. </div>
  600. <div class="add-item">
  601. <el-text style="width:4vw;">付款金额</el-text>
  602. <el-input v-model="refundFormData.paymentAmount" style="width:10vw;" disabled />
  603. </div>
  604. <div class="add-item">
  605. <el-text style="width:4vw;">支付方式</el-text>
  606. <el-input v-model="refundFormData.payType" style="width:10vw;" disabled />
  607. </div>
  608. <div class="add-item">
  609. <el-text style="width:4vw;">付款时间</el-text>
  610. <el-date-picker v-model="refundFormData.payTime" type="datetime" style="width:10vw;" disabled />
  611. </div>
  612. <div class="add-item">
  613. <el-text style="width:4vw;" size="small">转账凭证</el-text>
  614. <el-form-item :rules="{ required: true, message: '请上传图片', trigger: 'change' }">
  615. <el-upload ref="uploadRef" :auto-upload="false" list-type="picture-card"
  616. :show-file-list="false">
  617. <template #default>
  618. <img v-if="refundFormData.voucher" :src="refundFormData.voucher"
  619. style="width: 100%; height: 100%; object-fit: cover;">
  620. <el-icon v-else>
  621. <Plus />
  622. </el-icon>
  623. </template>
  624. </el-upload>
  625. </el-form-item>
  626. </div>
  627. <div class="add-item">
  628. <el-text style="width:4vw;">备注</el-text>
  629. <el-input v-model="refundFormData.remark" style="width:10vw;" :rows="3" type="textarea"
  630. maxLength="100" disabled show-word-limit />
  631. </div>
  632. </div>
  633. <div class="right">
  634. <div class="add-item">
  635. <el-text style="width:4vw;">退款模式</el-text>
  636. <el-radio-group v-model="refundFormData.refundModel">
  637. <el-radio value="0">全部退款</el-radio>
  638. <el-radio value="1">部分退款</el-radio>
  639. </el-radio-group>
  640. </div>
  641. <div class="add-item">
  642. <el-text style="width:4vw;">退款理由</el-text>
  643. <el-input v-model="refundFormData.refundReason" style="width:10vw;" :rows="5" maxlength="150"
  644. show-word-limit type="textarea" />
  645. </div>
  646. <div>ps:请在退款理由表明用户的退款需求</div>
  647. <div style="display:flex;justify-content: center;margin-top: 5vh;">
  648. <el-button type="default" @click="">重置</el-button>
  649. <el-button type="primary" @click="throttledsubmitRefund">提交</el-button>
  650. </div>
  651. </div>
  652. </div>
  653. </el-dialog>
  654. </div>
  655. </template>
  656. <script setup>
  657. import { ref, watch, computed, onMounted } from 'vue';
  658. import { storeToRefs } from 'pinia';
  659. import { ElMessage, ElMessageBox } from 'element-plus'
  660. import API from '@/util/http.js'
  661. import { color } from 'echarts';
  662. import { template } from 'lodash';
  663. import CurrencySelect from '@/components/MoneyManage/CurrencySelect.vue'
  664. import ProductSelect from '@/components/MoneyManage/ProductSelect.vue'
  665. import { Search } from '@element-plus/icons-vue';
  666. import request from '@/util/http.js'
  667. import moment from 'moment'
  668. import { useAdminStore } from '@/store/index.js'
  669. import { hasMenuPermission } from '@/utils/menuTreePermission.js'
  670. import { isNode } from 'mathjs';
  671. const adminStore = useAdminStore();
  672. const { menuTree } = storeToRefs(adminStore);
  673. console.log('menutree', menuTree.value);
  674. import _ from 'lodash'
  675. import { addFormRule, editFormRule } from './utils/recriveFormRules.js'
  676. //===================== 查询相关 =================================
  677. const tableData = ref([])
  678. const searchData = ref({
  679. })
  680. const defaultTime = [
  681. new Date(2000, 1, 1, 0, 0, 0),
  682. new Date(2000, 2, 1, 23, 59, 59),
  683. ]
  684. const getTime = ref([])
  685. const search = () => {
  686. getlist()
  687. ElMessage.success('查询成功')
  688. }
  689. const reset = () => {
  690. searchData.value = {}
  691. getTime.value = []
  692. getlist()
  693. }
  694. //获得表格数据接口
  695. const getlist = async () => {
  696. try {
  697. let payCurrencySelect = ''
  698. let goodsName = ''
  699. if (getTime.value && getTime.value.length === 2) {
  700. searchData.value.startTime = moment(getTime.value[0]).format('YYYY-MM-DD HH:mm:ss')
  701. searchData.value.endTime = moment(getTime.value[1]).format('YYYY-MM-DD HH:mm:ss')
  702. }
  703. else {
  704. searchData.value.startTime = ''
  705. searchData.value.endTime = ''
  706. }
  707. if (searchData.value.goodsName) {
  708. goodsName = searchData.value.goodsName[searchData.value.goodsName.length - 1]
  709. }
  710. if (searchData.value.paymentCurrency) {
  711. payCurrencySelect = CurrencyForId(searchData.value.paymentCurrency)
  712. }
  713. //角色id 0:客服 1:地方财务 2:总部财务
  714. let cashRoleId = ''
  715. let receivedMarket = adminData.value.markets
  716. if (kefu.value) {
  717. cashRoleId = '0'
  718. receivedMarket = ''
  719. } else if (caiwu.value) {
  720. cashRoleId = '1'
  721. if (activeTab.value == 'wait') {
  722. searchData.value.status = 0
  723. } else if (activeTab.value == 'pass') {
  724. searchData.value.status = 13
  725. } else if (activeTab.value == 'done') {
  726. searchData.value.status = 46
  727. } else if (activeTab.value == 'reject') {
  728. searchData.value.status = 2
  729. }
  730. } else if (HQcaiwu.value) {
  731. cashRoleId = '2'
  732. console.log('ctiveTab.value', activeTab.value);
  733. if (activeTab.value == 'pass') {
  734. searchData.value.status = 13
  735. } else if (activeTab.value == 'done') {
  736. searchData.value.status = 46
  737. }
  738. }
  739. const result = await request({
  740. url: '/cashCollection/selectCollection',
  741. data: {
  742. ...pageInfo.value,
  743. cashCollection: {
  744. ...searchData.value,
  745. ...getTime.value,
  746. submitterId: adminData.value.id,
  747. receivedMarket: MarketNameForId(receivedMarket),
  748. cashRoleId: cashRoleId,
  749. paymentCurrency: payCurrencySelect,
  750. submitterMarket: receivedMarket,
  751. goodsName: goodsName,
  752. market: MarketNameForId(searchData.value.market)
  753. }
  754. }
  755. })
  756. if (result.code == 200) {
  757. console.log('返回参数:', result);
  758. tableData.value = result.data.list
  759. total.value = result.data.total
  760. } else {
  761. ElMessage.error('数据异常')
  762. console.log(result.msg);
  763. }
  764. } catch (error) {
  765. console.log(error);
  766. }
  767. }
  768. //==================== 标签切换 =========================
  769. const activeTab = ref('wait')
  770. const navigateTo = async (tab) => {
  771. if (tab === 'wait') {
  772. activeTab.value = 'wait'
  773. await getlist()
  774. } else if (tab === 'pass') {
  775. activeTab.value = 'pass'
  776. await getlist()
  777. } else if (tab === 'done') {
  778. activeTab.value = 'done'
  779. await getlist()
  780. }
  781. else if (tab === 'reject') {
  782. activeTab.value = 'reject'
  783. await getlist()
  784. }
  785. }
  786. //角色id 0:客服 1:地方财务 2:总部财务
  787. const cashRoleId = ref('')
  788. const kefu = ref(true)
  789. const caiwu = ref(false)
  790. const HQcaiwu = ref(false)
  791. const superAdmin = ref(false)
  792. const checkKefu = () => {
  793. kefu.value = true
  794. caiwu.value = false
  795. HQcaiwu.value = false
  796. searchData.value = {}
  797. getlist()
  798. }
  799. const checkCaiwu = () => {
  800. kefu.value = false
  801. caiwu.value = true
  802. HQcaiwu.value = false
  803. activeTab.value = 'wait'
  804. searchData.value = {}
  805. getlist()
  806. }
  807. const checkHqCaiwu = () => {
  808. kefu.value = false
  809. caiwu.value = false
  810. HQcaiwu.value = true
  811. activeTab.value = 'pass'
  812. searchData.value = {}
  813. getlist()
  814. }
  815. //================= 客服新增弹窗 ==================
  816. const addFormData = ref({
  817. name: '',
  818. market: '',
  819. permanentGold: 0,
  820. freeGold: 0,
  821. goodsName: ''
  822. })
  823. const addFormRef = ref(null)
  824. const isGold = ref(false)
  825. const isProduct = ref(false)
  826. const selectItems = [
  827. "AI机构追踪",
  828. "AI机构出击",
  829. "AI机构资金",
  830. "AI机活跃度",
  831. "超级机构透视",
  832. "超级机构伏击",
  833. "超级机构猎杀",
  834. "超级机构脉搏",
  835. "超级机构罗盘",
  836. "静态信息费",
  837. "博股会员"
  838. ];
  839. const productUnit = ref('个')
  840. const ifGold = () => {
  841. if (addFormData.value.goodsName == '金币充值') {
  842. isGold.value = true
  843. } else {
  844. isGold.value = false
  845. if (selectItems.includes(addFormData.value.goodsName)) {
  846. productUnit.value = '年'
  847. } else {
  848. productUnit.value = '个'
  849. }
  850. }
  851. }
  852. const isEditGold = ref(false)
  853. const EditifGold = () => {
  854. if (editFormData.value.goodsName == '金币充值') {
  855. isEditGold.value = true
  856. } else {
  857. isEditGold.value = false
  858. }
  859. }
  860. //是否为默认归属平台
  861. const isGroup = ref(false)
  862. const ifGroup = () => {
  863. if (addFormData.value.payType == 'Stripe-链接收款') {
  864. isGroup.value = true
  865. addFormData.value.receivedMarket = '香港'
  866. } else if (addFormData.value.payType == 'PaymentAsia-链接收款') {
  867. isGroup.value = true
  868. addFormData.value.receivedMarket = '香港'
  869. } else if (addFormData.value.payType == 'Ipay88-链接收款') {
  870. isGroup.value = true
  871. addFormData.value.receivedMarket = '马来西亚'
  872. } else {
  873. isGroup.value = false
  874. }
  875. }
  876. const addFormisible = ref(false)
  877. const jwcodeSeachMarket = async () => {
  878. try {
  879. const result = await request({
  880. url: '/cashCollection/getNameAndMarket',
  881. data: addFormData.value.jwcode
  882. })
  883. addFormData.value.market = result.data.market
  884. addFormData.value.marketName = result.data.marketName
  885. addFormData.value.name = result.data.name
  886. console.log('返回参数:', result);
  887. } catch (error) {
  888. console.log(error);
  889. }
  890. }
  891. const openRejectReason = (reason) => {
  892. ElMessageBox.alert(reason, '驳回理由', {
  893. // if you want to disable its autofocus
  894. // autofocus: false,
  895. confirmButtonText: '确认',
  896. customClass: 'reject-reason-box',
  897. })
  898. }
  899. const uploadRef = ref()
  900. const addOrEdit = ref(0) // 1 为新增 2 为编辑
  901. const productSelectRef = ref(null);
  902. const openAddForm = (row) => {
  903. productSelectRef.value?.resetSelect();
  904. if (row.jwcode) {
  905. console.log('编辑回显数据', row);
  906. addOrEdit.value = 2
  907. addFormData.value = { ...row };
  908. jwcodeSeachMarket()
  909. ifGold()
  910. addFormisible.value = true
  911. } else {
  912. addOrEdit.value = 1
  913. addFormData.value = {
  914. goodsName: ''
  915. }
  916. addFormisible.value = true
  917. }
  918. }
  919. const closeAddForm = () => {
  920. addFormisible.value = false
  921. addFormData.value = {}
  922. addOrEdit.value = 0
  923. isGold.value = false
  924. addFormRef.value?.resetFields();
  925. }
  926. //客服新增
  927. const handleAddForm = async () => {
  928. try {
  929. await addFormRef.value.validate();
  930. if (addFormData.value.payTime) {
  931. addFormData.value.payTime = moment(addFormData.value.payTime).format('YYYY-MM-DD HH:mm:ss')
  932. }
  933. console.log('客服新增的数据', addFormData.value);
  934. const result = await request({
  935. url: '/cashCollection/add',
  936. data: {
  937. ...addFormData.value,
  938. submitterId: adminData.value.id,
  939. permanentGold: (addFormData.value.permanentGold || 0) * 100,
  940. freeGold: (addFormData.value.freeGold || 0) * 100,
  941. goodNum: addFormData.value.goodNum || 0,
  942. paymentCurrency: CurrencyForId(addFormData.value.paymentCurrency) || '',
  943. receivedMarket: MarketNameForId(addFormData.value.receivedMarket) || '',
  944. paymentAmount: (addFormData.value.paymentAmount) * 100,
  945. submitterMarket: adminData.value.markets
  946. }
  947. })
  948. if (result.code == 200) {
  949. ElMessage.success('添加成功')
  950. getlist()
  951. closeAddForm()
  952. } else {
  953. }
  954. console.log('返回参数:', result);
  955. } catch (error) {
  956. console.log(error);
  957. ElMessage.error('请完善表单信息后提交');
  958. }
  959. }
  960. //客服提交撤回的编辑记录
  961. const handleEditForm = async () => {
  962. try {
  963. if (addFormData.value.payTime) {
  964. addFormData.value.payTime = moment(addFormData.value.payTime).format('YYYY-MM-DD HH:mm:ss')
  965. }
  966. console.log('客服编辑的数据', addFormData.value);
  967. const result = await request({
  968. url: '/cashCollection/reSubmit',
  969. data: {
  970. ...addFormData.value,
  971. submitterId: adminData.value.id,
  972. permanentGold: (addFormData.value.permanentGold || 0) * 100,
  973. freeGold: (addFormData.value.freeGold || 0) * 100,
  974. goodNum: addFormData.value.goodNum || 0,
  975. paymentCurrency: CurrencyForId(addFormData.value.paymentCurrency) || '',
  976. receivedMarket: MarketNameForId(addFormData.value.receivedMarket) || '',
  977. paymentAmount: (addFormData.value.paymentAmount) * 100
  978. }
  979. })
  980. if (result.code == 200) {
  981. ElMessage.success('编辑成功')
  982. getlist()
  983. closeAddForm()
  984. }
  985. console.log('返回参数:', result);
  986. } catch (error) {
  987. console.log(error);
  988. }
  989. }
  990. //付款币种
  991. const selectedCurrency = ref('');
  992. const customOptions = ref(['美元(USD)', '港币(HKD)', '新币(SGD)', '马币(MYR)', '泰铢(THB)', '加币(CAD)', '越南盾(VDN)', '韩元(KRW)']);
  993. //支付方式
  994. const paytypeOptions = ref(["Stripe-链接收款", "PaymentAsia-链接收款", "Ipay88-链接收款", "银行转账", "刷卡", "现金", "支票", "Grabpay", "Nets", "E-Transfer", "Paypal"])
  995. const MoneyAddressOptions = ref(['马来西亚', '香港', '新加坡', '泰国', '越南HCM', '加拿大'])
  996. const handleCurrencyChange = (option) => {
  997. console.log('选中的币种:', option);
  998. };
  999. //图片上传
  1000. const handleImgSuccess = (response, uploadFile) => {
  1001. try {
  1002. console.log('11', response)
  1003. addFormData.value.voucher = response.data.url
  1004. console.log('22', response.data.url)
  1005. } catch (error) {
  1006. console.log('报错信息', error)
  1007. ElMessage.error(response.msg || '图片上传失败')
  1008. }
  1009. }
  1010. const handelImgErr = (err) => {
  1011. console.log(err);
  1012. addFormData.value.imageUrl = null
  1013. ElMessage.error("图片上传失败")
  1014. }
  1015. const beforeUpload = (rawFile) => {
  1016. if (rawFile.type !== 'image/jpeg' && rawFile.type !== 'image/png') {
  1017. ElMessage.error('图片必须是jpg或png类型!')
  1018. return false
  1019. } else if (rawFile.size / 1024 / 1024 > 2) {
  1020. ElMessage.error('图片大小不能超过 2MB!')
  1021. return false
  1022. }
  1023. return true
  1024. }
  1025. const handleImageChange = (file) => {
  1026. uploadRef.value.submit()
  1027. }
  1028. const customUpload = async (options) => {
  1029. try {
  1030. const formData = new FormData()
  1031. formData.append('file', options.file)
  1032. const response = await API({
  1033. url: 'https://api.homilychart.com/hljw/api/aws/upload',
  1034. method: 'POST',
  1035. data: formData,
  1036. headers: {
  1037. 'Content-Type': 'multipart/form-data'
  1038. }
  1039. })
  1040. if (response.code === 200 && response.data) {
  1041. handleImgSuccess(response, options.file)
  1042. ElMessage.success('上传成功')
  1043. } else {
  1044. options.onError(response)
  1045. ElMessage.error(response.msg || '上传失败')
  1046. }
  1047. } catch (error) {
  1048. console.error('上传错误:', error)
  1049. ElMessage.error(`上传失败: ${error.msg || error.message || '网络异常'}`)
  1050. }
  1051. }
  1052. // 预览图片函数
  1053. const previewImage = (imageUrl) => {
  1054. // 使用 element-plus 的 el-image 组件实现图片预览功能
  1055. const imageElement = document.createElement('img');
  1056. imageElement.src = imageUrl;
  1057. imageElement.style.maxWidth = '80vw';
  1058. imageElement.style.maxHeight = '80vh';
  1059. const viewer = document.createElement('div');
  1060. viewer.style.position = 'fixed';
  1061. viewer.style.top = '0';
  1062. viewer.style.left = '0';
  1063. viewer.style.width = '100vw';
  1064. viewer.style.height = '100vh';
  1065. viewer.style.backgroundColor = 'rgba(0, 0, 0, 0.7)';
  1066. viewer.style.display = 'flex';
  1067. viewer.style.justifyContent = 'center';
  1068. viewer.style.alignItems = 'center';
  1069. viewer.style.zIndex = '9999';
  1070. viewer.style.overflow = 'auto';
  1071. viewer.appendChild(imageElement);
  1072. document.body.appendChild(viewer);
  1073. viewer.addEventListener('click', () => {
  1074. document.body.removeChild(viewer);
  1075. });
  1076. };
  1077. //========= 客服新增 退款/撤回 相关 ===============
  1078. const refundFormData = ref({
  1079. })
  1080. const refundDialog = ref(false)
  1081. const openRefundDialog = () => {
  1082. refundDialog.value = true
  1083. closeConfirmRefund()
  1084. }
  1085. const closeRefundForm = () => {
  1086. refundDialog.value = false
  1087. refundFormData.value = {}
  1088. }
  1089. const submitRefund = async () => {
  1090. try {
  1091. const result = await request({
  1092. url: '/Money/add',
  1093. data: {
  1094. jwcode: refundFormData.value.jwcode, // 精网号(必填)
  1095. name: refundFormData.value.name, // 姓名(必填)
  1096. market: refundFormData.value.marketName, // 所属地区(必填)
  1097. activity: refundFormData.value.activity, // 活动名称(可选)
  1098. bankCode: refundFormData.value.bankCode, // 银行流水订单号(必填)
  1099. goodsName: refundFormData.value.goodsName, // 商品名称(必填)
  1100. goodNum: refundFormData.value.goodNum, // 商品数量(必填,默认0)
  1101. paymentCurrency: refundFormData.value.paymentCurrency, // 付款币种(必填)
  1102. paymentAmount: (refundFormData.value.paymentAmount) * 100, // 付款金额(必填)
  1103. receivedCurrency: refundFormData.value.receivedCurrency, // 到账币种(必填)
  1104. receivedAmount: (refundFormData.value.receivedAmount) * 100, // 到账金额(必填)
  1105. handlingCharge: (refundFormData.value.handlingCharge) * 100, // 手续费(可选)
  1106. receivedMarket: refundFormData.value.receivedMarket, // 到账地区(可选)
  1107. payType: refundFormData.value.payType, // 支付方式(必填)
  1108. payTime: refundFormData.value.payTime, // 付款时间,格式:yyyy-MM-dd HH:mm:ss(可选)
  1109. receivedTime: refundFormData.value.receivedTime, // 到账时间,格式:yyyy-MM-dd HH:mm:ss(可选)
  1110. areaServise: adminData.value.adminName, // 提交人(可选)
  1111. submitterId: adminData.value.id,
  1112. voucher: refundFormData.value.voucher, // 转账凭证URL(可选)
  1113. remark: refundFormData.value.remark, // 备注信息(可选)
  1114. refundReason: refundFormData.value.refundReason, // 退款备注-客服填写(可选)
  1115. refundModel: refundFormData.value.refundModel, // 退款方式:0-全额,1-部分(可选)
  1116. id: refundFormData.value.id, //订单id
  1117. orderCode: refundFormData.value.orderCode,
  1118. permanentGold: (refundFormData.value.permanentGold) * 100 || null,
  1119. freeGold: (refundFormData.value.freeGold) * 100 || null
  1120. }
  1121. })
  1122. if (result.code == 200) {
  1123. ElMessage.success('新增退款成功')
  1124. getlist()
  1125. closeRefundForm()
  1126. } else {
  1127. ElMessage.error(result.msg)
  1128. getlist()
  1129. }
  1130. console.log('返回参数:', result);
  1131. } catch (error) {
  1132. console.log(error);
  1133. }
  1134. }
  1135. //撤回弹窗
  1136. const textContent = ref('')
  1137. const recallDialog = ref(false)
  1138. const refundConfirmDialog = ref(false)
  1139. const RecallNum = ref('')
  1140. const openConfirm = (val, row) => {
  1141. console.log('打开弹窗', val, row);
  1142. if (val == 'refund') {
  1143. textContent.value = '将要对该订单退款!'
  1144. refundConfirmDialog.value = true
  1145. refundFormData.value = { ...row }
  1146. }
  1147. if (val == 'recall') {
  1148. textContent.value = '将要撤回该信息!'
  1149. recallDialog.value = true
  1150. RecallNum.value = row.orderCode
  1151. }
  1152. }
  1153. const closeRecall = () => {
  1154. recallDialog.value = false
  1155. textContent.value = ''
  1156. RecallNum.value = ''
  1157. }
  1158. const handleRecall = async () => {
  1159. try {
  1160. const result = await request({
  1161. url: '/cashCollection/cancel',
  1162. data: {
  1163. orderCode: RecallNum.value,
  1164. }
  1165. })
  1166. if (result.code == 200) {
  1167. ElMessage.success('撤回成功')
  1168. getlist()
  1169. closeRecall()
  1170. }
  1171. console.log('返回参数:', result);
  1172. } catch (error) {
  1173. console.log(error);
  1174. }
  1175. }
  1176. const closeConfirmRefund = () => {
  1177. refundConfirmDialog.value = false
  1178. textContent.value = ''
  1179. }
  1180. //================== 财务编辑相关 =========================
  1181. const editFormData = ref({
  1182. })
  1183. const ifOnline = ref(false)
  1184. const editFormisible = ref(false)
  1185. const editFormRef = ref(null)
  1186. const openEditForm = (row) => {
  1187. console.log('编辑时该行数据:', row);
  1188. editFormData.value = row
  1189. EditifGold()
  1190. if (row.status == 3) {
  1191. ifOnline.value = true
  1192. } else {
  1193. ifOnline.value = false
  1194. }
  1195. editFormisible.value = true
  1196. }
  1197. const closeEditForm = () => {
  1198. editFormisible.value = false
  1199. editFormData.value = {}
  1200. getlist()
  1201. }
  1202. //提交编辑
  1203. const submitEditForm = async () => {
  1204. try {
  1205. if (editFormData.value.receivedTime) {
  1206. editFormData.value.receivedTime = moment(editFormData.value.receivedTime).format('YYYY-MM-DD HH:mm:ss')
  1207. }
  1208. const result = await request({
  1209. url: '/cashCollection/complete',
  1210. data: {
  1211. orderCode: editFormData.value.orderCode,
  1212. handlingCharge: editFormData.value.handlingCharge * 100,
  1213. paymentCurrency: CurrencyForId(editFormData.value.paymentCurrency),
  1214. paymentAmount: (editFormData.value.paymentAmount) * 100,
  1215. receivedCurrency: CurrencyForId(editFormData.value.receivedCurrency),
  1216. receivedAmount: editFormData.value.receivedAmount * 100,
  1217. receivedTime: editFormData.value.receivedTime,
  1218. receivedRemark: editFormData.value.receivedRemark,
  1219. }
  1220. })
  1221. if (result.code == 200) {
  1222. ElMessage.success('提交成功')
  1223. getlist()
  1224. closeEditForm()
  1225. }
  1226. console.log('返回参数:', result);
  1227. } catch (error) {
  1228. console.log(error);
  1229. }
  1230. }
  1231. //================== 审核相关 =========================
  1232. const auditFormData = ref({
  1233. })
  1234. //财务通过审核请求
  1235. const handelAudit = async () => {
  1236. try {
  1237. const result = await request({
  1238. url: '/cashAudit/collectionAudit',
  1239. data: {
  1240. orderCode: auditFormData.value.orderCode,
  1241. action: 1,
  1242. auditId: adminData.value.id
  1243. }
  1244. })
  1245. if (result.code == 200) {
  1246. ElMessage.success('审核成功')
  1247. getlist()
  1248. closeAuditForm()
  1249. } else {
  1250. ElMessage.error(result.msg)
  1251. getlist()
  1252. }
  1253. console.log('返回参数:', result);
  1254. } catch (error) {
  1255. console.log(error);
  1256. }
  1257. }
  1258. //财务驳回审核请求
  1259. const handelAuditReject = async () => {
  1260. try {
  1261. const result = await request({
  1262. url: '/cashAudit/collectionAudit',
  1263. data: {
  1264. orderCode: auditFormData.value.orderCode,
  1265. rejectReason: auditFormData.value.rejectReason,
  1266. action: 2,
  1267. auditId: adminData.value.id
  1268. }
  1269. })
  1270. if (result.code == 200) {
  1271. ElMessage.success('审核成功')
  1272. getlist()
  1273. closeAuditForm()
  1274. }
  1275. console.log('返回参数:', result);
  1276. } catch (error) {
  1277. console.log(error);
  1278. }
  1279. }
  1280. const auditFormisible = ref(false)
  1281. //判断弹窗中是否展示驳回
  1282. const ifReject = ref(false)
  1283. const openAuditForm = (row) => {
  1284. console.log('这是审核的数据', row);
  1285. auditFormData.value = {
  1286. ...row,
  1287. market: row.marketName
  1288. }
  1289. auditFormisible.value = true
  1290. }
  1291. const countdown = ref(0); // 倒计时秒数
  1292. const isBtnDisabled = ref(false); // 按钮是否禁用
  1293. const btnText = ref('通过(3)'); // 按钮显示的文字
  1294. const closeAuditForm = () => {
  1295. ifReject.value = false
  1296. auditFormisible.value = false
  1297. auditFormData.value = {}
  1298. }
  1299. //倒计时控制通过按钮
  1300. watch(auditFormisible, (val) => {
  1301. if (val) {
  1302. countdown.value = 3
  1303. isBtnDisabled.value = true
  1304. btnText.value = `通过(${countdown.value})`
  1305. const timer = setInterval(() => {
  1306. countdown.value--
  1307. btnText.value = `通过(${countdown.value})`
  1308. console.log(btnText.value);
  1309. if (countdown.value <= 0) {
  1310. isBtnDisabled.value = false
  1311. clearInterval(timer)
  1312. btnText.value = '通过'
  1313. }
  1314. }, 1000);
  1315. }
  1316. })
  1317. //========================分页相关==================
  1318. const pageInfo = ref({
  1319. pageSize: 10,
  1320. pageNum: 1
  1321. })
  1322. const total = ref(0)
  1323. const handlePagination = (type, val) => {
  1324. if (type === 'size') {
  1325. pageInfo.value.pageSize = val
  1326. } else {
  1327. pageInfo.value.pageNum = val
  1328. }
  1329. getlist()
  1330. }
  1331. // ============ 已驳回相关 ===========================
  1332. // 提示框状态管理
  1333. const showTooltip = ref(false);
  1334. const tooltipContent = ref('');
  1335. const tooltipLeft = ref(0);
  1336. const tooltipTop = ref(0);
  1337. const tooltipWidth = 200;
  1338. // 鼠标进入时显示提示框
  1339. const handleMouseEnter = (e, content) => {
  1340. if (content) {
  1341. showTooltip.value = true;
  1342. tooltipContent.value = content;
  1343. handleMouseMove(e);
  1344. }
  1345. };
  1346. // 鼠标离开时隐藏提示框
  1347. const handleMouseLeave = () => {
  1348. showTooltip.value = false;
  1349. tooltipContent.value = '';
  1350. };
  1351. // 鼠标移动时更新提示框位置(显示在鼠标左侧)
  1352. const handleMouseMove = (e) => {
  1353. // 左侧显示:鼠标X坐标 - 提示框宽度 - 偏移量
  1354. tooltipLeft.value = e.clientX - tooltipWidth - 10;
  1355. // Y坐标与鼠标保持一致(垂直居中对齐)
  1356. tooltipTop.value = e.clientY - 10;
  1357. };
  1358. const adminData = ref({})
  1359. // 获取管理员信息
  1360. const getAdminData = async function () {
  1361. try {
  1362. const result = await API({
  1363. url: '/admin/userinfo',
  1364. data: {}
  1365. })
  1366. adminData.value = result
  1367. console.log('请求成功', result)
  1368. } catch (error) {
  1369. console.log('请求失败', error)
  1370. }
  1371. }
  1372. const statusList = [
  1373. {
  1374. name: '待审核',
  1375. value: 0
  1376. },
  1377. {
  1378. name: '已通过',
  1379. value: 134
  1380. },
  1381. {
  1382. name: '已撤回',
  1383. value: 5
  1384. }, {
  1385. name: '退款',
  1386. value: 6
  1387. }, {
  1388. name: '已驳回',
  1389. value: 2
  1390. },
  1391. ]
  1392. const paytypeList = ["Stripe-链接收款", "PaymentAsia-链接收款", "Ipay88-链接收款", "银行转账", "刷卡", "现金", "支票", "Grabpay", "Nets", "E-Transfer", "Paypal"]
  1393. const activityList = ref([])
  1394. const marketList = ['马来西亚', '香港', '新加坡', '泰国', '越南HCM', '加拿大']
  1395. const productList = [
  1396. {
  1397. "value": "金币产品",
  1398. "label": "金币产品",
  1399. "children": [
  1400. {
  1401. "value": "金币充值",
  1402. "label": "金币充值"
  1403. }
  1404. ]
  1405. },
  1406. {
  1407. "value": "软件产品",
  1408. "label": "软件产品",
  1409. "children": [
  1410. {
  1411. "value": "软件",
  1412. "label": "软件",
  1413. "children": [
  1414. {
  1415. "value": "美股",
  1416. "label": "美股",
  1417. "children": [
  1418. {
  1419. "value": "美股软件",
  1420. "label": "美股软件"
  1421. }
  1422. ]
  1423. },
  1424. {
  1425. "value": "港股",
  1426. "label": "港股",
  1427. "children": [
  1428. {
  1429. "value": "港股软件",
  1430. "label": "港股软件"
  1431. }
  1432. ]
  1433. },
  1434. {
  1435. "value": "A股",
  1436. "label": "A股",
  1437. "children": [
  1438. {
  1439. "value": "A股软件",
  1440. "label": "A股软件"
  1441. }
  1442. ]
  1443. },
  1444. {
  1445. "value": "新加坡股",
  1446. "label": "新加坡股",
  1447. "children": [
  1448. {
  1449. "value": "新加坡股软件",
  1450. "label": "新加坡股软件"
  1451. }
  1452. ]
  1453. },
  1454. {
  1455. "value": "马股",
  1456. "label": "马股",
  1457. "children": [
  1458. {
  1459. "value": "马股软件",
  1460. "label": "马股软件"
  1461. }
  1462. ]
  1463. },
  1464. {
  1465. "value": "日本股",
  1466. "label": "日本股",
  1467. "children": [
  1468. {
  1469. "value": "日本股软件",
  1470. "label": "日本股软件"
  1471. }
  1472. ]
  1473. },
  1474. {
  1475. "value": "泰股",
  1476. "label": "泰股",
  1477. "children": [
  1478. {
  1479. "value": "泰股软件",
  1480. "label": "泰股软件"
  1481. }
  1482. ]
  1483. },
  1484. {
  1485. "value": "越南股",
  1486. "label": "越南股",
  1487. "children": [
  1488. {
  1489. "value": "越南股软件",
  1490. "label": "越南股软件"
  1491. }
  1492. ]
  1493. },
  1494. {
  1495. "value": "印尼股",
  1496. "label": "印尼股",
  1497. "children": [
  1498. {
  1499. "value": "印尼股软件",
  1500. "label": "印尼股软件"
  1501. }
  1502. ]
  1503. },
  1504. {
  1505. "value": "韩国股",
  1506. "label": "韩国股",
  1507. "children": [
  1508. {
  1509. "value": "韩国股软件",
  1510. "label": "韩国股软件"
  1511. }
  1512. ]
  1513. },
  1514. {
  1515. "value": "台湾股",
  1516. "label": "台湾股",
  1517. "children": [
  1518. {
  1519. "value": "台湾股软件",
  1520. "label": "台湾股软件"
  1521. }
  1522. ]
  1523. }
  1524. ]
  1525. },
  1526. {
  1527. "value": "AI机构探测神器",
  1528. "label": "AI机构探测神器",
  1529. "children": [
  1530. {
  1531. "value": "AI机构追踪",
  1532. "label": "AI机构追踪"
  1533. },
  1534. {
  1535. "value": "AI机构出击",
  1536. "label": "AI机构出击"
  1537. },
  1538. {
  1539. "value": "AI机构资金",
  1540. "label": "AI机构资金"
  1541. },
  1542. {
  1543. "value": "AI机活跃度",
  1544. "label": "AI机活跃度"
  1545. }
  1546. ]
  1547. },
  1548. {
  1549. "value": "超级机构探测神器",
  1550. "label": "超级机构探测神器",
  1551. "children": [
  1552. {
  1553. "value": "超级机构透视",
  1554. "label": "超级机构透视"
  1555. },
  1556. {
  1557. "value": "超级机构伏击",
  1558. "label": "超级机构伏击"
  1559. },
  1560. {
  1561. "value": "超级机构猎杀",
  1562. "label": "超级机构猎杀"
  1563. },
  1564. {
  1565. "value": "超级机构脉博",
  1566. "label": "超级机构脉博"
  1567. },
  1568. {
  1569. "value": "超级机构罗盘",
  1570. "label": "超级机构罗盘"
  1571. }
  1572. ]
  1573. },
  1574. {
  1575. "value": "其他",
  1576. "label": "其他",
  1577. "children": [
  1578. {
  1579. "value": "静态信息费",
  1580. "label": "静态信息费"
  1581. },
  1582. {
  1583. "value": "博股会员",
  1584. "label": "博股会员"
  1585. }
  1586. ]
  1587. }
  1588. ]
  1589. }
  1590. ]
  1591. // 获取活动信息
  1592. const getActivitys = async function () {
  1593. try {
  1594. const result = await API({
  1595. url: '/cashCollection/getActivityList',
  1596. data: {}
  1597. })
  1598. if (result.code == 200) {
  1599. activityList.value = result.data
  1600. console.log('请求成功', result)
  1601. } else {
  1602. ElMessage.error('活动列表获取失败')
  1603. console.log('活动列表获取失败', result.msg);
  1604. }
  1605. } catch (error) {
  1606. console.log('请求失败', error)
  1607. }
  1608. }
  1609. const MarketNameForId = (name) => {
  1610. if (name == '新加坡') {
  1611. return 4
  1612. } else if (name == '加拿大') {
  1613. return 24016
  1614. } else if (name == '马来西亚') {
  1615. return 5
  1616. } else if (name == '香港') {
  1617. return 13
  1618. } else if (name == '泰国') {
  1619. return 24018
  1620. } else if (name == '越南HCM') {
  1621. return 24022
  1622. } else {
  1623. return name
  1624. }
  1625. }
  1626. const CurrencyForId = (name) => {
  1627. if (name == '美元(USD)') {
  1628. return 1
  1629. } else if (name == '港币(HKD)') {
  1630. return 2
  1631. } else if (name == '新币(SGD)') {
  1632. return 3
  1633. } else if (name == '马币(MYR)') {
  1634. return 4
  1635. } else if (name == '泰铢(THB)') {
  1636. return 5
  1637. } else if (name == '加币(CAD)') {
  1638. return 6
  1639. } else if (name == '越南盾(VDN)') {
  1640. return 7
  1641. } else if (name == '越南盾(VDN)') {
  1642. return 8
  1643. } else {
  1644. return name
  1645. }
  1646. }
  1647. //节流
  1648. const throttledhandleAddForm = _.throttle(handleAddForm, 5000, {
  1649. trailing: false
  1650. })
  1651. const throttledhandleEditForm = _.throttle(handleEditForm, 5000, {
  1652. trailing: false
  1653. })
  1654. const throttledhandelAuditReject = _.throttle(handelAuditReject, 5000, {
  1655. trailing: false
  1656. })
  1657. const throttledsubmitEditForm = _.throttle(submitEditForm, 5000, {
  1658. trailing: false
  1659. })
  1660. const throttledsubmitRefund = _.throttle(submitRefund, 5000, {
  1661. trailing: false
  1662. })
  1663. onMounted(async function () {
  1664. await getAdminData()
  1665. await getActivitys()
  1666. if (hasMenuPermission(menuTree.value, 77) && hasMenuPermission(menuTree.value, 78) && hasMenuPermission(menuTree.value, 79)) {
  1667. superAdmin.value = true
  1668. getlist()
  1669. }
  1670. else if (hasMenuPermission(menuTree.value, 77)) {
  1671. checkKefu()
  1672. } else if (hasMenuPermission(menuTree.value, 78)) {
  1673. checkCaiwu()
  1674. } else if (hasMenuPermission(menuTree.value, 79)) {
  1675. checkHqCaiwu()
  1676. }
  1677. })
  1678. </script>
  1679. <style scoped lang="scss">
  1680. .content {
  1681. //整体内容
  1682. height: 100%;
  1683. width: 80vw;
  1684. .card1 {
  1685. // 筛选框
  1686. width: 100%;
  1687. .row {
  1688. height: 4vh;
  1689. width: 80vw;
  1690. display: flex;
  1691. min-height: 40px;
  1692. .rowItem {
  1693. display: flex;
  1694. width: 15vw;
  1695. align-items: center;
  1696. justify-content: center;
  1697. margin-right: 0.5vw;
  1698. }
  1699. .buttons {
  1700. display: flex;
  1701. justify-content: center;
  1702. align-items: center;
  1703. margin-left: 10px;
  1704. }
  1705. }
  1706. }
  1707. .div-card2 {
  1708. // 下方数据展示card
  1709. width: 100%;
  1710. margin-top: 2vh;
  1711. .btns {
  1712. //切换标签
  1713. display: flex;
  1714. align-items: center;
  1715. justify-content: space-between;
  1716. padding-bottom: 10px;
  1717. .tabs {
  1718. min-width: 300px;
  1719. .btnItem {
  1720. margin-left: 10px;
  1721. border-radius: 5px;
  1722. }
  1723. }
  1724. .btnAdd {
  1725. padding-left: 10px;
  1726. }
  1727. }
  1728. .table {
  1729. margin: 10px;
  1730. border-radius: 20px;
  1731. .ellipsis-container {
  1732. //内容过长悬浮展示框
  1733. position: relative;
  1734. width: 100%;
  1735. .ellipsis-text {
  1736. display: inline-block;
  1737. width: 100%;
  1738. white-space: nowrap;
  1739. overflow: hidden;
  1740. text-overflow: ellipsis;
  1741. cursor: pointer;
  1742. }
  1743. .custom-tooltip {
  1744. position: fixed;
  1745. z-index: 9999;
  1746. padding: 8px 12px;
  1747. width: 200px;
  1748. /* 固定宽度 */
  1749. background-color: #E4F0FC;
  1750. color: #333333;
  1751. border: 1px solid #e5e7eb;
  1752. border-radius: 4px;
  1753. box-shadow: 0 2px 12px rgba(0, 0, 0, 0.1);
  1754. /* 高度随内容自动适应 */
  1755. min-height: 30px;
  1756. max-height: 300px;
  1757. /* 限制最大高度,超出滚动 */
  1758. overflow-y: auto;
  1759. font-size: 14px;
  1760. line-height: 1.5;
  1761. }
  1762. }
  1763. }
  1764. .pagination {
  1765. margin-top: 10px;
  1766. padding: 10px 10px;
  1767. }
  1768. }
  1769. .recallDialog {
  1770. //撤回弹窗提示
  1771. height: 392px;
  1772. width: 700px;
  1773. background-image: url('/src/assets/收款明细撤回背景.png');
  1774. position: fixed; // 固定定位,相对于浏览器窗口
  1775. top: 50%; // 距离顶部50%
  1776. left: 50%; // 距离左侧50%
  1777. transform: translate(-50%, -50%); // 向左、向上平移自身宽高的50%,实现居中
  1778. z-index: 1000; // 确保在其他元素上层显示
  1779. .close {
  1780. position: absolute;
  1781. left: 625px;
  1782. top: 20px;
  1783. height: 38px;
  1784. width: 38px;
  1785. opacity: 0;
  1786. .Btn {
  1787. height: 100%;
  1788. width: 100%;
  1789. border-radius: 10px;
  1790. }
  1791. }
  1792. .text {
  1793. position: absolute;
  1794. left: 185px;
  1795. top: 190px;
  1796. height: 67px;
  1797. width: 500px;
  1798. .txt {
  1799. height: 100%;
  1800. width: 100%;
  1801. color: #001a42;
  1802. font-family: "PingFang SC";
  1803. font-size: 48px;
  1804. font-style: normal;
  1805. font-weight: 900;
  1806. line-height: normal;
  1807. }
  1808. }
  1809. .cancle {
  1810. position: absolute;
  1811. left: 185px;
  1812. top: 304px;
  1813. height: 55px;
  1814. width: 150px;
  1815. opacity: 0;
  1816. .Btn {
  1817. height: 100%;
  1818. width: 100%;
  1819. border-radius: 20px;
  1820. }
  1821. }
  1822. .confirm {
  1823. position: absolute;
  1824. left: 375px;
  1825. top: 304px;
  1826. height: 55px;
  1827. width: 150px;
  1828. opacity: 0;
  1829. .Btn {
  1830. height: 100%;
  1831. width: 100%;
  1832. border-radius: 20px;
  1833. }
  1834. }
  1835. }
  1836. :deep(.adddialog) {
  1837. //客服新增弹窗
  1838. min-width: 500px;
  1839. background-color: #F3FAFE !important;
  1840. margin-top: 8vh;
  1841. border-radius: 8px;
  1842. .addForm {
  1843. padding: 0 60px 1vh 60px;
  1844. .el-date-editor {
  1845. display: flex;
  1846. flex: 1;
  1847. }
  1848. .pic {
  1849. display: flex;
  1850. align-items: center;
  1851. .uploader {
  1852. height: 80px;
  1853. width: 80px;
  1854. .el-upload {
  1855. height: 100%;
  1856. width: 100%;
  1857. }
  1858. }
  1859. .picText {
  1860. color: #999999;
  1861. font-family: "PingFang SC";
  1862. font-size: 10px;
  1863. font-style: normal;
  1864. font-weight: 400;
  1865. line-height: 20px;
  1866. margin-left: 10px;
  1867. }
  1868. }
  1869. .moneyType {
  1870. position: relative;
  1871. width: 100%;
  1872. }
  1873. }
  1874. .dialog-footer {
  1875. display: flex;
  1876. justify-content: center;
  1877. padding-bottom: 1.5vh;
  1878. }
  1879. }
  1880. :deep(.editdialog) {
  1881. //编辑弹窗
  1882. min-width: 990px;
  1883. background-color: #F3FAFE !important;
  1884. margin-top: 8vh;
  1885. border-radius: 8px;
  1886. .editForm {
  1887. padding: 0 60px 1vh 60px;
  1888. .el-date-editor {
  1889. display: flex;
  1890. flex: 1;
  1891. }
  1892. .pic {
  1893. display: flex;
  1894. align-items: center;
  1895. .uploader {
  1896. height: 80px;
  1897. width: 80px;
  1898. .el-upload {
  1899. height: 100%;
  1900. width: 100%;
  1901. }
  1902. }
  1903. .picText {
  1904. color: #999999;
  1905. font-family: "PingFang SC";
  1906. font-size: 10px;
  1907. font-style: normal;
  1908. font-weight: 400;
  1909. line-height: 20px;
  1910. margin-left: 10px;
  1911. }
  1912. }
  1913. }
  1914. .content {
  1915. //编辑弹窗内容
  1916. display: flex;
  1917. height: 100%;
  1918. width: 100%;
  1919. .left {
  1920. min-width: 500px;
  1921. }
  1922. .right {
  1923. flex: 1;
  1924. .editFormRighrt {
  1925. padding: 0 60px 0 40px;
  1926. .el-date-editor {
  1927. display: flex;
  1928. flex: 1;
  1929. }
  1930. .pic {
  1931. display: flex;
  1932. align-items: center;
  1933. .uploader {
  1934. height: 80px;
  1935. width: 80px;
  1936. .el-upload {
  1937. height: 100%;
  1938. width: 100%;
  1939. }
  1940. }
  1941. .picText {
  1942. color: #999999;
  1943. font-family: "PingFang SC";
  1944. font-size: 10px;
  1945. font-style: normal;
  1946. font-weight: 400;
  1947. line-height: 20px;
  1948. margin-left: 10px;
  1949. }
  1950. }
  1951. }
  1952. .editBtns {
  1953. display: flex;
  1954. justify-content: center;
  1955. margin-top: 60px;
  1956. .txt {
  1957. color: #f3fafe;
  1958. text-align: center;
  1959. font-family: "PingFang SC";
  1960. font-size: 14px;
  1961. font-style: normal;
  1962. font-weight: 700;
  1963. line-height: 22px;
  1964. }
  1965. .editBtn1 {
  1966. min-width: 80px;
  1967. padding: 5px 12px;
  1968. justify-content: center;
  1969. align-items: center;
  1970. gap: 4px;
  1971. border-radius: 4px;
  1972. background: #7E91FF;
  1973. border: none;
  1974. box-shadow: 0 0 4px 0 #00000040;
  1975. }
  1976. .editBtn2 {
  1977. display: flex;
  1978. width: 80px;
  1979. min-width: 80px;
  1980. padding: 5px 12px;
  1981. justify-content: center;
  1982. align-items: center;
  1983. gap: 4px;
  1984. border-radius: 4px;
  1985. background: #2741DE;
  1986. border: none;
  1987. box-shadow: 0 0 4px 0 #00000040;
  1988. margin-left: 60px;
  1989. }
  1990. }
  1991. }
  1992. }
  1993. }
  1994. .refundDialog {
  1995. .left {
  1996. width: 50%;
  1997. height: 70vh;
  1998. min-height: 650px;
  1999. padding: 0 2vw;
  2000. .add-item {
  2001. display: flex;
  2002. align-items: center;
  2003. margin-bottom: 1vh;
  2004. }
  2005. .image {
  2006. width: 4vw !important;
  2007. height: 4vw !important;
  2008. }
  2009. }
  2010. .right {
  2011. width: 50%;
  2012. height: 50vh;
  2013. .add-item {
  2014. display: flex;
  2015. align-items: center;
  2016. margin-bottom: 1vh;
  2017. }
  2018. }
  2019. }
  2020. :deep(.adddialog .el-form-item__label) {
  2021. //设置新增弹窗表头
  2022. min-width: 80px;
  2023. width: auto;
  2024. font-weight: 800;
  2025. padding-bottom: 15px;
  2026. }
  2027. }
  2028. // 搜索的卡片样式
  2029. .card1 {
  2030. background: #F3FAFE;
  2031. }
  2032. // 表单的卡片样式
  2033. .card2 {
  2034. background: #E7F4FD;
  2035. }
  2036. // 表头背景等
  2037. :deep(.el-table__header-wrapper),
  2038. :deep(.el-table__body-wrapper),
  2039. :deep(.el-table__cell),
  2040. /* 表格 */
  2041. :deep(.el-table__body td) {
  2042. background-color: #F3FAFE !important;
  2043. }
  2044. /* 表头 */
  2045. :deep(.el-table__header th) {
  2046. background-color: #F3FAFE !important;
  2047. }
  2048. /* 鼠标悬停 */
  2049. :deep(.el-table__row:hover > .el-table__cell) {
  2050. background-color: #E5EBFE !important;
  2051. }
  2052. /* 自定义弹窗样式 */
  2053. .reject-reason-box {
  2054. /* 调整弹窗整体高度 */
  2055. --el-message-box-height: 500px;
  2056. /* 控制弹窗总高度 */
  2057. }
  2058. /* 调整内容区域样式,确保超出滚动 */
  2059. .reject-reason-box .el-message-box__content {
  2060. max-height: 350px;
  2061. /* 内容区域最大高度(根据总高度调整) */
  2062. overflow-y: auto;
  2063. /* 超出部分显示垂直滚动条 */
  2064. white-space: pre-wrap;
  2065. /* 处理换行符,避免内容挤在一起 */
  2066. }
  2067. </style>