|
|
@@ -0,0 +1,254 @@
|
|
|
+package org.springblade.project.service.impl;
|
|
|
+
|
|
|
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
+import jdk.nashorn.internal.ir.CallNode;
|
|
|
+import net.logstash.logback.encoder.org.apache.commons.lang3.StringUtils;
|
|
|
+import org.springblade.client.feign.ISerialClient;
|
|
|
+import org.springblade.core.mp.base.BaseService;
|
|
|
+import org.springblade.core.mp.base.BaseServiceImpl;
|
|
|
+import org.springblade.core.secure.utils.SecureUtil;
|
|
|
+import org.springblade.core.tool.api.R;
|
|
|
+import org.springblade.project.entity.ServiceProject;
|
|
|
+import org.springblade.project.entity.ServiceProjectItem;
|
|
|
+import org.springblade.project.mapper.ServiceProjectItemMapper;
|
|
|
+import org.springblade.project.mapper.ServiceProjectMapper;
|
|
|
+import org.springblade.project.service.ServiceProjectItemService;
|
|
|
+import org.springblade.project.service.ServiceProjectService;
|
|
|
+import org.springframework.beans.BeanUtils;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+import org.springframework.transaction.annotation.Transactional;
|
|
|
+import org.springframework.transaction.interceptor.TransactionAspectSupport;
|
|
|
+import org.springframework.util.CollectionUtils;
|
|
|
+
|
|
|
+import java.math.BigDecimal;
|
|
|
+import java.util.Date;
|
|
|
+import java.util.List;
|
|
|
+import java.util.Map;
|
|
|
+import java.util.stream.Collectors;
|
|
|
+
|
|
|
+
|
|
|
+@Service
|
|
|
+public class ServiceProjectServiceImpl extends BaseServiceImpl<ServiceProjectMapper, ServiceProject> implements ServiceProjectService
|
|
|
+{
|
|
|
+ @Autowired
|
|
|
+ private ServiceProjectMapper serviceProjectMapper;
|
|
|
+ @Autowired
|
|
|
+ private ServiceProjectItemMapper serviceProjectItemMapper;
|
|
|
+ @Autowired
|
|
|
+ private ISerialClient serialClient;//生成系统编号
|
|
|
+
|
|
|
+ @Override
|
|
|
+ @Transactional
|
|
|
+ public void modify(ServiceProject serviceProject)
|
|
|
+ {
|
|
|
+ List<ServiceProjectItem> itemList = serviceProject.getItemList();
|
|
|
+ //新增操作,不用考虑子项问题,子项必然是新增
|
|
|
+ if(serviceProject.getId()==null)
|
|
|
+ {
|
|
|
+ BigDecimal debitAmount = serviceProject.getDebitAmount();//合同总金额
|
|
|
+ BigDecimal settlmentAmount = serviceProject.getSettlmentAmount();//已收金额
|
|
|
+ BigDecimal balanceAmount = serviceProject.getBalanceAmount();//未收金额
|
|
|
+ if(balanceAmount.add(settlmentAmount).compareTo(debitAmount)!=0)
|
|
|
+ {
|
|
|
+ throw new RuntimeException("已收金额+未收金额≠合同总金额,请确认后提交");
|
|
|
+ }
|
|
|
+ serviceProject.setCreateTime(new Date());
|
|
|
+ serviceProject.setCreateUser(SecureUtil.getUserId());
|
|
|
+ serviceProject.setCreateUserName(SecureUtil.getUser().getRoleName());
|
|
|
+ serviceProjectMapper.insert(serviceProject);
|
|
|
+ if(!CollectionUtils.isEmpty(itemList))
|
|
|
+ {
|
|
|
+ itemList.forEach(e->{
|
|
|
+ e.setPId(serviceProject.getId());
|
|
|
+ e.setCreateTime(new Date());
|
|
|
+ e.setCreateUser(SecureUtil.getUserId());
|
|
|
+ e.setCreateUserName(SecureUtil.getUser().getRoleName());
|
|
|
+ serviceProjectItemMapper.insert(e);
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //修改操作,则需要判断子项是否为新增、修改、删除
|
|
|
+ else
|
|
|
+ {
|
|
|
+ //操作主表
|
|
|
+ serviceProjectMapper.updateById(serviceProject);
|
|
|
+ //操作字表,查询之前的子项记录
|
|
|
+ LambdaQueryWrapper<ServiceProjectItem> itemLambdaQueryWrapper=new LambdaQueryWrapper<>();
|
|
|
+ itemLambdaQueryWrapper
|
|
|
+ .eq(ServiceProjectItem::getIsDeleted,0)
|
|
|
+ .eq(ServiceProjectItem::getPId,serviceProject.getId());
|
|
|
+ List<ServiceProjectItem> originServiceProjectItems = serviceProjectItemMapper.selectList(itemLambdaQueryWrapper);
|
|
|
+
|
|
|
+ if(!CollectionUtils.isEmpty(itemList))
|
|
|
+ {
|
|
|
+ //判断新增或者修改操作
|
|
|
+ itemList.forEach(ls->{
|
|
|
+ //修改
|
|
|
+ if(null!=ls.getId())
|
|
|
+ {
|
|
|
+ ls.setUpdateUser(SecureUtil.getUserId());
|
|
|
+ ls.setUpdateTime(new Date());
|
|
|
+ ls.setUpdateUserName(SecureUtil.getUser().getRoleName());
|
|
|
+ serviceProjectItemMapper.updateById(ls);
|
|
|
+ }
|
|
|
+ //新增
|
|
|
+ else
|
|
|
+ {
|
|
|
+ ls.setPId(serviceProject.getId());
|
|
|
+ ls.setCreateTime(new Date());
|
|
|
+ ls.setCreateUser(SecureUtil.getUserId());
|
|
|
+ String deptId = SecureUtil.getDeptId();
|
|
|
+ ls.setCreateDept(StringUtils.isNoneBlank(deptId)?Long.valueOf(deptId):-1);
|
|
|
+ ls.setCreateUserName(SecureUtil.getUser().getRoleName());
|
|
|
+ serviceProjectItemMapper.insert(ls);
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+
|
|
|
+ //查询原来的子项集合 与 传入的子项进行比较, 判断是否删除
|
|
|
+ if(!CollectionUtils.isEmpty(originServiceProjectItems))
|
|
|
+ {
|
|
|
+ //先删除操作,开始比较id
|
|
|
+ List<Long> oringinIds = originServiceProjectItems.stream().map(ServiceProjectItem::getId).collect(Collectors.toList());
|
|
|
+ List<Long> newIds = itemList.stream().map(ServiceProjectItem::getId).collect(Collectors.toList());
|
|
|
+ //id取交集,交集之外的id可以删除
|
|
|
+ oringinIds.removeAll(newIds);
|
|
|
+ if(!CollectionUtils.isEmpty(oringinIds))
|
|
|
+ {
|
|
|
+ //查询删除
|
|
|
+ LambdaQueryWrapper<ServiceProjectItem> delete=new LambdaQueryWrapper<>();
|
|
|
+ delete
|
|
|
+ .eq(ServiceProjectItem::getPId,serviceProject.getId())
|
|
|
+ .in(!CollectionUtils.isEmpty(oringinIds),ServiceProjectItem::getId,oringinIds);
|
|
|
+ List<ServiceProjectItem> deleteList = serviceProjectItemMapper.selectList(delete);
|
|
|
+ if(!CollectionUtils.isEmpty(deleteList))
|
|
|
+ {
|
|
|
+ deleteList.forEach(e->{
|
|
|
+ e.setUpdateUser(SecureUtil.getUserId());
|
|
|
+ e.setUpdateTime(new Date());
|
|
|
+ e.setUpdateUserName(SecureUtil.getUser().getRoleName());
|
|
|
+ serviceProjectItemMapper.deleteById(e.getId());
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ //如果itemList为空,代表删除之前所有子项
|
|
|
+ if(!CollectionUtils.isEmpty(originServiceProjectItems))
|
|
|
+ {
|
|
|
+ originServiceProjectItems.forEach(it->{
|
|
|
+ it.setUpdateUser(SecureUtil.getUserId());
|
|
|
+ it.setUpdateTime(new Date());
|
|
|
+ it.setUpdateUserName(SecureUtil.getUser().getRoleName());
|
|
|
+ serviceProjectItemMapper.deleteById(it.getId());
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //检查明细总金额是否超过主表总金额
|
|
|
+ LambdaQueryWrapper<ServiceProjectItem> itemLambdaQueryWrapper=new LambdaQueryWrapper();
|
|
|
+ itemLambdaQueryWrapper.eq(ServiceProjectItem::getPId,serviceProject.getId());
|
|
|
+ List<ServiceProjectItem> serviceProjectItems = serviceProjectItemMapper.selectList(itemLambdaQueryWrapper);
|
|
|
+
|
|
|
+ checkMoney(serviceProject.getId(),serviceProjectItems);
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ @Transactional
|
|
|
+ public synchronized R getSysNo()
|
|
|
+ {
|
|
|
+ R billNo = serialClient.getBillNo("XM");
|
|
|
+ if (billNo.getCode() != 200){
|
|
|
+ TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
|
|
|
+ throw new RuntimeException("生成系统编号失败");
|
|
|
+ }
|
|
|
+ return billNo;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void updateItemStatus(Long itemId, int status)
|
|
|
+ {
|
|
|
+ ServiceProjectItem serviceProjectItem = serviceProjectItemMapper.selectById(itemId);
|
|
|
+
|
|
|
+ if(serviceProjectItem==null)
|
|
|
+ {
|
|
|
+ throw new RuntimeException("请确认传入id正确");
|
|
|
+ }
|
|
|
+ //明细已请核之后, 修改主表的status状态为1
|
|
|
+ if(status==1)
|
|
|
+ {
|
|
|
+ ServiceProject serviceProject=new ServiceProject();
|
|
|
+ serviceProject.setStatus(1);
|
|
|
+ serviceProject.setId(serviceProjectItem.getPId());
|
|
|
+ serviceProject.setUpdateUser(SecureUtil.getUserId());
|
|
|
+ serviceProject.setUpdateTime(new Date());
|
|
|
+ serviceProject.setUpdateUserName(SecureUtil.getUser().getRoleName());
|
|
|
+ serviceProjectMapper.updateById(serviceProject);
|
|
|
+ }
|
|
|
+ //明细已结算之后, 修改主表的已收款项 和 未收款项
|
|
|
+ else if(status==5)
|
|
|
+ {
|
|
|
+
|
|
|
+ ServiceProject targetServiceProject = serviceProjectMapper.selectById(serviceProjectItem.getPId());
|
|
|
+ //主表已收款项增加
|
|
|
+ targetServiceProject.setSettlmentAmount(targetServiceProject.getSettlmentAmount().add(serviceProjectItem.getAmount()));
|
|
|
+ //主表未收款项减少
|
|
|
+ targetServiceProject.setBalanceAmount(targetServiceProject.getBalanceAmount().subtract(serviceProjectItem.getAmount()));
|
|
|
+ targetServiceProject.setUpdateUser(SecureUtil.getUserId());
|
|
|
+ targetServiceProject.setUpdateTime(new Date());
|
|
|
+ targetServiceProject.setUpdateUserName(SecureUtil.getUser().getRoleName());
|
|
|
+ serviceProjectMapper.updateById(targetServiceProject);
|
|
|
+
|
|
|
+ }
|
|
|
+ //撤回
|
|
|
+ else if(status==6)
|
|
|
+ {
|
|
|
+ ServiceProject targetServiceProject = serviceProjectMapper.selectById(serviceProjectItem.getPId());
|
|
|
+
|
|
|
+ //撤回时候,主表已收款项减少
|
|
|
+ targetServiceProject.setSettlmentAmount(targetServiceProject.getSettlmentAmount().subtract(serviceProjectItem.getAmount()));
|
|
|
+ //撤回时候,主表未收款项增加
|
|
|
+ targetServiceProject.setBalanceAmount(targetServiceProject.getBalanceAmount().add(serviceProjectItem.getAmount()));
|
|
|
+ targetServiceProject.setUpdateUser(SecureUtil.getUserId());
|
|
|
+ targetServiceProject.setUpdateTime(new Date());
|
|
|
+ targetServiceProject.setUpdateUserName(SecureUtil.getUser().getRoleName());
|
|
|
+ serviceProjectMapper.updateById(targetServiceProject);
|
|
|
+ }
|
|
|
+ ServiceProjectItem updateModel=new ServiceProjectItem();
|
|
|
+ updateModel.setId(itemId);
|
|
|
+ updateModel.setUpdateTime(new Date());
|
|
|
+ updateModel.setUpdateUser(SecureUtil.getUserId());
|
|
|
+ //status=6代表撤回, item状态回到4
|
|
|
+ if(status==6)
|
|
|
+ {
|
|
|
+ updateModel.setStatus(4);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ updateModel.setStatus(status);
|
|
|
+ }
|
|
|
+ serviceProjectItemMapper.updateById(updateModel);
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ public void checkMoney(Long serviceId,List<ServiceProjectItem> items)
|
|
|
+ {
|
|
|
+ ServiceProject serviceProject = serviceProjectMapper.selectById(serviceId);
|
|
|
+ //合同金额
|
|
|
+ BigDecimal debitAmount = serviceProject.getDebitAmount();
|
|
|
+ //子项总金额
|
|
|
+ BigDecimal decimal = items.stream()
|
|
|
+ .filter(it -> it.getAmount() != null)
|
|
|
+ .map(ServiceProjectItem::getAmount)
|
|
|
+ .reduce(BigDecimal.ZERO, BigDecimal::add);
|
|
|
+ if(decimal.compareTo(debitAmount)==1)
|
|
|
+ {
|
|
|
+ throw new RuntimeException("操作失败,明细总金额大于合同金额");
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|