package vip.xiaonuo.money.service.impl;
import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONException;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.beans.factory.annotation.Autowired;
import vip.xiaonuo.money.entity.MoneyOverdue;
import vip.xiaonuo.money.entity.MoneyWriteOverdue;
import vip.xiaonuo.money.entity.vo.MoneyBorrowUserVo;
import vip.xiaonuo.money.mapper.MoneyOverdueMapper;
import vip.xiaonuo.money.mapper.MoneyWriteOverdueMapper;
import vip.xiaonuo.money.param.MoneyOverdueDetailPageParam;
import vip.xiaonuo.money.param.MoneyOverduePageParam;
import vip.xiaonuo.money.param.MoneyOverdueParam;
import vip.xiaonuo.money.service.IMoneyOverdueService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.*;
/**
*
* 财务应收逾期表 服务实现类
*
*
* @author author
* @since 2024-11-21
*/
@Service
public class MoneyOverdueServiceImpl extends ServiceImpl implements IMoneyOverdueService {
@Autowired
private MoneyOverdueMapper overdueMapper;
@Autowired
private MoneyWriteOverdueMapper writeOverdueMapper;
@Override
public JSONObject getOverdueCount(MoneyOverdueParam overdueParam) {
String orgId = overdueParam.getOrgId();
QueryWrapper queryWrapper = new QueryWrapper<>();
queryWrapper.eq(StringUtils.isNotBlank(orgId), "org_id", orgId);
Date date = new Date();
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.add(Calendar.MONTH, -1);
queryWrapper.ge("end_time", calendar.getTime());
queryWrapper.select("convert(IFNULL(sum(money),'0'),decimal(10,2)) money");
MoneyWriteOverdue writeOverdue = writeOverdueMapper.selectOne(queryWrapper);
JSONObject jsonObject = new JSONObject();
jsonObject.put("money", writeOverdue.getMoney());
return jsonObject;
}
@Override
public JSONObject overdueRank(MoneyOverdueParam overdueParam) {
String orgId = overdueParam.getOrgId();
QueryWrapper queryWrapper = new QueryWrapper<>();
queryWrapper.eq(StringUtils.isNotBlank(orgId), "org_id", orgId);
queryWrapper.select("convert(IFNULL(sum(money),'0'),decimal(10,2)) money,end_time endTime");
List writeOverdues = writeOverdueMapper.selectList(queryWrapper);
double count = 0.00;
double isOverdue = 0.00;
double disOverdue = 0.00;
JSONObject jsonObject = new JSONObject();
DecimalFormat def = new DecimalFormat("0.00");
if (writeOverdues.size() != 0) {
for (MoneyWriteOverdue overdue : writeOverdues) {
if (overdue.getEndTime().before(new Date())) {
isOverdue = isOverdue + Double.valueOf(overdue.getMoney());
}else {
disOverdue = disOverdue + Double.valueOf(overdue.getMoney());
}
count = isOverdue + disOverdue;
}
if (count == 0) {
jsonObject.put("isOverdue", "0");
jsonObject.put("disOverdue", "100");
} else {
jsonObject.put("isOverdue", def.format(isOverdue / count));
jsonObject.put("disOverdue", def.format(disOverdue / count));
}
} else {
jsonObject.put("isOverdue", "0");
jsonObject.put("disOverdue", "100");
}
return jsonObject;
}
@Override
public List userRank(MoneyOverdueParam overdueParam) {
String orgId = overdueParam.getOrgId();
String time = overdueParam.getTime();
List userRank = overdueMapper.getUserRank(time + "-01 00:00:00", time + "-31 23:59:59",orgId);
BigDecimal math = new BigDecimal("10000");
List list = new ArrayList<>();
if (userRank.size() != 0) {
Double collect = 0.00;
Double overdue = 0.00;
for (int i = 0; i < userRank.size(); i++) {
if (i < 15) {
BigDecimal bg = new BigDecimal(userRank.get(i).getCollectPrice());
bg = bg.divide(math, 2, RoundingMode.HALF_UP);
BigDecimal bg1 = new BigDecimal(userRank.get(i).getOverduePrice());
bg1 = bg1.divide(math, 2, RoundingMode.HALF_UP);
userRank.get(i).setCollectPrice(bg.toString());
userRank.get(i).setOverduePrice(bg1.toString());
list.add(userRank.get(i));
} else {
collect = collect + Double.valueOf(userRank.get(i).getCollectPrice());
overdue = overdue + Double.valueOf(userRank.get(i).getOverduePrice());
}
}
MoneyBorrowUserVo vo = new MoneyBorrowUserVo();
vo.setUserName("others");
BigDecimal c1 = new BigDecimal(collect);
c1 = c1.divide(math, 2, RoundingMode.HALF_UP);
BigDecimal c2 = new BigDecimal(overdue);
c2 = c2.divide(math, 2, RoundingMode.HALF_UP);
vo.setCollectPrice(c1.toString());
vo.setOverduePrice(c2.toString());
list.add(vo);
}
return list;
}
@Override
public Page overdueDetail(MoneyOverdueDetailPageParam overduePageParam) {
String orgId = overduePageParam.getOrgId();
Integer pageNum = overduePageParam.getPageNum();
Integer pageSize = overduePageParam.getPageSize();
Integer type = overduePageParam.getType();
String userName = overduePageParam.getUserName();
QueryWrapper queryWrapper = new QueryWrapper<>();
queryWrapper.eq(StringUtils.isNotBlank(orgId), "org_id", orgId).orderByDesc("create_time");
queryWrapper.eq(StringUtils.isNotBlank(userName), "user_name", userName);
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.DAY_OF_MONTH, 15);
if (0 == type) {
queryWrapper.ge("end_time", calendar.getTime());
} else if (1 == type) {
queryWrapper.le("end_time",DateUtil.beginOfDay(new Date()));
} else if (2 == type) {
queryWrapper.between("end_time", DateUtil.beginOfDay(new Date()), calendar.getTime());
}
Page page = new Page<>(pageNum, pageSize);
Page selectPage = writeOverdueMapper.selectPage(page, queryWrapper);
return selectPage;
}
@Override
public List listUserName(Map paramsMap) {
String orgId = paramsMap.get("orgId");
QueryWrapper queryWrapper = new QueryWrapper<>();
queryWrapper.eq(StringUtils.isNotBlank(orgId), "org_id", orgId);
queryWrapper.groupBy("user_name");
return overdueMapper.selectList(queryWrapper);
}
/*数组排序*/
public static JSONArray jsonArraySort(JSONArray jsonArr, String sortKey, boolean is_desc) {
//存放排序结果json数组
JSONArray sortedJsonArray = new JSONArray();
//用于排序的list
List jsonValues = new ArrayList();
//将参数json数组每一项取出,放入list
for (int i = 0; i < jsonArr.size(); i++) {
jsonValues.add(jsonArr.getJSONObject(i));
}
//快速排序,重写compare方法,完成按指定字段比较,完成排序
Collections.sort(jsonValues, new Comparator() {
//排序字段
private final String KEY_NAME = sortKey;
//重写compare方法
@Override
public int compare(JSONObject a, JSONObject b) {
//如果用String接会导致一位数和两位数混合比对的时候不能准确比出来,要用int类型接
//String valA = new String();
//String valB = new String();
Float valA = 0.00f;
Float valB = 0.00f;
try {
valA = Float.parseFloat(a.getString(KEY_NAME));
valB = Float.parseFloat(b.getString(KEY_NAME));
} catch (JSONException e) {
e.printStackTrace();
}
//是升序还是降序
if (is_desc) {
return -valA.compareTo(valB);
} else {
return -valB.compareTo(valA);
}
}
});
//将排序后结果放入结果jsonArray
for (int i = 0; i < jsonArr.size(); i++) {
sortedJsonArray.add(jsonValues.get(i));
}
return sortedJsonArray;
}
}