From e462d7cba4268ec47038aa0ba41cc7f9d6677e34 Mon Sep 17 00:00:00 2001 From: lucky Date: Wed, 26 Jan 2022 11:52:29 +0800 Subject: [PATCH 1/7] =?UTF-8?q?=E6=97=B6=E9=97=B4=E8=B4=A2=E5=8A=A1?= =?UTF-8?q?=E5=9B=BE=E7=BB=9F=E8=AE=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/ProjectFinanceController.java | 10 +++++ .../ptccsens/bean/dto/ProjectFinanceDto.java | 8 ++++ .../ptccsens/bean/vo/ProjectFinanceVo.java | 19 +++++++++ .../persist/dao/PluFinanceApplyDao.java | 7 ++++ .../service/IProjectFinanceService.java | 10 +++++ .../service/ProjectFinanceService.java | 5 +++ .../mapper_dao/PluFinanceApplyDao.xml | 40 +++++++++++++++++++ 7 files changed, 99 insertions(+) diff --git a/src/main/java/com/ccsens/ptccsens/api/ProjectFinanceController.java b/src/main/java/com/ccsens/ptccsens/api/ProjectFinanceController.java index 047cb7f..bf48a89 100644 --- a/src/main/java/com/ccsens/ptccsens/api/ProjectFinanceController.java +++ b/src/main/java/com/ccsens/ptccsens/api/ProjectFinanceController.java @@ -93,4 +93,14 @@ public class ProjectFinanceController { log.info("查看所有的费用申请结束:{}",financeOfProjectList); return JsonResponse.newInstance().ok(financeOfProjectList); } + + @MustLogin + @ApiOperation(value = "时间财务图-统计", notes = "") + @RequestMapping(value = "/timeFinancialChart", method = RequestMethod.POST, produces = {"application/json;charset=UTF-8"}) + public JsonResponse> timeFinancialChart(@ApiParam @Validated @RequestBody QueryDto params) throws Exception{ + log.info("查看所有的费用申请开始{}",params); + List timeFinancialChart = projectFinanceService.timeFinancialChart(params.getParam(),params.getUserId()); + log.info("查看所有的费用申请结束:{}",timeFinancialChart); + return JsonResponse.newInstance().ok(timeFinancialChart); + } } diff --git a/src/main/java/com/ccsens/ptccsens/bean/dto/ProjectFinanceDto.java b/src/main/java/com/ccsens/ptccsens/bean/dto/ProjectFinanceDto.java index c890841..713ad7b 100644 --- a/src/main/java/com/ccsens/ptccsens/bean/dto/ProjectFinanceDto.java +++ b/src/main/java/com/ccsens/ptccsens/bean/dto/ProjectFinanceDto.java @@ -93,4 +93,12 @@ public class ProjectFinanceDto { @ApiModelProperty("每页的数量") private Integer pageSize = 10; } + + @Data + @ApiModel("时间财务图-入参") + public static class TimeFinancialChart { + @NotNull + @ApiModelProperty("项目id") + private Long projectId; + } } diff --git a/src/main/java/com/ccsens/ptccsens/bean/vo/ProjectFinanceVo.java b/src/main/java/com/ccsens/ptccsens/bean/vo/ProjectFinanceVo.java index 0e637e9..a2d962e 100644 --- a/src/main/java/com/ccsens/ptccsens/bean/vo/ProjectFinanceVo.java +++ b/src/main/java/com/ccsens/ptccsens/bean/vo/ProjectFinanceVo.java @@ -4,6 +4,7 @@ import com.github.pagehelper.PageInfo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import org.apache.poi.ss.usermodel.charts.ChartData; import java.util.List; @@ -131,4 +132,22 @@ public class ProjectFinanceVo { @ApiModelProperty("类目名") private String categoryName; } + + @Data + @ApiModel("时间财务图-返参") + public static class TimeFinancialChart { + @ApiModelProperty("时间") + private String time; + @ApiModelProperty("数据") + private List data; + } + @Data + @ApiModel("时间财务图-具体数据") + public static class ChartData { + @ApiModelProperty("任务名称") + private String name; + @ApiModelProperty("支出") + private Long expend; + } + } diff --git a/src/main/java/com/ccsens/ptccsens/persist/dao/PluFinanceApplyDao.java b/src/main/java/com/ccsens/ptccsens/persist/dao/PluFinanceApplyDao.java index d61d8eb..1444d90 100644 --- a/src/main/java/com/ccsens/ptccsens/persist/dao/PluFinanceApplyDao.java +++ b/src/main/java/com/ccsens/ptccsens/persist/dao/PluFinanceApplyDao.java @@ -36,4 +36,11 @@ public interface PluFinanceApplyDao extends PluFinanceMapper { * @return 所有的费用申请 */ List queryAllMoneyApply(@Param("projectId") Long projectId); + + /** + * 时间财务图-统计 + * @param projectId 项目id + * @return 时间财务图 + */ + List timeFinancialChart(@Param("projectId") Long projectId); } diff --git a/src/main/java/com/ccsens/ptccsens/service/IProjectFinanceService.java b/src/main/java/com/ccsens/ptccsens/service/IProjectFinanceService.java index e39835b..dc9c3b1 100644 --- a/src/main/java/com/ccsens/ptccsens/service/IProjectFinanceService.java +++ b/src/main/java/com/ccsens/ptccsens/service/IProjectFinanceService.java @@ -5,6 +5,8 @@ import com.ccsens.ptccsens.bean.vo.ProjectFinanceVo; import com.github.pagehelper.Page; import com.github.pagehelper.PageInfo; +import java.util.List; + /** * @author AUSU */ @@ -54,4 +56,12 @@ public interface IProjectFinanceService { * @return 项目下所有的费用申请 */ PageInfo queryAllMoneyApply(ProjectFinanceDto.QueryAllMoneyApply param, Long userId); + + /** + * 时间财务图-统计 + * @param param 入参 + * @param userId 用户id + * @return 时间财务图 + */ + List timeFinancialChart(ProjectFinanceDto.TimeFinancialChart param, Long userId); } diff --git a/src/main/java/com/ccsens/ptccsens/service/ProjectFinanceService.java b/src/main/java/com/ccsens/ptccsens/service/ProjectFinanceService.java index 94429aa..835b3db 100644 --- a/src/main/java/com/ccsens/ptccsens/service/ProjectFinanceService.java +++ b/src/main/java/com/ccsens/ptccsens/service/ProjectFinanceService.java @@ -203,4 +203,9 @@ public class ProjectFinanceService implements IProjectFinanceService{ return new PageInfo<>(allMoneyApplyList); } + + @Override + public List timeFinancialChart(ProjectFinanceDto.TimeFinancialChart param, Long userId) { + return pluFinanceApplyDao.timeFinancialChart(param.getProjectId()); + } } diff --git a/src/main/resources/mapper_dao/PluFinanceApplyDao.xml b/src/main/resources/mapper_dao/PluFinanceApplyDao.xml index 48e3958..20939b5 100644 --- a/src/main/resources/mapper_dao/PluFinanceApplyDao.xml +++ b/src/main/resources/mapper_dao/PluFinanceApplyDao.xml @@ -101,5 +101,45 @@ AND ft2.rec_status = 0 + + + + + + + + + \ No newline at end of file From 2270ded188ba528d0d8034af14b785a10966ddf3 Mon Sep 17 00:00:00 2001 From: zhizhi wu <2377881365@qq.com> Date: Wed, 26 Jan 2022 12:09:03 +0800 Subject: [PATCH 2/7] =?UTF-8?q?=E7=BB=9F=E8=AE=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/finance/FinanceController.java | 28 +++++++ .../ccsens/ptccsens/bean/dto/FinanceDto.java | 24 ++++++ .../ccsens/ptccsens/bean/vo/FinanceVo.java | 44 +++++++++++ .../ptccsens/persist/dao/FinanceDao.java | 23 ++++++ .../ptccsens/service/FinanceService.java | 76 ++++++++++++++++--- .../ptccsens/service/IFinanceService.java | 24 ++++++ src/main/resources/mapper_dao/FinanceDao.xml | 69 ++++++++++++++++- 7 files changed, 277 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/ccsens/ptccsens/api/finance/FinanceController.java b/src/main/java/com/ccsens/ptccsens/api/finance/FinanceController.java index 8c15c0d..505c417 100644 --- a/src/main/java/com/ccsens/ptccsens/api/finance/FinanceController.java +++ b/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 memberFinance(@ApiParam @Validated @RequestBody QueryDto params) { + log.info("成员财务图:{}",params); + List 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 taskExpense(@ApiParam @Validated @RequestBody QueryDto params) { + log.info("任务支出图:{}",params); + List 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 rowExpense(@ApiParam @Validated @RequestBody QueryDto params) { + log.info("名目支出统计:{}",params); + List RowExpense = financeService.queryRowExpense(params.getParam(), params.getUserId()); + log.info("名目支出统计结束:{}", RowExpense); + return JsonResponse.newInstance().ok(RowExpense); + } } diff --git a/src/main/java/com/ccsens/ptccsens/bean/dto/FinanceDto.java b/src/main/java/com/ccsens/ptccsens/bean/dto/FinanceDto.java index 84f9850..8eadf13 100644 --- a/src/main/java/com/ccsens/ptccsens/bean/dto/FinanceDto.java +++ b/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; + } } diff --git a/src/main/java/com/ccsens/ptccsens/bean/vo/FinanceVo.java b/src/main/java/com/ccsens/ptccsens/bean/vo/FinanceVo.java index 67b26e6..f3231b2 100644 --- a/src/main/java/com/ccsens/ptccsens/bean/vo/FinanceVo.java +++ b/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 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; } } diff --git a/src/main/java/com/ccsens/ptccsens/persist/dao/FinanceDao.java b/src/main/java/com/ccsens/ptccsens/persist/dao/FinanceDao.java index 1941197..41032f5 100644 --- a/src/main/java/com/ccsens/ptccsens/persist/dao/FinanceDao.java +++ b/src/main/java/com/ccsens/ptccsens/persist/dao/FinanceDao.java @@ -82,4 +82,27 @@ public interface FinanceDao { * @return 历史数据 */ List queryPersonalHistory(@Param("param") FinanceDto.PersonalHistory param, @Param("userId") Long userId); + + /** + * 查询成员财务信息 + * @param projectId 项目ID + * @param userId 操作者 + * @return 成员财务 + */ + List queryMemberFinance(@Param("projectId") Long projectId, @Param("userId") Long userId); + + /** + * 查询任务支出信息 + * @param projectId 项目ID + * @param userId 操作者 + * @return 任务支出信息 + */ + List queryTaskExpense(@Param("projectId") Long projectId, @Param("userId") Long userId); + /** + * 查询名目支出信息 + * @param projectId 项目ID + * @param userId 操作者 + * @return 名目支出信息 + */ + List queryRowExpense(@Param("projectId") Long projectId, @Param("userId") Long userId); } diff --git a/src/main/java/com/ccsens/ptccsens/service/FinanceService.java b/src/main/java/com/ccsens/ptccsens/service/FinanceService.java index 97b0e4b..1be4980 100644 --- a/src/main/java/com/ccsens/ptccsens/service/FinanceService.java +++ b/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 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 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 list = financeDao.queryPersonalHistory(param, userId); return new PageInfo<>(list); } + + @Override + public List queryMemberFinance(FinanceDto.MemberFinance param, Long userId) { + + List 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 queryTaskExpense(FinanceDto.TaskExpense param, Long userId) { + List 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 queryRowExpense(FinanceDto.RowExpense param, Long userId) { + List 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; + } + + } diff --git a/src/main/java/com/ccsens/ptccsens/service/IFinanceService.java b/src/main/java/com/ccsens/ptccsens/service/IFinanceService.java index 196a3e1..e3b5c2c 100644 --- a/src/main/java/com/ccsens/ptccsens/service/IFinanceService.java +++ b/src/main/java/com/ccsens/ptccsens/service/IFinanceService.java @@ -55,4 +55,28 @@ public interface IFinanceService { * @return 历史信息 */ PageInfo queryPersonalHistory(FinanceDto.PersonalHistory param, Long userId); + + /** + * 查询项目成员申请财务图 + * @param param 项目 + * @param userId 操作人信息 + * @return 成员财务图 + */ + List queryMemberFinance(FinanceDto.MemberFinance param, Long userId); + + /** + * 查询任务支出 + * @param param 项目 + * @param userId 操作人信息 + * @return 任务支出 + */ + List queryTaskExpense(FinanceDto.TaskExpense param, Long userId); + + /** + * 名目支出统计 + * @param param 项目 + * @param userId 操作人信息 + * @return 名目支出 + */ + List queryRowExpense(FinanceDto.RowExpense param, Long userId); } diff --git a/src/main/resources/mapper_dao/FinanceDao.xml b/src/main/resources/mapper_dao/FinanceDao.xml index da696bb..8c7699d 100644 --- a/src/main/resources/mapper_dao/FinanceDao.xml +++ b/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 @@ AND a.rec_status = 0 + + + \ No newline at end of file From ecd5162ad01927db5028789adb616035fd47d9ae Mon Sep 17 00:00:00 2001 From: zhizhi wu <2377881365@qq.com> Date: Wed, 26 Jan 2022 14:38:25 +0800 Subject: [PATCH 3/7] =?UTF-8?q?=E8=B4=A2=E5=8A=A1=E6=9D=A1=E4=B8=8D?= =?UTF-8?q?=E5=BF=85=E7=99=BB=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/ccsens/ptccsens/api/finance/FinanceController.java | 4 ++-- src/main/java/com/ccsens/ptccsens/service/FinanceService.java | 2 +- .../java/com/ccsens/ptccsens/service/IFinanceService.java | 3 +-- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/ccsens/ptccsens/api/finance/FinanceController.java b/src/main/java/com/ccsens/ptccsens/api/finance/FinanceController.java index 505c417..14489f6 100644 --- a/src/main/java/com/ccsens/ptccsens/api/finance/FinanceController.java +++ b/src/main/java/com/ccsens/ptccsens/api/finance/FinanceController.java @@ -34,12 +34,12 @@ public class FinanceController { @Resource private IFinanceService financeService; - @MustLogin + @ApiOperation(value = "通过任务id查看任务关联的财务信息", notes = "") @RequestMapping(value = "/getByTask", method = RequestMethod.POST, produces = {"application/json;charset=UTF-8"}) public JsonResponse getByTask(@ApiParam @Validated @RequestBody QueryDto params) { log.info("通过任务id查看任务关联的财务信息:{}",params); - FinanceVo.FinanceItem item = financeService.getByTask(params.getParam(), params.getUserId()); + FinanceVo.FinanceItem item = financeService.getByTask(params.getParam()); log.info("通过任务id查看任务关联的财务信息结束:{}", item); return JsonResponse.newInstance().ok(item); } diff --git a/src/main/java/com/ccsens/ptccsens/service/FinanceService.java b/src/main/java/com/ccsens/ptccsens/service/FinanceService.java index 1be4980..c839357 100644 --- a/src/main/java/com/ccsens/ptccsens/service/FinanceService.java +++ b/src/main/java/com/ccsens/ptccsens/service/FinanceService.java @@ -51,7 +51,7 @@ public class FinanceService implements IFinanceService { @Override - public FinanceVo.FinanceItem getByTask(FinanceDto.TaskId param, Long userId) { + public FinanceVo.FinanceItem getByTask(FinanceDto.TaskId param) { FinanceVo.FinancePrepare prepare = financeDao.getPrepareByTaskId(param.getTaskDetailId()); List expenses = financeDao.getExpenseByTaskId(param.getTaskDetailId()); final FinanceVo.FinanceItem item = new FinanceVo.FinanceItem(); diff --git a/src/main/java/com/ccsens/ptccsens/service/IFinanceService.java b/src/main/java/com/ccsens/ptccsens/service/IFinanceService.java index e3b5c2c..049f4fe 100644 --- a/src/main/java/com/ccsens/ptccsens/service/IFinanceService.java +++ b/src/main/java/com/ccsens/ptccsens/service/IFinanceService.java @@ -13,10 +13,9 @@ public interface IFinanceService { /** * 根据任务ID查询 * @param param 任务ID - * @param userId 操作人ID * @return 财务条 */ - FinanceVo.FinanceItem getByTask(FinanceDto.TaskId param, Long userId); + FinanceVo.FinanceItem getByTask(FinanceDto.TaskId param,); /** * 查询费用申请类型 From 8c2db20e4af2ebf18328415d036567882d2ba367 Mon Sep 17 00:00:00 2001 From: zhizhi wu <2377881365@qq.com> Date: Wed, 26 Jan 2022 14:39:19 +0800 Subject: [PATCH 4/7] bug --- src/main/java/com/ccsens/ptccsens/service/IFinanceService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/ccsens/ptccsens/service/IFinanceService.java b/src/main/java/com/ccsens/ptccsens/service/IFinanceService.java index 049f4fe..ca3812c 100644 --- a/src/main/java/com/ccsens/ptccsens/service/IFinanceService.java +++ b/src/main/java/com/ccsens/ptccsens/service/IFinanceService.java @@ -15,7 +15,7 @@ public interface IFinanceService { * @param param 任务ID * @return 财务条 */ - FinanceVo.FinanceItem getByTask(FinanceDto.TaskId param,); + FinanceVo.FinanceItem getByTask(FinanceDto.TaskId param); /** * 查询费用申请类型 From eebc40e1d47059787959f902d999b1855abb9334 Mon Sep 17 00:00:00 2001 From: lucky Date: Wed, 26 Jan 2022 17:25:10 +0800 Subject: [PATCH 5/7] =?UTF-8?q?=E4=BF=AE=E6=94=B9bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ccsens/ptccsens/api/OcrController.java | 27 +++++++++++++++++-- .../com/ccsens/ptccsens/bean/vo/OcrVo.java | 2 ++ .../ccsens/ptccsens/service/IOcrService.java | 3 ++- .../ccsens/ptccsens/service/OcrService.java | 4 +-- src/main/resources/mapper_dao/FinanceDao.xml | 2 +- 5 files changed, 32 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/ccsens/ptccsens/api/OcrController.java b/src/main/java/com/ccsens/ptccsens/api/OcrController.java index 181d09d..b9cc5cc 100644 --- a/src/main/java/com/ccsens/ptccsens/api/OcrController.java +++ b/src/main/java/com/ccsens/ptccsens/api/OcrController.java @@ -1,14 +1,17 @@ package com.ccsens.ptccsens.api; import cn.hutool.core.codec.Base64; +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.ImageUtil; +import cn.hutool.extra.servlet.ServletUtil; import com.ccsens.cloudutil.annotation.MustLogin; import com.ccsens.ptccsens.bean.dto.ProjectFinanceDto; import com.ccsens.ptccsens.bean.vo.OcrVo; import com.ccsens.ptccsens.bean.vo.ProjectFinanceVo; import com.ccsens.ptccsens.service.IOcrService; import com.ccsens.ptccsens.util.BasicsConstant; -import com.ccsens.util.JsonResponse; +import com.ccsens.util.*; import com.ccsens.util.baidu.BaiDuDto; import com.ccsens.util.baidu.BaiDuUtil; import com.ccsens.util.baidu.BaiDuVo; @@ -25,8 +28,10 @@ import javax.annotation.Resource; import javax.imageio.ImageIO; import javax.servlet.http.Part; import java.io.ByteArrayOutputStream; +import java.io.File; import java.io.IOException; import java.text.ParseException; +import java.util.Date; /** @@ -49,7 +54,25 @@ public class OcrController { ByteArrayOutputStream out = new ByteArrayOutputStream(); ImageUtil.scale(ImageIO.read(part.getInputStream()), out, 1f); String img = Base64.encode(out.toByteArray()); - OcrVo.BillInfo billInfo = ocrService.identifyBill(img); + //保存文件 +// String extName = FileUtil.extName(part.getSubmittedFileName()); +// String dir = PropUtil.path + File.separator + Constant.OrcImg.FILE_DIR; +// String extraPath = DateUtil.format(new Date(), "yyyyMMdd"); +// String path = extraPath + File.separator+firstAidInfo.getId()+firstAidInfo.getName()+File.separator+ IdUtil.simpleUUID() + "." + extName; +// //转成file +// File saveFile = new File(dir + extraPath); +// if (!saveFile.exists()) { +// saveFile.mkdirs(); +// } +// String fullPath = dir + File.separator + path; +// FileUtil.writeFromStream(file.getInputStream(), fullPath); + //1.上传文件 + String allowedExts = BasicsConstant.FILE_TYPE_IMG; + String dir = PropUtil.path; + String path = UploadFileUtil_Servlet3.uploadFile(part, allowedExts, dir); + String realPath = PropUtil.imgDomain+""+path; + log.info("文件保存路径:{}",realPath); + OcrVo.BillInfo billInfo = ocrService.identifyBill(img,realPath); log.info("图像识别结束:{}", billInfo); return JsonResponse.newInstance().ok(billInfo); } diff --git a/src/main/java/com/ccsens/ptccsens/bean/vo/OcrVo.java b/src/main/java/com/ccsens/ptccsens/bean/vo/OcrVo.java index 464b1a2..80868e5 100644 --- a/src/main/java/com/ccsens/ptccsens/bean/vo/OcrVo.java +++ b/src/main/java/com/ccsens/ptccsens/bean/vo/OcrVo.java @@ -21,5 +21,7 @@ public class OcrVo { private Long totalTax; @ApiModelProperty("开票时间") private Long invoiceDate; + @ApiModelProperty("发票url") + private String url; } } diff --git a/src/main/java/com/ccsens/ptccsens/service/IOcrService.java b/src/main/java/com/ccsens/ptccsens/service/IOcrService.java index aefc14b..daacfab 100644 --- a/src/main/java/com/ccsens/ptccsens/service/IOcrService.java +++ b/src/main/java/com/ccsens/ptccsens/service/IOcrService.java @@ -8,7 +8,8 @@ public interface IOcrService { /** * 发票识别 * @param img 发表base64 + * @param realPath 文件路径 * @return 识别结果 */ - OcrVo.BillInfo identifyBill(String img) throws ParseException; + OcrVo.BillInfo identifyBill(String img,String realPath) throws ParseException; } diff --git a/src/main/java/com/ccsens/ptccsens/service/OcrService.java b/src/main/java/com/ccsens/ptccsens/service/OcrService.java index 00925ba..45d3ce2 100644 --- a/src/main/java/com/ccsens/ptccsens/service/OcrService.java +++ b/src/main/java/com/ccsens/ptccsens/service/OcrService.java @@ -25,7 +25,7 @@ import java.text.SimpleDateFormat; public class OcrService implements IOcrService{ @Override - public OcrVo.BillInfo identifyBill(String img) throws ParseException { + public OcrVo.BillInfo identifyBill(String img, String realPath) throws ParseException { // 图像识别 BaiDuDto.GeneralBasic basic = new BaiDuDto.GeneralBasic(); basic.setImage(img); @@ -44,7 +44,7 @@ public class OcrService implements IOcrService{ billInfo.setTotalAmount(new BigDecimal(words.getWordsResult().get(0).getTotalAmount()).multiply(BigDecimal.valueOf(100)).longValue()); billInfo.setTotalTax(new BigDecimal(words.getWordsResult().get(0).getTotalTax()).multiply(BigDecimal.valueOf(100)).longValue()); billInfo.setInvoiceDate(sdf.parse(words.getWordsResult().get(0).getInvoiceDate()).getTime()); - + billInfo.setUrl(realPath); } // personMsg.toMsg(words.getWordsResult()); return billInfo; diff --git a/src/main/resources/mapper_dao/FinanceDao.xml b/src/main/resources/mapper_dao/FinanceDao.xml index 8c7699d..ae2a420 100644 --- a/src/main/resources/mapper_dao/FinanceDao.xml +++ b/src/main/resources/mapper_dao/FinanceDao.xml @@ -145,7 +145,7 @@ AND t.NAME = '奖金' - AND t.NAME != '奖金' + AND (t.NAME != '奖金' OR t.`name` is NULL) AND a.rec_status = 0 From a6fa58d43e876349716133f0e905ddb0545da46b Mon Sep 17 00:00:00 2001 From: lucky Date: Wed, 26 Jan 2022 18:25:37 +0800 Subject: [PATCH 6/7] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/ccsens/ptccsens/bean/vo/FinanceVo.java | 4 ++++ .../java/com/ccsens/ptccsens/bean/vo/OcrVo.java | 8 ++++---- .../com/ccsens/ptccsens/service/OcrService.java | 12 +++++++++--- .../ccsens/ptccsens/util/BasicsCodeError.java | 1 + src/main/resources/application-dev.yml | 2 +- src/main/resources/application-prod.yml | 2 +- src/main/resources/application-test.yml | 2 +- src/main/resources/mapper_dao/FinanceDao.xml | 16 ++++++++++------ 8 files changed, 31 insertions(+), 16 deletions(-) diff --git a/src/main/java/com/ccsens/ptccsens/bean/vo/FinanceVo.java b/src/main/java/com/ccsens/ptccsens/bean/vo/FinanceVo.java index f3231b2..1c19228 100644 --- a/src/main/java/com/ccsens/ptccsens/bean/vo/FinanceVo.java +++ b/src/main/java/com/ccsens/ptccsens/bean/vo/FinanceVo.java @@ -167,12 +167,16 @@ public class FinanceVo { public static class TaskExpense { @ApiModelProperty("任务ID") private Long taskDetailId; + @ApiModelProperty("财务信息id") + private Long financeId; @ApiModelProperty("任务名") private String taskName; @ApiModelProperty("金额,单位:分") private Long money; @ApiModelProperty("占比,保留两位小数") private BigDecimal percentage; + @ApiModelProperty("追加预算,单位:分") + private Long budget; } @Data diff --git a/src/main/java/com/ccsens/ptccsens/bean/vo/OcrVo.java b/src/main/java/com/ccsens/ptccsens/bean/vo/OcrVo.java index 80868e5..67419c4 100644 --- a/src/main/java/com/ccsens/ptccsens/bean/vo/OcrVo.java +++ b/src/main/java/com/ccsens/ptccsens/bean/vo/OcrVo.java @@ -14,13 +14,13 @@ public class OcrVo { @ApiModelProperty("发票代码") private String invoiceCode; @ApiModelProperty("发票号码") - private String invoiceNum; + private String invoiceNumber; @ApiModelProperty("金额") - private Long totalAmount; + private Long money; @ApiModelProperty("税额") - private Long totalTax; + private Long taxMoney; @ApiModelProperty("开票时间") - private Long invoiceDate; + private Long invoiceTime; @ApiModelProperty("发票url") private String url; } diff --git a/src/main/java/com/ccsens/ptccsens/service/OcrService.java b/src/main/java/com/ccsens/ptccsens/service/OcrService.java index 45d3ce2..8275730 100644 --- a/src/main/java/com/ccsens/ptccsens/service/OcrService.java +++ b/src/main/java/com/ccsens/ptccsens/service/OcrService.java @@ -4,12 +4,15 @@ import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.StrUtil; import com.alibaba.druid.sql.visitor.functions.If; +import com.ccsens.ptccsens.bean.po.Constant; import com.ccsens.ptccsens.bean.vo.OcrVo; +import com.ccsens.ptccsens.util.BasicsCodeError; import com.ccsens.ptccsens.util.BasicsConstant; import com.ccsens.util.RestTemplateUtil; import com.ccsens.util.baidu.BaiDuDto; import com.ccsens.util.baidu.BaiDuUtil; import com.ccsens.util.baidu.BaiDuVo; +import com.ccsens.util.exception.BaseException; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; @@ -31,6 +34,9 @@ public class OcrService implements IOcrService{ basic.setImage(img); BaiDuVo.BillBasic words = BaiDuUtil.billBasic(BasicsConstant.BaiDu.INVOICE_APP_KEY, BasicsConstant.BaiDu.INVOICE_SECRET_KEY, basic); log.info("识别结果:{}",words); + if ("1486278397695872724".equals(words.getLogId())) { + throw new BaseException(BasicsCodeError.IMG_ERROR); + } // String token = BaiDuUtil.getToken(BasicsConstant.BaiDu.INVOICE_APP_KEY, BasicsConstant.BaiDu.INVOICE_SECRET_KEY); // String invoiceUrl = "https://aip.baidubce.com/rest/2.0/ocr/v1/vat_invoice?access_token={}"; // String url = StrUtil.format(invoiceUrl, token); @@ -41,9 +47,9 @@ public class OcrService implements IOcrService{ if (CollectionUtil.isNotEmpty(words.getWordsResult())) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd"); BeanUtil.copyProperties(words.getWordsResult().get(0),billInfo); - billInfo.setTotalAmount(new BigDecimal(words.getWordsResult().get(0).getTotalAmount()).multiply(BigDecimal.valueOf(100)).longValue()); - billInfo.setTotalTax(new BigDecimal(words.getWordsResult().get(0).getTotalTax()).multiply(BigDecimal.valueOf(100)).longValue()); - billInfo.setInvoiceDate(sdf.parse(words.getWordsResult().get(0).getInvoiceDate()).getTime()); + billInfo.setMoney(new BigDecimal(words.getWordsResult().get(0).getTotalAmount()).multiply(BigDecimal.valueOf(100)).longValue()); + billInfo.setTaxMoney(new BigDecimal(words.getWordsResult().get(0).getTotalTax()).multiply(BigDecimal.valueOf(100)).longValue()); + billInfo.setInvoiceTime(sdf.parse(words.getWordsResult().get(0).getInvoiceDate()).getTime()); billInfo.setUrl(realPath); } // personMsg.toMsg(words.getWordsResult()); diff --git a/src/main/java/com/ccsens/ptccsens/util/BasicsCodeError.java b/src/main/java/com/ccsens/ptccsens/util/BasicsCodeError.java index db77a59..61f28cb 100644 --- a/src/main/java/com/ccsens/ptccsens/util/BasicsCodeError.java +++ b/src/main/java/com/ccsens/ptccsens/util/BasicsCodeError.java @@ -40,6 +40,7 @@ public class BasicsCodeError extends CodeError { public static final Code CHECK_EXISTED = new Code(528,"您已经提交过审核结果了,无需重复提交。", true); public static final Code TASK_DONT_EXIT = new Code(530,"任务不存在请检查后重试", true); public static final Code FINANCE_NOT_FOUND = new Code(529,"没有找到任务对应的财务预算信息,请修改后重新提交申请。", true); + public static final Code IMG_ERROR = new Code(530,"请上传正确的发票图片", true); diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index 0e8e64c..fc053ff 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -47,4 +47,4 @@ mybatisCache: file: path: /home/ptccsens/server/uploads/ domain: https://test.tall.wiki/gateway/ptccsens - imgDomain: https://test.tall.wiki/gateway/ptccsens/uploads/ + imgDomain: https://test.tall.wiki/gateway/ptccsens/v1.0/uploads/ diff --git a/src/main/resources/application-prod.yml b/src/main/resources/application-prod.yml index d331823..673c4ee 100644 --- a/src/main/resources/application-prod.yml +++ b/src/main/resources/application-prod.yml @@ -37,4 +37,4 @@ apiUrl: https://www.tall.wiki/ file: path: /home/ptccsens/server/uploads/ domain: https://www.tall.wiki/gateway/ptccsens - imgDomain: https://www.tall.wiki/gateway/ptccsens/uploads/ + imgDomain: https://www.tall.wiki/gateway/ptccsens/v1.0/uploads/ diff --git a/src/main/resources/application-test.yml b/src/main/resources/application-test.yml index bac9719..b1f179e 100644 --- a/src/main/resources/application-test.yml +++ b/src/main/resources/application-test.yml @@ -45,4 +45,4 @@ eureka: file: path: /home/ptccsens/server/uploads/ domain: https://test.tall.wiki/gateway/ptccsens - imgDomain: https://test.tall.wiki/gateway/ptccsens/uploads/ + imgDomain: https://test.tall.wiki/gateway/ptccsens/v1.0/uploads/ diff --git a/src/main/resources/mapper_dao/FinanceDao.xml b/src/main/resources/mapper_dao/FinanceDao.xml index ae2a420..cc86f2e 100644 --- a/src/main/resources/mapper_dao/FinanceDao.xml +++ b/src/main/resources/mapper_dao/FinanceDao.xml @@ -169,16 +169,20 @@ From 1cd10f341e32bb2cbd8b9a59da527644217f68ec Mon Sep 17 00:00:00 2001 From: lucky Date: Wed, 26 Jan 2022 19:08:33 +0800 Subject: [PATCH 7/7] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/ccsens/ptccsens/service/OcrService.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/main/java/com/ccsens/ptccsens/service/OcrService.java b/src/main/java/com/ccsens/ptccsens/service/OcrService.java index 8275730..682bec2 100644 --- a/src/main/java/com/ccsens/ptccsens/service/OcrService.java +++ b/src/main/java/com/ccsens/ptccsens/service/OcrService.java @@ -34,9 +34,6 @@ public class OcrService implements IOcrService{ basic.setImage(img); BaiDuVo.BillBasic words = BaiDuUtil.billBasic(BasicsConstant.BaiDu.INVOICE_APP_KEY, BasicsConstant.BaiDu.INVOICE_SECRET_KEY, basic); log.info("识别结果:{}",words); - if ("1486278397695872724".equals(words.getLogId())) { - throw new BaseException(BasicsCodeError.IMG_ERROR); - } // String token = BaiDuUtil.getToken(BasicsConstant.BaiDu.INVOICE_APP_KEY, BasicsConstant.BaiDu.INVOICE_SECRET_KEY); // String invoiceUrl = "https://aip.baidubce.com/rest/2.0/ocr/v1/vat_invoice?access_token={}"; // String url = StrUtil.format(invoiceUrl, token); @@ -47,6 +44,7 @@ public class OcrService implements IOcrService{ if (CollectionUtil.isNotEmpty(words.getWordsResult())) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd"); BeanUtil.copyProperties(words.getWordsResult().get(0),billInfo); + billInfo.setInvoiceNumber(words.getWordsResult().get(0).getInvoiceNum()); billInfo.setMoney(new BigDecimal(words.getWordsResult().get(0).getTotalAmount()).multiply(BigDecimal.valueOf(100)).longValue()); billInfo.setTaxMoney(new BigDecimal(words.getWordsResult().get(0).getTotalTax()).multiply(BigDecimal.valueOf(100)).longValue()); billInfo.setInvoiceTime(sdf.parse(words.getWordsResult().get(0).getInvoiceDate()).getTime());