ruoyi-admin/src/main/java/com/ruoyi/web/controller/project/ServiceFundController.java
@@ -541,6 +541,11 @@ } serviceFundflow.setFlowlevel(OriginalFlowLevel + 1); serviceFundflowService.save(serviceFundflow); //001审æ¹éè¿ä¹åï¼å°±éè¦æâåå ¬å®¤ä¸»ä»»âçååå¡«ä¸ if (checkFundVO.getFlowconclusion() == 1 && user.getUserId().equals("001")) { serviceFund.setOfficedirector(user.getNickName()); } serviceFundService.updateById(serviceFund); ServiceSystemmessage serviceSystemmessage = new ServiceSystemmessage(); ruoyi-admin/src/main/java/com/ruoyi/web/controller/project/ServiceFunddetailController.java
@@ -161,4 +161,10 @@ public AjaxResult getFundDetail(@PathVariable("id") Long id) { return AjaxResult.success(serviceFunddetailService.getFundDetail(id)); } @ApiOperation("æ ¹æ®æ¡ä»¶ç®ç¨") @PostMapping("/calculateTax") public AjaxResult calculateTax(@RequestBody List<ServiceFunddetail> serviceFunddetails) { return AjaxResult.success(serviceFunddetailService.calculateTax(serviceFunddetails)); } } ruoyi-admin/src/main/java/com/ruoyi/web/controller/project/ServiceReimbursementController.java
@@ -628,6 +628,10 @@ } } //001审æ¹éè¿ä¹åï¼å°±éè¦æâåå ¬å®¤ä¸»ä»»âçååå¡«ä¸ if (checkFundVO.getFlowconclusion() == 1 && user.getUserId().equals("001")) { serviceReimbursement.setOfficedirector(user.getNickName()); } serviceReimbursementService.updateById(serviceReimbursement); ruoyi-project/src/main/java/com/ruoyi/project/domain/ServiceFunddetail.java
@@ -333,5 +333,13 @@ @ApiModelProperty("éä»¶æä»¶å°å") private String annexfiles; /** * 计ç®ç¨è´¹æ¶é´ */ @ApiModelProperty("计ç®ç¨è´¹æ¶é´") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date taxTime; } ruoyi-project/src/main/java/com/ruoyi/project/domain/vo/TaxMoneyByItemEO.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,39 @@ package com.ruoyi.project.domain.vo; import com.fasterxml.jackson.annotation.JsonFormat; import com.ruoyi.common.core.domain.BaseEntity; import lombok.Data; import java.util.Date; @Data public class TaxMoneyByItemEO extends BaseEntity { /** * åç人ç¼å· */ private String beneficiaryNo; /** * è´¹ç¨å建æ¶é´ */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date taxTime; /** * æ¬æç¬¬ä¸å¤©çæ¶é´ YYYY-MM-DD hh-mm-ss */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date firstDay; /** * 人åç±»å« */ private Long applyType; /** * èµéç³è¯·ä¸»è¡¨ID */ private Long fundID; } ruoyi-project/src/main/java/com/ruoyi/project/domain/vo/TaxMoneySumEO.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,25 @@ package com.ruoyi.project.domain.vo; import com.ruoyi.common.core.domain.BaseEntity; import lombok.Data; @Data public class TaxMoneySumEO extends BaseEntity { /** * ç¨åæ»é¢ */ private double amounts; /** * ç¨æ»é¢ */ private double taxAmounts; /** * ç¨åæ»é¢ */ private double taxedAmounts; } ruoyi-project/src/main/java/com/ruoyi/project/mapper/ServiceFunddetailMapper.java
@@ -7,6 +7,8 @@ import com.ruoyi.project.domain.FunddetailReqVo; import com.ruoyi.project.domain.ServiceFunddetail; import com.ruoyi.project.domain.vo.TaxMoneyByItemEO; import com.ruoyi.project.domain.vo.TaxMoneySumEO; import com.ruoyi.project.domain.vo.TaxMoneyVO; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -47,6 +49,9 @@ List<ServiceFunddetail> getTaxBeforeByBeneFiciaryNo(TaxMoneyVO taxMoneyV); boolean updateTaxTime(ServiceFunddetail serviceFunddetail); TaxMoneySumEO getTaxSum(TaxMoneyByItemEO taxMoneyByItemEO); } } ruoyi-project/src/main/java/com/ruoyi/project/service/IServiceFunddetailService.java
@@ -60,4 +60,11 @@ int deleteDetail(Long id); List<ServiceFunddetailVO> getFundDetail(Long id); /** * æ ¹æ®æ¡ä»¶ç®ç¨ * * @param serviceFunddetails */ public Boolean calculateTax(List<ServiceFunddetail> serviceFunddetails); } ruoyi-project/src/main/java/com/ruoyi/project/service/impl/ServiceFundServiceImpl.java
@@ -670,6 +670,7 @@ @Transactional public Long addOrUpdateNew(ServiceFundVO serviceFundVO) { Long id = null; //å°æ°æ®ä¿åå°fund表 if (serviceFundVO.getId() == null) { save(serviceFundVO); id = serviceFundVO.getId(); @@ -682,82 +683,21 @@ System.out.println("serviceFunddetails为空å½"); return null; } // ç¨äºè®°å½ç¨åãç¨åçæ»å double taxBefore = 0.0; double taxAfter = 0.0; // ä¿åè¯¦æ æ°æ® for (ServiceFunddetailVO serviceFunddetailVO : serviceFunddetails) { serviceFunddetailVO.setFundid(id); //å°é件转æjson if (!CollectionUtils.isEmpty(serviceFunddetailVO.getAnnexfilesList())) { serviceFunddetailVO.setAnnexfiles(JSON.toJSONString(serviceFunddetailVO.getAnnexfilesList())); } if (serviceFunddetailVO.getTaxedamount() != null && serviceFunddetailVO.getAmount() != null && serviceFunddetailVO.getTaxedamount() != 0.0 && serviceFunddetailVO.getAmount() != 0.0) { // ç¨åç¨åé½ä¸ä¸ºç©º ServiceFunddetail serviceFunddetail = DtoConversionUtils.sourceToTarget(serviceFunddetailVO, ServiceFunddetail.class); if (serviceFunddetailVO.getId() == null) { serviceFunddetailService.save(serviceFunddetail); } else { serviceFunddetailService.updateById(serviceFunddetail); } //计ç®ç¨é if (serviceFunddetail.getAmount() != null) { taxBefore = taxBefore + serviceFunddetail.getAmount(); } if (serviceFunddetail.getTaxedamount() != null) { taxAfter = taxAfter + serviceFunddetail.getTaxedamount(); } continue; } else if (serviceFunddetailVO.getTaxedamount() != null && serviceFunddetailVO.getTaxedamount() != 0.0) { // ç¨åæ±ç¨å,妿æ¯ä¸å®¶è´¹ç³è¯· æ 伦çä¸å®¶è´¹ç³è¯· æä¼è®¡ç®ç¨åç¨å if (StringUtils.isNotEmpty(serviceFundVO.getApplytype()) && serviceFundVO.getApplytype().equals("1") || serviceFundVO.getApplytype().equals("2")) { Double taxationBefore = Double.valueOf(TaxtUtils.getTaxationBefore(BigDecimal.valueOf(serviceFunddetailVO.getTaxedamount()))); // ç¨é String taxation = TaxtUtils.getTaxation(BigDecimal.valueOf(taxationBefore)); serviceFunddetailVO.setAmount(Double.valueOf(taxationBefore)); serviceFunddetailVO.setTaxamount(Double.parseDouble(taxation)); } } else if (serviceFunddetailVO.getAmount() != null && serviceFunddetailVO.getAmount() != 0.0) { // ç¨åæ±ç¨å,妿æ¯ä¸å®¶è´¹ç³è¯· æ 伦çä¸å®¶è´¹ç³è¯· æä¼è®¡ç®ç¨åç¨å if (StringUtils.isNotEmpty(serviceFundVO.getApplytype()) && serviceFundVO.getApplytype().equals("1") || serviceFundVO.getApplytype().equals("2")) { double tax = Double.parseDouble(TaxtUtils.getTaxation(BigDecimal.valueOf(serviceFunddetailVO.getAmount()))); BigDecimal taxAfterMoney = BigDecimal.valueOf(serviceFunddetailVO.getAmount()).subtract(BigDecimal.valueOf(tax)); serviceFunddetailVO.setTaxamount(tax); serviceFunddetailVO.setTaxedamount(taxAfterMoney.doubleValue()); } } //æ ¹æ®idå¤ææ¯æ°å¢è¿æ¯ä¿®æ¹ ServiceFunddetail serviceFunddetail = DtoConversionUtils.sourceToTarget(serviceFunddetailVO, ServiceFunddetail.class); if (serviceFunddetailVO.getId() == null) { serviceFunddetailService.save(serviceFunddetail); } else { serviceFunddetailService.updateById(serviceFunddetail); } // if (serviceFundVO.getApplytype().equals("1") || serviceFundVO.getApplytype().equals("2")) { //妿æ¯ä¸å®¶è´¹ç³è¯· æ 伦çä¸å®¶è´¹ç³è¯· æä¼è®¡ç®ç¨åç¨å if (serviceFunddetail.getAmount() != null) { taxBefore = taxBefore + serviceFunddetail.getAmount(); } if (serviceFunddetail.getTaxedamount() != null) { taxAfter = taxAfter + serviceFunddetail.getTaxedamount(); } } //å°ç¨åãç¨åé颿´æ°å°fundè¡¨ä¸ serviceFundVO.setPretaxcost(taxBefore); serviceFundVO.setTaxedcost(taxAfter); //ç³è¯·éé¢ä¸ºå«ç¨éé¢ if (serviceFundVO.getApplytype().equals("1") || serviceFundVO.getApplytype().equals("2")) { //ä¸ªç¨ ç¨åï¼æç¨ï¼ - ç¨ = ç¨å serviceFundVO.setAmountrequested(taxBefore); } else { //éè´ ç¨åï¼æ ç¨ï¼ + ç¨ = ç¨åï¼å«ç¨éé¢ï¼ serviceFundVO.setAmountrequested(taxAfter); } updateById(serviceFundVO); return id; } ruoyi-project/src/main/java/com/ruoyi/project/service/impl/ServiceFunddetailServiceImpl.java
@@ -1,8 +1,11 @@ package com.ruoyi.project.service.impl; import java.math.BigDecimal; import java.text.SimpleDateFormat; import java.time.LocalDate; import java.time.ZoneId; import java.time.temporal.TemporalAdjusters; import java.util.ArrayList; import java.util.Date; import java.util.List; @@ -11,8 +14,7 @@ import com.ruoyi.common.tax.TaxtUtils; import com.ruoyi.common.utils.bean.DtoConversionUtils; import com.ruoyi.project.domain.*; import com.ruoyi.project.domain.vo.TaxMoneyVO; import com.ruoyi.project.domain.vo.TaxedMoneyVO; import com.ruoyi.project.domain.vo.*; import com.ruoyi.project.mapper.ServiceFundMapper; import org.apache.commons.collections4.CollectionUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -23,6 +25,7 @@ import com.ruoyi.common.utils.StringUtils; import com.ruoyi.project.mapper.ServiceFunddetailMapper; import com.ruoyi.project.service.IServiceFunddetailService; import org.springframework.transaction.annotation.Transactional; /** * è´¹ç¨ç³è¯·æç»Serviceä¸å¡å±å¤ç @@ -231,4 +234,98 @@ return serviceFunddetailVOS; } /** * æ ¹æ®æ¡ä»¶ç®ç¨ * * @param serviceFunddetails */ @Override @Transactional(rollbackFor = Exception.class) public Boolean calculateTax(List<ServiceFunddetail> serviceFunddetails) { //ç¨äºä¸´æ¶ä¿åå·²ç»ç®å¥½ç"è´¹ç¨è¯¦æ æ°æ®" List<ServiceFunddetail> temporarySave = new ArrayList<>(); for (ServiceFunddetail serviceFunddetail : serviceFunddetails) { //è·å彿ç第ä¸å¤© Date firstDay = Date.from(LocalDate.now().with(TemporalAdjusters.firstDayOfMonth()).atStartOfDay(ZoneId.systemDefault()).toInstant()); SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String firstDatStr = dateFormat.format(firstDay); TaxMoneyByItemEO taxMoneyVO = new TaxMoneyByItemEO(); taxMoneyVO.setTaxTime(new Date()); taxMoneyVO.setFirstDay(firstDay); taxMoneyVO.setApplyType(Long.valueOf(serviceFunddetail.getApplytype())); taxMoneyVO.setFundID(serviceFunddetail.getFundid()); taxMoneyVO.setBeneficiaryNo(serviceFunddetail.getBeneficiaryno()); //æ¥åºç¨åãç¨ãç¨åçæ»é¢ï¼ä¸å 嫿¬æ¬¡ï¼ TaxMoneySumEO taxSum = serviceFunddetailMapper.getTaxSum(taxMoneyVO); if (ObjectUtils.isEmpty(taxSum)) { taxSum = new TaxMoneySumEO(); } //夿䏴æ¶éåtemporarySaveä¸ï¼ææ²¡æå·²ç»ç®è¿çæ°æ® if (CollectionUtils.isNotEmpty(temporarySave)) { for (ServiceFunddetail serviceFunddetail1 : temporarySave) { //å¦ææ¬æ¬¡çâ人åç±»åâãâåç人ç¼å·âå¨ä¸´æ¶éåä¸åå¨ï¼åå°éåæ°æ®ä¸ç该åç人çï¼ç¨åãç¨éãç¨åï¼åæ»çç¸å ï¼å¹¶å°èçè¦ç if (serviceFunddetail1.getApplytype().equals(serviceFunddetail.getApplytype()) && serviceFunddetail1.getBeneficiaryno().equals(serviceFunddetail.getBeneficiaryno())) { //å°éåæ°æ®ä¸ç该åç人çï¼ç¨åãç¨éãç¨åï¼åæ»çç¸å BigDecimal amounts = BigDecimal.valueOf(taxSum.getAmounts()).add(new BigDecimal(String.valueOf(serviceFunddetail1.getAmount()))); BigDecimal taxAmounts = BigDecimal.valueOf(taxSum.getTaxAmounts()).add(new BigDecimal(String.valueOf(serviceFunddetail1.getTaxamount()))); BigDecimal TaxedAmounts = BigDecimal.valueOf(taxSum.getTaxedAmounts()).add(new BigDecimal(String.valueOf(serviceFunddetail1.getTaxedamount()))); //å°èçè¦ç taxSum.setAmounts(amounts.doubleValue()); taxSum.setTaxAmounts(taxAmounts.doubleValue()); taxSum.setTaxedAmounts(TaxedAmounts.doubleValue()); } continue; } } if (!serviceFunddetail.getServicesscopename().contains("ç¨å")) { // å¦ä½ç¨åéé¢ä¸ä¸ºç©ºï¼ç¨ä¹åçâæ»ç¨åéé¢âï¼å ä¸å½åâç¨åéé¢â BigDecimal newAmounts = BigDecimal.valueOf(taxSum.getAmounts()).add(BigDecimal.valueOf(serviceFunddetail.getAmount())); // è®¡ç®æ»ç¨éï¼å 嫿¬æ¬¡ï¼ String taxation = TaxtUtils.getTaxation(newAmounts); //è®¡ç®æ¬æ¬¡ç¨éï¼æ»ç¨éï¼å 嫿¬æ¬¡ï¼ - æ»ç¨éï¼ä¸å 嫿¬æ¬¡ï¼ï¼ BigDecimal taxAmountNow = new BigDecimal(taxation).subtract(new BigDecimal(String.valueOf(taxSum.getTaxAmounts()))); //è®¡ç®æ¬æ¬¡çç¨åéé¢(æ¬æ¬¡çç¨åéé¢ - ç¨é) BigDecimal texdAfterNow = BigDecimal.valueOf(serviceFunddetail.getAmount()).subtract(taxAmountNow); //å°å¾ªç¯çæ°æ®éæ°æ¾å°ä¸ä¸ªæ°å¯¹è±¡ä¸ ServiceFunddetail serviceFunddetail3 = DtoConversionUtils.sourceToTarget(serviceFunddetail, ServiceFunddetail.class); serviceFunddetail3.setTaxamount(taxAmountNow.doubleValue()); serviceFunddetail3.setTaxedamount(texdAfterNow.doubleValue()); serviceFunddetail3.setTaxTime(new Date()); // å°è¯¥æ¡æ°æ®æ´æ° updateById(serviceFunddetail3); // æè¯¥æ°æ®ï¼æ¾å°ä¸´æ¶çéåä¸ temporarySave.add(serviceFunddetail3); } else if (serviceFunddetail.getServicesscopename().contains("ç¨å")) { //ç¨åä¸ä¸ºç©º, ç¨ä¹åçâæ»ç¨åéé¢âï¼å ä¸å½åâç¨åéé¢â BigDecimal newTaxedAmounts = BigDecimal.valueOf(taxSum.getTaxedAmounts()).add(BigDecimal.valueOf(serviceFunddetail.getTaxedamount())); //éè¿æ»ç¨åï¼å 嫿¬æ¬¡ï¼ç®åºæ»ç¨å String taxationBefore = TaxtUtils.getTaxationBefore(newTaxedAmounts); //ç®åºæ¬æ¬¡ç¨åï¼æ»ç¨åï¼å 嫿¬æ¬¡ï¼ - æ»ç¨åï¼ä¸å 嫿¬æ¬¡ï¼ï¼ BigDecimal amountNow = new BigDecimal(taxationBefore).subtract(BigDecimal.valueOf(taxSum.getAmounts())); //ç®åºæ¬æ¬¡ç¨é(æ¬æ¬¡ç¨å - æ¬æ¬¡ç¨å) BigDecimal tax = amountNow.subtract(BigDecimal.valueOf(serviceFunddetail.getTaxedamount())); //å°å¾ªç¯çæ°æ®éæ°æ¾å°ä¸ä¸ªæ°å¯¹è±¡ä¸ ServiceFunddetail serviceFunddetail3 = DtoConversionUtils.sourceToTarget(serviceFunddetail, ServiceFunddetail.class); serviceFunddetail3.setAmount(amountNow.doubleValue()); serviceFunddetail3.setTaxamount(tax.doubleValue()); serviceFunddetail3.setTaxTime(new Date()); // å°è¯¥æ¡æ°æ®æ´æ° updateById(serviceFunddetail3); // æè¯¥æ°æ®ï¼æ¾å°ä¸´æ¶çéåä¸ temporarySave.add(serviceFunddetail3); } } return true; } } ruoyi-project/src/main/resources/mapper/project/ServiceFundMapper.xml
@@ -113,7 +113,7 @@ from service_fund </sql> <select id="selectServiceFundList" parameterType="ServiceFund" resultMap="ServiceFundResult"> <select id="selectServiceFundList" parameterType="com.ruoyi.project.domain.ServiceFund" resultMap="ServiceFundResult"> <include refid="selectServiceFundVo"/> where del_flag = '0' ruoyi-project/src/main/resources/mapper/project/ServiceFunddetailMapper.xml
@@ -56,7 +56,8 @@ <result property="itemcode" column="ItemCode"/> <result property="subjecttype" column="subjecttype"/> <result property="subjecttypename" column="subjecttypename"/> <result property="AnnexFiles" column="AnnexFiles"/> <result property="annexfiles" column="AnnexFiles"/> <result property="taxTime" column="tax_time"/> </resultMap> <sql id="selectServiceFunddetailVo"> @@ -111,7 +112,8 @@ SERVICETYPENAME, subjecttype, subjecttypename, AnnexFiles AnnexFiles, tax_time from service_funddetail </sql> @@ -244,4 +246,22 @@ </select> <update id="updateTaxTime" parameterType="com.ruoyi.project.domain.ServiceFunddetail"> update com.ruoyi.project.domain. <set> tax_time = #{taxTime}, </set> where fundID = #{fundid} </update> <select id="getTaxSum" parameterType="com.ruoyi.project.domain.vo.TaxMoneyByItemEO" resultType="com.ruoyi.project.domain.vo.TaxMoneySumEO"> SELECT sum(Amount) amounts, sum(TaxAmount) taxAmounts, sum(TaxedAmount) taxedAmounts FROM service_funddetail where fundID < #{fundID} and tax_time < #{taxTime} and tax_time >= #{firstDay} and ApplyType = #{applyType} and BeneficiaryNo = #{beneficiaryNo} </select> </mapper>