|
@@ -21,7 +21,9 @@ Page({
|
|
|
this.getAreaList()
|
|
this.getAreaList()
|
|
|
_Http.basic({
|
|
_Http.basic({
|
|
|
"id": "2025103010165903",
|
|
"id": "2025103010165903",
|
|
|
- "content": {}
|
|
|
|
|
|
|
+ "content": {
|
|
|
|
|
+ date: Date.now(),
|
|
|
|
|
+ }
|
|
|
}).then(res => {
|
|
}).then(res => {
|
|
|
if (res.code != 1) return wx.showToast({
|
|
if (res.code != 1) return wx.showToast({
|
|
|
title: res.msg,
|
|
title: res.msg,
|
|
@@ -86,6 +88,7 @@ Page({
|
|
|
"pageNumber": 1,
|
|
"pageNumber": 1,
|
|
|
"pageSize": 20,
|
|
"pageSize": 20,
|
|
|
"year": 2025,
|
|
"year": 2025,
|
|
|
|
|
+ date: Date.now(),
|
|
|
"where": {
|
|
"where": {
|
|
|
"areaname2": "",
|
|
"areaname2": "",
|
|
|
"areaname3": this.data.currentUser.areaname,
|
|
"areaname3": this.data.currentUser.areaname,
|
|
@@ -94,7 +97,7 @@ Page({
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}).then(res => {
|
|
}).then(res => {
|
|
|
- console.log("回款明细", res)
|
|
|
|
|
|
|
+ // console.log("回款明细", res)
|
|
|
if (res.code != 1) return wx.showToast({
|
|
if (res.code != 1) return wx.showToast({
|
|
|
title: res.msg,
|
|
title: res.msg,
|
|
|
icon: "none"
|
|
icon: "none"
|
|
@@ -189,8 +192,8 @@ Page({
|
|
|
})
|
|
})
|
|
|
this.setData({
|
|
this.setData({
|
|
|
paymentDetails,
|
|
paymentDetails,
|
|
|
- totalWidth: this.getTotalWidth(paymentDetails[0].cols),
|
|
|
|
|
- headerRow
|
|
|
|
|
|
|
+ totalWidth: paymentDetails.length ? this.getTotalWidth(paymentDetails[0].cols) : this.data.totalWidth,
|
|
|
|
|
+ headerRow: paymentDetails.length ? headerRow : []
|
|
|
})
|
|
})
|
|
|
})
|
|
})
|
|
|
},
|
|
},
|
|
@@ -210,7 +213,8 @@ Page({
|
|
|
_Http.basic({
|
|
_Http.basic({
|
|
|
"id": "2025103009445603",
|
|
"id": "2025103009445603",
|
|
|
"content": {
|
|
"content": {
|
|
|
- pageSize: 9999
|
|
|
|
|
|
|
+ pageSize: 9999,
|
|
|
|
|
+ date: Date.now(),
|
|
|
}
|
|
}
|
|
|
}).then(res => {
|
|
}).then(res => {
|
|
|
if (res.code != 1) return wx.showToast({
|
|
if (res.code != 1) return wx.showToast({
|
|
@@ -225,103 +229,50 @@ Page({
|
|
|
})
|
|
})
|
|
|
})
|
|
})
|
|
|
},
|
|
},
|
|
|
|
|
+
|
|
|
// 查询业务员月度目标
|
|
// 查询业务员月度目标
|
|
|
queryMonthlyTarget() {
|
|
queryMonthlyTarget() {
|
|
|
- let that = this;
|
|
|
|
|
_Http.basic({
|
|
_Http.basic({
|
|
|
"id": "2025103010192003",
|
|
"id": "2025103010192003",
|
|
|
"content": {
|
|
"content": {
|
|
|
"sa_saleareaid": this.data.currentUser.sa_saleareaid,
|
|
"sa_saleareaid": this.data.currentUser.sa_saleareaid,
|
|
|
"year": this.data.currentYear,
|
|
"year": this.data.currentYear,
|
|
|
- "month": this.data.currentMonth
|
|
|
|
|
|
|
+ "month": this.data.currentMonth,
|
|
|
|
|
+ date: Date.now(),
|
|
|
}
|
|
}
|
|
|
}).then(res => {
|
|
}).then(res => {
|
|
|
- console.log("业务员月度目标", res)
|
|
|
|
|
- if (res.code != 1) return wx.showToast({
|
|
|
|
|
- title: res.msg,
|
|
|
|
|
- icon: "none"
|
|
|
|
|
- });
|
|
|
|
|
|
|
+ console.log("业务员月度目标", res);
|
|
|
|
|
+ if (res.code != 1) {
|
|
|
|
|
+ return wx.showToast({
|
|
|
|
|
+ title: res.msg,
|
|
|
|
|
+ icon: "none"
|
|
|
|
|
+ });
|
|
|
|
|
+ }
|
|
|
|
|
+ let monthlyMetrics = {};
|
|
|
|
|
+ for (const key in res.data) {
|
|
|
|
|
+ if (key != 'actualcompletedpercentage') {
|
|
|
|
|
+ monthlyMetrics[key] = this.CNY(res.data[key] || 0)
|
|
|
|
|
+ } else {
|
|
|
|
|
+ monthlyMetrics[key] = (res.data[key] || 0).toFixed(2)
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
this.setData({
|
|
this.setData({
|
|
|
- monthlyMetrics: calculateMonthlyMetrics(res)
|
|
|
|
|
- })
|
|
|
|
|
- })
|
|
|
|
|
-
|
|
|
|
|
- function calculateMonthlyMetrics(res) {
|
|
|
|
|
- const data = res?.data || {};
|
|
|
|
|
-
|
|
|
|
|
- // ===============================
|
|
|
|
|
- // 🔹 基础字段(接口已提供)
|
|
|
|
|
- // ===============================
|
|
|
|
|
- const rw_month = data.rw_month || 0; // 月度任务(万)
|
|
|
|
|
- const previousexceed = data.previousexceed || 0; // 上月完成额超出部分(1月为0)
|
|
|
|
|
- const gccompletedamount = data.gccompletedamount || 0; // GC工程完成额
|
|
|
|
|
- const gccompletedamountexceed = data.gccompletedamountexceed || 0; // GC工程超出部分
|
|
|
|
|
- const zzcompletedamount = data.zzcompletedamount || 0; // 整装工程完成额
|
|
|
|
|
- const zzcompletedamountexceed = data.zzcompletedamountexceed || 0; // 整装工程超出部分
|
|
|
|
|
-
|
|
|
|
|
- // ===============================
|
|
|
|
|
- // ⚠️ 缺失字段(需要后端或其他接口提供)
|
|
|
|
|
- // ===============================
|
|
|
|
|
- const cashbackamount = data.cashbackamount || 0; // ⚠️ 现金账户回款(缺少)
|
|
|
|
|
- const advancepaymentamount = data.advancepaymentamount || 0; // ⚠️ 活动预存账户回款(缺少)
|
|
|
|
|
- const rebateamount = data.rebateamount || 0; // ⚠️ 返利(缺少)
|
|
|
|
|
-
|
|
|
|
|
- // ===============================
|
|
|
|
|
- // 🔹 中间计算项
|
|
|
|
|
- // ===============================
|
|
|
|
|
- // 回款完成额
|
|
|
|
|
- const paymentCompleted = cashbackamount + advancepaymentamount + rebateamount;
|
|
|
|
|
-
|
|
|
|
|
- // 实际完成额
|
|
|
|
|
- const actualcompletedamount =
|
|
|
|
|
- paymentCompleted + gccompletedamount + zzcompletedamount;
|
|
|
|
|
-
|
|
|
|
|
- // 实际完成百分比
|
|
|
|
|
- const actualcompletedpercentage =
|
|
|
|
|
- rw_month > 0 ? (actualcompletedamount / rw_month) * 100 : 0;
|
|
|
|
|
-
|
|
|
|
|
- // 完成额超出100%部分
|
|
|
|
|
- const completedamountexceed100 =
|
|
|
|
|
- paymentCompleted + previousexceed + gccompletedamount + zzcompletedamount - rw_month;
|
|
|
|
|
-
|
|
|
|
|
- // 若为负则取0
|
|
|
|
|
- const completedamountexceed100_fixed =
|
|
|
|
|
- completedamountexceed100 > 0 ? completedamountexceed100 : 0;
|
|
|
|
|
-
|
|
|
|
|
- // ===============================
|
|
|
|
|
- // 🔹 返回完整结果(金额类统一格式化)
|
|
|
|
|
- // ===============================
|
|
|
|
|
- return {
|
|
|
|
|
- // ---- 原始字段 ----
|
|
|
|
|
- rw_month: that.CNY(rw_month), // 月度任务额(万)
|
|
|
|
|
- previousexceed: that.CNY(previousexceed), // 上月超出额
|
|
|
|
|
- gccompletedamount: that.CNY(gccompletedamount), // GC工程完成额
|
|
|
|
|
- gccompletedamountexceed: that.CNY(gccompletedamountexceed), // GC工程超出部分
|
|
|
|
|
- zzcompletedamount: that.CNY(zzcompletedamount), // 整装工程完成额
|
|
|
|
|
- zzcompletedamountexceed: that.CNY(zzcompletedamountexceed), // 整装工程超出部分
|
|
|
|
|
-
|
|
|
|
|
- // ---- 缺少但定义字段 ----
|
|
|
|
|
- cashbackamount: that.CNY(cashbackamount), // ⚠️ 现金账户回款
|
|
|
|
|
- advancepaymentamount: that.CNY(advancepaymentamount), // ⚠️ 活动预存账户回款
|
|
|
|
|
- rebateamount: that.CNY(rebateamount), // ⚠️ 返利
|
|
|
|
|
|
|
+ monthlyMetrics
|
|
|
|
|
+ });
|
|
|
|
|
+ });
|
|
|
|
|
|
|
|
- // ---- 计算结果 ----
|
|
|
|
|
- paymentCompleted: that.CNY(paymentCompleted), // 回款完成额
|
|
|
|
|
- actualcompletedamount: that.CNY(actualcompletedamount), // 实际完成额
|
|
|
|
|
- actualcompletedpercentage: actualcompletedpercentage.toFixed(2) + '%', // 实际完成百分比(保留两位小数)
|
|
|
|
|
- completedamountexceed100: that.CNY(completedamountexceed100_fixed), // 完成额超出100%部分
|
|
|
|
|
- };
|
|
|
|
|
- }
|
|
|
|
|
},
|
|
},
|
|
|
|
|
+
|
|
|
// 查询业务员季度目标
|
|
// 查询业务员季度目标
|
|
|
queryQuarterlyTarget() {
|
|
queryQuarterlyTarget() {
|
|
|
- let that = this;
|
|
|
|
|
_Http.basic({
|
|
_Http.basic({
|
|
|
"id": "2025103010193903",
|
|
"id": "2025103010193903",
|
|
|
"version": 1,
|
|
"version": 1,
|
|
|
"content": {
|
|
"content": {
|
|
|
"sa_saleareaid": this.data.currentUser.sa_saleareaid,
|
|
"sa_saleareaid": this.data.currentUser.sa_saleareaid,
|
|
|
- "year": this.data.currentYear
|
|
|
|
|
|
|
+ "year": this.data.currentYear,
|
|
|
|
|
+ "month": this.data.currentMonth,
|
|
|
|
|
+ date: Date.now(),
|
|
|
}
|
|
}
|
|
|
}).then(res => {
|
|
}).then(res => {
|
|
|
console.log("业务员季度目标", res);
|
|
console.log("业务员季度目标", res);
|
|
@@ -329,79 +280,30 @@ Page({
|
|
|
title: res.msg,
|
|
title: res.msg,
|
|
|
icon: "none"
|
|
icon: "none"
|
|
|
});
|
|
});
|
|
|
|
|
+
|
|
|
|
|
+ let quarterlyMetrics = {};
|
|
|
|
|
+ for (const key in res.data) {
|
|
|
|
|
+ if (key != 'actualcompletedpercentage') {
|
|
|
|
|
+ quarterlyMetrics[key] = this.CNY(res.data[key] || 0)
|
|
|
|
|
+ } else {
|
|
|
|
|
+ quarterlyMetrics[key] = (res.data[key] || 0).toFixed(2)
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
this.setData({
|
|
this.setData({
|
|
|
- quarterlyMetrics: calculateQuarterlyMetrics(res)
|
|
|
|
|
|
|
+ quarterlyMetrics
|
|
|
});
|
|
});
|
|
|
- console.log("季度", this.data.quarterlyMetrics)
|
|
|
|
|
});
|
|
});
|
|
|
-
|
|
|
|
|
- /**
|
|
|
|
|
- * 季度指标计算函数
|
|
|
|
|
- * 根据接口返回的 res.data 自动计算核心指标,并格式化金额
|
|
|
|
|
- */
|
|
|
|
|
- function calculateQuarterlyMetrics(res) {
|
|
|
|
|
- const data = res?.data || {};
|
|
|
|
|
-
|
|
|
|
|
- // ===============================
|
|
|
|
|
- // 🔹 基础字段(接口已提供)
|
|
|
|
|
- // ===============================
|
|
|
|
|
- const rw_quarter = data.rw_quarter || 0; // 季度任务额(万)= 当季各月度任务额总计
|
|
|
|
|
- const previousexceed = data.previousexceed || 0; // 上季完成额超出部分
|
|
|
|
|
- const gccompletedamount = data.gccompletedamount || 0; // GC工程完成额(季度累计)
|
|
|
|
|
- const zzcompletedamount = data.zzcompletedamount || 0; // 整装工程完成额(季度累计)
|
|
|
|
|
- const actualcompletedamount = data.actualcompletedamount || 0; // 实际完成额(季度实际回款+GC+整装)
|
|
|
|
|
- const actualcompletedpercentage = data.actualcompletedpercentage || 0; // 实际完成百分比(季度原始值)
|
|
|
|
|
- const completedamount = data.completedamount || 0; // 完成额(未超出部分)
|
|
|
|
|
-
|
|
|
|
|
- // ===============================
|
|
|
|
|
- // ⚠️ 缺失字段(需后端补充)
|
|
|
|
|
- // ===============================
|
|
|
|
|
- const paymentCompleted = data.paymentCompleted || 0; // ⚠️ 季度回款完成额(当季各月度回款完成额总计)
|
|
|
|
|
- // 若后端没提供,可暂用 actualcompletedamount - gc - zz 近似估算:
|
|
|
|
|
- const estimatedPaymentCompleted = paymentCompleted || (actualcompletedamount - gccompletedamount - zzcompletedamount);
|
|
|
|
|
-
|
|
|
|
|
- // ===============================
|
|
|
|
|
- // 🔹 计算逻辑
|
|
|
|
|
- // ===============================
|
|
|
|
|
- // 季度完成额 = 回款完成额 + 上季超出额 + GC + 整装
|
|
|
|
|
- const quarterCompletedAmount =
|
|
|
|
|
- estimatedPaymentCompleted + previousexceed + gccompletedamount + zzcompletedamount;
|
|
|
|
|
-
|
|
|
|
|
- // 季度百分比 = 季度完成额 / 季度任务额 * 100
|
|
|
|
|
- const quarterPercentage =
|
|
|
|
|
- rw_quarter > 0 ? (quarterCompletedAmount / rw_quarter) * 100 : 0;
|
|
|
|
|
-
|
|
|
|
|
- // ===============================
|
|
|
|
|
- // 🔹 返回完整结果(金额格式化)
|
|
|
|
|
- // ===============================
|
|
|
|
|
- return {
|
|
|
|
|
- // ---- 原始字段 ----
|
|
|
|
|
- rw_quarter: that.CNY(rw_quarter), // 季度任务额(万)
|
|
|
|
|
- previousexceed: that.CNY(previousexceed), // 上季完成额超出部分
|
|
|
|
|
- gccompletedamount: that.CNY(gccompletedamount), // GC工程完成额
|
|
|
|
|
- zzcompletedamount: that.CNY(zzcompletedamount), // 整装工程完成额
|
|
|
|
|
- actualcompletedamount: that.CNY(actualcompletedamount), // 实际完成额
|
|
|
|
|
- completedamount: that.CNY(completedamount), // 完成额(未超出部分)
|
|
|
|
|
-
|
|
|
|
|
- // ---- 缺失但定义字段 ----
|
|
|
|
|
- paymentCompleted: that.CNY(estimatedPaymentCompleted), // ⚠️ 季度回款完成额(若后端未返回则估算)
|
|
|
|
|
-
|
|
|
|
|
- // ---- 计算结果 ----
|
|
|
|
|
- quarterCompletedAmount: that.CNY(quarterCompletedAmount), // 季度完成额
|
|
|
|
|
- quarterPercentage: quarterPercentage.toFixed(2) + '%', // 季度完成百分比
|
|
|
|
|
- };
|
|
|
|
|
- }
|
|
|
|
|
},
|
|
},
|
|
|
// 查询业务员总指标
|
|
// 查询业务员总指标
|
|
|
queryOverallTarget() {
|
|
queryOverallTarget() {
|
|
|
- let that = this;
|
|
|
|
|
_Http.basic({
|
|
_Http.basic({
|
|
|
"id": "2025103010195403",
|
|
"id": "2025103010195403",
|
|
|
"version": 1,
|
|
"version": 1,
|
|
|
"content": {
|
|
"content": {
|
|
|
"sa_saleareaid": this.data.currentUser.sa_saleareaid,
|
|
"sa_saleareaid": this.data.currentUser.sa_saleareaid,
|
|
|
"year": this.data.currentYear,
|
|
"year": this.data.currentYear,
|
|
|
- "months": this.data.months // 默认或用户选择的月份区间
|
|
|
|
|
|
|
+ "months": this.data.months, // 默认或用户选择的月份区间
|
|
|
|
|
+ date: Date.now(),
|
|
|
}
|
|
}
|
|
|
}).then(res => {
|
|
}).then(res => {
|
|
|
console.log("业务员总指标", res);
|
|
console.log("业务员总指标", res);
|
|
@@ -409,70 +311,19 @@ Page({
|
|
|
title: res.msg,
|
|
title: res.msg,
|
|
|
icon: "none"
|
|
icon: "none"
|
|
|
});
|
|
});
|
|
|
|
|
+
|
|
|
|
|
+ let overallMetrics = {};
|
|
|
|
|
+ for (const key in res.data) {
|
|
|
|
|
+ if (key != 'actualcompletedpercentage') {
|
|
|
|
|
+ overallMetrics[key] = this.CNY(res.data[key] || 0)
|
|
|
|
|
+ } else {
|
|
|
|
|
+ overallMetrics[key] = (res.data[key] || 0).toFixed(2)
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
this.setData({
|
|
this.setData({
|
|
|
- overallMetrics: calculateOverallMetrics(res)
|
|
|
|
|
- })
|
|
|
|
|
|
|
+ overallMetrics
|
|
|
|
|
+ });
|
|
|
});
|
|
});
|
|
|
-
|
|
|
|
|
- /**
|
|
|
|
|
- * 总指标计算函数
|
|
|
|
|
- * 根据接口返回 res.data 计算核心指标并格式化金额
|
|
|
|
|
- */
|
|
|
|
|
- function calculateOverallMetrics(res) {
|
|
|
|
|
- const data = res?.data || {};
|
|
|
|
|
-
|
|
|
|
|
- // ===============================
|
|
|
|
|
- // 🔹 基础字段(接口已提供)
|
|
|
|
|
- // ===============================
|
|
|
|
|
- const rw_all = data.rw_all || 0; // 总任务额(万)
|
|
|
|
|
- const gccompletedamount = data.gccompletedamount || 0; // GC工程完成额(所选区间累计)
|
|
|
|
|
- const zzcompletedamount = data.zzcompletedamount || 0; // 整装工程完成额(所选区间累计)
|
|
|
|
|
- const actualcompletedamount = data.actualcompletedamount || 0; // 实际完成额
|
|
|
|
|
- const actualcompletedpercentage = data.actualcompletedpercentage || 0; // 实际完成百分比
|
|
|
|
|
- const completedamount = data.completedamount || 0; // 完成额(未超出部分)
|
|
|
|
|
- const differenceamount = data.differenceamount || 0; // 差额(目标与实际差距)
|
|
|
|
|
-
|
|
|
|
|
- // ===============================
|
|
|
|
|
- // ⚠️ 缺失字段(需后端补充)
|
|
|
|
|
- // ===============================
|
|
|
|
|
- const paymentCompleted = data.paymentCompleted || 0; // ⚠️ 回款完成额(区间累计)
|
|
|
|
|
- // 若后端暂未提供,则用“实际完成额 - GC - 整装”估算
|
|
|
|
|
- const estimatedPaymentCompleted = paymentCompleted || (actualcompletedamount - gccompletedamount - zzcompletedamount);
|
|
|
|
|
-
|
|
|
|
|
- // ===============================
|
|
|
|
|
- // 🔹 计算逻辑
|
|
|
|
|
- // ===============================
|
|
|
|
|
- // 总完成额 = 回款完成额 + GC + 整装
|
|
|
|
|
- const totalCompletedAmount = estimatedPaymentCompleted + gccompletedamount + zzcompletedamount;
|
|
|
|
|
-
|
|
|
|
|
- // 百分比 = 总完成额 / 总任务额 * 100
|
|
|
|
|
- const totalPercentage = rw_all > 0 ? (totalCompletedAmount / rw_all) * 100 : 0;
|
|
|
|
|
-
|
|
|
|
|
- // 距70%差额 = (任务额 * 70%) - 实际完成额(若小于0取0)
|
|
|
|
|
- const target70 = rw_all * 0.7;
|
|
|
|
|
- const differenceTo70 = Math.max(target70 - totalCompletedAmount, 0);
|
|
|
|
|
-
|
|
|
|
|
- // ===============================
|
|
|
|
|
- // 🔹 返回结果(金额格式化)
|
|
|
|
|
- // ===============================
|
|
|
|
|
- return {
|
|
|
|
|
- // ---- 原始字段 ----
|
|
|
|
|
- rw_all: that.CNY(rw_all), // 总任务额(万)
|
|
|
|
|
- gccompletedamount: that.CNY(gccompletedamount), // GC工程完成额
|
|
|
|
|
- zzcompletedamount: that.CNY(zzcompletedamount), // 整装工程完成额
|
|
|
|
|
- actualcompletedamount: that.CNY(actualcompletedamount), // 实际完成额
|
|
|
|
|
- completedamount: that.CNY(completedamount), // 完成额(未超出部分)
|
|
|
|
|
- differenceamount: that.CNY(differenceamount), // 差额
|
|
|
|
|
-
|
|
|
|
|
- // ---- 缺失但定义字段 ----
|
|
|
|
|
- paymentCompleted: that.CNY(estimatedPaymentCompleted), // ⚠️ 回款完成额(若缺失则估算)
|
|
|
|
|
-
|
|
|
|
|
- // ---- 计算结果 ----
|
|
|
|
|
- totalCompletedAmount: that.CNY(totalCompletedAmount), // 总完成额
|
|
|
|
|
- totalPercentage: totalPercentage.toFixed(2) + '%', // 总完成百分比
|
|
|
|
|
- differenceTo70: that.CNY(differenceTo70), // 距70%差额
|
|
|
|
|
- };
|
|
|
|
|
- }
|
|
|
|
|
},
|
|
},
|
|
|
CNY(value) {
|
|
CNY(value) {
|
|
|
if (value === null || value === undefined || isNaN(value)) return '0';
|
|
if (value === null || value === undefined || isNaN(value)) return '0';
|