package vip.xiaonuo.money.service.impl;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import org.checkerframework.checker.units.qual.A;
import org.springframework.beans.factory.annotation.Autowired;
import vip.xiaonuo.money.entity.MoneyProduce;
import vip.xiaonuo.money.entity.MoneyProduceIncome;
import vip.xiaonuo.money.entity.vo.MoneyProduceScreenVo;
import vip.xiaonuo.money.mapper.MoneyProduceIncomeMapper;
import vip.xiaonuo.money.mapper.MoneyProduceMapper;
import vip.xiaonuo.money.param.MoneyAnalysisParam;
import vip.xiaonuo.money.param.MoneyInOutParam;
import vip.xiaonuo.money.param.MoneyProduceIncomeParam;
import vip.xiaonuo.money.param.MoneyProduceParam;
import vip.xiaonuo.money.service.IMoneyProduceService;
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.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
*
* 财务产品销售收入 服务实现类
*
*
* @author author
* @since 2024-11-19
*/
@Service
public class MoneyProduceServiceImpl extends ServiceImpl implements IMoneyProduceService {
@Autowired
private MoneyProduceMapper produceMapper;
@Autowired
private MoneyProduceIncomeMapper incomeMapper;
@Override
public MoneyProduce analysisIncome(MoneyAnalysisParam analysisParam) {
String orgId = analysisParam.getOrgId();
Integer type = analysisParam.getType();//是否包含关联交易
String time = analysisParam.getTime();//2024-10
QueryWrapper queryWrapper = new QueryWrapper<>();
queryWrapper.eq(StringUtils.isNotBlank(orgId), "org_id", orgId).eq("transaction_type", type);
if ("".equals(time) || null == time) {
DateTime dateTime = DateUtil.beginOfYear(new Date());
queryWrapper.ge("create_time", dateTime);
} else {
String year = time.substring(0, 4);
queryWrapper.between("create_time", year + "-01-01 00:00:00", time + "-31 23:59:59");
}
queryWrapper.select(" IFNULL(sum(nf_cholesterol),'0') nfCholesterol," +
"IFNULL(sum(breed_cholesterol),'0') breedCholesterol," +
"IFNULL(sum(sheep_alcohol),'0') sheepAlcohol," +
"IFNULL(sum(sheep_sour),'0') sheepSour," +
"IFNULL(sum(sheep_sour_bing),'0') sheepSourBing," +
"IFNULL(sum(other),'0') other");
MoneyProduce produce1 = produceMapper.selectOne(queryWrapper);
MoneyProduce produce = new MoneyProduce();
BigDecimal math = new BigDecimal("10000");
BigDecimal bd = new BigDecimal(produce1.getNfCholesterol());
bd = bd.divide(math, 2, RoundingMode.HALF_UP);
BigDecimal bd1 = new BigDecimal(produce1.getBreedCholesterol());
bd1 = bd1.divide(math, 2, RoundingMode.HALF_UP);
BigDecimal bd2 = new BigDecimal(produce1.getSheepAlcohol());
bd2 = bd2.divide(math, 2, RoundingMode.HALF_UP);
BigDecimal bd3 = new BigDecimal(produce1.getSheepSour());
bd3 = bd3.divide(math, 2, RoundingMode.HALF_UP);
BigDecimal bd4 = new BigDecimal(produce1.getSheepSourBing());
bd4 = bd4.divide(math, 2, RoundingMode.HALF_UP);
BigDecimal bd5 = new BigDecimal(produce1.getOther());
bd5 = bd5.divide(math, 2, RoundingMode.HALF_UP);
produce.setNfCholesterol(bd.toString());
produce.setBreedCholesterol(bd1.toString());
produce.setSheepAlcohol(bd2.toString());
produce.setSheepSour(bd3.toString());
produce.setSheepSourBing(bd4.toString());
produce.setOther(bd5.toString());
return produce;
}
@Override
public JSONArray produceAnalysis(MoneyProduceParam moneyProduceParam) {
String orgId = moneyProduceParam.getOrgId();
Integer type = moneyProduceParam.getType();//是否包含关联交易
Integer timeType = moneyProduceParam.getTimeType();
QueryWrapper queryWrapper = new QueryWrapper<>();
queryWrapper.eq(StringUtils.isNotBlank(orgId), "org_id", orgId)
.eq("transaction_type", type);
queryWrapper.select(" IFNULL(sum(nf_cholesterol),0) nfCholesterol,IFNULL(sum(breed_cholesterol),0) breedCholesterol," +
"IFNULL(sum(sheep_alcohol),0) sheepAlcohol,IFNULL(sum(sheep_sour),0) sheepSour," +
"IFNULL(sum(sheep_sour_bing),0) sheepSourBing,IFNULL(sum(other),0) other," +
"DATE_FORMAT(create_time,'%Y-%m-%d') createTime");
if (0 == timeType) {
queryWrapper.groupBy("DATE_FORMAT(create_time,'%Y')").orderByAsc("create_time");
} else {
queryWrapper.groupBy("DATE_FORMAT(create_time,'%Y-%m')").orderByAsc("create_time");
}
List list = produceMapper.selectList(queryWrapper);
JSONArray jsonArray = new JSONArray();
BigDecimal math = new BigDecimal("10000");
for (MoneyProduce produce : list) {
JSONObject jsonObject = new JSONObject();
switch (moneyProduceParam.getPType()) {
case 0:
BigDecimal bg=new BigDecimal(produce.getNfCholesterol());
bg = bg.divide(math, 2, RoundingMode.HALF_UP);
jsonObject.put("value", bg.toString());
jsonObject.put("createTime", produce.getCreateTime());
break;
case 1:
BigDecimal bg1=new BigDecimal(produce.getBreedCholesterol());
bg1 = bg1.divide(math, 2, RoundingMode.HALF_UP);
jsonObject.put("value", bg1.toString());
jsonObject.put("createTime", produce.getCreateTime());
break;
case 2:
BigDecimal bg2=new BigDecimal(produce.getSheepAlcohol());
bg2 = bg2.divide(math, 2, RoundingMode.HALF_UP);
jsonObject.put("value", bg2.toString());
jsonObject.put("createTime", produce.getCreateTime());
break;
case 3:
BigDecimal bg3=new BigDecimal(produce.getSheepSour());
bg3 = bg3.divide(math, 2, RoundingMode.HALF_UP);
jsonObject.put("value", bg3.toString());
jsonObject.put("createTime", produce.getCreateTime());
break;
case 4:
BigDecimal bg4=new BigDecimal(produce.getSheepSourBing());
bg4 = bg4.divide(math, 2, RoundingMode.HALF_UP);
jsonObject.put("value",bg4.toString());
jsonObject.put("createTime", produce.getCreateTime());
break;
case 5:
BigDecimal bg5=new BigDecimal(produce.getOther());
bg5 = bg5.divide(math, 2, RoundingMode.HALF_UP);
jsonObject.put("value", bg5.toString());
jsonObject.put("createTime", produce.getCreateTime());
break;
}
jsonArray.add(jsonObject);
}
return jsonArray;
}
@Override
public JSONObject getInOut(MoneyInOutParam inOutParam) {
String orgId = inOutParam.getOrgId();
QueryWrapper queryWrapper = new QueryWrapper<>();
queryWrapper.eq(StringUtils.isNotBlank(orgId), "org_id", orgId);
queryWrapper.select(" IFNULL(sum(in_money),'0') inMoney,IFNULL(sum(out_money),'0') outMoney");
MoneyProduce moneyProduce = produceMapper.selectOne(queryWrapper);
JSONObject jsonObject = new JSONObject();
BigDecimal math = new BigDecimal("10000");
BigDecimal bg=new BigDecimal(moneyProduce.getInMoney());
bg = bg.divide(math, 2, RoundingMode.HALF_UP);
BigDecimal bg1=new BigDecimal(moneyProduce.getOutMoney());
bg1 = bg1.divide(math, 2, RoundingMode.HALF_UP);
jsonObject.put("in", bg.toString());
jsonObject.put("out", bg1.toString());
return jsonObject;
}
@Override
public JSONArray produceIncomeAnalysis(MoneyProduceIncomeParam moneyProduceParam) {
String orgId = moneyProduceParam.getOrgId();
Integer timeType = moneyProduceParam.getTimeType();
QueryWrapper queryWrapper = new QueryWrapper<>();
queryWrapper.eq(StringUtils.isNotBlank(orgId), "org_id", orgId);
queryWrapper.select(" IFNULL(sum(nf_cholesterol),0) nfCholesterol,IFNULL(sum(breed_cholesterol),0) breedCholesterol," +
"IFNULL(sum(sheep_alcohol),0) sheepAlcohol,IFNULL(sum(sheep_sour),0) sheepSour," +
"IFNULL(sum(sheep_sour_bing),0) sheepSourBing,IFNULL(sum(other),0) other," +
"DATE_FORMAT(create_time,'%Y-%m-%d') createTime");
if (0 == timeType) {
queryWrapper.groupBy("DATE_FORMAT(create_time,'%Y')").orderByAsc("create_time");
} else {
queryWrapper.groupBy("DATE_FORMAT(create_time,'%Y-%m')").orderByAsc("create_time");
}
List list = incomeMapper.selectList(queryWrapper);
JSONArray jsonArray = new JSONArray();
BigDecimal math = new BigDecimal("10000");
for (MoneyProduceIncome produce : list) {
JSONObject jsonObject = new JSONObject();
switch (moneyProduceParam.getPType()) {
case 0:
BigDecimal bd = new BigDecimal(produce.getNfCholesterol());
bd = bd.divide(math, 2, RoundingMode.HALF_UP);
jsonObject.put("value", bd.toString());
jsonObject.put("createTime", produce.getCreateTime());
break;
case 1:
BigDecimal bd1 = new BigDecimal(produce.getBreedCholesterol());
bd1 = bd1.divide(math, 2, RoundingMode.HALF_UP);
jsonObject.put("value", bd1.toString());
jsonObject.put("createTime", produce.getCreateTime());
break;
case 2:
BigDecimal bd2 = new BigDecimal(produce.getSheepAlcohol());
bd2 = bd2.divide(math, 2, RoundingMode.HALF_UP);
jsonObject.put("value", bd2.toString());
jsonObject.put("createTime", produce.getCreateTime());
break;
case 3:
BigDecimal bd3 = new BigDecimal(produce.getSheepSour());
bd3 = bd3.divide(math, 2, RoundingMode.HALF_UP);
jsonObject.put("value",bd3.toString());
jsonObject.put("createTime", produce.getCreateTime());
break;
case 4:
BigDecimal bd4 = new BigDecimal(produce.getSheepSourBing());
bd4 = bd4.divide(math, 2, RoundingMode.HALF_UP);
jsonObject.put("value", bd4.toString());
jsonObject.put("createTime", produce.getCreateTime());
break;
case 5:
BigDecimal bd5 = new BigDecimal(produce.getOther());
bd5 = bd5.divide(math, 2, RoundingMode.HALF_UP);
jsonObject.put("value",bd5.toString());
jsonObject.put("createTime", produce.getCreateTime());
break;
}
jsonArray.add(jsonObject);
}
return jsonArray;
}
@Override
public List getList(MoneyInOutParam inOutParam) {
String orgId = inOutParam.getOrgId();
QueryWrapper queryWrapper = new QueryWrapper<>();
queryWrapper.eq(StringUtils.isNotBlank(orgId), "org_id", orgId);
// queryWrapper.ge("create_time", DateUtil.beginOfYear(new Date()));
queryWrapper.select(" IFNULL(sum(in_money),'0') inMoney,IFNULL(sum(out_money),'0') outMoney,create_time createTime");
queryWrapper.orderByAsc("create_time");
queryWrapper.groupBy("DATE_FORMAT(create_time,'%Y-%m')");
List produces = produceMapper.selectList(queryWrapper);
List list = new ArrayList<>();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
if (produces.size() != 0) {
for (MoneyProduce produce : produces) {
BigDecimal math = new BigDecimal("10000");
BigDecimal bg=new BigDecimal(produce.getInMoney());
BigDecimal bg1=new BigDecimal(produce.getOutMoney());
MoneyProduceScreenVo vo = new MoneyProduceScreenVo();
vo.setCreateTime(sdf.format(produce.getCreateTime()));
vo.setInMoney(bg.divide(math, 2, RoundingMode.HALF_UP).toString());
vo.setOutMoney(bg1.divide(math, 2, RoundingMode.HALF_UP).toString());
list.add(vo);
}
}
return list;
}
}