Browse Source

Merge remote-tracking branch 'origin/dev' into dev

lazhaoqian 4 years ago
parent
commit
50adfcdcd7
37 changed files with 1214 additions and 27 deletions
  1. 2 0
      blade-service-api/blade-check-api/src/main/java/org/springblade/check/entity/AuditProecess.java
  2. 2 1
      blade-service-api/blade-client-api/src/main/java/org/springblade/client/entity/GoodsDesc.java
  3. 3 0
      blade-service-api/blade-project-api/src/main/java/org/springblade/project/entity/ServiceProject.java
  4. 2 0
      blade-service-api/blade-project-api/src/main/java/org/springblade/project/entity/ServiceProjectItem.java
  5. 37 0
      blade-service-api/blade-project-api/src/main/java/org/springblade/project/feign/IProjectClient.java
  6. 4 0
      blade-service-api/blade-project-api/src/main/java/org/springblade/project/feign/IProjectItemClient.java
  7. 2 0
      blade-service-api/blade-purchase-sales-api/src/main/java/org/springblade/purchase/sales/entity/Order.java
  8. 33 0
      blade-service-api/blade-purchase-sales-api/src/main/java/org/springblade/purchase/sales/feign/IOrderCheckClient.java
  9. 3 0
      blade-service-api/trade-finance-api/src/main/java/org/springblade/finance/vojo/Settlement.java
  10. 6 0
      blade-service/blade-check/pom.xml
  11. 32 2
      blade-service/blade-check/src/main/java/org/springblade/check/controller/AuditProecessController.java
  12. 2 0
      blade-service/blade-check/src/main/java/org/springblade/check/entity/AuditProecess.java
  13. 4 0
      blade-service/blade-check/src/main/java/org/springblade/check/service/IAuditProecessService.java
  14. 379 1
      blade-service/blade-check/src/main/java/org/springblade/check/service/impl/AuditProecessServiceImpl.java
  15. 1 0
      blade-service/blade-client/src/main/java/org/springblade/client/corps/controller/CorpsDescController.java
  16. 21 4
      blade-service/blade-client/src/main/java/org/springblade/client/goods/controller/GoodsDescController.java
  17. 1 1
      blade-service/blade-client/src/main/java/org/springblade/client/goods/excel/GoodsOutExcel.java
  18. 35 0
      blade-service/blade-mocha-item/src/main/java/org/springblade/mocha/controller/SalesPolicyController.java
  19. 29 0
      blade-service/blade-mocha-item/src/main/java/org/springblade/mocha/excel/SalesItemExcel.java
  20. 11 0
      blade-service/blade-mocha-item/src/main/java/org/springblade/mocha/service/ISalesPolicyService.java
  21. 53 0
      blade-service/blade-mocha-item/src/main/java/org/springblade/mocha/service/impl/SalesPolicyServiceImpl.java
  22. 6 0
      blade-service/blade-project/pom.xml
  23. 263 5
      blade-service/blade-project/src/main/java/org/springblade/project/controller/ProjectController.java
  24. 1 0
      blade-service/blade-project/src/main/java/org/springblade/project/feign/ProjectItemClient.java
  25. 3 1
      blade-service/blade-project/src/main/java/org/springblade/project/mapper/ServiceProjectItemMapper.java
  26. 48 1
      blade-service/blade-project/src/main/java/org/springblade/project/mapper/ServiceProjectItemMapper.xml
  27. 1 1
      blade-service/blade-project/src/main/java/org/springblade/project/service/ServiceProjectItemService.java
  28. 3 1
      blade-service/blade-project/src/main/java/org/springblade/project/service/ServiceProjectService.java
  29. 3 2
      blade-service/blade-project/src/main/java/org/springblade/project/service/impl/ServiceProjectItemServiceImpl.java
  30. 52 3
      blade-service/blade-project/src/main/java/org/springblade/project/service/impl/ServiceProjectServiceImpl.java
  31. 6 0
      blade-service/blade-purchase-sales/pom.xml
  32. 40 0
      blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/controller/OrderController.java
  33. 5 0
      blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/service/IOrderService.java
  34. 1 1
      blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/service/impl/OrderFeesServiceImpl.java
  35. 86 0
      blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/service/impl/OrderServiceImpl.java
  36. 1 0
      blade-service/trade-finance/src/main/java/org/springblade/finance/controller/AccController.java
  37. 33 3
      blade-service/trade-finance/src/main/java/org/springblade/finance/service/impl/SettlementServiceImpl.java

+ 2 - 0
blade-service-api/blade-check-api/src/main/java/org/springblade/check/entity/AuditProecess.java

@@ -134,5 +134,7 @@ public class AuditProecess implements Serializable {
 
 		private String pageStatus;
 
+		private String checkType;
+
 
 }

+ 2 - 1
blade-service-api/blade-client-api/src/main/java/org/springblade/client/entity/GoodsDesc.java

@@ -225,7 +225,8 @@ public class GoodsDesc implements Serializable {
 	@ApiModelProperty(value = "兑换积分")
 	private BigDecimal integral;
 
-
+	@TableField(exist = false)
+    private String goodsTypeName;
 
 
 

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

@@ -165,4 +165,7 @@ public class ServiceProject  implements Serializable {
 
 	@TableField(exist = false)
 	private Integer countUserName;
+
+	@TableField(exist = false)
+	private BigDecimal total;
 }

+ 2 - 0
blade-service-api/blade-project-api/src/main/java/org/springblade/project/entity/ServiceProjectItem.java

@@ -167,6 +167,8 @@ public class ServiceProjectItem extends TenantEntity implements Serializable {
 
 	@TableField(exist = false)
 	private Integer countCorp;
+	@TableField(exist = false)
+	private BigDecimal total;
 
 
 }

+ 37 - 0
blade-service-api/blade-project-api/src/main/java/org/springblade/project/feign/IProjectClient.java

@@ -0,0 +1,37 @@
+package org.springblade.project.feign;
+
+
+import org.springblade.core.tool.api.R;
+import org.springblade.project.entity.ServiceProject;
+import org.springblade.project.entity.ServiceProjectItem;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import java.util.Date;
+
+@FeignClient(
+	value = "trade-project"
+)
+/**
+ * 商品信息对外访问API
+ */
+public interface IProjectClient {
+
+	@PostMapping("/project/modify")
+	R edit(@RequestBody ServiceProject serviceProject);
+
+	@PostMapping("/project/projectPassCheck")
+	R projectPassCheck(@RequestParam("id") Long id);
+
+	@PostMapping("/settlement/projectPassCancel")
+	R projectPassCancel(@RequestParam("id") Long id);
+
+
+
+
+
+
+}

+ 4 - 0
blade-service-api/blade-project-api/src/main/java/org/springblade/project/feign/IProjectItemClient.java

@@ -2,10 +2,12 @@ package org.springblade.project.feign;
 
 
 import org.springblade.core.tool.api.R;
+import org.springblade.project.entity.ServiceProject;
 import org.springblade.project.entity.ServiceProjectItem;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestParam;
 
 import java.util.Date;
@@ -41,4 +43,6 @@ public interface IProjectItemClient {
 	public ServiceProjectItem findItemById(@RequestParam(name = "id", required = true) Long itemId);
 
 
+
+
 }

+ 2 - 0
blade-service-api/blade-purchase-sales-api/src/main/java/org/springblade/purchase/sales/entity/Order.java

@@ -701,4 +701,6 @@ public class Order implements Serializable {
 
 	@TableField(exist = false)
 	private BigDecimal actualWeight;
+	@TableField(exist = false)
+	private String checkType;
 }

+ 33 - 0
blade-service-api/blade-purchase-sales-api/src/main/java/org/springblade/purchase/sales/feign/IOrderCheckClient.java

@@ -0,0 +1,33 @@
+package org.springblade.purchase.sales.feign;
+
+
+import org.springblade.common.constant.LauncherConstant;
+import org.springblade.core.tool.api.R;
+import org.springblade.purchase.sales.entity.Order;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import javax.validation.Valid;
+
+/**
+ * @author caifc
+ * @date 2021-10-21 22:28
+ */
+@FeignClient(
+	value = "blade-purchase-sales"
+)
+public interface IOrderCheckClient
+{
+	@PostMapping("/order/passCheck")
+	R passCheck(@RequestParam("id") Long id);
+
+	@PostMapping("/order/passCancel")
+	R passCancel(@RequestParam("id") Long id);
+
+
+	@PostMapping("order/submit")
+	R submit(@Valid @RequestBody Order order);
+}

+ 3 - 0
blade-service-api/trade-finance-api/src/main/java/org/springblade/finance/vojo/Settlement.java

@@ -235,4 +235,7 @@ public class Settlement  implements Serializable {
 
 	private String itemType;
 
+	@TableField(exist = false)
+	private String checkType;
+
 }

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

@@ -93,6 +93,12 @@
             <version>2.8.2.RELEASE</version>
             <scope>compile</scope>
         </dependency>
+        <dependency>
+            <groupId>org.springblade</groupId>
+            <artifactId>blade-project-api</artifactId>
+            <version>2.8.2.RELEASE</version>
+            <scope>compile</scope>
+        </dependency>
     </dependencies>
 
 

+ 32 - 2
blade-service/blade-check/src/main/java/org/springblade/check/controller/AuditProecessController.java

@@ -215,10 +215,40 @@ public class AuditProecessController extends BladeController {
 
 	@PostMapping("operationFinanceProcess")
 	@ApiOperationSupport(order = 2)
-	@ApiOperation(value = "操作-财务审批流记录", notes = "传入auditProecessDTO")
+	@ApiOperation(value = "操作-公共审批-根据checkType区别", notes = "传入auditProecessDTO")
 	public  R operationFinanceProcess(@RequestBody AuditProecess auditProecess)
 	{
-		auditProecessService.operationFinanceProcess(auditProecess);
+		AuditProecess proecess = auditProecessService.getById(auditProecess.getId());
+		if(proecess==null)
+		{
+			throw new SecurityException("审核失败,查无此记录");
+		}
+		if(StringUtils.isBlank(proecess.getCheckType()))
+		{
+			throw new SecurityException("审核失败,未填写审批类型");
+		}
+        if(proecess.getCheckType().equals("ffsq"))
+        {
+			auditProecessService.operationFinanceProcess(auditProecess);
+		}
+        else if(proecess.getCheckType().equals("xsqh"))
+        {
+			auditProecessService.orderCheckProcess(auditProecess);
+		}
+        else
+		{
+			throw new SecurityException("此审批类型未查到相关审批类型");
+		}
+
+		return R.data(auditProecess);
+	}
+
+	@PostMapping("orderCheckProcess")
+	@ApiOperationSupport(order = 2)
+	@ApiOperation(value = "操作-财务审批流记录", notes = "传入auditProecessDTO")
+	public  R orderCheckProcess(@RequestBody AuditProecess auditProecess)
+	{
+		auditProecessService.orderCheckProcess(auditProecess);
 		return R.data(auditProecess);
 	}
 

+ 2 - 0
blade-service/blade-check/src/main/java/org/springblade/check/entity/AuditProecess.java

@@ -152,4 +152,6 @@ public class AuditProecess implements Serializable {
 
 	    private String pageLabel;
 
+	    private String checkType;
+
 }

+ 4 - 0
blade-service/blade-check/src/main/java/org/springblade/check/service/IAuditProecessService.java

@@ -45,6 +45,10 @@ public interface IAuditProecessService extends IService<AuditProecess> {
 
 	void operationFinanceProcess(AuditProecess auditProecess);
 
+	void serverProcess(AuditProecess auditProecess);
+
+	void orderCheckProcess(AuditProecess auditProecess);
+
 	void batchOperation(List<AuditProecess> processLis,Integer operate,String auditMsg);
 
 	void cancelCheck(Long srcBillId);

+ 379 - 1
blade-service/blade-check/src/main/java/org/springblade/check/service/impl/AuditProecessServiceImpl.java

@@ -35,7 +35,11 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import io.seata.spring.annotation.GlobalTransactional;
 import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.finance.vojo.Settlement;
+import org.springblade.project.entity.ServiceProject;
+import org.springblade.project.feign.IProjectClient;
+import org.springblade.project.feign.IProjectItemClient;
 import org.springblade.purchase.sales.entity.Order;
+import org.springblade.purchase.sales.feign.IOrderCheckClient;
 import org.springblade.purchase.sales.feign.IOrderDescClient;
 import org.springframework.stereotype.Service;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -66,6 +70,12 @@ public class AuditProecessServiceImpl extends ServiceImpl<AuditProecessMapper, A
 
     private IOrderDescClient orderDescClient;
 
+    private IProjectItemClient iProjectItemClient;
+
+    private IProjectClient iProjectClient;
+
+    private IOrderCheckClient orderCheckClient;
+
 	@Override
 	public IPage<AuditProecessVO> selectAuditProecessPage(IPage<AuditProecessVO> page, AuditProecessVO auditProecess) {
 		return page.setRecords(baseMapper.selectAuditProecessPage(page, auditProecess));
@@ -119,6 +129,7 @@ public class AuditProecessServiceImpl extends ServiceImpl<AuditProecessMapper, A
 			auditProecess.setProcessType(auditProecessDTO.getProcessType());
 			auditProecess.setUrl(auditProecessDTO.getUrl());
 			auditProecess.setBatchNo(finalCurrent);
+			auditProecess.setCheckType(auditProecessDTO.getCheckType());
 			//除了第一级是待审,其他都N
 			if(e.getLevelId()==1)
 			{
@@ -342,12 +353,379 @@ public class AuditProecessServiceImpl extends ServiceImpl<AuditProecessMapper, A
 	@Override
 	@Transactional
 	@GlobalTransactional
+	public void serverProcess(AuditProecess auditProecess)
+	{
+
+		//查看最新操作记录,防止重复提交
+		AuditProecess auditProecess1= baseMapper.selectById(auditProecess.getId());
+		if(auditProecess1==null)
+		{
+			throw new SecurityException("未查到此审批记录,禁止操作");
+		}
+		if(auditProecess1.getAuditStatus().equals("A")||auditProecess1.getAuditStatus().equals("B"))
+		{
+			throw new SecurityException("当前记录已经完成审批,禁止重复操作");
+		}
+
+		if(auditProecess.getAuditStatus()==null || !auditProecess.getAuditStatus().equals("S"))
+		{
+			throw new SecurityException("审批状态非待审,禁止操作");
+		}
+		//信息
+		Message sendMessage=new Message();
+		sendMessage.setUserName(AuthUtil.getUserName());
+		sendMessage.setUserId(AuthUtil.getUserId());
+		sendMessage.setToUserId(auditProecess.getSendUserId());
+		sendMessage.setToUserName(auditProecess.getSendName());
+		sendMessage.setMessageType(1);
+		sendMessage.setTenantId(AuthUtil.getTenantId());
+		sendMessage.setCreateUser(AuthUtil.getUserId());
+		sendMessage.setCreateTime(new Date());
+		sendMessage.setUrl(auditProecess.getUrl());
+		sendMessage.setPageLabel(auditProecess.getPageLabel());
+		sendMessage.setPageStatus(auditProecess.getPageStatus());
+
+
+		//用户操作 1.通过  2.驳回
+		Integer operate = auditProecess.getOperate();
+		//查看当前审批是否为最后一级
+		String iffinalItem = auditProecess.getIffinalItem();
+		//审批人
+		auditProecess.setAuditUserId(String.valueOf(AuthUtil.getUserId()));
+		//审批时间
+		auditProecess.setAuditOpTime(new Date());
+		//不是最后一级
+		if(iffinalItem.equals("F"))
+		{
+
+
+			//通过
+			if(operate==1)
+			{
+				//如果是第一级, 则修改状态为审批中
+				if(auditProecess.getLevelId()==1)
+				{
+					ServiceProject serviceProject=new ServiceProject();
+					serviceProject.setId(auditProecess.getSrcBillId());
+					serviceProject.setStatus(2);
+					R submit = iProjectClient.edit(serviceProject);
+					if(!submit.isSuccess())
+					{
+						throw new SecurityException("审批开始修改审核状态失败");
+					}
+				}
+
+
+				auditProecess.setAuditStatus("A");
+				//查询下一级,开启待审
+				LambdaQueryWrapper<AuditProecess> auditProecessLambdaQueryWrapper=new LambdaQueryWrapper<>();
+				auditProecessLambdaQueryWrapper
+					.eq(AuditProecess::getBatchNo,auditProecess.getBatchNo())
+					.eq(AuditProecess::getSrcBillId,auditProecess.getSrcBillId())
+					.eq(AuditProecess::getIsDelete,0)
+					.eq(AuditProecess::getActId,auditProecess.getActId())
+					.eq(AuditProecess::getBillId,auditProecess.getBillId())
+					.eq(AuditProecess::getBillNo,auditProecess.getBillNo())
+					.eq(AuditProecess::getTenantId,AuthUtil.getTenantId())
+					.eq(AuditProecess::getLevelId,auditProecess.getLevelId()+1);
+				Integer count = baseMapper.selectCount(auditProecessLambdaQueryWrapper);
+				if(count!=null && count>1)
+				{
+					throw new SecurityException("审核失败,获取下一级信息失败");
+				}
+				AuditProecess proecess = baseMapper.selectOne(auditProecessLambdaQueryWrapper);
+				if(proecess==null)
+				{
+					throw new SecurityException("审批通过=>获取下一级信息失败");
+				}
+				proecess.setAuditStatus("S");
+				baseMapper.updateById(proecess);
+				Message message=new Message();
+				message.setUserName(AuthUtil.getUserName());
+				message.setUserId(AuthUtil.getUserId());
+				//消息通知下一级
+				message.setToUserId(Long.valueOf(proecess.getAuditUserId()));
+				message.setMessageType(1);
+				message.setTenantId(AuthUtil.getTenantId());
+				message.setMessageBody("你有新的审批待操作,请及时处理");
+				message.setCreateUser(AuthUtil.getUserId());
+				message.setUrl("/approveData/index");
+				message.setCreateTime(new Date());
+
+				R save = messageClient.save(message);
+				if(!save.isSuccess())
+				{
+					throw new SecurityException("发送消息失败");
+				}
+			}
+			//不通过
+			else if(operate==2)
+			{
+				auditProecess.setAuditStatus("B");
+				//todo 调用feign取消
+				R r = iProjectClient.projectPassCancel(auditProecess.getSrcBillId());
+				if(!r.isSuccess())
+				{
+					throw new SecurityException("修改财务数据失败");
+				}
+
+				sendMessage.setMessageBody("您的请核未通过,请查看原因");
+				R save = messageClient.save(sendMessage);
+				if(!save.isSuccess())
+				{
+					throw new SecurityException("发送消息失败");
+				}
+			}
+
+		}
+		//是最后一级
+		else if(iffinalItem.equals("T"))
+		{
+			//通过
+			if(operate==1)
+			{
+				//todo 调用feign直接通过
+				auditProecess.setAuditStatus("A");
+				R r = iProjectClient.projectPassCheck(auditProecess.getSrcBillId());
+				if(!r.isSuccess())
+				{
+					throw new SecurityException("修改财务数据失败");
+				}
+
+
+				sendMessage.setMessageBody("您的请核已通过,请继续操作");
+				R save = messageClient.save(sendMessage);
+				if(!save.isSuccess())
+				{
+					throw new SecurityException("发送消息失败");
+				}
+			}
+			//不通过
+			else if(operate==2)
+			{
+				//todo 调用feign取消
+				auditProecess.setAuditStatus("B");
+				R r = iProjectClient.projectPassCancel(auditProecess.getSrcBillId());
+				if(!r.isSuccess())
+				{
+					throw new SecurityException("修改财务数据失败");
+				}
+				sendMessage.setMessageBody("您的请核未通过,请查看原因");
+				R save = messageClient.save(sendMessage);
+				if(!save.isSuccess())
+				{
+					throw new SecurityException("发送消息失败");
+				}
+			}
+		}
+		else
+		{
+			throw new SecurityException("审批异常,请联系管理员");
+		}
+		//保存操作记录
+		auditProecess.setAuditMsg(auditProecess.getAuditMsg());
+		auditProecess.setAuditItem(new Date());
+		baseMapper.updateById(auditProecess);
+	}
+
+	@Override
+	@Transactional
+	@GlobalTransactional
+	public void orderCheckProcess(AuditProecess auditProecess)
+	{
+		//查看最新操作记录,防止重复提交
+		AuditProecess auditProecess1= baseMapper.selectById(auditProecess.getId());
+		if(auditProecess1==null)
+		{
+			throw new SecurityException("未查到此审批记录,禁止操作");
+		}
+		if(auditProecess1.getAuditStatus().equals("A")||auditProecess1.getAuditStatus().equals("B"))
+		{
+			throw new SecurityException("当前记录已经完成审批,禁止重复操作");
+		}
+
+		if(auditProecess.getAuditStatus()==null || !auditProecess.getAuditStatus().equals("S"))
+		{
+			throw new SecurityException("审批状态非待审,禁止操作");
+		}
+		//信息
+		Message sendMessage=new Message();
+		sendMessage.setUserName(AuthUtil.getUserName());
+		sendMessage.setUserId(AuthUtil.getUserId());
+		sendMessage.setToUserId(auditProecess.getSendUserId());
+		sendMessage.setToUserName(auditProecess.getSendName());
+		sendMessage.setMessageType(1);
+		sendMessage.setTenantId(AuthUtil.getTenantId());
+		sendMessage.setCreateUser(AuthUtil.getUserId());
+		sendMessage.setCreateTime(new Date());
+		sendMessage.setUrl(auditProecess.getUrl());
+		sendMessage.setPageLabel(auditProecess.getPageLabel());
+		sendMessage.setPageStatus(auditProecess.getPageStatus());
+
+
+		//用户操作 1.通过  2.驳回
+		Integer operate = auditProecess.getOperate();
+		//查看当前审批是否为最后一级
+		String iffinalItem = auditProecess.getIffinalItem();
+		//审批人
+		auditProecess.setAuditUserId(String.valueOf(AuthUtil.getUserId()));
+		//审批时间
+		auditProecess.setAuditOpTime(new Date());
+		//不是最后一级
+		if(iffinalItem.equals("F"))
+		{
+
+
+			//通过
+			if(operate==1)
+			{
+				//如果是第一级, 则修改状态为审批中
+				if(auditProecess.getLevelId()==1)
+				{
+					Order order=new Order();
+					order.setId(auditProecess.getSrcBillId());
+					order.setStatus(2);
+					R submit = orderCheckClient.submit(order);
+					if(!submit.isSuccess())
+					{
+						throw new SecurityException("审批开始修改审核状态失败");
+					}
+				}
+
+
+				auditProecess.setAuditStatus("A");
+				//查询下一级,开启待审
+				LambdaQueryWrapper<AuditProecess> auditProecessLambdaQueryWrapper=new LambdaQueryWrapper<>();
+				auditProecessLambdaQueryWrapper
+					.eq(AuditProecess::getBatchNo,auditProecess.getBatchNo())
+					.eq(AuditProecess::getSrcBillId,auditProecess.getSrcBillId())
+					.eq(AuditProecess::getIsDelete,0)
+					.eq(AuditProecess::getActId,auditProecess.getActId())
+					.eq(AuditProecess::getBillId,auditProecess.getBillId())
+					.eq(AuditProecess::getBillNo,auditProecess.getBillNo())
+					.eq(AuditProecess::getTenantId,AuthUtil.getTenantId())
+					.eq(AuditProecess::getLevelId,auditProecess.getLevelId()+1);
+				Integer count = baseMapper.selectCount(auditProecessLambdaQueryWrapper);
+				if(count!=null && count>1)
+				{
+					throw new SecurityException("审核失败,获取下一级信息失败");
+				}
+				AuditProecess proecess = baseMapper.selectOne(auditProecessLambdaQueryWrapper);
+				if(proecess==null)
+				{
+					throw new SecurityException("审批通过=>获取下一级信息失败");
+				}
+				proecess.setAuditStatus("S");
+				baseMapper.updateById(proecess);
+				Message message=new Message();
+				message.setUserName(AuthUtil.getUserName());
+				message.setUserId(AuthUtil.getUserId());
+				//消息通知下一级
+				message.setToUserId(Long.valueOf(proecess.getAuditUserId()));
+				message.setMessageType(1);
+				message.setTenantId(AuthUtil.getTenantId());
+				message.setMessageBody("你有新的审批待操作,请及时处理");
+				message.setCreateUser(AuthUtil.getUserId());
+				message.setUrl("/approveData/index");
+				message.setCreateTime(new Date());
+
+				R save = messageClient.save(message);
+				if(!save.isSuccess())
+				{
+					throw new SecurityException("发送消息失败");
+				}
+			}
+			//不通过
+			else if(operate==2)
+			{
+				auditProecess.setAuditStatus("B");
+				//todo 调用feign取消
+				R r = orderCheckClient.passCancel(auditProecess.getSrcBillId());
+				if(!r.isSuccess())
+				{
+					throw new SecurityException("修改财务数据失败");
+				}
+
+				sendMessage.setMessageBody("您的请核未通过,请查看原因");
+				R save = messageClient.save(sendMessage);
+				if(!save.isSuccess())
+				{
+					throw new SecurityException("发送消息失败");
+				}
+			}
+
+		}
+		//是最后一级
+		else if(iffinalItem.equals("T"))
+		{
+			//通过
+			if(operate==1)
+			{
+				//todo 调用feign直接通过
+				auditProecess.setAuditStatus("A");
+				R r = orderCheckClient.passCheck(auditProecess.getSrcBillId());
+				if(!r.isSuccess())
+				{
+					throw new SecurityException("修改财务数据失败");
+				}
+
+
+				sendMessage.setMessageBody("您的请核已通过,请继续操作");
+				R save = messageClient.save(sendMessage);
+				if(!save.isSuccess())
+				{
+					throw new SecurityException("发送消息失败");
+				}
+			}
+			//不通过
+			else if(operate==2)
+			{
+				//todo 调用feign取消
+				auditProecess.setAuditStatus("B");
+				R r = orderCheckClient.passCancel(auditProecess.getSrcBillId());
+				if(!r.isSuccess())
+				{
+					throw new SecurityException("修改财务数据失败");
+				}
+				sendMessage.setMessageBody("您的请核未通过,请查看原因");
+				R save = messageClient.save(sendMessage);
+				if(!save.isSuccess())
+				{
+					throw new SecurityException("发送消息失败");
+				}
+			}
+		}
+		else
+		{
+			throw new SecurityException("审批异常,请联系管理员");
+		}
+		//保存操作记录
+		auditProecess.setAuditMsg(auditProecess.getAuditMsg());
+		auditProecess.setAuditItem(new Date());
+		baseMapper.updateById(auditProecess);
+	}
+
+	@Override
+	@Transactional
+	@GlobalTransactional
 	public void batchOperation(List<AuditProecess> processLis, Integer operate,String auditMsg)
 	{
 		processLis.forEach(e->{
 			e.setOperate(operate);
 			e.setAuditMsg(auditMsg);
-			this.operationFinanceProcess(e);
+			if(e.getCheckType().equals("ffsq"))
+			{
+				this.operationFinanceProcess(e);
+			}
+			else if(e.getCheckType().equals("xsqh"))
+			{
+                this.orderCheckProcess(e);
+			}
+			else
+			{
+				throw new SecurityException("存在审批类型为空的数据,请联系管理员");
+			}
+
 		});
 	}
 

+ 1 - 0
blade-service/blade-client/src/main/java/org/springblade/client/corps/controller/CorpsDescController.java

@@ -126,6 +126,7 @@ public class CorpsDescController extends BladeController {
 	@ApiOperationSupport(order = 5)
 	@ApiOperation(value = "修改", notes = "传入corpsDesc")
 	public R update(@Valid @RequestBody CorpsDesc corpsDesc) {
+		// 
 		if (corpsDesc.getId() == null) {
 			return R.data(500, "请选择要删除的数据", "error");
 		}

+ 21 - 4
blade-service/blade-client/src/main/java/org/springblade/client/goods/controller/GoodsDescController.java

@@ -41,10 +41,8 @@ import org.springblade.client.goods.excel.GoodsExcel;
 import org.springblade.client.goods.excel.GoodsImport;
 import org.springblade.client.goods.excel.GoodsInfoExcel;
 import org.springblade.client.goods.excel.GoodsOutExcel;
-import org.springblade.client.goods.service.IGoodsFilesService;
-import org.springblade.client.goods.service.IGoodsPriceService;
+import org.springblade.client.goods.service.*;
 import org.springblade.core.excel.util.ExcelUtil;
-import org.springblade.client.goods.service.IGoodsSpecificationService;
 import org.springblade.core.mp.support.Condition;
 import org.springblade.core.mp.support.Query;
 import org.springblade.core.secure.utils.AuthUtil;
@@ -56,11 +54,11 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import org.springblade.client.vo.GoodsDescVO;
-import org.springblade.client.goods.service.IGoodsDescService;
 import org.springblade.core.boot.ctrl.BladeController;
 import org.springframework.web.multipart.MultipartFile;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 import java.util.stream.Collectors;
 
@@ -83,6 +81,8 @@ public class GoodsDescController extends BladeController {
 	private IGoodsFilesService goodsFilesService;
     @Autowired
 	private IGoodsSpecificationService goodsSpecificationService;
+
+    private final IGoodsTypeService goodsDescType;
 	/**
 	 * 详情
 	 */
@@ -130,6 +130,22 @@ public class GoodsDescController extends BladeController {
 		    .orderByDesc(GoodsDesc::getCreateTime);
 		Page<GoodsDesc> page=new Page<>(current,size);
 		IPage<GoodsDesc> iPage=goodsDescService.page(page,goodsDescLambdaQueryWrapper);
+		if(CollectionUtils.isNotEmpty(iPage.getRecords()))
+		{
+			iPage.getRecords().forEach(e->{
+				String TypeId = e.getGoodsTypeId();
+				String[] split = TypeId.split(",");
+				List<String> stringList = Arrays.asList(split);
+				LambdaQueryWrapper<GoodsType> goodsTypeLambdaQueryWrapper=new LambdaQueryWrapper<>();
+				goodsTypeLambdaQueryWrapper.in(GoodsType::getId,stringList);
+				List<GoodsType> types = goodsDescType.list(goodsTypeLambdaQueryWrapper);
+				if(CollectionUtils.isNotEmpty(types))
+				{
+					List<String> typeStr = types.stream().map(GoodsType::getCname).collect(Collectors.toList());
+					e.setGoodsTypeName(typeStr.toString());
+				}
+			});
+		}
 		return R.data(iPage);
 	}
 
@@ -350,6 +366,7 @@ public class GoodsDescController extends BladeController {
 		List<GoodsOutExcel> list = new ArrayList<>();
 		LambdaQueryWrapper<GoodsDesc> goodsDescLambdaQueryWrapper=new LambdaQueryWrapper<>();
 		goodsDescLambdaQueryWrapper
+			.eq(GoodsDesc::getType,0)
 			.orderByAsc(GoodsDesc::getCode)
 			.eq(GoodsDesc::getIsDeleted,0)
 			.eq(GoodsDesc::getTenantId,AuthUtil.getTenantId());

+ 1 - 1
blade-service/blade-client/src/main/java/org/springblade/client/goods/excel/GoodsOutExcel.java

@@ -19,7 +19,7 @@ public class GoodsOutExcel
 	private String brandItem;
 
 	@ExcelProperty("规格型号")
-	private String typeNo;
+	private String typeno;
 
 	@ExcelProperty("数量")
 	private String number;

+ 35 - 0
blade-service/blade-mocha-item/src/main/java/org/springblade/mocha/controller/SalesPolicyController.java

@@ -25,16 +25,21 @@ import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import lombok.AllArgsConstructor;
+
+import javax.servlet.http.HttpServletResponse;
 import javax.validation.Valid;
 
 import org.springblade.client.entity.CorpsDesc;
 import org.springblade.client.feign.ICorpsDescClient;
+import org.springblade.core.excel.util.ExcelUtil;
 import org.springblade.core.mp.support.Condition;
 import org.springblade.core.mp.support.Query;
 import org.springblade.core.secure.BladeUser;
 import org.springblade.core.secure.utils.SecureUtil;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.Func;
+import org.springblade.mocha.excel.PriceItemExcel;
+import org.springblade.mocha.excel.SalesItemExcel;
 import org.springblade.purchase.sales.entity.Order;
 import org.springframework.web.bind.annotation.*;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -42,6 +47,7 @@ import org.springblade.mocha.entity.SalesPolicy;
 import org.springblade.mocha.vo.SalesPolicyVO;
 import org.springblade.mocha.service.ISalesPolicyService;
 import org.springblade.core.boot.ctrl.BladeController;
+import org.springframework.web.multipart.MultipartFile;
 
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -184,5 +190,34 @@ public class SalesPolicyController extends BladeController {
 		return R.data(tree);
 	}
 
+	/**
+	 * 导入销售政策明细
+	 * */
+
+	@PostMapping("/import-sales-policy")
+	@ApiOperationSupport(order = 12)
+	@ApiOperation(value = "导入销售政策明细", notes = "传入excel")
+	public R importSalesPolicy(MultipartFile file) {
+		List<SalesItemExcel> excelList = ExcelUtil.read(file, SalesItemExcel.class);
+		if(CollectionUtils.isEmpty(excelList))
+		{
+			throw new SecurityException("数据不能为空");
+		}
+		return salesPolicyService.importSalesPolicy(excelList,false);
+	}
+
+
+	/**
+	 * 导出模板
+	 */
+	@GetMapping("/export-sales-policy")
+	@ApiOperationSupport(order = 9)
+	@ApiOperation(value = "导出模板")
+	public void exportPrice(HttpServletResponse response) {
+		List<SalesItemExcel> list = new ArrayList<>();
+		ExcelUtil.export(response, "导出模板-销售政策明细", "导入数据表", list, SalesItemExcel.class);
+	}
+
+
 
 }

+ 29 - 0
blade-service/blade-mocha-item/src/main/java/org/springblade/mocha/excel/SalesItemExcel.java

@@ -0,0 +1,29 @@
+package org.springblade.mocha.excel;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ColumnWidth;
+import com.alibaba.excel.annotation.write.style.ContentRowHeight;
+import com.alibaba.excel.annotation.write.style.HeadRowHeight;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+@Data
+@ColumnWidth(25)
+@HeadRowHeight(20)
+@ContentRowHeight(18)
+public class SalesItemExcel implements Serializable {
+
+	private static final long serialVersionUID = 1L;
+	/**
+	 * 大字(规格编码)
+	 */
+	@ExcelProperty("商品编码")
+	private String code;
+
+
+	@ExcelProperty("特价")
+	private String specialOffer;
+
+}

+ 11 - 0
blade-service/blade-mocha-item/src/main/java/org/springblade/mocha/service/ISalesPolicyService.java

@@ -18,6 +18,8 @@ package org.springblade.mocha.service;
 
 import org.springblade.core.tool.api.R;
 import org.springblade.mocha.entity.SalesPolicy;
+import org.springblade.mocha.excel.PriceItemExcel;
+import org.springblade.mocha.excel.SalesItemExcel;
 import org.springblade.mocha.vo.SalesPolicyVO;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -62,4 +64,13 @@ public interface ISalesPolicyService extends IService<SalesPolicy> {
 	 */
 	List<SalesPolicyVO> lazyTree(SalesPolicy salesPolicy);
 
+	/**
+	 * 导入销售
+	 *
+	 * @param data
+	 * @param
+	 * @return
+	 */
+	R importSalesPolicy(List<SalesItemExcel> data, Boolean isCovered);
+
 }

+ 53 - 0
blade-service/blade-mocha-item/src/main/java/org/springblade/mocha/service/impl/SalesPolicyServiceImpl.java

@@ -19,15 +19,23 @@ package org.springblade.mocha.service.impl;
 import com.alibaba.druid.sql.ast.expr.SQLCaseExpr;
 import com.alibaba.fastjson.JSONArray;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.BeanUtils;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import lombok.AllArgsConstructor;
+import org.springblade.client.entity.GoodsDesc;
+import org.springblade.client.entity.GoodsType;
 import org.springblade.client.feign.ICorpsDescClient;
 import org.springblade.client.feign.IGoodsDescClient;
+import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.secure.utils.SecureUtil;
 import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.BeanUtil;
+import org.springblade.mocha.entity.PriceItem;
 import org.springblade.mocha.entity.SalesPolicy;
 import org.springblade.mocha.entity.SalesPolicyItem;
+import org.springblade.mocha.excel.PriceItemExcel;
+import org.springblade.mocha.excel.SalesItemExcel;
 import org.springblade.mocha.mapper.SalesPolicyItemMapper;
 import org.springblade.mocha.vo.SalesPolicyVO;
 import org.springblade.mocha.mapper.SalesPolicyMapper;
@@ -37,7 +45,9 @@ import org.springblade.system.user.entity.User;
 import org.springblade.system.user.feign.IUserClient;
 import org.springframework.stereotype.Service;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springframework.transaction.annotation.Transactional;
 
+import java.math.BigDecimal;
 import java.util.*;
 
 /**
@@ -52,6 +62,7 @@ public class SalesPolicyServiceImpl extends ServiceImpl<SalesPolicyMapper, Sales
 	private SalesPolicyItemMapper salesPolicyItemMapper;//销售政策明细表
 	private final IUserClient userClient;//用户
 	private final ICorpsDescClient corpsDescClient;//客户信息
+	private final IGoodsDescClient goodsDescClient;//商品信息
 	@Override
 	public IPage<SalesPolicy> selectSalesPolicyPage(IPage<SalesPolicy> page, SalesPolicy salesPolicy) {
 		return page.setRecords(baseMapper.selectSalesPolicyPage(page, salesPolicy));
@@ -172,6 +183,48 @@ public class SalesPolicyServiceImpl extends ServiceImpl<SalesPolicyMapper, Sales
 		}
 		return baseMapper.lazyTree(salesPolicy);
 	}
+
+	@Override
+	@Transactional
+	public R importSalesPolicy(List<SalesItemExcel> data, Boolean isCovered)
+	{
+		List<SalesPolicyItem> list=new ArrayList<>();
+		for(int i=0;i<data.size();i++)
+		{
+			SalesItemExcel goodsExcel = data.get(i);
+			SalesPolicyItem salesPolicyItem=new SalesPolicyItem();
+			salesPolicyItem.setCode(goodsExcel.getCode());
+            if(StringUtils.isBlank(goodsExcel.getCode()))
+            {
+            	throw new SecurityException("第"+(i+1)+"行商品未填写,");
+			}
+			R<GoodsDesc> goodsDescR = goodsDescClient.GoodsByCode(salesPolicyItem.getCode());
+            if(!goodsDescR.isSuccess()||goodsDescR.getData()==null)
+            {
+				throw new SecurityException("第"+(i+1)+"行,请填写真实正确的商品编码");
+			}
+            //查询itemId
+			GoodsDesc goodsDesc = goodsDescR.getData();
+			salesPolicyItem.setSpecialOffer(new BigDecimal(goodsExcel.getSpecialOffer()));
+			salesPolicyItem.setBrandItem(goodsDesc.getBrandItem());
+			salesPolicyItem.setItemId(goodsDesc.getId());
+			salesPolicyItem.setBrand(goodsDesc.getBrand());
+			salesPolicyItem.setTypeno(goodsDesc.getTypeno());
+			salesPolicyItem.setCorpId(goodsDesc.getCorpId());
+			salesPolicyItem.setCorpName(goodsDesc.getCorpName());
+			salesPolicyItem.setSalesType("1");
+			//产品分类
+			GoodsType goodsType = goodsDescClient.goodTypeId(goodsDesc.getId());
+			if(goodsType==null)
+			{
+				throw new SecurityException("第"+(i+1)+"行,根据此编码获取分类失败");
+			}
+			salesPolicyItem.setProductCategory(goodsType.getCname());
+			list.add(salesPolicyItem);
+		}
+		return R.data(list);
+	}
+
 	private String getUserName(Long user){
 		String userName = null;
 		R<User> create = userClient.userInfoById(user);

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

@@ -71,6 +71,12 @@
             <groupId>org.springblade</groupId>
             <artifactId>blade-starter-transaction</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.springblade</groupId>
+            <artifactId>blade-check-api</artifactId>
+            <version>2.8.2.RELEASE</version>
+            <scope>compile</scope>
+        </dependency>
     </dependencies>
 
     <build>

+ 263 - 5
blade-service/blade-project/src/main/java/org/springblade/project/controller/ProjectController.java

@@ -335,9 +335,12 @@ public class ProjectController {
 	 * 2.0新逻辑-主营项目主表清核-必须所有子表明细结算之后才可以清核
  	 */
 	@PostMapping("/masterCheck")
-    public R masterCheck(@RequestParam(name = "id",  required = true) Long id)
+    public R masterCheck(@RequestParam(name = "id",  required = true) Long id,
+						 @RequestParam(name = "url",  required = false) String url,
+						 @RequestParam(name = "pageStatus",  required = false) String pageStatus,
+						 @RequestParam(name = "pageLabel",  required = false) String pageLabel)
 	{
-		serviceProjectService.masterCheck(id);
+		serviceProjectService.masterCheck(id,url,pageStatus,pageLabel);
 		return R.success("操作成功");
 	}
 
@@ -380,12 +383,236 @@ public class ProjectController {
 	 * 2.0-统计列表
 	 * */
 	@GetMapping("/statisticalAnalysis")
-	public R statisticalAnalysis()
+	public R statisticalAnalysis(@RequestParam(name = "userName", required = false) String userName,
+								 @RequestParam(name = "projectType", required = false)String projectType,
+								 @RequestParam(name = "deptid", required = false)String deptid,
+								 @RequestParam(name = "pname", required = false)String pname,
+								 @RequestParam(name = "status", required = false)String status,
+								 @RequestParam(name = "cornId", required = false)String cornId,
+								 @RequestParam(name = "payStartTime", required = false) String payStartTime,
+								 @RequestParam(name = "payEndTime", required = false)String payEndTime)
 	{
-		List<ServiceProjectItem> serviceProjectItems = serviceProjectItemService.statisticalAnalysis(AuthUtil.getTenantId());
+		List<ServiceProjectItem> serviceProjectItems = serviceProjectItemService.statisticalAnalysis(AuthUtil.getTenantId(),userName,projectType,deptid,pname,status,cornId,payStartTime,payEndTime);
 		return R.data(serviceProjectItems);
 	}
 
+
+	/**
+	 *
+	 * 2.0-业绩分析 -导出
+	 * */
+	@GetMapping("/import-out-performanceAnalysis")
+	public R<?> importOutPerformanceAnalysis(
+		@RequestParam(name = "flag",  required = true) int flag
+		,@RequestParam(name = "year",  defaultValue = "2021") Long year
+		,@RequestParam(name = "corpNames", required = false) Long corpNames
+		,@RequestParam(name = "userName",  required = false) String userName)
+	{
+		//按承做人统计多少个客户
+		if(flag==1)
+		{
+
+			LambdaQueryWrapper<ServiceProjectItem> itemLambdaQueryWrapper=new LambdaQueryWrapper<>();
+			itemLambdaQueryWrapper.apply(" year(pay_time) = '"+year+"'");
+			itemLambdaQueryWrapper.eq(ServiceProjectItem::getTenantId,AuthUtil.getTenantId());
+			itemLambdaQueryWrapper.eq(ServiceProjectItem::getIsDeleted,0);
+			itemLambdaQueryWrapper.eq(StringUtils.isNotBlank(userName),ServiceProjectItem::getUserName,userName);
+			itemLambdaQueryWrapper.groupBy(ServiceProjectItem::getUserName);
+			//分组不同的承做人
+			List<ServiceProjectItem> itemList = serviceProjectItemService.list(itemLambdaQueryWrapper);
+			if(CollectionUtils.isEmpty(itemList))
+			{
+				return R.data(Collections.EMPTY_LIST);
+			}
+			Long finalYear = year;
+			itemList.forEach(e->{
+				//统计此制单人多少个客户
+				LambdaQueryWrapper<ServiceProjectItem> count=new LambdaQueryWrapper<>();
+				count.apply(" year(pay_time) = '"+year+"'")
+					.eq(ServiceProjectItem::getUserName,e.getUserName())
+					.eq(ServiceProjectItem::getTenantId,AuthUtil.getTenantId())
+					.eq(ServiceProjectItem::getIsDeleted,0);
+				List<ServiceProjectItem> list = serviceProjectItemService.list(count);
+				List<Long> pids = list.stream().map(ServiceProjectItem::getPId).collect(Collectors.toList());
+				if(!CollectionUtils.isEmpty(pids))
+				{
+					//从主表获取客户并且分组
+					LambdaQueryWrapper<ServiceProject> countCorps=new LambdaQueryWrapper<>();
+					countCorps
+						.in(ServiceProject::getId,pids)
+						.eq(ServiceProject::getIsDeleted,0)
+						.eq(ServiceProject::getTenantId,AuthUtil.getTenantId());
+					List<ServiceProject> corpsProjects = serviceProjectService.list(countCorps);
+					e.setCountCorp(corpsProjects.stream().map(ServiceProject::getCorpId).distinct().collect(Collectors.toList()).size());
+				}
+				else
+				{
+					e.setCountCorp(0);
+				}
+
+
+
+				//计算服务费
+				ServiceProject serviceProject = this.calculateServiceCharge(e.getUserName(), null, 1, finalYear);
+				e.setJan(serviceProject==null?BigDecimal.ZERO:serviceProject.getJan());//1
+				e.setFeb(serviceProject==null?BigDecimal.ZERO:serviceProject.getFeb());//2
+				e.setMar(serviceProject==null?BigDecimal.ZERO:serviceProject.getMar());//3
+				e.setApr(serviceProject==null?BigDecimal.ZERO:serviceProject.getApr());//4
+				e.setMay(serviceProject==null?BigDecimal.ZERO:serviceProject.getMay());//5
+				e.setJune(serviceProject==null?BigDecimal.ZERO:serviceProject.getJune());//6
+				e.setJuly(serviceProject==null?BigDecimal.ZERO:serviceProject.getJuly());//7
+				e.setAug(serviceProject==null?BigDecimal.ZERO:serviceProject.getAug());//8
+				e.setSept(serviceProject==null?BigDecimal.ZERO:serviceProject.getSept());//9
+				e.setOct(serviceProject==null?BigDecimal.ZERO:serviceProject.getOct());//10
+				e.setNov(serviceProject==null?BigDecimal.ZERO:serviceProject.getNov());//11
+				e.setDece(serviceProject==null?BigDecimal.ZERO:serviceProject.getDece());//12
+				e.setTotal
+					(    e.getJan()
+						.add(e.getFeb())
+						.add(e.getMar())
+						.add(e.getApr())
+						.add(e.getMay())
+						.add(e.getJune())
+						.add(e.getJuly())
+						.add(e.getAug())
+						.add(e.getSept())
+						.add(e.getOct())
+						.add(e.getNov())
+						.add(e.getDece())
+					);
+			});
+			return R.data(itemList);
+		}
+		else if(flag==2)
+		{
+			List<ServiceProject> serviceProjectList = serviceProjectService.statisticalAnalysisOutData(AuthUtil.getTenantId(), year, null);
+			if(!CollectionUtils.isEmpty(serviceProjectList))
+			{
+				serviceProjectList.forEach(e->{
+					//统计服务费
+					ServiceProject serviceProject = calculateServiceCharge(null,e.getCorpId(), 2, year);
+					e.setJan(serviceProject==null?BigDecimal.ZERO:serviceProject.getJan());//1
+					e.setFeb(serviceProject==null?BigDecimal.ZERO:serviceProject.getFeb());//2
+					e.setMar(serviceProject==null?BigDecimal.ZERO:serviceProject.getMar());//3
+					e.setApr(serviceProject==null?BigDecimal.ZERO:serviceProject.getApr());//4
+					e.setMay(serviceProject==null?BigDecimal.ZERO:serviceProject.getMay());//5
+					e.setJune(serviceProject==null?BigDecimal.ZERO:serviceProject.getJune());//6
+					e.setJuly(serviceProject==null?BigDecimal.ZERO:serviceProject.getJuly());//7
+					e.setAug(serviceProject==null?BigDecimal.ZERO:serviceProject.getAug());//8
+					e.setSept(serviceProject==null?BigDecimal.ZERO:serviceProject.getSept());//9
+					e.setOct(serviceProject==null?BigDecimal.ZERO:serviceProject.getOct());//10
+					e.setNov(serviceProject==null?BigDecimal.ZERO:serviceProject.getNov());//11
+					e.setDece(serviceProject==null?BigDecimal.ZERO:serviceProject.getDece());//12
+					e.setTotal
+						(    e.getJan()
+							.add(e.getFeb())
+							.add(e.getMar())
+							.add(e.getApr())
+							.add(e.getMay())
+							.add(e.getJune())
+							.add(e.getJuly())
+							.add(e.getAug())
+							.add(e.getSept())
+							.add(e.getOct())
+							.add(e.getNov())
+							.add(e.getDece())
+						);
+				});
+				return R.data(serviceProjectList);
+			}
+
+/*
+			//获取结算时间为指定年的数据
+			LambdaQueryWrapper<ServiceProjectItem> itemLambdaQueryWrapper=new LambdaQueryWrapper<>();
+			itemLambdaQueryWrapper.apply(" year(pay_time) = '"+year+"'");
+			itemLambdaQueryWrapper.eq(ServiceProjectItem::getTenantId,AuthUtil.getTenantId());
+			itemLambdaQueryWrapper.eq(ServiceProjectItem::getIsDeleted,0);
+			List<Long> pids = serviceProjectItemService.list(itemLambdaQueryWrapper).stream().map(ServiceProjectItem::getPId).collect(Collectors.toList());
+			if(CollectionUtils.isEmpty(pids))
+			{
+				return R.data(null);
+			}
+
+			//通过上述数据,查询相关客户数据
+			LambdaQueryWrapper<ServiceProject> countCorps=new LambdaQueryWrapper<>();
+			countCorps
+				.eq(corpNames!=null,ServiceProject::getCorpId,corpNames)
+				.isNotNull(ServiceProject::getCorpId)
+				.in(ServiceProject::getId,pids)
+				.eq(ServiceProject::getIsDeleted,0)
+				.groupBy(ServiceProject::getCorpId)
+				.eq(ServiceProject::getTenantId,AuthUtil.getTenantId());
+			List<ServiceProject> projectList = serviceProjectService.list(countCorps);
+
+			Long finalYear = year;
+			//开始封装数据
+			projectList.forEach(e->{
+				//客户名称
+				if(e.getCorpId()!=null)
+				{
+					R<CorpsDesc> corpMessage = corpsDescClient.getCorpMessage(e.getCorpId());
+					if(corpMessage.isSuccess()&&corpMessage.getData()!=null)
+					{
+						e.setCorpNames(corpMessage.getData().getCname());
+					}
+				}
+				//统计此客户多少个承做人
+				LambdaQueryWrapper<ServiceProject> count=new LambdaQueryWrapper<>();
+				count.eq(ServiceProject::getTenantId,AuthUtil.getTenantId());
+				count.eq(ServiceProject::getIsDeleted,0);
+				count.eq(ServiceProject::getCorpId,e.getCorpId());
+				List<Long> pid = serviceProjectService.list(count).stream().map(ServiceProject::getId).collect(Collectors.toList());
+
+				if(!CollectionUtils.isEmpty(pid))
+				{
+					LambdaQueryWrapper<ServiceProjectItem> countItem=new LambdaQueryWrapper<>();
+					countItem.in(ServiceProjectItem::getPId,pid);
+					countItem.eq(ServiceProjectItem::getIsDeleted,0);
+					countItem.eq(ServiceProjectItem::getTenantId,AuthUtil.getTenantId());
+					List<ServiceProjectItem> list = serviceProjectItemService.list(countItem);
+					e.setCountUserName(list.stream().map(ServiceProjectItem::getUserName).distinct().collect(Collectors.toList()).size());
+				}
+				else
+				{
+					e.setCountUserName(0);
+				}
+
+
+				//统计服务费
+				ServiceProject serviceProject = calculateServiceCharge(null,e.getCorpId(), 2, finalYear);
+				e.setJan(serviceProject==null?BigDecimal.ZERO:serviceProject.getJan());//1
+				e.setFeb(serviceProject==null?BigDecimal.ZERO:serviceProject.getFeb());//2
+				e.setMar(serviceProject==null?BigDecimal.ZERO:serviceProject.getMar());//3
+				e.setApr(serviceProject==null?BigDecimal.ZERO:serviceProject.getApr());//4
+				e.setMay(serviceProject==null?BigDecimal.ZERO:serviceProject.getMay());//5
+				e.setJune(serviceProject==null?BigDecimal.ZERO:serviceProject.getJune());//6
+				e.setJuly(serviceProject==null?BigDecimal.ZERO:serviceProject.getJuly());//7
+				e.setAug(serviceProject==null?BigDecimal.ZERO:serviceProject.getAug());//8
+				e.setSept(serviceProject==null?BigDecimal.ZERO:serviceProject.getSept());//9
+				e.setOct(serviceProject==null?BigDecimal.ZERO:serviceProject.getOct());//10
+				e.setNov(serviceProject==null?BigDecimal.ZERO:serviceProject.getNov());//11
+				e.setDece(serviceProject==null?BigDecimal.ZERO:serviceProject.getDece());//12
+				e.setTotal
+					(    e.getJan()
+						.add(e.getFeb())
+						.add(e.getMar())
+						.add(e.getApr())
+						.add(e.getMay())
+						.add(e.getJune())
+						.add(e.getJuly())
+						.add(e.getAug())
+						.add(e.getSept())
+						.add(e.getOct())
+						.add(e.getNov())
+						.add(e.getDece())
+					);
+			});*/
+
+		}
+		return R.data(Collections.EMPTY_LIST);
+	}
+
+
 	/**
 	 *
 	 * 2.0-业绩分析
@@ -394,6 +621,7 @@ public class ProjectController {
 	public R<?> performanceAnalysis(@RequestParam(name = "flag",  required = true) int flag,@RequestParam(name = "year",  defaultValue = "2021") Long year,
 								 @RequestParam(name = "current", defaultValue = "1") Integer current
 		                        ,@RequestParam(name = "size", defaultValue = "10") Integer size
+		                        ,@RequestParam(name = "corpNames", required = false) Long corpNames
 	                            ,@RequestParam(name = "userName",  required = false) String userName)
 	{
 
@@ -417,7 +645,7 @@ public class ProjectController {
 			ipage.getRecords().forEach(e->{
 				//统计此制单人多少个客户
 				LambdaQueryWrapper<ServiceProjectItem> count=new LambdaQueryWrapper<>();
-				count
+				count.apply(" year(pay_time) = '"+year+"'")
 					.eq(ServiceProjectItem::getUserName,e.getUserName())
 					.eq(ServiceProjectItem::getTenantId,AuthUtil.getTenantId())
 					.eq(ServiceProjectItem::getIsDeleted,0);
@@ -455,6 +683,20 @@ public class ProjectController {
 				e.setOct(serviceProject==null?BigDecimal.ZERO:serviceProject.getOct());//10
 				e.setNov(serviceProject==null?BigDecimal.ZERO:serviceProject.getNov());//11
 				e.setDece(serviceProject==null?BigDecimal.ZERO:serviceProject.getDece());//12
+				e.setTotal
+					(    e.getJan()
+					.add(e.getFeb())
+					.add(e.getMar())
+					.add(e.getApr())
+					.add(e.getMay())
+					.add(e.getJune())
+					.add(e.getJuly())
+					.add(e.getAug())
+					.add(e.getSept())
+					.add(e.getOct())
+					.add(e.getNov())
+					.add(e.getDece())
+				);
 			});
            return R.data(ipage);
 		}
@@ -475,6 +717,7 @@ public class ProjectController {
 			Page<ServiceProject> page=new Page<>(current,size);
 			LambdaQueryWrapper<ServiceProject> countCorps=new LambdaQueryWrapper<>();
 			countCorps
+				.eq(corpNames!=null,ServiceProject::getCorpId,corpNames)
 				.isNotNull(ServiceProject::getCorpId)
 				.in(ServiceProject::getId,pids)
 				.eq(ServiceProject::getIsDeleted,0)
@@ -531,6 +774,21 @@ public class ProjectController {
 				e.setNov(serviceProject==null?BigDecimal.ZERO:serviceProject.getNov());//11
 				e.setDece(serviceProject==null?BigDecimal.ZERO:serviceProject.getDece());//12
 
+				e.setTotal
+					(    e.getJan()
+						.add(e.getFeb())
+						.add(e.getMar())
+						.add(e.getApr())
+						.add(e.getMay())
+						.add(e.getJune())
+						.add(e.getJuly())
+						.add(e.getAug())
+						.add(e.getSept())
+						.add(e.getOct())
+						.add(e.getNov())
+						.add(e.getDece())
+					);
+
 			});
 			return R.data(iPage);
 		}

+ 1 - 0
blade-service/blade-project/src/main/java/org/springblade/project/feign/ProjectItemClient.java

@@ -12,6 +12,7 @@ import org.springblade.core.secure.utils.SecureUtil;
 import org.springblade.core.tenant.annotation.NonDS;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.BeanUtil;
+import org.springblade.project.entity.ServiceProject;
 import org.springblade.project.entity.ServiceProjectItem;
 import org.springblade.project.service.ServiceProjectItemService;
 import org.springblade.project.service.ServiceProjectService;

+ 3 - 1
blade-service/blade-project/src/main/java/org/springblade/project/mapper/ServiceProjectItemMapper.java

@@ -19,7 +19,9 @@ import java.util.List;
 @Mapper
 public interface ServiceProjectItemMapper extends BaseMapper<ServiceProjectItem> {
 
-	List<ServiceProjectItem>  statisticalAnalysis(@Param("tenantId") String tenantId);
+	List<ServiceProjectItem>  statisticalAnalysis(@Param("tenantId") String tenantId,@Param("userName") String userName,@Param("projectType") String projectType,@Param("deptid") String deptid,@Param("pname") String pname,@Param("status") String status,@Param("cornId") String cornId,@Param("payStartTime") String payStartTime,@Param("payEndTime") String payEndTime);
 
 	ServiceProject calculateServiceCharge(@Param("tenantId") String tenantId,@Param("year") String year,@Param("corpId") Long corpId,@Param("createUser") Long createUser,@Param("userName")String userName);
+
+    List<ServiceProject> statisticalAnalysisOutData(@Param("tenantId") String tenantId,@Param("year") Long year,@Param("corpId") Long corpId);
 }

+ 48 - 1
blade-service/blade-project/src/main/java/org/springblade/project/mapper/ServiceProjectItemMapper.xml

@@ -49,7 +49,30 @@
 		  a.id=b.p_id
 	AND b.tenant_id = #{tenantId}
 	and b.is_deleted = 0
-	AND b.STATUS IN ( '0', '1', '2', '3', '4', '5', '6')
+    AND b.STATUS IN ( '0', '1', '2', '3', '4', '5', '6' )
+        <if test='userName != null and userName!= ""'>
+            AND b.user_name = #{userName}
+        </if>
+        <if test='projectType != null and projectType!= ""'>
+            AND b.project_type = #{projectType}
+        </if>
+        <if test='deptid != null and deptid!= ""'>
+            AND b.deptid = #{deptid}
+        </if>
+        <if test='pname != null and pname!= ""'>
+            AND b.p_name = #{pname}
+        </if>
+        <if test='status != null and status!= ""'>
+            AND b.status = #{status}
+        </if>
+        <if test='cornId != null and cornId!= ""'>
+            AND a.corn_id = #{cornId}
+        </if>
+
+        <if test='payStartTime != null and payEndTime!= null'>
+            and b.pay_time between #{payStartTime} and #{payEndTime}
+        </if>
+
 	) a
 	LEFT JOIN basic_corps_desc b on a.corp_id=b.id
 	left JOIN blade_dept c on a.deptid =c.id
@@ -86,4 +109,28 @@
         </if>
     </select>
 
+
+    <select id="statisticalAnalysisOutData" resultType="org.springblade.project.entity.ServiceProject">
+    select
+    a.*,
+    b.cname as corpNames
+    from
+    (
+    select
+    a.corp_id ,
+    count(distinct b.userid) countUserName
+    from
+    service_project a,
+    service_project_item b
+    where b.p_id=a.id
+    and year(b.pay_time)=#{year}
+    and b.tenant_id=#{tenantId}
+    <if test="corpId!=null">
+        and  a.corp_id=#{corpId}
+    </if>
+    and a.corp_id is not null
+    group by a.corp_id
+    )a LEFT JOIN basic_corps_desc b on a.corp_id=b.id
+    </select>
+
 </mapper>

+ 1 - 1
blade-service/blade-project/src/main/java/org/springblade/project/service/ServiceProjectItemService.java

@@ -20,5 +20,5 @@ import java.util.Map;
 public interface ServiceProjectItemService extends BaseService<ServiceProjectItem>
 {
 
-	List<ServiceProjectItem>  statisticalAnalysis( String tenantId);
+	List<ServiceProjectItem>  statisticalAnalysis( String tenantId, String userName, String projectType,String deptid, String pname, String status, String cornId,String payStartTime, String payEndTime);
 }

+ 3 - 1
blade-service/blade-project/src/main/java/org/springblade/project/service/ServiceProjectService.java

@@ -32,7 +32,7 @@ public interface ServiceProjectService extends IService<ServiceProject>
 
     void updateItemStatus(Long itemId, int status, String accountName, String accountBank, String accountNo, Date payTime);
 
-    void masterCheck(Long id);
+    void masterCheck(Long id,String url,String pageStatus,String pageLabel);
 
     void projectPassCheck(Long id);
 
@@ -41,4 +41,6 @@ public interface ServiceProjectService extends IService<ServiceProject>
     void settleAccounts(Long id,int status, String accountName,String accountBank,Date payTime, String accountNo);
 
 	ServiceProject calculateServiceCharge(String tenantId,  String year,  Long corpId,  Long createUser,String userName);
+
+	List<ServiceProject> statisticalAnalysisOutData(String tenantId,  Long year,  Long corpId);
 }

+ 3 - 2
blade-service/blade-project/src/main/java/org/springblade/project/service/impl/ServiceProjectItemServiceImpl.java

@@ -1,6 +1,7 @@
 package org.springblade.project.service.impl;
 
 import lombok.AllArgsConstructor;
+import org.apache.ibatis.annotations.Param;
 import org.springblade.core.mp.base.BaseServiceImpl;
 import org.springblade.project.entity.ServiceProjectItem;
 import org.springblade.project.mapper.ServiceProjectItemMapper;
@@ -23,7 +24,7 @@ public class ServiceProjectItemServiceImpl extends BaseServiceImpl<ServiceProjec
 	private final ServiceProjectItemMapper serviceProjectItemMapper;
 
 	@Override
-	public List<ServiceProjectItem> statisticalAnalysis(String tenantId) {
-		return serviceProjectItemMapper.statisticalAnalysis(tenantId);
+	public List<ServiceProjectItem> statisticalAnalysis(String tenantId, String userName, String projectType,String deptid, String pname, String status, String cornId,String payStartTime, String payEndTime) {
+		return serviceProjectItemMapper.statisticalAnalysis(tenantId,userName,projectType,deptid,pname,status,cornId,payStartTime,payEndTime);
 	}
 }

+ 52 - 3
blade-service/blade-project/src/main/java/org/springblade/project/service/impl/ServiceProjectServiceImpl.java

@@ -2,7 +2,12 @@ package org.springblade.project.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import jdk.nashorn.internal.ir.CallNode;
+import lombok.AllArgsConstructor;
 import net.logstash.logback.encoder.org.apache.commons.lang3.StringUtils;
+import org.springblade.check.dto.AuditProecessDTO;
+import org.springblade.check.entity.AuditPathsActs;
+import org.springblade.check.entity.AuditPathsLevels;
+import org.springblade.check.feign.ICheckClient;
 import org.springblade.client.feign.ISerialClient;
 import org.springblade.core.mp.base.BaseService;
 import org.springblade.core.mp.base.BaseServiceImpl;
@@ -35,6 +40,7 @@ import java.util.stream.Collectors;
 
 
 @Service
+@AllArgsConstructor
 public class ServiceProjectServiceImpl extends ServiceImpl<ServiceProjectMapper, ServiceProject> implements ServiceProjectService
 {
    @Resource
@@ -46,6 +52,8 @@ public class ServiceProjectServiceImpl extends ServiceImpl<ServiceProjectMapper,
 	@Resource
    private ISerialClient serialClient;//生成系统编号
 
+	private final ICheckClient iCheckClient;
+
 	@Override
 	@Transactional
 	public void modify(ServiceProject serviceProject)
@@ -356,7 +364,7 @@ public class ServiceProjectServiceImpl extends ServiceImpl<ServiceProjectMapper,
 
 	@Override
 	@Transactional
-	public void masterCheck(Long id)
+	public void masterCheck(Long id,String url,String pageStatus,String pageLabel)
 	{
 		ServiceProject serviceProject = serviceProjectMapper.selectById(id);
 		if(serviceProject==null)
@@ -388,8 +396,43 @@ public class ServiceProjectServiceImpl extends ServiceImpl<ServiceProjectMapper,
 		}
 
 		//todo 查看是否开启审批流,如果已经开启了,走审批流,反之直接走审批通过接口
-		//暂未加审批直接通过
-        this.projectPassCheck(id);
+		AuditPathsActs pathsActs = iCheckClient.getActsByActId(2, "check_status");
+
+		//没开启审批流直接走 通过流程
+		if(pathsActs==null || pathsActs.getIsEnable()==2)
+		{
+			this.projectPassCheck(id);
+		}
+		//走审批流
+	    else
+		{
+			serviceProject.setStatus(1);
+			serviceProjectMapper.updateById(serviceProject);
+			//获取审批级次
+			List<AuditPathsLevels> auditPathsLevels = iCheckClient.listLevelsByActId(2, "status");
+			AuditProecessDTO auditProecessDTO=new AuditProecessDTO();
+			//追加跳转路由url
+			auditProecessDTO.setUrl(url);
+			auditProecessDTO.setPageStatus(pageStatus);
+			auditProecessDTO.setPageLabel(pageLabel);
+			//增加审批类型
+			auditProecessDTO.setProcessType("付费审批");
+			auditProecessDTO.setPathsLevelsList(auditPathsLevels);
+			auditProecessDTO.setActId(1);
+			auditProecessDTO.setSrcBillId(serviceProject.getId());
+			auditProecessDTO.setBillId(serviceProject.getId());
+			auditProecessDTO.setBillNo(serviceProject.getSysNo());
+			auditProecessDTO.setSendUserId(AuthUtil.getUserId());
+			auditProecessDTO.setSendName(AuthUtil.getUserName());
+			auditProecessDTO.setSendTime(new Date());
+			R ServiceProcess = iCheckClient.createFinanceProcess(auditProecessDTO);
+			if(!ServiceProcess.isSuccess())
+			{
+				throw new SecurityException("操作失败,请联系管理员");
+			}
+		}
+
+
 	}
 
 	@Override
@@ -479,6 +522,12 @@ public class ServiceProjectServiceImpl extends ServiceImpl<ServiceProjectMapper,
 		return serviceProjectItemMapper.calculateServiceCharge(tenantId,year,corpId,createUser,userName);
 	}
 
+	@Override
+	public List<ServiceProject> statisticalAnalysisOutData(String tenantId, Long year, Long corpId)
+	{
+		return serviceProjectItemMapper.statisticalAnalysisOutData(tenantId,year,corpId);
+	}
+
 	public void checkMoney(Long serviceId,List<ServiceProjectItem> items)
 	{
 		ServiceProject serviceProject = serviceProjectMapper.selectById(serviceId);

+ 6 - 0
blade-service/blade-purchase-sales/pom.xml

@@ -77,6 +77,12 @@
             <version>2.8.2.RELEASE</version>
             <scope>compile</scope>
         </dependency>
+        <dependency>
+            <groupId>org.springblade</groupId>
+            <artifactId>blade-check-api</artifactId>
+            <version>2.8.2.RELEASE</version>
+            <scope>compile</scope>
+        </dependency>
     </dependencies>
 
 </project>

+ 40 - 0
blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/controller/OrderController.java

@@ -28,6 +28,10 @@ import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import lombok.AllArgsConstructor;
 import javax.validation.Valid;
 
+import org.springblade.check.dto.AuditProecessDTO;
+import org.springblade.check.entity.AuditPathsActs;
+import org.springblade.check.entity.AuditPathsLevels;
+import org.springblade.check.feign.ICheckClient;
 import org.springblade.client.entity.CorpsDesc;
 import org.springblade.client.entity.FeesDesc;
 import org.springblade.client.feign.ICorpsDescClient;
@@ -40,6 +44,7 @@ import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.finance.vojo.Acc;
 import org.springblade.finance.feign.IFinanceClient;
+import org.springblade.finance.vojo.Settlement;
 import org.springblade.purchase.sales.entity.OrderFees;
 import org.springblade.purchase.sales.entity.OrderItems;
 import org.springblade.purchase.sales.service.*;
@@ -54,6 +59,7 @@ import org.springblade.purchase.sales.vo.OrderVO;
 import org.springblade.core.boot.ctrl.BladeController;
 
 import java.math.BigDecimal;
+import java.util.Date;
 import java.util.List;
 import java.util.stream.Collectors;
 
@@ -81,6 +87,7 @@ public class OrderController extends BladeController {
 	private final IFeesDescClient feesDescClient;
 	private final IFinanceClient iFinanceClient;
 
+
 	/**
 	 * 详情
 	 */
@@ -623,4 +630,37 @@ public class OrderController extends BladeController {
 		return R.data(orderStatisticAnalysisVOIPage);
 	}
 
+	@PostMapping("checkOrder")
+	public R checkOrder(@RequestBody Order order)
+	{
+
+		orderService.checkOrder(order);
+		return R.data("操作成功");
+	}
+
+	/**
+	 * 审核通过
+	 * */
+	@PostMapping("/passCheck")
+	@ApiOperationSupport(order = 8)
+	@ApiOperation(value = "Feign-审核通过", notes = "传入财务id")
+	public R passCheck (@ApiParam(value = "财务主表id", required = true) @RequestParam Long id)
+	{
+		orderService.passCheck(id);
+		return R.success("操作成功");
+	}
+
+	/**
+	 * 审核不通过
+	 * */
+	@PostMapping("/passCancel")
+	@ApiOperationSupport(order = 8)
+	@ApiOperation(value = "Feign-审核不通过", notes = "传入财务id")
+	public R passCancel (@ApiParam(value = "财务主表id", required = true) @RequestParam Long id)
+	{
+		orderService.passCancel(id);
+		return R.success("操作成功");
+	}
+
+
 }

+ 5 - 0
blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/service/IOrderService.java

@@ -90,4 +90,9 @@ public interface IOrderService extends IService<Order> {
 
 	IPage<OrderStatisticAnalysisVO> listOrderStatisticAnalysis(Page<OrderStatisticAnalysisVO> page, @Param("tenantId")String tenantId, @Param("orderNo")String orderNo,@Param("startTime")String startTime,@Param("endTime")String endTime);
 
+	void checkOrder(Order order);
+
+	void passCheck(Long id);
+
+	void passCancel(Long id);
 }

+ 1 - 1
blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/service/impl/OrderFeesServiceImpl.java

@@ -85,7 +85,7 @@ public class OrderFeesServiceImpl extends ServiceImpl<OrderFeesMapper, OrderFees
 	 */
 	public List<OrderFees> getOrderFees(Order order){
 		List<OrderFees> orderFeesList = baseMapper.selectList(new QueryWrapper<OrderFees>().eq("pid", order.getId())
-			.eq("tenant_id", SecureUtil.getTenantId()).eq("is_deleted", 0).orderByAsc("sort"));
+			.orderByAsc("fees_type").eq("tenant_id", SecureUtil.getTenantId()).eq("is_deleted", 0).orderByAsc("sort"));
 		if (CollectionUtils.isNotEmpty(orderFeesList)){
 			orderFeesList.stream().forEach(item ->{
 				if (item.getItemId() != null){

+ 86 - 0
blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/service/impl/OrderServiceImpl.java

@@ -28,6 +28,10 @@ import com.trade.purchase.order.enums.OrderTypeEnum;
 import com.trade.purchase.order.vo.OrderDTO;
 import io.seata.spring.annotation.GlobalTransactional;
 import lombok.AllArgsConstructor;
+import org.springblade.check.dto.AuditProecessDTO;
+import org.springblade.check.entity.AuditPathsActs;
+import org.springblade.check.entity.AuditPathsLevels;
+import org.springblade.check.feign.ICheckClient;
 import org.springblade.client.entity.CorpsDesc;
 import org.springblade.client.entity.FeesDesc;
 import org.springblade.client.entity.GoodsDesc;
@@ -38,6 +42,7 @@ import org.springblade.client.feign.ISerialClient;
 import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.secure.utils.SecureUtil;
 import org.springblade.core.tool.api.R;
+import org.springblade.finance.vojo.Settlement;
 import org.springblade.purchase.sales.entity.*;
 import org.springblade.purchase.sales.vo.OrderItemBillNoVO;
 import org.springblade.purchase.sales.vo.OrderStatisticAnalysisVO;
@@ -77,6 +82,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
 	private IUserClient userClient;//获取用户信息
 	private ICorpsDescClient corpsDescClient;//获取客户信息
 	private OrderMapper orderMapper;
+	private final ICheckClient iCheckClient;
 	@Override
 	public IPage<OrderVO> selectOrderPage(IPage<OrderVO> page, OrderVO order) {
 		List<OrderVO> orderVOList = baseMapper.selectOrderPage(page, order);
@@ -545,4 +551,84 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
 		return orderMapper.listOrderStatisticAnalysis(page,tenantId,orderNo,startTime,endTime);
 	}
 
+	@Override
+	@Transactional
+	public void checkOrder(Order order)
+	{
+		Order salesOrder = baseMapper.selectById(order.getId());
+		if(order==null)
+		{
+			throw new SecurityException("审批失败,未查到单据");
+		}
+		//判断是否有审批流,如果审批流已开启就进入审批流,否则直接走申请通过
+		AuditPathsActs pathsActs = iCheckClient.getActsByActId(3, "status");
+		//没开启审批流直接走 通过流程
+		if(pathsActs==null || pathsActs.getIsEnable()==2)
+		{
+			throw new SecurityException("当前租户未查询到审批流配置");
+		}
+		else
+		{
+			salesOrder.setStatus(1);
+			baseMapper.updateById(salesOrder);
+
+			//获取审批级次
+			List<AuditPathsLevels> auditPathsLevels = iCheckClient.listLevelsByActId(3, "status");
+			AuditProecessDTO auditProecessDTO=new AuditProecessDTO();
+			//追加跳转路由url
+		/*	auditProecessDTO.setUrl(settlement.getUrl());
+			auditProecessDTO.setPageStatus(settlement.getPageStatus());
+			auditProecessDTO.setPageLabel(settlement.getPageLabel());*/
+			//增加审批类型
+			auditProecessDTO.setCheckType(order.getCheckType());
+			auditProecessDTO.setProcessType("付费审批");
+			auditProecessDTO.setPathsLevelsList(auditPathsLevels);
+			auditProecessDTO.setActId(1);
+			auditProecessDTO.setSrcBillId(salesOrder.getId());
+			auditProecessDTO.setBillId(salesOrder.getId());
+			auditProecessDTO.setBillNo(salesOrder.getOrderNo());
+			auditProecessDTO.setSendUserId(AuthUtil.getUserId());
+			auditProecessDTO.setSendName(AuthUtil.getUserName());
+			auditProecessDTO.setSendTime(new Date());
+			R financeProcess = iCheckClient.createFinanceProcess(auditProecessDTO);
+			if(!financeProcess.isSuccess())
+			{
+				throw new SecurityException("操作失败,请联系管理员");
+			}
+
+		}
+	}
+
+	@Override
+	public void passCheck(Long id)
+	{
+		LambdaQueryWrapper<Order> orderLambdaQueryWrapper=new LambdaQueryWrapper<>();
+		orderLambdaQueryWrapper
+			.eq(Order::getId,id)
+			.eq(Order::getTenantId,AuthUtil.getTenantId());
+		Order order = baseMapper.selectOne(orderLambdaQueryWrapper);
+		if(order == null)
+		{
+			throw new SecurityException("审批通过失败");
+		}
+		order.setStatus(3);
+		baseMapper.updateById(order);
+	}
+
+	@Override
+	public void passCancel(Long id)
+	{
+		LambdaQueryWrapper<Order> orderLambdaQueryWrapper=new LambdaQueryWrapper<>();
+		orderLambdaQueryWrapper
+			.eq(Order::getId,id)
+			.eq(Order::getTenantId,AuthUtil.getTenantId());
+		Order order = baseMapper.selectOne(orderLambdaQueryWrapper);
+		if(order == null)
+		{
+			throw new SecurityException("审批驳回失败");
+		}
+		order.setStatus(0);
+		baseMapper.updateById(order);
+	}
+
 }

+ 1 - 0
blade-service/trade-finance/src/main/java/org/springblade/finance/controller/AccController.java

@@ -106,6 +106,7 @@ public class AccController extends BladeController {
 		accLambdaQueryWrapper.like(StringUtils.isNotBlank(acc.getAccSysNo()),Acc::getAccSysNo,acc.getAccSysNo());
 		accLambdaQueryWrapper.like(StringUtils.isNotBlank(acc.getSrcBillNo()),Acc::getSrcBillNo,acc.getSrcBillNo());
 		accLambdaQueryWrapper.eq(acc.getCorpId()!=null,Acc::getCorpId,acc.getCorpId());
+		accLambdaQueryWrapper.eq(StringUtils.isNotBlank(acc.getItemType()),Acc::getItemType,acc.getItemType());
 		accLambdaQueryWrapper.eq(StringUtils.isNotBlank(acc.getCostType()),Acc::getCostType,acc.getCostType());
 		accLambdaQueryWrapper.eq(acc.getCreateUser()!=null,Acc::getCreateUser,acc.getCreateUser());
 		accLambdaQueryWrapper.eq(acc.getSrcParentId()!=null,Acc::getSrcParentId,acc.getSrcParentId());

+ 33 - 3
blade-service/trade-finance/src/main/java/org/springblade/finance/service/impl/SettlementServiceImpl.java

@@ -94,6 +94,19 @@ public class SettlementServiceImpl extends ServiceImpl<SettlementMapper, Settlem
 	@GlobalTransactional
 	public Settlement cancelModify(SettlementDTO settlementDTO)
 	{
+		Long id = settlementDTO.getId();
+		Settlement settlement = baseMapper.selectById(id);
+		if(settlement==null)
+		{
+			throw new SecurityException("未查到结算单,禁止操作");
+		}
+		if(settlement.getFinanceStatus().equals("待结算"))
+		{
+			throw new SecurityException("此结算单未结算 或者 已经撤销,禁止重复操作");
+		}
+
+
+
 		Settlement model=new Settlement();
 		BeanUtils.copyProperties(settlementDTO,model);
 		List<Items> itemsList = settlementDTO.getItemsList();
@@ -133,13 +146,24 @@ public class SettlementServiceImpl extends ServiceImpl<SettlementMapper, Settlem
 	@GlobalTransactional
 	public Settlement modify(SettlementDTO settlementDTO)
 	{
+		Long id = settlementDTO.getId();
+		Settlement settlement = baseMapper.selectById(id);
+		if(settlement==null)
+		{
+          throw new SecurityException("未查到结算单,禁止操作");
+		}
+		if(settlement.getFinanceStatus().equals("结算完成"))
+		{
+			throw new SecurityException("此结算单已结算过,禁止重复操作");
+		}
+
 		Settlement model=new Settlement();
 		BeanUtils.copyProperties(settlementDTO,model);
 		List<Files> filesList = settlementDTO.getFilesList();
  		List<Items> itemsList = settlementDTO.getItemsList();
 		model.setItemsList(itemsList);
 		//如果id=null, 无论主表还是从表, 必然都是新增
- 		Long id = settlementDTO.getId();
+
 		if(id==null)
 		{
 
@@ -218,6 +242,7 @@ public class SettlementServiceImpl extends ServiceImpl<SettlementMapper, Settlem
 				Settlement settlement = baseMapper.selectById(model.getId());
 				Order order = orderDescClient.getById(settlement.getSrcOrderno());
 				if(order==null)
+				if(order==null)
 				{
 					throw new SecurityException("结算未发现订单信息");
 				}
@@ -642,6 +667,8 @@ public class SettlementServiceImpl extends ServiceImpl<SettlementMapper, Settlem
 			  List<AuditPathsLevels> auditPathsLevels = iCheckClient.listLevelsByActId(1, "check_status");
 
 			  AuditProecessDTO auditProecessDTO=new AuditProecessDTO();
+			  //绑定审核类型
+			  auditProecessDTO.setCheckType(settlement.getCheckType());
 			  //追加跳转路由url
 			  auditProecessDTO.setUrl(settlement.getUrl());
 			  auditProecessDTO.setPageStatus(settlement.getPageStatus());
@@ -672,8 +699,11 @@ public class SettlementServiceImpl extends ServiceImpl<SettlementMapper, Settlem
 		itemsList.forEach(e->{
 			if(e.getSrcType()==2)
 			{
-				OrderFees orderFees=new OrderFees();
-				orderFees.setId(e.getSrcFeesId());
+				OrderFees orderFees = orderFeesClient.getById(e.getSrcFeesId());
+				if(orderFees==null)
+				{
+					throw new SecurityException("未查到原单据的费用明细,无法修改状态");
+				}
 				orderFees.setIsCheck(1);
 				R submit = orderFeesClient.submit(orderFees);
 				if(!submit.isSuccess())