index.js 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. const cloud = require('wx-server-sdk');
  2. cloud.init({ env: cloud.DYNAMIC_CURRENT_ENV });
  3. const db = cloud.database();
  4. // 提现申请(Phase 1:记录申请,平台手动打款)
  5. exports.main = async (event) => {
  6. const { amount } = event;
  7. const { OPENID } = cloud.getWXContext();
  8. if (!amount || amount <= 0) {
  9. return { code: 400, error: '无效金额' };
  10. }
  11. try {
  12. const userRes = await db.collection('users').where({
  13. _openid: OPENID,
  14. }).get();
  15. if (userRes.data.length === 0) {
  16. return { code: 401, error: '用户不存在' };
  17. }
  18. // 检查可提现金额
  19. const commRes = await db.collection('commissions').where({
  20. toUser: OPENID,
  21. status: 'available',
  22. }).get();
  23. const availableTotal = (commRes.data || []).reduce((sum, c) => sum + (c.amount || 0), 0);
  24. if (amount > availableTotal) {
  25. return { code: 400, error: '可提现金额不足' };
  26. }
  27. if (amount < 10000) { // 单位:分,最低 ¥100
  28. return { code: 400, error: '未达到最低提现金额 ¥100' };
  29. }
  30. // 创建提现申请
  31. const applyRes = await db.collection('withdrawals').add({
  32. data: {
  33. userId: OPENID,
  34. amount,
  35. status: 'pending',
  36. createdAt: db.serverDate(),
  37. updatedAt: db.serverDate(),
  38. },
  39. });
  40. // 将佣金状态改为 processing
  41. let remaining = amount;
  42. const availableComms = commRes.data.sort((a, b) => a.createdAt - b.createdAt);
  43. for (const c of availableComms) {
  44. if (remaining <= 0) break;
  45. const deductAmount = Math.min(remaining, c.amount);
  46. remaining -= deductAmount;
  47. await db.collection('commissions').doc(c._id).update({
  48. data: {
  49. status: 'processing',
  50. withdrawId: applyRes._id,
  51. updatedAt: db.serverDate(),
  52. },
  53. });
  54. }
  55. return { code: 0, withdrawId: applyRes._id };
  56. } catch (err) {
  57. return { code: 500, error: err.message };
  58. }
  59. };