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.

1981 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
2 weeks 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 :current-page="pageInfo.pageNum" :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. }
  711. const reset = () => {
  712. searchData.value = {}
  713. getTime.value = []
  714. // 重置页码
  715. pageInfo.value.pageNum = 1
  716. getlist()
  717. }
  718. //获得表格数据接口
  719. const getlist = async () => {
  720. try {
  721. let payCurrencySelect = ''
  722. let goodsName = ''
  723. if (getTime.value && getTime.value.length === 2) {
  724. searchData.value.startTime = moment(getTime.value[0]).format('YYYY-MM-DD HH:mm:ss')
  725. searchData.value.endTime = moment(getTime.value[1]).format('YYYY-MM-DD HH:mm:ss')
  726. } else {
  727. searchData.value.startTime = ''
  728. searchData.value.endTime = ''
  729. }
  730. if (searchData.value.goodsName) {
  731. goodsName = searchData.value.goodsName[searchData.value.goodsName.length - 1]
  732. }
  733. if (searchData.value.paymentCurrency) {
  734. payCurrencySelect = CurrencyForId(searchData.value.paymentCurrency)
  735. }
  736. //角色id 0:客服 1:地方财务 2:总部财务
  737. let cashRoleId = ''
  738. let receivedMarket = adminData.value.markets
  739. if (kefu.value) {
  740. cashRoleId = '0'
  741. receivedMarket = ''
  742. } else if (caiwu.value) {
  743. cashRoleId = '1'
  744. if (activeTab.value == 'wait') {
  745. searchData.value.status = 0
  746. } else if (activeTab.value == 'pass') {
  747. searchData.value.status = 13
  748. } else if (activeTab.value == 'done') {
  749. searchData.value.status = 46
  750. } else if (activeTab.value == 'reject') {
  751. searchData.value.status = 2
  752. }
  753. } else if (HQcaiwu.value) {
  754. cashRoleId = '2'
  755. console.log('ctiveTab.value', activeTab.value);
  756. if (activeTab.value == 'pass') {
  757. searchData.value.status = 13
  758. } else if (activeTab.value == 'done') {
  759. searchData.value.status = 46
  760. }
  761. }
  762. const result = await request({
  763. url: '/cashCollection/selectCollection',
  764. data: {
  765. ...pageInfo.value,
  766. cashCollection: {
  767. ...searchData.value,
  768. ...getTime.value,
  769. submitterId: adminData.value.id,
  770. receivedMarket: MarketNameForId(receivedMarket),
  771. cashRoleId: cashRoleId,
  772. paymentCurrency: payCurrencySelect,
  773. submitterMarket: receivedMarket,
  774. goodsName: goodsName,
  775. market: MarketNameForId(searchData.value.market)
  776. }
  777. }
  778. })
  779. if (result.code == 200) {
  780. console.log('返回参数:', result);
  781. tableData.value = result.data.list
  782. total.value = result.data.total
  783. } else {
  784. ElMessage.error('数据异常')
  785. console.log(result.msg);
  786. }
  787. } catch (error) {
  788. console.log(error);
  789. }
  790. }
  791. //==================== 标签切换 =========================
  792. const activeTab = ref('wait')
  793. const navigateTo = async (tab) => {
  794. if (tab === 'wait') {
  795. activeTab.value = 'wait'
  796. await getlist()
  797. } else if (tab === 'pass') {
  798. activeTab.value = 'pass'
  799. await getlist()
  800. } else if (tab === 'done') {
  801. activeTab.value = 'done'
  802. await getlist()
  803. } else if (tab === 'reject') {
  804. activeTab.value = 'reject'
  805. await getlist()
  806. }
  807. }
  808. //角色id 0:客服 1:地方财务 2:总部财务
  809. const cashRoleId = ref('')
  810. const kefu = ref(true)
  811. const caiwu = ref(false)
  812. const HQcaiwu = ref(false)
  813. const superAdmin = ref(false)
  814. const checkKefu = () => {
  815. kefu.value = true
  816. caiwu.value = false
  817. HQcaiwu.value = false
  818. searchData.value = {}
  819. getlist()
  820. }
  821. const checkCaiwu = () => {
  822. kefu.value = false
  823. caiwu.value = true
  824. HQcaiwu.value = false
  825. activeTab.value = 'wait'
  826. searchData.value = {}
  827. getlist()
  828. }
  829. const checkHqCaiwu = () => {
  830. kefu.value = false
  831. caiwu.value = false
  832. HQcaiwu.value = true
  833. activeTab.value = 'pass'
  834. searchData.value = {}
  835. getlist()
  836. }
  837. //================= 客服新增弹窗 ==================
  838. const addFormData = ref({
  839. name: '',
  840. market: '',
  841. permanentGold: 0,
  842. freeGold: 0,
  843. goodsName: ''
  844. })
  845. const addFormRef = ref(null)
  846. const isGold = ref(false)
  847. const isProduct = ref(false)
  848. const selectItems = [
  849. "AI机构追踪",
  850. "AI机构出击",
  851. "AI机构资金",
  852. "AI机构活跃度",
  853. "超级机构透视",
  854. "超级机构伏击",
  855. "超级机构猎杀",
  856. "超级机构脉搏",
  857. "超级机构罗盘",
  858. "静态信息费",
  859. "博股会员"
  860. ];
  861. const productUnit = ref('个')
  862. const ifGold = () => {
  863. if (addFormData.value.goodsName === '金币充值') {
  864. isGold.value = true
  865. addFormData.value.goodNum = 0
  866. } else {
  867. isGold.value = false
  868. if (selectItems.includes(addFormData.value.goodsName)) {
  869. productUnit.value = '年'
  870. } else {
  871. productUnit.value = '个'
  872. }
  873. }
  874. }
  875. const isEditGold = ref(false)
  876. const EditifGold = () => {
  877. if (editFormData.value.goodsName === '金币充值') {
  878. isEditGold.value = true
  879. } else {
  880. isEditGold.value = false
  881. }
  882. }
  883. //是否为默认归属平台
  884. const isGroup = ref(false)
  885. const ifGroup = () => {
  886. if (addFormData.value.payType == 'Stripe-链接收款') {
  887. isGroup.value = true
  888. addFormData.value.receivedMarket = '香港'
  889. } else if (addFormData.value.payType == 'PaymentAsia-链接收款') {
  890. isGroup.value = true
  891. addFormData.value.receivedMarket = '香港'
  892. } else if (addFormData.value.payType == 'Ipay88-链接收款') {
  893. isGroup.value = true
  894. addFormData.value.receivedMarket = '马来西亚'
  895. } else {
  896. isGroup.value = false
  897. }
  898. }
  899. const addFormisible = ref(false)
  900. const jwcodeSeachMarket = async () => {
  901. try {
  902. const result = await request({
  903. url: '/cashCollection/getNameAndMarket',
  904. data: addFormData.value.jwcode
  905. })
  906. addFormData.value.market = result.data.market
  907. addFormData.value.marketName = result.data.marketName
  908. addFormData.value.name = result.data.name
  909. console.log('返回参数:', result);
  910. } catch (error) {
  911. console.log(error);
  912. }
  913. }
  914. const openRejectReason = (reason) => {
  915. ElMessageBox.alert(reason, '驳回理由', {
  916. // if you want to disable its autofocus
  917. // autofocus: false,
  918. confirmButtonText: '确认',
  919. customClass: 'reject-reason-box',
  920. })
  921. }
  922. const uploadRef = ref()
  923. const addOrEdit = ref(0) // 1 为新增 2 为编辑
  924. const productSelectRef = ref(null);
  925. const openAddForm = (row) => {
  926. productSelectRef.value?.resetSelect();
  927. if (row.jwcode) {
  928. console.log('编辑回显数据', row);
  929. addOrEdit.value = 2
  930. addFormData.value = {...row};
  931. jwcodeSeachMarket()
  932. ifGold()
  933. addFormisible.value = true
  934. } else {
  935. addOrEdit.value = 1
  936. addFormData.value = {
  937. goodsName: ''
  938. }
  939. addFormisible.value = true
  940. }
  941. }
  942. const closeAddForm = () => {
  943. addFormisible.value = false
  944. addFormData.value = {}
  945. addOrEdit.value = 0
  946. isGold.value = false
  947. addFormRef.value?.resetFields();
  948. }
  949. //客服新增
  950. const handleAddForm = async () => {
  951. try {
  952. await addFormRef.value.validate();
  953. if (addFormData.value.payTime) {
  954. addFormData.value.payTime = moment(addFormData.value.payTime).format('YYYY-MM-DD HH:mm:ss')
  955. }
  956. console.log('客服新增的数据', addFormData.value);
  957. const result = await request({
  958. url: '/cashCollection/add',
  959. data: {
  960. ...addFormData.value,
  961. submitterId: adminData.value.id,
  962. permanentGold: (addFormData.value.permanentGold || 0) * 100,
  963. freeGold: (addFormData.value.freeGold || 0) * 100,
  964. goodNum: addFormData.value.goodNum || 0,
  965. paymentCurrency: CurrencyForId(addFormData.value.paymentCurrency) || '',
  966. receivedMarket: MarketNameForId(addFormData.value.receivedMarket) || '',
  967. paymentAmount: (addFormData.value.paymentAmount) * 100,
  968. submitterMarket: adminData.value.markets
  969. }
  970. })
  971. if (result.code == 200) {
  972. ElMessage.success('添加成功')
  973. getlist()
  974. closeAddForm()
  975. } else {
  976. }
  977. console.log('返回参数:', result);
  978. } catch (error) {
  979. console.log('出啥错了?', error);
  980. ElMessage.error('请完善表单信息后提交');
  981. }
  982. }
  983. //客服提交撤回的编辑记录
  984. const handleEditForm = async () => {
  985. try {
  986. if (addFormData.value.payTime) {
  987. addFormData.value.payTime = moment(addFormData.value.payTime).format('YYYY-MM-DD HH:mm:ss')
  988. }
  989. console.log('客服编辑的数据', addFormData.value);
  990. const result = await request({
  991. url: '/cashCollection/reSubmit',
  992. data: {
  993. ...addFormData.value,
  994. submitterId: adminData.value.id,
  995. permanentGold: (addFormData.value.permanentGold || 0) * 100,
  996. freeGold: (addFormData.value.freeGold || 0) * 100,
  997. goodNum: addFormData.value.goodNum || 0,
  998. paymentCurrency: CurrencyForId(addFormData.value.paymentCurrency) || '',
  999. receivedMarket: MarketNameForId(addFormData.value.receivedMarket) || '',
  1000. paymentAmount: (addFormData.value.paymentAmount) * 100
  1001. }
  1002. })
  1003. if (result.code == 200) {
  1004. ElMessage.success('编辑成功')
  1005. getlist()
  1006. closeAddForm()
  1007. }
  1008. console.log('返回参数:', result);
  1009. } catch (error) {
  1010. console.log(error);
  1011. }
  1012. }
  1013. //付款币种
  1014. const selectedCurrency = ref('');
  1015. const customOptions = ref(['美元(USD)', '港币(HKD)', '新币(SGD)', '马币(MYR)', '泰铢(THB)', '加币(CAD)', '越南盾(VDN)', '韩元(KRW)']);
  1016. //支付方式
  1017. const paytypeOptions = ref(["Stripe-链接收款", "PaymentAsia-链接收款", "Ipay88-链接收款", "银行转账", "刷卡", "现金", "支票", "Grabpay", "Nets", "E-Transfer", "Paypal"])
  1018. const MoneyAddressOptions = ref(['马来西亚', '香港', '新加坡', '泰国', '越南HCM', '加拿大'])
  1019. const handleCurrencyChange = (option) => {
  1020. console.log('选中的币种:', option);
  1021. };
  1022. //图片上传
  1023. const handleImgSuccess = (response, uploadFile) => {
  1024. try {
  1025. console.log('11', response)
  1026. addFormData.value.voucher = response.data.url
  1027. console.log('22', response.data.url)
  1028. } catch (error) {
  1029. console.log('报错信息', error)
  1030. ElMessage.error(response.msg || '图片上传失败')
  1031. }
  1032. }
  1033. const handelImgErr = (err) => {
  1034. console.log(err);
  1035. addFormData.value.imageUrl = null
  1036. ElMessage.error("图片上传失败")
  1037. }
  1038. const beforeUpload = (rawFile) => {
  1039. if (rawFile.type !== 'image/jpeg' && rawFile.type !== 'image/png') {
  1040. ElMessage.error('图片必须是jpg或png类型!')
  1041. return false
  1042. } else if (rawFile.size / 1024 / 1024 > 2) {
  1043. ElMessage.error('图片大小不能超过 2MB!')
  1044. return false
  1045. }
  1046. return true
  1047. }
  1048. const handleImageChange = (file) => {
  1049. uploadRef.value.submit()
  1050. }
  1051. const customUpload = async (options) => {
  1052. try {
  1053. const formData = new FormData()
  1054. formData.append('file', options.file)
  1055. const response = await API({
  1056. url: 'https://api.homilychart.com/hljw/api/aws/upload',
  1057. method: 'POST',
  1058. data: formData,
  1059. headers: {
  1060. 'Content-Type': 'multipart/form-data'
  1061. }
  1062. })
  1063. if (response.code === 200 && response.data) {
  1064. handleImgSuccess(response, options.file)
  1065. ElMessage.success('上传成功')
  1066. } else {
  1067. options.onError(response)
  1068. ElMessage.error(response.msg || '上传失败')
  1069. }
  1070. } catch (error) {
  1071. console.error('上传错误:', error)
  1072. ElMessage.error(`上传失败: ${error.msg || error.message || '网络异常'}`)
  1073. }
  1074. }
  1075. // 预览图片函数
  1076. const previewImage = (imageUrl) => {
  1077. // 使用 element-plus 的 el-image 组件实现图片预览功能
  1078. const imageElement = document.createElement('img');
  1079. imageElement.src = imageUrl;
  1080. imageElement.style.maxWidth = '80vw';
  1081. imageElement.style.maxHeight = '80vh';
  1082. const viewer = document.createElement('div');
  1083. viewer.style.position = 'fixed';
  1084. viewer.style.top = '0';
  1085. viewer.style.left = '0';
  1086. viewer.style.width = '100vw';
  1087. viewer.style.height = '100vh';
  1088. viewer.style.backgroundColor = 'rgba(0, 0, 0, 0.7)';
  1089. viewer.style.display = 'flex';
  1090. viewer.style.justifyContent = 'center';
  1091. viewer.style.alignItems = 'center';
  1092. viewer.style.zIndex = '9999';
  1093. viewer.style.overflow = 'auto';
  1094. viewer.appendChild(imageElement);
  1095. document.body.appendChild(viewer);
  1096. viewer.addEventListener('click', () => {
  1097. document.body.removeChild(viewer);
  1098. });
  1099. };
  1100. //========= 客服新增 退款/撤回 相关 ===============
  1101. const refundFormData = ref({})
  1102. const refundDialog = ref(false)
  1103. const openRefundDialog = () => {
  1104. refundDialog.value = true
  1105. closeConfirmRefund()
  1106. }
  1107. const closeRefundForm = () => {
  1108. refundDialog.value = false
  1109. refundFormData.value = {}
  1110. }
  1111. const submitRefund = async () => {
  1112. try {
  1113. const result = await request({
  1114. url: '/Money/add',
  1115. data: {
  1116. jwcode: refundFormData.value.jwcode, // 精网号(必填)
  1117. name: refundFormData.value.name, // 姓名(必填)
  1118. market: refundFormData.value.marketName, // 所属地区(必填)
  1119. activity: refundFormData.value.activity, // 活动名称(可选)
  1120. bankCode: refundFormData.value.bankCode, // 银行流水订单号(必填)
  1121. goodsName: refundFormData.value.goodsName, // 商品名称(必填)
  1122. goodNum: refundFormData.value.goodNum, // 商品数量(必填,默认0)
  1123. paymentCurrency: refundFormData.value.paymentCurrency, // 付款币种(必填)
  1124. paymentAmount: (refundFormData.value.paymentAmount) * 100, // 付款金额(必填)
  1125. receivedCurrency: refundFormData.value.receivedCurrency, // 到账币种(必填)
  1126. receivedAmount: (refundFormData.value.receivedAmount) * 100, // 到账金额(必填)
  1127. handlingCharge: (refundFormData.value.handlingCharge) * 100, // 手续费(可选)
  1128. receivedMarket: refundFormData.value.receivedMarket, // 到账地区(可选)
  1129. payType: refundFormData.value.payType, // 支付方式(必填)
  1130. payTime: refundFormData.value.payTime, // 付款时间,格式:yyyy-MM-dd HH:mm:ss(可选)
  1131. receivedTime: refundFormData.value.receivedTime, // 到账时间,格式:yyyy-MM-dd HH:mm:ss(可选)
  1132. areaServise: adminData.value.adminName, // 提交人(可选)
  1133. submitterId: adminData.value.id,
  1134. voucher: refundFormData.value.voucher, // 转账凭证URL(可选)
  1135. remark: refundFormData.value.remark, // 备注信息(可选)
  1136. refundReason: refundFormData.value.refundReason, // 退款备注-客服填写(可选)
  1137. refundModel: refundFormData.value.refundModel, // 退款方式:0-全额,1-部分(可选)
  1138. id: refundFormData.value.id, //订单id
  1139. orderCode: refundFormData.value.orderCode,
  1140. permanentGold: (refundFormData.value.permanentGold) * 100 || 0,
  1141. freeGold: (refundFormData.value.freeGold) * 100 || 0
  1142. }
  1143. })
  1144. if (result.code == 200) {
  1145. ElMessage.success('新增退款成功')
  1146. getlist()
  1147. closeRefundForm()
  1148. } else {
  1149. ElMessage.error(result.msg)
  1150. getlist()
  1151. }
  1152. console.log('返回参数:', result);
  1153. } catch (error) {
  1154. console.log(error);
  1155. }
  1156. }
  1157. //撤回弹窗
  1158. const textContent = ref('')
  1159. const recallDialog = ref(false)
  1160. const refundConfirmDialog = ref(false)
  1161. const RecallNum = ref('')
  1162. const isRefundGold = ref(false)
  1163. const ifRefundGold = () =>{
  1164. if (refundFormData.value.goodsName === '金币充值') {
  1165. isRefundGold.value = true
  1166. refundFormData.value.goodNum = 0
  1167. } else {
  1168. isRefundGold.value = false
  1169. if (selectItems.includes(refundFormData.value.goodsName)) {
  1170. productUnit.value = '年'
  1171. } else {
  1172. productUnit.value = '个'
  1173. }
  1174. }
  1175. }
  1176. const openConfirm = (val, row) => {
  1177. console.log('打开弹窗', val, row);
  1178. if (val == 'refund') {
  1179. textContent.value = '将要对该订单退款!'
  1180. refundFormData.value = {...row}
  1181. ifRefundGold()
  1182. console.log('ifRefundGold',)
  1183. refundConfirmDialog.value = true
  1184. }
  1185. if (val == 'recall') {
  1186. textContent.value = '将要撤回该信息!'
  1187. recallDialog.value = true
  1188. RecallNum.value = row.orderCode
  1189. }
  1190. }
  1191. const closeRecall = () => {
  1192. recallDialog.value = false
  1193. textContent.value = ''
  1194. RecallNum.value = ''
  1195. }
  1196. const handleRecall = async () => {
  1197. try {
  1198. const result = await request({
  1199. url: '/cashCollection/cancel',
  1200. data: {
  1201. orderCode: RecallNum.value,
  1202. }
  1203. })
  1204. if (result.code == 200) {
  1205. ElMessage.success('撤回成功')
  1206. getlist()
  1207. closeRecall()
  1208. }
  1209. console.log('返回参数:', result);
  1210. } catch (error) {
  1211. console.log(error);
  1212. }
  1213. }
  1214. const closeConfirmRefund = () => {
  1215. refundConfirmDialog.value = false
  1216. textContent.value = ''
  1217. }
  1218. //================== 财务编辑相关 =========================
  1219. const editFormData = ref({})
  1220. const ifOnline = ref(false)
  1221. const editFormisible = ref(false)
  1222. const editFormRef = ref(null)
  1223. const openEditForm = (row) => {
  1224. console.log('编辑时该行数据:', row);
  1225. editFormData.value = row
  1226. EditifGold()
  1227. if (row.status == 3) {
  1228. ifOnline.value = true
  1229. } else {
  1230. ifOnline.value = false
  1231. }
  1232. editFormisible.value = true
  1233. }
  1234. const closeEditForm = () => {
  1235. editFormisible.value = false
  1236. editFormData.value = {}
  1237. getlist()
  1238. }
  1239. //提交编辑
  1240. const submitEditForm = async () => {
  1241. try {
  1242. await editFormRef.value.validate();
  1243. if (editFormData.value.receivedTime) {
  1244. editFormData.value.receivedTime = moment(editFormData.value.receivedTime).format('YYYY-MM-DD HH:mm:ss')
  1245. }
  1246. const result = await request({
  1247. url: '/cashCollection/complete',
  1248. data: {
  1249. orderCode: editFormData.value.orderCode,
  1250. handlingCharge: editFormData.value.handlingCharge * 100,
  1251. paymentCurrency: CurrencyForId(editFormData.value.paymentCurrency),
  1252. paymentAmount: (editFormData.value.paymentAmount) * 100,
  1253. receivedCurrency: CurrencyForId(editFormData.value.receivedCurrency),
  1254. receivedAmount: editFormData.value.receivedAmount * 100,
  1255. receivedTime: editFormData.value.receivedTime,
  1256. receivedRemark: editFormData.value.receivedRemark,
  1257. }
  1258. })
  1259. if (result.code == 200) {
  1260. ElMessage.success('提交成功')
  1261. getlist()
  1262. closeEditForm()
  1263. }
  1264. console.log('返回参数:', result);
  1265. } catch (error) {
  1266. console.log(error);
  1267. ElMessage.error('请检查表单数据格式');
  1268. }
  1269. }
  1270. //================== 审核相关 =========================
  1271. const auditFormData = ref({})
  1272. //财务通过审核请求
  1273. const handelAudit = async () => {
  1274. try {
  1275. const result = await request({
  1276. url: '/cashAudit/collectionAudit',
  1277. data: {
  1278. orderCode: auditFormData.value.orderCode,
  1279. action: 1,
  1280. auditId: adminData.value.id
  1281. }
  1282. })
  1283. if (result.code == 200) {
  1284. ElMessage.success('审核成功')
  1285. getlist()
  1286. closeAuditForm()
  1287. } else {
  1288. ElMessage.error(result.msg)
  1289. getlist()
  1290. }
  1291. console.log('返回参数:', result);
  1292. } catch (error) {
  1293. console.log(error);
  1294. }
  1295. }
  1296. //财务驳回审核请求
  1297. const handelAuditReject = async () => {
  1298. try {
  1299. const result = await request({
  1300. url: '/cashAudit/collectionAudit',
  1301. data: {
  1302. orderCode: auditFormData.value.orderCode,
  1303. rejectReason: auditFormData.value.rejectReason,
  1304. action: 2,
  1305. auditId: adminData.value.id
  1306. }
  1307. })
  1308. if (result.code == 200) {
  1309. ElMessage.success('审核成功')
  1310. getlist()
  1311. closeAuditForm()
  1312. }
  1313. console.log('返回参数:', result);
  1314. } catch (error) {
  1315. console.log(error);
  1316. }
  1317. }
  1318. const auditFormisible = ref(false)
  1319. //判断弹窗中是否展示驳回
  1320. const ifReject = ref(false)
  1321. const openAuditForm = (row) => {
  1322. console.log('这是审核的数据', row);
  1323. auditFormData.value = {
  1324. ...row,
  1325. market: row.marketName
  1326. }
  1327. auditFormisible.value = true
  1328. }
  1329. const countdown = ref(0); // 倒计时秒数
  1330. const isBtnDisabled = ref(false); // 按钮是否禁用
  1331. const btnText = ref('通过(3)'); // 按钮显示的文字
  1332. const closeAuditForm = () => {
  1333. ifReject.value = false
  1334. auditFormisible.value = false
  1335. auditFormData.value = {}
  1336. }
  1337. //倒计时控制通过按钮
  1338. watch(auditFormisible, (val) => {
  1339. if (val) {
  1340. countdown.value = 3
  1341. isBtnDisabled.value = true
  1342. btnText.value = `通过(${countdown.value})`
  1343. const timer = setInterval(() => {
  1344. countdown.value--
  1345. btnText.value = `通过(${countdown.value})`
  1346. console.log(btnText.value);
  1347. if (countdown.value <= 0) {
  1348. isBtnDisabled.value = false
  1349. clearInterval(timer)
  1350. btnText.value = '通过'
  1351. }
  1352. }, 1000);
  1353. }
  1354. })
  1355. //========================分页相关==================
  1356. const pageInfo = ref({
  1357. pageSize: 10,
  1358. pageNum: 1
  1359. })
  1360. const total = ref(0)
  1361. const handlePagination = (type, val) => {
  1362. if (type === 'size') {
  1363. pageInfo.value.pageSize = val
  1364. } else {
  1365. pageInfo.value.pageNum = val
  1366. }
  1367. getlist()
  1368. }
  1369. // ============ 已驳回相关 ===========================
  1370. // 提示框状态管理
  1371. const showTooltip = ref(false);
  1372. const tooltipContent = ref('');
  1373. const tooltipLeft = ref(0);
  1374. const tooltipTop = ref(0);
  1375. const tooltipWidth = 200;
  1376. // 鼠标进入时显示提示框
  1377. const handleMouseEnter = (e, content) => {
  1378. if (content) {
  1379. showTooltip.value = true;
  1380. tooltipContent.value = content;
  1381. handleMouseMove(e);
  1382. }
  1383. };
  1384. // 鼠标离开时隐藏提示框
  1385. const handleMouseLeave = () => {
  1386. showTooltip.value = false;
  1387. tooltipContent.value = '';
  1388. };
  1389. // 鼠标移动时更新提示框位置(显示在鼠标左侧)
  1390. const handleMouseMove = (e) => {
  1391. // 左侧显示:鼠标X坐标 - 提示框宽度 - 偏移量
  1392. tooltipLeft.value = e.clientX - tooltipWidth - 10;
  1393. // Y坐标与鼠标保持一致(垂直居中对齐)
  1394. tooltipTop.value = e.clientY - 10;
  1395. };
  1396. const adminData = ref({})
  1397. // 获取管理员信息
  1398. const getAdminData = async function () {
  1399. try {
  1400. const result = await API({
  1401. url: '/admin/userinfo',
  1402. data: {}
  1403. })
  1404. adminData.value = result
  1405. console.log('请求成功', result)
  1406. } catch (error) {
  1407. console.log('请求失败', error)
  1408. }
  1409. }
  1410. const paytypeList = ["Stripe-链接收款", "PaymentAsia-链接收款", "Ipay88-链接收款", "银行转账", "刷卡", "现金", "支票", "Grabpay", "Nets", "E-Transfer", "Paypal"]
  1411. const activityList = ref([])
  1412. // 获取活动信息
  1413. const getActivitys = async function () {
  1414. try {
  1415. const result = await API({
  1416. url: '/cashCollection/getActivityList',
  1417. data: {}
  1418. })
  1419. if (result.code == 200) {
  1420. activityList.value = result.data
  1421. console.log('请求成功', result)
  1422. } else {
  1423. ElMessage.error('活动列表获取失败')
  1424. console.log('活动列表获取失败', result.msg);
  1425. }
  1426. } catch (error) {
  1427. console.log('请求失败', error)
  1428. }
  1429. }
  1430. //节流
  1431. const throttledhandleAddForm = _.throttle(handleAddForm, 5000, {
  1432. trailing: false
  1433. })
  1434. const throttledhandleEditForm = _.throttle(handleEditForm, 5000, {
  1435. trailing: false
  1436. })
  1437. const throttledhandelAuditReject = _.throttle(handelAuditReject, 5000, {
  1438. trailing: false
  1439. })
  1440. const throttledsubmitEditForm = _.throttle(submitEditForm, 5000, {
  1441. trailing: false
  1442. })
  1443. const throttledsubmitRefund = _.throttle(submitRefund, 5000, {
  1444. trailing: false
  1445. })
  1446. onMounted(async function () {
  1447. await getAdminData()
  1448. await getActivitys()
  1449. if (adminData.value.roleId == 2) {
  1450. superAdmin.value = true
  1451. if(adminData.value.markets == '总部' || adminData.value.markets == '研发部'){
  1452. console.log('提示了吗');
  1453. ElMessageBox.alert('管理员账号只能看到所属地区对应地区财务数据,请注意设置所属地区','注意',{
  1454. type:'warning'
  1455. })
  1456. }
  1457. getlist()
  1458. } else if (hasMenuPermission(menuTree.value, 77)) {
  1459. checkKefu()
  1460. } else if (hasMenuPermission(menuTree.value, 78)) {
  1461. checkCaiwu()
  1462. } else if (hasMenuPermission(menuTree.value, 79)) {
  1463. checkHqCaiwu()
  1464. }
  1465. })
  1466. </script>
  1467. <style scoped lang="scss">
  1468. .content {
  1469. //整体内容
  1470. height: 100%;
  1471. width: 80vw;
  1472. .card1 {
  1473. // 筛选框
  1474. width: 100%;
  1475. .row {
  1476. height: 4vh;
  1477. width: 80vw;
  1478. display: flex;
  1479. min-height: 40px;
  1480. .rowItem {
  1481. display: flex;
  1482. width: 15vw;
  1483. align-items: center;
  1484. justify-content: center;
  1485. margin-right: 0.5vw;
  1486. }
  1487. .buttons {
  1488. display: flex;
  1489. justify-content: center;
  1490. align-items: center;
  1491. margin-left: 10px;
  1492. }
  1493. }
  1494. }
  1495. .div-card2 {
  1496. // 下方数据展示card
  1497. width: 100%;
  1498. margin-top: 2vh;
  1499. .btns {
  1500. //切换标签
  1501. display: flex;
  1502. align-items: center;
  1503. justify-content: space-between;
  1504. padding-bottom: 10px;
  1505. .tabs {
  1506. min-width: 300px;
  1507. .btnItem {
  1508. margin-left: 10px;
  1509. border-radius: 5px;
  1510. }
  1511. }
  1512. .btnAdd {
  1513. padding-left: 10px;
  1514. }
  1515. }
  1516. .table {
  1517. margin: 10px;
  1518. border-radius: 20px;
  1519. .ellipsis-container {
  1520. //内容过长悬浮展示框
  1521. position: relative;
  1522. width: 100%;
  1523. .ellipsis-text {
  1524. display: inline-block;
  1525. width: 100%;
  1526. white-space: nowrap;
  1527. overflow: hidden;
  1528. text-overflow: ellipsis;
  1529. cursor: pointer;
  1530. }
  1531. .custom-tooltip {
  1532. position: fixed;
  1533. z-index: 9999;
  1534. padding: 8px 12px;
  1535. width: 200px;
  1536. /* 固定宽度 */
  1537. background-color: #E4F0FC;
  1538. color: #333333;
  1539. border: 1px solid #e5e7eb;
  1540. border-radius: 4px;
  1541. box-shadow: 0 2px 12px rgba(0, 0, 0, 0.1);
  1542. /* 高度随内容自动适应 */
  1543. min-height: 30px;
  1544. max-height: 300px;
  1545. /* 限制最大高度,超出滚动 */
  1546. overflow-y: auto;
  1547. font-size: 14px;
  1548. line-height: 1.5;
  1549. }
  1550. }
  1551. }
  1552. .pagination {
  1553. margin-top: 10px;
  1554. padding: 10px 10px;
  1555. }
  1556. }
  1557. .recallDialog {
  1558. //撤回弹窗提示
  1559. height: 392px;
  1560. width: 700px;
  1561. background-image: url('/src/assets/receive-recall.png');
  1562. position: fixed; // 固定定位,相对于浏览器窗口
  1563. top: 50%; // 距离顶部50%
  1564. left: 50%; // 距离左侧50%
  1565. transform: translate(-50%, -50%); // 向左、向上平移自身宽高的50%,实现居中
  1566. z-index: 1000; // 确保在其他元素上层显示
  1567. .close {
  1568. position: absolute;
  1569. left: 625px;
  1570. top: 20px;
  1571. height: 38px;
  1572. width: 38px;
  1573. opacity: 0;
  1574. .Btn {
  1575. height: 100%;
  1576. width: 100%;
  1577. border-radius: 10px;
  1578. }
  1579. }
  1580. .text {
  1581. position: absolute;
  1582. left: 185px;
  1583. top: 190px;
  1584. height: 67px;
  1585. width: 500px;
  1586. .txt {
  1587. height: 100%;
  1588. width: 100%;
  1589. color: #001a42;
  1590. font-family: "PingFang SC";
  1591. font-size: 48px;
  1592. font-style: normal;
  1593. font-weight: 900;
  1594. line-height: normal;
  1595. }
  1596. }
  1597. .cancle {
  1598. position: absolute;
  1599. left: 185px;
  1600. top: 304px;
  1601. height: 55px;
  1602. width: 150px;
  1603. opacity: 0;
  1604. .Btn {
  1605. height: 100%;
  1606. width: 100%;
  1607. border-radius: 20px;
  1608. }
  1609. }
  1610. .confirm {
  1611. position: absolute;
  1612. left: 375px;
  1613. top: 304px;
  1614. height: 55px;
  1615. width: 150px;
  1616. opacity: 0;
  1617. .Btn {
  1618. height: 100%;
  1619. width: 100%;
  1620. border-radius: 20px;
  1621. }
  1622. }
  1623. }
  1624. :deep(.adddialog) {
  1625. //客服新增弹窗
  1626. min-width: 500px;
  1627. background-color: #F3FAFE !important;
  1628. margin-top: 8vh;
  1629. border-radius: 8px;
  1630. .addForm {
  1631. padding: 0 60px 1vh 60px;
  1632. .el-date-editor {
  1633. display: flex;
  1634. flex: 1;
  1635. }
  1636. .pic {
  1637. display: flex;
  1638. align-items: center;
  1639. .uploader {
  1640. height: 80px;
  1641. width: 80px;
  1642. .el-upload {
  1643. height: 100%;
  1644. width: 100%;
  1645. }
  1646. }
  1647. .picText {
  1648. color: #999999;
  1649. font-family: "PingFang SC";
  1650. font-size: 10px;
  1651. font-style: normal;
  1652. font-weight: 400;
  1653. line-height: 20px;
  1654. margin-left: 10px;
  1655. }
  1656. }
  1657. .moneyType {
  1658. position: relative;
  1659. width: 100%;
  1660. }
  1661. }
  1662. .dialog-footer {
  1663. display: flex;
  1664. justify-content: center;
  1665. padding-bottom: 1.5vh;
  1666. }
  1667. }
  1668. :deep(.editdialog) {
  1669. //编辑弹窗
  1670. min-width: 990px;
  1671. background-color: #F3FAFE !important;
  1672. margin-top: 8vh;
  1673. border-radius: 8px;
  1674. .editForm {
  1675. padding: 0 60px 1vh 60px;
  1676. .el-date-editor {
  1677. display: flex;
  1678. flex: 1;
  1679. }
  1680. .pic {
  1681. display: flex;
  1682. align-items: center;
  1683. .uploader {
  1684. height: 80px;
  1685. width: 80px;
  1686. .el-upload {
  1687. height: 100%;
  1688. width: 100%;
  1689. }
  1690. }
  1691. .picText {
  1692. color: #999999;
  1693. font-family: "PingFang SC";
  1694. font-size: 10px;
  1695. font-style: normal;
  1696. font-weight: 400;
  1697. line-height: 20px;
  1698. margin-left: 10px;
  1699. }
  1700. }
  1701. }
  1702. .content {
  1703. //编辑弹窗内容
  1704. display: flex;
  1705. height: 100%;
  1706. width: 100%;
  1707. .left {
  1708. min-width: 500px;
  1709. }
  1710. .right {
  1711. flex: 1;
  1712. .editFormRighrt {
  1713. padding: 0 60px 0 40px;
  1714. .el-date-editor {
  1715. display: flex;
  1716. flex: 1;
  1717. }
  1718. .pic {
  1719. display: flex;
  1720. align-items: center;
  1721. .uploader {
  1722. height: 80px;
  1723. width: 80px;
  1724. .el-upload {
  1725. height: 100%;
  1726. width: 100%;
  1727. }
  1728. }
  1729. .picText {
  1730. color: #999999;
  1731. font-family: "PingFang SC";
  1732. font-size: 10px;
  1733. font-style: normal;
  1734. font-weight: 400;
  1735. line-height: 20px;
  1736. margin-left: 10px;
  1737. }
  1738. }
  1739. }
  1740. .editBtns {
  1741. display: flex;
  1742. justify-content: center;
  1743. margin-top: 60px;
  1744. .txt {
  1745. color: #f3fafe;
  1746. text-align: center;
  1747. font-family: "PingFang SC";
  1748. font-size: 14px;
  1749. font-style: normal;
  1750. font-weight: 700;
  1751. line-height: 22px;
  1752. }
  1753. .editBtn1 {
  1754. min-width: 80px;
  1755. padding: 5px 12px;
  1756. justify-content: center;
  1757. align-items: center;
  1758. gap: 4px;
  1759. border-radius: 4px;
  1760. background: #7E91FF;
  1761. border: none;
  1762. box-shadow: 0 0 4px 0 #00000040;
  1763. }
  1764. .editBtn2 {
  1765. display: flex;
  1766. width: 80px;
  1767. min-width: 80px;
  1768. padding: 5px 12px;
  1769. justify-content: center;
  1770. align-items: center;
  1771. gap: 4px;
  1772. border-radius: 4px;
  1773. background: #2741DE;
  1774. border: none;
  1775. box-shadow: 0 0 4px 0 #00000040;
  1776. margin-left: 60px;
  1777. }
  1778. }
  1779. }
  1780. }
  1781. }
  1782. .refundDialog {
  1783. .left {
  1784. width: 50%;
  1785. height: 70vh;
  1786. min-height: 700px;
  1787. padding: 0 2vw;
  1788. .add-item {
  1789. display: flex;
  1790. align-items: center;
  1791. margin-bottom: 1vh;
  1792. }
  1793. .image {
  1794. width: 4vw !important;
  1795. height: 4vw !important;
  1796. }
  1797. }
  1798. .right {
  1799. width: 50%;
  1800. height: 50vh;
  1801. .add-item {
  1802. display: flex;
  1803. align-items: center;
  1804. margin-bottom: 1vh;
  1805. }
  1806. }
  1807. }
  1808. :deep(.adddialog .el-form-item__label) {
  1809. //设置新增弹窗表头
  1810. min-width: 80px;
  1811. width: auto;
  1812. font-weight: 800;
  1813. padding-bottom: 15px;
  1814. }
  1815. }
  1816. // 搜索的卡片样式
  1817. .card1 {
  1818. background: #F3FAFE;
  1819. }
  1820. // 表单的卡片样式
  1821. .card2 {
  1822. background: #E7F4FD;
  1823. }
  1824. // 表头背景等
  1825. :deep(.el-table__header-wrapper),
  1826. :deep(.el-table__body-wrapper),
  1827. :deep(.el-table__cell),
  1828. /* 表格 */
  1829. :deep(.el-table__body td) {
  1830. background-color: #F3FAFE !important;
  1831. }
  1832. /* 表头 */
  1833. :deep(.el-table__header th) {
  1834. background-color: #F3FAFE !important;
  1835. }
  1836. /* 鼠标悬停 */
  1837. :deep(.el-table__row:hover > .el-table__cell) {
  1838. background-color: #E5EBFE !important;
  1839. }
  1840. /* 自定义弹窗样式 */
  1841. .reject-reason-box {
  1842. /* 调整弹窗整体高度 */
  1843. --el-message-box-height: 500px;
  1844. /* 控制弹窗总高度 */
  1845. }
  1846. /* 调整内容区域样式,确保超出滚动 */
  1847. .reject-reason-box .el-message-box__content {
  1848. max-height: 350px;
  1849. /* 内容区域最大高度(根据总高度调整) */
  1850. overflow-y: auto;
  1851. /* 超出部分显示垂直滚动条 */
  1852. white-space: pre-wrap;
  1853. /* 处理换行符,避免内容挤在一起 */
  1854. }
  1855. </style>