Browse Source

事务管理--主营业务全部功能 事务管理联调修改bug

1021934019@qq.com 4 năm trước cách đây
mục cha
commit
5bb2f6033f

+ 4 - 0
blade-service-api/blade-project-api/src/main/java/org/springblade/project/entity/ServiceProject.java

@@ -102,4 +102,8 @@ public class ServiceProject extends TenantEntity implements Serializable {
 	@TableField(exist = false)
 	private List<ServiceProjectFiles> filesList;
 
+	//是否允许删除主表, 默认可以
+	@TableField(exist = false)
+	private Boolean allowDelete=true;
+
 }

+ 6 - 0
blade-service/blade-project/pom.xml

@@ -55,6 +55,12 @@
             <groupId>com.qiniu</groupId>
             <artifactId>qiniu-java-sdk</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.springblade</groupId>
+            <artifactId>blade-client-api</artifactId>
+            <version>2.8.2.RELEASE</version>
+            <scope>compile</scope>
+        </dependency>
         <!--<dependency>
             <groupId>org.springblade</groupId>
             <artifactId>blade-starter-transaction</artifactId>

+ 34 - 21
blade-service/blade-project/src/main/java/org/springblade/project/controller/ProjectController.java

@@ -15,6 +15,7 @@ import org.springblade.project.entity.ServiceProjectItem;
 import org.springblade.project.service.ServiceProjectFilesService;
 import org.springblade.project.service.ServiceProjectItemService;
 import org.springblade.project.service.ServiceProjectService;
+import org.springblade.system.user.feign.IUserClient;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.util.CollectionUtils;
 import org.springframework.web.bind.annotation.*;
@@ -41,6 +42,7 @@ public class ProjectController {
 	@Autowired
 	private ServiceProjectFilesService serviceProjectFilesService;
 
+
 	@GetMapping("/list")
 	public R<IPage<?>> list(@RequestParam(name = "current", defaultValue = "1") Integer current,
 							@RequestParam(name = "size", defaultValue = "10") Integer size,
@@ -65,10 +67,28 @@ public class ProjectController {
 		Page<ServiceProject> page = new Page<>(current, size);
 		IPage<ServiceProject> iPage = serviceProjectService.page(page, serviceProjectLambdaQueryWrapper);
 		List<ServiceProject> records = iPage.getRecords();
+		//检查是否可以删除主表,没有字表信息 或者 字表status全部为0 就可以删除
+		LambdaQueryWrapper<ServiceProjectItem> lambdaQueryWrapper=new LambdaQueryWrapper<>();
+		if(flag==0)
+		{
+			records.forEach(k->{
+				lambdaQueryWrapper
+					.eq(ServiceProjectItem::getIsDeleted,0)
+					.eq(ServiceProjectItem::getPId,k.getId())
+				    .gt(ServiceProjectItem::getStatus,0);
+				List<ServiceProjectItem> projectItemList = serviceProjectItemService.list(lambdaQueryWrapper);
+				if(!CollectionUtils.isEmpty(projectItemList))
+				{
+					k.setAllowDelete(false);
+				}
+			});
+
+		}
+		//flag=1为
 		if(flag==1)
 		{
 			records.forEach(e->{
-				LambdaQueryWrapper<ServiceProjectItem> lambdaQueryWrapper=new LambdaQueryWrapper<>();
+
 				lambdaQueryWrapper
 					.eq(ServiceProjectItem::getStatus,2)
 					.eq(ServiceProjectItem::getIsDeleted,0)
@@ -80,7 +100,6 @@ public class ProjectController {
 			iPage.setRecords(collect);
 		}
 
-
 		return R.data(iPage);
 
 	}
@@ -102,26 +121,26 @@ public class ProjectController {
 
 	@GetMapping("findById")
 	public R<?> findById(@RequestParam(name = "id", required = true) Long id,
-						 @RequestParam(name = "itemStatus", required = true) Integer itemStatus)
+						 @RequestParam(name = "itemStatus", required = true) String itemStatus)
 	{
 		ServiceProject serviceProject = serviceProjectService.getById(id);
-
+		List<String> status=Arrays.asList(itemStatus.split(","));
 		LambdaQueryWrapper<ServiceProjectItem> itemServiceLambdaQueryWrapper=new LambdaQueryWrapper<>();
-		itemServiceLambdaQueryWrapper.eq(ServiceProjectItem::getStatus,itemStatus).eq(ServiceProjectItem::getPId,id).eq(ServiceProjectItem::getIsDeleted,0);
+		itemServiceLambdaQueryWrapper.in(ServiceProjectItem::getStatus,status).eq(ServiceProjectItem::getPId,id).eq(ServiceProjectItem::getIsDeleted,0);
 		List<ServiceProjectItem> serviceProjectItems = serviceProjectItemService.list(itemServiceLambdaQueryWrapper);
-/*
+
 		LambdaQueryWrapper<ServiceProjectFiles> filesLambdaQueryWrapper=new LambdaQueryWrapper<>();
 		filesLambdaQueryWrapper.eq(ServiceProjectFiles::getPId,id).eq(ServiceProjectFiles::getIsDeleted,0);
-		List<ServiceProjectFiles> filesList = serviceProjectFilesService.list(filesLambdaQueryWrapper);*/
+		List<ServiceProjectFiles> filesList = serviceProjectFilesService.list(filesLambdaQueryWrapper);
 
 		if(!CollectionUtils.isEmpty(serviceProjectItems))
 		{
 			serviceProject.setItemList(serviceProjectItems);
 		}
-		/*if(!CollectionUtils.isEmpty(filesList))
+		if(!CollectionUtils.isEmpty(filesList))
 		{
 			serviceProject.setFilesList(filesList);
-		}*/
+		}
 
 		return R.data(serviceProject);
 	}
@@ -130,18 +149,7 @@ public class ProjectController {
 	public R check(@RequestParam(name = "id", required = true) Long itemId
 		          ,@RequestParam(name = "status", required = true) int status)
 	{
-		ServiceProjectItem projectItem = serviceProjectItemService.getById(itemId);
-		if(projectItem==null)
-		{
-			throw new RuntimeException("请确认传入id正确");
-		}
-
-		ServiceProjectItem serviceProjectItem=new ServiceProjectItem();
-		    serviceProjectItem.setId(itemId);
-		    serviceProjectItem.setUpdateTime(new Date());
-		    serviceProjectItem.setUpdateUser(SecureUtil.getUserId());
-		    serviceProjectItem.setStatus(status);
-			serviceProjectItemService.updateById(serviceProjectItem);
+		    serviceProjectService.updateItemStatus(itemId,status);
 			return R.success("操作完成");
 	}
 
@@ -164,6 +172,11 @@ public class ProjectController {
 		  return R.data(iPage);
 	}
 
+    @GetMapping("getSysNo")
+	public R getSysNo()
+	{
+       return serviceProjectService.getSysNo();
+	}
 
 
 

+ 5 - 0
blade-service/blade-project/src/main/java/org/springblade/project/service/ServiceProjectService.java

@@ -5,6 +5,7 @@ package org.springblade.project.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import org.springblade.core.mp.base.BaseService;
+import org.springblade.core.tool.api.R;
 import org.springblade.project.entity.ServiceProject;
 import org.springblade.project.entity.ServiceProjectItem;
 
@@ -22,4 +23,8 @@ public interface ServiceProjectService extends BaseService<ServiceProject>
 {
     void modify(ServiceProject serviceProject);
 
+    R getSysNo();
+
+    void updateItemStatus(Long itemId,int status);
+
 }

+ 114 - 1
blade-service/blade-project/src/main/java/org/springblade/project/service/impl/ServiceProjectServiceImpl.java

@@ -3,20 +3,25 @@ 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;
@@ -30,6 +35,8 @@ public class ServiceProjectServiceImpl extends BaseServiceImpl<ServiceProjectMap
    private ServiceProjectMapper serviceProjectMapper;
    @Autowired
    private ServiceProjectItemMapper serviceProjectItemMapper;
+   @Autowired
+   private ISerialClient serialClient;//生成系统编号
 
 	@Override
 	@Transactional
@@ -39,7 +46,13 @@ public class ServiceProjectServiceImpl extends BaseServiceImpl<ServiceProjectMap
       //新增操作,不用考虑子项问题,子项必然是新增
       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());
@@ -136,6 +149,106 @@ public class ServiceProjectServiceImpl extends BaseServiceImpl<ServiceProjectMap
 			}
 		  }
 	  }
+        //检查明细总金额是否超过主表总金额
+		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("操作失败,明细总金额大于合同金额");
+		}
 	}
 }