Browse Source

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

lazhaoqian 4 years ago
parent
commit
697821068a
22 changed files with 1168 additions and 0 deletions
  1. 17 0
      blade-service-api/blade-project-api/pom.xml
  2. 109 0
      blade-service-api/blade-project-api/src/main/java/org/springblade/project/entity/ServiceProject.java
  3. 68 0
      blade-service-api/blade-project-api/src/main/java/org/springblade/project/entity/ServiceProjectFiles.java
  4. 116 0
      blade-service-api/blade-project-api/src/main/java/org/springblade/project/entity/ServiceProjectItem.java
  5. 1 0
      blade-service-api/pom.xml
  6. 15 0
      blade-service/blade-project/Dockerfile
  7. 94 0
      blade-service/blade-project/pom.xml
  8. 39 0
      blade-service/blade-project/src/main/java/org/springblade/project/ProjectApplication.java
  9. 187 0
      blade-service/blade-project/src/main/java/org/springblade/project/controller/ProjectController.java
  10. 55 0
      blade-service/blade-project/src/main/java/org/springblade/project/controller/ProjectFilesController.java
  11. 20 0
      blade-service/blade-project/src/main/java/org/springblade/project/mapper/ServiceProjectFilesMapper.java
  12. 18 0
      blade-service/blade-project/src/main/java/org/springblade/project/mapper/ServiceProjectItemMapper.java
  13. 19 0
      blade-service/blade-project/src/main/java/org/springblade/project/mapper/ServiceProjectMapper.java
  14. 21 0
      blade-service/blade-project/src/main/java/org/springblade/project/service/ServiceProjectFilesService.java
  15. 23 0
      blade-service/blade-project/src/main/java/org/springblade/project/service/ServiceProjectItemService.java
  16. 30 0
      blade-service/blade-project/src/main/java/org/springblade/project/service/ServiceProjectService.java
  17. 29 0
      blade-service/blade-project/src/main/java/org/springblade/project/service/impl/ServiceProjectFilesServiceImpl.java
  18. 22 0
      blade-service/blade-project/src/main/java/org/springblade/project/service/impl/ServiceProjectItemServiceImpl.java
  19. 254 0
      blade-service/blade-project/src/main/java/org/springblade/project/service/impl/ServiceProjectServiceImpl.java
  20. 11 0
      blade-service/blade-project/src/main/resources/application-dev.yml
  21. 10 0
      blade-service/blade-project/src/main/resources/application-prod.yml
  22. 10 0
      blade-service/blade-project/src/main/resources/application-test.yml

+ 17 - 0
blade-service-api/blade-project-api/pom.xml

@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>blade-service-api</artifactId>
+        <groupId>org.springblade</groupId>
+        <version>2.8.2.RELEASE</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>blade-project-api</artifactId>
+    <name>${project.artifactId}</name>
+    <version>2.8.2.RELEASE</version>
+    <packaging>jar</packaging>
+
+</project>

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

@@ -0,0 +1,109 @@
+package org.springblade.project.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import org.springblade.core.tenant.mp.TenantEntity;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+
+/**
+ * 服务模块
+ *
+ * @author castiel
+ * @email sunlightcs@gmail.com
+ * @date 2021-10-26 13:50:49
+ */
+@Data
+@TableName("service_project")
+public class ServiceProject extends TenantEntity implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+	//主键
+	@TableId
+	private Long id;
+	//系统编号
+	private String sysNo;
+	//项目编号
+	private String code;
+	//项目名称
+	private String cName;
+	//客户id
+	private Long corpId;
+	//客户联系人
+	private String corpAttn;
+	//电话
+	private String corpTel;
+	//承揽人
+	private String salesName;
+	//收款方式
+	private String paymentType;
+	//应收金额
+	private BigDecimal debitAmount;
+	//预收金额
+	private BigDecimal advanceAmount;
+	//已收金额
+	private BigDecimal settlmentAmount;
+	//未收金额
+	private BigDecimal balanceAmount;
+	//开始时间
+	@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	private Date beginTime;
+	//结束时间
+	@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	private Date endTime;
+	//租户id
+	private String tenantId;
+	//版本
+	private String version;
+	//特别提醒
+	private String specialRemarks;
+	//状态
+	private Integer status;
+	//是否删除
+	@TableLogic
+	private Integer isDeleted;
+	//备注
+	private String remark;
+	//创建人
+	private Long createUser;
+	//创建部门
+	private Long createDept;
+	//创建时间
+	@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	private Date createTime;
+	//创建人姓名
+	private String createUserName;
+	//修改人
+	private Long updateUser;
+	//修改时间
+	@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	private Date updateTime;
+	//修改人姓名
+	private String updateUserName;
+	//责任人
+	private String dutyName;
+
+	@TableField(exist = false)
+	private List<ServiceProjectItem> itemList;
+
+	@TableField(exist = false)
+	private List<ServiceProjectFiles> filesList;
+
+	//是否允许删除主表, 默认可以
+	@TableField(exist = false)
+	private Boolean allowDelete=true;
+
+}

+ 68 - 0
blade-service-api/blade-project-api/src/main/java/org/springblade/project/entity/ServiceProjectFiles.java

@@ -0,0 +1,68 @@
+package org.springblade.project.entity;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import org.springblade.core.tenant.mp.TenantEntity;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+
+/**
+ * 服务明细
+ *
+ * @author castiel
+ * @email sunlightcs@gmail.com
+ * @date 2021-10-26 13:50:49
+ */
+@Data
+@TableName("service_project_files")
+public class ServiceProjectFiles extends TenantEntity implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+	//
+	@TableId
+	private Long id;
+	//主表主键
+	private Long pId;
+	//排序
+	private Integer sort;
+
+	private String fileName;
+
+	private String url;
+
+	private String remarks;
+
+	private String version;
+
+	private String tenantId;
+    @TableLogic
+	private Integer isDeleted;
+
+	//创建人
+	private Long createUser;
+	//创建时间
+	@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	private Date createTime;
+	//修改人
+	private Long updateUser;
+	//修改时间
+	@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	private Date updateTime;
+
+	private String createUserName;
+	private String updateUserName;
+
+
+
+
+
+}

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

@@ -0,0 +1,116 @@
+package org.springblade.project.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import org.springblade.core.tenant.mp.TenantEntity;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+
+
+/**
+ * 服务明细
+ *
+ * @author castiel
+ * @email sunlightcs@gmail.com
+ * @date 2021-10-26 13:50:49
+ */
+@Data
+@TableName("service_project_item")
+public class ServiceProjectItem extends TenantEntity implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+	//
+	@TableId
+	private Long id;
+	//主表主键
+	private Long pId;
+	//排序
+	private Integer sort;
+	//费用id
+	private Long goodsId;
+	//备注
+	private String feeRemarks;
+	//计费单位
+	private String unit;
+	//数量
+	private BigDecimal quantity;
+	//单价
+	private BigDecimal price;
+	//金额
+	private BigDecimal amount;
+	//频率
+	private String frequency;
+	//提醒日
+	private Date reminderDay;
+	//税率
+	private BigDecimal taxRate;
+	//核销金额
+	private BigDecimal settlmentAmount;
+	//任务部门
+	private Long deptid;
+	//承做人
+	private Long userid;
+	//开始时间
+	@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	private Date beginTime;
+	//结束时间
+	@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	private Date endTime;
+	//实际完成时间
+	@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	private Date actualDate;
+	//账户名称
+	private String accountName;
+	//开户银行
+	private String accountBank;
+	//银行账号
+	private String accountNo;
+	//备注
+	private String remarks;
+	//版本
+	private String version;
+	//租户id
+	private String tenantId;
+	//创建人
+	private Long createUser;
+	//创建部门
+	private Long createDept;
+	//创建时间
+	@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	private Date createTime;
+	//修改人
+	private Long updateUser;
+	//修改时间
+	@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	private Date updateTime;
+	//状态
+	private Integer status;
+	//是否已删除
+	@TableLogic
+	private Integer isDeleted;
+
+
+
+	private String createUserName;
+	private String updateUserName;
+	private String pName;
+
+	@TableField(exist = false)
+	private String strStatus;
+
+
+
+}

+ 1 - 0
blade-service-api/pom.xml

@@ -27,6 +27,7 @@
         <module>blade-stock-api</module>
         <module>blade-mocha-item-api</module>
         <module>trade-purchase-api</module>
+        <module>blade-project-api</module>
     </modules>
 
     <dependencies>

+ 15 - 0
blade-service/blade-project/Dockerfile

@@ -0,0 +1,15 @@
+FROM bladex/alpine-java:openjdk8-openj9_cn_slim
+
+MAINTAINER bladejava@qq.com
+
+RUN mkdir -p /blade/desk
+
+WORKDIR /blade/desk
+
+EXPOSE 8105
+
+ADD ./target/blade-desk.jar ./app.jar
+
+ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "app.jar"]
+
+CMD ["--spring.profiles.active=test"]

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

@@ -0,0 +1,94 @@
+<?xml version="1.0"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+    <parent>
+        <groupId>org.springblade</groupId>
+        <artifactId>blade-service</artifactId>
+        <version>2.8.2.RELEASE</version>
+    </parent>
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>blade-project</artifactId>
+    <name>${project.artifactId}</name>
+    <version>2.8.2.RELEASE</version>
+    <packaging>jar</packaging>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.springblade</groupId>
+            <artifactId>blade-core-boot</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springblade</groupId>
+            <artifactId>blade-starter-swagger</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springblade</groupId>
+            <artifactId>blade-project-api</artifactId>
+            <version>2.8.2.RELEASE</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springblade</groupId>
+            <artifactId>blade-user-api</artifactId>
+            <version>2.8.2.RELEASE</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springblade</groupId>
+            <artifactId>blade-flow-api</artifactId>
+            <version>2.8.2.RELEASE</version>
+        </dependency>
+        <!--Oss-->
+        <dependency>
+            <groupId>org.springblade</groupId>
+            <artifactId>blade-starter-oss</artifactId>
+        </dependency>
+        <!--MinIO-->
+        <dependency>
+            <groupId>io.minio</groupId>
+            <artifactId>minio</artifactId>
+        </dependency>
+        <!--QiNiu-->
+        <dependency>
+            <groupId>com.qiniu</groupId>
+            <artifactId>qiniu-java-sdk</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springblade</groupId>
+            <artifactId>blade-client-api</artifactId>
+            <version>2.8.2.RELEASE</version>
+            <scope>compile</scope>
+        </dependency>
+        <!--<dependency>
+            <groupId>org.springblade</groupId>
+            <artifactId>blade-starter-transaction</artifactId>
+        </dependency>-->
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>com.spotify</groupId>
+                <artifactId>dockerfile-maven-plugin</artifactId>
+                <configuration>
+                    <username>${docker.username}</username>
+                    <password>${docker.password}</password>
+                    <repository>${docker.registry.url}/${docker.namespace}/${project.artifactId}</repository>
+                    <tag>${project.version}</tag>
+                    <useMavenSettingsForAuth>true</useMavenSettingsForAuth>
+                    <buildArgs>
+                        <JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>
+                    </buildArgs>
+                    <skip>false</skip>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-antrun-plugin</artifactId>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>

+ 39 - 0
blade-service/blade-project/src/main/java/org/springblade/project/ProjectApplication.java

@@ -0,0 +1,39 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.project;
+
+import org.springblade.core.cloud.feign.EnableBladeFeign;
+import org.springblade.core.launch.BladeApplication;
+import org.springblade.core.launch.constant.AppConstant;
+import org.springframework.cloud.client.SpringCloudApplication;
+
+/**
+ * Desk启动器
+ *
+ * @author Chill
+ */
+@EnableBladeFeign
+@SpringCloudApplication
+// @SeataCloudApplication
+public class ProjectApplication {
+
+	public static void main(String[] args) {
+		BladeApplication.run("trade-project", ProjectApplication.class, args);
+	}
+
+}
+

+ 187 - 0
blade-service/blade-project/src/main/java/org/springblade/project/controller/ProjectController.java

@@ -0,0 +1,187 @@
+package org.springblade.project.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import lombok.AllArgsConstructor;
+import org.apache.commons.lang.StringUtils;
+import org.springblade.core.log.exception.ServiceException;
+import org.springblade.core.secure.utils.SecureUtil;
+import org.springblade.core.tenant.annotation.NonDS;
+import org.springblade.core.tool.api.R;
+import org.springblade.project.entity.ServiceProject;
+
+import org.springblade.project.entity.ServiceProjectFiles;
+import org.springblade.project.entity.ServiceProjectItem;
+import org.springblade.project.service.ServiceProjectFilesService;
+import org.springblade.project.service.ServiceProjectItemService;
+import org.springblade.project.service.ServiceProjectService;
+import org.springblade.system.user.feign.IUserClient;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.util.CollectionUtils;
+import org.springframework.web.bind.annotation.*;
+import springfox.documentation.annotations.ApiIgnore;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+
+import javax.servlet.ServletException;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.List;
+import java.util.stream.Collectors;
+
+@NonDS
+@ApiIgnore
+@RestController
+@RequestMapping("/project")
+@AllArgsConstructor
+public class ProjectController {
+	@Autowired
+	private ServiceProjectService serviceProjectService;
+	@Autowired
+	private ServiceProjectItemService serviceProjectItemService;
+	@Autowired
+	private ServiceProjectFilesService serviceProjectFilesService;
+
+
+	@GetMapping("/list")
+	public R<IPage<?>> list(@RequestParam(name = "current", defaultValue = "1") Integer current,
+							@RequestParam(name = "size", defaultValue = "10") Integer size,
+							@RequestParam(name = "code", required = false) String code,
+							@RequestParam(name = "cName", required = false) String cName,
+							@RequestParam(name = "corpAttn", required = false) String corpAttn,
+							@RequestParam(name = "dutyName", required = false) String dutyName,
+							@RequestParam(name = "remark", required = false) String remark,
+							@RequestParam(name = "flag", required = true) int flag
+	)
+	{
+		LambdaQueryWrapper<ServiceProject> serviceProjectLambdaQueryWrapper = new LambdaQueryWrapper<>();
+		serviceProjectLambdaQueryWrapper
+			.like(StringUtils.isNotBlank(dutyName), ServiceProject::getDutyName, dutyName)
+			.like(StringUtils.isNotBlank(remark), ServiceProject::getRemark, remark)
+			.like(StringUtils.isNotBlank(corpAttn), ServiceProject::getCorpAttn, corpAttn)
+			.like(StringUtils.isNotBlank(cName), ServiceProject::getCName, cName)
+			.eq(StringUtils.isNotBlank(code), ServiceProject::getCode, code)
+			.eq(ServiceProject::getIsDeleted, 0)
+			.orderByDesc(ServiceProject::getCreateTime);
+
+		Page<ServiceProject> page = new Page<>(current, size);
+		IPage<ServiceProject> iPage = serviceProjectService.page(page, serviceProjectLambdaQueryWrapper);
+		List<ServiceProject> records = iPage.getRecords();
+		//检查是否可以删除主表,没有字表信息 或者 字表status全部为0 就可以删除
+		LambdaQueryWrapper<ServiceProjectItem> lambdaQueryWrapper=new LambdaQueryWrapper<>();
+		if(flag==0)
+		{
+			records.forEach(k->{
+				lambdaQueryWrapper
+					.eq(ServiceProjectItem::getIsDeleted,0)
+					.eq(ServiceProjectItem::getPId,k.getId())
+				    .gt(ServiceProjectItem::getStatus,0);
+				List<ServiceProjectItem> projectItemList = serviceProjectItemService.list(lambdaQueryWrapper);
+				if(!CollectionUtils.isEmpty(projectItemList))
+				{
+					k.setAllowDelete(false);
+				}
+			});
+
+		}
+		//flag=1为
+		if(flag==1)
+		{
+			records.forEach(e->{
+
+				lambdaQueryWrapper
+					.eq(ServiceProjectItem::getStatus,2)
+					.eq(ServiceProjectItem::getIsDeleted,0)
+					.eq(ServiceProjectItem::getPId,e.getId());
+				List<ServiceProjectItem> itemList = serviceProjectItemService.list(lambdaQueryWrapper);
+				e.setItemList(itemList);
+			});
+			List<ServiceProject> collect = records.stream().filter(e -> !CollectionUtils.isEmpty(e.getItemList())).collect(Collectors.toList());
+			iPage.setRecords(collect);
+		}
+
+		return R.data(iPage);
+
+	}
+
+	@PutMapping("modify")
+	public R edit(@RequestBody ServiceProject serviceProject)
+	{
+		serviceProjectService.modify(serviceProject);
+		return R.success("操作成功");
+	}
+
+	@DeleteMapping("delete")
+	public R delete (@RequestParam(name = "id", required = true) Long id)
+	{
+		List<Long> ids= Arrays.asList(id);
+		serviceProjectService.deleteLogic(ids);
+		return R.success("删除成功");
+	}
+
+	@GetMapping("findById")
+	public R<?> findById(@RequestParam(name = "id", required = true) Long id,
+						 @RequestParam(name = "itemStatus", required = true) String itemStatus)
+	{
+		ServiceProject serviceProject = serviceProjectService.getById(id);
+		List<String> status=Arrays.asList(itemStatus.split(","));
+		LambdaQueryWrapper<ServiceProjectItem> itemServiceLambdaQueryWrapper=new LambdaQueryWrapper<>();
+		itemServiceLambdaQueryWrapper.in(ServiceProjectItem::getStatus,status).eq(ServiceProjectItem::getPId,id).eq(ServiceProjectItem::getIsDeleted,0);
+		List<ServiceProjectItem> serviceProjectItems = serviceProjectItemService.list(itemServiceLambdaQueryWrapper);
+
+		LambdaQueryWrapper<ServiceProjectFiles> filesLambdaQueryWrapper=new LambdaQueryWrapper<>();
+		filesLambdaQueryWrapper.eq(ServiceProjectFiles::getPId,id).eq(ServiceProjectFiles::getIsDeleted,0);
+		List<ServiceProjectFiles> filesList = serviceProjectFilesService.list(filesLambdaQueryWrapper);
+
+		if(!CollectionUtils.isEmpty(serviceProjectItems))
+		{
+			serviceProjectItems.forEach(e->{
+				String[] str = new String[]{"录入","已请核","审核中","审核通过","完工","结算"};
+				e.setStrStatus(str[e.getStatus()]);
+			});
+			serviceProject.setItemList(serviceProjectItems);
+		}
+		if(!CollectionUtils.isEmpty(filesList))
+		{
+			serviceProject.setFilesList(filesList);
+		}
+
+		return R.data(serviceProject);
+	}
+
+	@PostMapping("updateItemStatus")
+	public R check(@RequestParam(name = "id", required = true) Long itemId
+		          ,@RequestParam(name = "status", required = true) int status)
+	{
+		    serviceProjectService.updateItemStatus(itemId,status);
+			return R.success("操作完成");
+	}
+
+	@GetMapping("item/list")
+    public R<?> itemList( @RequestParam(name = "current", defaultValue = "1") Integer current,
+						  @RequestParam(name = "size", defaultValue = "10") Integer size,
+						  @RequestParam(name = "pName",  required = false) String pName,
+						  @RequestParam(name = "reminderDay",  required = false) String reminderDay,
+						  @RequestParam(name = "status",  required = true) int status
+						 )
+	{
+		  LambdaQueryWrapper<ServiceProjectItem> itemLambdaQueryWrapper=new LambdaQueryWrapper<>();
+		  itemLambdaQueryWrapper
+			  .like(StringUtils.isNotBlank(pName),ServiceProjectItem::getPName,pName)
+			  .like(StringUtils.isNotBlank(reminderDay),ServiceProjectItem::getReminderDay,reminderDay)
+			  .eq(ServiceProjectItem::getUserid,SecureUtil.getUserId())
+			  .eq(ServiceProjectItem::getStatus,status);
+		  Page<ServiceProjectItem> page=new Page<>(current,size);
+		  IPage<ServiceProjectItem> iPage = serviceProjectItemService.page(page, itemLambdaQueryWrapper);
+		  return R.data(iPage);
+	}
+
+    @GetMapping("getSysNo")
+	public R getSysNo()
+	{
+       return serviceProjectService.getSysNo();
+	}
+
+
+
+}

+ 55 - 0
blade-service/blade-project/src/main/java/org/springblade/project/controller/ProjectFilesController.java

@@ -0,0 +1,55 @@
+package org.springblade.project.controller;
+
+import lombok.AllArgsConstructor;
+import org.springblade.core.secure.utils.SecureUtil;
+import org.springblade.core.tenant.annotation.NonDS;
+import org.springblade.core.tool.api.R;
+import org.springblade.project.entity.ServiceProjectFiles;
+import org.springblade.project.service.ServiceProjectFilesService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import springfox.documentation.annotations.ApiIgnore;
+
+import java.util.Arrays;
+import java.util.Date;
+import java.util.List;
+
+@NonDS
+@ApiIgnore
+@RestController
+@RequestMapping("/project/files")
+@AllArgsConstructor
+public class ProjectFilesController
+{
+	@Autowired
+	private ServiceProjectFilesService filesService;
+
+	@PostMapping("save")
+    public R save(@RequestBody ServiceProjectFiles serviceProjectFiles)
+	{
+		serviceProjectFiles.setCreateTime(new Date());
+		serviceProjectFiles.setCreateUser(SecureUtil.getUserId());
+		serviceProjectFiles.setCreateUserName(SecureUtil.getUser().getRoleName());
+		filesService.save(serviceProjectFiles);
+		return R.success("保存成功");
+	}
+	@DeleteMapping("delete")
+	public R delete(@RequestParam(name = "id", required = true) Long id)
+	{
+		List<Long> ids= Arrays.asList(id);
+		filesService.deleteLogic(ids);
+		return R.success("删除成功");
+	}
+
+	@PostMapping("edit")
+	public R edit(@RequestBody ServiceProjectFiles serviceProjectFiles)
+	{
+		serviceProjectFiles.setUpdateUser(SecureUtil.getUserId());
+		serviceProjectFiles.setUpdateTime(new Date());
+		serviceProjectFiles.setUpdateUserName(SecureUtil.getUser().getRoleName());
+		filesService.updateById(serviceProjectFiles);
+		return R.success("操作成功");
+	}
+
+
+}

+ 20 - 0
blade-service/blade-project/src/main/java/org/springblade/project/mapper/ServiceProjectFilesMapper.java

@@ -0,0 +1,20 @@
+package org.springblade.project.mapper;
+
+
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import org.springblade.project.entity.ServiceProject;
+import org.springblade.project.entity.ServiceProjectFiles;
+
+/**
+ * 服务模块
+ *
+ * @author castiel
+ * @email sunlightcs@gmail.com
+ * @date 2021-10-26 13:50:49
+ */
+@Mapper
+public interface ServiceProjectFilesMapper extends BaseMapper<ServiceProjectFiles> {
+
+}

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

@@ -0,0 +1,18 @@
+package org.springblade.project.mapper;
+
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import org.springblade.project.entity.ServiceProjectItem;
+
+/**
+ * 服务明细
+ *
+ * @author castiel
+ * @email sunlightcs@gmail.com
+ * @date 2021-10-26 13:50:49
+ */
+@Mapper
+public interface ServiceProjectItemMapper extends BaseMapper<ServiceProjectItem> {
+
+}

+ 19 - 0
blade-service/blade-project/src/main/java/org/springblade/project/mapper/ServiceProjectMapper.java

@@ -0,0 +1,19 @@
+package org.springblade.project.mapper;
+
+
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import org.springblade.project.entity.ServiceProject;
+
+/**
+ * 服务模块
+ *
+ * @author castiel
+ * @email sunlightcs@gmail.com
+ * @date 2021-10-26 13:50:49
+ */
+@Mapper
+public interface ServiceProjectMapper extends BaseMapper<ServiceProject> {
+
+}

+ 21 - 0
blade-service/blade-project/src/main/java/org/springblade/project/service/ServiceProjectFilesService.java

@@ -0,0 +1,21 @@
+package org.springblade.project.service;
+
+
+
+
+import org.springblade.core.mp.base.BaseService;
+import org.springblade.project.entity.ServiceProject;
+import org.springblade.project.entity.ServiceProjectFiles;
+
+/**
+ * 服务模块
+ *
+ * @author castiel
+ * @email sunlightcs@gmail.com
+ * @date 2021-10-26 13:50:49
+ */
+public interface ServiceProjectFilesService extends BaseService<ServiceProjectFiles>
+{
+
+
+}

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

@@ -0,0 +1,23 @@
+package org.springblade.project.service;
+
+
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.springblade.core.mp.base.BaseService;
+import org.springblade.project.entity.ServiceProjectItem;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 服务明细
+ *
+ * @author castiel
+ * @email sunlightcs@gmail.com
+ * @date 2021-10-26 13:50:49
+ */
+public interface ServiceProjectItemService extends BaseService<ServiceProjectItem>
+{
+
+
+}

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

@@ -0,0 +1,30 @@
+package org.springblade.project.service;
+
+
+
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.springblade.core.mp.base.BaseService;
+import org.springblade.core.tool.api.R;
+import org.springblade.project.entity.ServiceProject;
+import org.springblade.project.entity.ServiceProjectItem;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 服务模块
+ *
+ * @author castiel
+ * @email sunlightcs@gmail.com
+ * @date 2021-10-26 13:50:49
+ */
+public interface ServiceProjectService extends BaseService<ServiceProject>
+{
+    void modify(ServiceProject serviceProject);
+
+    R getSysNo();
+
+    void updateItemStatus(Long itemId,int status);
+
+}

+ 29 - 0
blade-service/blade-project/src/main/java/org/springblade/project/service/impl/ServiceProjectFilesServiceImpl.java

@@ -0,0 +1,29 @@
+package org.springblade.project.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import net.logstash.logback.encoder.org.apache.commons.lang3.StringUtils;
+import org.springblade.core.mp.base.BaseServiceImpl;
+import org.springblade.core.secure.utils.SecureUtil;
+import org.springblade.project.entity.ServiceProject;
+import org.springblade.project.entity.ServiceProjectFiles;
+import org.springblade.project.entity.ServiceProjectItem;
+import org.springblade.project.mapper.ServiceProjectFilesMapper;
+import org.springblade.project.mapper.ServiceProjectItemMapper;
+import org.springblade.project.mapper.ServiceProjectMapper;
+import org.springblade.project.service.ServiceProjectFilesService;
+import org.springblade.project.service.ServiceProjectService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
+
+import java.util.Date;
+import java.util.List;
+import java.util.stream.Collectors;
+
+
+@Service
+public class ServiceProjectFilesServiceImpl extends BaseServiceImpl<ServiceProjectFilesMapper, ServiceProjectFiles> implements ServiceProjectFilesService
+{
+
+}

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

@@ -0,0 +1,22 @@
+package org.springblade.project.service.impl;
+
+import org.springblade.core.mp.base.BaseServiceImpl;
+import org.springblade.project.entity.ServiceProjectItem;
+import org.springblade.project.mapper.ServiceProjectItemMapper;
+import org.springblade.project.service.ServiceProjectItemService;
+import org.springblade.project.service.ServiceProjectService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+
+
+
+
+
+@Service
+public class ServiceProjectItemServiceImpl extends BaseServiceImpl<ServiceProjectItemMapper, ServiceProjectItem> implements ServiceProjectItemService {
+
+
+}

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

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

+ 11 - 0
blade-service/blade-project/src/main/resources/application-dev.yml

@@ -0,0 +1,11 @@
+#服务器端口
+server:
+  port: 8111
+
+#数据源配置
+spring:
+  datasource:
+    url: ${blade.datasource.dev.url}
+    username: ${blade.datasource.dev.username}
+    password: ${blade.datasource.dev.password}
+

+ 10 - 0
blade-service/blade-project/src/main/resources/application-prod.yml

@@ -0,0 +1,10 @@
+#服务器端口
+server:
+  port: 8111
+
+#数据源配置
+spring:
+  datasource:
+    url: ${blade.datasource.prod.url}
+    username: ${blade.datasource.prod.username}
+    password: ${blade.datasource.prod.password}

+ 10 - 0
blade-service/blade-project/src/main/resources/application-test.yml

@@ -0,0 +1,10 @@
+#服务器端口
+server:
+  port: 8111
+
+#数据源配置
+spring:
+  datasource:
+    url: ${blade.datasource.test.url}
+    username: ${blade.datasource.test.username}
+    password: ${blade.datasource.test.password}