|
@@ -0,0 +1,221 @@
|
|
|
|
+package com.jeeplus.test.reimbursementsys.service.impl;
|
|
|
|
+
|
|
|
|
+import com.baomidou.mybatisplus.core.metadata.IPage;
|
|
|
|
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
|
|
+import com.google.common.collect.Lists;
|
|
|
|
+import com.jeeplus.sys.service.dto.UserDTO;
|
|
|
|
+import com.jeeplus.sys.utils.StringUtils;
|
|
|
|
+import com.jeeplus.sys.utils.UserUtils;
|
|
|
|
+import com.jeeplus.test.reimbursementsys.domain.dto.ReimbursementBusinessDTO;
|
|
|
|
+import com.jeeplus.test.reimbursementsys.domain.dto.ReimbursementDTO;
|
|
|
|
+import com.jeeplus.test.reimbursementsys.domain.dto.ReimbursementUserDTO;
|
|
|
|
+import com.jeeplus.test.reimbursementsys.mapper.ReimbursementBusinessMapper;
|
|
|
|
+import com.jeeplus.test.reimbursementsys.mapper.ReimbursementSysMapper;
|
|
|
|
+import com.jeeplus.test.reimbursementsys.service.ReimbursementBusinessService;
|
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
|
+
|
|
|
|
+import javax.annotation.Resource;
|
|
|
|
+import java.math.BigDecimal;
|
|
|
|
+import java.util.HashMap;
|
|
|
|
+import java.util.List;
|
|
|
|
+import java.util.Map;
|
|
|
|
+
|
|
|
|
+/**
|
|
|
|
+ * @author li-peike
|
|
|
|
+ * @version 1.0.0
|
|
|
|
+ * @ClassName ReimbursementSysServiceImpl.java
|
|
|
|
+ * @Description TODO
|
|
|
|
+ * @createTime 2022年05月06日 10:38:00
|
|
|
|
+ */
|
|
|
|
+@Service
|
|
|
|
+public class ReimbursementBusinessServiceImpl implements ReimbursementBusinessService {
|
|
|
|
+
|
|
|
|
+ @Resource
|
|
|
|
+ private ReimbursementBusinessMapper mapper;
|
|
|
|
+ @Resource
|
|
|
|
+ private ReimbursementSysMapper reimbursementSysMapper;
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public ReimbursementBusinessDTO queryById(String id) {
|
|
|
|
+ return mapper.queryById(id);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public ReimbursementDTO getBusinessById(String id) {
|
|
|
|
+ ReimbursementDTO reimbursement = new ReimbursementDTO();
|
|
|
|
+ reimbursement.setBusinessCodeId(id);
|
|
|
|
+ ReimbursementBusinessDTO reimbursementBusiness = new ReimbursementBusinessDTO();
|
|
|
|
+ reimbursementBusiness.setBusinessCodeId(id);
|
|
|
|
+ //根据业务id查询已收款的发票信息收款总额
|
|
|
|
+ String getReceiptInvoiceByReimbursementId = reimbursementSysMapper.getReceiptInvoiceIncomeByReimbursementId(id);
|
|
|
|
+ BigDecimal income = new BigDecimal(getReceiptInvoiceByReimbursementId); //发票收入
|
|
|
|
+ //根据业务id查询报销比例
|
|
|
|
+ String getReimbursementRatioByReimbursementId = reimbursementSysMapper.getReimbursementRatioByReimbursementId(id);
|
|
|
|
+ if(StringUtils.isBlank(getReimbursementRatioByReimbursementId)){
|
|
|
|
+ getReimbursementRatioByReimbursementId = "0";
|
|
|
|
+ reimbursement.setReimbursementRatio("0");
|
|
|
|
+ }
|
|
|
|
+ BigDecimal reimbursementRatio = new BigDecimal(getReimbursementRatioByReimbursementId); //报销比例
|
|
|
|
+ BigDecimal canReimbursementAmount = income.multiply(reimbursementRatio).divide(new BigDecimal("100")).setScale(2, BigDecimal.ROUND_HALF_UP); //该项目可报销额度计算
|
|
|
|
+ //查询该业务总报销额度
|
|
|
|
+ String alreadyReimbursementQuotaByBusinessCodeId = mapper.getAlreadyReimbursementQuotaByBusinessCodeId(reimbursementBusiness);
|
|
|
|
+ BigDecimal allAlreadyReimbursementQuota = new BigDecimal(alreadyReimbursementQuotaByBusinessCodeId); //总报销额度
|
|
|
|
+ reimbursement.setAllAlreadyReimbursementQuota(allAlreadyReimbursementQuota.toString());
|
|
|
|
+ reimbursement.setCanReimbursementAmount(canReimbursementAmount.toString());
|
|
|
|
+ reimbursement.setSurplusReimbursementAmount(canReimbursementAmount.subtract(allAlreadyReimbursementQuota).toString());
|
|
|
|
+ return reimbursement;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public ReimbursementUserDTO queryByUserIdAndYear(ReimbursementBusinessDTO reimbursementUser) {
|
|
|
|
+ return mapper.queryByUserIdAndYear(reimbursementUser);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public IPage<ReimbursementUserDTO> findList(Page<ReimbursementUserDTO> page, ReimbursementUserDTO reimbursementUser) {
|
|
|
|
+ return mapper.findList (page, reimbursementUser);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public IPage<ReimbursementUserDTO> getYearList(Page<ReimbursementUserDTO> page, ReimbursementUserDTO reimbursementUser) {
|
|
|
|
+ IPage<ReimbursementUserDTO> yearList = mapper.getYearList(page, reimbursementUser);
|
|
|
|
+ List<ReimbursementUserDTO> list = yearList.getRecords();
|
|
|
|
+ if(list.size()>0){
|
|
|
|
+ List<String> yearStrList = Lists.newArrayList();
|
|
|
|
+ for (ReimbursementUserDTO info : list) {
|
|
|
|
+ yearStrList.add(info.getYear());
|
|
|
|
+ }
|
|
|
|
+ String years = StringUtils.join(yearStrList, ',');
|
|
|
|
+ reimbursementUser.setYear(years);
|
|
|
|
+ //根据人员和年份查询他的已报金额
|
|
|
|
+ List<ReimbursementUserDTO> reimbursementMoneyByYear = mapper.getReimbursementMoneyByYear(reimbursementUser);
|
|
|
|
+ for (ReimbursementUserDTO info : list) {
|
|
|
|
+ for (ReimbursementUserDTO yearInfo : reimbursementMoneyByYear) {
|
|
|
|
+ if(info.getYear().equals(yearInfo.getYear())){
|
|
|
|
+ //获取当年总报销额度
|
|
|
|
+ BigDecimal allAlreadyReimbursementQuota = new BigDecimal(info.getReimbursementQuota());
|
|
|
|
+ //获取当年已报销额度
|
|
|
|
+ BigDecimal alreadyReimbursementQuota = new BigDecimal(yearInfo.getAlreadyReimbursementAmount());
|
|
|
|
+ info.setAlreadyReimbursementAmount(alreadyReimbursementQuota.toString());
|
|
|
|
+ //计算出当年所剩报销额度
|
|
|
|
+ info.setRemainReimbursementAmount(allAlreadyReimbursementQuota.subtract(alreadyReimbursementQuota).toString());
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+ return yearList;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 保存
|
|
|
|
+ * @param reimbursementUser
|
|
|
|
+ */
|
|
|
|
+ @Override
|
|
|
|
+ public Map<String,Object> save(ReimbursementBusinessDTO reimbursementUser) {
|
|
|
|
+ Map<String,Object> map = new HashMap<>();
|
|
|
|
+
|
|
|
|
+ if(StringUtils.isBlank(reimbursementUser.getUserId())){
|
|
|
|
+ map.put("success", false);
|
|
|
|
+ map.put("message", "报销人员为空,无法进行添加报销信息!");
|
|
|
|
+ return map;
|
|
|
|
+ }
|
|
|
|
+ if(StringUtils.isBlank(reimbursementUser.getYear())){
|
|
|
|
+ map.put("success", false);
|
|
|
|
+ map.put("message", "报销年份不正确,请重新填写!");
|
|
|
|
+ return map;
|
|
|
|
+ }
|
|
|
|
+ if(StringUtils.isBlank(reimbursementUser.getReimbursementDay()) || !StringUtils.isNumeric(reimbursementUser.getReimbursementDay())){
|
|
|
|
+ map.put("success", false);
|
|
|
|
+ map.put("message", "报销天数不正确,请重新填写!");
|
|
|
|
+ return map;
|
|
|
|
+ }
|
|
|
|
+ //根据人员id和报销年份查询该年度的报销信息
|
|
|
|
+ ReimbursementUserDTO reimbursementUserByUserIdAndYear = mapper.reimbursementUserByUserIdAndYear(reimbursementUser);
|
|
|
|
+ if(null == reimbursementUserByUserIdAndYear){
|
|
|
|
+ map.put("success", false);
|
|
|
|
+ map.put("message", "该员工" + reimbursementUser.getYear() + "年度未添加报销信息,无法进行报销");
|
|
|
|
+ return map;
|
|
|
|
+ }
|
|
|
|
+ //查询该人员该年度已报销额度
|
|
|
|
+ String alreadyReimbursementQuota = mapper.getAlreadyReimbursementQuotaByUserIdAndYear(reimbursementUser);
|
|
|
|
+ //判断本地报销额度是否超过该年度所剩余报销额度,如果超过,则不允许报销,并抛出。否则进行报销并保存报销数据
|
|
|
|
+ BigDecimal alreadyReimbursementQuotaB = new BigDecimal(alreadyReimbursementQuota); //已报销额度
|
|
|
|
+ BigDecimal reimbursementQuotaDay = new BigDecimal(reimbursementUser.getReimbursementQuotaDay()); //日报销额度
|
|
|
|
+ BigDecimal reimbursementDay = new BigDecimal(reimbursementUser.getReimbursementDay()); //报销天数
|
|
|
|
+ BigDecimal reimbursementAmount = reimbursementQuotaDay.multiply(reimbursementDay).setScale(2, BigDecimal.ROUND_HALF_UP); //报销额度
|
|
|
|
+ //往期加这次的总报销额度和当年的总报销额度进行比较,小于当年报销额度 则个人可以进行报销,否则,无法进行报销
|
|
|
|
+ if(alreadyReimbursementQuotaB.add(reimbursementAmount).compareTo(new BigDecimal(reimbursementUser.getReimbursementQuota())) == 1){
|
|
|
|
+ map.put("success", false);
|
|
|
|
+ map.put("message", "本次报销金额已超出当年报销额度所剩余额,无法进行报销");
|
|
|
|
+ return map;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ //根据业务id查询已收款的发票信息收款总额
|
|
|
|
+ String getReceiptInvoiceByReimbursementId = reimbursementSysMapper.getReceiptInvoiceIncomeByReimbursementId(reimbursementUser.getBusinessCodeId());
|
|
|
|
+ BigDecimal income = new BigDecimal(getReceiptInvoiceByReimbursementId); //发票收入
|
|
|
|
+ if(new BigDecimal("0").compareTo(income) == 0){
|
|
|
|
+ map.put("success", false);
|
|
|
|
+ map.put("message", "该业务可报销额度为0,无法进行报销");
|
|
|
|
+ return map;
|
|
|
|
+ }
|
|
|
|
+ //根据业务id查询报销比例
|
|
|
|
+ String getReimbursementRatioByReimbursementId = reimbursementSysMapper.getReimbursementRatioByReimbursementId(reimbursementUser.getBusinessCodeId());
|
|
|
|
+ if(StringUtils.isBlank(getReimbursementRatioByReimbursementId)){
|
|
|
|
+ map.put("success", false);
|
|
|
|
+ map.put("message", "该业务报销比例为0,无法进行报销");
|
|
|
|
+ return map;
|
|
|
|
+ }
|
|
|
|
+ BigDecimal reimbursementRatio = new BigDecimal(getReimbursementRatioByReimbursementId); //报销比例
|
|
|
|
+ BigDecimal canReimbursementAmount = income.multiply(reimbursementRatio).divide(new BigDecimal("100")).setScale(2, BigDecimal.ROUND_HALF_UP); //该项目可报销额度计算
|
|
|
|
+ //查询该业务总报销额度
|
|
|
|
+ String alreadyReimbursementQuotaByBusinessCodeId = mapper.getAlreadyReimbursementQuotaByBusinessCodeId(reimbursementUser);
|
|
|
|
+ BigDecimal allAlreadyReimbursementQuota = new BigDecimal(alreadyReimbursementQuotaByBusinessCodeId); //总报销额度
|
|
|
|
+ //往期加这次的总报销额度和当年的总报销额度进行比较,小于当年报销额度 则个人可以进行报销,否则,无法进行报销
|
|
|
|
+ if(allAlreadyReimbursementQuota.add(reimbursementAmount).compareTo(canReimbursementAmount) == 1){
|
|
|
|
+ map.put("success", false);
|
|
|
|
+ map.put("message", "本次报销金额已超出该业务可报销额度所剩余额,无法进行报销");
|
|
|
|
+ return map;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ UserDTO user = UserUtils.get(reimbursementUser.getUserId());
|
|
|
|
+
|
|
|
|
+ reimbursementUser.setReimbursementAmount(reimbursementAmount.toString());
|
|
|
|
+ if(StringUtils.isNotBlank(reimbursementUser.getId())){
|
|
|
|
+ reimbursementUser.preUpdate();
|
|
|
|
+ //新增
|
|
|
|
+ mapper.update(reimbursementUser);
|
|
|
|
+ }else{
|
|
|
|
+ reimbursementUser.preInsert();
|
|
|
|
+ //新增
|
|
|
|
+ mapper.save(reimbursementUser);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ map.put("success", true);
|
|
|
|
+ map.put("message", user.getName() + "报销" + reimbursementUser.getReimbursementAmount() + "金额成功");
|
|
|
|
+ return map;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public void update(ReimbursementBusinessDTO reimbursementUser) {
|
|
|
|
+ mapper.update(reimbursementUser);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public void delete(List<String> idList) {
|
|
|
|
+ //删除发票信息
|
|
|
|
+ mapper.delete(idList);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public List<ReimbursementBusinessDTO> findListByBusinessCodeId(ReimbursementBusinessDTO reimbursementBusiness) {
|
|
|
|
+ return mapper.findListByBusinessCodeId (reimbursementBusiness);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+}
|