liusheng
2023-09-14 fa8521a23af37854e7a23d35467147bd00e008b2
代码提交
已添加2个文件
已修改10个文件
294 ■■■■ 文件已修改
ruoyi-admin/src/main/java/com/ruoyi/web/controller/project/ServiceFundController.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/project/ServiceFunddetailController.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/project/ServiceReimbursementController.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-project/src/main/java/com/ruoyi/project/domain/ServiceFunddetail.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-project/src/main/java/com/ruoyi/project/domain/vo/TaxMoneyByItemEO.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-project/src/main/java/com/ruoyi/project/domain/vo/TaxMoneySumEO.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-project/src/main/java/com/ruoyi/project/mapper/ServiceFunddetailMapper.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-project/src/main/java/com/ruoyi/project/service/IServiceFunddetailService.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-project/src/main/java/com/ruoyi/project/service/impl/ServiceFundServiceImpl.java 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-project/src/main/java/com/ruoyi/project/service/impl/ServiceFunddetailServiceImpl.java 101 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-project/src/main/resources/mapper/project/ServiceFundMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-project/src/main/resources/mapper/project/ServiceFunddetailMapper.xml 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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 &lt; #{fundID}
          and tax_time &lt; #{taxTime}
          and tax_time >= #{firstDay}
          and ApplyType = #{applyType}
          and BeneficiaryNo = #{beneficiaryNo}
    </select>
</mapper>