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.

449 lines
18 KiB

2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
  1. <template>
  2. <div class="content">
  3. <div class="card1">
  4. <el-card 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 placeholder="请输入精网号" style="width:10vw;" clearable></el-input>
  9. </div>
  10. <div class="rowItem">
  11. <text style="width: 4vw;">客户姓名</text>
  12. <el-input placeholder="请输入客户姓名" style="width:10vw;" clearable></el-input>
  13. </div>
  14. <div class="rowItem">
  15. <text style="width: 4vw;">所属地区</text>
  16. <el-select placeholder="请选择所属地区" style="width:10vw;" clearable></el-select>
  17. </div>
  18. <div class="rowItem">
  19. <text style="width: 4vw;">订单状态</text>
  20. <el-select placeholder="请选择订单状态" style="width: 10vw;" clearable></el-select>
  21. </div>
  22. <div class="rowItem">
  23. <text style="width: 4vw;">支付方式</text>
  24. <el-select placeholder="请选择支付方式" style="width: 10vw;" clearable></el-select>
  25. </div>
  26. </div>
  27. <div class="row" style="margin-top: 10px;">
  28. <div class="rowItem">
  29. <text style="width: 4vw;">活动名称</text>
  30. <el-select placeholdert="请选择活动方式" style="width: 10vw;" clearable></el-select>
  31. </div>
  32. <div class="rowItem">
  33. <text style="width: 4vw;">产品名称</text>
  34. <el-select placeholder="请选择产品名称" style="width: 10vw;" clearable></el-select>
  35. </div>
  36. <div class="rowItem" style="width: 30vw">
  37. <text style="width: 4vw; margin-left: 0.5vw;">付款时间</text>
  38. <el-date-picker v-model="getTime" type="datetimerange" range-separator=""
  39. start-placeholder="起始时间" end-placeholder="结束时间" style="width: 22vw; "
  40. @change="handleDatePickerChange" :default-time="defaultTime"
  41. :disabled-date="disabledDate" />
  42. </div>
  43. </div>
  44. <div class="row" style="margin-top: 10px;">
  45. <div class="buttons">
  46. <el-button type="primary">查询</el-button>
  47. <el-button type="success">重置</el-button>
  48. <el-button type="primary">导出excel</el-button>
  49. <el-button type="primary" style="background-color: #5870FF;">导出列表</el-button>
  50. </div>
  51. </div>
  52. </el-card>
  53. </div>
  54. <div class="card2">
  55. <el-card>
  56. <div class="btns">
  57. <div class="tabs">
  58. <el-button-group>
  59. <el-button class="btnItem"
  60. :style="{ backgroundColor: activeTab === 'wait' ? '#2741DE' : '#E5EBFE', color: activeTab === 'wait' ? 'white' : '#666' }"
  61. @click="navigateTo('wait')">
  62. 待审核
  63. </el-button>
  64. <el-button class="btnItem"
  65. :style="{ backgroundColor: activeTab === 'pass' ? '#2741DE' : '#E5EBFE', color: activeTab === 'pass' ? 'white' : '#666' }"
  66. @click="navigateTo('pass')">
  67. 已通过
  68. </el-button>
  69. <el-button class="btnItem"
  70. :style="{ backgroundColor: activeTab === 'reject' ? '#2741DE' : '#E5EBFE', color: activeTab === 'reject' ? 'white' : '#666' }"
  71. @click="navigateTo('reject')">
  72. 已驳回
  73. </el-button>
  74. </el-button-group>
  75. </div>
  76. <div class="btnAdd">
  77. <el-button @click="openAddForm" type="success">添加收款</el-button>
  78. </div>
  79. </div>
  80. <div class="table">
  81. <el-table :data="tableData" style="width: 80vw;height:54vh;" @sort-change="handleSortChange"
  82. :row-style="{ height: '60px' }" :header-cell-style="{ textAlign: 'center' }"
  83. :cell-style="{ textAlign: 'center' }">
  84. <el-table-column type="index" label="序号" width="100px" fixed="left">
  85. <template #default="scope">
  86. <span>{{ scope.$index + 1 + (pageInfo.pageNum - 1) * pageInfo.pageSize }}</span>
  87. </template>
  88. </el-table-column>
  89. <el-table-column fixed="left" prop="jwcode" label="Homily ID" width="110px" />
  90. <el-table-column fixed="left" prop="name" label="姓名" width="110px" />
  91. <el-table-column prop="market" label="所属地区" width="80px" />
  92. <el-table-column prop="activity" label="活动名称" width="120px" />
  93. <el-table-column prop="rateName" label="产品名称" width="120px" />
  94. <el-table-column prop="money" label="付款币种" width="100px">
  95. </el-table-column>
  96. <el-table-column prop="permanentGold" label="付款金额" width="120px">
  97. </el-table-column>
  98. <el-table-column prop="freeGold" label="支付方式" width="110px">
  99. </el-table-column>
  100. <el-table-column prop="remark" label="付款时间" width="200px" />
  101. <el-table-column prop="payModel" label="转账凭证" width="110px">
  102. <template #default="scope">
  103. <div v-if="scope.row.voucher"
  104. style="display: flex; justify-content: center; align-items: center; cursor: pointer;"
  105. @click="previewImage(scope.row.voucher)">
  106. <img :src="scope.row.payModel" alt="支付凭证" style="width: auto; height: 40px;">
  107. </div>
  108. <div v-else
  109. style="display: flex; justify-content: center; align-items: center; height: 40px;">
  110. --
  111. </div>
  112. </template>
  113. </el-table-column>
  114. <el-table-column prop="" label="备注" width="150px" show-overflow-tooltip>
  115. </el-table-column>
  116. <el-table-column fixed="right" prop="adminName" label="订单状态" width="100px" />
  117. <el-table-column fixed="right" prop="rejectReason" label="操作" width="100px" />
  118. </el-table>
  119. </div>
  120. <div class="pagination">
  121. <el-pagination :page-size="pageInfo.pageSize" :page-sizes="[5, 10, 20, 50, 100]"
  122. layout="total, sizes, prev, pager, next, jumper" :total="total"
  123. @size-change="handlePagination('size', $event)"
  124. @current-change="handlePagination('page', $event)"></el-pagination>
  125. </div>
  126. </el-card>
  127. </div>
  128. <el-dialog class="adddialog" v-model="addFormisible" width="20vw" :before-close="closeAddForm">
  129. <el-form class="addForm" label-width="4vw" label-position="left">
  130. <el-form-item label="精网号" required>
  131. <el-input v-model="addFormData.jwcode" placeholder="请输入驳回理由" />
  132. </el-form-item>
  133. <el-form-item label="客户姓名" required>
  134. <el-input v-model="addFormData.userName" placeholder="请输入客户姓名" />
  135. </el-form-item>
  136. <el-form-item label="所属地区" required>
  137. <el-input disabled="true" v-model="addFormData.market" placeholder="请输入所属地区" />
  138. </el-form-item>
  139. <el-form-item label="活动名称" required>
  140. <el-input v-model="addFormData.jwcode" placeholder="请输入活动名称" />
  141. </el-form-item>
  142. <el-form-item label="产品名称" required>
  143. <el-select placeholder="请选择产品名称" clearable></el-select>
  144. </el-form-item>
  145. <el-form-item label="付款币种" required>
  146. <el-select placeholder="请选择付款币种" clearable></el-select>
  147. </el-form-item>
  148. <el-form-item label="付款金额" required>
  149. <el-input v-model="addFormData.jwcode" placeholder="请输入付款金额" />
  150. </el-form-item>
  151. <el-form-item label="支付方式" required>
  152. <el-select placeholder="请选择支付方式" clearable></el-select>
  153. </el-form-item>
  154. <el-form-item label="付款时间" required>
  155. <el-time-picker v-model="addFormData.time" placeholder="请选择付款时间" />
  156. </el-form-item>
  157. <el-form-item label="转账凭证" required>
  158. <el-upload ref="uploadRef" class="uploader" :show-file-list="false" list-type="picture-card"
  159. :auto-upload="false" :before-upload="beforeUpload" :on-error="handelImgErr"
  160. :on-change="handleImageChange" :http-request="customUpload">
  161. <img v-if="addFormData.imageUrl" :src="addFormData.imageUrl" class="avatar"
  162. style="height: 100%; width: 100%; object-fit: cover;" />
  163. <el-icon v-else class="avatar-uploader-icon">
  164. <Plus />
  165. </el-icon>
  166. </el-upload>
  167. </el-form-item>
  168. <el-form-item label="驳回理由" required>
  169. <el-input v-model="addFormData.mask" type="textarea" :rows="4" placeholder="请输入驳回理由" maxlength="200"
  170. show-word-limit />
  171. </el-form-item>
  172. </el-form>
  173. <template #footer>
  174. <span class="dialog-footer">
  175. <el-button style="background-color: #7E91FF;" @click="closeAddForm">取消</el-button>
  176. <el-button style="background-color: #2741DE; margin-left: 2.5vw;" type="primary"
  177. @click="handleReject">确定</el-button>
  178. </span>
  179. </template>
  180. </el-dialog>
  181. </div>
  182. </template>
  183. <script setup>
  184. import { ref } from 'vue';
  185. import { ElMessage } from 'element-plus'
  186. import API from '@/util/http.js'
  187. //==================== 标签切换 =========================
  188. const activeTab = ref('wait')
  189. const navigateTo = (tab) => {
  190. if (tab === 'wait') {
  191. activeTab.value = 'wait'
  192. } else if (tab === 'pass') {
  193. activeTab.value = 'pass'
  194. }
  195. else if (tab === 'reject') {
  196. activeTab.value = 'reject'
  197. }
  198. }
  199. //================= 客服新增弹窗 ==================
  200. const addFormData = ref({
  201. })
  202. const addFormisible = ref(false)
  203. const uploadRef = ref()
  204. const openAddForm = () => {
  205. addFormisible.value = true
  206. }
  207. const closeAddForm = () => {
  208. addFormisible.value = false
  209. addFormData.value = {}
  210. }
  211. const handleImgSuccess = (response, uploadFile) => {
  212. try {
  213. console.log('11', response)
  214. addFormData.value.imageUrl = response.data.url
  215. console.log('22', response.data.url)
  216. } catch (error) {
  217. console.log('报错信息', error)
  218. ElMessage.error(response.msg || '图片上传失败')
  219. }
  220. }
  221. const handelImgErr = (err) => {
  222. console.log(err);
  223. addFormData.value.imageUrl = null
  224. ElMessage.error("图片上传失败")
  225. }
  226. const beforeUpload = (rawFile) => {
  227. if (rawFile.type !== 'image/jpeg' && rawFile.type !== 'image/png') {
  228. ElMessage.error('图片必须是jpg或png类型!')
  229. return false
  230. } else if (rawFile.size / 1024 / 1024 > 1) {
  231. ElMessage.error('图片大小不能超过 1MB!')
  232. return false
  233. }
  234. return true
  235. }
  236. const handleImageChange = (file) => {
  237. uploadRef.value.submit()
  238. }
  239. const customUpload = async (options) => {
  240. try {
  241. const formData = new FormData()
  242. formData.append('file', options.file)
  243. const response = await API({
  244. url: 'https://api.homilychart.com/hljw/api/aws/upload',
  245. method: 'POST',
  246. data: formData,
  247. headers: {
  248. 'Content-Type': 'multipart/form-data'
  249. }
  250. })
  251. if (response.code === 200 && response.data) {
  252. handleImgSuccess(response, options.file)
  253. ElMessage.success(response.msg || '上传成功')
  254. } else {
  255. options.onError(response)
  256. ElMessage.error(response.msg || '上传失败')
  257. }
  258. } catch (error) {
  259. console.error('上传错误:', error)
  260. ElMessage.error(`上传失败: ${error.msg || error.message || '网络异常'}`)
  261. }
  262. }
  263. //========================分页相关==================
  264. const pageInfo = ref({
  265. pageSize: 10,
  266. pageNum: 1
  267. })
  268. const total = ref(0)
  269. const tableData = [
  270. {
  271. jwcode: 'HW2023001',
  272. name: '张三',
  273. market: '北京',
  274. activity: '春季促销活动',
  275. rateName: '黄金投资产品A',
  276. money: '人民币',
  277. permanentGold: '5000.00',
  278. freeGold: '银行转账',
  279. remark: '2023-03-15 10:30:00',
  280. voucher: 'https://example.com/images/voucher1.jpg',
  281. adminName: '已支付',
  282. rejectReason: '无',
  283. },
  284. {
  285. jwcode: 'HW2023002',
  286. name: '李四',
  287. market: '上海',
  288. activity: '夏日特惠活动',
  289. rateName: '白银理财产品B',
  290. money: '人民币',
  291. permanentGold: '3000.00',
  292. freeGold: '支付宝',
  293. remark: '2023-06-20 14:15:00',
  294. voucher: 'https://example.com/images/voucher2.jpg',
  295. adminName: '已支付',
  296. rejectReason: '无',
  297. },
  298. {
  299. jwcode: 'HW2023003',
  300. name: '王五',
  301. market: '广州',
  302. activity: '秋季回馈活动',
  303. rateName: '铂金收藏产品C',
  304. money: '美元',
  305. permanentGold: '1000.00',
  306. freeGold: '微信支付',
  307. remark: '2023-09-10 09:20:00',
  308. voucher: '',
  309. adminName: '待支付',
  310. rejectReason: '无',
  311. },
  312. {
  313. jwcode: 'HW2023004',
  314. name: '赵六',
  315. market: '深圳',
  316. activity: '冬季感恩活动',
  317. rateName: '钻石尊享产品D',
  318. money: '欧元',
  319. permanentGold: '2000.00',
  320. freeGold: '信用卡',
  321. remark: '2023-12-05 16:40:00',
  322. voucher: 'https://example.com/images/voucher4.jpg',
  323. adminName: '已支付',
  324. rejectReason: '无',
  325. },
  326. {
  327. jwcode: 'HW2023005',
  328. name: '孙七',
  329. market: '成都',
  330. activity: '周年庆典活动',
  331. rateName: '翡翠投资产品E',
  332. money: '人民币',
  333. permanentGold: '8000.00',
  334. freeGold: '银行转账',
  335. remark: '2024-01-20 11:10:00',
  336. voucher: '',
  337. adminName: '已驳回',
  338. rejectReason: '支付金额有误',
  339. }
  340. ];
  341. </script>
  342. <style scoped lang="scss">
  343. .content {
  344. height: 100%;
  345. width: 83vw;
  346. .card1 {
  347. width: 100%;
  348. .row {
  349. height: 4vh;
  350. width: 80vw;
  351. display: flex;
  352. min-height: 40px;
  353. .rowItem {
  354. display: flex;
  355. width: 15vw;
  356. align-items: center;
  357. justify-content: center;
  358. margin-right: 0.5vw;
  359. }
  360. .buttons {
  361. display: flex;
  362. justify-content: center;
  363. align-items: center;
  364. margin-left: 10px;
  365. }
  366. }
  367. }
  368. .card2 {
  369. width: 100%;
  370. margin-top: 2vh;
  371. .btns {
  372. display: flex;
  373. align-items: center;
  374. justify-content: space-between;
  375. .tabs{
  376. min-width: 300px;
  377. .btnItem {
  378. margin-left: 10px;
  379. border-radius: 5px;
  380. }
  381. }
  382. .btnAdd {
  383. flex: 1;
  384. justify-content: flex-end;
  385. margin-right: 1vw;
  386. }
  387. }
  388. .table {
  389. margin: 10px 3vw;
  390. border-radius: 20px;
  391. }
  392. .pagination {
  393. margin-top: 10px;
  394. padding: 10px 10px;
  395. }
  396. }
  397. :deep(.adddialog) {
  398. min-width: 450px;
  399. background-color: #F3FAFE !important;
  400. .addForm {
  401. padding: 0 3vw 1vh 1vw;
  402. .el-date-editor {
  403. display: flex;
  404. flex: 1;
  405. }
  406. }
  407. .dialog-footer {
  408. display: flex;
  409. justify-content: center;
  410. padding-bottom: 1.5vh;
  411. }
  412. }
  413. :deep(.adddialog .el-form-item__label) {
  414. min-width: 80px;
  415. width: auto;
  416. font-weight: 800;
  417. padding-bottom: 15px;
  418. }
  419. }
  420. </style>