Compare commits

...

36 Commits

Author SHA1 Message Date
zq 80b695817e 修改退款记录表格内图标大小 1 week ago
zq 3c18c1b359 增加图片 1 week ago
zq 5c68a5655e 增加确认收货弹出框 1 week ago
zq 1cd6cde3c1 修改余额管理元素样式 2 weeks ago
zq df53038f31 Merge branch 'zq-0828-newMenu' of gitea.intra.yunpaper.com:zhangqi/kuailelunwen_new_houtai into zq-0828-newMenu 2 weeks ago
zq 41708a4c74 修改布局、增加图片显示 2 weeks ago
pengda 87b9abd84c 采购价列表优化 2 weeks ago
pengda 74067f4327 采购价列表优化 4 weeks ago
pengda b4bb7faa00 Merge remote-tracking branch 'origin/zq-0828-newMenu' into zq-0828-newMenu 4 weeks ago
pengda 3e87a16cbd 代收款结算 4 weeks ago
pengda f95fddc2ff 余额管理 4 weeks ago
pengda 03484623e7 余额管理 4 weeks ago
pengda 5b8030ce86 余额管理 4 weeks ago
pengda c54fe01954 余额管理 4 weeks ago
pengda 17cc7a861c 收支统计渲染 1 month ago
pengda 54397eb34b 收支统计渲染 1 month ago
pengda aed2202f60 收支统计渲染 1 month ago
zq 61acea2ff7 增加收支统计页面 1 month ago
pengda 6b15ba303f 余额管理 4 weeks ago
pengda 744ea6edc0 余额管理 4 weeks ago
pengda 24db323963 余额管理 4 weeks ago
pengda acd8d10338 Merge remote-tracking branch 'origin/zq-0828-newMenu' into zq-0828-newMenu 4 weeks ago
pengda e69e2d4c36 余额管理 4 weeks ago
pengda 52bf7b9565 收支统计渲染 1 month ago
pengda f7175e0fb7 收支统计渲染 1 month ago
pengda 1f0dfd0b00 收支统计渲染 1 month ago
zq d67a87dc9a 增加收支统计页面 1 month ago
pengda 93ecb3df68 余额管理 4 weeks ago
pengda 42c93d4c8a 收支统计渲染 1 month ago
pengda 27e25fd1b5 Merge remote-tracking branch 'origin/zq-0828-newMenu' into zq-0828-newMenu 1 month ago
pengda 1100c5245d 收支统计渲染 1 month ago
pengda 48fb904728 收支统计渲染 1 month ago
zq 4c8330eb97 增加收支统计页面 1 month ago
pengda 4a3a89f781 收支统计渲染 1 month ago
pengda adf83c54c4 收支统计渲染 1 month ago
zq f4950a7b9a 增加收支统计页面 1 month ago
  1. 1
      src/assets/input_ex_ic_high.svg
  2. 1
      src/assets/mon-expend.svg
  3. 1
      src/assets/mon-income.svg
  4. 1
      src/assets/mon-loss.svg
  5. 1
      src/assets/mon-order-volume.svg
  6. 1
      src/assets/mon-profit.svg
  7. BIN
      src/assets/site/recharge_bonus.png
  8. BIN
      src/assets/site/refund_reason.png
  9. 1
      src/assets/site/tb_buy_btn.svg
  10. 13
      src/components/GuipSelect.vue
  11. 6
      src/components/super/DateSelect.vue
  12. 70
      src/router/index.js
  13. 405
      src/views/agent/expenseDetails.vue
  14. 505
      src/views/agent/expenseStatistics.vue
  15. 391
      src/views/agent/payoff.vue
  16. 92
      src/views/agent/payoffDetails.vue
  17. 605
      src/views/agent/recharge.vue

1
src/assets/input_ex_ic_high.svg

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="none" version="1.1" width="16" height="16" viewBox="0 0 16 16"><g transform="matrix(0,1,1,0,0,0)"><g><path d="M2.41611984,5.50065616L8,10.1538897L13.583845,5.5006856L13.58388,5.50065616Q13.671492,5.42764693,13.778725,5.38882351Q13.885956,5.3500000199999995,14,5.3500000199999995Q14.064018,5.3500000199999995,14.126807,5.36248958Q14.189596,5.37497914,14.248743,5.39947838Q14.307889,5.42397749,14.361119,5.45954478Q14.41435,5.49511206,14.459619,5.54038063Q14.504887,5.58564919,14.540454,5.63887939Q14.576021,5.69210958,14.60052,5.75125581Q14.625019,5.81040204,14.637508,5.87319131Q14.649999,5.935980596,14.65,6Q14.65,6.14467999,14.588634,6.27570069Q14.527267,6.40672141,14.416121,6.49934337L8.4161201,11.4993439Q8.3726463,11.5355721,8.3235664,11.5637422Q8.2744865,11.5919123,8.2212763,11.6111765Q8.168067,11.6304412,8.1123285,11.6402206Q8.056590100000001,11.649999600000001,8,11.649999600000001Q7.9434099,11.649999600000001,7.8876719,11.6402206Q7.8319335,11.630440700000001,7.7787237,11.611176Q7.7255144,11.5919118,7.6764345,11.5637417Q7.6273541,11.5355721,7.5838804,11.4993439L1.58388016,6.49934384Q1.47273374,6.40672189,1.41136682,6.27570105Q1.3499999599999999,6.14468019,1.35000002,6Q1.35000002,5.935980596,1.36248958,5.87319131Q1.37497914,5.81040204,1.3994783800000001,5.75125581Q1.42397749,5.69210958,1.4595447799999999,5.63887939Q1.4951120599999999,5.58564919,1.54038063,5.54038063Q1.58564919,5.49511206,1.63887939,5.45954478Q1.69210958,5.42397749,1.75125581,5.39947838Q1.81040204,5.37497914,1.87319131,5.36248958Q1.935980596,5.3500000199999995,2,5.3500000199999995Q2.11404403,5.3500000199999995,2.2212764,5.38882351Q2.32850876,5.42764693,2.41611984,5.50065616Z" fill-rule="evenodd" fill="#006AFF" fill-opacity="1"/></g></g></svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

1
src/assets/mon-expend.svg

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="none" version="1.1" width="20" height="20.782123565673828" viewBox="0 0 20 20.782123565673828"><defs><clipPath id="master_svg0_847_032729"><rect x="0" y="0" width="20" height="20.782123565673828" rx="0"/></clipPath></defs><g clip-path="url(#master_svg0_847_032729)"><g><rect x="4" y="1" width="12" height="12" rx="0" fill="#006AFF" fill-opacity="1"/></g><g transform="matrix(1,0,0,-1,0,38.953125)"><path d="M10,19.4765625L18.660254,27.3337054L1.3397461,27.3337054L10,19.4765625Z" fill="#006AFF" fill-opacity="1"/></g><g><path d="M9.1913283,11.0580268L7.51306236,11.0580268C7.35655603,11.0444522,7.23625572,10.96734,7.15216154,10.826971499999999C7.06885609,10.6888022,7.016509678,10.5279632,7,10.3594456C7.017378883,10.188221500000001,7.068115413,10.0477405,7.15216154,9.938231C7.23620769,9.8286071,7.35650802,9.767065500000001,7.51306236,9.753319300000001L9.1912801,9.753319300000001L9.1912801,9.106069999999999L7.51306236,9.0958033C7.35655603,9.0821152,7.23625572,9.0170364,7.15216154,8.9005685C7.068115413,8.7841563,7.017378883,8.6368322,7,8.4587641C7.017378883,8.2875981,7.068115413,8.1471739,7.15216154,8.0375504C7.23620769,7.9279835,7.35650802,7.8663273,7.51306236,7.8526378L8.7652085,7.8526378L7.60000461,5.4280212C7.54207498,5.3458319,7.48699379,5.2414551,7.43485719,5.1146632C7.38267225,4.98798543,7.35945216,4.84927291,7.3652451,4.69863987C7.3942582,4.50682652,7.45218754,4.35100302,7.53917849,4.23116961C7.6260727,4.11127912,7.7884686,4.034222949,8.026076,4.000058092959C8.1652515,4.013803818,8.2898962,4.070212834,8.4000592,4.16957028C8.5102221,4.26892772,8.6000133,4.37666878,8.6695285,4.493137L9.991286800000001,7.3492343L11.4434352,4.47260371C11.5129981,4.35613537,11.602838,4.25341275,11.7129517,4.1643219C11.8231635,4.075345144,11.9478078,4.020533139,12.0868874,4C12.1739259,4.0068444167,12.2535801,4.020476025,12.3259921,4.041123286C12.3984518,4.061599314,12.4622226,4.095878176,12.517303,4.14384587C12.5723844,4.19181357,12.618825000000001,4.26031423,12.6564798,4.34929097C12.694085099999999,4.4384388,12.7217469,4.55479306,12.7390766,4.69863909C12.7390766,4.89723963,12.681098500000001,5.0856309,12.5650949,5.2636986L11.2173648,7.8526945L12.4956274,7.8526945C12.6462936,7.8663836,12.765193499999999,7.9280396,12.8521352,8.037606199999999C12.9390783,8.147172900000001,12.9883661,8.2875972,12.999952799999999,8.4588208C12.988414800000001,8.636887999999999,12.9376783,8.7876353,12.8477912,8.910948300000001C12.7580004,9.0341468,12.6377001,9.1027045,12.486938,9.116392600000001L10.8261473,9.126659400000001L10.8261473,9.753376L12.4956751,9.753376C12.6463413,9.7671208,12.7652407,9.8355646,12.852183799999999,9.9588199C12.9391265,10.082133800000001,12.988414800000001,10.229342899999999,13,10.400681500000001C12.9884629,10.5787482,12.9391265,10.7276716,12.852183799999999,10.8475614C12.7652407,10.967452,12.6463413,11.0341854,12.4956751,11.0479865L10.8261473,11.037606700000001L10.8261473,12.1267157C10.8029273,12.7088299,10.5333617,13.0000019,10.0174513,13.0000019C9.7623684,13.0000019,9.5638151,12.9280777,9.4217913,12.7841759C9.2797196,12.6403875,9.2029629,12.4212532,9.1913769,12.1267738L9.1913283,11.0580268L9.1913283,11.0580268Z" fill="#FFFFFF" fill-opacity="1" style="mix-blend-mode:passthrough"/></g></g></svg>

After

Width:  |  Height:  |  Size: 3.2 KiB

1
src/assets/mon-income.svg

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="none" version="1.1" width="20" height="20.782123565673828" viewBox="0 0 20 20.782123565673828"><defs><clipPath id="master_svg0_847_032797"><rect x="0" y="0" width="20" height="20.782123565673828" rx="0"/></clipPath></defs><g clip-path="url(#master_svg0_847_032797)"><g transform="matrix(1,0,0,-1,0,38.953125)"><g><g><rect x="4" y="19.4765625" width="12" height="12" rx="0" fill="#006AFF" fill-opacity="1"/></g><g transform="matrix(1,0,0,-1,0,75.90625)"><path d="M10,37.953125L18.660254,45.8102679L1.3397461,45.8102679L10,37.953125Z" fill="#006AFF" fill-opacity="1"/></g></g><g transform="matrix(1,0,0,-1,0,62.953125)"><path d="M9.1913283,38.5345893L7.51306236,38.5345893C7.35655603,38.5210147,7.23625572,38.4439025,7.15216154,38.303534C7.06885609,38.1653647,7.016509678,38.0045257,7,37.8360081C7.017378883,37.664784,7.068115413,37.524303,7.15216154,37.4147935C7.23620769,37.3051696,7.35650802,37.243628,7.51306236,37.2298818L9.1912801,37.2298818L9.1912801,36.5826325L7.51306236,36.5723658C7.35655603,36.5586777,7.23625572,36.4935989,7.15216154,36.377131C7.068115413,36.2607188,7.017378883,36.1133947,7,35.935326599999996C7.017378883,35.7641606,7.068115413,35.6237364,7.15216154,35.5141129C7.23620769,35.404545999999996,7.35650802,35.3428898,7.51306236,35.3292003L8.7652085,35.3292003L7.60000461,32.9045837C7.54207498,32.8223944,7.48699379,32.7180176,7.43485719,32.5912257C7.38267225,32.46454793,7.35945216,32.32583541,7.3652451,32.17520237C7.3942582,31.98338902,7.45218754,31.82756552,7.53917849,31.70773211C7.6260727,31.58784162,7.7884686,31.510785449,8.026076,31.476620592959C8.1652515,31.490366318,8.2898962,31.546775334,8.4000592,31.64613278C8.5102221,31.74549022,8.6000133,31.85323128,8.6695285,31.9696995L9.991286800000001,34.8257968L11.4434352,31.94916621C11.5129981,31.83269787,11.602838,31.72997525,11.7129517,31.6408844C11.8231635,31.551907644,11.9478078,31.497095639,12.0868874,31.4765625C12.1739259,31.4834069167,12.2535801,31.497038525,12.3259921,31.517685786C12.3984518,31.538161814,12.4622226,31.572440676,12.517303,31.62040837C12.5723844,31.66837607,12.618825000000001,31.73687673,12.6564798,31.82585347C12.694085099999999,31.9150013,12.7217469,32.03135556,12.7390766,32.17520159C12.7390766,32.37380213,12.681098500000001,32.5621934,12.5650949,32.7402611L11.2173648,35.329257L12.4956274,35.329257C12.6462936,35.3429461,12.765193499999999,35.4046021,12.8521352,35.5141687C12.9390783,35.6237354,12.9883661,35.7641597,12.999952799999999,35.9353833C12.988414800000001,36.1134505,12.9376783,36.2641978,12.8477912,36.3875108C12.7580004,36.5107093,12.6377001,36.579267,12.486938,36.5929551L10.8261473,36.6032219L10.8261473,37.2299385L12.4956751,37.2299385C12.6463413,37.2436833,12.7652407,37.3121271,12.852183799999999,37.4353824C12.9391265,37.5586963,12.988414800000001,37.7059054,13,37.877244C12.9884629,38.0553107,12.9391265,38.2042341,12.852183799999999,38.324123900000004C12.7652407,38.4440145,12.6463413,38.5107479,12.4956751,38.524549L10.8261473,38.5141692L10.8261473,39.6032782C10.8029273,40.1853924,10.5333617,40.4765644,10.0174513,40.4765644C9.7623684,40.4765644,9.5638151,40.4046402,9.4217913,40.2607384C9.2797196,40.11695,9.2029629,39.8978157,9.1913769,39.6033363L9.1913283,38.5345893L9.1913283,38.5345893Z" fill="#FFFFFF" fill-opacity="1" style="mix-blend-mode:passthrough"/></g></g></g></svg>

After

Width:  |  Height:  |  Size: 3.3 KiB

1
src/assets/mon-loss.svg

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="none" version="1.1" width="20" height="20" viewBox="0 0 20 20"><defs><clipPath id="master_svg0_847_044843"><rect x="0" y="0" width="20" height="20" rx="0"/></clipPath></defs><g clip-path="url(#master_svg0_847_044843)"><g><path d="M17.92996,6.5624995C18.382853,6.5624995,18.75,6.9343944,18.75,7.3930273L18.75,17.606972C18.75,18.065662,18.382891,18.437498,17.92996,18.437498L15.566269,18.437498C15.113379,18.437498,14.746229,18.065701,14.746229,17.606972L14.746229,7.3930273C14.746229,6.9343944,15.113339,6.5624995,15.566269,6.5624995L17.92996,6.5624995ZM8.808671499999999,8.961503C9.2615623,8.961503,9.6287689,9.333338699999999,9.6287689,9.7920303L9.6287689,17.606951C9.6287689,18.065641,9.2616005,18.437477,8.808671499999999,18.437477L6.4450393,18.437477C5.9921484,18.437477,5.6250005,18.06568,5.6250005,17.606951L5.6250005,9.7920303C5.6250005,9.333338699999999,5.9921098,8.961503,6.4450393,8.961503L8.808671499999999,8.961503ZM13.242929,11.396327C13.684374,11.396327,14.042225,11.758554,14.042225,12.20537L14.042225,17.628475C14.042225,18.075293,13.684373,18.437517,13.242929,18.437517L10.9392376,18.437517C10.4978313,18.437517,10.1399994,18.075331,10.1399994,17.628475L10.1399994,12.20537C10.1399994,11.758554,10.4977913,11.396327,10.9392376,11.396327L13.242929,11.396327ZM4.353008,13.410115C4.7944529,13.410115,5.152246,13.772381,5.152246,14.219217L5.152246,17.628475C5.152246,18.075293,4.7944334,18.437517,4.353008,18.437517L2.0492969199999997,18.437517C1.6078907,18.437498,1.25,18.075312,1.25,17.628456L1.25,14.219217C1.25,13.7724,1.60785159,13.410115,2.0492969199999997,13.410115L4.353008,13.410115ZM2.7157422,10.2778301C2.4810492,10.5165968,2.09619707,10.5165968,1.8615039599999998,10.2778301C1.62556645,10.0390015,1.62556645,9.6518545,1.8614454299999998,9.4130645L7.2190042,3.9899402C7.4536786,3.7511284,7.8385677,3.7511284,8.0732422,3.9899402L11.160429,7.1149392L15.14125,3.0853693L14.202539,2.1351741L17.5,1.5625L16.934297,4.9004097L15.995584,3.9501362L11.587578,8.412108400000001C11.352885,8.650876,10.9680328,8.650876,10.7333393,8.412108400000001L7.646152,5.2870501999999995L2.7157422,10.2778301Z" fill="#FF4D4F" fill-opacity="1"/></g></g></svg>

After

Width:  |  Height:  |  Size: 2.2 KiB

1
src/assets/mon-order-volume.svg

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="none" version="1.1" width="20" height="20" viewBox="0 0 20 20"><defs><clipPath id="master_svg0_847_032867"><rect x="0" y="0" width="20" height="20" rx="0"/></clipPath></defs><g clip-path="url(#master_svg0_847_032867)"><g><path d="M11.792826607714844,1.33984375L8.006713407714845,1.33984375C7.542327907714844,1.33984375,7.171059607714843,1.75302371,7.171059607714843,2.26373732C7.171059607714843,2.77563025,7.543006907714844,3.19002935,8.006713407714845,3.19002935L11.816250807714844,3.19002935C12.257271407714844,3.19002935,12.629099407714843,2.77563035,12.629099407714843,2.26373732C12.629199407714843,1.75300351,12.257811407714843,1.33984375,11.792826607714844,1.33984375ZM15.903918407714844,1.95648557L14.018536407714844,1.95648557C14.037703407714844,2.05771697,14.048776407714843,2.16010761,14.048776407714843,2.26373732C14.049356407714845,3.04143015,13.485199407714843,3.80683115,12.814112407714843,3.80683115L7.021860607714844,3.80683115C6.315599007714844,3.80683115,5.750682107714844,3.04143015,5.750682107714844,2.26373732C5.751361807714844,2.16010761,5.762434507714843,2.05771697,5.781600907714844,1.95648557L3.8734350077148436,1.95648557C2.3395750177148438,1.95648557,1.9627304077148438,2.82607595,1.9627304077148438,4.08052535L1.9627304077148438,16.50649975C1.9627304077148438,17.85406675,2.502364577714844,18.60827475,3.989256607714844,18.60827475L15.787978407714844,18.60827475C17.274890407714842,18.60827475,17.997699407714844,18.01693575,17.997699407714844,16.50717975L17.997699407714844,4.08050565C17.997819407714843,2.82617595,17.321098407714842,1.95658553,15.903918407714844,1.95648557L15.903918407714844,1.95648557ZM13.966852407714844,14.22520775L5.767990807714844,14.22520775C5.465796007714843,14.22520775,5.164120407714844,13.85449875,5.164120407714844,13.55182375C5.164120407714844,13.25016775,5.419447407714843,12.99176275,5.721662307714844,12.99176275L13.897119407714843,12.99176275C14.199234407714844,12.99176275,14.454541407714844,13.22664375,14.477465407714844,13.55182375C14.477465407714844,13.85459875,14.268966407714844,14.22520775,13.966852407714844,14.22520775ZM14.000169407714843,10.93507765L5.801207807714844,10.93507765C5.498973107714844,10.93507765,5.306543107714844,10.61013795,5.306543107714844,10.30724335C5.306543107714844,10.00444885,5.561990507714844,9.70163445,5.864085407714844,9.70163445L14.039543407714843,9.70163445C14.341778407714843,9.70163445,14.597086407714844,9.98218445,14.619890407714843,10.30724335C14.619910407714844,10.61003785,14.301724407714843,10.93507765,14.000169407714843,10.93507765ZM14.000169407714843,7.55596925L5.801207807714844,7.55596925C5.498973107714844,7.55596925,5.306543107714844,7.23090985,5.306543107714844,6.92813495C5.306543107714844,6.62532045,5.561990507714844,6.32252595,5.864085407714844,6.32252595L14.039543407714843,6.32252595C14.341778407714843,6.32252595,14.597086407714844,6.60319515,14.619890407714843,6.92813495C14.619910407714844,7.23090985,14.301724407714843,7.55596925,14.000169407714843,7.55596925Z" fill="#006AFF" fill-opacity="1"/></g></g></svg>

After

Width:  |  Height:  |  Size: 3.1 KiB

1
src/assets/mon-profit.svg

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="none" version="1.1" width="20" height="20" viewBox="0 0 20 20"><defs><clipPath id="master_svg0_847_044248"><rect x="0" y="0" width="20" height="20" rx="0"/></clipPath></defs><g clip-path="url(#master_svg0_847_044248)"><g><path d="M17.92996,6.5624995C18.382853,6.5624995,18.75,6.9343944,18.75,7.3930273L18.75,17.606972C18.75,18.065662,18.382891,18.437498,17.92996,18.437498L15.566269,18.437498C15.113379,18.437498,14.746229,18.065701,14.746229,17.606972L14.746229,7.3930273C14.746229,6.9343944,15.113339,6.5624995,15.566269,6.5624995L17.92996,6.5624995ZM8.808671499999999,8.961503C9.2615623,8.961503,9.6287689,9.333338699999999,9.6287689,9.7920303L9.6287689,17.606951C9.6287689,18.065641,9.2616005,18.437477,8.808671499999999,18.437477L6.4450393,18.437477C5.9921484,18.437477,5.6250005,18.06568,5.6250005,17.606951L5.6250005,9.7920303C5.6250005,9.333338699999999,5.9921098,8.961503,6.4450393,8.961503L8.808671499999999,8.961503ZM13.242929,11.396327C13.684374,11.396327,14.042225,11.758554,14.042225,12.20537L14.042225,17.628475C14.042225,18.075293,13.684373,18.437517,13.242929,18.437517L10.9392376,18.437517C10.4978313,18.437517,10.1399994,18.075331,10.1399994,17.628475L10.1399994,12.20537C10.1399994,11.758554,10.4977913,11.396327,10.9392376,11.396327L13.242929,11.396327ZM4.353008,13.410115C4.7944529,13.410115,5.152246,13.772381,5.152246,14.219217L5.152246,17.628475C5.152246,18.075293,4.7944334,18.437517,4.353008,18.437517L2.0492969199999997,18.437517C1.6078907,18.437498,1.25,18.075312,1.25,17.628456L1.25,14.219217C1.25,13.7724,1.60785159,13.410115,2.0492969199999997,13.410115L4.353008,13.410115ZM2.7157422,10.2778301C2.4810492,10.5165968,2.09619707,10.5165968,1.8615039599999998,10.2778301C1.62556645,10.0390015,1.62556645,9.6518545,1.8614454299999998,9.4130645L7.2190042,3.9899402C7.4536786,3.7511284,7.8385677,3.7511284,8.0732422,3.9899402L11.160429,7.1149392L15.14125,3.0853693L14.202539,2.1351741L17.5,1.5625L16.934297,4.9004097L15.995584,3.9501362L11.587578,8.412108400000001C11.352885,8.650876,10.9680328,8.650876,10.7333393,8.412108400000001L7.646152,5.2870501999999995L2.7157422,10.2778301Z" fill="#00C261" fill-opacity="1"/></g></g></svg>

After

Width:  |  Height:  |  Size: 2.2 KiB

BIN
src/assets/site/recharge_bonus.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

BIN
src/assets/site/refund_reason.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 424 B

1
src/assets/site/tb_buy_btn.svg

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 5.2 KiB

13
src/components/GuipSelect.vue

@ -60,10 +60,12 @@ export default {
computed: {
processedOptions() {
// options
// let options = [1,5,3] || [];
let newOptions = null
let options = this.options || [];
// [1,12,22]
if (Array.isArray(options) && options.every(item => typeof item !== 'object')) {
return options.map((item, index) => ({
if (Array.isArray(options) && options.length > 0 && options.every(item => typeof item !== 'object')) {
newOptions = options.map((item, index) => ({
[this.valueKey]: index,
[this.labelKey]: item
}));
@ -76,19 +78,18 @@ export default {
[this.labelKey]: options[key]
}));
}
// extraItemoptions
if (this.extraItem && Object.keys(this.extraItem).length > 0) {
return [
newOptions = [
{
[this.labelKey]: this.extraItem.label || '',
[this.valueKey]: this.extraItem.value || '',
disabled: this.extraItem.disabled || false
},
...options
...newOptions
];
}
return options;
return newOptions;
}
},
watch: {

6
src/components/super/DateSelect.vue

@ -11,7 +11,7 @@
</div>
<div class="controls">
<button v-if="!onlyYear" @click="toggleView('month')" :class="{ active: view !== 'year' }">月度</button>
<button @click="toggleView('year')" :class="{ active: view === 'year' }">年度</button>
<button v-if="!onlyMonth" @click="toggleView('year')" :class="{ active: view === 'year' }">年度</button>
</div>
</div>
@ -62,6 +62,10 @@
onlyYear:{
type:Boolean,
default:false
},
onlyMonth:{
type:Boolean,
default:false
}
},
data() {

70
src/router/index.js

@ -10,7 +10,7 @@ const whiteSecondSider = [
const blackSliderList = [
'/franchise', '/agreement', '/customizeDoc', '/agent/siteAdd', '/agent/siteServiceList', '/agent/siteTemplate','/agent/siteAddFinally','/agent/siteServiceAdd', '/agent/supplyList',
'/agent/domainList','/agent/siteAddChooseService'
, '/agent/noticeList'
, '/agent/noticeList' , '/agent/expenseDetails', '/agent/siteRank', '/agent/serviceRank', '/agent/payoffDetails'
];
// 一级路由
let first_child_router = []
@ -321,6 +321,68 @@ const routes = [{
hideBreadcrumb: true // 一级页面不显示面包屑
}
},
{
path: '/agent/expenseStatistics',
name: '收支统计',
component: () => import( /* webpackChunkName: "expenseStatistics" */ '../views/agent/expenseStatistics.vue'),
meta: {
hideBreadcrumb: true // 一级页面不显示面包屑
}
},
{
path: '/agent/expenseDetails',
name: '站点月详情',
component: () => import( /* webpackChunkName: "expenseDetails" */ '../views/agent/expenseDetails.vue'),
meta: {
breadcrumbParent: '收支统计' // 手动指定父级
}
},
{
path: '/agent/siteRank',
name: '站点排行',
component: () => import( /* webpackChunkName: "expenseDetails" */ '../views/agent/expenseDetails.vue'),
props: {
rankFlag: 'site'
},
meta: {
breadcrumbParent: '收支统计' // 手动指定父级
}
},
{
path: '/agent/serviceRank',
name: '服务排行',
component: () => import( /* webpackChunkName: "expenseDetails" */ '../views/agent/expenseDetails.vue'),
props: {
rankFlag: 'chktype'
},
meta: {
breadcrumbParent: '收支统计' // 手动指定父级
}
},
{
path: '/agent/recharge',
name: '账号充值',
component: () => import( /* webpackChunkName: "recharge" */ '../views/agent/recharge.vue'),
meta: {
hideBreadcrumb: true // 一级页面不显示面包屑
}
},
{
path: '/agent/payoff',
name: '代收款结算',
component: () => import( /* webpackChunkName: "payoff" */ '../views/agent/payoff.vue'),
meta: {
hideBreadcrumb: true // 一级页面不显示面包屑
}
},
{
path: '/agent/payoffDetails',
name: '核算订单记录',
component: () => import( /* webpackChunkName: "payoff" */ '../views/agent/payoffDetails.vue'),
meta: {
breadcrumbParent: '代收款结算' // 一级页面不显示面包屑
}
},
// -----------------分隔符-----------
@ -361,7 +423,7 @@ const routes = [{
props: {
pageTitle: '产品 - 毛利润排行',
rank_type: 1,
type: 'ver_type'
type: 'check_type'
},
meta: {
hideBreadcrumb: true // 一级页面不显示面包屑
@ -374,7 +436,7 @@ const routes = [{
props: {
pageTitle: '产品 - 订单数排行',
rank_type: 2,
type: 'ver_type'
type: 'check_type'
},
meta: {
hideBreadcrumb: true // 一级页面不显示面包屑
@ -387,7 +449,7 @@ const routes = [{
props: {
pageTitle: '产品 - 退单数排行',
rank_type: 3,
type: 'ver_type'
type: 'check_type'
},
meta: {
hideBreadcrumb: true // 一级页面不显示面包屑

405
src/views/agent/expenseDetails.vue

@ -0,0 +1,405 @@
<template>
<div class="main-content12 expense-wrap">
<div class="flex-common">
<div class="flex-between mb24">
<div class=" flex gap12">
<b>{{ name }} 月详情</b>
<div class="flex gap12" v-if="id">
<span @click="sort(index)" :class="sortIndex === index ? ['ver-anchor-point','ver-anchor-point-active'] : ['ver-anchor-point']" v-for="(item, index) in serviceRanking" :key="item">{{ item }}</span>
</div>
</div>
<CustomDropdown ref="dropdownRef" :placeholder="date" width="280px">
<DateSelect slot="normal" view="month" v-model="date" :onlyMonth="true" @change="handleDateChange"/>
</CustomDropdown>
</div>
<el-form>
<!-- show-summary -->
<GuipTable :tableData="monthList" :key="tableKey" ref="multipleTable" autoColumn="true" :loading="tableLoading" style="flex:1"
:show-summary="true" :summary-method="getSummaries" @sort-change="sortChange">
<el-table-column prop="date" label="日期" v-if="!id"></el-table-column>
<template v-else>
<el-table-column type="index" label="排行" width="80px"></el-table-column>
<el-table-column prop="date2" label="服务排行" v-if="rankFlag === 'chktype'">
<template slot-scope="scope">
<div class="flex">
{{ nameList[scope.row.id] }}
</div>
</template>
</el-table-column>
<el-table-column prop="date1" label="站点排行" v-else>
<template slot-scope="scope">
<div class="flex">
{{ nameList[scope.row.id] }}
</div>
</template>
</el-table-column>
</template>
<el-table-column prop="1" label="利润" :sortable="sortIndex === '1' ? 'custom' : false">
<template slot-scope="scope">
<div class="flex">
{{ scope.row.profit ? scope.row.profit : '-' }}
</div>
</template>
</el-table-column>
<el-table-column prop="2" label="收入" :sortable="sortIndex === '2' ? 'custom' : false">
<template slot-scope="scope">
<div class="flex">
{{ scope.row.income ? scope.row.income : '-' }}
</div>
</template>
</el-table-column>
<el-table-column prop="3" label="支出" :sortable="sortIndex === '3' ? 'custom' : false">
<template slot-scope="scope">
<div class="flex">
{{ scope.row.cost ? scope.row.cost : '-' }}
</div>
</template>
</el-table-column>
<el-table-column prop="4" label="单量" :sortable="sortIndex === '4' ? 'custom' : false">
<template slot-scope="scope">
<div class="flex">
{{ scope.row.check_num ? scope.row.check_num : '-' }}
</div>
</template>
</el-table-column>
<el-table-column v-for="(col, index) in payList" :key="index" :label="col.name+'收/支/单量'">
<template slot-scope="scope">
<div class="flex" v-if="scope.row.pay_type[col.id]">
{{ scope.row.pay_type[col.id].income }}/
{{ scope.row.pay_type[col.id].cost }}/
{{ scope.row.pay_type[col.id].check_num }}
</div>
<div v-else>-</div>
</template>
</el-table-column>
</GuipTable>
</el-form>
</div>
</div>
</template>
<script>
import GuipTable from '@/components/GuipTable.vue';
import DateSelect from "@/components/super/DateSelect.vue";
import CustomDropdown from "@/components/CustomDropdown.vue";
export default {
components: {
CustomDropdown, DateSelect,
GuipTable,
},
props: {
rankFlag: {
type: String,
default: ''
},
},
data() {
return {
date:'',
uid:0,
chktype:0,
id: 0,
name:'',
monthList:[],
monthTotal:[],
payList:[],
nameList:[],
tableLoading:false,
tableKey: '',
sortIndex:'1',
sortOrder:'asc',
serviceRanking:{
'1':'利润排行',
'2':'收入排行',
'3':'支出排行',
'4':'检测量排行',
},
sortField: {
'1':'profit',
'2':'income',
'3':'cost',
'4':'check_num',
},
}
},
mounted() {
if(!this.$route.query.date) {
this.$message.error('非法请求');
this.$router.push('/agent/expenseStatistics')
}
this.date = this.$route.query.date
if(this.$route.query.id) this.id = this.$route.query.id
if(this.$route.query.uid) this.uid = this.$route.query.uid
if(this.$route.query.chktype) this.chktype = this.$route.query.chktype
this.getStats()
},
methods: {
getDate(dateStr) {
const date = new Date(dateStr);
const year = date.getFullYear(); // 2025
const month = date.getMonth() + 1; // 3 (3)
return `${year}-${month}`
},
handleDateChange(date) {
this.date = this.getDate(date)
localStorage.setItem('date', JSON.stringify(date))
this.$refs.dropdownRef.closeDropdown();
this.getStats()
},
sort(index){
this.sortIndex = index
this.sortList()
},
sortChange({prop, order}){
this.sortIndex = prop
this.sortOrder = 'asc'
if (order === 'descending') this.sortOrder = 'desc'
this.sortList()
},
sortList(){
const field = this.sortField[this.sortIndex]
return this.monthList.sort((a, b) => {
const valA = a[field];
const valB = b[field];
//
if (typeof valA === 'string') {
return this.sortOrder === 'asc'
? valA.localeCompare(valB)
: valB.localeCompare(valA);
} else {
return this.sortOrder === 'asc'
? valA - valB
: valB - valA;
}
});
},
getStats(){
this.monthList=[]
this.monthTotal=[]
this.payList=[]
this.nameList=[]
this.tableKey = Math.random();
if(this.id){
if(this.rankFlag == 'chktype') {
this.getChktypeStatsRank()
return true
}
this.getSiteStatsRank()
return true
}
this.getDayStats();
},
getSummaries() {
const sums = [];
let index = -1
if(this.id) sums[++index] = '-'
sums[++index] = `小计`
sums[++index] = this.monthTotal.profit
sums[++index] = this.monthTotal.income
sums[++index] = this.monthTotal.cost
sums[++index] = this.monthTotal.check_num
this.payList.forEach(column =>{
sums[++index] = this.monthTotal.pay_type[column.id].income + '/' + this.monthTotal.pay_type[column.id].cost + '/' + this.monthTotal.pay_type[column.id].check_num
})
return sums;
},
getDayStats() {
this.tableLoading = true
try {
this.$http('POST', '/agentnew/ajax_get_day_stats', {
date: this.date,
uid: this.uid,
type: this.chktype,
}).then(response => {
this.$nextTick(() => {
this.name = response.data.name
this.monthList = response.data.list
this.payList = response.data.pay_list
this.monthTotal = response.data.total
})
}).catch(error => {
console.error(error, 'error')
})
} catch (error) {
console.error('数据加载失败:', error)
} finally {
this.tableLoading = false
}
},
getSiteStatsRank() {
this.tableLoading = true
try {
this.$http('POST', '/agentnew/ajax_get_site_stats_rank', {
date: this.date,
type: this.id,
}).then(response => {
this.tableLoading = false
this.$nextTick(() => {
this.name = response.data.name
this.monthList = response.data.list
this.monthTotal = response.data.total
this.nameList = response.data.name_list
this.sortList()
})
}).catch(error => {
console.error(error, 'error')
})
} catch (error) {
console.error('数据加载失败:', error)
} finally {
this.tableLoading = false
}
},
getChktypeStatsRank() {
this.tableLoading = true
try {
this.$http('POST', '/agentnew/ajax_get_chktype_stats_rank', {
date: this.date,
uid: this.id,
}).then(response => {
this.tableLoading = false
this.$nextTick(() => {
this.name = response.data.name
this.monthList = response.data.list
this.monthTotal = response.data.total
this.nameList = response.data.name_list
this.sortList()
})
}).catch(error => {
console.error(error, 'error')
})
} catch (error) {
console.error('数据加载失败:', error)
} finally {
this.tableLoading = false
}
},
}
}
</script>
<style lang="scss" scoped>
::v-deep .el-table__footer-wrapper tbody td.el-table__cell {
background-color: #E8F0FE; /* 背景色 */
color: #006AFF; /* 文字颜色 */
font-weight: 600;
}
.el-form-item{
margin-bottom: 0 !important;
}
.expense-wrap{
.ver-anchor-point {
height: 28px;
display: flex;
align-items: center;
padding: 4px 12px;
white-space: nowrap;
transition: all .3s;
border-radius: 14px;
background: #FFFFFF;
box-sizing: border-box;
border: 1px solid #DFE2E6;
letter-spacing: 0.08em;
color: #8A9099;
cursor: pointer;
}
.ver-anchor-point:hover {
border-color: transparent;
transition: all .3s;
color: #006AFF;
background: #F2F3F5;
}
.ver-anchor-point-active{
color: #006AFF;
}
.pagetitle {
text-align: left;
font-size: 16px;
font-weight: bold;
line-height: normal;
letter-spacing: 0.08em;
color: #1E2226;
margin-top: 8px;
}
.monthTotal-wrap{
display: grid;
grid-gap: 12px;
grid-template-columns: repeat(auto-fit, 287px);
}
.loss-tip{
width: 50px;
height: 24px;
display: flex;
justify-content: center;
align-items: center;
box-sizing: border-box;
border-radius: 4px;
background: #FFF1F0;
box-sizing: border-box;
border: 1px solid #FFA39E;
font-size: 14px;
font-weight: normal;
line-height: 20px;
text-align: center;
letter-spacing: 0.08em;
color: #FF4D4F;
}
.total-item{
padding: 14px 16px;
font-size: 12px;
letter-spacing: 0.03em;
color: #23242B;
box-sizing: border-box;
border-radius: 4px;
background: #F2F7FF;
.price{
text-align: left;
font-size: 12px;
font-weight: normal;
line-height: 15px;
letter-spacing: 0.08em;
color: #1E2226;
margin: 14px 0;
b{
font-size: 22px;
line-height: 20px;
letter-spacing: normal;
}
}
.total-bottom{
align-items: flex-start;
}
}
.loss{
background: #FFF1F0;
.top-left b{
color: #FF4D4F;
}
}
.gain{
background: #EFFFE0;
.top-left b{
color: #00C261;
}
}
}
</style>

505
src/views/agent/expenseStatistics.vue

@ -0,0 +1,505 @@
<template>
<div class="main-content12 expense-wrap">
<h3 class="pagetitle">收支统计</h3>
<div class="flex-common">
<div class="flex-between">
<el-tabs v-model="totalType" @tab-click="handleClick">
<el-tab-pane label="月统计列表" name="1"></el-tab-pane>
<el-tab-pane v-if="siteNum>1" label="各站点统计列表" name="2"></el-tab-pane>
<el-tab-pane label="各服务统计列表" name="3"></el-tab-pane>
</el-tabs>
<div class="flex">
<!-- <GuipSelect label="服务类型" v-if="totalType == '3'" :options="[{label:'asd',value:'9'}]"></GuipSelect>-->
<!-- <GuipSelect label="时间" :options="[{label:'asd',value:'9'}]"></GuipSelect>-->
<CustomDropdown ref="dropdownRef" :placeholder="date" width="280px">
<DateSelect slot="normal" view="month" :onlyMonth="true" @change="handleDateChange"/>
</CustomDropdown>
</div>
</div>
<div v-if="totalType == '1' && Object.keys(monthTotal).length>0" class="mt24 monthTotal-wrap flex">
<div class="total-item" :class="monthTotal.profit<0?'loss':'gain'">
<div class="flex-between total-top">
<div class="top-left flex">
<img v-if="monthTotal.profit<0" src="@/assets/mon-profit.svg" alt="">
<img v-else src="@/assets/mon-loss.svg" alt="">
<b>月利润</b>
</div>
<span v-if="monthTotal.profit<0" class="loss-tip">亏损</span>
<span v-else class="gain-tip">盈利</span>
</div>
<div class="price">
<b>{{monthTotal.profit}}</b>
</div>
<div class="gap24 flex-between total-bottom">
<div class="left column gap8">
<template v-for="(col, index) in payList">
<span v-if="index % 2 === 1" :key="index">{{ col.name }}{{ monthTotal.pay_type[col.id].profit }}</span>
</template>
</div>
<div class="right column gap8">
<template v-for="(col, index) in payList">
<span v-if="index % 2 === 0" :key="index">{{ col.name }}{{ monthTotal.pay_type[col.id].profit }}</span>
</template>
</div>
</div>
</div>
<div class="total-item">
<div class="flex-between total-top">
<div class="top-left flex">
<img src="@/assets/mon-income.svg" alt="">
<b>月收入</b>
</div>
<span class="loss-tip-empty"></span>
</div>
<div class="price">
<b>{{this.monthTotal.income}}</b>
</div>
<div class="gap24 flex-between total-bottom">
<div class="left column gap8">
<template v-for="(col, index) in payList">
<span v-if="index % 2 === 1" :key="index">{{ col.name }}{{ monthTotal.pay_type[col.id].income }}</span>
</template>
</div>
<div class="right column gap8">
<template v-for="(col, index) in payList">
<span v-if="index % 2 === 0" :key="index">{{ col.name }}{{ monthTotal.pay_type[col.id].income }}</span>
</template>
</div>
</div>
</div>
<div class="total-item">
<div class="flex-between total-top">
<div class="top-left flex">
<img src="@/assets/mon-expend.svg" alt="">
<b>月支出</b>
</div>
<span class="loss-tip-empty"></span>
</div>
<div class="price">
<b>{{this.monthTotal.cost}}</b>
</div>
<div class="gap24 flex-between total-bottom">
<div class="left column gap8">
<template v-for="(col, index) in payList">
<span v-if="index % 2 === 1" :key="index">{{ col.name }}{{ monthTotal.pay_type[col.id].cost }}</span>
</template>
</div>
<div class="right column gap8">
<template v-for="(col, index) in payList">
<span v-if="index % 2 === 0" :key="index">{{ col.name }}{{ monthTotal.pay_type[col.id].cost }}</span>
</template>
</div>
</div>
</div>
<div class="total-item">
<div class="flex-between total-top">
<div class="top-left flex">
<img src="@/assets/mon-order-volume.svg" alt="">
<b>月单量</b>
</div>
<span class="loss-tip-empty"></span>
</div>
<div class="price">
<b>{{this.monthTotal.check_num}}</b>
</div>
<div class="gap24 flex-between total-bottom">
<div class="left column gap8">
<template v-for="(col, index) in payList">
<span v-if="index % 2 === 1" :key="index">{{ col.name }}{{ monthTotal.pay_type[col.id].check_num }}</span>
</template>
</div>
<div class="right column gap8">
<template v-for="(col, index) in payList">
<span v-if="index % 2 === 0" :key="index">{{ col.name }}{{ monthTotal.pay_type[col.id].check_num }}</span>
</template>
</div>
</div>
</div>
</div>
<el-form class="mt24">
<GuipTable :tableData="monthList" :key="tableKey" ref="multipleTable" autoColumn="true" :loading="tableLoading" style="flex:1"
:show-summary="totalType === '1'"
:summary-method="totalType === '1' ? getSummaries : null">
<el-table-column prop="date" label="日期" min-width="130px" v-if="totalType == '1'"></el-table-column>
<el-table-column prop="date1" label="站点名称" min-width="130px" v-if="totalType == '2'">
<template slot-scope="scope">
<div class="flex">
{{ nameList[scope.row.id] }}
</div>
</template>
</el-table-column>
<el-table-column prop="date2" label="服务名称" min-width="130px" v-if="totalType == '3'">
<template slot-scope="scope">
<div class="flex">
{{ nameList[scope.row.id] }}
</div>
</template>
</el-table-column>
<el-table-column prop="profit" label="利润" min-width="110px">
<template slot-scope="scope">
<div class="flex" :class="scope.row.profit<0?'red':''">
{{ scope.row.profit ? scope.row.profit : '-' }}
</div>
</template>
</el-table-column>
<el-table-column prop="income" label="收入" min-width="110px">
<template slot-scope="scope">
<div class="flex">
{{ scope.row.income ? scope.row.income : '-' }}
</div>
</template>
</el-table-column>
<el-table-column prop="expenditure" label="支出" min-width="110px">
<template slot-scope="scope">
<div class="flex">
{{ scope.row.cost ? scope.row.cost : '-' }}
</div>
</template>
</el-table-column>
<el-table-column prop="orderVolume" label="单量" min-width="110px">
<template slot-scope="scope">
<div class="flex">
{{ scope.row.check_num ? scope.row.check_num : '-' }}
</div>
</template>
</el-table-column>
<el-table-column v-for="(col, index) in payList" :key="index" :label="col.name+'收/支/单量'" min-width="160px">
<template slot-scope="scope">
<div class="flex" v-if="scope.row.pay_type[col.id]">
{{ scope.row.pay_type[col.id].income }}/
{{ scope.row.pay_type[col.id].cost }}/
{{ scope.row.pay_type[col.id].check_num }}
</div>
<div v-else>-</div>
</template>
</el-table-column>
<el-table-column v-if="totalType == '3'"
key="top1" prop="top1" label="站点排行(利润)" width="250">
<template slot-scope="scope">
<span v-if="topList[scope.row.id]" slot="reference" class="flex">
NO.1 {{topList[scope.row.id]}}
<svg-icon :size="14" @click="handleClicksiteRank(scope.row.id)"
:path="require('@/assets/super/list-detail.svg')" :color="'#8A9099'"
:hoverColor="'#006AFF'" />
</span>
<span v-else slot="reference">暂无排行</span>
</template>
</el-table-column>
<el-table-column v-if="totalType == '2'"
key="top2" prop="top2" label="服务排行(利润)" width="250">
<template slot-scope="scope">
<span v-if="topList[scope.row.id]" slot="reference" class="flex">
NO.1 {{topList[scope.row.id]}}
<svg-icon :size="14" @click="handleClickserviceRank(scope.row.id)"
:path="require('@/assets/super/list-detail.svg')" :color="'#8A9099'"
:hoverColor="'#006AFF'" />
</span>
<span v-else slot="reference">暂无排行</span>
</template>
</el-table-column>
<el-table-column label="操作" fixed="right" v-if="totalType != '1'">
<template slot-scope="scope">
<GuipButton type="text" class="mr-16" @click="handleClickDetail(scope.row.id)">详情</GuipButton>
</template>
</el-table-column>
</GuipTable>
</el-form>
</div>
</div>
</template>
<script>
import GuipButton from '@/components/GuipButton.vue';
// import GuipSelect from '@/components/GuipSelect.vue';
import GuipTable from '@/components/GuipTable.vue';
import SvgIcon from '@/components/SvgIcon.vue';
import DateSelect from "@/components/super/DateSelect.vue";
import CustomDropdown from "@/components/CustomDropdown.vue";
export default {
components: {
CustomDropdown, DateSelect,
GuipTable,
GuipButton,
// GuipSelect,
SvgIcon
},
data() {
return {
totalType:'1',
date: this.getNow(),
tableLoading:false,
siteNum: 1,
tableKey: '',
monthList:[],
monthTotal:[],
payList:[],
nameList:[],
topList:[],
}
},
mounted() {
const {total_type, date} = this.$route.query
this.$nextTick(()=>{
if(total_type)this.totalType = total_type;
if(date) this.date = date;
this.getSiteNum()
this.handleClick()
})
},
methods: {
getNow() {
const now = new Date();
const year = now.getFullYear();
const month = now.getMonth() + 1;
return `${year}-${month}`
},
getDate(dateStr) {
const date = new Date(dateStr);
const year = date.getFullYear(); // 2025
const month = date.getMonth() + 1; // 3 (3)
return `${year}-${month}`
},
handleDateChange(date) {
this.date = this.getDate(date)
localStorage.setItem('date', JSON.stringify(date))
this.$refs.dropdownRef.closeDropdown();
this.handleClick()
},
handleClickDetail(id){
if(this.totalType == 2) this.$router.push(`/agent/expenseDetails?uid=${id}&total_type=${this.totalType}&date=${this.date}`)
if(this.totalType == 3) this.$router.push(`/agent/expenseDetails?chktype=${id}&total_type=${this.totalType}&date=${this.date}`)
},
handleClicksiteRank(id){
this.$router.push(`/agent/siteRank?id=${id}&total_type=${this.totalType}&date=`+this.date)
},
handleClickserviceRank(id){
this.$router.push(`/agent/serviceRank?id=${id}&total_type=${this.totalType}&date=`+this.date)
},
handleClick(){
this.monthList = []
this.payList = []
this.monthTotal = []
this.nameList = []
this.topList = []
this.tableKey = Math.random();
if(this.totalType == 1) this.getDayStats()
if(this.totalType == 2) this.getSiteStats()
if(this.totalType == 3) this.getChktypeStats()
},
getSummaries() {
if(this.totalType != '1') return []
const sums = [];
let index = 0
sums[index] = `小计`
sums[++index] = this.monthTotal.profit
sums[++index] = this.monthTotal.income
sums[++index] = this.monthTotal.cost
sums[++index] = this.monthTotal.check_num
this.payList.forEach(column =>{
sums[++index] = this.monthTotal.pay_type[column.id].income + '/' + this.monthTotal.pay_type[column.id].cost + '/' + this.monthTotal.pay_type[column.id].check_num
})
return sums;
},
getSiteNum() {
try {
this.$http('POST', '/agentnew/ajax_get_agent_sitenum', {date: this.date}).then(response => {
this.$nextTick(() => {
this.siteNum = response.data
})
}).catch(error => {
console.error(error, 'error')
})
} catch (error) {
console.error('数据加载失败:', error)
}
},
getDayStats() {
this.tableLoading = true
try {
this.$http('POST', '/agentnew/ajax_get_day_stats', {date: this.date}).then(response => {
this.$nextTick(() => {
this.monthList = response.data.list
this.payList = response.data.pay_list
this.monthTotal = response.data.total
})
}).catch(error => {
console.error(error, 'error')
})
} catch (error) {
console.error('数据加载失败:', error)
} finally {
this.tableLoading = false
}
},
getSiteStats() {
this.tableLoading = true
try {
this.$http('POST', '/agentnew/ajax_get_site_stats', {date: this.date}).then(response => {
this.tableLoading = false
this.$nextTick(() => {
this.monthList = response.data.list
this.payList = response.data.pay_list
this.monthTotal = response.data.total
this.nameList = response.data.name_list
this.topList = response.data.top_list
})
}).catch(error => {
console.error(error, 'error')
})
} catch (error) {
console.error('数据加载失败:', error)
} finally {
this.tableLoading = false
}
},
getChktypeStats() {
this.tableLoading = true
try {
this.$http('POST', '/agentnew/ajax_get_chktype_stats', {date: this.date}).then(response => {
this.tableLoading = false
this.$nextTick(() => {
this.monthList = response.data.list
this.payList = response.data.pay_list
this.monthTotal = response.data.total
this.nameList = response.data.name_list
this.topList = response.data.top_list
})
}).catch(error => {
console.error(error, 'error')
})
} catch (error) {
console.error('数据加载失败:', error)
} finally {
this.tableLoading = false
}
},
}
}
</script>
<style lang="scss" scoped>
::v-deep .el-table__footer-wrapper tbody td.el-table__cell {
background-color: #E8F0FE; /* 背景色 */
color: #006AFF; /* 文字颜色 */
font-weight: 600;
}
.loss-profit{
color: #FF4D4F;
}
.red{
color: #FF4D4F;
}
.expense-wrap{
::v-deep .el-tabs__header{
margin: 0;
}
.pagetitle {
text-align: left;
font-size: 16px;
font-weight: bold;
line-height: normal;
letter-spacing: 0.08em;
color: #1E2226;
margin-top: 8px;
}
.monthTotal-wrap{
display: flex;
gap: 12px;
flex-wrap: wrap;
}
.loss-tip,.gain-tip{
width: 50px;
height: 24px;
display: flex;
justify-content: center;
align-items: center;
box-sizing: border-box;
border-radius: 4px;
background: #FFF1F0;
box-sizing: border-box;
border: 1px solid #FFA39E;
font-size: 14px;
font-weight: normal;
line-height: 20px;
text-align: center;
letter-spacing: 0.08em;
color: #FF4D4F;
}
.gain-tip{
color: #0DAF49;
background: rgba(239, 255, 224, 0.5);
border: 1px solid rgba(0, 194, 97, 0.6);
}
.loss-tip-empty{
width: 50px;
height: 24px;
display: flex;
}
.total-item{
padding: 14px 16px;
font-size: 12px;
letter-spacing: 0.03em;
color: #23242B;
box-sizing: border-box;
border-radius: 4px;
background: #F2F7FF;
min-height: 153px;
flex-grow: 1;
min-width: 0;
.price{
text-align: left;
font-size: 12px;
font-weight: normal;
line-height: 15px;
letter-spacing: 0.08em;
color: #1E2226;
margin: 14px 0;
display: flex;
gap: 2px;
align-items: end;
b{
font-size: 22px;
line-height: 20px;
letter-spacing: normal;
}
}
.total-bottom{
align-items: flex-start;
}
}
.loss{
background: #FFF1F0;
.top-left b{
color: #FF4D4F;
}
}
.gain{
background: #EFFFE0;
.top-left b{
color: #00C261;
}
}
.top-left{
gap: 6px;
color:#006AFF;
font-size: 14px;
letter-spacing: 0.08em;
img{
width: 20px;
height: 20.78px;
}
}
}
</style>

391
src/views/agent/payoff.vue

@ -0,0 +1,391 @@
<template>
<div class="main-content12 payoff-wrap">
<h3 class="pagetitle">代收款结算</h3>
<div class="flex-common">
<div class="flex-between">
<el-tabs v-model="totalType" @tab-click="handleClick">
<el-tab-pane label="收款设置" name="1"></el-tab-pane>
<el-tab-pane label="结算列表" name="2"></el-tab-pane>
<el-tab-pane label="账单列表" name="3"></el-tab-pane>
</el-tabs>
<div class="flex">
</div>
</div>
<div class="mt24 payoff-set" v-if="totalType == '1'">
<el-form>
<div class="flex gap12 mb24">
<img src="@/assets/pay/pay_3.svg" alt="">
<span>支付宝收款</span>
<GuipSwitch float="right" :active-value="1" :inactive-value="0" activeText="开启" inactiveText="关闭" @change="onSwitchChange"></GuipSwitch>
</div>
<div class="payoff-area flex-between" v-if="payoffInfo">
<div class="payoff-info">
<div class="payoff-acc">收款支付宝账号{{payoffInfo.openid}}</div>
<div class="payoff-name">收款人真实姓名{{payoffInfo.realname}}</div>
</div>
<div class="flex gap12">
<span class="payoff-has">已配置</span>
<GuipButton type="system" @click="handlePayoffInfo()" :btnstyle="{'color':'#006AFF','background':'#FFFFFF','broder':'none',width:'126px'}">修改账号</GuipButton>
</div>
</div>
<div class="payoff-area flex-between" v-else>
<div class="payoff-info">
<div class="payoff-acc">设置收款账号开启平台代收款平台收取5%服务费</div>
</div>
<div class="flex gap12">
<span class="payoff-no">未设置</span>
<GuipButton type="danger" @click="handlePayoffInfo()" :btnstyle="{'color':'#fff','background':'#FF4D4F','broder':'none',width:'126px'}">立即设置</GuipButton>
</div>
</div>
</el-form>
</div>
<div class="mt24" v-if="totalType == '2'">
<el-form>
<PromptText text="温馨提示:满200元自动结算,次日凌晨打款;通过微信收到的货款,有7天账期(例如:周一的收入,下周一才能结算提现)。" :type="1" class="mb32"/>
<GuipTable :tableData="tableList" :key="tableKey" ref="multipleTable" autoColumn="true" :loading="tableLoading" style="flex:1">
<el-table-column fixed="left" prop="tid" label="订单号" min-width="200px">
<template slot-scope="scope">
<span v-if="scope.row.tid">{{scope.row.tid}}</span>
<span v-else>-</span>
</template>
</el-table-column>
<el-table-column prop="pay_tid" label="第三方支付订单号" min-width="300px">
<template slot-scope="scope">
<span v-if="scope.row.pay_tid">{{scope.row.pay_tid}}</span>
<span v-else>-</span>
</template>
</el-table-column>
<el-table-column prop="payment" label="结算金额(元)" min-width="150px"></el-table-column>
<el-table-column prop="actual_payment" label="实际支付金额(元)" min-width="200px"></el-table-column>
<el-table-column prop="service_charge" label="服务费(%)" min-width="150px"></el-table-column>
<el-table-column prop="date_range_str" label="结算起止日期" min-width="150px">
<template slot-scope="scope">
<GuipToolTip :content="scope.row.date_range">
<span>{{scope.row.date_range_str}}</span>
</GuipToolTip>
</template>
</el-table-column>
<el-table-column prop="pay_time" label="结算时间" min-width="150px"></el-table-column>
<el-table-column prop="status" label="状态" min-width="120px">
<template slot-scope="scope">
<div class="flex gap8">
<div :class="payoffStatusClass(scope.row.status)">{{scope.row.status}}</div>
<GuipToolTip placement="top" v-if="scope.row.status == '异常' && scope.row.remark" :manual="false" effect="light">
<img style="width: 16px;height: 16px;" src="@/assets/site/more_setIcon.png" alt="">
<template #content>
<div class="flex toolFilled">
<img src="@/assets/site/info_filled.svg" alt="">
<p>{{ scope.row.remark }}</p>
</div>
</template>
</GuipToolTip>
</div>
</template>
</el-table-column>
</GuipTable>
</el-form>
</div>
<div class="mt24" v-if="totalType == '3'">
<el-form>
<PromptText text="每天凌晨出具前一天已完成的订单账单" :type="1" class="mb32"/>
<GuipTable :tableData="tableList" :key="tableKey" ref="multipleTable" autoColumn="true" :loading="tableLoading" style="flex:1">
<el-table-column prop="short_name" label="站点"></el-table-column>
<el-table-column prop="bill_date" label="账单日期"></el-table-column>
<el-table-column prop="pay_type" label="支付类型">
<template slot-scope="scope">
<img style="width: 20px;height: 20px;" :src="require('@/assets/pay/pay_'+scope.row.pay_type+'.svg')" alt="">
</template>
</el-table-column>
<el-table-column prop="money" label="收入金额(元)"></el-table-column>
<el-table-column prop="unpay_money" label="未核算金额(元)"></el-table-column>
<el-table-column prop="ctime" label="账单生成时间"></el-table-column>
<el-table-column prop="status" label="核算状态">
<template slot-scope="scope">
<div :class="billStatusClass(scope.row.status)">{{scope.row.status}}</div>
</template>
</el-table-column>
<el-table-column prop="money" label="操作">
<template slot-scope="scope">
<GuipButton type="text" @click="handleShowInfo(scope.row.id,scope.row.uid,scope.row.pay_type)">查看</GuipButton>
</template>
</el-table-column>
</GuipTable>
</el-form>
</div>
</div>
<GuipDialog :dialogVisible="dialogVisible" title="修改支付宝收款方式" :show-close-button="false" :show-cancel-button="true" @confirm="handleSavePayoffInfo()" @cancel="handleHidePayoffInfo()">
<el-form :model="formData" :rules="formRules" ref="formRef" class="payoff-form">
<PromptText text="须知" :type="1">
<template #desc>
<div class="mt12">使用平台支付宝支付平台收取5%的服务费</div>
<div class="mt12">使用平台支付宝支付真实姓名必须和支付宝账号实名认证姓名统一</div>
</template>
</PromptText>
<GuipInput label="1. 收款人姓名" class="column" ref="GuipInput" prop="realname"
desc="请输入支付宝绑定的银行卡的持卡人姓名" :rules="formRules.realname" v-model="formData.realname"/>
<GuipInput label="2. 收款支付宝账号" class="column" ref="GuipInput" prop="openid"
desc="请输入有效账号" :rules="formRules.openid" v-model="formData.openid"/>
</el-form>
</GuipDialog>
</div>
</template>
<script>
import GuipButton from "@/components/GuipButton.vue";
import GuipTable from "@/components/GuipTable.vue";
import GuipToolTip from "@/components/GuipToolTip.vue";
import PromptText from "@/components/PromptText.vue";
import GuipSwitch from "@/components/GuipSwitch.vue";
import GuipDialog from "@/components/GuipDialog.vue";
import GuipInput from "@/components/GuipInput.vue";
export default {
components: {
GuipInput,
GuipDialog,
GuipSwitch,
PromptText,
GuipToolTip,
GuipTable,
GuipButton,
},
data() {
return {
totalType:'1',
tableLoading:false,
payoffInfo:[],
dialogVisible: false,
formData: {
openid: '',
realname: '',
},
formRules: {
openid: [
{ required: true, message: '请输入收款人姓名', trigger: 'blur' }
],
realname: [
{ required: true, message: '请输入收款支付宝账号', trigger: 'blur' }
],
},
tableKey: '',
tableList:[],
}
},
mounted() {
this.$nextTick(()=>{
if(this.$route.query.total_type)this.totalType = this.$route.query.total_type;
this.handleClick()
})
},
methods: {
onSwitchChange(){
},
handlePayoffInfo(){
this.dialogVisible = true
this.formData.openid = this.payoffInfo.openid
this.formData.realname = this.payoffInfo.realname
},
handleSavePayoffInfo(){
this.dialogVisible = false
this.$refs.formRef.validate((valid) => {
if(valid){
try {
this.$http('POST', '/agentnew/ajax_set_payoff_info', {
pay_type: this.payoffInfo.pay_type,
zfb_acct: this.formData.openid,
realname: this.formData.realname
}).then(response => {
if (response.status) {
this.$message.success('设置成功');
this.payoffInfo.openid = this.formData.openid
this.payoffInfo.realname = this.formData.realname
return true;
}
this.$message.error(response.info);
}).catch(error => {
console.error(error, 'error')
})
} catch (error) {
console.error('数据加载失败:', error)
}
}
});
},
handleHidePayoffInfo(){
this.dialogVisible = false
},
payoffStatusClass(status){
if(status == '异常') return 'status-info warning';
if(status == '成功') return 'status-info success';
return 'status-info default'
},
billStatusClass(status){
if(status == '已核算') return 'status-info success';
return 'status-info default'
},
handleClick(){
this.tableList = []
if(this.totalType == 1) this.getPayoffData()
if(this.totalType == 2) this.getPayoffList()
if(this.totalType == 3) this.getBillList()
},
getPayoffData() {
try {
this.$http('POST', '/agentnew/ajax_get_payoff_info', {date: this.date}).then(response => {
this.$nextTick(() => {
this.payoffInfo = response.data
})
}).catch(error => {
console.error(error, 'error')
})
} catch (error) {
console.error('数据加载失败:', error)
}
},
getPayoffList() {
this.tableLoading = true
try {
this.$http('POST', '/agentnew/ajax_get_payoff_list', {}).then(response => {
this.tableLoading = false
this.$nextTick(() => {
this.tableList = response.data.list
})
}).catch(error => {
console.error(error, 'error')
})
} catch (error) {
console.error('数据加载失败:', error)
} finally {
this.tableLoading = false
}
},
getBillList() {
this.tableLoading = true
try {
this.$http('POST', '/agentnew/ajax_get_bill_list', {}).then(response => {
this.tableLoading = false
this.$nextTick(() => {
this.tableList = response.data.list
})
}).catch(error => {
console.error(error, 'error')
})
} catch (error) {
console.error('数据加载失败:', error)
} finally {
this.tableLoading = false
}
},
handleShowInfo(id,uid,pay_type){
this.$router.push(`/agent/payoffDetails?id=${id}&uid=${uid}&pay_type=${pay_type}&total_type=${this.totalType}`)
}
}
}
</script>
<style lang="scss" scoped>
.payoff-form{
::v-deep .prompt-text{
padding: 20px 14px;
}
::v-deep .prompt-desc{
font-weight: bold;
}
.column{
margin-bottom: 0;
margin-top: 24px;
}
}
.payoff-wrap{
::v-deep .el-tabs__header{
margin: 0;
}
::v-deep .el-form-item {
margin-bottom: 0;
}
.pagetitle {
text-align: left;
font-size: 16px;
font-weight: bold;
line-height: normal;
letter-spacing: 0.08em;
color: #1E2226;
margin-top: 8px;
}
.w16{
width: 16px;
}
.payoff-set{
background: #FAFAFA;
padding: 24px 14px;
}
.payoff-area{
padding: 24px 16px;
border-radius: 8px;
background: #FFFFFF;
letter-spacing: 0.08em;
font-size: 14px;
text-align: left;
.payoff-info{
display: flex;
flex-direction: column;
gap: 10px;
.payoff-acc{
color: #1E2226;
}
.payoff-name{
color: #6B7280;
letter-spacing: normal;
}
}
.payoff-has{
color: #00C261;
}
.payoff-no{
color: #FF4D4F;
}
}
.status-info{
display: inline-block;
padding: 2px 10px;
border-radius: 4px;
}
.default{
color: #626573;
background: #F6F7FA;
border: 1px solid #DFE2E6;
}
.success{
color: #0DAF49;
background: rgba(239, 255, 224, 0.5);
border: 1px solid rgba(0, 194, 97, 0.6);
}
.warning{
color: #FF4D4F;
background: #FFF1F0;
border: 1px solid #FFA39E;
}
}
.toolFilled{
max-width: 457px;
padding: 12px 16px;
box-sizing: border-box;
color: #1E2226;
letter-spacing: 0.08em;
gap: 8px;
line-height: 20px;
img{
width: 16px;
height: 16px;
}
}
</style>

92
src/views/agent/payoffDetails.vue

@ -0,0 +1,92 @@
<template>
<div class="main-content12 expense-wrap">
<div class="flex-common">
<div class="flex-between mb24">
<div class=" flex gap12">
<b>核算订单记录</b>
</div>
</div>
<div class="flex mb24 gap12" style="gap:30px" v-if="Object.keys(info).length>0">
<div class="flex"><span>检测站点</span>{{info.short_name}}</div>
<div class="flex"><span>支付方式</span><img width="16px" :src="require('@/assets/pay/pay_'+info.pay_type+'.svg')" alt=""></div>
<div class="flex"><span>核算金额</span>{{info.money}}</div>
<div class="flex"><span>账单生成时间</span>{{info.ctime}}</div>
</div>
<el-form>
<GuipTable :tableData="tableList" ref="multipleTable" autoColumn="true" :loading="tableLoading" style="flex:1">
<el-table-column prop="id" label="ID" min-width="120px"></el-table-column>
<el-table-column prop="pro_desc" label="检测类型" min-width="180px"></el-table-column>
<el-table-column prop="tid" label="订单编号" min-width="180px"></el-table-column>
<el-table-column prop="sale_date" label="订单生成时间" min-width="180px"></el-table-column>
<el-table-column prop="report_date" label="检测完成时间" min-width="180px"></el-table-column>
<el-table-column prop="wordnum" label="字数" min-width="120px"></el-table-column>
<el-table-column prop="payment" label="实际收入(元)" min-width="180px"></el-table-column>
<el-table-column prop="cost" label="订单成本(元)" min-width="180px"></el-table-column>
<el-table-column prop="status" label="状态"></el-table-column>
</GuipTable>
</el-form>
</div>
</div>
</template>
<script>
import GuipTable from "@/components/GuipTable.vue";
export default {
components: {
GuipTable
},
data() {
return {
id: 0,
uid: 0,
pay_type: 0,
tableLoading:false,
tableList:[],
info:[],
}
},
mounted() {
const {id, uid, pay_type} = this.$route.query
if(!id || !uid || !pay_type) {
this.$message.error('非法请求');
this.$router.push('/agent/payoff')
}
this.id = id
this.uid = uid
this.pay_type = pay_type
this.getBillInfo()
},
methods: {
getBillInfo() {
this.tableLoading = true
try {
this.$http('POST', '/agentnew/ajax_get_bill_info', {
id: this.id,
uid: this.uid,
pay_type: this.pay_type,
}).then(response => {
this.$nextTick(() => {
this.info = response.data.info
this.tableList = response.data.list
})
}).catch(error => {
console.error(error, 'error')
})
} catch (error) {
console.error('数据加载失败:', error)
} finally {
this.tableLoading = false
}
},
}
}
</script>
<style lang="scss" scoped>
.el-form-item{
margin-bottom: 0 !important;
}
</style>

605
src/views/agent/recharge.vue

@ -0,0 +1,605 @@
<template>
<div class="main-content12 recharge-wrap">
<h3 class="pagetitle">余额管理</h3>
<div class="flex-common">
<div class="flex-between">
<el-tabs v-model="totalType" v-if="totalType" class="custom-tabs" @tab-click="handleClick">
<el-tab-pane label="余额充值" name="1"></el-tab-pane>
<el-tab-pane label="充值记录" name="2"></el-tab-pane>
<el-tab-pane label="退款记录" name="3"></el-tab-pane>
</el-tabs>
<div class="flex">
</div>
</div>
<div class="mt24" v-if="totalType == '1'">
<div class="flex-between w552">
<div class="wallet-choose">充值选择</div>
<div class="wallet-desc flex" v-if="prompt" @click="jumpLink(prompt_link)">{{prompt}}<img style="width: 14px" src="@/assets/input_ex_ic.png"/></div>
</div>
<el-form class="el-row demo-ruleForm" ref="formRef">
<div class="flex gap24 mt12">
<template v-for="item in walletList">
<div :key="item.type" class="wallet-item" :class="walletType == item.type ? 'wallet-item-active' : ''" @click="walletClick(item.type)">
<img src="@/assets/site/tem-active.svg" class="tem-active" alt="" v-if="walletType == item.type">
<div class="wallet-name">{{item.name}}</div>
<div class="wallet-num">当前余额<span class="wallet-price">{{item.remain_money}}</span></div>
</div>
</template>
</div>
<div class="buy-area">
<div class="flex-between w552 mt24">
<div class="wallet-choose">充值卡面值</div>
</div>
<div class="flex-between buy-bonus w552 mt12" v-show="Object.keys(bonus).length>0">
<img src="@/assets/site/recharge_bonus.png" alt="">
<div class="buy-bonus-info">
<div class="flex" v-for="(value, key) in bonus" :key="key">
<span><b>{{key}}</b></span><span><b class="red">{{value}}</b></span>
</div>
</div>
</div>
<div class="flex mt12" v-if="Object.keys(buy_price_types).length>0">
<GuipRadio v-model="buy_price_type" :options="buy_price_types" @change="buyLinkClick()"/>
</div>
<div class="buy-btn flex mt12" v-if="buy_price_link" @click="jumpLink(buy_price_link)">
<img src="@/assets/site/tb_buy_btn.svg" alt="">跳转淘宝购买
</div>
<div class="buy-desc flex mt12" v-if="links_desc">{{links_desc}}</div>
<hr class="buy-hr">
<div class="buy-recharge flex gap12">
<GuipInput ref="GuipInput" v-model="ordernum" class="w443" column="column" prop="age" placeholder="请输入淘宝订单号" />
<GuipButton @click="doRecharge()">现在充值</GuipButton>
</div>
<div class="buy-info">
<p class="red">充值流程</p>
<p>1.填写订单编号</p>
<p>2.点击现在充值按钮</p>
<p>3.到淘宝确认收货</p>
<p>4.点击弹层中已确认收货按钮</p>
</div>
</div>
</el-form>
</div>
<el-form class="mt24" v-else>
<GuipTable :tableData="tableList" :key="tableKey" ref="multipleTable" autoColumn="true" :loading="tableLoading" style="flex:1">
<template v-if="totalType == '2'">
<el-table-column prop="tid" label="订单号"></el-table-column>
<el-table-column prop="money">
<template slot="header">
充值金额
<span class="money-header" v-if="total_money>0"> 总计 {{ total_money }}</span>
</template>
</el-table-column>
<el-table-column prop="pay_date" label="充值时间"></el-table-column>
<el-table-column prop="remain_money" label="充值前账号余额"></el-table-column>
<el-table-column prop="type_desc" label="类型"></el-table-column>
<el-table-column prop="opt" label="操作">
<template slot-scope="scope">
<GuipButton v-if="scope.row.confirm" type="ignore" class="mr-16" :btnstyle="confirmBtnStyle" @click="confirmRecharge(scope.row.id, scope.row.tid)">确认收货</GuipButton>
<div v-else>----</div>
</template>
</el-table-column>
</template>
<template v-else>
<el-table-column fixed="left" prop="tid" label="订单号" min-width="200"></el-table-column>
<el-table-column prop="money" label="退回成本" min-width="200"></el-table-column>
<el-table-column prop="pay_date" label="时间" min-width="200"></el-table-column>
<el-table-column prop="remain_money" label="充值前账号余额" min-width="200"></el-table-column>
<el-table-column prop="before_status" label="检测类型" min-width="200">
<template slot-scope="scope">
<span v-if="tid2refunds[scope.row.tid]">{{tid2refunds[scope.row.tid].prod_desc}}</span>
<span v-else>---</span>
</template>
</el-table-column>
<el-table-column prop="before_status" label="退款前论文状态" min-width="200">
<template slot-scope="scope">
<span v-if="tid2refunds[scope.row.tid]">{{tid2refunds[scope.row.tid].before_status}}</span>
<span v-else>---</span>
</template>
</el-table-column>
<el-table-column prop="total_money" label="订单金额" min-width="200">
<template slot-scope="scope">
<span v-if="tid2refunds[scope.row.tid]">{{tid2refunds[scope.row.tid].total_money}}</span>
<span v-else>---</span>
</template>
</el-table-column>
<el-table-column prop="tid" label="退款金额" min-width="200">
<template slot-scope="scope">
<span v-if="tid2refunds[scope.row.tid]">{{tid2refunds[scope.row.tid].refund_money}}</span>
<span v-else>---</span>
</template>
</el-table-column>
<el-table-column prop="tid" label="退款方式" min-width="200">
<template slot-scope="scope">
<span v-if="tid2refunds[scope.row.tid]"><img style="width: 20px;height: 20px;" :src="require('@/assets/pay/pay_'+tid2refunds[scope.row.tid].pay_type+'.svg')" alt=""></span>
<span v-else>---</span>
</template>
</el-table-column>
<el-table-column prop="tid" label="退款时间" min-width="200">
<template slot-scope="scope">
<span v-if="tid2refunds[scope.row.tid]">{{tid2refunds[scope.row.tid].refund_time}}</span>
<span v-else>---</span>
</template>
</el-table-column>
<el-table-column prop="tid" label="退款理由" min-width="200">
<template slot-scope="scope">
<GuipToolTip v-if="tid2refunds[scope.row.tid]" :content="tid2refunds[scope.row.tid].refund_reason">
<img style="width: 20px;" src="@/assets/site/refund_reason.png" alt="">
</GuipToolTip>
<span v-else>---</span>
</template>
</el-table-column>
<el-table-column fixed="right" prop="tid" label="退款详情" min-width="100">
<template slot-scope="scope">
<GuipButton type="text" v-if="tid2refunds[scope.row.tid]" @click="handleShowInfo(tid2refunds[scope.row.tid].id, scope.row.tid)">查看</GuipButton>
<span v-else>---</span>
</template>
</el-table-column>
</template>
</GuipTable>
<el-pagination background @size-change='handleSizeChange' @current-change='handleCurrentChange'
:current-page="currentPage" :page-size=pageSize layout="prev, pager, next,jumper"
:total="parseInt(total)">
</el-pagination>
</el-form>
</div>
<GuipDialog :dialogVisible="dialogVisible" width="1100px" title="退款详情" :show-close-button="true" :show-cancel-button="false" @confirm="handleHideInfo()" @close="handleHideInfo()">
<div class="table-grid" v-if="refund_detail">
<div class="table-grid-cell">交易单号</div>
<div class="table-grid-cell">{{refund_detail.pay_tid}}</div>
<div class="table-grid-cell">商户单号</div>
<div class="table-grid-cell">{{refund_detail.tid}}</div>
<div class="table-grid-cell">订单金额</div>
<div class="table-grid-cell">{{refund_detail.total_money}}</div>
<div class="table-grid-cell">实收金额</div>
<div class="table-grid-cell">{{refund_detail.money}}</div>
<div class="table-grid-cell">退款金额</div>
<div class="table-grid-cell">{{refund_detail.refund_money}}</div>
<div class="table-grid-cell">退款状态</div>
<div class="table-grid-cell">{{refund_detail.refund_status}}</div>
<div class="table-grid-cell">退款方式</div>
<div class="table-grid-cell">原路返回</div>
<div class="table-grid-cell">收款账户</div>
<div class="table-grid-cell">{{refund_detail.refund_recv_account}}</div>
</div>
</GuipDialog>
<GuipDialog :dialogVisible="dialogVisible1" confirmText="确认收货" width="457px" title="确认收货" :show-close-button="true" :show-cancel-button="false" @confirm="handleHideInfo()" @close="handleHideInfo()">
<p class="paySuccessText">
充值暂未成功<br/>
请到淘宝确认收货后再点击下面的已确认收货按钮
</p>
</GuipDialog>
<GuipDialog :dialogVisible="dialogVisible2" width="457px" title="订单号已使用" :show-close-button="true" :showFooterButton="false" @close="handleHideInfo()">
<p>若充值未到账可能是未成功确认收货</p>
<div class="flex mt12" style="color:#006AFF">
<p>前往充值列表查看</p>
<img src="@/assets/input_ex_ic_high.svg" alt="">
</div>
</GuipDialog>
</div>
</template>
<script>
import GuipRadio from "@/components/GuipRadio.vue";
import GuipInput from "@/components/GuipInput.vue";
import GuipButton from "@/components/GuipButton.vue";
import GuipTable from "@/components/GuipTable.vue";
import GuipToolTip from "@/components/GuipToolTip.vue";
import GuipDialog from "@/components/GuipDialog.vue";
export default {
components: {
GuipDialog,
GuipToolTip,
GuipTable,
GuipButton,
GuipInput,
GuipRadio
},
options: { styleIsolation: "shared" },
data() {
return {
totalType:null,
tableLoading:false,
walletType: '',
walletList:[],
prompt:'',
prompt_link:'',
bonus:[],
buy_price_type: '',
buy_price_types: {},
buy_price_link: '',
buy_price_links: {},
links_desc: '',
ordernum:'',
tableKey: '',
tableList:[],
currentPage: 1, //
pageSize: 20, //
total: 0, //
total_money: 0, //
tid2refunds: [], //
dialogVisible: false,
refund_detail: [],
confirmBtnStyle: {
'background':'#FF4D4F',
'color':'#FFFFFF',
'border':'1px solid #FF4D4F',
'border-radius':'4px',
'width': '88px',
'height': '33px',
'font-size': '12px',
},
dialogVisible1: false,
dialogVisible2: false,
}
},
mounted() {
this.$nextTick(()=>{
this.totalType = '1';
this.handleClick()
})
},
methods: {
walletClick(type){
this.walletType = type
this.walletList.forEach(item => {
if(item.type === type){
this.prompt = item.prompt
this.prompt_link = item.prompt_link
this.bonus = item.bonus
item.links.forEach((v,idx) => {
this.buy_price_types[idx] = v.face_val+'元'
this.buy_price_links[idx] = v.url
})
this.buy_price_type = '0'
this.buy_price_link = this.buy_price_links[this.buy_price_type]
this.links_desc = item.links_desc
}
})
},
jumpLink(link){
window.open(link, '_blank');
},
buyLinkClick(){
this.buy_price_link = this.buy_price_links[this.buy_price_type];
},
handleClick(){
this.tableList = []
this.total = 0
this.total_money = 0
this.currentPage = 1
this.pageSize = 20
if(this.totalType == 1) this.getRechargeData()
if(this.totalType == 2) this.getRechargeList()
if(this.totalType == 3) this.getRefundList()
},
getRechargeData() {
try {
this.$http('POST', '/agentnew/ajax_get_recharge_data', {date: this.date}).then(response => {
this.$nextTick(() => {
this.walletList = response.data
if(this.walletType == '') this.walletClick(response.data[0].type)
})
}).catch(error => {
console.error(error, 'error')
})
} catch (error) {
console.error('数据加载失败:', error)
}
},
getRechargeList() {
this.tableLoading = true
try {
this.$http('POST', '/agentnew/ajax_get_recharge_list', {
type: this.walletType,
cur_page: this.currentPage,
page_size: this.pageSize
}).then(response => {
this.tableLoading = false
this.$nextTick(() => {
this.tableList = response.data.list
this.total = response.data.total
this.total_money = response.data.total_money
this.tableKey = Math.random();
})
}).catch(error => {
console.error(error, 'error')
})
} catch (error) {
console.error('数据加载失败:', error)
} finally {
this.tableLoading = false
}
},
getRefundList() {
this.tableLoading = true
try {
this.$http('POST', '/agentnew/ajax_get_cancel_check_list', {
date: this.date,
cur_page: this.currentPage,
page_size: this.pageSize
}).then(response => {
this.tableLoading = false
this.$nextTick(() => {
this.tableList = response.data.list
this.total = response.data.total
this.tid2refunds = response.data.tid2refunds
})
}).catch(error => {
console.error(error, 'error')
})
} catch (error) {
console.error('数据加载失败:', error)
} finally {
this.tableLoading = false
}
},
doRecharge(){
try {
this.$http('POST', '/agentnew/ajax_do_recharge', {orderId: this.ordernum,type: this.walletType}).then(response => {
if (response.status) {
this.$message.success('充值成功');
return true;
}
this.$message.error(response.info);
}).catch(error => {
console.error(error, 'error')
})
} catch (error) {
console.error('数据加载失败:', error)
}
},
confirmRecharge(id, tid){
try {
this.$http('POST', '/agentnew/ajax_confirm_recharge', {orderId: tid,type: this.walletType,recharge_id: id}).then(response => {
if (response.status) {
this.$message.success('充值成功');
return true;
}
this.$message.error(response.info);
}).catch(error => {
console.error(error, 'error')
})
} catch (error) {
console.error('数据加载失败:', error)
}
},
handleSizeChange(val) {
this.pageSize = val
if(this.totalType == 2) this.getRechargeList()
if(this.totalType == 3) this.getRefundList()
},
handleCurrentChange(val) {
this.currentPage = val
if(this.totalType == 2) this.getRechargeList()
if(this.totalType == 3) this.getRefundList()
},
handleShowInfo(id, tid){
this.dialogVisible = true
try {
this.$http('POST', '/agentnew/ajax_get_cancel_check_detail', {id: id, tid: tid}).then(response => {
this.$nextTick(() => {
this.refund_detail = response.data
})
}).catch(error => {
console.error(error, 'error')
})
} catch (error) {
console.error('数据加载失败:', error)
}
},
handleHideInfo(){
this.dialogVisible = false;
this.dialogVisible1 = false;
this.dialogVisible2 = false;
}
}
}
</script>
<style lang="scss" scoped>
::v-deep .el-tabs__active-bar {
display: block !important;
}
.paySuccessText{
font-size: 14px;
line-height: 20px;
letter-spacing: 0.08em;
color: #1E2226;
margin-top: 20px;
}
.recharge-wrap{
::v-deep .el-tabs__header{
margin: 0;
}
.pagetitle {
text-align: left;
font-size: 16px;
font-weight: bold;
line-height: normal;
letter-spacing: 0.08em;
color: #1E2226;
margin-top: 8px;
}
.w552{
width: 552px;
letter-spacing: 0.08em;
}
.w443{
width: 443px;
letter-spacing: 0.08em;
}
.wallet-choose{
font-size: 14px;
color: #1E2226;
}
.wallet-desc{
font-size: 12px;
color: #8A9099;
cursor: pointer;
}
.wallet-item{
display: flex;
flex-direction: column;
gap: 12px;
text-align: left;
padding: 16px 18px;
width: 264px;
letter-spacing: 0.08em;
border-radius: 8px;
background: #F6F7FA;
box-sizing: border-box;
.wallet-name{
color: #1E2226;
font-size: 14px;
font-weight: bold;
}
.wallet-num{
font-size: 12px;
color: #626573;
padding: 0 2px;
display: flex;
align-items: baseline;
}
.wallet-price{
font-size: 22px;
font-weight: bold;
color: #626573;
}
}
.wallet-item-active{
position: relative;
background: #F2F7FF;
.tem-active{
position: absolute;
right: 0;
top: 0;
width: 30px;
height: 30px;
}
.wallet-name{
color: #006AFF;
}
}
.gap24 {
gap: 24px;
width: 100%;
align-items: stretch;
}
.buy-area{
.buy-btn{
font-size: 12px;
width: 139px;
color: #006AFF;
letter-spacing: 0.08em;
padding: 9px 16px;
gap: 6px;
border-radius: 4px;
border: 1px solid #006AFF;
box-sizing: border-box;
}
.buy-bonus{
position: relative;
.buy-bonus-info{
display: flex;
flex-wrap: wrap;
position: absolute;
top:54px;
left: 22px;
width: 510px;
gap: 3px;
color: #626573;
div{
width: calc(50% - 15px);
gap: 7px;
b{
padding: 0 4px;
}
.red{
background: linear-gradient(180deg, #DB4CBB 0%, #EB202C 100%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
text-fill-color: transparent;
}
}
}
}
.buy-desc{
font-size: 12px;
letter-spacing: 0.08em;
color: #006AFF;
}
.buy-hr{
border: 1px dashed #BABDC2;
margin: 32px 0;
}
.buy-info{
width: 552px;
color: #8A9099;
font-size: 12px;
letter-spacing: 0.08em;
background: #F6F7FA;
padding: 12px;
display: flex;
flex-direction: column;
gap: 12px;
text-align: left;
box-sizing: border-box;
margin-top: 24px;
.red{
color: #FF4D4F;
}
}
}
}
.money-header{
color: #626573;
margin-left: 8px;
}
::v-deep .el-form-item {
margin: 0;
}
.table-grid {
display: grid;
grid-template-columns: 1fr 1fr 1fr 1fr; /* 三列 */
border: 1px solid #ccc;
}
.table-grid-cell {
border: 1px solid #ccc;
padding: 8px;
text-align: center;
}
</style>
Loading…
Cancel
Save