Browse Source

统计

ptos
zhizhi wu 4 years ago
parent
commit
2270ded188
  1. 28
      src/main/java/com/ccsens/ptccsens/api/finance/FinanceController.java
  2. 24
      src/main/java/com/ccsens/ptccsens/bean/dto/FinanceDto.java
  3. 44
      src/main/java/com/ccsens/ptccsens/bean/vo/FinanceVo.java
  4. 23
      src/main/java/com/ccsens/ptccsens/persist/dao/FinanceDao.java
  5. 76
      src/main/java/com/ccsens/ptccsens/service/FinanceService.java
  6. 24
      src/main/java/com/ccsens/ptccsens/service/IFinanceService.java
  7. 69
      src/main/resources/mapper_dao/FinanceDao.xml

28
src/main/java/com/ccsens/ptccsens/api/finance/FinanceController.java

@ -88,4 +88,32 @@ public class FinanceController {
log.info("查看当前用户的费用申请历史信息(奖金)结束:{}", history);
return JsonResponse.newInstance().ok(history);
}
@MustLogin
@ApiOperation(value = "成员财务图", notes = "")
@RequestMapping(value = "/memberFinance", method = RequestMethod.POST, produces = {"application/json;charset=UTF-8"})
public JsonResponse<FinanceVo.MemberFinance> memberFinance(@ApiParam @Validated @RequestBody QueryDto<FinanceDto.MemberFinance> params) {
log.info("成员财务图:{}",params);
List<FinanceVo.MemberFinance> memberFinances = financeService.queryMemberFinance(params.getParam(), params.getUserId());
log.info("成员财务图结束:{}", memberFinances);
return JsonResponse.newInstance().ok(memberFinances);
}
@MustLogin
@ApiOperation(value = "任务支出图", notes = "")
@RequestMapping(value = "/taskExpense", method = RequestMethod.POST, produces = {"application/json;charset=UTF-8"})
public JsonResponse<FinanceVo.TaskExpense> taskExpense(@ApiParam @Validated @RequestBody QueryDto<FinanceDto.TaskExpense> params) {
log.info("任务支出图:{}",params);
List<FinanceVo.TaskExpense> taskExpenses = financeService.queryTaskExpense(params.getParam(), params.getUserId());
log.info("任务支出图结束:{}", taskExpenses);
return JsonResponse.newInstance().ok(taskExpenses);
}
@MustLogin
@ApiOperation(value = "名目支出统计", notes = "")
@RequestMapping(value = "/rowExpense", method = RequestMethod.POST, produces = {"application/json;charset=UTF-8"})
public JsonResponse<FinanceVo.RowExpense> rowExpense(@ApiParam @Validated @RequestBody QueryDto<FinanceDto.RowExpense> params) {
log.info("名目支出统计:{}",params);
List<FinanceVo.RowExpense> RowExpense = financeService.queryRowExpense(params.getParam(), params.getUserId());
log.info("名目支出统计结束:{}", RowExpense);
return JsonResponse.newInstance().ok(RowExpense);
}
}

24
src/main/java/com/ccsens/ptccsens/bean/dto/FinanceDto.java

@ -42,6 +42,7 @@ public class FinanceDto {
@NotNull
@ApiModelProperty("所属部门")
private String department;
@NotNull
@ApiModelProperty("所属项目id")
private Long projectId;
@ApiModelProperty("所属任务id")
@ -135,4 +136,27 @@ public class FinanceDto {
@ApiModelProperty("每页的数量,默认10,最大100")
private int pageSize = 10;
}
@Data
@ApiModel("财务-成员财务-请求")
public static class MemberFinance {
@NotNull
@ApiModelProperty("所属项目id")
private Long projectId;
}
@Data
@ApiModel("财务-任务支出-请求")
public static class TaskExpense {
@NotNull
@ApiModelProperty("所属项目id")
private Long projectId;
}
@Data
@ApiModel("财务-名目支出-请求")
public static class RowExpense {
@NotNull
@ApiModelProperty("所属项目id")
private Long projectId;
}
}

44
src/main/java/com/ccsens/ptccsens/bean/vo/FinanceVo.java

@ -4,6 +4,7 @@ import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.util.List;
/**
@ -86,6 +87,8 @@ public class FinanceVo {
private String remark;
@ApiModelProperty("总金额")
private Long money;
@ApiModelProperty("申请时间")
private Long applyTime;
@ApiModelProperty("发票信息")
private List<Invoice> invoiceList;
@ApiModelProperty("审核人ID")
@ -142,5 +145,46 @@ public class FinanceVo {
private Long submitTime;
@ApiModelProperty("当前状态:0待审批 1已通过 2已驳回 3待放款 4:放款待确认 5已确认")
private byte applyType;
@ApiModelProperty("备注")
private String remark;
}
@Data
@ApiModel("财务-成员财务统计-返回")
public static class MemberFinance{
@ApiModelProperty("成员ID")
private Long memberId;
@ApiModelProperty("成员名")
private String memberName;
@ApiModelProperty("金额,单位:分")
private Long money;
@ApiModelProperty("占比,保留两位小数")
private BigDecimal percentage;
}
@Data
@ApiModel("财务-任务支出-返回")
public static class TaskExpense {
@ApiModelProperty("任务ID")
private Long taskDetailId;
@ApiModelProperty("任务名")
private String taskName;
@ApiModelProperty("金额,单位:分")
private Long money;
@ApiModelProperty("占比,保留两位小数")
private BigDecimal percentage;
}
@Data
@ApiModel("财务-名目支出-返回")
public static class RowExpense {
@ApiModelProperty("名目ID")
private Long rowId;
@ApiModelProperty("名目")
private String rowName;
@ApiModelProperty("金额,单位:分")
private Long money;
@ApiModelProperty("占比,保留两位小数")
private BigDecimal percentage;
}
}

23
src/main/java/com/ccsens/ptccsens/persist/dao/FinanceDao.java

@ -82,4 +82,27 @@ public interface FinanceDao {
* @return 历史数据
*/
List<FinanceVo.PersonalHistory> queryPersonalHistory(@Param("param") FinanceDto.PersonalHistory param, @Param("userId") Long userId);
/**
* 查询成员财务信息
* @param projectId 项目ID
* @param userId 操作者
* @return 成员财务
*/
List<FinanceVo.MemberFinance> queryMemberFinance(@Param("projectId") Long projectId, @Param("userId") Long userId);
/**
* 查询任务支出信息
* @param projectId 项目ID
* @param userId 操作者
* @return 任务支出信息
*/
List<FinanceVo.TaskExpense> queryTaskExpense(@Param("projectId") Long projectId, @Param("userId") Long userId);
/**
* 查询名目支出信息
* @param projectId 项目ID
* @param userId 操作者
* @return 名目支出信息
*/
List<FinanceVo.RowExpense> queryRowExpense(@Param("projectId") Long projectId, @Param("userId") Long userId);
}

76
src/main/java/com/ccsens/ptccsens/service/FinanceService.java

@ -2,6 +2,7 @@ package com.ccsens.ptccsens.service;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.lang.Snowflake;
import com.alibaba.fastjson.JSONArray;
import com.ccsens.ptccsens.bean.dto.FinanceDto;
import com.ccsens.ptccsens.bean.po.*;
import com.ccsens.ptccsens.bean.vo.FinanceVo;
@ -19,6 +20,7 @@ import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
@ -88,15 +90,20 @@ public class FinanceService implements IFinanceService {
if (CollectionUtil.isEmpty(proMembers)) {
throw new BaseException(BasicsCodeError.NOT_MEMBER_SHEET);
}
// 查找对应的预算信息
PluFinanceExample financeExample = new PluFinanceExample();
financeExample.createCriteria().andTaskIdEqualTo(param.getTaskDetailId());
financeExample.setOrderByClause("id desc limit 1");
List<PluFinance> pluFinances = pluFinanceMapper.selectByExample(financeExample);
log.info("财务预算信息:{}", pluFinances);
if (CollectionUtil.isEmpty(pluFinances)) {
throw new BaseException(BasicsCodeError.FINANCE_NOT_FOUND);
PluFinance pluFinance = null;
if (param.getTaskDetailId() != null && param.getTaskDetailId() != 0) {
// 查找对应的预算信息
PluFinanceExample financeExample = new PluFinanceExample();
financeExample.createCriteria().andTaskIdEqualTo(param.getTaskDetailId());
financeExample.setOrderByClause("id desc limit 1");
List<PluFinance> pluFinances = pluFinanceMapper.selectByExample(financeExample);
log.info("财务预算信息:{}", pluFinances);
if (CollectionUtil.isEmpty(pluFinances)) {
throw new BaseException(BasicsCodeError.FINANCE_NOT_FOUND);
}
pluFinance = pluFinances.get(0);
}
// 计算总金额和发票金额是否一致
if (CollectionUtil.isNotEmpty(param.getInvoiceList())) {
long invoiceTotal = 0L;
@ -113,7 +120,7 @@ public class FinanceService implements IFinanceService {
apply.setId(snowflake.nextId());
apply.setMemberId(proMembers.get(0).getId());
apply.setTaskId(param.getTaskDetailId());
apply.setFinanceId(pluFinances.get(0).getId());
apply.setFinanceId(pluFinance == null ? 0 : pluFinance.getId());
apply.setApplyTime(System.currentTimeMillis());
apply.setInvoice(CollectionUtil.isEmpty(param.getInvoiceList()) ? BasicsConstant.Finance.INVOICE_UPLOAD_NO : BasicsConstant.Finance.INVOICE_UPLOAD_YES);
pluFinanceApplyMapper.insertSelective(apply);
@ -208,4 +215,55 @@ public class FinanceService implements IFinanceService {
List<FinanceVo.PersonalHistory> list = financeDao.queryPersonalHistory(param, userId);
return new PageInfo<>(list);
}
@Override
public List<FinanceVo.MemberFinance> queryMemberFinance(FinanceDto.MemberFinance param, Long userId) {
List<FinanceVo.MemberFinance> memberFinances = financeDao.queryMemberFinance(param.getProjectId(), userId);
if (CollectionUtil.isEmpty(memberFinances)) {
return memberFinances;
}
long total = 0;
for (FinanceVo.MemberFinance memberFinance: memberFinances) {
total += memberFinance.getMoney();
}
long finalTotal = total;
memberFinances.forEach(memberFinance -> {
// BigDecimal.ROUND_HALF_DOWN:五舍六入,ROUND_HALF_UP:四舍五入,为避免超过100%,选择了五舍六入
memberFinance.setPercentage(new BigDecimal(memberFinance.getMoney()*100.0/ finalTotal).setScale(2, BigDecimal.ROUND_HALF_DOWN));
});
return memberFinances;
}
@Override
public List<FinanceVo.TaskExpense> queryTaskExpense(FinanceDto.TaskExpense param, Long userId) {
List<FinanceVo.TaskExpense> taskExpenses = financeDao.queryTaskExpense(param.getProjectId(), userId);
long total = 0;
for (FinanceVo.TaskExpense taskExpense: taskExpenses) {
total += taskExpense.getMoney();
}
long finalTotal = total;
taskExpenses.forEach(taskExpense -> {
// BigDecimal.ROUND_HALF_DOWN:五舍六入,ROUND_HALF_UP:四舍五入,为避免超过100%,选择了五舍六入
taskExpense.setPercentage(new BigDecimal(taskExpense.getMoney()*100.0/ finalTotal).setScale(2, BigDecimal.ROUND_HALF_DOWN));
});
return taskExpenses;
}
@Override
public List<FinanceVo.RowExpense> queryRowExpense(FinanceDto.RowExpense param, Long userId) {
List<FinanceVo.RowExpense> rowExpenses = financeDao.queryRowExpense(param.getProjectId(), userId);
long total = 0;
for (FinanceVo.RowExpense rowExpense: rowExpenses) {
total += rowExpense.getMoney();
}
long finalTotal = total;
rowExpenses.forEach(rowExpense -> {
// BigDecimal.ROUND_HALF_DOWN:五舍六入,ROUND_HALF_UP:四舍五入,为避免超过100%,选择了五舍六入
rowExpense.setPercentage(new BigDecimal(rowExpense.getMoney()*100.0/ finalTotal).setScale(2, BigDecimal.ROUND_HALF_DOWN));
});
return rowExpenses;
}
}

24
src/main/java/com/ccsens/ptccsens/service/IFinanceService.java

@ -55,4 +55,28 @@ public interface IFinanceService {
* @return 历史信息
*/
PageInfo<FinanceVo.PersonalHistory> queryPersonalHistory(FinanceDto.PersonalHistory param, Long userId);
/**
* 查询项目成员申请财务图
* @param param 项目
* @param userId 操作人信息
* @return 成员财务图
*/
List<FinanceVo.MemberFinance> queryMemberFinance(FinanceDto.MemberFinance param, Long userId);
/**
* 查询任务支出
* @param param 项目
* @param userId 操作人信息
* @return 任务支出
*/
List<FinanceVo.TaskExpense> queryTaskExpense(FinanceDto.TaskExpense param, Long userId);
/**
* 名目支出统计
* @param param 项目
* @param userId 操作人信息
* @return 名目支出
*/
List<FinanceVo.RowExpense> queryRowExpense(FinanceDto.RowExpense param, Long userId);
}

69
src/main/resources/mapper_dao/FinanceDao.xml

@ -48,7 +48,8 @@
a.row_id AS rowId,
t3.NAME AS rowName,
a.remark,
a.money
a.money,
a.apply_time as applyTime
FROM
t_plu_finance_apply a
left join t_pro_task_detail p on a.project_id = p.id AND p.rec_status = 0
@ -121,7 +122,8 @@
a.submit_name as submitName,
a.money as money,
a.apply_time as submitTime,
a.apply_type as applyType
a.apply_type as applyType,
a.remark
FROM
t_plu_finance_apply a
LEFT JOIN t_pro_task_detail d ON a.task_id = d.id
@ -148,4 +150,67 @@
</choose>
AND a.rec_status = 0
</select>
<select id="queryMemberFinance" resultType="com.ccsens.ptccsens.bean.vo.FinanceVo$MemberFinance">
SELECT
a.member_id AS memberId,
m.NAME AS memberName,
sum( a.money ) AS money
FROM
t_plu_finance_apply a,
t_pro_member m
WHERE
a.member_id = m.id
AND a.project_id = #{projectId}
AND a.apply_type NOT IN ( 0, 2 )
AND a.rec_status = 0
AND m.rec_status = 0
GROUP BY
a.member_id
</select>
<select id="queryTaskExpense" resultType="com.ccsens.ptccsens.bean.vo.FinanceVo$TaskExpense">
SELECT
a.task_id AS taskDetailId,
if (d.id is null , "其他", d.NAME) AS taskName,
sum( a.money ) AS money
FROM
t_plu_finance_apply a
left join t_pro_task_detail d on a.task_id = d.id and d.rec_status = 0
WHERE
a.project_id = 2
AND a.apply_type NOT IN ( 0, 2 )
AND a.rec_status = 0
GROUP BY
a.task_id
</select>
<select id="queryRowExpense" resultType="com.ccsens.ptccsens.bean.vo.FinanceVo$RowExpense">
SELECT
a.row_id AS rowId,
t.NAME AS rowName,
sum( a.money ) AS money
FROM
(
SELECT
id,
CASE
WHEN row_id != 0 THEN
row_id
WHEN category_id != 0 THEN
category_id ELSE type_id
END AS row_id,
money
FROM
t_plu_finance_apply
WHERE
project_id = #{projectId}
AND apply_type NOT IN ( 0, 2 )
AND rec_status = 0
) a,
t_plu_finance_type t
WHERE
a.row_id = t.id
AND t.rec_status = 0
GROUP BY
a.row_id
</select>
</mapper>
Loading…
Cancel
Save