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.

1980 lines
70 KiB

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