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.

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