1、界面展示功能
销售简报,合同金额目标及完成情况,数据汇总。
前端展示界面
briefList: [
{ label: '新增客户(人)', title: '新增客户', type: 'customer', labelValue: 2, field: 'customerCount', icon: 'wk-customer', num: '', rate: '', status: '', color: '#2362FB' },
{ label: '新增联系人(人)', title: '新增联系人', type: 'contacts', labelValue: 3, field: 'contactsCount', icon: 'wk-contacts', num: '', rate: '', status: '', color: '#27BA4A' },
{ label: '新增商机(个)', title: '新增商机', type: 'business', labelValue: 5, field: 'businessCount', icon: 'wk-business', num: '', rate: '', status: '', color: '#FB9323' },
{ label: '新增合同(个)', title: '新增合同', type: 'contract', labelValue: 6, field: 'contractCount', icon: 'wk-contract', num: '', rate: '', status: '', color: '#4A5BFD' },
{ label: '合同金额(元)', title: '合同金额', type: 'contract', labelValue: 6, field: 'contractMoney', icon: 'wk-receivables', num: '', rate: '', status: '', color: '#19B5F6' },
{ label: '商机金额(元)', title: '商机金额', type: 'business', labelValue: 5, field: 'businessMoney', icon: 'wk-icon-opportunities', num: '', rate: '', status: '', color: '#AD5CFF' },
{ label: '回款金额(元)', title: '回款金额', type: 'receivables', labelValue: 7, field: 'receivablesMoney', icon: 'wk-receivables', num: '', rate: '', status: '', color: '#FFB940' },
{ label: '新增跟进记录(条)', title: '新增跟进记录', type: 'record', labelValue: '', field: 'recordCount', icon: 'wk-record', num: '', rate: '', status: '', color: '#4A5BFD' }
],
上述是前端初始化数据,通过一个数组循环,展示每个指标的名称和内容,其中num变量是从后端接口获取数据
/**
* 获取销售简报数据
*/
getBriefData() {
this.loading = true
crmQueryBulletinAPI(this.getBaseParams()).then(res => {
this.loading = false
this.briefList.forEach(item => {
if (item.field == 'contractMoney' ||
item.field == 'businessMoney' ||
item.field == 'receivablesMoney') {
item.num = separator(Math.floor(res.data.data[item.field] || 0))
} else {
item.num = res.data.data[item.field] || 0 // 数量
}
if (Number(res.data.prev[item.field]) !== 0) {
// status状态 top 增长 bottom 下降 '' 持平 上升调整为 红色 下降调整为绿色
item.status = Number(res.data.prev[item.field]) > 0 ? 'top' : 'bottom'
} else {
item.status = ''
}
item.rate = this.accMul(res.data.prev[item.field], 100) // 增长比例/下降比例
})
}).catch(() => {
this.loading = false
})
},
前端通过上述函数获取后台接口
/**
* 销售简报
* @param {*} data
*/
export function crmQueryBulletinAPI(data) {
return request({
url: 'crmInstrument/queryBulletin',
method: 'post',
data: data,
headers: {
'Content-Type': 'application/json;charset=UTF-8'
}
})
}
通过http请求后端java 接口,并返回数据。接口是post请求
下面是java后端接口封装
@PostMapping("/queryBulletin")
@ApiOperation("查询销售简报")
public Result<JSONObject> queryBulletin(@RequestBody BiParams biParams) {
JSONObject jsonObject = instrumentService.queryBulletin(biParams);
return R.ok(jsonObject);
}
该 Java 方法是一个 Spring Boot Controller 层的接口,作用是处理客户端的 HTTP POST 请求,并查询销售简报。接下来我会为你详细解析这段代码:
- @PostMapping("/queryBulletin"):该注解用来处理 HTTP POST 请求,并映射到 "/queryBulletin" 这个 URL。当客户端向服务器发送一个 POST 请求到 "/queryBulletin" 这个 URL,Spring Boot 就会调用这个方法来处理请求。
- @ApiOperation("查询销售简报"):这是一个 Swagger 的注解,用于描述接口的作用,这个接口的作用是“查询销售简报”。
- public Result<JSONObject> queryBulletin(@RequestBody BiParams biParams):这是一个公共的方法,返回类型是 Result<JSONObject>。方法名是 queryBulletin,接受一个 BiParams 类型的参数 biParams。@RequestBody 是用来绑定请求体中的数据的。请求体中的 JSON 数据会自动映射成 BiParams 对象。
- JSONObject jsonObject = instrumentService.queryBulletin(biParams);:这行代码是调用 instrumentService(这可能是一个 Service 层的 Bean)的 queryBulletin 方法,并传入之前绑定的 biParams 对象,然后返回一个 JSONObject 对象,把这个对象赋值给 jsonObject。
- return R.ok(jsonObject);:这行代码是返回一个 Result 对象,这个对象表示请求处理成功,并且响应体中的数据是 jsonObject。
@Override
public JSONObject queryBulletin(BiParams biParams) {
BiTimeUtil.BiTimeEntity biTimeEntity = BiTimeUtil.analyzeTime(biParams);
BiAuthority biAuthority = handleDataType(biParams);
Map<String, Object> record = new HashMap<>();
record.put("businessUserIds", AuthUtil.filterUserIdList(CrmEnum.BUSINESS, CrmAuthEnum.LIST,biAuthority.getUserIds()));
record.put("contactsUserIds", AuthUtil.filterUserIdList(CrmEnum.CONTACTS, CrmAuthEnum.LIST,biAuthority.getUserIds()));
record.put("customerUserIds", AuthUtil.filterUserIdList(CrmEnum.CUSTOMER, CrmAuthEnum.LIST,biAuthority.getUserIds()));
record.put("receivablesUserIds", AuthUtil.filterUserIdList(CrmEnum.RECEIVABLES, CrmAuthEnum.LIST,biAuthority.getUserIds()));
record.put("contractUserIds", AuthUtil.filterUserIdList(CrmEnum.CONTRACT, CrmAuthEnum.LIST,biAuthority.getUserIds()));
record.put("leadsUserIds", AuthUtil.filterUserIdList(CrmEnum.LEADS, CrmAuthEnum.LIST,biAuthority.getUserIds()));
record.put("recordUserIds", AuthUtil.filterUserIdList(null, CrmAuthEnum.LIST,biAuthority.getUserIds()));
Map<String, Object> info = crmInstrumentMapper.queryBulletin(biTimeEntity, record);
this.handleMapValue(info);
boolean isCustom = !StrUtil.isAllEmpty(biParams.getStartTime(), biParams.getEndTime());
Map<String, Object> prevRecord = new HashMap<>();
BigDecimal bigDecimal = new BigDecimal("0");
if (!isCustom) {
BiTimeUtil.BiTimeEntity timeEntity = BiTimeUtil.prevAnalyzeType(biParams);
prevRecord = crmInstrumentMapper.queryBulletin(timeEntity, record);
this.handleMapValue(prevRecord);
for (String columnName : info.keySet()) {
BigDecimal decimal = new BigDecimal(prevRecord.get(columnName).toString());
BigDecimal newdecimal = new BigDecimal(info.get(columnName).toString());
if (decimal.equals(bigDecimal) || newdecimal.equals(bigDecimal)) {
prevRecord.put(columnName, bigDecimal);
} else {
if (decimal.compareTo(BigDecimal.ZERO) == 0 || newdecimal.compareTo(BigDecimal.ZERO) == 0) {
prevRecord.put(columnName, 0);
} else {
prevRecord.put(columnName, newdecimal.subtract(decimal).divide(decimal, 4, BigDecimal.ROUND_HALF_UP));
}
}
}
} else {
for (String columnName : info.keySet()) {
prevRecord.put(columnName, bigDecimal);
}
}
return new JSONObject().fluentPut("data", info).fluentPut("prev", prevRecord);
}
该方法是用于查询销售简报的服务层方法。它接收一个 BiParams 类型的参数 biParams,返回一个 JSONObject 对象。具体的流程解析如下:
- 使用 BiTimeUtil 的 analyzeTime 方法分析 biParams 的时间属性,并将结果存入 BiTimeEntity 类型的变量 biTimeEntity。
- 调用 handleDataType 方法处理 biParams 中的数据类型,并将结果存入 BiAuthority 类型的变量 biAuthority。
- 创建一个新的 HashMap 对象 record,用于存储经过权限验证后的用户 ID 列表。
- 调用 AuthUtil.filterUserIdList 方法过滤 biAuthority 中的用户 ID 列表,并将过滤的结果添加到 record 中。
- 通过调用 crmInstrumentMapper.queryBulletin,可以查询相关的销售简报并将结果存入 info。
- 之后的部分代码主要用于处理比较当前记录和上一条记录的信息,并计算一些需要返回的数据。
- 最后,将 info 和 prevRecord 存入一个新创建的 JSONObject 中,并返回这个 JSONObject。
值得注意的是,CrmEnum 和 CrmAuthEnum 应该是预定义的一些常量或枚举,用于指定过滤用户 ID 列表需要的参数。