Files
jsowell-charger-web/jsowell-pile/src/main/java/com/jsowell/pile/service/SimCardService.java

546 lines
20 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package com.jsowell.pile.service;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import com.google.common.collect.Lists;
import com.jsowell.common.enums.sim.SimCardStatusCorrespondEnum;
import com.jsowell.common.enums.sim.SimSupplierEnum;
import com.jsowell.common.enums.ykc.ReturnCodeEnum;
import com.jsowell.common.exception.BusinessException;
import com.jsowell.common.util.DateUtils;
import com.jsowell.common.util.StringUtils;
import com.jsowell.common.util.http.HttpUtils;
import com.jsowell.common.util.id.IdUtils;
import com.jsowell.common.util.sim.SimCardUtils;
import com.jsowell.common.util.sim.XunZhongSimUtils;
import com.jsowell.pile.domain.PileSimInfo;
import com.jsowell.pile.vo.web.*;
import org.apache.commons.collections4.CollectionUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.List;
import java.util.stream.Collectors;
/**
* Sim卡Service
*
* @author JS-ZZA
* @date 2022/12/3 15:35
*/
@Service
public class SimCardService {
@Autowired
private PileSimInfoService pileSimInfoService;
protected final Logger logger = LoggerFactory.getLogger(SimCardService.class);
@Value("${xunzhong.apiId}")
private String API_ID;
@Value("${xunzhong.sim.getSimCardDetailURL}")
private String getSimCardDetailURL;
@Value("${xunzhong.trafficPool.poolListURL}")
private String poolListURL;
@Value("${xunzhong.sim.renewURL}")
private String renewURL;
@Value("${wulian.appId}")
private String appId;
@Value("${wulian.appSecret}")
private String appSecret;
@Value("${wulian.getWay}")
private String wuLianGetWay;
@Value("${wulian.name.getSimInfo}")
private String getSimInfoName;
@Value("${wulian.name.WuLianSimRenew}")
private String WuLianSimRenew;
/**
* 不知道iccid属于哪家供应商就用这个方法查
*
* @param iccids
* @return
*/
public List<SimCardVO> searchByLoop(List<String> iccids) {
List<SimCardVO> resultList = Lists.newArrayList();
// 查XunZhong
List<SimCardVO> xunZhongList = XunZhongGetSimInfoByIccIds(iccids);
if (CollectionUtils.isNotEmpty(xunZhongList)) {
resultList.addAll(xunZhongList);
}
// 查WuLian平台
List<SimCardVO> wuLianSimData = WuLianGetSimInfoByIccIds(iccids);
if (CollectionUtils.isNotEmpty(wuLianSimData)) {
resultList.addAll(xunZhongList);
}
// 第三个供应商
logger.info("查询iccid:{}, 详情信息:{}", iccids, JSON.toJSONString(resultList));
return resultList;
}
/**
* 通过iccId去两个官方平台查询流量卡具体数据
*
* @param iccId
* @return
*/
SimCardVO searchOfficialWebsiteSimInfo(String iccId) {
SimCardVO vo = new SimCardVO();
List<String> iccIds = Lists.newArrayList(iccId);
// 查XunZhong
List<SimCardVO> simCardVOS = XunZhongGetSimInfoByIccIds(iccIds);
if (CollectionUtils.isNotEmpty(simCardVOS)) {
vo = simCardVOS.get(0);
} else {
// 查WuLian平台
List<SimCardVO> wuLianSimData = WuLianGetSimInfoByIccIds(iccIds);
if (CollectionUtils.isEmpty(wuLianSimData)) {
return vo;
}
vo = wuLianSimData.get(0);
}
return vo;
}
/**
* 通过iccId查询数据2024.11.1 后管用)
*
* @param iccId
* @return
*/
public SimCardVO getSimCardInfoByIccId(String iccId) {
PileSimInfo pileSimInfo = pileSimInfoService.getBasicInfoByIccId(iccId);
// 调用官方数据接口查询最新sim卡数据
SimCardVO simCardVO = searchOfficialWebsiteSimInfo(iccId);
if (simCardVO == null) {
throw new BusinessException(ReturnCodeEnum.CODE_SELECT_INFO_IS_NULL);
}
if (pileSimInfo == null) {
// 数据库中没有此卡数据,进行新增
pileSimInfo = PileSimInfo.builder()
.name(simCardVO.getName())
.iccid(simCardVO.getIccId())
.status(simCardVO.getSimCardStatus())
.simSupplier(simCardVO.getSimCardFactory())
.totalData(String.valueOf(simCardVO.getPackageCapacity()))
.surplusData(String.valueOf(simCardVO.getResidualFlowRate()))
.expireTime(DateUtils.parseDate(simCardVO.getExpiredTime()))
.operator(simCardVO.getSimCardOperator())
.build();
pileSimInfoService.insertPileSimInfo(pileSimInfo);
} else {
// 将查到的流量套餐等最新数据更新到数据库
pileSimInfo.setName(simCardVO.getName());
pileSimInfo.setIccid(simCardVO.getIccId());
pileSimInfo.setStatus(simCardVO.getSimCardStatus());
pileSimInfo.setSimSupplier(simCardVO.getSimCardFactory());
pileSimInfo.setTotalData(String.valueOf(simCardVO.getPackageCapacity()));
pileSimInfo.setSurplusData(String.valueOf(simCardVO.getResidualFlowRate()));
pileSimInfo.setExpireTime(DateUtils.parseDate(simCardVO.getExpiredTime()));
pileSimInfo.setOperator(simCardVO.getSimCardOperator());
pileSimInfoService.updatePileSimInfo(pileSimInfo);
}
return simCardVO;
}
/**
* 批量续费(后管调用此方法)
*
* @param iccIds 卡号
* @param cycleNumber 续费周期
*/
public List<SimRenewResultVO> renewSimByLoop(List<String> iccIds, int cycleNumber) {
if (CollectionUtils.isEmpty(iccIds)) {
return Lists.newArrayList();
}
// 将集合中为空和0的过滤
iccIds = iccIds.stream()
.filter(StringUtils::isNotEmpty)
.filter(x -> !StringUtils.equals(x, "0"))
.collect(Collectors.toList());
ArrayList<SimRenewResultVO> list = new ArrayList<>();
for (String iccId : iccIds) {
// 查出此卡属于哪家公司(拿到code)
SimCardVO simCardVO = searchByLoop(Lists.newArrayList(iccId)).get(0);
String simSupplierCode = simCardVO.getSimCardFactory();
// 根据不同的公司执行不同的续费方法
SimRenewResultVO simRenewResultVO = renewSimBySupplier(simSupplierCode, iccId, cycleNumber);
list.add(simRenewResultVO);
}
return list;
}
/**
* 根据不同的公司执行不同的续费方法
*
* @param code 👇👇👇👇👇👇👇
* @param iccId 卡号
* @param cycleNumber 续费周期
* @see SimSupplierEnum
*/
private SimRenewResultVO renewSimBySupplier(String code, String iccId, int cycleNumber) {
SimRenewResultVO vo = new SimRenewResultVO();
vo.setIccId(iccId);
vo.setCycleNumber(cycleNumber);
if (StringUtils.equals(code, SimSupplierEnum.XUN_ZHONG.getCode())) {
// 讯众
try {
vo.setSimSuppler(SimSupplierEnum.XUN_ZHONG.getName());
XunZhongSimRenewal(Lists.newArrayList(iccId), cycleNumber);
vo.setResult(true);
} catch (BusinessException e) {
vo.setResult(false);
vo.setReason(e.getMessage());
}
}
// 物联平台
if (StringUtils.equals(code, SimSupplierEnum.WU_LIAN_INTERNET.getCode())) {
try {
vo.setSimSuppler(SimSupplierEnum.WU_LIAN_INTERNET.getName());
WuLianSimRenew(Lists.newArrayList(iccId), cycleNumber);
vo.setResult(true);
} catch (BusinessException e) {
vo.setResult(false);
vo.setReason(e.getMessage());
}
}
return vo;
}
/**
* 讯众 内部接口
* 通过iccIds查询讯众Sim卡信息
*
* @param iccIds
*/
public List<SimCardVO> XunZhongGetSimInfoByIccIds(List<String> iccIds) {
List<SimCardVO> resultList = new ArrayList<>();
List<XunZhongSimData> dataList = getSimCardDetail(iccIds);
SimCardVO simCard = null;
for (XunZhongSimData zhongSimData : dataList) {
// sim卡套餐
XunZhongSimData.Products products = null;
if (CollectionUtils.isNotEmpty(zhongSimData.getCurrent_products())) {
products = zhongSimData.getCurrent_products().get(0);
} else {
if (CollectionUtils.isNotEmpty(zhongSimData.getFuture_products())) {
products = zhongSimData.getFuture_products().get(0);
}
}
if (products == null) {
logger.info("iccid:{}, 没有套餐", zhongSimData.getIccid());
continue;
}
// set
simCard = new SimCardVO();
simCard.setIccId(zhongSimData.getIccid()); // 卡号
simCard.setSimCardFactory(SimSupplierEnum.XUN_ZHONG.getCode()); // 1-讯众物联
simCard.setSimCardOperator(zhongSimData.getCarrier_type()); // 运营商类型
simCard.setSimCardStatus(zhongSimData.getNet_status()); // 联网状态
simCard.setName(products.getName()); // 套餐名称
simCard.setExpiredTime(products.getExpiration_time()); // 过期时间
BigDecimal packageCapacity = products.getPackage_capacity(); // 套餐总量mb
simCard.setPackageCapacity(packageCapacity);
if (products.getCurrent_cycle_usage() != null) {
BigDecimal current_cycle_usage = products.getCurrent_cycle_usage(); // 当前已用kb
String currentCycleUsage = SimCardUtils.kb2MbOrGb(current_cycle_usage.intValue());
BigDecimal currentCycleUsageData = new BigDecimal(currentCycleUsage);
simCard.setUsedFlowRate(currentCycleUsageData);
BigDecimal residualData = packageCapacity.subtract(currentCycleUsageData); // 套餐剩余
simCard.setResidualFlowRate(residualData.setScale(2, BigDecimal.ROUND_HALF_UP));
}
resultList.add(simCard);
}
return resultList;
}
public static void main(String[] args) {
// List<String> iccIds = Lists.newArrayList();
// iccIds.add("123");
// iccIds.add(null);
// iccIds.add("0");
// iccIds.add("asdf");
// iccIds.add(null);
// iccIds.add("0");
// iccIds.add(null);
// iccIds.add("0");
// iccIds.add("9461351351");
// iccIds = iccIds.stream()
// .filter(StringUtils::isNotEmpty)
// .filter(x -> !StringUtils.equals(x, "0"))
// .collect(Collectors.toList());
// String iccId = StringUtils.join(iccIds, ",");
// System.out.println(iccId);
String packName = "移动 500M/月";
System.out.println(StringUtils.contains(packName, "移动"));
// StringUtils.containsAny()
}
/**
* 讯众官方接口
* 获取sim卡详细信息
*
* @param iccIds Sim卡集合
* @return
*/
public List<XunZhongSimData> getSimCardDetail(List<String> iccIds) {
String iccId = list2Str(iccIds);
String timestamp = String.valueOf(System.currentTimeMillis() / 1000);
Hashtable<String, Object> params = new Hashtable<>();
params.put("api_id", API_ID);
params.put("timestamp", timestamp);
params.put("iccids", iccId);
String signStr = XunZhongSimUtils.getSignStr(params);
params.put("sign", signStr);
String postResult = XunZhongSimUtils.sendPost(getSimCardDetailURL, params);
logger.info("【====讯众物联====】查询Sim卡信息, param:{}, result:{}", params, postResult);
JSONObject jsonObject = JSONObject.parseObject(postResult);
if (StringUtils.equals(jsonObject.getString("code"), "0")) {
String result = jsonObject.getString("result");
return JSON.parseArray(result, XunZhongSimData.class);
}
return Lists.newArrayList();
}
/**
* 讯众官方接口
* 获取流量池信息
*
* @return
*/
public String getTrafficPoolInfo() {
String timestamp = String.valueOf(System.currentTimeMillis() / 1000);
Hashtable<String, Object> params = new Hashtable<>();
params.put("api_id", API_ID);
params.put("timestamp", timestamp);
String signStr = XunZhongSimUtils.getSignStr(params);
params.put("sign", signStr);
String postResult = XunZhongSimUtils.sendPost(poolListURL, params);
logger.info("【====讯众物联====】获取流量池信息, result:{}", postResult);
return postResult;
}
/**
* 讯众官方接口
* sim卡续期
*
* @param iccIds 需要续期的sim卡
* @param cycleNumber 续费周期0-9990表示无限周期
* @return
*/
public void XunZhongSimRenewal(List<String> iccIds, int cycleNumber) {
if (CollectionUtils.isEmpty(iccIds)) {
throw new BusinessException(ReturnCodeEnum.CODE_PARAM_NOT_NULL_ERROR);
}
String iccId = list2Str(iccIds);
String timestamp = String.valueOf(System.currentTimeMillis() / 1000);
Hashtable<String, Object> params = new Hashtable<>();
params.put("api_id", API_ID);
params.put("timestamp", timestamp);
params.put("iccids", iccId);
params.put("cycle_number", cycleNumber);
String signStr = XunZhongSimUtils.getSignStr(params);
params.put("sign", signStr);
String postResult = XunZhongSimUtils.sendPost(renewURL, params);
logger.info("【====讯众物联====】sim卡续费业务, result:{}", postResult);
JSONObject jsonResult = JSONObject.parseObject(postResult);
String code = jsonResult.getString("code");
if (!StringUtils.equals("0", code)) {
String message = jsonResult.getString("message");
throw new BusinessException(code, message);
}
}
/**
* 物联平台官方接口
*
* 查询卡信息
*
* @param iccIds 卡号集合
* @return 卡信息集合
*/
public List<WuLianSimData> WuLianGetSimInfo(List<String> iccIds) {
ArrayList<WuLianSimData> list = new ArrayList<>();
if (CollectionUtils.isEmpty(iccIds)) {
return list;
}
for (String iccId : iccIds) {
JSONObject param = new JSONObject();
param.put("appid", appId);
param.put("appsecret", appSecret);
param.put("name", getSimInfoName);
param.put("iccid", iccId);
String result = HttpUtils.sendPostContentType(wuLianGetWay, param.toJSONString(), "application/json");
logger.info("【====物联网智能云平台====】查询Sim卡信息, result: {}", result);
JSONObject jsonObject = JSONObject.parseObject(result);
JSONArray dataArray = (JSONArray) jsonObject.get("data");
if (CollectionUtils.isNotEmpty(dataArray)) {
JSONObject data = dataArray.getJSONObject(0);
WuLianSimData wuLianSimData = JSONObject.parseObject(data.toJSONString(), WuLianSimData.class);
list.add(wuLianSimData);
}
}
return list;
}
/**
* 物联平台 内部接口
* 通过iccIds查询物联平台Sim卡信息
*
* @param iccIds
* @return
*/
public List<SimCardVO> WuLianGetSimInfoByIccIds(List<String> iccIds) {
List<SimCardVO> resultList = new ArrayList<>();
List<WuLianSimData> list = WuLianGetSimInfo(iccIds);
SimCardVO vo = null;
for (WuLianSimData wuLianSimData : list) {
String WuLianCardStatus = wuLianSimData.getCardStatus();
// 卡状态不一致,需做对应
String dataBaseCardStatus = SimCardStatusCorrespondEnum.getDataBaseCardStatus(WuLianCardStatus);
BigDecimal packageCanUsage = new BigDecimal(wuLianSimData.getPackageCanUsage()); // 可用流量(MB)
BigDecimal packageHasUsage = new BigDecimal(wuLianSimData.getPackageHasUsage()); // 已用流量(MB)
BigDecimal residualFlowRate = packageCanUsage.subtract(packageHasUsage); // 剩余
// 运营商
String packageName = wuLianSimData.getPackageName();
String operator = "";
if (StringUtils.contains(packageName, "移动")) {
operator = "china_mobile";
} else if (StringUtils.contains(packageName, "电信")) {
operator = "china_telecom";
} else if (StringUtils.contains(packageName, "联通")) {
operator = "china_unicom";
}
//将信息封装到SimCardVO
vo = new SimCardVO();
vo.setIccId(wuLianSimData.getIccId());
vo.setSimCardFactory(SimSupplierEnum.WU_LIAN_INTERNET.getCode()); // 2-物联网智能云平台
vo.setSimCardOperator(operator); // 运营商
vo.setSimCardStatus(dataBaseCardStatus); // 卡状态
vo.setName(packageName); // 套餐名称
vo.setExpiredTime(wuLianSimData.getCardEndTime()); // 卡到期时间
vo.setPackageCapacity(packageCanUsage); // 套餐容量
vo.setUsedFlowRate(packageHasUsage); // 已用流量
vo.setResidualFlowRate(residualFlowRate); // 剩余流量
resultList.add(vo);
}
return resultList;
}
/**
* 物联平台续费接口
*
* @param iccIds
* @param cycleNumber
* @return
*/
public void WuLianSimRenew(List<String> iccIds, int cycleNumber) {
List<WuLianSimRenewVO> resultList = new ArrayList<>();
if (CollectionUtils.isEmpty(iccIds)) {
return;
}
// 先查出卡的信息
List<WuLianSimData> wuLianSimData = WuLianGetSimInfo(iccIds);
for (WuLianSimData data : wuLianSimData) {
JSONObject param = new JSONObject();
param.put("appid", appId);
param.put("appsecret", appSecret);
param.put("name", WuLianSimRenew);
param.put("msisdn", data.getMsisdn());
param.put("packageId", data.getPackageId()); // 套餐id
param.put("outOrderNo", IdUtils.generateTransactionCode(data.getMsisdn())); // 外部业务订单号
param.put("period", cycleNumber); // 续费周期
String result = HttpUtils.sendPostContentType(wuLianGetWay, param.toJSONString(), "application/json");
logger.info("【====物联网智能云平台====】Sim卡续费, result: {}", result);
JSONObject resultJson = JSONObject.parseObject(result);
String resultCode = resultJson.getString("code");
WuLianSimRenewVO vo = null;
if (!StringUtils.equals("0", resultCode)) {
throw new BusinessException(resultCode, resultJson.getString("msg"));
}
}
}
/**
* 将list数组转化为逗号分隔的字符串
*
* @param iccIds
* @return
*/
private String list2Str(List<String> iccIds) {
iccIds = iccIds.stream()
.filter(StringUtils::isNotEmpty)
.filter(x -> !StringUtils.equals(x, "0"))
.collect(Collectors.toList());
// 数组转成逗号分割的字符串
String iccId = StringUtils.join(iccIds, ",");
return iccId;
}
}