Browse Source

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

lazhaoqian 4 years ago
parent
commit
04388018ce

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

@@ -122,4 +122,47 @@ public class ServiceProject  implements Serializable {
 	//客户联系人名称
 	@TableField(exist = false)
 	private String corpNames;
+
+	private String sourceBusiness;
+
+	@TableField(exist = false)
+	private Integer countCorp;
+	@TableField(exist = false)
+	private Integer countCreateUser;
+	@TableField(exist = false)
+	private BigDecimal Jan;
+	@TableField(exist = false)
+	private BigDecimal Feb;
+	@TableField(exist = false)
+	private BigDecimal Mar;
+	@TableField(exist = false)
+	private BigDecimal Apr;
+	@TableField(exist = false)
+	private BigDecimal May;
+	@TableField(exist = false)
+	private BigDecimal June;
+	@TableField(exist = false)
+	private BigDecimal July;
+	@TableField(exist = false)
+	private BigDecimal Aug;
+	@TableField(exist = false)
+	private BigDecimal Sept;
+	@TableField(exist = false)
+	private BigDecimal Oct;
+	@TableField(exist = false)
+	private BigDecimal Nov;
+	@TableField(exist = false)
+	private BigDecimal Dece;
+
+	//账户名称
+	@TableField(exist = false)
+	private String accountName;
+
+	@TableField(exist = false)
+	@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	private Date payTime;
+
+	@TableField(exist = false)
+	private Integer countUserName;
 }

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

@@ -140,4 +140,33 @@ public class ServiceProjectItem extends TenantEntity implements Serializable {
 	private Long cornId;
 
 
+	@TableField(exist = false)
+	private BigDecimal Jan;
+	@TableField(exist = false)
+	private BigDecimal Feb;
+	@TableField(exist = false)
+	private BigDecimal Mar;
+	@TableField(exist = false)
+	private BigDecimal Apr;
+	@TableField(exist = false)
+	private BigDecimal May;
+	@TableField(exist = false)
+	private BigDecimal June;
+	@TableField(exist = false)
+	private BigDecimal July;
+	@TableField(exist = false)
+	private BigDecimal Aug;
+	@TableField(exist = false)
+	private BigDecimal Sept;
+	@TableField(exist = false)
+	private BigDecimal Oct;
+	@TableField(exist = false)
+	private BigDecimal Nov;
+	@TableField(exist = false)
+	private BigDecimal Dece;
+
+	@TableField(exist = false)
+	private Integer countCorp;
+
+
 }

+ 26 - 0
blade-service/blade-client/src/main/java/org/springblade/client/goods/controller/GoodsDescController.java

@@ -40,6 +40,7 @@ import org.springblade.client.goods.enums.GoodsTypeEnum;
 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.core.excel.util.ExcelUtil;
@@ -50,6 +51,7 @@ 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.Func;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -338,4 +340,28 @@ public class GoodsDescController extends BladeController {
 		}
 		return goodsDescService.importGoodsInfo(excelList,false);
 	}
+
+	/** 导出商品*/
+	@GetMapping("/export-out-info")
+	@ApiOperationSupport(order = 9)
+	@ApiOperation(value = "导出模板")
+	public void exportOutInfo(HttpServletResponse response)
+	{
+		List<GoodsOutExcel> list = new ArrayList<>();
+		LambdaQueryWrapper<GoodsDesc> goodsDescLambdaQueryWrapper=new LambdaQueryWrapper<>();
+		goodsDescLambdaQueryWrapper
+			.orderByAsc(GoodsDesc::getCode)
+			.eq(GoodsDesc::getIsDeleted,0)
+			.eq(GoodsDesc::getTenantId,AuthUtil.getTenantId());
+		List<GoodsDesc> goodsDescs = goodsDescService.list(goodsDescLambdaQueryWrapper);
+		if(CollectionUtils.isNotEmpty(goodsDescs))
+		{
+			goodsDescs.forEach(e->{
+				GoodsOutExcel goodsOutExcel=new GoodsOutExcel();
+				BeanUtils.copyProperties(e,goodsOutExcel);
+				list.add(goodsOutExcel);
+			});
+		}
+		ExcelUtil.export(response, "导出产品信息", "导出数据表", list, GoodsOutExcel.class);
+	}
 }

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

@@ -0,0 +1,26 @@
+package org.springblade.client.goods.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;
+
+@Data
+@ColumnWidth(25)
+@HeadRowHeight(20)
+@ContentRowHeight(18)
+public class GoodsOutExcel
+{
+	@ExcelProperty("大字")
+	private String code;
+
+	@ExcelProperty("花纹")
+	private String brandItem;
+
+	@ExcelProperty("规格型号")
+	private String typeNo;
+
+	@ExcelProperty("数量")
+	private String number;
+}

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

@@ -30,6 +30,7 @@ import springfox.documentation.annotations.ApiIgnore;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 
 import javax.management.relation.RoleResult;
+import java.math.BigDecimal;
 import java.security.Security;
 import java.util.*;
 import java.util.stream.Collectors;
@@ -87,16 +88,17 @@ public class ProjectController {
 
 		//客户名称
 		records.forEach(e->{
-			if(corpsDescClient.getCorpMessage(e.getCorpId()).isSuccess())
+			R<CorpsDesc> corpMessage = corpsDescClient.getCorpMessage(e.getCorpId());
+			if(corpMessage.isSuccess()&&corpMessage.getData()!=null)
 			{
-				e.setCorpNames(corpsDescClient.getCorpMessage(e.getCorpId()).getData().getCname());
+				e.setCorpNames(corpMessage.getData().getCname());
 			}
 
 		});
 
 
 
-		//检查是否可以删除主表,没有字表信息 或者 字表status全部为0 就可以删除
+		//检查是否可以删除主表,没有子表信息 或者 子表status全部为0 就可以删除
 		if(flag==0)
 		{
 			records.forEach(k->{
@@ -109,7 +111,10 @@ public class ProjectController {
 				if(!CollectionUtils.isEmpty(projectItemList))
 				{
 					k.setAllowDelete(false);
+					k.setAccountName(projectItemList.get(0).getAccountName());
+					k.setPayTime(projectItemList.get(0).getPayTime());
 				}
+
 			});
 
 		}
@@ -124,6 +129,12 @@ public class ProjectController {
 					.eq(ServiceProjectItem::getPId,e.getId());
 				List<ServiceProjectItem> itemList = serviceProjectItemService.list(lambdaQueryWrapper);
 				e.setItemList(itemList);
+				if(!CollectionUtils.isEmpty(itemList))
+				{
+					e.setAccountName(itemList.get(0).getAccountName());
+					e.setPayTime(itemList.get(0).getPayTime());
+				}
+
 			});
 			List<ServiceProject> collect = records.stream().filter(e -> !CollectionUtils.isEmpty(e.getItemList())).collect(Collectors.toList());
 			iPage.setRecords(collect);
@@ -282,13 +293,13 @@ public class ProjectController {
 					  .eq(ServiceProject::getId,e.getPId())).getCorpId();
 				  e.setCornId(corpId);
 				  R<CorpsDesc> corpMessage = corpsDescClient.getCorpMessage(corpId);
-				  if(corpMessage.isSuccess())
+				  if(corpMessage.isSuccess()&&corpMessage.getData()!=null)
 				  {
 					  e.setCornName(corpMessage.getData().getCname());
 				  }
 				  //任务部门
 				  R<Dept> dept = iSysClient.getDept(e.getDeptid());
-				  if(dept.isSuccess())
+				  if(dept.isSuccess()&&dept.getData()!=null)
 				  {
 				  	e.setDeptName(dept.getData().getDeptName());
 				  }
@@ -320,5 +331,329 @@ public class ProjectController {
 		return R.data(projectItem.getPId());
 	}
 
+	/**
+	 * 2.0新逻辑-主营项目主表清核-必须所有子表明细结算之后才可以清核
+ 	 */
+	@PostMapping("/masterCheck")
+    public R masterCheck(@RequestParam(name = "id",  required = true) Long id)
+	{
+		serviceProjectService.masterCheck(id);
+		return R.success("操作成功");
+	}
+
+	/**
+	 * 2.0新逻辑-微服务对外feign调用接口-主营项目审批通过
+	 * */
+	@PostMapping("/projectPassCheck")
+	public R projectPassCheck(@RequestParam(name = "id",  required = true) Long id)
+	{
+		serviceProjectService.projectPassCheck(id);
+		return R.success("操作成功");
+	}
+
+	/**
+	 * 2.0新逻辑-微服务对外feign调用接口-主营项目审批驳回
+	 * */
+	@PostMapping("/projectPassCancel")
+	public R projectPassCancel(@RequestParam(name = "id",  required = true) Long id)
+	{
+		serviceProjectService.projectPassCancel(id);
+		return R.success("操作成功");
+	}
+
+	/**
+	 * 2.0新逻辑 主营项目明细结算和取消结算功能
+	 * */
+	@PostMapping("/settleAccounts")
+	public R settleAccounts(@RequestParam(name = "id",  required = true) Long id,
+							@RequestParam(name = "status", required = true) int status
+							,@RequestParam(name = "accountName", required = false) String accountName
+							,@RequestParam(name = "accountBank", required = false) String accountBank
+							,@RequestParam(name = "payTime", required = false) Date payTime
+							,@RequestParam(name = "accountNo", required = false) String accountNo)
+	{
+		serviceProjectService.settleAccounts(id,status,accountName,accountBank,payTime,accountNo);
+		return R.success("操作成功");
+	}
+
+	/**
+	 * 2.0-统计列表
+	 * */
+	@GetMapping("/statisticalAnalysis")
+	public R statisticalAnalysis()
+	{
+		List<ServiceProjectItem> serviceProjectItems = serviceProjectItemService.statisticalAnalysis(AuthUtil.getTenantId());
+		return R.data(serviceProjectItems);
+	}
+
+	/**
+	 *
+	 * 2.0-业绩分析
+	 * */
+	@GetMapping("/performanceAnalysis")
+	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 = "userName",  required = false) String userName)
+	{
+
+		//按承做人统计多少个客户
+		if(flag==1)
+		{
+			Page<ServiceProjectItem> page=new Page<>(current,size);
+			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);
+			//分组不同的承做人
+			IPage<ServiceProjectItem>  ipage= serviceProjectItemService.page(page,itemLambdaQueryWrapper);
+			if(CollectionUtils.isEmpty(ipage.getRecords()))
+			{
+               return R.data(Collections.EMPTY_LIST);
+			}
+			Long finalYear = year;
+			ipage.getRecords().forEach(e->{
+				//统计此制单人多少个客户
+				LambdaQueryWrapper<ServiceProjectItem> count=new LambdaQueryWrapper<>();
+				count
+					.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 = 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
+			});
+           return R.data(ipage);
+		}
+		else if(flag==2)
+		{
+			//获取结算时间为指定年的数据
+			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);
+			}
+
+            //通过上述数据,查询相关客户数据
+			Page<ServiceProject> page=new Page<>(current,size);
+			LambdaQueryWrapper<ServiceProject> countCorps=new LambdaQueryWrapper<>();
+			countCorps
+				.isNotNull(ServiceProject::getCorpId)
+				.in(ServiceProject::getId,pids)
+				.eq(ServiceProject::getIsDeleted,0)
+				.groupBy(ServiceProject::getCorpId)
+				.eq(ServiceProject::getTenantId,AuthUtil.getTenantId());
+			IPage<ServiceProject> iPage = serviceProjectService.page(page, countCorps);
+
+			Long finalYear = year;
+			//开始封装数据
+			iPage.getRecords().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
+
+			});
+			return R.data(iPage);
+		}
+
+
+
+/*
+		if(year==null&&year==0L&&year==0)
+		{
+			Calendar cal = Calendar.getInstance();
+			year = Long.valueOf(cal.get(Calendar.YEAR));
+		}
+		//查询结算年份对应的主表
+		LambdaQueryWrapper<ServiceProjectItem> itemLambdaQueryWrapper=new LambdaQueryWrapper<>();
+		itemLambdaQueryWrapper.apply(" year(pay_time) = '"+year+"'");
+		itemLambdaQueryWrapper.eq(ServiceProjectItem::getTenantId,AuthUtil.getTenantId());
+		itemLambdaQueryWrapper.eq(ServiceProjectItem::getIsDeleted,0);
+		if(flag==1)
+		{
+				itemLambdaQueryWrapper.eq(createUser!=null,ServiceProjectItem::getCreateUser,createUser);
+		}
+		List<Long> pids = serviceProjectItemService.list(itemLambdaQueryWrapper).stream().map(ServiceProjectItem::getPId).collect(Collectors.toList());
+        if(CollectionUtils.isEmpty(pids))
+        {
+        	return R.data(null);
+		}
+
+		LambdaQueryWrapper<ServiceProject> serviceProjectLambdaQueryWrapper=new LambdaQueryWrapper<>();
+        Page<ServiceProject> page=new Page<>(current,size);
+		serviceProjectLambdaQueryWrapper
+			.in(ServiceProject::getId,pids)
+			.orderByAsc(ServiceProject::getCreateTime)
+			.eq(ServiceProject::getIsDeleted,0)
+			.eq(ServiceProject::getTenantId,AuthUtil.getTenantId());
+		    if(flag==1)
+		    {
+				serviceProjectLambdaQueryWrapper.groupBy(ServiceProject::getCreateUser);
+			}
+			else if(flag==2)
+			{
+				serviceProjectLambdaQueryWrapper.groupBy(ServiceProject::getCorpId);
+			}
+		IPage<ServiceProject> iPage = serviceProjectService.page(page,serviceProjectLambdaQueryWrapper);
+		List<ServiceProject> serviceProjectList = iPage.getRecords();
+		   	if(!CollectionUtils.isEmpty(serviceProjectList))
+		   	{
+				Long finalYear = year;
+				iPage.getRecords().forEach(lt->{
+
+					LambdaQueryWrapper<ServiceProject> countWrapper=new LambdaQueryWrapper<>();
+					countWrapper
+						.apply(" year(create_time) = '"+finalYear+"'")
+						.eq(ServiceProject::getIsDeleted,0)
+						.eq(ServiceProject::getTenantId,AuthUtil.getTenantId());
+
+					ServiceProject serviceProject=null;
+					if(flag==1)
+					{
+						    countWrapper.isNotNull(ServiceProject::getCorpId);
+						    countWrapper.eq(ServiceProject::getCreateUser,lt.getCreateUser());
+					     	List<ServiceProject> projects = serviceProjectService.list(countWrapper);
+						    int copsSize = projects.stream().map(ServiceProject::getCorpId).distinct().collect(Collectors.toList()).size();
+							lt.setCountCorp(copsSize);
+
+					     	serviceProject = calculateServiceCharge(lt.getCreateUser(), 1, finalYear);
+					}
+					else if(flag==2)
+					{
+						    countWrapper.isNotNull(ServiceProject::getCreateUser);
+						    countWrapper.eq(ServiceProject::getCorpId,lt.getCorpId());
+						    List<ServiceProject> projects = serviceProjectService.list(countWrapper);
+						    int createUserSize = projects.stream().map(ServiceProject::getCreateUser).distinct().collect(Collectors.toList()).size();
+						    lt.setCountCreateUser(createUserSize);
+
+						    serviceProject = calculateServiceCharge(lt.getCorpId(), 2, finalYear);
+					}
+                    //客户名称
+					if(lt.getCorpId()!=null)
+					{
+						R<CorpsDesc> corpMessage = corpsDescClient.getCorpMessage(lt.getCorpId());
+						if(corpMessage.isSuccess()&&corpMessage.getData()!=null)
+						{
+							lt.setCorpNames(corpMessage.getData().getCname());
+						}
+
+					}
+					lt.setJan(serviceProject==null?BigDecimal.ZERO:serviceProject.getJan());//1
+					lt.setFeb(serviceProject==null?BigDecimal.ZERO:serviceProject.getFeb());//2
+					lt.setMar(serviceProject==null?BigDecimal.ZERO:serviceProject.getMar());//3
+					lt.setApr(serviceProject==null?BigDecimal.ZERO:serviceProject.getApr());//4
+					lt.setMay(serviceProject==null?BigDecimal.ZERO:serviceProject.getMay());//5
+					lt.setJune(serviceProject==null?BigDecimal.ZERO:serviceProject.getJune());//6
+					lt.setJuly(serviceProject==null?BigDecimal.ZERO:serviceProject.getJuly());//7
+					lt.setAug(serviceProject==null?BigDecimal.ZERO:serviceProject.getAug());//8
+					lt.setSept(serviceProject==null?BigDecimal.ZERO:serviceProject.getSept());//9
+					lt.setOct(serviceProject==null?BigDecimal.ZERO:serviceProject.getOct());//10
+					lt.setNov(serviceProject==null?BigDecimal.ZERO:serviceProject.getNov());//11
+					lt.setDece(serviceProject==null?BigDecimal.ZERO:serviceProject.getDece());//12
+				});
+
+
+			}
+		   	return R.data(iPage);*/
+		return R.data(Collections.EMPTY_LIST);
+	}
+
+    //计算每个月的服务费
+	public ServiceProject calculateServiceCharge(String userName,Long id,int flag,Long year)
+	{
+		  if(flag==1)
+		  {
+			  return serviceProjectService.calculateServiceCharge(AuthUtil.getTenantId(), year.toString(), null, id,userName);
+		  }
+		  else if(flag==2)
+		  {
+			  return serviceProjectService.calculateServiceCharge(AuthUtil.getTenantId(),year.toString(),id,null,userName);
+		  }
+		  else
+		  {
+		  	throw new SecurityException("查询服务费失败");
+		  }
+
+	}
+
 
 }

+ 7 - 0
blade-service/blade-project/src/main/java/org/springblade/project/mapper/ServiceProjectItemMapper.java

@@ -3,8 +3,12 @@ package org.springblade.project.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import org.springblade.project.entity.ServiceProject;
 import org.springblade.project.entity.ServiceProjectItem;
 
+import java.util.List;
+
 /**
  * 服务明细
  *
@@ -15,4 +19,7 @@ import org.springblade.project.entity.ServiceProjectItem;
 @Mapper
 public interface ServiceProjectItemMapper extends BaseMapper<ServiceProjectItem> {
 
+	List<ServiceProjectItem>  statisticalAnalysis(@Param("tenantId") String tenantId);
+
+	ServiceProject calculateServiceCharge(@Param("tenantId") String tenantId,@Param("year") String year,@Param("corpId") Long corpId,@Param("createUser") Long createUser,@Param("userName")String userName);
 }

+ 89 - 0
blade-service/blade-project/src/main/java/org/springblade/project/mapper/ServiceProjectItemMapper.xml

@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.springblade.project.mapper.ServiceProjectItemMapper">
+
+    <select id="statisticalAnalysis" resultType="org.springblade.project.entity.ServiceProjectItem">
+    select
+    (CASE a.itemStatus
+    WHEN  0 THEN '录入'
+    WHEN  1 THEN '请核'
+    WHEN  2 THEN '审核中'
+    WHEN  3 THEN '审核通过'
+    WHEN  4 THEN '正在结算'
+    WHEN  5 THEN '结算完成'
+    WHEN  6 THEN ''
+    WHEN  7 THEN '追加'
+    WHEN  8 THEN '退费'
+    ELSE 'null' END) as strStatus ,
+    a.project_type as projectType ,
+    b.cname as cornName ,
+    a.p_name as pname,
+    ((a.service_charge+ a.mat_money )-a.cost_return) as grossIncome,
+    a.service_charge as serviceCharge,
+    a.mat_money as matMoney,
+    a.amount as amount,
+    a.user_name as userName,
+    c.dept_name  as deptName,
+    a.ACCOUNT_NAME as accountName,
+    a.pay_time as payTime,
+    a.frequency as frequency,
+    a.reminder_day as reminderDay,
+    a.begin_time as beginTime,
+    a.actual_date as actualDate,
+    a.create_user_name as createUserName,
+    a.create_time as createTime,
+    a.update_user_name as updateUserName,
+    a.update_time as updateTime,
+    a.remarks as remarks
+    from
+    (
+	SELECT
+	a.corp_id,
+	b.`status` as itemStatus,
+	b.project_type as projectType,
+	b.*
+    FROM
+	service_project a,
+	service_project_item b
+    WHERE
+		  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')
+	) a
+	LEFT JOIN basic_corps_desc b on a.corp_id=b.id
+	left JOIN blade_dept c on a.deptid =c.id
+	order by  a.update_time desc
+    </select>
+
+    <select id="calculateServiceCharge" resultType="org.springblade.project.entity.ServiceProject">
+        SELECT
+        sum( CASE MONTH ( b.pay_time ) WHEN '1' THEN b.service_charge ELSE 0 END ) AS Jan,
+        sum( CASE MONTH ( b.pay_time ) WHEN '2' THEN b.service_charge ELSE 0 END ) AS Feb,
+        sum( CASE MONTH ( b.pay_time ) WHEN '3' THEN b.service_charge ELSE 0 END ) AS Mar,
+        sum( CASE MONTH ( b.pay_time ) WHEN '4' THEN b.service_charge ELSE 0 END ) AS Apr,
+        sum( CASE MONTH ( b.pay_time ) WHEN '5' THEN b.service_charge ELSE 0 END ) AS May,
+        sum( CASE MONTH ( b.pay_time ) WHEN '6' THEN b.service_charge ELSE 0 END ) AS June,
+        sum( CASE MONTH ( b.pay_time ) WHEN '7' THEN b.service_charge ELSE 0 END ) AS July,
+        sum( CASE MONTH ( b.pay_time ) WHEN '8' THEN b.service_charge ELSE 0 END ) AS Aug,
+        sum( CASE MONTH ( b.pay_time ) WHEN '9' THEN b.service_charge ELSE 0 END ) AS Sept,
+        sum( CASE MONTH ( b.pay_time ) WHEN '10' THEN b.service_charge ELSE 0 END ) AS Oct,
+        sum( CASE MONTH ( b.pay_time ) WHEN '11' THEN b.service_charge ELSE 0 END ) AS Nov,
+        sum( CASE MONTH ( b.pay_time ) WHEN '12' THEN b.service_charge ELSE 0 END ) AS Dece
+        FROM
+        service_project a ,service_project_item b
+        WHERE b.p_id=a.id
+        AND a.tenant_id = #{tenantId}
+        AND YEAR ( b.pay_time ) = #{year}
+        <if test="corpId!=null">
+            AND a.corp_id = #{corpId}
+        </if>
+        <if test="createUser!=null">
+            AND b.create_user = #{createUser}
+        </if>
+        <if test="userName!=null">
+            AND b.user_name = #{userName}
+        </if>
+    </select>
+
+</mapper>

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

@@ -3,6 +3,7 @@ package org.springblade.project.service;
 
 
 import com.baomidou.mybatisplus.extension.service.IService;
+import org.apache.ibatis.annotations.Param;
 import org.springblade.core.mp.base.BaseService;
 import org.springblade.project.entity.ServiceProjectItem;
 
@@ -19,5 +20,5 @@ import java.util.Map;
 public interface ServiceProjectItemService extends BaseService<ServiceProjectItem>
 {
 
-
+	List<ServiceProjectItem>  statisticalAnalysis( String tenantId);
 }

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

@@ -4,11 +4,13 @@ package org.springblade.project.service;
 
 
 import com.baomidou.mybatisplus.extension.service.IService;
+import org.apache.ibatis.annotations.Param;
 import org.springblade.core.mp.base.BaseService;
 import org.springblade.core.tool.api.R;
 import org.springblade.project.entity.ServiceProject;
 import com.baomidou.mybatisplus.extension.service.IService;
 import org.springblade.project.entity.ServiceProjectItem;
+import org.springframework.web.bind.annotation.RequestParam;
 
 import javax.xml.crypto.Data;
 import java.util.Date;
@@ -30,4 +32,13 @@ 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 projectPassCheck(Long id);
+
+    void projectPassCancel(Long id);
+
+    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);
 }

+ 7 - 0
blade-service/blade-project/src/main/java/org/springblade/project/service/impl/ServiceProjectItemServiceImpl.java

@@ -1,5 +1,6 @@
 package org.springblade.project.service.impl;
 
+import lombok.AllArgsConstructor;
 import org.springblade.core.mp.base.BaseServiceImpl;
 import org.springblade.project.entity.ServiceProjectItem;
 import org.springblade.project.mapper.ServiceProjectItemMapper;
@@ -16,7 +17,13 @@ import java.util.Map;
 
 
 @Service
+@AllArgsConstructor
 public class ServiceProjectItemServiceImpl extends BaseServiceImpl<ServiceProjectItemMapper, ServiceProjectItem> implements ServiceProjectItemService {
 
+	private final ServiceProjectItemMapper serviceProjectItemMapper;
 
+	@Override
+	public List<ServiceProjectItem> statisticalAnalysis(String tenantId) {
+		return serviceProjectItemMapper.statisticalAnalysis(tenantId);
+	}
 }

+ 129 - 0
blade-service/blade-project/src/main/java/org/springblade/project/service/impl/ServiceProjectServiceImpl.java

@@ -24,6 +24,8 @@ import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.interceptor.TransactionAspectSupport;
 import org.springframework.util.CollectionUtils;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.web.bind.annotation.RequestParam;
+
 import javax.annotation.Resource;
 import java.math.BigDecimal;
 import java.util.Date;
@@ -352,6 +354,131 @@ public class ServiceProjectServiceImpl extends ServiceImpl<ServiceProjectMapper,
 
 	}
 
+	@Override
+	@Transactional
+	public void masterCheck(Long id)
+	{
+		ServiceProject serviceProject = serviceProjectMapper.selectById(id);
+		if(serviceProject==null)
+		{
+			throw new SecurityException("清核失败:主营项目不存在或已被删除");
+		}
+		if(serviceProject.getStatus()>0)
+		{
+			throw new SecurityException("清核失败:主营项目已开启审批,禁止重复提交");
+		}
+		//查询子表是否符合请核条件
+		LambdaQueryWrapper<ServiceProjectItem> itemLambdaQueryWrapper=new LambdaQueryWrapper<>();
+		itemLambdaQueryWrapper
+			.eq(ServiceProjectItem::getPId,id)
+			.eq(ServiceProjectItem::getIsDeleted,0);
+		List<ServiceProjectItem> serviceProjectItems = serviceProjectItemMapper.selectList(itemLambdaQueryWrapper);
+		if(!CollectionUtils.isEmpty(serviceProjectItems))
+		{
+			//存在一个未结算完成, 都不可以请核
+			boolean match = serviceProjectItems.stream().anyMatch(e -> e.getStatus() != 5);
+			if(match)
+			{
+				throw new SecurityException("清核失败:子表有未结算完成的数据");
+			}
+		}
+		else
+		{
+			throw new SecurityException("清核失败:未查询到子表结算信息");
+		}
+
+		//todo 查看是否开启审批流,如果已经开启了,走审批流,反之直接走审批通过接口
+		//暂未加审批直接通过
+        this.projectPassCheck(id);
+	}
+
+	@Override
+	@Transactional
+	public void projectPassCheck(Long id)
+	{
+		ServiceProject serviceProject = serviceProjectMapper.selectById(id);
+		if(serviceProject==null)
+		{
+			throw new SecurityException("操作失败:未查询到主营项目数据");
+		}
+		serviceProject.setStatus(3);
+		serviceProjectMapper.updateById(serviceProject);
+	}
+
+	@Override
+	@Transactional
+	public void projectPassCancel(Long id)
+	{
+		ServiceProject serviceProject = serviceProjectMapper.selectById(id);
+		if(serviceProject==null)
+		{
+			throw new SecurityException("操作失败:未查询到主营项目数据");
+		}
+		serviceProject.setStatus(0);
+		serviceProjectMapper.updateById(serviceProject);
+	}
+
+	@Override
+	@Transactional
+	public void settleAccounts(Long id,int status, String accountName,String accountBank,Date payTime,String accountNo)
+	{
+		ServiceProjectItem serviceProjectItem = serviceProjectItemMapper.selectById(id);
+		serviceProjectItem.setAccountName(accountName);
+		serviceProjectItem.setAccountBank(accountBank);
+		serviceProjectItem.setAccountNo(accountNo);
+		serviceProjectItem.setPayTime(payTime);
+
+		if(status==5)
+		{
+			if(serviceProjectItem.getStatus()==5)
+			{
+				throw new SecurityException("操作失败:此明细已完成结算,禁止重复提交");
+			}
+			//主营项目子表操作
+			serviceProjectItem.setStatus(5);
+			serviceProjectItem.setPayTime(new Date());
+			serviceProjectItemMapper.updateById(serviceProjectItem);
+			//主营项目主表操作
+			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().getUserName());
+			serviceProjectMapper.updateById(targetServiceProject);
+		}
+		else if(status==6)
+		{
+			if(serviceProjectItem.getStatus()!=5)
+			{
+				throw new SecurityException("操作失败:此明细暂未结算,禁止撤回");
+			}
+			//status=6代表撤回, item状态回到4
+			serviceProjectItem.setStatus(4);
+			serviceProjectItem.setPayTime(null);
+			serviceProjectItemMapper.updateById(serviceProjectItem);
+
+			//主表信息
+			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().getUserName());
+			serviceProjectMapper.updateById(targetServiceProject);
+		}
+	}
+
+	@Override
+	public ServiceProject calculateServiceCharge(String tenantId, String year, Long corpId, Long createUser,String userName)
+	  {
+		return serviceProjectItemMapper.calculateServiceCharge(tenantId,year,corpId,createUser,userName);
+	}
+
 	public void checkMoney(Long serviceId,List<ServiceProjectItem> items)
 	{
 		ServiceProject serviceProject = serviceProjectMapper.selectById(serviceId);
@@ -367,4 +494,6 @@ public class ServiceProjectServiceImpl extends ServiceImpl<ServiceProjectMapper,
           throw new RuntimeException("操作失败,明细总金额大于合同金额");
 		}
 	}
+
+
 }

+ 1 - 1
blade-service/trade-finance/pom.xml

@@ -9,7 +9,7 @@
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
-    <artifactId>trade-finance</artifactId>
+    <artifactId>blade-finance</artifactId>
     <name>${project.artifactId}</name>
     <version>2.8.2.RELEASE</version>
 

+ 1 - 1
blade-service/trade-purchase/pom.xml

@@ -9,7 +9,7 @@
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
-    <artifactId>trade-purchase</artifactId>
+    <artifactId>blade-purchase</artifactId>
     <name>${project.artifactId}</name>
     <version>2.8.2.RELEASE</version>