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.

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