Bläddra i källkod

Merge branch 'master' of http://47.110.251.215:3000/java_org/bladex

huangtf 2 år sedan
förälder
incheckning
e421e3e29c
73 ändrade filer med 3048 tillägg och 1207 borttagningar
  1. 8 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/DefaultConfig.java
  2. 1 1
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/dto/DepartmentMonthPlanDTO.java
  3. 2 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/entity/DepartmentPlanLog.java
  4. 82 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/entity/EmployeeTaskInfo.java
  5. 7 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/entity/ProjectCostBudget.java
  6. 36 29
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/BudgetAndPracticalByDeptVO.java
  7. 1 1
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/ProjectAssignmentUserClient.java
  8. 1 1
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/WbsTreeContractClient.java
  9. 15 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/WbsTreePrivateQueryValueVO.java
  10. 16 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/WbsTreeQueryValueVO.java
  11. 6 0
      blade-service-api/blade-system-api/src/main/java/org/springblade/system/vo/DeptVO.java
  12. 6 2
      blade-service/blade-business/src/main/java/org/springblade/business/controller/DefaultConfigController.java
  13. 1 1
      blade-service/blade-business/src/main/java/org/springblade/business/controller/FixedFlowController.java
  14. 3 1
      blade-service/blade-business/src/main/java/org/springblade/business/controller/TaskController.java
  15. 2 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/DefaultConfigMapper.xml
  16. 1 1
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/InformationQueryMapper.xml
  17. 22 13
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TaskServiceImpl.java
  18. 1 0
      blade-service/blade-control/src/main/java/org/springblade/control/controller/AnnualBudgetController.java
  19. 2 1
      blade-service/blade-control/src/main/java/org/springblade/control/controller/DepartmentMonthPlanController.java
  20. 2 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/ContractInfoMapper.java
  21. 5 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/ContractInfoMapper.xml
  22. 2 2
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/DepartmentMonthPlanMapper.java
  23. 3 3
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/DepartmentMonthPlanMapper.xml
  24. 4 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/DepartmentPlanLogMapper.java
  25. 5 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/DepartmentPlanLogMapper.xml
  26. 56 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/EmployeeTaskInfoMapper.java
  27. 79 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/EmployeeTaskInfoMapper.xml
  28. 3 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/PlanInformMapper.java
  29. 3 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/PlanInformMapper.xml
  30. 2 1
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/ProjectCostBudgetMapper.xml
  31. 1 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/ProjectInfoMapper.java
  32. 4 3
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/ProjectInfoMapper.xml
  33. 2 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/WorkDateInfoMapper.java
  34. 5 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/WorkDateInfoMapper.xml
  35. 3 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/IContractInfoService.java
  36. 2 1
      blade-service/blade-control/src/main/java/org/springblade/control/service/IDepartmentMonthPlanService.java
  37. 112 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/IEmployeeTaskInfoService.java
  38. 3 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/IPlanInformService.java
  39. 6 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/IProjectCostBudgetService.java
  40. 3 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/IProjectInfoService.java
  41. 903 920
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/AnnualBudgetServiceImpl.java
  42. 10 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/ContractInfoServiceImpl.java
  43. 5 5
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/DepartmentMonthPlanServiceImpl.java
  44. 39 9
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/DepartmentPlanLogImpl.java
  45. 470 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/EmployeeTaskInfoServiceImpl.java
  46. 27 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/PlanInformServiceImpl.java
  47. 521 35
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/ProjectCostBudgetServiceImpl.java
  48. 73 83
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/ProjectInfoServiceImpl.java
  49. 34 21
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/ProjectProcessServiceImpl.java
  50. 29 12
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/TaskProcessServiceImpl.java
  51. 5 8
      blade-service/blade-manager/src/main/java/com/mixsmart/utils/CustomFunction.java
  52. 38 6
      blade-service/blade-manager/src/main/java/com/mixsmart/utils/FormulaUtils.java
  53. 44 8
      blade-service/blade-manager/src/main/java/com/mixsmart/utils/StringUtils.java
  54. 2 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ExcelTabController.java
  55. 28 5
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/FormulaController.java
  56. 1 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/SignPfxFileController.java
  57. 11 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsTreeController.java
  58. 36 5
      blade-service/blade-manager/src/main/java/org/springblade/manager/feign/ProjectAssignmentUserClientImpl.java
  59. 2 2
      blade-service/blade-manager/src/main/java/org/springblade/manager/feign/WbsTreeContractClientImpl.java
  60. 1 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/formula/impl/FormulaTurnPoint.java
  61. 1 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IWbsTreeContractService.java
  62. 2 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IWbsTreeService.java
  63. 23 12
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ExcelTabServiceImpl.java
  64. 2 2
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaServiceImpl.java
  65. 20 3
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeContractServiceImpl.java
  66. 116 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeServiceImpl.java
  67. 27 6
      blade-service/blade-manager/src/main/java/org/springblade/manager/utils/FileUtils.java
  68. 17 0
      blade-service/blade-system/src/main/java/org/springblade/system/controller/DeptController.java
  69. 3 0
      blade-service/blade-system/src/main/java/org/springblade/system/mapper/DeptMapper.java
  70. 24 0
      blade-service/blade-system/src/main/java/org/springblade/system/mapper/DeptMapper.xml
  71. 4 0
      blade-service/blade-system/src/main/java/org/springblade/system/service/IDeptService.java
  72. 11 1
      blade-service/blade-system/src/main/java/org/springblade/system/service/impl/DeptServiceImpl.java
  73. 1 1
      blade-service/blade-user/src/main/java/org/springblade/system/user/service/impl/UserServiceImpl.java

+ 8 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/DefaultConfig.java

@@ -68,5 +68,13 @@ public class DefaultConfig extends BaseEntity {
 	*/
 		private String fullScreen;
 
+	/**
+	 * 所属 客户端
+	 */
+	private String clientId;
 
+	/**
+	 * 所属 模式
+	 */
+	private int indexModel;
 }

+ 1 - 1
blade-service-api/blade-control-api/src/main/java/org/springblade/control/dto/DepartmentMonthPlanDTO.java

@@ -18,7 +18,7 @@ import java.time.LocalDate;
 public class DepartmentMonthPlanDTO {
 
     @ApiModelProperty(value = "部门类型")
-    private Integer departmentType;
+    private Long deptId;
 
 
     @ApiModelProperty(value = "计划开始日期")

+ 2 - 0
blade-service-api/blade-control-api/src/main/java/org/springblade/control/entity/DepartmentPlanLog.java

@@ -98,6 +98,8 @@ public class DepartmentPlanLog extends BaseEntity {
     @ApiModelProperty(value = "中途暂停计划-结束时间")
     private LocalDate pausePlanEndTime;
 
+    @ApiModelProperty(value = "实际工作日集合")
+    private String workDate;
 
     @ApiModelProperty(value = "项目原计划起止工时")
     private Integer planDays;

+ 82 - 0
blade-service-api/blade-control-api/src/main/java/org/springblade/control/entity/EmployeeTaskInfo.java

@@ -0,0 +1,82 @@
+package org.springblade.control.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.NullSerializer;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.core.mp.base.BaseEntity;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.math.BigDecimal;
+import java.time.LocalDate;
+
+/**
+ * @Param
+ * @Author wangwl
+ * @Date 2023/5/12 9:21
+ **/
+@Data
+@TableName("c_employee_task_info")
+@EqualsAndHashCode(callSuper = true)
+@ApiModel(value = "员工任务信息表", description = "员工任务信息表")
+public class EmployeeTaskInfo extends BaseEntity {
+
+    @ApiModelProperty(value = "预算id")
+    private Long budgetId;
+
+    @ApiModelProperty(value = "预算父计划id")
+    private Long budgetParentId;
+
+    @ApiModelProperty(value = "项目id")
+    private Long projectId;
+
+    @ApiModelProperty(value = "单位类型1施工2监理3建设")
+    private Integer unitType;
+
+    @ApiModelProperty(value = "费用分摊部门")
+    private Long deptId;
+
+    @ApiModelProperty(value = "费用类型")
+    private Integer costType;
+
+    @ApiModelProperty(value = "项目环节")
+    private Long projectProcess;
+
+    @ApiModelProperty(value = "预算类型")
+    private Integer budgetType;
+
+    @ApiModelProperty(value = "工作类型,0预算1实际")
+    private Integer workType;
+
+    @ApiModelProperty(value = "岗位类型")
+    private Long postType;
+
+    @ApiModelProperty(value = "任务类型")
+    private Integer taskDetail;
+
+    @ApiModelProperty(value = "员工id")
+    @JsonSerialize(nullsUsing = NullSerializer.class)
+    private Long employeeId;
+
+    @ApiModelProperty(value = "员工当天工资")
+    private BigDecimal employeeSalary;
+
+    @ApiModelProperty(value = "测算其他支出均摊到天")
+    private BigDecimal avgOtherCost;
+
+    @DateTimeFormat(
+            pattern = "yyyy-MM-dd"
+    )
+    @JsonFormat(
+            pattern = "yyyy-MM-dd"
+    )
+    @ApiModelProperty(value = "当天日期")
+    private LocalDate oneDay;
+
+
+
+}

+ 7 - 0
blade-service-api/blade-control-api/src/main/java/org/springblade/control/entity/ProjectCostBudget.java

@@ -1,5 +1,7 @@
 package org.springblade.control.entity;
 
+import com.baomidou.mybatisplus.annotation.FieldStrategy;
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
@@ -83,6 +85,7 @@ public class ProjectCostBudget extends BaseEntity {
     private Integer approve;
 
     @ApiModelProperty(value = "计划任务类型")
+    @TableField(updateStrategy = FieldStrategy.IGNORED)
     private Long planTaskType;
 
     @ApiModelProperty(value = "计划任务描述")
@@ -102,6 +105,7 @@ public class ProjectCostBudget extends BaseEntity {
             pattern = "yyyy-MM-dd"
     )
     @ApiModelProperty(value = "计划开始日期")
+    @TableField(updateStrategy = FieldStrategy.IGNORED)
     private LocalDate planStartTime;
 
     @DateTimeFormat(
@@ -111,12 +115,15 @@ public class ProjectCostBudget extends BaseEntity {
             pattern = "yyyy-MM-dd"
     )
     @ApiModelProperty(value = "计划结束日期")
+    @TableField(updateStrategy = FieldStrategy.IGNORED)
     private LocalDate planEndTime;
 
     @ApiModelProperty(value = "计划天数")
+    @TableField(updateStrategy = FieldStrategy.IGNORED)
     private BigDecimal planDays;
 
     @ApiModelProperty(value = "计划人工成本")
+    @TableField(updateStrategy = FieldStrategy.IGNORED)
     private BigDecimal planStaffCost;
 
     @ApiModelProperty(value = "任务实际完成天数")

+ 36 - 29
blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/BudgetAndPracticalByDeptVO.java

@@ -4,6 +4,7 @@ import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 import java.math.BigDecimal;
+import java.util.List;
 
 /**
  * @Param
@@ -16,33 +17,39 @@ public class BudgetAndPracticalByDeptVO {
     @ApiModelProperty(value = "时间")
     private String time;
 
-    @ApiModelProperty(value = "市场预算")
-    private BigDecimal budget1;
-
-    @ApiModelProperty(value = "市场实际")
-    private BigDecimal practical1;
-
-    @ApiModelProperty(value = "研发预算")
-    private BigDecimal budget2;
-
-    @ApiModelProperty(value = "研发实际")
-    private BigDecimal practical2;
-
-    @ApiModelProperty(value = "实施预算")
-    private BigDecimal budget3;
-
-    @ApiModelProperty(value = "实施实际")
-    private BigDecimal practical3;
-
-    @ApiModelProperty(value = "维护预算")
-    private BigDecimal budget4;
-
-    @ApiModelProperty(value = "维护实际")
-    private BigDecimal practical4;
-
-    @ApiModelProperty(value = "管理预算")
-    private BigDecimal budget5;
-
-    @ApiModelProperty(value = "管理实际")
-    private BigDecimal practical5;
+    @ApiModelProperty(value = "支出预算集合")
+    private List<BigDecimal> budgetList;
+
+    @ApiModelProperty(value = "实际支出集合")
+    private List<BigDecimal> costList;
+
+//    @ApiModelProperty(value = "市场预算")
+//    private BigDecimal budget1;
+//
+//    @ApiModelProperty(value = "市场实际")
+//    private BigDecimal practical1;
+//
+//    @ApiModelProperty(value = "研发预算")
+//    private BigDecimal budget2;
+//
+//    @ApiModelProperty(value = "研发实际")
+//    private BigDecimal practical2;
+//
+//    @ApiModelProperty(value = "实施预算")
+//    private BigDecimal budget3;
+//
+//    @ApiModelProperty(value = "实施实际")
+//    private BigDecimal practical3;
+//
+//    @ApiModelProperty(value = "维护预算")
+//    private BigDecimal budget4;
+//
+//    @ApiModelProperty(value = "维护实际")
+//    private BigDecimal practical4;
+//
+//    @ApiModelProperty(value = "管理预算")
+//    private BigDecimal budget5;
+//
+//    @ApiModelProperty(value = "管理实际")
+//    private BigDecimal practical5;
 }

+ 1 - 1
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/ProjectAssignmentUserClient.java

@@ -18,7 +18,7 @@ public interface ProjectAssignmentUserClient {
     String API_PREFIX = "/api/manager/projectAssignmentUser";
 
     @GetMapping(API_PREFIX + "/queryContractDownAllUser")
-    List<SaveUserInfoByProjectDTO> queryContractDownAllUser(@RequestParam String contractId);
+    List<SaveUserInfoByProjectDTO> queryContractDownAllUser(@RequestParam String contractId, @RequestParam Integer type);
 
     @GetMapping(API_PREFIX + "/queryCurrentUserDownAllContractAndProjectId")
     List<SaveUserInfoByProjectDTO> queryCurrentUserDownAllContractAndProjectId(@RequestParam Long userId);

+ 1 - 1
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/WbsTreeContractClient.java

@@ -181,5 +181,5 @@ public interface WbsTreeContractClient {
 
     //获取 节点下表单
     @GetMapping(API_PREFIX + "/searchNodeAllTableInfo")
-    List<AppWbsTreeContractVO> searchNodeAllTableInfo(@RequestParam String primaryKeyId, @RequestParam String type, @RequestParam String contractId, @RequestParam String projectId);
+    List<AppWbsTreeContractVO> searchNodeAllTableInfo(@RequestParam String primaryKeyId, @RequestParam String type, @RequestParam String contractId, @RequestParam String projectId,@RequestParam Long userId);
 }

+ 15 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/WbsTreePrivateQueryValueVO.java

@@ -0,0 +1,15 @@
+package org.springblade.manager.vo;
+
+import lombok.Data;
+import org.springblade.manager.entity.WbsTreePrivate;
+
+import java.util.List;
+
+@Data
+public class WbsTreePrivateQueryValueVO extends WbsTreePrivate {
+
+    private List<WbsTreePrivateQueryValueVO> children;
+
+    private Boolean hasChildren;
+
+}

+ 16 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/WbsTreeQueryValueVO.java

@@ -0,0 +1,16 @@
+package org.springblade.manager.vo;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import lombok.Data;
+import org.springblade.manager.entity.WbsTree;
+
+import java.util.List;
+
+@Data
+public class WbsTreeQueryValueVO extends WbsTree {
+
+    private List<WbsTreeQueryValueVO> children;
+
+    private Boolean hasChildren;
+
+}

+ 6 - 0
blade-service-api/blade-system-api/src/main/java/org/springblade/system/vo/DeptVO.java

@@ -93,4 +93,10 @@ public class DeptVO extends Dept implements INode<DeptVO> {
     @ApiModelProperty(value = "租户id")
     private String tenantId;
 
+    /**
+     * 最小等级部门(内控使用)
+     */
+    @ApiModelProperty(value = "租户id")
+    @JsonInclude(JsonInclude.Include.NON_EMPTY)
+    private Boolean minLevel;
 }

+ 6 - 2
blade-service/blade-business/src/main/java/org/springblade/business/controller/DefaultConfigController.java

@@ -63,6 +63,7 @@ public class DefaultConfigController extends BladeController {
 	@ApiOperation(value = "详情", notes = "传入defaultConfig")
 	public R<DefaultConfig> detail(DefaultConfig defaultConfig, BladeUser user) {
 		defaultConfig.setCreateUser(user.getUserId());
+		defaultConfig.setClientId(user.getClientId());
 		DefaultConfig detail = defaultConfigService.getOne(Condition.getQueryWrapper(defaultConfig));
 		return R.data(detail);
 	}
@@ -138,9 +139,11 @@ public class DefaultConfigController extends BladeController {
     @PostMapping("/saveOrUpdate")
     @ApiOperationSupport(order = 8)
     @ApiOperation(value = "新增或修改")
-    public R<Boolean> saveOrUpdate(@Valid @RequestBody DefaultConfig newConfig) {
+    public R<Boolean> saveOrUpdate(@Valid @RequestBody DefaultConfig newConfig,BladeUser bladeUser) {
         //查询是否存在配置信息
-        DefaultConfig oldConfig = this.defaultConfigService.getOne(Wrappers.<DefaultConfig>lambdaQuery().eq(DefaultConfig::getCreateUser, AuthUtil.getUserId()));
+        DefaultConfig oldConfig = this.defaultConfigService.getOne(Wrappers.<DefaultConfig>lambdaQuery()
+				.eq(DefaultConfig::getCreateUser, bladeUser.getUserId())
+				.eq(DefaultConfig::getClientId, bladeUser.getClientId()));
         if (oldConfig != null) {
             //修改
             if (StringUtils.isNotEmpty(newConfig.getColor())) {
@@ -165,6 +168,7 @@ public class DefaultConfigController extends BladeController {
         //设置用户ID
         newConfig.setCreateUser(AuthUtil.getUserId());
         newConfig.setCreateTime(new Date());
+        newConfig.setClientId(bladeUser.getClientId());
 
         return R.status(defaultConfigService.save(newConfig));
     }

+ 1 - 1
blade-service/blade-business/src/main/java/org/springblade/business/controller/FixedFlowController.java

@@ -69,7 +69,7 @@ public class FixedFlowController extends BladeController {
         //获取当前系统配置的角色划分
         List<RoleVO> roleVOS = this.sysClient.search().getData();
         //获取项目人员
-        List<SaveUserInfoByProjectDTO> contractUserList = this.projectAssignmentUserClient.queryContractDownAllUser(contractId);
+        List<SaveUserInfoByProjectDTO> contractUserList = this.projectAssignmentUserClient.queryContractDownAllUser(contractId, 1);
 
         //先处理管理员
         for (RoleVO vos : roleVOS) {

+ 3 - 1
blade-service/blade-business/src/main/java/org/springblade/business/controller/TaskController.java

@@ -123,7 +123,9 @@ public class TaskController extends BladeController {
     @ApiOperation(value = "校验电签短信验证码")
     public R<String> checkSmsCode() {
         //获取账户验证码
-        DefaultConfig config = this.defaultConfigService.getOne(Wrappers.<DefaultConfig>lambdaQuery().eq(DefaultConfig::getCreateUser, AuthUtil.getUserId()));
+        DefaultConfig config = this.defaultConfigService.getOne(Wrappers.<DefaultConfig>lambdaQuery()
+                .eq(DefaultConfig::getCreateUser, AuthUtil.getUserId())
+                .isNotNull(DefaultConfig::getSmsCode));
 
         if (config != null) {
             if (StringUtils.isNotEmpty(config.getSmsTimeOut())) {

+ 2 - 0
blade-service/blade-business/src/main/java/org/springblade/business/mapper/DefaultConfigMapper.xml

@@ -20,6 +20,8 @@
         <result column="sms_time_out" property="smsTimeOut"/>
         <result column="shot_web_rtc" property="shotWebRtc"/>
         <result column="full_screen" property="fullScreen"/>
+        <result column="client_id" property="clientId"/>
+        <result column="index_model" property="indexModel"/>
     </resultMap>
 
 

+ 1 - 1
blade-service/blade-business/src/main/java/org/springblade/business/mapper/InformationQueryMapper.xml

@@ -902,7 +902,7 @@
     </select>
 
     <select id="getTabussTimeInfo" resultMap="tabBusstimeInfoResultMap">
-        select * from m_tab_busstime_info where is_deleted = 0 and
+        select * from m_tab_busstime_info where is_deleted = 0
         <if test="tables != null">
             and tab_en_name in
             <foreach collection="tables" item="wbsIdc" open="(" separator="," close=")">

+ 22 - 13
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TaskServiceImpl.java

@@ -360,7 +360,8 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
         //修改主流程状态为3
         this.update(Wrappers.<Task>lambdaUpdate().set(Task::getStatus, 3).eq(Task::getId, task.getId()));
         //修改业务数据状态为未上报
-        this.updateBusinessDataByFormDataId(task, 0, null);
+       // this.updateBusinessDataByFormDataId(task, 0, null);
+        this.updateBusinessDataByFormDataId(task, 0, null,-1L);
 
         return true;
     }
@@ -615,14 +616,14 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
                         //修改主流程状态为已完成
                         this.update(Wrappers.<Task>lambdaUpdate().set(Task::getStatus, 2).set(Task::getUpdateTime, new Date()).eq(Task::getId, masterTask.getId()));
                         //修改对应的业务数据状态为已审批
-                        this.updateBusinessDataByFormDataId(masterTask, 2, finalPdfUrl);
+                        this.updateBusinessDataByFormDataId(masterTask, 2, finalPdfUrl,taskApprovalVO.getUserId());
 
                         //返回电签成功的pdf路径,给试验用
                         return finalPdfUrl;
                     }
                 } else {
                     //只更新PDF路径
-                    this.updateBusinessDataByFormDataId(masterTask, 1, eVisaStatus.contains("@@@@") ? eVisaStatus.split("@@@@")[1] : null);
+                    this.updateBusinessDataByFormDataId(masterTask, 1, eVisaStatus.contains("@@@@") ? eVisaStatus.split("@@@@")[1] : null,taskApprovalVO.getUserId());
                     return eVisaStatus.contains("@@@@") ? eVisaStatus.split("@@@@")[1] : null;
                 }
             } else if ("eVisaError".equals(eVisaStatus) || eVisaStatus.contains("eVisaError")) {
@@ -693,7 +694,7 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
             }
             this.update(Wrappers.<Task>lambdaUpdate().set(Task::getStatus, 3).set(Task::getUpdateTime, new Date()).eq(Task::getProcessInstanceId, masterProcessInstanceId));
             //修改对应的业务数据状态为已废除
-            this.updateBusinessDataByFormDataId(this.getOne(Wrappers.<Task>lambdaQuery().eq(Task::getProcessInstanceId, masterProcessInstanceId)), 3, null);
+            this.updateBusinessDataByFormDataId(this.getOne(Wrappers.<Task>lambdaQuery().eq(Task::getProcessInstanceId, masterProcessInstanceId)), 3, null,taskApprovalVO.getUserId());
 
             //任务废除通知
             this.abolishMessage(masterTask, currentLink, comment);
@@ -935,11 +936,11 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
     /**
      * 修改业务数据状态
      */
-    private void updateBusinessDataByFormDataId(Task task, Integer status, String newFileUrl) {
+    private void updateBusinessDataByFormDataId(Task task, Integer status, String newFileUrl,Long UserId) {
         switch (task.getApprovalType()) {
             case 1:
                 //资料填报
-                this.updateWriteBusinessDataStatus(task.getFormDataId(), status, newFileUrl);
+                this.updateWriteBusinessDataStatus(task.getFormDataId(), status, newFileUrl,UserId);
                 break;
             case 2:
                 //工程文件
@@ -970,17 +971,22 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
      * 资料填报
      */
     @Transactional
-    public void updateWriteBusinessDataStatus(String formDataId, Integer status, String newFileUrl) {
-
+    public void updateWriteBusinessDataStatus(String formDataId, Integer status, String newFileUrl,Long userId) {
+        String pdfPage ="";
+        Long pdfSize =0L;
+        String dateInfo = "";
         try {
-            String pdfPage = commonFileClient.getPdfNum(newFileUrl);
-            Long pdfSize = CommonUtil.getResourceLength(newFileUrl);
+            System.out.println("----- 电签成功--------");
+            pdfPage = commonFileClient.getPdfNum(newFileUrl);
+            pdfSize = CommonUtil.getResourceLength(newFileUrl);
+            System.out.println("----- 电签成功--------==pdfPage"+pdfPage);
+            System.out.println("----- 电签成功--------==pdfSize"+pdfSize);
             List<String> list = Arrays.asList(formDataId.split(","));
             for(String iId : list){
                 //获取
-                String dateInfo = "";
                 InformationQuery queryinfo = informationQueryService.getById(iId);
-                List<AppWbsTreeContractVO> WbsTreeContract = wbsTreeContractClient.searchNodeAllTableInfo(queryinfo.getWbsId() + "", queryinfo.getClassify() + "", queryinfo.getContractId() + "", queryinfo.getProjectId() + "");
+
+                List<AppWbsTreeContractVO> WbsTreeContract = wbsTreeContractClient.searchNodeAllTableInfo(queryinfo.getWbsId() + "", queryinfo.getClassify() + "", queryinfo.getContractId() + "", queryinfo.getProjectId() + "",userId);
                 List<String> collect = new ArrayList<>();
                 Map<String,String> idMap = new HashMap<>();
                 for(AppWbsTreeContractVO appWbsTreeContractVO : WbsTreeContract){
@@ -996,7 +1002,7 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
                         dateInfo = maps.get(tabBusstimeInfo.getColKey())+"";
                     }
                 }
-
+                System.out.println("----- 电签成功--------==修改---="+dateInfo);
                 this.informationQueryService.update(Wrappers.<InformationQuery>lambdaUpdate().set(InformationQuery::getStatus, status)
                         .set(InformationQuery::getEVisaPdfUrl, newFileUrl)
                         .set(InformationQuery::getReportNumber, null)
@@ -1011,6 +1017,9 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
                     .set(InformationQuery::getEVisaPdfUrl, newFileUrl)
                     .set(InformationQuery::getReportNumber, null)
                     .set(InformationQuery::getAuditUserIdAndName, null)
+                    .set(InformationQuery::getEVisaPdfPage, pdfPage)
+                    .set(InformationQuery::getEVisaPdfSize, pdfSize)
+                    .set(InformationQuery::getBusinessTime, dateInfo)
                     .in(InformationQuery::getId, Arrays.asList(formDataId.split(","))));
         }
 

+ 1 - 0
blade-service/blade-control/src/main/java/org/springblade/control/controller/AnnualBudgetController.java

@@ -8,6 +8,7 @@ import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
+import org.apache.poi.ss.usermodel.Workbook;
 import org.springblade.control.dto.AnnualBudgetDTO;
 import org.springblade.control.dto.ControlProjectInfoDTO;
 import org.springblade.control.entity.AnnualBudget;

+ 2 - 1
blade-service/blade-control/src/main/java/org/springblade/control/controller/DepartmentMonthPlanController.java

@@ -1,5 +1,6 @@
 package org.springblade.control.controller;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
@@ -42,7 +43,7 @@ public class DepartmentMonthPlanController {
     @GetMapping("/getPage")
     @ApiOperationSupport(order = 1)
     @ApiOperation(value = "部门月计划分页")
-    public R<List<DepartmentMonthPlanVO>> getPage(DepartmentMonthPlanDTO dto, Query query) {
+    public R<IPage<DepartmentMonthPlanVO>> getPage(DepartmentMonthPlanDTO dto, Query query) {
         return R.data(planService.getPage(dto,query));
     }
 

+ 2 - 0
blade-service/blade-control/src/main/java/org/springblade/control/mapper/ContractInfoMapper.java

@@ -43,4 +43,6 @@ public interface ContractInfoMapper extends BaseMapper<ControlContractInfo> {
     void realDeleteById(@Param("id") Long id);
 
     List<ControlContractInfo> getContractByYear(@Param("year") int year, @Param("ids") Collection<?> coll);
+
+    ControlContractInfo getContractByProjectId(@Param("projectId") Long projectId);
 }

+ 5 - 0
blade-service/blade-control/src/main/java/org/springblade/control/mapper/ContractInfoMapper.xml

@@ -58,4 +58,9 @@
             #{id}
         </foreach>
     </select>
+    <select id="getContractByProjectId" resultType="org.springblade.control.entity.ControlContractInfo">
+        SELECT * FROM c_control_contract_info
+        WHERE project_id = #{projectId}
+
+    </select>
 </mapper>

+ 2 - 2
blade-service/blade-control/src/main/java/org/springblade/control/mapper/DepartmentMonthPlanMapper.java

@@ -25,9 +25,9 @@ public interface DepartmentMonthPlanMapper extends BaseMapper<DepartmentMonthPla
 
     List<DictInfo> getDepartmentDict();
 
-    String getDepartmentName(@Param("departmentType") Integer departmentType);
+    String getDepartmentName(@Param("deptId") Long deptId);
 
-    List<DepartmentMonthPlanVO> getPage(IPage page, @Param("dto") DepartmentMonthPlanDTO dto, @Param("userId") Long userId);
+    IPage<DepartmentMonthPlanVO> getPage(IPage page, @Param("dto") DepartmentMonthPlanDTO dto, @Param("userId") Long userId);
 
     List<BladeUser> getDepartmentUserDict(@Param("type") Integer departmentType);
 

+ 3 - 3
blade-service/blade-control/src/main/java/org/springblade/control/mapper/DepartmentMonthPlanMapper.xml

@@ -10,7 +10,7 @@
         select * from c_dict_info WHERE code = 'department_type' order by sort LIMIT 5
     </select>
     <select id="getDepartmentName" resultType="java.lang.String">
-        select dict_name from c_dict_info WHERE code = 'department_type' and dict_value = #{departmentType}
+        select dept_name from blade_dept WHERE id = #{deptId} and is_deleted = 0
     </select>
     <select id="getPage" resultType="org.springblade.control.vo.DepartmentMonthPlanVO">
         SELECT dmp.*,
@@ -25,8 +25,8 @@
                 (select bu.name from blade_user bu WHERE bu.id = dmp.plan_designer) as 'planDesignerName'
         FROM c_department_month_plan dmp
         where dmp.plan_designer = #{userId} and dmp.is_deleted = 0
-        <if test="dto.departmentType != null and dto.departmentType != ''">
-            and dmp.department_type = #{dto.departmentType}
+        <if test="dto.deptId != null and dto.deptId != ''">
+            and dmp.dept_id = #{dto.deptId}
         </if>
         <if test="dto.planStartDate != null and dto.planStartDate != ''">
             and DATE_FORMAT(dmp.plan_start_date ,'%Y-%m') BETWEEN #{dto.planStartDate} AND #{dto.planEndDate}

+ 4 - 0
blade-service/blade-control/src/main/java/org/springblade/control/mapper/DepartmentPlanLogMapper.java

@@ -5,6 +5,8 @@ import org.apache.ibatis.annotations.Param;
 import org.springblade.control.entity.AnnualBudgetDisburse;
 import org.springblade.control.entity.DepartmentPlanLog;
 
+import java.util.List;
+
 /**
  * @Param
  * @Author wangwl
@@ -13,4 +15,6 @@ import org.springblade.control.entity.DepartmentPlanLog;
 public interface DepartmentPlanLogMapper extends BaseMapper<DepartmentPlanLog> {
 
     DepartmentPlanLog getNewestPlanLog(@Param("id") Long id);
+
+    List<DepartmentPlanLog> getAllLog(@Param("id") Long id);
 }

+ 5 - 0
blade-service/blade-control/src/main/java/org/springblade/control/mapper/DepartmentPlanLogMapper.xml

@@ -9,4 +9,9 @@
         order by sort desc
         limit 1
     </select>
+    <select id="getAllLog" resultType="org.springblade.control.entity.DepartmentPlanLog">
+        select * from c_department_plan_log
+        where plan_id = #{id}
+        order by sort desc
+    </select>
 </mapper>

+ 56 - 0
blade-service/blade-control/src/main/java/org/springblade/control/mapper/EmployeeTaskInfoMapper.java

@@ -0,0 +1,56 @@
+package org.springblade.control.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.apache.ibatis.annotations.Param;
+import org.springblade.control.dto.ControlProjectInfoDTO;
+import org.springblade.control.entity.*;
+import org.springblade.control.vo.ControlProjectInfoVO;
+import org.springblade.control.vo.ProjectCostBudgetVO;
+import org.springblade.control.vo.ProjectCostBudgetVO2;
+import org.springblade.control.vo.ProjectCostBudgetVO3;
+import org.springblade.system.user.entity.User;
+
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * @Param
+ * @Author wangwl
+ * @Date 2023/5/12 9:38
+ **/
+public interface EmployeeTaskInfoMapper extends BaseMapper<EmployeeTaskInfo> {
+    void deleteByBudgetId(@Param("id") Long id);
+
+    void deleteByBudgetParentId(@Param("ids") List<Long> ids,@Param("parentId") Long parentId);
+
+    void deleteByBudgetIdAndParentId(@Param("id") Long id);
+
+    BigDecimal getAllEmployeeSalaryByYear(@Param("year") int y);
+
+    List<EmployeeTaskInfo> getAllEmployeeSalaryByYear2(@Param("year") int y);
+
+    List<EmployeeTaskInfo> getAllEmployeeSalaryByProject(@Param("projectId") Long projectId);
+
+    //根据项目获取所有预算工作日
+    List<EmployeeTaskInfo> getAllBudgetSalaryByProject(@Param("projectId") Long projectId);
+
+    //根据年获取所有预算工作日
+    List<EmployeeTaskInfo> getAllBudgetSalaryByYear(@Param("year") int y);
+
+    void setAvgOtherCostByParentId(@Param("id") Long id,@Param("avg") BigDecimal avg);
+
+    void deleteMaintainByBudgetId(@Param("id") Long id);
+
+    BigDecimal getAllMaintainSalaryByYear(@Param("year") int y);
+
+    List<EmployeeTaskInfo> getAllMaintainSalaryByYear2(@Param("year") int y);
+
+    List<EmployeeTaskInfo> getAllMaintainSalaryByProject(@Param("projectId") Long projectId);
+
+    List<EmployeeTaskInfo> getAllMaintainSalaryByProjectAndCostType(@Param("projectId") Long projectId,@Param("costType") Integer costType);
+
+    List<EmployeeTaskInfo> getAllEmployeeSalaryByProjectAndCostType(@Param("projectId") Long projectId,@Param("costType") Integer costType);
+}

+ 79 - 0
blade-service/blade-control/src/main/java/org/springblade/control/mapper/EmployeeTaskInfoMapper.xml

@@ -0,0 +1,79 @@
+<?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.control.mapper.EmployeeTaskInfoMapper">
+    <update id="setAvgOtherCostByParentId">
+        update c_employee_task_info set avg_other_cost = #{avg} where budget_parent_id = #{id}
+    </update>
+
+
+    <delete id="deleteByBudgetId">
+        delete from c_employee_task_info
+        where budget_id = #{id} and work_type = 0
+    </delete>
+    <delete id="deleteByBudgetParentId">
+        delete from c_employee_task_info
+        where budget_parent_id = #{parentId} and work_type = 0
+        <if test="ids != null and ids.size > 0">
+            and budget_id not in
+            <foreach collection="ids" item="id" open="(" close=")" separator=",">
+                #{id}
+            </foreach>
+        </if>
+    </delete>
+    <delete id="deleteByBudgetIdAndParentId">
+        delete from c_employee_task_info
+        where (budget_id = #{id} or budget_parent_id = #{id})
+    </delete>
+    <delete id="deleteMaintainByBudgetId">
+        delete from c_employee_task_info
+        where budget_id = #{id} and work_type = 2
+    </delete>
+    <select id="getAllEmployeeSalaryByYear" resultType="java.math.BigDecimal">
+        select SUM(employee_salary) from c_employee_task_info
+        WHERE work_type = 1
+        <if test="year != 0">
+            and DATE_FORMAT(one_day ,'%Y') = #{year}
+        </if>
+    </select>
+    <select id="getAllEmployeeSalaryByYear2" resultType="org.springblade.control.entity.EmployeeTaskInfo">
+        select * from c_employee_task_info
+        WHERE work_type = 1
+        <if test="year != 0">
+            and DATE_FORMAT(one_day ,'%Y') = #{year}
+        </if>
+    </select>
+    <select id="getAllEmployeeSalaryByProject" resultType="org.springblade.control.entity.EmployeeTaskInfo">
+        select * from c_employee_task_info WHERE work_type = 1 and project_id = #{projectId}
+    </select>
+    <select id="getAllBudgetSalaryByProject" resultType="org.springblade.control.entity.EmployeeTaskInfo">
+        select * from c_employee_task_info WHERE work_type = 0 and project_id = #{projectId}
+    </select>
+    <select id="getAllBudgetSalaryByYear" resultType="org.springblade.control.entity.EmployeeTaskInfo">
+        select * from c_employee_task_info WHERE work_type = 0 and DATE_FORMAT(one_day, '%Y') = #{year}
+    </select>
+    <select id="getAllMaintainSalaryByYear" resultType="java.math.BigDecimal">
+        select SUM(employee_salary) from c_employee_task_info
+        WHERE work_type = 2
+        <if test="year != 0">
+            and DATE_FORMAT(one_day ,'%Y') = #{year}
+        </if>
+    </select>
+    <select id="getAllMaintainSalaryByYear2" resultType="org.springblade.control.entity.EmployeeTaskInfo">
+        select * from c_employee_task_info
+        WHERE work_type = 2
+        <if test="year != 0">
+            and DATE_FORMAT(one_day ,'%Y') = #{year}
+        </if>
+    </select>
+    <select id="getAllMaintainSalaryByProject" resultType="org.springblade.control.entity.EmployeeTaskInfo">
+        select * from c_employee_task_info WHERE work_type = 2 and project_id = #{projectId}
+    </select>
+    <select id="getAllMaintainSalaryByProjectAndCostType"
+            resultType="org.springblade.control.entity.EmployeeTaskInfo">
+        SELECT * FROM c_employee_task_info WHERE project_id = #{projectId} and cost_type  = #{costType} and work_type = 2
+    </select>
+    <select id="getAllEmployeeSalaryByProjectAndCostType"
+            resultType="org.springblade.control.entity.EmployeeTaskInfo">
+        SELECT * FROM c_employee_task_info WHERE project_id = #{projectId} and cost_type  = #{costType} and work_type = 1
+    </select>
+</mapper>

+ 3 - 0
blade-service/blade-control/src/main/java/org/springblade/control/mapper/PlanInformMapper.java

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import org.apache.ibatis.annotations.Param;
 import org.springblade.control.entity.AnnualBudgetDisburse;
 import org.springblade.control.entity.PlanInform;
+import org.springblade.system.user.entity.User;
 
 import java.util.List;
 
@@ -16,4 +17,6 @@ public interface PlanInformMapper extends BaseMapper<PlanInform> {
 
 
     List<PlanInform> getUserInform(@Param("userId") Long userId);
+
+    User getUserById(@Param("id") Long taskUser);
 }

+ 3 - 0
blade-service/blade-control/src/main/java/org/springblade/control/mapper/PlanInformMapper.xml

@@ -8,4 +8,7 @@
         order by inform_date desc
         limit 5
     </select>
+    <select id="getUserById" resultType="org.springblade.system.user.entity.User">
+        SELECT id,name FROM blade_user WHERE id = #{id}
+    </select>
 </mapper>

+ 2 - 1
blade-service/blade-control/src/main/java/org/springblade/control/mapper/ProjectCostBudgetMapper.xml

@@ -46,6 +46,7 @@
         <if test="budget.unitType != null and budget.unitType != ''">
             and pcb.unit_type = #{budget.unitType}
         </if>
+        ORDER BY pcb.sort
     </select>
     <select id="getBudgetTotalByProjectId" resultType="org.springblade.control.entity.ProjectCostBudgetStats">
         select
@@ -191,7 +192,7 @@
 
     <select id="getBudgetByYear" resultType="org.springblade.control.entity.ProjectCostBudget">
         select *  from c_project_cost_budget pcb
-        WHERE pcb.is_deleted = 0  and task_approve = 1  and (select cdi.dict_value from c_dict_info cdi WHERE cdi.id = pcb.plan_task_type) = 1 and pcb.task_approve = 1 and (DATE_FORMAT(pcb.practical_finish_time ,'%Y') = #{year} or DATE_FORMAT(pcb.real_plan_start_time ,'%Y') = #{year})
+        WHERE pcb.is_deleted = 0 and (select cdi.dict_value from c_dict_info cdi WHERE cdi.id = pcb.plan_task_type) = 1 and pcb.task_approve = 1 and (DATE_FORMAT(pcb.practical_finish_time ,'%Y') = #{year} or DATE_FORMAT(pcb.real_plan_start_time ,'%Y') = #{year})
     </select>
 
     <select id="getBudgetByYear2" resultType="org.springblade.control.entity.ProjectCostBudget">

+ 1 - 0
blade-service/blade-control/src/main/java/org/springblade/control/mapper/ProjectInfoMapper.java

@@ -57,4 +57,5 @@ public interface ProjectInfoMapper extends BaseMapper<ControlProjectInfo> {
     //返回指定项目,指定费用分类对应的进程
     List<ProjectReimburseVO> getProjectReimburse3(@Param("projectId") Long projectId,@Param("costType") Integer costType);
 
+    String getProjectNameByBudgetId(@Param("id") Long id);
 }

+ 4 - 3
blade-service/blade-control/src/main/java/org/springblade/control/mapper/ProjectInfoMapper.xml

@@ -61,7 +61,6 @@
         select
             IFNULL((select sum(cci.contract_money)  from c_control_contract_info cci WHERE cci.is_deleted = 0),0) as allContractMoney,
             IFNULL((select SUM(cbs.project_cost_total)  from c_project_cost_budget_stats cbs WHERE cbs.is_deleted = 0),0) as allProjectCost,
-            IFNULL((select SUM(pcb.actual_total_money)  from c_project_cost_budget pcb WHERE  pcb.is_deleted =0 and pcb.task_approve = 1),0) as "allPracticalDisburse",
             IFNULL((select SUM(cri.practical_returned_money)  from c_contract_returned_info cri WHERE cri.is_deleted = 0),0) as allReturned
     </select>
     <select id="ProjectListStats" resultType="org.springblade.control.vo.AllProjectStatsVO">
@@ -70,8 +69,7 @@
             cpi.name as 'projectName',
             cci.contract_money  as 'contractMoney',
                 (select cbs.project_cost_total from c_project_cost_budget_stats cbs WHERE cpi.id = cbs.project_id  and cbs.is_deleted = 0) as 'budgetCost',
-                (select SUM(pcb.actual_total_money)  from c_project_cost_budget pcb WHERE  pcb.is_deleted =0 and pcb.project_id = cpi.id and pcb.task_approve = 1)as 'practicalPayCost',
-                (select SUM(cri.practical_returned_money)  from c_contract_returned_info cri WHERE cpi.id = cri.project_id and cri.is_deleted = 0) as 'ReturnedMoney',
+                IFNULL((select SUM(cri.practical_returned_money)  from c_contract_returned_info cri WHERE cpi.id = cri.project_id and cri.is_deleted = 0), 0)  as 'ReturnedMoney',
                 (cci.contract_money - IFNULL((select SUM(cri.practical_returned_money) from c_contract_returned_info cri WHERE cri.contract_id = cci.id and cri.is_deleted = 0),0)) as 'unreturnedMoney'
         from c_control_project_info cpi left join c_control_contract_info cci on cpi.id = cci.project_id and cci.is_deleted = 0
         WHERE cpi.is_deleted = 0
@@ -128,5 +126,8 @@
         WHERE fri.is_deleted = 0 and fri.status = 2
             and #{year} = DATE_FORMAT(fri.fr_date ,'%Y')
     </select>
+    <select id="getProjectNameByBudgetId" resultType="java.lang.String">
+        select cpi.name  from c_control_project_info cpi WHERE id = (SELECT pcb.project_id from c_project_cost_budget pcb WHERE pcb.id = #{id})
+    </select>
 
 </mapper>

+ 2 - 0
blade-service/blade-control/src/main/java/org/springblade/control/mapper/WorkDateInfoMapper.java

@@ -16,4 +16,6 @@ import java.util.List;
 public interface WorkDateInfoMapper extends BaseMapper<WorkDateInfo> {
 
     Integer getWorkDays(@Param("start") LocalDate start, @Param("end") LocalDate end);
+
+    List<LocalDate> getWorkDaysList(@Param("start") LocalDate start, @Param("end") LocalDate end);
 }

+ 5 - 0
blade-service/blade-control/src/main/java/org/springblade/control/mapper/WorkDateInfoMapper.xml

@@ -8,4 +8,9 @@
         WHERE DATE_FORMAT(one_day,'%Y-%m-%d') between DATE_FORMAT(#{start} ,'%Y-%m-%d') and DATE_FORMAT(#{end},'%Y-%m-%d')
         and is_work = 1
     </select>
+    <select id="getWorkDaysList" resultType="java.time.LocalDate">
+        select one_day  from c_work_date_info
+        WHERE DATE_FORMAT(one_day,'%Y-%m-%d') between DATE_FORMAT(#{start} ,'%Y-%m-%d') and DATE_FORMAT(#{end},'%Y-%m-%d')
+          and is_work = 1
+    </select>
 </mapper>

+ 3 - 0
blade-service/blade-control/src/main/java/org/springblade/control/service/IContractInfoService.java

@@ -49,4 +49,7 @@ public interface IContractInfoService extends BaseService<ControlContractInfo> {
     //根据年份获取合同
     List<ControlContractInfo> getContractByYear(int year, Collection<?> coll);
 
+    //根据项目iD获取合同
+    ControlContractInfo getContractByProjectId(Long projectId);
+
 }

+ 2 - 1
blade-service/blade-control/src/main/java/org/springblade/control/service/IDepartmentMonthPlanService.java

@@ -1,5 +1,6 @@
 package org.springblade.control.service;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import org.springblade.control.dto.ControlContractInfoDTO;
 import org.springblade.control.dto.ControlProjectInfoDTO;
 import org.springblade.control.dto.DepartmentMonthPlanDTO;
@@ -23,7 +24,7 @@ import java.util.List;
  **/
 public interface IDepartmentMonthPlanService extends BaseService<DepartmentMonthPlan> {
 
-    List<DepartmentMonthPlanVO> getPage(DepartmentMonthPlanDTO dto, Query query) ;
+    IPage<DepartmentMonthPlanVO> getPage(DepartmentMonthPlanDTO dto, Query query) ;
 
     List<ProjectCostBudgetVO> addDepartmentPlan(DepartmentMonthPlan plan);
 

+ 112 - 0
blade-service/blade-control/src/main/java/org/springblade/control/service/IEmployeeTaskInfoService.java

@@ -0,0 +1,112 @@
+package org.springblade.control.service;
+
+import org.springblade.control.dto.ControlProjectInfoDTO;
+import org.springblade.control.dto.ProjectCostBudgetStatsDTO;
+import org.springblade.control.entity.DictInfo;
+import org.springblade.control.entity.EmployeeTaskInfo;
+import org.springblade.control.entity.ProjectCostBudget;
+import org.springblade.control.entity.ProjectCostBudgetStats;
+import org.springblade.control.vo.*;
+import org.springblade.core.mp.base.BaseService;
+import org.springblade.core.mp.support.Query;
+
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.time.Year;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * @Param
+ * @Author wangwl
+ * @Date 2023/5/12 9:41
+ **/
+public interface IEmployeeTaskInfoService extends BaseService<EmployeeTaskInfo> {
+
+    /**
+     *  删除工作日相关接口
+     */
+    //根据预算id删除工作信息
+    void deleteByBudgetId(Long id);
+
+    //根据预算id删除工作信息,清空所有
+    void deleteByBudgetIdAndParentId(Long id);
+
+    //根据父预算id删除工作信息,并且排除到正在进行中的计划
+    void deleteByBudgetParentId(List<Long> ids,Long parentId);
+
+    //根据父预算id修改所有日期的,其他平均预算
+    void setAvgOtherCostByParentId(Long id,BigDecimal avg);
+
+    //根据预算id,删除维护支出
+    void deleteMaintainByBudgetId(Long id);
+
+
+    /**
+     * 维护支出相关接口
+     */
+    //根据年查询当年所有的维护支出
+    BigDecimal getAllMaintainSalaryByYear(int y);
+
+    //根据年查询当年所有的维护支出,并按照项目分组,组里的数据是每个月的支出,如果该项目没有支出将不会插入
+    Map<Long,Map<Integer, BigDecimal>> getAllMaintainSalaryByYear2(int y);
+
+    //根据年查询当年所有的维护支出,并按照项目分组,组里的数据是项目年支出,如果该项目没有支出将不会插入
+    Map<Long,BigDecimal> getAllMaintainSalaryByYear3(int y);
+
+    //根据年查询所有维护支出,按月分组,当月没有支出将不会插入
+    Map<Integer, BigDecimal> getAllMaintainSalaryByYear4(int y);
+
+    //根据年查询所有维护支出,按部门分组,再按月统计
+    Map<Long,Map<Integer, BigDecimal>> getAllMaintainSalaryByYear5(int y);
+
+    //获取项目的所有维护支出,按环节分组,如果该环节没有支出,将不会插入
+    Map<Long,BigDecimal> getAllMaintainSalaryByProject(Long projectId);
+
+    //获取项目的所有维护支出,按费用分类分组,如果该费用分类没有支出,将不会插入
+    Map<Integer,BigDecimal> getAllMaintainSalaryByProject2(Long projectId);
+
+    //获取项目id和 费用分类,获取维护支出,直接返回
+    Map<Long, List<EmployeeTaskInfo>> getAllMaintainSalaryByProjectAndCostType(Long projectId,Integer costType);
+
+
+    /**
+     *  实际支出相关接口
+     */
+    //根据年查询当年所有的人工支出
+    BigDecimal getAllEmployeeSalaryByYear(int y);
+
+    //根据年查询当年所有的人工支出,并按照项目分组,组里的数据是每个月的支出,如果该项目没有支出将不会插入
+    Map<Long,Map<Integer, BigDecimal>> getAllEmployeeSalaryByYear2(int y);
+
+    //根据年查询当年所有的人工支出,并按照项目分组,组里的数据是项目年支出,如果该项目没有支出将不会插入
+    Map<Long,BigDecimal> getAllEmployeeSalaryByYear3(int y);
+
+    //获取项目的所有人工支出,按环节分组,如果该环节没有支出,将不会插入
+    Map<Long,BigDecimal> getAllEmployeeSalaryByProject(Long projectId);
+
+    //获取项目的所有人工支出,按费用分类分组,如果该费用分类没有支出,将不会插入
+    Map<Integer,BigDecimal> getAllEmployeeSalaryByProject2(Long projectId);
+
+    //根据年查询所有人工支出,按月分组,当月没有支出将不会插入
+    Map<Integer, BigDecimal> getAllEmployeeSalaryByYear4(int y);
+
+    //根据年查询除所有人工支出,按部门分组,再按月统计
+    Map<Long,Map<Integer, BigDecimal>> getAllEmployeeSalaryByYear5(int y);
+
+    //获取项目id和 费用分类,获取人工支出,直接返回
+    Map<Long,List<EmployeeTaskInfo>> getAllEmployeeSalaryByProjectAndCostType(Long projectId,Integer costType);
+
+    /**
+     *  预算支出相关接口
+     */
+    //根据项目id,获取项目所有的预算支出,按照环节分组,如果该环节没有支出,将不会插入
+    Map<Long,BigDecimal> getAllBudgetSalaryByProject(Long projectId);
+
+    //根据年查询所有预算支出,按月分组,当月没有支出将不会插入
+    Map<Integer, BigDecimal> getAllBudgetSalaryByYear(int y);
+
+    //根据年查询除所有预算支出包括其他支出,按部门分组,再按月统计
+    Map<Long,Map<Integer, BigDecimal>> getAllBudgetSalaryByYear2(int y);
+}

+ 3 - 0
blade-service/blade-control/src/main/java/org/springblade/control/service/IPlanInformService.java

@@ -18,4 +18,7 @@ public interface IPlanInformService extends BaseService<PlanInform> {
     //任务完成,传入任务名称.任务人和审批人
     void taskFinishedInform(String taskName,Long taskUser,String appUser,Integer status);
     void taskFinishedInform2(String taskName,String taskUser,String appUser,Integer status);
+
+    //任务转移审批通过,通知
+    void taskChangedInform(Long taskUser,Long changedUser,String appUserName,String planDesc);
 }

+ 6 - 0
blade-service/blade-control/src/main/java/org/springblade/control/service/IProjectCostBudgetService.java

@@ -92,6 +92,9 @@ public interface IProjectCostBudgetService extends BaseService<ProjectCostBudget
     //任务审批完成闭环时,计算当前任务的实际用时和人工成本,传入任务id和任务实际完成时间
     void taskFinishedStats(Long PlanId,LocalDate practicalFinishTime);
 
+    //任务转移审批通过时,计算上一个任务人工作量,并清空workDate
+    void taskChangeStats(Long PlanId,Long taskUser);
+
     //获取所有项目截至当年的维护支出
     BigDecimal getAllMaintainCost(int year);
 
@@ -122,6 +125,9 @@ public interface IProjectCostBudgetService extends BaseService<ProjectCostBudget
     //获取所有项目截至当年的维护支出,分月返回,以费用分类为主键
     Map<Integer,List<BigDecimal>> getAllMaintainCost9(int year);
 
+    //获取所有项目截至当年的维护支出,按部门分组,再按月分组,统计总和
+    Map<Long,Map<Integer,BigDecimal>> getAllMaintainCost10(int year);
+
     //根据年获取已经分配月的计划支出,按12个月返回
     List<BigDecimal> getAllMonthBudgetByYear(int y);
 

+ 3 - 0
blade-service/blade-control/src/main/java/org/springblade/control/service/IProjectInfoService.java

@@ -52,6 +52,9 @@ public interface IProjectInfoService extends BaseService<ControlProjectInfo> {
     //获取当年所有的报销,分月返回
     List<BigDecimal> getThisYearAllReimburseByYear(int year);
 
+    //获取当年所有的报销,已部门分组,然后再按月分组,统计月总和
+    Map<Long,Map<Integer,BigDecimal>> getThisYearAllReimburseByYear2(int year);
+
     //获取所有项目截至当年的报销支出,分月返回
     Map<Long,List<BigDecimal>> getYearReimburseByMonth(int year);
 

Filskillnaden har hållts tillbaka eftersom den är för stor
+ 903 - 920
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/AnnualBudgetServiceImpl.java


+ 10 - 0
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/ContractInfoServiceImpl.java

@@ -209,4 +209,14 @@ public class ContractInfoServiceImpl extends BaseServiceImpl<ContractInfoMapper,
     public List<ControlContractInfo> getContractByYear(int year, Collection<?> coll) {
         return baseMapper.getContractByYear(year,coll);
     }
+
+    /**
+     * 根据项目id获取合同
+     * @param projectId
+     * @return
+     */
+    @Override
+    public ControlContractInfo getContractByProjectId(Long projectId) {
+        return baseMapper.getContractByProjectId(projectId);
+    }
 }

+ 5 - 5
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/DepartmentMonthPlanServiceImpl.java

@@ -51,10 +51,10 @@ public class DepartmentMonthPlanServiceImpl extends BaseServiceImpl<DepartmentMo
      * 部门月计划分页
      */
     @Override
-    public List<DepartmentMonthPlanVO> getPage(DepartmentMonthPlanDTO dto, Query query) {
-        IPage page = new Page(query.getCurrent(), query.getSize());
+    public IPage<DepartmentMonthPlanVO> getPage(DepartmentMonthPlanDTO dto, Query query) {
+        IPage<DepartmentMonthPlanVO> page = new Page(query.getCurrent(), query.getSize());
         BladeUser user = AuthUtil.getUser();
-        return baseMapper.getPage(page,dto,user.getUserId());
+        return baseMapper.getPage(page,dto, user.getUserId());
     }
 
     /**
@@ -64,13 +64,13 @@ public class DepartmentMonthPlanServiceImpl extends BaseServiceImpl<DepartmentMo
     public List<ProjectCostBudgetVO> addDepartmentPlan(DepartmentMonthPlan plan) {
         //判断数据库是否存在当前部门当前月数据
         DepartmentMonthPlan one = this.getOne(new LambdaQueryWrapper<DepartmentMonthPlan>()
-                .eq(DepartmentMonthPlan::getDepartmentType, plan.getDepartmentType())
+                .eq(DepartmentMonthPlan::getDeptId, plan.getDeptId())
                 .eq(DepartmentMonthPlan::getPlanDate, plan.getPlanDate()));
         if (one != null){
             throw new ServiceException("新增失败,该部门该月份已存在计划");
         }
         //获取部门名称
-        String departmentName = baseMapper.getDepartmentName(plan.getDepartmentType());
+        String departmentName = baseMapper.getDepartmentName(plan.getDeptId());
         //新增部门月计划,并且设置名称和起止日期,制定人
         Long userId = SecureUtil.getUserId();
         plan.setPlanDesigner(userId);

+ 39 - 9
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/DepartmentPlanLogImpl.java

@@ -2,6 +2,7 @@ package org.springblade.control.service.impl;
 
 
 import lombok.AllArgsConstructor;
+import org.apache.commons.lang.StringUtils;
 import org.springblade.common.utils.CommonUtil;
 import org.springblade.control.entity.DepartmentPlanLog;
 import org.springblade.control.mapper.DepartmentPlanLogMapper;
@@ -90,18 +91,47 @@ public class DepartmentPlanLogImpl extends BaseServiceImpl<DepartmentPlanLogMapp
         if (log.getPauseTime() == null){
             throw new ServiceException("请输入暂停时间");
         }
-//        if (log.getOpenPlanStartTime() == null){
-//            if (log.getPauseTime().compareTo(log.getRealPlanStartTime()) == 0){
-//                throw new ServiceException("不能在计划开启当天暂停");
-//            }
-//        }else {
-//            if (log.getPauseTime().compareTo(log.getOpenPlanStartTime()) == 0){
-//                throw new ServiceException("不能在计划开启当天暂停");
-//            }
-//        }
         log.setId(null);
         log.setSort(log.getSort()+1);
         log.setStatus(0);
+        //每次暂停的时候,都去保存之前所有的工作日
+        String workDate = log.getWorkDate();
+        StringBuilder str = new StringBuilder();
+        LocalDate start;
+        if (log.getOpenPlanStartTime() != null){
+            //不是第一次暂停
+            start = log.getOpenPlanStartTime();
+            //如果开始时间和暂停时间是同一天,就不修改
+            if (!start.equals(log.getPauseTime())) {
+                List<LocalDate> list = dateInfoMapper.getWorkDaysList(start, log.getPauseTime().minusDays(1));
+                //如果说日期为空,则直接存入
+                if (StringUtils.isNotBlank(workDate)){
+                    str.append(workDate);
+                }
+                if (list != null && list.size() > 0) {
+                    for (LocalDate localDate : list) {
+                        str.append(localDate.toString() + ",");
+                    }
+                    log.setWorkDate(str.toString());
+                }else {
+                    throw new ServiceException("任务日期错误,请联系管理员");
+                }
+            }
+        }else {
+            //第一次暂停,直接使用日期
+            start = log.getRealPlanStartTime();
+            //如果开始时间和暂停时间是同一天,就不修改
+            if (!start.equals(log.getPauseTime())) {
+                List<LocalDate> list = dateInfoMapper.getWorkDaysList(start, log.getPauseTime().minusDays(1));
+                for (LocalDate localDate : list) {
+                    str.append(localDate.toString() + ",");
+                }
+                //如果有长度,去除最后一个逗号
+                if (str.length() > 0){
+                    log.setWorkDate(str.toString());
+                }
+            }
+        }
         this.save(log);
         budgetService.updateStatus(log.getPlanId(),3);
     }

+ 470 - 0
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/EmployeeTaskInfoServiceImpl.java

@@ -0,0 +1,470 @@
+package org.springblade.control.service.impl;
+
+import lombok.AllArgsConstructor;
+import org.springblade.control.entity.*;
+import org.springblade.control.mapper.*;
+import org.springblade.control.service.IEmployeeTaskInfoService;
+import org.springblade.core.mp.base.BaseServiceImpl;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * @Param
+ * @Author wangwl
+ * @Date 2023/5/12 9:43
+ **/
+@Service
+@AllArgsConstructor
+public class EmployeeTaskInfoServiceImpl extends BaseServiceImpl<EmployeeTaskInfoMapper, EmployeeTaskInfo> implements IEmployeeTaskInfoService {
+
+
+    /**
+     * 根据预算id删除工作信息
+     * @param id
+     */
+    @Override
+    public void deleteByBudgetId(Long id) {
+        baseMapper.deleteByBudgetId(id);
+    }
+
+    /**
+     * 根据预算id删除工作信息,清空所有
+     * @param id
+     */
+    @Override
+    public void deleteByBudgetIdAndParentId(Long id) {
+        baseMapper.deleteByBudgetIdAndParentId(id);
+    }
+
+    /**
+     * 根据父预算id删除工作信息,并且排除到正在进行中的计划
+     * @param ids
+     * @param parentId
+     */
+    @Override
+    public void deleteByBudgetParentId(List<Long> ids, Long parentId) {
+        baseMapper.deleteByBudgetParentId(ids,parentId);
+    }
+
+    /**
+     * 根据父预算id修改所有日期的,其他平均预算
+     * @param id
+     * @param avg
+     */
+    @Override
+    public void setAvgOtherCostByParentId(Long id, BigDecimal avg) {
+        baseMapper.setAvgOtherCostByParentId(id,avg);
+    }
+
+    /**
+     * 根据预算id,删除维护支出
+     * @param id
+     */
+    @Override
+    public void deleteMaintainByBudgetId(Long id) {
+        baseMapper.deleteMaintainByBudgetId(id);
+    }
+
+    /**
+     * 根据年查询当年所有的维护支出
+     * @param y
+     * @return
+     */
+    @Override
+    public BigDecimal getAllMaintainSalaryByYear(int y) {
+        BigDecimal decimal = baseMapper.getAllMaintainSalaryByYear(y);
+        if (decimal == null){
+            return new BigDecimal(0);
+        }
+        return decimal;
+    }
+
+    /**
+     * 根据年查询当年所有的维护支出,并按照项目分组,组里的数据是每个月的支出,如果该项目没有支出将不会插入
+     * @param y
+     * @return
+     */
+    @Override
+    public Map<Long, Map<Integer, BigDecimal>> getAllMaintainSalaryByYear2(int y) {
+        List<EmployeeTaskInfo> list = baseMapper.getAllMaintainSalaryByYear2(y);
+        if (list != null && list.size() > 0){
+            Map<Long, Map<Integer, BigDecimal>> map = new HashMap<>();
+            Map<Long, List<EmployeeTaskInfo>> listMap = list.parallelStream()
+                    .collect(Collectors.groupingBy(EmployeeTaskInfo::getProjectId));
+            for (Long aLong : listMap.keySet()) {
+                //该项目所有支出
+                List<EmployeeTaskInfo> infoList = listMap.get(aLong);
+                //按月份分组
+                Map<Integer, BigDecimal> monthMap = infoList.stream().collect(
+                        Collectors.groupingBy(
+                                o -> o.getOneDay().getMonthValue(),
+                                Collectors.mapping(EmployeeTaskInfo::getEmployeeSalary, Collectors.reducing(BigDecimal.ZERO, BigDecimal::add))
+                        ));
+                map.put(aLong,monthMap);
+            }
+            return map;
+        }
+        return null;
+    }
+
+    /**
+     * 根据年查询当年所有的维护支出,并按照项目分组,组里的数据是项目年支出,如果该项目没有支出将不会插入
+     * @param y
+     * @return
+     */
+    @Override
+    public Map<Long, BigDecimal> getAllMaintainSalaryByYear3(int y) {
+        List<EmployeeTaskInfo> list = baseMapper.getAllMaintainSalaryByYear2(y);
+        if (list != null && list.size() > 0){
+            //按项目分组
+            Map<Long, BigDecimal> monthMap = list.stream().collect(
+                    Collectors.groupingBy(
+                            o -> o.getProjectId(),
+                            Collectors.mapping(EmployeeTaskInfo::getEmployeeSalary, Collectors.reducing(BigDecimal.ZERO, BigDecimal::add))
+                    ));
+            return monthMap;
+        }
+        return null;
+    }
+
+    /**
+     * 根据年查询所有维护支出,按月分组,当月没有支出将不会插入
+     * @param y
+     * @return
+     */
+    @Override
+    public Map<Integer, BigDecimal> getAllMaintainSalaryByYear4(int y) {
+        List<EmployeeTaskInfo> list = baseMapper.getAllMaintainSalaryByYear2(y);
+        if (list != null && list.size() > 0){
+            //按项目分组
+            Map<Integer, BigDecimal> monthMap = list.stream().collect(
+                    Collectors.groupingBy(
+                            o -> o.getOneDay().getMonthValue(),
+                            Collectors.mapping(EmployeeTaskInfo::getEmployeeSalary, Collectors.reducing(BigDecimal.ZERO, BigDecimal::add))
+                    ));
+            return monthMap;
+        }
+        return null;
+    }
+
+    /**
+     * 根据年查询所有维护支出,按部门分组,再按月统计
+     * @param y
+     * @return
+     */
+    @Override
+    public Map<Long, Map<Integer, BigDecimal>> getAllMaintainSalaryByYear5(int y) {
+        List<EmployeeTaskInfo> list = baseMapper.getAllMaintainSalaryByYear2(y);
+        if (list != null && list.size() > 0){
+            Map<Long, Map<Integer, BigDecimal>> map = new HashMap<>();
+            Map<Long, List<EmployeeTaskInfo>> listMap = list.parallelStream()
+                    .collect(Collectors.groupingBy(EmployeeTaskInfo::getDeptId));
+            for (Long aLong : listMap.keySet()) {
+                //该项目所有支出
+                List<EmployeeTaskInfo> infoList = listMap.get(aLong);
+                //按月份分组
+                Map<Integer, BigDecimal> monthMap = infoList.stream().collect(
+                        Collectors.groupingBy(
+                                o -> o.getOneDay().getMonthValue(),
+                                Collectors.mapping(EmployeeTaskInfo::getEmployeeSalary, Collectors.reducing(BigDecimal.ZERO, BigDecimal::add))
+                        ));
+                map.put(aLong,monthMap);
+            }
+            return map;
+        }
+        return null;
+    }
+
+    /**
+     * 获取项目的所有支出,按环节分组,如果该环节没有支出,将不会插入
+     * @param projectId
+     * @return
+     */
+    @Override
+    public Map<Long, BigDecimal> getAllMaintainSalaryByProject(Long projectId) {
+        List<EmployeeTaskInfo> list = baseMapper.getAllMaintainSalaryByProject(projectId);
+        if (list != null && list.size() > 0){
+            //按项目分组
+            Map<Long, BigDecimal> monthMap = list.stream().collect(
+                    Collectors.groupingBy(
+                            o -> o.getProjectProcess(),
+                            Collectors.mapping(EmployeeTaskInfo::getEmployeeSalary, Collectors.reducing(BigDecimal.ZERO, BigDecimal::add))
+                    ));
+            return monthMap;
+        }
+        return null;
+    }
+
+    /**
+     * 获取项目的所有维护支出,按费用分类分组,如果该费用分类没有支出,将不会插入
+     * @param projectId
+     * @return
+     */
+    @Override
+    public Map<Integer, BigDecimal> getAllMaintainSalaryByProject2(Long projectId) {
+        List<EmployeeTaskInfo> list = baseMapper.getAllMaintainSalaryByProject(projectId);
+        if (list != null && list.size() > 0){
+            //按项目分组
+            Map<Integer, BigDecimal> monthMap = list.stream().collect(
+                    Collectors.groupingBy(
+                            o -> o.getCostType(),
+                            Collectors.mapping(EmployeeTaskInfo::getEmployeeSalary, Collectors.reducing(BigDecimal.ZERO, BigDecimal::add))
+                    ));
+            return monthMap;
+        }
+        return null;
+    }
+
+    /**
+     * 获取项目id和 费用分类,获取维护支出,直接返回
+     * @param projectId
+     * @param costType
+     * @return
+     */
+    @Override
+    public Map<Long, List<EmployeeTaskInfo>> getAllMaintainSalaryByProjectAndCostType(Long projectId, Integer costType) {
+        List<EmployeeTaskInfo> list = baseMapper.getAllMaintainSalaryByProjectAndCostType(projectId, costType);
+        if (list != null && list.size() > 0){
+            //按项目分组
+            Map<Long, List<EmployeeTaskInfo>> monthMap = list.parallelStream()
+                    .collect(Collectors.groupingBy(EmployeeTaskInfo::getProjectProcess));
+            return monthMap;
+        }
+        return null;
+    }
+
+    /**
+     * 根据年查询当年所有的人工支出
+     * @param y
+     * @return
+     */
+    @Override
+    public BigDecimal getAllEmployeeSalaryByYear(int y) {
+        BigDecimal decimal = baseMapper.getAllEmployeeSalaryByYear(y);
+        if (decimal == null){
+            return new BigDecimal(0);
+        }
+        return decimal;
+    }
+
+    /**
+     * 根据年查询当年所有的人工支出,并按照项目分组,组里的数据是每个月的支出,如果该项目没有支出将不会插入
+     * @param y
+     * @return
+     */
+    @Override
+    public Map<Long, Map<Integer, BigDecimal>> getAllEmployeeSalaryByYear2(int y) {
+        List<EmployeeTaskInfo> list = baseMapper.getAllEmployeeSalaryByYear2(y);
+        if (list != null && list.size() > 0){
+            Map<Long, Map<Integer, BigDecimal>> map = new HashMap<>();
+            Map<Long, List<EmployeeTaskInfo>> listMap = list.parallelStream()
+                    .collect(Collectors.groupingBy(EmployeeTaskInfo::getProjectId));
+            for (Long aLong : listMap.keySet()) {
+                //该项目所有支出
+                List<EmployeeTaskInfo> infoList = listMap.get(aLong);
+                //按月份分组
+                Map<Integer, BigDecimal> monthMap = infoList.stream().collect(
+                        Collectors.groupingBy(
+                                o -> o.getOneDay().getMonthValue(),
+                                Collectors.mapping(EmployeeTaskInfo::getEmployeeSalary, Collectors.reducing(BigDecimal.ZERO, BigDecimal::add))
+                        ));
+                map.put(aLong,monthMap);
+            }
+            return map;
+        }
+        return null;
+    }
+
+    /**
+     * 根据年查询当年所有的人工支出,并按照项目分组,组里的数据是项目年支出,如果该项目没有支出将不会插入
+     * @param y
+     * @return
+     */
+    @Override
+    public Map<Long, BigDecimal> getAllEmployeeSalaryByYear3(int y) {
+        List<EmployeeTaskInfo> list = baseMapper.getAllEmployeeSalaryByYear2(y);
+        if (list != null && list.size() > 0){
+            //按项目分组
+            Map<Long, BigDecimal> monthMap = list.stream().collect(
+                    Collectors.groupingBy(
+                            o -> o.getProjectId(),
+                            Collectors.mapping(EmployeeTaskInfo::getEmployeeSalary, Collectors.reducing(BigDecimal.ZERO, BigDecimal::add))
+                    ));
+            return monthMap;
+        }
+        return null;
+    }
+
+    /**
+     * 获取项目的所有支出,按环节分组
+     * @param projectId
+     * @return
+     */
+    @Override
+    public Map<Long, BigDecimal> getAllEmployeeSalaryByProject(Long projectId) {
+        List<EmployeeTaskInfo> list = baseMapper.getAllEmployeeSalaryByProject(projectId);
+        if (list != null && list.size() > 0){
+            //按项目分组
+            Map<Long, BigDecimal> monthMap = list.stream().collect(
+                    Collectors.groupingBy(
+                            o -> o.getProjectProcess(),
+                            Collectors.mapping(EmployeeTaskInfo::getEmployeeSalary, Collectors.reducing(BigDecimal.ZERO, BigDecimal::add))
+                    ));
+            return monthMap;
+        }
+        return null;
+    }
+
+
+    /**
+     * 获取项目的所有人工支出,按费用分类分组,如果该费用分类没有支出,将不会插入
+     * @param projectId
+     * @return
+     */
+    @Override
+    public Map<Integer, BigDecimal> getAllEmployeeSalaryByProject2(Long projectId) {
+        List<EmployeeTaskInfo> list = baseMapper.getAllEmployeeSalaryByProject(projectId);
+        if (list != null && list.size() > 0){
+            //按项目分组
+            Map<Integer, BigDecimal> monthMap = list.stream().collect(
+                    Collectors.groupingBy(
+                            o -> o.getCostType(),
+                            Collectors.mapping(EmployeeTaskInfo::getEmployeeSalary, Collectors.reducing(BigDecimal.ZERO, BigDecimal::add))
+                    ));
+            return monthMap;
+        }
+        return null;
+    }
+
+    /**
+     * 根据年查询所有人工支出,按月分组,当月没有支出将不会插入
+     * @param y
+     * @return
+     */
+    @Override
+    public Map<Integer, BigDecimal> getAllEmployeeSalaryByYear4(int y) {
+        List<EmployeeTaskInfo> list = baseMapper.getAllEmployeeSalaryByYear2(y);
+        if (list != null && list.size() > 0){
+            //按项目分组
+            Map<Integer, BigDecimal> monthMap = list.stream().collect(
+                    Collectors.groupingBy(
+                            o -> o.getOneDay().getMonthValue(),
+                            Collectors.mapping(EmployeeTaskInfo::getEmployeeSalary, Collectors.reducing(BigDecimal.ZERO, BigDecimal::add))
+                    ));
+            return monthMap;
+        }
+        return null;
+    }
+
+    /**
+     * 根据年查询除所有人工支出,按部门分组,再按月统计
+     * @param y
+     * @return
+     */
+    @Override
+    public Map<Long, Map<Integer, BigDecimal>> getAllEmployeeSalaryByYear5(int y) {
+        List<EmployeeTaskInfo> list = baseMapper.getAllEmployeeSalaryByYear2(y);
+        if (list != null && list.size() > 0){
+            Map<Long, Map<Integer, BigDecimal>> map = new HashMap<>();
+            Map<Long, List<EmployeeTaskInfo>> listMap = list.parallelStream()
+                    .collect(Collectors.groupingBy(EmployeeTaskInfo::getDeptId));
+            for (Long aLong : listMap.keySet()) {
+                //该项目所有支出
+                List<EmployeeTaskInfo> infoList = listMap.get(aLong);
+                //按月份分组
+                Map<Integer, BigDecimal> monthMap = infoList.stream().collect(
+                        Collectors.groupingBy(
+                                o -> o.getOneDay().getMonthValue(),
+                                Collectors.mapping(EmployeeTaskInfo::getEmployeeSalary, Collectors.reducing(BigDecimal.ZERO, BigDecimal::add))
+                        ));
+                map.put(aLong,monthMap);
+            }
+            return map;
+        }
+        return null;
+    }
+
+    /**
+     * 获取项目id和 费用分类,获取人工支出,直接返回
+     * @param projectId
+     * @param costType
+     * @return
+     */
+    @Override
+    public Map<Long, List<EmployeeTaskInfo>> getAllEmployeeSalaryByProjectAndCostType(Long projectId, Integer costType) {
+        List<EmployeeTaskInfo> list = baseMapper.getAllEmployeeSalaryByProjectAndCostType(projectId, costType);
+        if (list != null && list.size() > 0){
+            //按项目分组
+            Map<Long, List<EmployeeTaskInfo>> monthMap = list.parallelStream()
+                    .collect(Collectors.groupingBy(EmployeeTaskInfo::getProjectProcess));
+            return monthMap;
+        }
+        return null;
+    }
+
+
+    @Override
+    public Map<Long, BigDecimal> getAllBudgetSalaryByProject(Long projectId) {
+        List<EmployeeTaskInfo> list = baseMapper.getAllBudgetSalaryByProject(projectId);
+        if (list != null && list.size() > 0){
+            //按项目分组
+            Map<Long, BigDecimal> monthMap = list.stream().collect(
+                    Collectors.groupingBy(
+                            o -> o.getProjectProcess(),
+                            Collectors.mapping(EmployeeTaskInfo::getEmployeeSalary, Collectors.reducing(BigDecimal.ZERO, BigDecimal::add))
+                    ));
+            return monthMap;
+        }
+        return null;
+    }
+
+    @Override
+    public Map<Integer, BigDecimal> getAllBudgetSalaryByYear(int y) {
+        List<EmployeeTaskInfo> list = baseMapper.getAllBudgetSalaryByYear(y);
+        if (list != null && list.size() > 0){
+            //按项目分组
+            Map<Integer, BigDecimal> monthMap = list.stream().collect(
+                    Collectors.groupingBy(
+                            o -> o.getOneDay().getMonthValue(),
+                            Collectors.mapping(EmployeeTaskInfo::getEmployeeSalary, Collectors.reducing(BigDecimal.ZERO, BigDecimal::add))
+                    ));
+            return monthMap;
+        }
+        return null;
+    }
+
+    /**
+     * 根据年查询除所有预算支出包括其他支出,按部门分组,再按月统计
+     * @param y
+     * @return
+     */
+    @Override
+    public Map<Long, Map<Integer, BigDecimal>> getAllBudgetSalaryByYear2(int y) {
+        List<EmployeeTaskInfo> list = baseMapper.getAllBudgetSalaryByYear(y);
+        if (list != null && list.size() > 0){
+            //过滤,把其他支出一起加到人工支出里面,方便统计
+            for (EmployeeTaskInfo info : list) {
+                info.setEmployeeSalary(info.getEmployeeSalary().add(info.getAvgOtherCost()));
+            }
+            Map<Long, Map<Integer, BigDecimal>> map = new HashMap<>();
+            Map<Long, List<EmployeeTaskInfo>> listMap = list.parallelStream()
+                    .collect(Collectors.groupingBy(EmployeeTaskInfo::getDeptId));
+            for (Long aLong : listMap.keySet()) {
+                //该项目所有支出
+                List<EmployeeTaskInfo> infoList = listMap.get(aLong);
+                //按月份分组
+                Map<Integer, BigDecimal> monthMap = infoList.stream().collect(
+                        Collectors.groupingBy(
+                                o -> o.getOneDay().getMonthValue(),
+                                Collectors.mapping(EmployeeTaskInfo::getEmployeeSalary, Collectors.reducing(BigDecimal.ZERO, BigDecimal::add))
+                        ));
+                map.put(aLong,monthMap);
+            }
+            return map;
+        }
+        return null;
+    }
+}

+ 27 - 0
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/PlanInformServiceImpl.java

@@ -21,6 +21,7 @@ import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.mp.base.BaseServiceImpl;
 import org.springblade.core.mp.support.Query;
 import org.springblade.core.secure.utils.SecureUtil;
+import org.springblade.system.user.entity.User;
 import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -99,4 +100,30 @@ public class PlanInformServiceImpl extends BaseServiceImpl<PlanInformMapper, Pla
         this.saveBatch(list);
     }
 
+    /**
+     * 任务转移审批通过,通知
+     * @param taskUser
+     * @param changedUser
+     */
+    @Override
+    public void taskChangedInform(Long taskUser, Long changedUser, String appUserName,String planDesc) {
+        List<PlanInform> list = new ArrayList<>();
+        //获取任务人
+        User u1 = baseMapper.getUserById(taskUser);
+        //通知任务人
+        PlanInform inform1 = new PlanInform();
+        inform1.setInformDetails("《任务转移》" + "已被" + "【" + appUserName + "】" + "审批通过");
+        inform1.setInformUser(taskUser);
+        inform1.setInformDate(LocalDateTime.now());
+        list.add(inform1);
+        //获取转移人
+        PlanInform inform2 = new PlanInform();
+        inform2.setInformDetails("【" + u1.getName() + "】" + "向您转移了任务" + "《" + planDesc + "》");
+        inform2.setInformUser(changedUser);
+        inform2.setInformDate(LocalDateTime.now());
+        list.add(inform2);
+        //通知转移人
+        this.saveBatch(list);
+    }
+
 }

+ 521 - 35
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/ProjectCostBudgetServiceImpl.java

@@ -55,6 +55,8 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
 
     private final WorkDateInfoMapper dateInfoMapper;
 
+    private final IEmployeeTaskInfoService employeeTaskInfoService;
+
 
     /**
      * 批量新增或修改预算
@@ -480,17 +482,23 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
         for (ProjectCostBudgetVO2 vo2 : list) {
             List<ProjectCostBudgetVO2> vo2ChildrenList = vo2.getChildrenList();
             if (vo2ChildrenList != null && vo2ChildrenList.size() > 0){
-//                //是否跨月
-//                Boolean isTwoMonth = false;
-//                //总计划天数
-//                BigDecimal totalDays = new BigDecimal(0);
-//                //子计划开始月计划总天数
-//                BigDecimal startTotalDays = new BigDecimal(0);
-//                //子计划结束月计划总天数
-//                BigDecimal endTotalDays = new BigDecimal(0);
+                //选出正在进行中的子计划id
+                List<Long> ids = vo2ChildrenList.stream().filter(l -> l.getStatus() != null && l.getStatus() != 1).map(ProjectCostBudgetVO2::getId).collect(Collectors.toList());
+                //清空除进行中之外的子计划的 员工任务信息表
+                employeeTaskInfoService.deleteByBudgetParentId(ids,vo2.getId());
+                BigDecimal allTotal = new BigDecimal(0);
+                Boolean isTaskType = false;
+                //判断进行中的任务是否包含临时任务
+                Boolean isStarting = false;
                 for (ProjectCostBudget budget : vo2ChildrenList) {
                     //如果计划正在进行中或者已经完成,则跳过
                     if (budget.getStatus() != null && budget.getStatus() != 1){
+                        if (map2.get(budget.getPlanTaskType()).get(0).getDictValue() == 1) {
+                            isTaskType = true;
+                        }else {
+                            isStarting = true;
+                        }
+                        allTotal = allTotal.add(budget.getPlanDays());
                         continue;
                     }
                     //如果保存太快,没有生成planDays,就查询
@@ -506,12 +514,45 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
                     budget.setProjectProcess(vo2.getProjectProcess());
                     budget.setTaskDetail(vo2.getTaskDetail());
                     budget.setPostType(vo2.getPostType());
-                    //设置主计划总天数
-//                    totalDays = totalDays.add(budget.getPlanDays());
-                    //只计算固定计划的人工成本
+
+                    //先删除任务计划表中的信息
+                    if (budget.getId() == null){
+                        budget.setId(SnowFlakeUtil.getId());
+                    }
+
+                    //固定任务,则统计人工成本,反则维护任务,统计维护成本
                     if (map2.get(budget.getPlanTaskType()).get(0).getDictValue() == 1) {
+                        isTaskType = true;
+                        LocalDate startTime = budget.getPlanStartTime();
+                        LocalDate endTime = budget.getPlanEndTime();
+                        List<EmployeeTaskInfo> infoList = new ArrayList<>();
+                        //获取岗位单价
+                        BigDecimal postMoney = new BigDecimal(map.get(vo2.getPostType()).get(0).getDictValue());
+                        //获取计划日期中的工作日
+                        List<LocalDate> workDaysList = dateInfoMapper.getWorkDaysList(startTime, endTime);
+                        allTotal = allTotal.add(new BigDecimal(workDaysList.size()));
+                        for (LocalDate today : workDaysList) {
+                            //保存预算到任务计划表
+                            EmployeeTaskInfo employeeTaskInfo = new EmployeeTaskInfo();
+                            employeeTaskInfo.setBudgetId(budget.getId());
+                            employeeTaskInfo.setProjectId(budget.getProjectId());
+                            employeeTaskInfo.setBudgetParentId(budget.getParentId());
+                            employeeTaskInfo.setUnitType(budget.getUnitType());
+                            employeeTaskInfo.setDeptId(budget.getDeptId());
+                            employeeTaskInfo.setCostType(budget.getCostType());
+                            employeeTaskInfo.setTaskDetail(budget.getTaskDetail());
+                            employeeTaskInfo.setProjectProcess(budget.getProjectProcess());
+                            employeeTaskInfo.setBudgetType(budget.getBudgetType());
+                            employeeTaskInfo.setOneDay(today);
+                            employeeTaskInfo.setWorkType(0);
+                            employeeTaskInfo.setPostType(budget.getPostType());
+                            employeeTaskInfo.setEmployeeSalary(postMoney);
+                            infoList.add(employeeTaskInfo);
+                        }
+                        employeeTaskInfoService.saveBatch(infoList);
+
                         //计划人工支出
-                        budget.setPlanStaffCost(budget.getPlanDays().multiply(new BigDecimal(map.get(vo2.getPostType()).get(0).getDictValue())));
+                        budget.setPlanStaffCost(budget.getPlanDays().multiply(postMoney));
                         //如果跨月
                         if (budget.getPlanStartTime().getMonthValue() != budget.getPlanEndTime().getMonthValue()) {
                             //跨月则改变状态
@@ -528,31 +569,72 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
                                 budget.setPlanEndMoney(new BigDecimal(0));
                             }else {
                                 //如果这个月工作天数小于总计划,则总计划相减
-//                                startTotalDays = startTotalDays.add(new BigDecimal(days));
-//                                endTotalDays = endTotalDays.add(budget.getPlanDays().subtract(new BigDecimal(days)));
                                 budget.setPlanStartMonthDays(new BigDecimal(days));
                                 budget.setPlanEndMonthDays(budget.getPlanDays().subtract(new BigDecimal(days)));
-                                budget.setPlanStartMoney(new BigDecimal(days).multiply(new BigDecimal(map.get(budget.getPostType()).get(0).getDictValue())));
+                                budget.setPlanStartMoney(new BigDecimal(days).multiply(postMoney));
                                 budget.setPlanEndMoney(budget.getPlanStaffCost().subtract(budget.getPlanStartMoney()));
                             }
-                        }else {
-//                            startTotalDays = startTotalDays.add(budget.getPlanDays());
                         }
                     }
                 }
+                //修改所有父id下的其他平均工资
+                if (isTaskType){
+                    //清空维护成本
+                    employeeTaskInfoService.deleteMaintainByBudgetId(vo2.getId());
+                    BigDecimal otherCost = vo2.getBudgetCountMoney().subtract(vo2.getBudgetStaffCost());
+                    BigDecimal other = new BigDecimal(0);
+                    //查看成本测算中是否包含其他支出
+                    if (otherCost.intValue() != 0 ){
+                        other = otherCost.divide(allTotal,2, BigDecimal.ROUND_HALF_UP);
+                    }
+                    employeeTaskInfoService.setAvgOtherCostByParentId(vo2.getId(),other);
+                }else {
+                    //维护任务统计维护成本
+                    //如果有进行中的临时任务,就不新增不删除
+                    if (isStarting){
+
+                    }else {
+                        //清空维护成本
+                        employeeTaskInfoService.deleteMaintainByBudgetId(vo2.getId());
+                        //获取项目合同,如果项目没有合同则提示
+                        ControlContractInfo contractInfo = contractService.getContractByProjectId(vo2.getProjectId());
+                        if (contractInfo == null){
+                            throw new ServiceException("当前项目没有合同,不能保存临时任务");
+                        }
+                        LocalDate startTime = contractInfo.getStartTime();
+                        LocalDate endTime = contractInfo.getEndTime();
+                        //获取开始时间到结束时间的天数
+                        long days = endTime.toEpochDay() - startTime.toEpochDay() + 1;
+                        //获得每天维护费
+                        BigDecimal decimal = new BigDecimal(0);
+                        if (vo2.getBudgetCountMoney().intValue() != 0 && days != 0){
+                            decimal = vo2.getBudgetCountMoney().divide(new BigDecimal(days), 2, BigDecimal.ROUND_HALF_UP);
+                        }
+                        endTime = endTime.plusDays(1);
+                        List<EmployeeTaskInfo> infoList = new ArrayList<>();
+                        //循环存入每一天
+                        while (startTime.isBefore(endTime)){
+                            //保存预算到任务计划表
+                            EmployeeTaskInfo employeeTaskInfo = new EmployeeTaskInfo();
+                            employeeTaskInfo.setBudgetId(vo2.getId());
+                            employeeTaskInfo.setProjectId(vo2.getProjectId());
+                            employeeTaskInfo.setUnitType(vo2.getUnitType());
+                            employeeTaskInfo.setDeptId(vo2.getDeptId());
+                            employeeTaskInfo.setCostType(vo2.getCostType());
+                            employeeTaskInfo.setTaskDetail(vo2.getTaskDetail());
+                            employeeTaskInfo.setProjectProcess(vo2.getProjectProcess());
+                            employeeTaskInfo.setBudgetType(vo2.getBudgetType());
+                            employeeTaskInfo.setOneDay(startTime);
+                            employeeTaskInfo.setWorkType(2);
+                            employeeTaskInfo.setPostType(vo2.getPostType());
+                            employeeTaskInfo.setEmployeeSalary(decimal);
+                            infoList.add(employeeTaskInfo);
+                            startTime = startTime.plusDays(1);
+                        }
+                        employeeTaskInfoService.saveBatch(infoList);
+                    }
+                }
                 childrenList.addAll(vo2ChildrenList);
-//                //有子计划也要为父计划设置是否跨月,并且跨月多少天,预算多少钱
-//                ProjectCostBudget costBudget = new ProjectCostBudget();
-//                costBudget.setId(vo2.getId());
-//                if (isTwoMonth){
-//                    costBudget.setPlanIsTwoMonth(1);
-//                    costBudget.setPlanStartMonthDays(startTotalDays);
-//                    costBudget.setPlanEndMonthDays(endTotalDays);
-//                }else {
-//                    costBudget.setPlanIsTwoMonth(0);
-//                }
-//                costBudget.setPlanDays(totalDays);
-//                parentList.add(costBudget);
             }else {
                 //无子计划
                 ProjectCostBudget budget = new ProjectCostBudget();
@@ -562,9 +644,49 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
                     budget.setPlanIsTwoMonth(0);
                     budget.setPlanStartMoney(new BigDecimal(0));
                     budget.setPlanEndMoney(new BigDecimal(0));
+                    employeeTaskInfoService.deleteByBudgetIdAndParentId(budget.getId());
                 }else {
+                    //如果计划正在进行中或者已经完成,则跳过
+                    if (budget.getStatus() != null && budget.getStatus() != 1){
+                        continue;
+                    }
+                    employeeTaskInfoService.deleteByBudgetIdAndParentId(budget.getId());
                     //存在数据,则判断是否是固定计划
                     if (map2.get(budget.getPlanTaskType()).get(0).getDictValue() == 1) {
+                        LocalDate startTime = budget.getPlanStartTime();
+                        LocalDate endTime = budget.getPlanEndTime();
+                        List<EmployeeTaskInfo> infoList = new ArrayList<>();
+                        //获取岗位单价
+                        BigDecimal postMoney = new BigDecimal(map.get(vo2.getPostType()).get(0).getDictValue());
+                        //获取计划日期中的工作日
+                        List<LocalDate> workDaysList = dateInfoMapper.getWorkDaysList(startTime, endTime);
+                        BigDecimal otherCost = budget.getBudgetCountMoney().subtract(budget.getBudgetStaffCost());
+                        BigDecimal other = new BigDecimal(0);
+                        //查看成本测算中是否包含其他支出
+                        if (otherCost.intValue() != 0 ){
+                            other = otherCost.divide(new BigDecimal(workDaysList.size()),2, BigDecimal.ROUND_HALF_UP);
+                        }
+                        for (LocalDate today : workDaysList) {
+                            //保存预算到任务计划表
+                            EmployeeTaskInfo employeeTaskInfo = new EmployeeTaskInfo();
+                            employeeTaskInfo.setBudgetId(budget.getId());
+                            employeeTaskInfo.setProjectId(budget.getProjectId());
+                            employeeTaskInfo.setBudgetParentId(budget.getParentId());
+                            employeeTaskInfo.setUnitType(budget.getUnitType());
+                            employeeTaskInfo.setDeptId(budget.getDeptId());
+                            employeeTaskInfo.setCostType(budget.getCostType());
+                            employeeTaskInfo.setTaskDetail(budget.getTaskDetail());
+                            employeeTaskInfo.setProjectProcess(budget.getProjectProcess());
+                            employeeTaskInfo.setBudgetType(budget.getBudgetType());
+                            employeeTaskInfo.setOneDay(today);
+                            employeeTaskInfo.setWorkType(0);
+                            employeeTaskInfo.setPostType(budget.getPostType());
+                            employeeTaskInfo.setEmployeeSalary(postMoney);
+                            employeeTaskInfo.setAvgOtherCost(other);
+                            infoList.add(employeeTaskInfo);
+                        }
+                        employeeTaskInfoService.saveBatch(infoList);
+
                         //计划人工支出
                         budget.setPlanStaffCost(budget.getPlanDays().multiply(new BigDecimal(map.get(budget.getPostType()).get(0).getDictValue())));
                         //如果跨月
@@ -586,6 +708,45 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
                                 budget.setPlanEndMoney(budget.getPlanStaffCost().subtract(budget.getPlanStartMoney()));
                             }
                         }
+                    }else {
+                        //维护任务统计维护成本
+                        //获取项目合同,如果项目没有合同则提示
+                        ControlContractInfo contractInfo = contractService.getContractByProjectId(vo2.getProjectId());
+                        if (contractInfo == null){
+                            throw new ServiceException("当前项目没有合同,不能保存临时任务");
+                        }
+                        LocalDate startTime = contractInfo.getStartTime();
+                        LocalDate endTime = contractInfo.getEndTime();
+                        //获取开始时间到结束时间的天数
+                        long days = endTime.toEpochDay() - startTime.toEpochDay() + 1;
+                        //获得每天维护费
+                        BigDecimal decimal = new BigDecimal(0);
+                        if (vo2.getBudgetCountMoney().intValue() != 0 && days != 0){
+                            decimal = vo2.getBudgetCountMoney().divide(new BigDecimal(days), 2, BigDecimal.ROUND_HALF_UP);
+                        }
+                        endTime = endTime.plusDays(1);
+                        List<EmployeeTaskInfo> infoList = new ArrayList<>();
+                        //循环存入每一天
+                        while (startTime.isBefore(endTime)){
+                            //保存预算到任务计划表
+                            EmployeeTaskInfo employeeTaskInfo = new EmployeeTaskInfo();
+                            employeeTaskInfo.setBudgetId(vo2.getId());
+                            employeeTaskInfo.setProjectId(vo2.getProjectId());
+                            employeeTaskInfo.setUnitType(vo2.getUnitType());
+                            employeeTaskInfo.setDeptId(vo2.getDeptId());
+                            employeeTaskInfo.setCostType(vo2.getCostType());
+                            employeeTaskInfo.setTaskDetail(vo2.getTaskDetail());
+                            employeeTaskInfo.setProjectProcess(vo2.getProjectProcess());
+                            employeeTaskInfo.setBudgetType(vo2.getBudgetType());
+                            employeeTaskInfo.setOneDay(startTime);
+                            employeeTaskInfo.setWorkType(2);
+                            employeeTaskInfo.setPostType(vo2.getPostType());
+                            employeeTaskInfo.setEmployeeSalary(decimal);
+                            infoList.add(employeeTaskInfo);
+                            startTime = startTime.plusDays(1);
+                        }
+                        employeeTaskInfoService.saveBatch(infoList);
+
                     }
 
                 }
@@ -974,17 +1135,38 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
         if (list != null && list.size() > 0){
             BigDecimal big = new BigDecimal(0);
             for (ProjectCostBudget budget : list) {
+                //判断是否跨年
                 if (budget.getRealPlanStartTime().getYear() != year || budget.getPracticalFinishTime().getYear() != year){
                     if (budget.getIsTwoMonth() != 1){
                         throw new ServiceException("计划年份异常");
                     }
                     if (budget.getPracticalFinishTime().getYear() != year){
-                        //如果结束时间不是今年,则使用开始金额
-                        big = big.add(budget.getPracticalStartMoney());
+                        //如果结束时间不是今年,则使用开始时间到年底的工作日,除以总工作日
+                        LocalDate start = budget.getRealPlanStartTime();
+                        LocalDate end = LocalDate.of(start.getYear(),12,31);
+                        Integer workDays = dateInfoMapper.getWorkDays(start, end);
+                        //如果工作日大于等于实际完成工作日,则直接把人工支出算到上一年
+                        if (workDays >= budget.getPracticalTaskDays().intValue()){
+                            big = big.add(budget.getActualTotalMoney());
+                        }else {
+                            if (budget.getPracticalTaskDays().intValue() != 0) {
+                                BigDecimal decimal = new BigDecimal(workDays).divide(budget.getPracticalTaskDays(),2, BigDecimal.ROUND_HALF_UP).multiply(budget.getActualTotalMoney()).setScale(2, RoundingMode.HALF_UP);
+                                big = big.add(decimal);
+                            }
+                        }
                     }else {
-                        big = big.add(budget.getPracticalEndMoney());
+                        //开始时间不是今年
+                        LocalDate start = budget.getRealPlanStartTime();
+                        LocalDate end = LocalDate.of(start.getYear(),12,31);
+                        Integer workDays = dateInfoMapper.getWorkDays(start, end);
+                        //如果工作日大于等于实际完成工作日,则今年的支出就是0
+                        if (workDays < budget.getPracticalTaskDays().intValue()){
+                            BigDecimal decimal = new BigDecimal(workDays).divide(budget.getPracticalTaskDays(),2, BigDecimal.ROUND_HALF_UP).multiply(budget.getActualTotalMoney()).setScale(2, RoundingMode.HALF_UP);
+                            big = big.add(budget.getActualTotalMoney().subtract(decimal));
+                        }
                     }
                 }else {
+                    //不跨年直接使用实际工资
                     big = big.add(budget.getActualTotalMoney());
                 }
             }
@@ -1339,6 +1521,7 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
      * @param practicalFinishTime  实际完成时间
      */
     @Override
+    @Transactional
     public void taskFinishedStats(Long PlanId, LocalDate practicalFinishTime) {
         System.out.println("计划实际结束时间"+practicalFinishTime);
         System.out.println("今天"+ LocalDateTime.now());
@@ -1354,7 +1537,7 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
         int taskType = dictInfo.getDictValue().intValue();
         //计划为临时计划,则不计算金额直接闭环
         if (taskType == 2){
-            //为临时任务设置任务实际实际,方便统计
+            //为临时任务设置任务实际天数,方便统计
             budget.setPracticalTaskDays(new BigDecimal(1 + budget.getPracticalFinishTime().until(budget.getRealPlanStartTime(), ChronoUnit.DAYS)));
             this.updateById(budget);
         }else {
@@ -1366,6 +1549,48 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
             Double money = userInfo.getOneMoney();
             //为固定计划,则获取最后一条任务日志
             DepartmentPlanLog planLog = logMapper.getNewestPlanLog(PlanId);
+            //为员工任务信息表插入实际工作时间
+            String workDate = planLog.getWorkDate();
+            StringBuilder str = new StringBuilder();
+            List<LocalDate> workDaysList = new ArrayList<>();
+            //如果最后一条任务操作是暂停,则直接使用工作日集合
+            if (StringUtils.isNotBlank(workDate)){
+                String[] days = workDate.split(",");
+                if (days != null && days.length > 0){
+                    for (String day : days) {
+                        workDaysList.add(LocalDate.parse(day));
+                    }
+                }
+            }
+            //如果最后一条任务操作是开启,则+最后开启时间与提交日期之间的工作日
+            if (planLog.getStatus() == 1){
+                List<LocalDate> list = dateInfoMapper.getWorkDaysList(planLog.getOpenPlanStartTime(), practicalFinishTime);
+                if (list != null && list.size() > 0){
+                    workDaysList.addAll(list);
+                }
+            }
+            List<EmployeeTaskInfo> infoList = new ArrayList<>();
+            for (LocalDate today : workDaysList) {
+                //保存实际执行任务时间-到任务计划表
+                EmployeeTaskInfo employeeTaskInfo = new EmployeeTaskInfo();
+                employeeTaskInfo.setBudgetId(budget.getId());
+                employeeTaskInfo.setProjectId(budget.getProjectId());
+                employeeTaskInfo.setBudgetParentId(budget.getParentId());
+                employeeTaskInfo.setUnitType(budget.getUnitType());
+                employeeTaskInfo.setDeptId(budget.getDeptId());
+                employeeTaskInfo.setCostType(budget.getCostType());
+                employeeTaskInfo.setTaskDetail(budget.getTaskDetail());
+                employeeTaskInfo.setProjectProcess(budget.getProjectProcess());
+                employeeTaskInfo.setBudgetType(budget.getBudgetType());
+                employeeTaskInfo.setOneDay(today);
+                employeeTaskInfo.setWorkType(1);
+                employeeTaskInfo.setPostType(budget.getPostType());
+                employeeTaskInfo.setEmployeeSalary(new BigDecimal(money));
+                infoList.add(employeeTaskInfo);
+            }
+            employeeTaskInfoService.saveBatch(infoList);
+
+
             Integer realWorkDays = 0;
             //日志类型为暂停,和status=3则 直接用实际工作时间
             if (planLog.getStatus() == 0){
@@ -1409,12 +1634,67 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
             }else {
                 budget.setIsTwoMonth(0);
             }
-            //如果跨月,则计算开始月人工成本和结束月人工成本
-            //
+
             baseMapper.updateByBudgetId(budget);
         }
     }
 
+    /**
+     * 任务转移审批通过时,计算上一个任务人工作量,并清空workDate
+     * @param PlanId
+     */
+    @Override
+    public void taskChangeStats(Long PlanId,Long taskUser) {
+        ProjectCostBudget budget = this.getById(PlanId);
+        //如果为临时任务,则直接跳过
+        DictInfo dictInfo = baseMapper.getTaskType(budget.getPlanTaskType());
+        int taskType = dictInfo.getDictValue().intValue();
+        //计划为固定计划时,则插入工作量,清空workDate
+        if (taskType == 1){
+            //获取任务人工资
+            User userInfo = baseMapper.getUserInfo(taskUser);
+            if (userInfo.getOneMoney() == null){
+                throw new ServiceException("没有为任务人设置工资");
+            }
+            Double money = userInfo.getOneMoney();
+            DepartmentPlanLog planLog = logMapper.getNewestPlanLog(PlanId);
+            //为员工任务信息表插入实际工作时间
+            String workDate = planLog.getWorkDate();
+            List<LocalDate> workDaysList = new ArrayList<>();
+            //直接使用工作日集合
+            if (StringUtils.isNotBlank(workDate)){
+                String[] days = workDate.split(",");
+                if (days != null && days.length > 0){
+                    for (String day : days) {
+                        workDaysList.add(LocalDate.parse(day));
+                    }
+                    List<EmployeeTaskInfo> infoList = new ArrayList<>();
+                    for (LocalDate today : workDaysList) {
+                        //保存预算到任务计划表
+                        EmployeeTaskInfo employeeTaskInfo = new EmployeeTaskInfo();
+                        employeeTaskInfo.setBudgetId(budget.getId());
+                        employeeTaskInfo.setProjectId(budget.getProjectId());
+                        employeeTaskInfo.setBudgetParentId(budget.getParentId());
+                        employeeTaskInfo.setUnitType(budget.getUnitType());
+                        employeeTaskInfo.setDeptId(budget.getDeptId());
+                        employeeTaskInfo.setCostType(budget.getCostType());
+                        employeeTaskInfo.setTaskDetail(budget.getTaskDetail());
+                        employeeTaskInfo.setProjectProcess(budget.getProjectProcess());
+                        employeeTaskInfo.setBudgetType(budget.getBudgetType());
+                        employeeTaskInfo.setOneDay(today);
+                        employeeTaskInfo.setWorkType(1);
+                        employeeTaskInfo.setPostType(budget.getPostType());
+                        employeeTaskInfo.setEmployeeSalary(new BigDecimal(money));
+                        infoList.add(employeeTaskInfo);
+                    }
+                    employeeTaskInfoService.saveBatch(infoList);
+                    planLog.setWorkDate("");
+                    logMapper.updateById(planLog);
+                }
+            }
+        }
+    }
+
     /**
      * 根据年份获取所有项目的维护支出
      * @return
@@ -1944,6 +2224,212 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
         return null;
     }
 
+    /**
+     * 获取所有项目截至当年的维护支出,按部门分组,再按月分组,统计总和
+     * @param year
+     * @return
+     */
+    @Override
+    public Map<Long, Map<Integer, BigDecimal>> getAllMaintainCost10(int year) {
+        //获取所有已分配任务人的维护支出,如果没有返回0
+        List<ProjectCostBudget> plans = baseMapper.getAllMaintainPlan();
+        if (plans != null && plans.size() > 0) {
+            //分离出主计划和子计划,建立主计划的id,set集合
+            Set<Long> bab = new HashSet<>();
+            for (ProjectCostBudget plan : plans) {
+                if (plan.getParentId() == 0) {
+                    bab.add(plan.getId());
+                } else {
+                    bab.add(plan.getParentId());
+                }
+            }
+            //查询出所有维护计划,根据项目id分组
+            List<ProjectCostBudget> budgets = this.listByIds(bab);
+            Map<Long, List<ProjectCostBudget>> budgetMap = budgets.parallelStream()
+                    .collect(Collectors.groupingBy(ProjectCostBudget::getProjectId));
+            //查询出所有项目
+            List<ControlProjectInfo> projectInfos = infoMapper.selectList(new LambdaQueryWrapper<ControlProjectInfo>().in(ControlProjectInfo::getId, budgetMap.keySet()));
+            //通过项目id查询出所有的合同,如果项目没有合同则提示,项目没有合同,无法计算维护支出
+            List<ControlContractInfo> contractList = contractService.getContractByYear(year, budgetMap.keySet());
+            if (contractList == null || contractList.size() <= 0){
+                return null;
+            }
+            //把合同根据项目分组
+            Map<Long, List<ControlContractInfo>> contractMap = contractList.parallelStream()
+                    .collect(Collectors.groupingBy(ControlContractInfo::getProjectId));
+            //返回结果
+            Map<Integer,List<BigDecimal>> map = new HashMap<>();
+            for (int i = 1; i <= 6; i++) {
+                List<BigDecimal> list = new ArrayList<>();
+                for (int j = 0; j < 12; j++) {
+                    list.add(new BigDecimal(0));
+                }
+                map.put(i,list);
+            }
+            //循环项目,
+            for (ControlProjectInfo info : projectInfos) {
+                List<ControlContractInfo> infos = contractMap.get(info.getId());
+                if (infos == null || infos.size() == 0){
+                    continue;
+                }
+                //获取合同时间,获取多少个月
+                ControlContractInfo contract = contractMap.get(info.getId()).get(0);
+                LocalDate startTime = contract.getStartTime();
+                LocalDate endTime = contract.getEndTime();
+                //合同开始日期比今天大,直接跳过
+                if (LocalDate.now().compareTo(startTime) < 0){
+                    continue;
+                }
+                int years = endTime.getYear() - startTime.getYear();
+                int months = years * 12 + (endTime.getMonthValue() - startTime.getMonthValue()) + 1;
+                //每个项目的维护总和 / 多少个月 = 该项目每个月的维护费
+                //该项目所有的维护计划,不会为空,
+                List<ProjectCostBudget> list = budgetMap.get(info.getId());
+                //查询出每个部门的维护支出
+                BigDecimal b1 = new BigDecimal(0);
+                BigDecimal b2 = new BigDecimal(0);
+                BigDecimal b3 = new BigDecimal(0);
+                BigDecimal b4 = new BigDecimal(0);
+                BigDecimal b5 = new BigDecimal(0);
+                BigDecimal b6 = new BigDecimal(0);
+                for (ProjectCostBudget l : list) {
+                    if (l.getCostType() == 1){
+                        b1 = b1.add(l.getBudgetStaffCost());
+                    }
+                    if (l.getCostType() == 2){
+                        b2 = b2.add(l.getBudgetStaffCost());
+                    }
+                    if (l.getCostType() == 3){
+                        b3 = b3.add(l.getBudgetStaffCost());
+                    }
+                    if (l.getCostType() == 4){
+                        b4 = b4.add(l.getBudgetStaffCost());
+                    }
+                    if (l.getCostType() == 5){
+                        b5 = b5.add(l.getBudgetStaffCost());
+                    }
+                    if (l.getCostType() == 6){
+                        b6 = b6.add(l.getBudgetStaffCost());
+                    }
+                }
+                // 当前日期和合同开始时间比较,相差多少月  月 * 每个月维护费 = 当前项目截至当前的所有维护费
+                int startMonth = 0;
+                int endMonth = 0;
+                //判断是否查询今年
+                if (LocalDate.now().getYear() == year){
+                    //如果合同开始日期大于今年,则开始时间从一月算起
+                    if (startTime.getYear() < year){
+                        startMonth = 1;
+                    }else {
+                        //如果合同开始日期比今天要大,则不计算维护费
+                        if (startTime.getMonthValue() > LocalDate.now().getMonthValue()){
+                            continue;
+                        }else {
+                            //开始日期比今天小,从开始日期开始计算
+                            startMonth = startTime.getMonthValue();
+                        }
+                    }
+                    //如果合同时间大于当前,就用当前时间,如果合同时间小于当前,就用合同时间 -做结束时间
+                    if (endTime.compareTo(LocalDate.now()) > 0){
+                        endMonth = LocalDate.now().getMonthValue();
+                    }else {
+                        endMonth = endTime.getMonthValue();
+                    }
+                }else {
+                    //不是今年
+                    if (startTime.getYear() > year){
+                        continue;
+                    }else if (startTime.getYear() < year) {
+                        startMonth = 1;
+                    }else {
+                        //如果合同开始月比1月要大,则用开始日期
+                        if (startTime.getMonthValue() > 1){
+                            startMonth = startTime.getMonthValue();
+                        }else {
+                            //开始月比1或者等于1,从1开始计算
+                            startMonth = 1;
+                        }
+                    }
+                    //如果合同时间大于当前,就用当前时间
+                    if (endTime.getYear() > year){
+                        endMonth = 12;
+                    }else {
+                        if (endTime.getMonthValue() < 12) {
+                            endMonth = endTime.getMonthValue();
+                        }else {
+                            endMonth = 12;
+                        }
+                    }
+                }
+                //为部门设置值
+                if (b1.intValue() != 0){
+                    //获得部门每个月的维护费
+                    BigDecimal scale = b1.divide(new BigDecimal(months),2,RoundingMode.HALF_UP).setScale(2, RoundingMode.HALF_UP);
+                    List<BigDecimal> l1 = map.get(1);
+                    for (int i = 1; i <= 12; i++) {
+                        if (i >= startMonth && i <= endMonth){
+                            l1.set(i-1,l1.get(i-1).add(scale));
+                        }
+                    }
+                }
+                if (b2.intValue() != 0){
+                    //获得部门每个月的维护费
+                    BigDecimal scale = b2.divide(new BigDecimal(months),2,RoundingMode.HALF_UP).setScale(2, RoundingMode.HALF_UP);
+                    List<BigDecimal> l1 = map.get(2);
+                    for (int i = 1; i <= 12; i++) {
+                        if (i >= startMonth && i <= endMonth){
+                            l1.set(i-1,l1.get(i-1).add(scale));
+                        }
+                    }
+                }
+                if (b3.intValue() != 0){
+                    //获得部门每个月的维护费
+                    BigDecimal scale = b3.divide(new BigDecimal(months),2,RoundingMode.HALF_UP).setScale(2, RoundingMode.HALF_UP);
+                    List<BigDecimal> l1 = map.get(3);
+                    for (int i = 1; i <= 12; i++) {
+                        if (i >= startMonth && i <= endMonth){
+                            l1.set(i-1,l1.get(i-1).add(scale));
+                        }
+                    }
+                }
+                if (b4.intValue() != 0){
+                    //获得部门每个月的维护费
+                    BigDecimal scale = b4.divide(new BigDecimal(months),2,RoundingMode.HALF_UP).setScale(2, RoundingMode.HALF_UP);
+                    List<BigDecimal> l1 = map.get(4);
+                    for (int i = 1; i <= 12; i++) {
+                        if (i >= startMonth && i <= endMonth){
+                            l1.set(i-1,l1.get(i-1).add(scale));
+                        }
+                    }
+                }
+                if (b5.intValue() != 0){
+                    //获得部门每个月的维护费
+                    BigDecimal scale = b5.divide(new BigDecimal(months),2,RoundingMode.HALF_UP).setScale(2, RoundingMode.HALF_UP);
+                    List<BigDecimal> l1 = map.get(5);
+                    for (int i = 1; i <= 12; i++) {
+                        if (i >= startMonth && i <= endMonth){
+                            l1.set(i-1,l1.get(i-1).add(scale));
+                        }
+                    }
+                }
+
+                if (b6.intValue() != 0){
+                    //获得部门每个月的维护费
+                    BigDecimal scale = b6.divide(new BigDecimal(months),2,RoundingMode.HALF_UP).setScale(2, RoundingMode.HALF_UP);
+                    List<BigDecimal> l1 = map.get(6);
+                    for (int i = 1; i <= 12; i++) {
+                        if (i >= startMonth && i <= endMonth){
+                            l1.set(i-1,l1.get(i-1).add(scale));
+                        }
+                    }
+                }
+
+            }
+            return null;
+        }
+        return null;
+    }
+
     /**
      * //获取所有项目截至当年的维护支出,按年返回
      * @param year

+ 73 - 83
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/ProjectInfoServiceImpl.java

@@ -4,6 +4,7 @@ import cn.hutool.core.date.DateUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.mysql.cj.protocol.x.ReusableInputStream;
 import lombok.AllArgsConstructor;
 import org.springblade.common.utils.SnowFlakeUtil;
 import org.springblade.control.dto.ControlProjectInfoDTO;
@@ -52,6 +53,13 @@ public class ProjectInfoServiceImpl extends BaseServiceImpl<ProjectInfoMapper, C
 
     private final JdbcTemplate jdbcTemplate;
 
+    private final IEmployeeTaskInfoService employeeTaskInfoService;
+
+
+    public String getProjectNameByBudgetId(Long id){
+        return baseMapper.getProjectNameByBudgetId(id);
+    }
+
     /**
      * 自定义分页
      *
@@ -165,11 +173,13 @@ public class ProjectInfoServiceImpl extends BaseServiceImpl<ProjectInfoMapper, C
     @Override
     public AllProjectStatsVO allProjectStats() {
         AllProjectStatsVO vo = baseMapper.allProjectStats();
+        //获取截至目前的人工支出
+        BigDecimal salary = employeeTaskInfoService.getAllEmployeeSalaryByYear(0);
         //获取截至目前所有维护支出
-        BigDecimal cost2 = budgetService.getAllMaintainCost2();
+        BigDecimal cost2 = employeeTaskInfoService.getAllMaintainSalaryByYear(0);
         //所有的报销支出
         BigDecimal decimal = this.getThisYearReimburse(0);
-        vo.setAllPracticalDisburse(vo.getAllPracticalDisburse().add(cost2).add(decimal));
+        vo.setAllPracticalDisburse(salary.add(cost2).add(decimal));
         return vo;
     }
 
@@ -179,12 +189,10 @@ public class ProjectInfoServiceImpl extends BaseServiceImpl<ProjectInfoMapper, C
     @Override
     public List<AllProjectStatsVO> ProjectListStats() {
         List<AllProjectStatsVO> vos = baseMapper.ProjectListStats();
+        //获取人工支出
+        Map<Long, BigDecimal> costMap = employeeTaskInfoService.getAllEmployeeSalaryByYear3(0);
         //获取维护支出
-        Map<Long, BigDecimal> map = budgetService.getAllMaintainCost5();
-        Boolean isMaintain = true;
-        if (map == null || map.size() <= 0){
-            isMaintain = false;
-        }
+        Map<Long, BigDecimal> maintainMap = employeeTaskInfoService.getAllMaintainSalaryByYear3(0);
         //报销支出
         Map<Long, BigDecimal> reimburseMap = this.getYearReimburseByYear(0);
         Boolean isReimburse = true;
@@ -192,23 +200,23 @@ public class ProjectInfoServiceImpl extends BaseServiceImpl<ProjectInfoMapper, C
             isReimburse = false;
         }
         for (AllProjectStatsVO vo : vos) {
-            if (isMaintain) {
-                BigDecimal decimal = map.get(vo.getProjectId());
-                //维护支出
-                if (decimal != null) {
-                    if (vo.getPracticalPayCost() == null){
-                        vo.setPracticalPayCost(new BigDecimal(0));
-                    }
-                    vo.setPracticalPayCost(vo.getPracticalPayCost().add(decimal));
-                }
-                //计算报销
-                if (isReimburse){
-                    BigDecimal decimals = reimburseMap.get(vo.getProjectId());
-                    if (decimals != null){
-                        vo.setPracticalPayCost(vo.getPracticalPayCost().add(decimals));
-                    }
+            BigDecimal big = new BigDecimal(0);
+            //人工支出
+            if (costMap != null && costMap.get(vo.getProjectId()) != null){
+                big = big.add(costMap.get(vo.getProjectId()));
+            }
+            //维护支出
+            if (maintainMap != null && maintainMap.get(vo.getProjectId()) != null){
+                big = big.add(maintainMap.get(vo.getProjectId()));
+            }
+            //计算报销
+            if (isReimburse){
+                BigDecimal decimals = reimburseMap.get(vo.getProjectId());
+                if (decimals != null){
+                    big = big.add(decimals);
                 }
             }
+            vo.setPracticalPayCost(big);
         }
         return vos;
     }
@@ -223,25 +231,16 @@ public class ProjectInfoServiceImpl extends BaseServiceImpl<ProjectInfoMapper, C
         List<DictInfo> costTypeDict = baseMapper.getCostTypeDict();
         //获取项目所有预算
         List<ProjectCostBudget> budgets = budgetService.getAllBudgetByProjectId(id);
-        //获取项目所有的维护预算
-        Set<Long> set = budgetService.getAllMaintainBudgetId(id);
-        //从预算中排除维护预算
-//        budgets = budgets.stream().filter(l->!set.contains(l.getId())).collect(Collectors.toList());
-        //获取项目所有维护预算
-        Map<Integer, BigDecimal> map = budgetService.getAllMaintainCost6(id);
-        Boolean isMaintain = true;
-        if (map == null || map.size() <= 0){
-            isMaintain = false;
-        }
-
+        //人工支出
+        Map<Integer, BigDecimal> costMap = employeeTaskInfoService.getAllEmployeeSalaryByProject2(id);
+        //维护支出
+        Map<Integer, BigDecimal> maintainMap = employeeTaskInfoService.getAllMaintainSalaryByProject2(id);
         //报销支出
         Map<Integer, BigDecimal> reimburseMap = this.getProjectReimburseByCostType(id);
         Boolean isReimburse = true;
         if (reimburseMap == null || reimburseMap.size() <= 0){
             isReimburse = false;
         }
-        //获取项目所有实际费用
-        List<ProjectCostBudget> practicalList = budgetService.getAllPracticalBudgetByProjectId(id);
         if (budgets != null && budgets.size() > 0){
             Map<Integer, List<ProjectCostBudget>> budgetMap = budgets.parallelStream()
                     .collect(Collectors.groupingBy(ProjectCostBudget::getCostType));
@@ -257,31 +256,19 @@ public class ProjectInfoServiceImpl extends BaseServiceImpl<ProjectInfoMapper, C
                         bigDecimal = bigDecimal.add(budget.getBudgetCountMoney());
                     }
                 }
-                //加上每个部门的维护预算
-//                if (isMaintain){
-//                    BigDecimal decimal = map.get(i);
-//                    if (decimal != null){
-//                        bigDecimal = bigDecimal.add(decimal);
-//                    }
-//                }
+                //测算成本
                 vo.setBudgetCost(bigDecimal);
                 //设置费用分类实际费用,目前设置人工,维护支出,报销支出
                 BigDecimal practicalCost = new BigDecimal(0);
-                if (practicalList != null && practicalList.size() > 0){
-                    for (ProjectCostBudget budget : practicalList) {
-                        if (budget.getCostType() == i){
-                            practicalCost = practicalCost.add(budget.getActualTotalMoney());
-                        }
-                    }
+                //人工成本
+                if (costMap != null && costMap.get(i) != null ){
+                    practicalCost = practicalCost.add(costMap.get(i));
                 }
-                //加上每个部门的维护支出
-                if (isMaintain){
-                    BigDecimal decimal = map.get(i);
-                    if (decimal != null){
-                        practicalCost = practicalCost.add(decimal);
-                    }
+                //维护支出
+                if (maintainMap != null && maintainMap.get(i) != null ){
+                    practicalCost = practicalCost.add(maintainMap.get(i));
                 }
-                //加上每个部门的报销支出
+                //报销支出
                 if (isReimburse){
                     BigDecimal decimals = reimburseMap.get(i);
                     if (decimals != null){
@@ -299,35 +286,8 @@ public class ProjectInfoServiceImpl extends BaseServiceImpl<ProjectInfoMapper, C
                 list.get(0).setTotal(big);
             }
             return list;
-        }else {
-            if (isMaintain){
-                for (int i = 1; i <= 6; i++) {
-                    AllProjectStatsVO vo = new AllProjectStatsVO();
-                    vo.setProjectId(id);
-                    vo.setCostType(i);
-                    vo.setCostTypeValue(costTypeDict.get(i-1).getDictName());
-                    BigDecimal bigDecimal = new BigDecimal(0);
-                    BigDecimal practicalCost = new BigDecimal(0);
-                    if (practicalList != null && practicalList.size() > 0){
-                        for (ProjectCostBudget budget : practicalList) {
-                            if (budget.getCostType() == i){
-                                practicalCost = practicalCost.add(budget.getActualTotalMoney());
-                            }
-                        }
-                    }
-                    BigDecimal decimal = map.get(i);
-                    if (decimal != null){
-                        bigDecimal = bigDecimal.add(decimal);
-                        practicalCost = practicalCost.add(decimal);
-                    }
-                    vo.setBudgetCost(bigDecimal);
-                    vo.setPracticalCost(practicalCost);
-                    list.add(vo);
-                }
-                return list;
-            }
-            return null;
         }
+        return null;
     }
 
     /**
@@ -390,6 +350,36 @@ public class ProjectInfoServiceImpl extends BaseServiceImpl<ProjectInfoMapper, C
         }
     }
 
+
+    /**
+     * 获取当年所有的报销,已部门分组,然后再按月分组,统计月总和
+     * @param year
+     * @return
+     */
+    @Override
+    public Map<Long, Map<Integer, BigDecimal>> getThisYearAllReimburseByYear2(int year) {
+        //获取当年所有的报销
+        List<EMFinancialReimbursementInfo> list = baseMapper.getThisYearReimburse2(year);
+        if (list != null && list.size() > 0){
+            Map<Long, Map<Integer, BigDecimal>> map = new HashMap<>();
+            Map<Long, List<EMFinancialReimbursementInfo>> listMap = list.parallelStream()
+                    .collect(Collectors.groupingBy(EMFinancialReimbursementInfo::getCreateDept));
+            for (Long aLong : listMap.keySet()) {
+                //该项目所有支出
+                List<EMFinancialReimbursementInfo> infoList = listMap.get(aLong);
+                //按月份分组
+                Map<Integer, BigDecimal> monthMap = infoList.stream().collect(
+                        Collectors.groupingBy(
+                                o -> o.getFrDate().getMonth()+1,
+                                Collectors.mapping(EMFinancialReimbursementInfo::getFrMoney, Collectors.reducing(BigDecimal.ZERO, BigDecimal::add))
+                        ));
+                map.put(aLong,monthMap);
+            }
+            return map;
+        }
+        return null;
+    }
+
     /**
      * 获取所有项目截至当年的报销支出,分月返回
      * @param year

+ 34 - 21
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/ProjectProcessServiceImpl.java

@@ -5,9 +5,11 @@ import lombok.AllArgsConstructor;
 import org.springblade.common.utils.SnowFlakeUtil;
 import org.springblade.control.controller.ProjectInfoController;
 import org.springblade.control.dto.ControlProjectInfoDTO;
+import org.springblade.control.entity.EmployeeTaskInfo;
 import org.springblade.control.entity.ProjectCostBudget;
 import org.springblade.control.entity.ProjectProcess;
 import org.springblade.control.mapper.ProjectProcessMapper;
+import org.springblade.control.service.IEmployeeTaskInfoService;
 import org.springblade.control.service.IProjectCostBudgetService;
 import org.springblade.control.service.IProjectInfoService;
 import org.springblade.control.service.IProjectProcessService;
@@ -33,6 +35,7 @@ import java.util.stream.Collectors;
 public class ProjectProcessServiceImpl extends BaseServiceImpl<ProjectProcessMapper, ProjectProcess> implements IProjectProcessService {
     private final ProjectProcessMapper processMapper;
     private final IProjectCostBudgetService budgetService;
+    private final IEmployeeTaskInfoService employeeTaskInfoService;
 
 
     /**
@@ -122,12 +125,10 @@ public class ProjectProcessServiceImpl extends BaseServiceImpl<ProjectProcessMap
     public List<ProjectProcessVO> processService(Long projectId, Integer costType) {
         //获取当前项目所有项目环节
         List<ProjectProcessVO> list = processMapper.getProjectProcess(projectId);
-        //获取项目所有维护预算
-        Map<Long, BigDecimal> maintainMap = budgetService.getAllMaintainCost7(projectId, costType);
-        Boolean isMaintain = true;
-        if (maintainMap == null || maintainMap.size() <= 0){
-            isMaintain = false;
-        }
+        //根据项目,费用分类,获取人工支出
+        Map<Long, List<EmployeeTaskInfo>> costMap = employeeTaskInfoService.getAllEmployeeSalaryByProjectAndCostType(projectId, costType);
+        //根据项目,费用分类,获取维护支出
+        Map<Long, List<EmployeeTaskInfo>> maintainList = employeeTaskInfoService.getAllMaintainSalaryByProjectAndCostType(projectId, costType);
         //报销支出
         Map<Long, BigDecimal> reimburseMap = this.getProjectReimburseByCostType(projectId,costType);
         Boolean isReimburse = true;
@@ -151,35 +152,47 @@ public class ProjectProcessServiceImpl extends BaseServiceImpl<ProjectProcessMap
         }
         //包含此环节就统计,不包含就跳出
         for (ProjectProcessVO vo : list) {
-            if ((isBudgets && map.get(vo.getId()) != null) || (isMaintain && maintainMap.get(vo.getId()) != null) || (isReimburse && reimburseMap.get(vo.getId()) != null)){
+            if ((costMap != null && costMap.get(vo.getId()) != null) || (maintainList != null && maintainList.get(vo.getId()) != null) || (isReimburse && reimburseMap.get(vo.getId()) != null)){
                 //设置参与
                 vo.setIsParticipate(1);
                 //时间成本统计总天数,人员投入统计总人数,成本支出统计当前环节总支出
                 BigDecimal costDisburse = new BigDecimal(0);
+                //时间成本
                 BigDecimal timeCost = new BigDecimal(0);
+                //人员投入
                 int staffTotal = 0;
                 //设置费用明细
                 List<ProjectProcessVO.costDetail> details = new ArrayList<>();
-                if (isBudgets && map.get(vo.getId()) != null) {
-                    List<ProjectCostBudget> budgetList = map.get(vo.getId());
-                    staffTotal = budgetList.size();
-                    for (ProjectCostBudget budget : budgetList) {
-                        costDisburse = costDisburse.add(budget.getActualTotalMoney());
-                        timeCost = timeCost.add(budget.getPracticalTaskDays());
-                    }
+                //人工成本
+                if (costMap != null && costMap.get(vo.getId()) != null){
+                    List<EmployeeTaskInfo> infoList = costMap.get(vo.getId());
+                    BigDecimal cost = infoList.stream().map(EmployeeTaskInfo::getEmployeeSalary).reduce(BigDecimal.ZERO, BigDecimal::add);
+                    costDisburse = costDisburse.add(cost);
+                    timeCost = timeCost.add(new BigDecimal(infoList.size()));
+                    Map<Long, List<EmployeeTaskInfo>> listMap = infoList.parallelStream()
+                            .collect(Collectors.groupingBy(EmployeeTaskInfo::getEmployeeId));
+                    staffTotal += listMap.size();
+                    //费用详情
                     ProjectProcessVO.costDetail costDetail = new ProjectProcessVO.costDetail();
                     costDetail.setCostTypeValue("人工成本");
-                    costDetail.setPrice(costDisburse);
-                    costDetail.setTotal(costDisburse);
+                    costDetail.setPrice(cost);
+                    costDetail.setTotal(cost);
                     details.add(costDetail);
                 }
-                //维护支出
-                if (isMaintain && maintainMap.get(vo.getId()) != null){
-                    costDisburse = costDisburse.add(maintainMap.get(vo.getId()));
+                if (maintainList != null && maintainList.get(vo.getId()) != null){
+                    List<EmployeeTaskInfo> infoList = maintainList.get(vo.getId());
+                    BigDecimal cost = infoList.stream().map(EmployeeTaskInfo::getEmployeeSalary).reduce(BigDecimal.ZERO, BigDecimal::add);
+                    costDisburse = costDisburse.add(cost);
+                    timeCost = timeCost.add(new BigDecimal(infoList.size()));
+                    //维护支出目前统计不了人
+//                    Map<Long, List<EmployeeTaskInfo>> listMap = infoList.parallelStream()
+//                            .collect(Collectors.groupingBy(EmployeeTaskInfo::getEmployeeId));
+//                    staffTotal += listMap.size();
+                    //费用详情
                     ProjectProcessVO.costDetail costDetail = new ProjectProcessVO.costDetail();
                     costDetail.setCostTypeValue("维护支出");
-                    costDetail.setPrice(maintainMap.get(vo.getId()));
-                    costDetail.setTotal(maintainMap.get(vo.getId()));
+                    costDetail.setPrice(cost);
+                    costDetail.setTotal(cost);
                     details.add(costDetail);
                 }
                 //报销支出

+ 29 - 12
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/TaskProcessServiceImpl.java

@@ -723,9 +723,13 @@ public class TaskProcessServiceImpl extends BaseServiceImpl<TaskProcessMapper, T
             }
             vos.add(vo);
         }
-
-        vos.sort(Comparator.comparing(TaskPlanInfoVO::getEndTime).reversed());
-        vosPage.setRecords(vos);
+        if (vos.size() > 0) {
+            List<TaskPlanInfoVO> collect = vos.stream()
+                    .filter(vo -> vo.getEndTime() != null)
+                    .sorted(Comparator.comparing(TaskPlanInfoVO::getEndTime).reversed())
+                    .collect(Collectors.toList());
+            vosPage.setRecords(collect);
+        }
         return vosPage;
     }
 
@@ -886,6 +890,10 @@ public class TaskProcessServiceImpl extends BaseServiceImpl<TaskProcessMapper, T
                         planInformService.taskFinishedInform2("计划任务完成", taskProcessInfo.getAuditUserIds(), SecureUtil.getNickName(), taskProcessInfo.getStatus());
 
                     } else if (dto.getUpdateType().equals("2")) {
+                        //如果任务正在进行中,则提示要先暂停才能转移
+                        if (planTaskInfo.getStatus() != 3){
+                            throw new ServiceException("请先暂停任务,再转移");
+                        }
                         //任务转移
                         TaskProcessInfo taskProcessInfo = new TaskProcessInfo();
                         taskProcessInfo.setId(SnowFlakeUtil.getId());
@@ -999,7 +1007,7 @@ public class TaskProcessServiceImpl extends BaseServiceImpl<TaskProcessMapper, T
             if (projectCostBudgetList.size() > 0) {
                 //审批人(总经理)
                 List<String> auditUserIds = new LinkedList<>();
-                List<Dept> query = jdbcTemplate.query("select id from blade_dept where dept_name = '总经理' and tenant_id = " + SecureUtil.getUser().getTenantId() + " and dept_type = 3", new BeanPropertyRowMapper<>(Dept.class));
+                List<Dept> query = jdbcTemplate.query("select id from blade_dept where dept_name = '总经理' and tenant_id = " + SecureUtil.getUser().getTenantId() + " and dept_type = 3 and is_deleted = 0", new BeanPropertyRowMapper<>(Dept.class));
                 if (query.size() == 1) {
                     Dept dept = query.get(0);
                     List<User> users = jdbcTemplate.query("select id from blade_user where post_id like '%" + dept.getId() + "%' and role_id like '%" + dept.getId() + "%' and tenant_id = " + SecureUtil.getUser().getTenantId() + " and is_deleted = 0", new BeanPropertyRowMapper<>(User.class));
@@ -1077,6 +1085,8 @@ public class TaskProcessServiceImpl extends BaseServiceImpl<TaskProcessMapper, T
 
                             //删除当前计划任务与日志关系信息(如果任务转移,那么就不属于该用户了,就应该在新用户写日志时,与新用户绑定)
                             jdbcTemplate.execute("delete from c_log_history_task_record where task_id = " + dataId);
+
+
                         }
 
                     } else if (taskStatus == 3) { //驳回审批
@@ -1186,18 +1196,24 @@ public class TaskProcessServiceImpl extends BaseServiceImpl<TaskProcessMapper, T
         switch (businessDataType) {
             case 1:
                 //计划任务
-                TaskProcessInfo taskProcessInfo1 = jdbcTemplate.query("select status from c_task_process_info where id = " + approveTaskId, new BeanPropertyRowMapper<>(TaskProcessInfo.class)).stream().findAny().orElse(null);
+                TaskProcessInfo taskProcessInfo1 = jdbcTemplate.query("select report_user_id,task_name,status from c_task_process_info where id = " + approveTaskId, new BeanPropertyRowMapper<>(TaskProcessInfo.class)).stream().findAny().orElse(null);
                 ProjectCostBudget projectCostBudget = jdbcTemplate.query("select plan_task_desc,task_user,id from c_project_cost_budget where id = " + dataId, new BeanPropertyRowMapper<>(ProjectCostBudget.class)).stream().findAny().orElse(null);
                 if (taskProcessInfo1 != null && projectCostBudget != null) {
                     //获取任务完成时间
                     TaskPlanUpdateStatusInfo taskPlanUpdateStatusInfo = jdbcTemplate.query("select completion_time from c_task_plan_update_status_info where update_type = 1 and approve_task_id = " + approveTaskId + " and plan_task_id = " + dataId, new BeanPropertyRowMapper<>(TaskPlanUpdateStatusInfo.class)).stream().findAny().orElse(null);
-                    if (taskPlanUpdateStatusInfo != null && taskProcessInfo1.getStatus().equals(2)) { //已完成的任务才推送
-                        //修改任务实际完成时间、金额
-                        LocalDate localDate = taskPlanUpdateStatusInfo.getCompletionTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
-                        projectCostBudgetService.taskFinishedStats(projectCostBudget.getId(), localDate);
+                    if (taskProcessInfo1.getTaskName().contains("完成任务")){
+                        if (taskPlanUpdateStatusInfo != null && taskProcessInfo1.getStatus().equals(2)) { //已完成的任务才推送
+                            //修改任务实际完成时间、金额
+                            LocalDate localDate = taskPlanUpdateStatusInfo.getCompletionTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
+                            projectCostBudgetService.taskFinishedStats(projectCostBudget.getId(), localDate);
+                        }
+                        //日志操作信息
+                        planInformService.taskFinishedInform(projectCostBudget.getPlanTaskDesc(), projectCostBudget.getTaskUser(), SecureUtil.getUserName(), taskProcessInfo1.getStatus());
+                    }else if (taskProcessInfo1.getTaskName().contains("转移任务")){
+                        projectCostBudgetService.taskChangeStats(Long.parseLong(dataId),taskProcessInfo1.getReportUserId());
+                        //日志操作信息
+                        planInformService.taskChangedInform(taskPlanUpdateStatusInfo.getStartTransferObject(),taskPlanUpdateStatusInfo.getTransferObject(), SecureUtil.getUserName(),projectCostBudget.getPlanTaskDesc());
                     }
-                    //日志操作信息
-                    planInformService.taskFinishedInform(projectCostBudget.getPlanTaskDesc(), projectCostBudget.getTaskUser(), SecureUtil.getUserName(), taskProcessInfo1.getStatus());
                 }
 
                 break;
@@ -1303,8 +1319,9 @@ public class TaskProcessServiceImpl extends BaseServiceImpl<TaskProcessMapper, T
             case 10:
                 TaskProcessInfo taskProcessInfo10 = jdbcTemplate.query("select status,report_user_id from c_task_process_info where id = " + approveTaskId, new BeanPropertyRowMapper<>(TaskProcessInfo.class)).stream().findAny().orElse(null);
                 if (taskProcessInfo10 != null && taskProcessInfo10.getStatus().equals(2)) {
+                    String name = projectInfoServiceImpl.getProjectNameByBudgetId(Long.parseLong(dataId));
                     //日志操作信息
-                    planInformService.taskFinishedInform("成本测算申请", taskProcessInfo10.getReportUserId(), SecureUtil.getNickName(), taskProcessInfo10.getStatus());
+                    planInformService.taskFinishedInform(name +"-成本测算申请", taskProcessInfo10.getReportUserId(), SecureUtil.getNickName(), 4);
                 }
                 break;
         }

+ 5 - 8
blade-service/blade-manager/src/main/java/com/mixsmart/utils/CustomFunction.java

@@ -1051,12 +1051,7 @@ public class CustomFunction {
               .toEpochMilli();
     }
 
-/*    public static void main(String[] args) {
-             List<Object> l1 = Arrays.asList("16:00","2023年6月29日 16:10:31","2023年6月29日 16:09");
-             List<Object> l2 = Arrays.asList("2023年6月29日16:50");
-        System.out.println(minutesPassed(l1,l2));
 
-    }*/
 
     public static Object k2d(Object k) {
         Matcher mt = RegexUtils.matcher("[A-Z]*(\\d*)\\+([\\d|\\.]*)", k.toString());
@@ -1332,7 +1327,7 @@ public class CustomFunction {
                     int _hz = Integer.parseInt(i < rateIn.length ? rateIn[i] : rateIn[rateIn.length - 1]);
                     String _deviation = i < deviationIn.length ? deviationIn[i] : deviationIn[deviationIn.length - 1];
                     String _pass = i < passIn.length ? passIn[i] : passIn[passIn.length - 1];
-                    int _scale = StringUtils.getScale(e, _deviation);
+                    int _scale = StringUtils.getScaleZero(e, _deviation);
                     String delimiter = StringUtils.handleNull(matcherFindGroup("[^0-9.]", e, 0, false));
                     if (StringUtils.isEmpty(delimiter)) {
                         delimiter = CONCAT;
@@ -2582,11 +2577,13 @@ public class CustomFunction {
         return dXd(design, data, xN, scale, mode);
     }
 
-/*    public static void main(String[] args) {
+/*
+    public static void main(String[] args) {
         String a="100/200";
         List<Object>list  = new ArrayList<>(Arrays.asList(101,102,201,198));
         list.forEach(d-> System.out.println(dXd(a,d)));
-    }*/
+    }
+*/
 
     /**
      * @return java.lang.Object

+ 38 - 6
blade-service/blade-manager/src/main/java/com/mixsmart/utils/FormulaUtils.java

@@ -138,6 +138,21 @@ public class FormulaUtils {
         return result;
     }
 
+
+    /*public static void main(String[] args) {
+        FormData fd = new FormData();
+        fd.setEName("1111");
+        List<ElementData> list = new ArrayList<>();
+        list.add(new ElementData(1,1,1));
+        test(fd);
+        System.out.println(fd.getEName());
+    }*/
+    public static void  test(FormData fd){
+        fd.setEName("22222");
+        fd.getValues().add(new ElementData(2,2,2));
+    }
+
+
     public  static void write(FormData fd, Object data,Boolean nullOrBlank ){
         if(Func.isEmpty(fd.getValues())){
             /*无定位信息不写入*/
@@ -350,7 +365,7 @@ public class FormulaUtils {
         //huangjn 每份填报数据的id,目前日志专用
     }
 
-    /**从元素名称中解析项目名称*/
+    /**从元素名称中解析项目名称,细化项目匹配用*/
     public static  String parseItemName(String eName){
         if (StringUtils.isEmpty(eName)) {
             return eName;
@@ -369,6 +384,19 @@ public class FormulaUtils {
                 .collect(Collectors.joining());
     }
 
+    /*A15检查内容专用*/
+    public static  String checkItemName(String eName){
+        if (StringUtils.isEmpty(eName)) {
+            return eName;
+        }
+        /*分割字符串,选取第一个匹配的子串*/
+        String str = eName.replaceAll("\\s", "");
+        Pattern pattern = compile("[((_]");
+        String[] candidate = pattern.split(str);
+        String regex = "[^\\u4e00-\\u9fa5]+";
+        return Arrays.stream(candidate).map(s->s.replaceAll(regex,"")).distinct().filter(StringUtils::isNotEmpty).filter(s->!isContainKeywords2(s)).findFirst().orElse("");
+    }
+
     private static String filterString(String s, Pattern p) {
         s=s.replaceAll("【[^【】]+】","");
         Matcher matcher = p.matcher(s);
@@ -383,6 +411,10 @@ public class FormulaUtils {
         List<String> keywords = Arrays.asList( ":", "个","附录","抽查","测","求","小于","大于","检查","仪","按","不","各","记录","且","规定","值或实");
         return keywords.stream().anyMatch(s::contains);
     }
+    private static boolean isContainKeywords2(String s) {
+        List<String> keywords = Arrays.asList( "实测项目");
+        return keywords.stream().anyMatch(s::contains);
+    }
 
     public static List<String> itemNames =Arrays.asList(
             ""
@@ -422,13 +454,13 @@ public class FormulaUtils {
             ,"竖直度(mm)_挖孔桩_0.5%桩长,且≤200_铅锤线:每桩检测_实测值或实测偏差值"
             , "2△_压浆压力值 (Mpa)_满足施工技术 规范规定_查油压表读书;每管道检查_实测值或实测偏差值"
             , "基底承载力(KPa)_不小于设计_实测值或实测偏差值"
+            ,"1△_受力钢筋间距 (mm)_两排以上间距_±5_实测值或实测偏差值"
     );
 
-/*
-    public static void main(String[] args) {
-        itemNames.stream().map(FormulaUtils::parseItemName).forEach(System.out::println);
-    }
-*/
+/*    public static void main(String[] args) {
+     //   itemNames.stream().map(FormulaUtils::parseItemName).forEach(System.out::println);
+        itemNames.stream().map(FormulaUtils::checkItemName).forEach(System.out::println);
+    }*/
 
     /**
      * @Description 深度拷贝

+ 44 - 8
blade-service/blade-manager/src/main/java/com/mixsmart/utils/StringUtils.java

@@ -11,12 +11,14 @@ import java.io.UnsupportedEncodingException;
 import java.lang.reflect.Field;
 import java.lang.reflect.Modifier;
 import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.text.DecimalFormat;
 import java.text.SimpleDateFormat;
 import java.util.*;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 
 /**
@@ -952,7 +954,7 @@ public class StringUtils {
         if (value instanceof Number) {
             return true;
         }
-        String pattern = "^[+-]?\\d+(\\.\\d+)?$";
+        String pattern = "^[+-]?\\d+(\\.[\\dEe]+)?$";
         Pattern r = Pattern.compile(pattern);
         Matcher m = r.matcher(String.valueOf(value));
         return m.matches();
@@ -1294,27 +1296,49 @@ public class StringUtils {
 
     /**
      * @return int
-     * @Description 获取最大小数位
+     * @Description 获取最大小数位,转String计算小数位格式,超长浮点数先转double,四舍五入取五位
      * @Param [number]
      * @Author yangyj
      * @Date 2021.12.23 15:08
      **/
+    /*去除有效数字后面的0*/
     public static Integer getScale(Object... number) {
         int max = 0;
         if (number != null) {
-            return getScale(Arrays.asList(number));
+            return getScale(scaleParam(number),1);
+        }
+        return max;
+    }
+    /*保留有效数字后面的0*/
+    public static Integer getScaleZero(Object... number){
+        int max = 0;
+        if (number != null) {
+            return getScale(scaleParam(number),0);
         }
         return max;
     }
 
-    private static Integer getScale(List<Object> number){
+    public static List<Object> scaleParam(Object ... number){
+        return Arrays.stream(number).filter(StringUtils::isNotEmpty).flatMap(e-> CustomFunction.obj2ListNe(e).stream()).distinct().filter(StringUtils::isNumber).map(e->{
+            /*0.3999999999999986 检测到超长小数位先转double处理,再还原回String*/
+            String tg=e.toString();
+            if(tg.length()-tg.indexOf(StringPool.DOT)>6||tg.contains("e")){
+                return BigDecimal.valueOf(Double.parseDouble(tg)).setScale(4, RoundingMode.HALF_UP).toString();
+            }else {
+                return e.toString();
+            }
+        }).collect(Collectors.toList());
+    }
+
+    public static final String[] SCALE_REG=new String[]{"(\\d)+.(\\d)*[0-9]","(\\d)+.(\\d)*[1-9]"};
+    private static Integer getScale(List<Object> number,Integer zero){
         int max=0;
         if(ListUtils.isNotEmpty(number)){
             for (Object n : number) {
                 if (StringUtils.isNotEmpty(n)) {
-                    String[] sa = n.toString().split(",");
+                    String[] sa = n.toString().split(StringPool.COMMA);
                     for (String s : sa) {
-                        Matcher m = RegexUtils.matcher("(\\d)+.(\\d)*[1-9]", s);
+                        Matcher m = RegexUtils.matcher(SCALE_REG[zero], s);
                         if (m.find()) {
                             int cp = new StringBuilder(m.group()).reverse().toString().indexOf(".");
                             if (cp < 5) {
@@ -1329,11 +1353,23 @@ public class StringUtils {
     }
 
 //    public static void main(String[] args) {
-//         List<Object> list = Arrays.asList("16.001",27.0,5,6);
+//        List<Double> list = new ArrayList<>();
+//        list.add(Double.parseDouble("0.3999999999999986"));
+//        list.add(Double.parseDouble("0.1999999999999996"));
+//        list.add(Double.parseDouble("-0.21"));
+//        list.add(Double.parseDouble("-1.2632e1"));
 //        System.out.println(getScale(list));
-//        System.out.println(getScale(16.00,17.00,10,8));
+//        System.out.println(getScaleZero(list));
 //    }
 
+/*    public static void main(String[] args) {
+         List<Object> list = Arrays.asList("16.001",27.0,5,6);
+        System.out.println(getScale(list));
+        System.out.println(getScaleZero(150.0));
+        System.out.println(getScale(150.0));
+
+    }*/
+
     /**
      * @return java.lang.String
      * @Description 公式脚本转义

+ 2 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ExcelTabController.java

@@ -489,6 +489,8 @@ public class ExcelTabController extends BladeController {
         Elements trs = table.select("tr");
         if(StringUtils.isNotEmpty(excelTab.getTabId())){
             updateWrapper.set("init_table_id", excelTab.getTabId());
+            org.springblade.manager.entity.TableInfo tableInfo = tableInfoService.getById(excelTab.getTabId());
+            updateWrapper.set("init_table_name", tableInfo.getTabEnName());
         }else {
             if (aPrivate.getInitTableId() == null) {
                 org.springblade.manager.entity.TableInfo tableInfo = tableInfoService.getOne(new LambdaQueryWrapper<org.springblade.manager.entity.TableInfo>()

+ 28 - 5
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/FormulaController.java

@@ -272,7 +272,7 @@ public class FormulaController {
     @GetMapping("/range")
     @ApiOperationSupport(order = 10)
     @ApiOperation(value = "自动填充数据", notes = "根据设计值、偏差范围、频率自动填充数据")
-    public R<Map<String, Object>> rangeList(RangeInfo info) throws FileNotFoundException {
+    public R<Map<String, Object>> rangeList(RangeInfo info) throws FileNotFoundException, InterruptedException {
         if (info.verify()) {
             String bak = info.getKey().replaceAll("key_\\d+__", "");
             info.setKey(info.getKey().replaceAll("__[\\d_]+", ""));
@@ -318,7 +318,31 @@ public class FormulaController {
                     data.addAll(tmpList);
                 }
             }
-            String[] dw = keymap.get(info.getKey()).split(StringPool.SEMICOLON);
+            String[] dw2 = keymap.get(info.getKey()).split(StringPool.SEMICOLON);
+            // 排序
+            String dw[] = new String[dw2.length];
+            List<String> list = Arrays.asList(dw2);
+            // 横向排序
+            int yindex;
+            int xindex;
+            if(info.getDirection().equals("2")){ //纵向
+                yindex = 1;
+                xindex = 0;
+            } else { //横向
+                xindex = 1;
+                yindex = 0;
+            }
+            Map<Integer, List<String>> collect = list.stream().filter(s -> s.indexOf("_")>=0).collect(Collectors.groupingBy(s -> Integer.parseInt(s.split("_")[yindex])));
+            int j=0;
+            for(Integer key: collect.keySet()){
+                List<String> datakey = collect.get(key);
+                List<String> ordList = datakey.stream().filter(s -> s.indexOf("_")>=0).sorted(Comparator.comparing(s -> Integer.parseInt(s.split("_")[xindex]))).collect(Collectors.toList());
+                for (String ord:ordList){
+                    dw[j]=ord;
+                    j++;
+                }
+            }
+            // 排序结束
             LinkedHashMap<String, Object> result = new LinkedHashMap<>(dw.length * 2);
             if (dw.length == 1) {
                 result.put(info.getKey() + "__" + dw[0], data.stream().filter(StringUtils::isNotEmpty).map(Func::toStr).collect(Collectors.joining("、")));
@@ -332,8 +356,6 @@ public class FormulaController {
                     }
                 }
                 if ((data.size() + start) > dw.length) {
-
-                    // String moreData = data.stream().skip(dw.length).map(StringUtils::handleNull).collect(Collectors.joining(StringPool.SEMICOLON));
                     List<Object> moreData = data.stream().skip(result.size()).map(StringUtils::handleNull).collect(Collectors.toList());
                     // 频率添加表单
                     this.wbsTreeContractService.addTabInfoByRan(info, moreData, dw);
@@ -500,7 +522,8 @@ public class FormulaController {
         List<Map<String, Object>> result = this.jdbcTemplate.queryForList(sql, tableName, "%" + search + "%");
         Map<String, Object> map = new HashMap<>();
         map.put("解析前", result.stream().map(e -> StringUtils.handleNull(e.get("en"))).collect(Collectors.toList()));
-        map.put("解析后", result.stream().map(e -> FormulaUtils.parseItemName(StringUtils.handleNull(e.get("en")))).collect(Collectors.toList()));
+        map.put("解析后A15", result.stream().map(e -> FormulaUtils.checkItemName(StringUtils.handleNull(e.get("en")))).collect(Collectors.toList()));
+        map.put("解析后通用数据", result.stream().map(e -> FormulaUtils.parseItemName(StringUtils.handleNull(e.get("en")))).collect(Collectors.toList()));
         return R.data(map);
     }
 

+ 1 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/SignPfxFileController.java

@@ -329,7 +329,7 @@ public class SignPfxFileController extends BladeController {
                     boolean remove = true;
                     //循环合同段,只要有一个合同段的人员有数据
                     for (ContractInfo contract : contracts) {
-                        List<SaveUserInfoByProjectDTO> users = this.projectAssignmentUserClient.queryContractDownAllUser(contract.getId().toString());
+                        List<SaveUserInfoByProjectDTO> users = this.projectAssignmentUserClient.queryContractDownAllUser(contract.getId().toString(), 2);
                         if (users != null && users.size() > 0) {
                             //获取人员ID
                             List<String> userList = users.stream().map(SaveUserInfoByProjectDTO::getUserId).distinct().collect(Collectors.toList());

+ 11 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsTreeController.java

@@ -445,6 +445,17 @@ public class WbsTreeController extends BladeController {
         return R.data(wbsFormElements, "未查询到元素");
     }
 
+    /**
+     * 根据节点名、表名模糊查询数据
+     */
+    @GetMapping("/getQueryValueByType")
+    @ApiOperationSupport(order = 21)
+    @ApiOperation(value = "根据节点名、表名模糊查询数据", notes = "传入queryValue、wbsId、projectId、type")
+    public Object getQueryValueByType(@RequestParam String queryValue, @RequestParam String wbsId, @RequestParam String projectId, @RequestParam String type) {
+        Object result = wbsTreeService.getQueryValueByType(queryValue, wbsId, projectId, type);
+        return R.data(result);
+    }
+
 }
 
 

+ 36 - 5
blade-service/blade-manager/src/main/java/org/springblade/manager/feign/ProjectAssignmentUserClientImpl.java

@@ -4,22 +4,53 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import lombok.AllArgsConstructor;
 import org.apache.commons.lang.StringUtils;
 import org.springblade.manager.dto.SaveUserInfoByProjectDTO;
+import org.springblade.manager.entity.ContractInfo;
+import org.springblade.manager.entity.ContractRelationJlyz;
 import org.springblade.manager.service.SaveUserInfoByProjectService;
+import org.springblade.manager.service.impl.ContractInfoServiceImpl;
+import org.springframework.jdbc.core.BeanPropertyRowMapper;
+import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.web.bind.annotation.RestController;
 
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
+import java.util.function.Function;
+import java.util.stream.Collectors;
 
 @RestController
 @AllArgsConstructor
 public class ProjectAssignmentUserClientImpl implements ProjectAssignmentUserClient {
 
+    private final JdbcTemplate jdbcTemplate;
+    private final ContractInfoServiceImpl contractInfoServiceImpl;
     private final SaveUserInfoByProjectService saveUserInfoByProjectService;
 
     @Override
-    public List<SaveUserInfoByProjectDTO> queryContractDownAllUser(String contractId) {
-        return this.saveUserInfoByProjectService.list(Wrappers.<SaveUserInfoByProjectDTO>lambdaQuery().eq(SaveUserInfoByProjectDTO::getContractId, contractId).eq(SaveUserInfoByProjectDTO::getIsDeleted, 0));
+    public List<SaveUserInfoByProjectDTO> queryContractDownAllUser(String contractId, Integer type) {
+        if (type == 1) { //type=1 表示查询施工合同段所关联的监理合同段+当前合同段
+            ContractInfo contractInfo = contractInfoServiceImpl.selectById(contractId);
+            if (contractInfo.getContractType() == 1) {
+                List<ContractRelationJlyz> query = jdbcTemplate.query("select * from m_contract_relation_jlyz where contract_id_sg =" + contractId, new BeanPropertyRowMapper<>(ContractRelationJlyz.class));
+                if (query.size() > 0) {
+                    Set<Long> contractIds = query.stream().map(ContractRelationJlyz::getContractIdJlyz).collect(Collectors.toSet());
+                    contractIds.add(Long.parseLong(contractId)); //添加当前合同段
+                    List<SaveUserInfoByProjectDTO> list = this.saveUserInfoByProjectService.list(Wrappers.<SaveUserInfoByProjectDTO>lambdaQuery().in(SaveUserInfoByProjectDTO::getContractId, contractIds).eq(SaveUserInfoByProjectDTO::getIsDeleted, 0));
+                    //根据roleId、userId去重
+                    return new ArrayList<>(list.stream()
+                            .collect(Collectors.toMap(
+                                    dto -> dto.getRoleId() + "-" + dto.getUserId(),
+                                    Function.identity(),
+                                    (dto1, dto2) -> dto1))
+                            .values());
+                }
+            } else if (contractInfo.getContractType() == 2 || contractInfo.getContractType() == 3) {
+                //如果本身就是监理合同段,那么不处理,返回本身合同段信息
+                return this.saveUserInfoByProjectService.list(Wrappers.<SaveUserInfoByProjectDTO>lambdaQuery().eq(SaveUserInfoByProjectDTO::getContractId, contractId).eq(SaveUserInfoByProjectDTO::getIsDeleted, 0));
+            }
+        }
+        if (type == 2) { //type=2 不处理,单合同段
+            return this.saveUserInfoByProjectService.list(Wrappers.<SaveUserInfoByProjectDTO>lambdaQuery().eq(SaveUserInfoByProjectDTO::getContractId, contractId).eq(SaveUserInfoByProjectDTO::getIsDeleted, 0));
+        }
+        return new ArrayList<>();
     }
 
     @Override

+ 2 - 2
blade-service/blade-manager/src/main/java/org/springblade/manager/feign/WbsTreeContractClientImpl.java

@@ -420,8 +420,8 @@ public class WbsTreeContractClientImpl implements WbsTreeContractClient {
     }
 
     @Override
-    public List<AppWbsTreeContractVO> searchNodeAllTableInfo(String primaryKeyId, String type, String contractId, String projectId) {
-        List<AppWbsTreeContractVO> list = wbsTreeContractService.searchNodeAllTable(primaryKeyId, type, contractId, projectId);
+    public List<AppWbsTreeContractVO> searchNodeAllTableInfo(String primaryKeyId, String type, String contractId, String projectId,Long userId) {
+        List<AppWbsTreeContractVO> list = wbsTreeContractService.searchNodeAllTable(primaryKeyId+":"+userId, type, contractId, projectId);
         return list;
     }
 

+ 1 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/formula/impl/FormulaTurnPoint.java

@@ -172,6 +172,7 @@ public class FormulaTurnPoint implements FormulaStrategy {
                 for(int i=0;i<fda.length;i++){
                     FormData fd= fda[i];
                     FormulaUtils.write(fd,group.get(i),true);
+                    fd.setUpdate(1);
                 }
             }
         });

+ 1 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/service/IWbsTreeContractService.java

@@ -55,7 +55,7 @@ public interface IWbsTreeContractService extends BaseService<WbsTreeContract> {
     List<WbsContractNodeVo> appSearchConcealedNodes(long primaryKeyId, Long contractId);
 
     // 频率设计值  添加表单
-    boolean addTabInfoByRan(RangeInfo info, List<Object> moreData, String[] excLenght) throws FileNotFoundException;
+    boolean addTabInfoByRan(RangeInfo info, List<Object> moreData, String[] excLenght) throws FileNotFoundException, InterruptedException;
 
     boolean syncTabData(String pKeyId) throws Exception;
 

+ 2 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/IWbsTreeService.java

@@ -78,4 +78,6 @@ public interface IWbsTreeService extends BaseService<WbsTree> {
 
     boolean syncNodeInfo(Long pKeyId);
 
+    Object getQueryValueByType(String queryValue, String wbsId, String projectId, String type);
+
 }

+ 23 - 12
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ExcelTabServiceImpl.java

@@ -12,6 +12,7 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.mixsmart.utils.FormulaUtils;
 import com.mixsmart.utils.ListUtils;
 import com.mixsmart.utils.RegexUtils;
+import com.spire.xls.FileFormat;
 import lombok.AllArgsConstructor;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.lang.StringUtils;
@@ -1329,7 +1330,7 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
 
         //获取excel流 和 html流
         InputStream exceInp = CommonUtil.getOSSInputStream(excelTab.getFileUrl());
-        org.apache.poi.ss.usermodel.Workbook workbook = WorkbookFactory.create(exceInp);
+        Workbook workbook = WorkbookFactory.create(exceInp);
 
         //获取工作表
         Sheet sheet = workbook.getSheetAt(0);
@@ -1377,9 +1378,7 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
             }
         }
 
-        if(pkeyId == 1644218999589830668L){
-          //  System.out.println("12321");
-        }
+
         //数据不为空
         if (StringUtils.isNotEmpty(wbsTreeContract.getHtmlUrl())) {
             InputStream inputStreamByUrl = FileUtils.getInputStreamByUrl(wbsTreeContract.getHtmlUrl());
@@ -1395,7 +1394,7 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                     Elements datas = doc.getElementsByAttributeValue("keyname", val);
                     Element data = null;
                     if(val.equals("key_12__25_0")){
-                        //System.out.println("1231");
+                        System.out.println("1231");
                     }
                     if (datas.size() >= 1) {
                         data = datas.get(0);
@@ -1491,9 +1490,10 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                                             if(StringUtils.isNotEmpty(dataJson)){
                                                 JSONArray jsonArray = JSONArray.parseArray(dataJson);
                                                 List<Integer> idList = Func.toIntList(myData);
-                                                String dataInfo = jsonArray.getJSONObject(idList.get(0)).getString("name");
+                                                String dataInfo = jsonArray.getJSONObject(idList.get(0)-1).getString("name");
                                                 for(int inx=1 ; inx<idList.size() ; inx++){
-                                                    dataInfo = dataInfo+","+jsonArray.getJSONObject(inx).getString("name");
+                                                   int valIndex = idList.get(inx)-1;
+                                                    dataInfo = dataInfo+","+jsonArray.getJSONObject(valIndex).getString("name");
                                                 }
                                                 cell.setCellValue(dataInfo);
                                             }
@@ -1513,7 +1513,9 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                     }
                 }
             }
-
+            if(pkeyId == 1688448159421825025L){
+                System.out.println("12321");
+            }
             // 组装电签设置
             QueryWrapper<TextdictInfo> queryWrapper = new QueryWrapper<>();
             queryWrapper.in("type", 2, 6);
@@ -1544,6 +1546,7 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
 
                                 Row row = sheet.getRow(y1 - 1);
                                 if (row != null) {
+
                                     Cell cell = sheet.getRow(y1 - 1).getCell(x1 - 1);
                                     if (cell != null || ObjectUtils.isNotEmpty(cell)) {
                                         short fontIndex = cell.getCellStyle().getFontIndex();
@@ -1571,9 +1574,17 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
 
         FileOutputStream outputStream = new FileOutputStream(excelPath);
         workbook.write(outputStream);
-        FileUtils.setExcelScaleToPdf(excelPath, pdfPath);
 
-        BladeFile bladeFile = newIOSSClient.uploadFile(pkeyId + ".pdf", pdfPath);
+        com.spire.xls.Workbook workbook2 = new com.spire.xls.Workbook();
+        workbook2.loadFromFile(excelPath);
+
+        //设置转换后的PDF页面高宽适应工作表的内容大小
+        workbook2.getConverterSetting().setSheetFitToPage(true);
+        workbook2.getConverterSetting().setSheetFitToWidth(true);
+        workbook2.saveToFile(pdfPath, FileFormat.PDF);
+      //  FileUtils.setExcelScaleToPdf(excelPath, pdfPath);
+
+/*        BladeFile bladeFile = newIOSSClient.uploadFile(pkeyId + ".pdf", pdfPath);
 
         //附件
         TableFile tableFile1 = tableFileService.getBaseMapper().selectList(Wrappers.<TableFile>query().lambda().eq(TableFile::getTabId, pkeyId + "").eq(TableFile::getType, 1)).stream().findAny().orElse(null);
@@ -1619,8 +1630,8 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
         if (exceInp != null) {
             IoUtil.closeQuietly(exceInp);
         }
-         return R.data(bladeFile2.getLink());
-
+         return R.data(bladeFile2.getLink());*/
+        return R.data("");
     }
 
     @Override

+ 2 - 2
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaServiceImpl.java

@@ -983,7 +983,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
         try{
             if(tec.summary.size()>0){
                 /**/
-                List<String> result=tec.checkItems.stream().filter(fdTmp->fdTmp.getValues().stream().map(ElementData::getValue).anyMatch(e->StringUtils.isNotEmpty(e)&&StringUtils.isNotEquals("/",e))).map(FormData::getEName).map(FormulaUtils::parseItemName).distinct().collect(Collectors.toList());
+                List<String> result=tec.checkItems.stream().filter(fdTmp->fdTmp.getValues().stream().map(ElementData::getValue).anyMatch(e->StringUtils.isNotEmpty(e)&&StringUtils.isNotEquals("/",e))).map(FormData::getEName).map(FormulaUtils::checkItemName).distinct().collect(Collectors.toList());
                 Optional<FormData> opk= tec.summary.stream().filter(FormData::executable).filter(f->StringUtils.isEquals(f.getFormula().getNumber(),CHECK_ITEMS)).findAny();
                 List<String> history=null;
                 if(opk.isPresent()&&!opk.get().empty()){
@@ -991,7 +991,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                     history=  Arrays.asList(opk.get().getValues().get(0).stringValue().replaceAll("[\\s\\n]+","").split("[,、,]"));
                 }
                 if(history!=null&&history.size()>0){
-                    List<String> itemAll=tec.checkItems.stream().map(FormData::getEName).map(FormulaUtils::parseItemName).distinct().collect(Collectors.toList());
+                    List<String> itemAll=tec.checkItems.stream().map(FormData::getEName).map(FormulaUtils::checkItemName).distinct().collect(Collectors.toList());
                     List<String> customize=history.stream().filter(s->!itemAll.contains(s)).collect(Collectors.toList());
                     result.addAll(customize);
                 }

+ 20 - 3
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeContractServiceImpl.java

@@ -1,5 +1,6 @@
 package org.springblade.manager.service.impl;
 
+import cn.hutool.core.swing.ScreenUtil;
 import cn.hutool.core.util.ObjectUtil;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
@@ -25,6 +26,7 @@ import org.springblade.common.utils.SnowFlakeUtil;
 import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.mp.base.BaseServiceImpl;
 import org.springblade.core.secure.utils.AuthUtil;
+import org.springblade.core.secure.utils.SecureUtil;
 import org.springblade.core.tool.node.ForestNodeMerger;
 import org.springblade.core.tool.utils.*;
 import org.springblade.manager.dto.RangeInfo;
@@ -411,6 +413,19 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
 
     @Override
     public List<AppWbsTreeContractVO> searchNodeAllTable(String primaryKeyId, String tableOwner, String contractId, String projectId) {
+
+        //由于fegin 调用时,获取不到UserId
+        Long userId =-1L;
+        if(primaryKeyId.indexOf(":")>=0){
+            String ds[] = primaryKeyId.split(":");
+            primaryKeyId = ds[0];
+            userId = Long.parseLong(ds[1]);
+            if(userId == -1L){
+                userId =  AuthUtil.getUserId();
+            }
+        }else{
+            userId = AuthUtil.getUserId();
+        }
         WbsTreeContract wbsTreeContract = baseMapper.selectOne(Wrappers.<WbsTreeContract>query().lambda()
                 .eq(WbsTreeContract::getPKeyId, primaryKeyId));
         if (wbsTreeContract == null) {
@@ -418,9 +433,9 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
         }
 
         //当前项目合同段只会存在一个角色roleId
-        SaveUserInfoByProject userInfo = baseMapper.selectRoleInfo(AuthUtil.getUserId(), contractId, projectId);
+        SaveUserInfoByProject userInfo = baseMapper.selectRoleInfo(userId, contractId, projectId);
         if (userInfo == null) {
-            throw new ServiceException("请先分配当前用户对该合同段的角色信息");
+            throw new ServiceException("请先分配当前用户对该合同段的角色信息="+ SecureUtil.getUserId());
         }
         String roleId = userInfo.getRoleId();
 
@@ -462,7 +477,7 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
 
     // 频率添加表单
     @Override
-    public boolean addTabInfoByRan(RangeInfo info, List<Object> moreData, String[] excLenght) {
+    public boolean addTabInfoByRan(RangeInfo info, List<Object> moreData, String[] excLenght) throws InterruptedException {
         WbsTreeContract wbsInfo = this.baseMapper.selectOne(Wrappers.<WbsTreeContract>query().lambda()
                 .eq(WbsTreeContract::getPKeyId, info.getPkId()));
 
@@ -535,8 +550,10 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
                 WbsTreeContract wbsTreeContract = new WbsTreeContract();
                 BeanUtil.copy(wbsInfo, wbsTreeContract);
                 wbsTreeContract.setPKeyId(newPkId);
+                Thread.sleep(1000);
                 wbsTreeContract.setCreateTime(new Date());
                 wbsTreeContract.setTabGroupId(tabGroupId);
+                wbsTreeContract.setSort(wbsInfo.getSort());
                 String nodeName = wbsTreeContractList2.get(wbsTreeContractList2.size() - 1).getNodeName();
 
                 if (nodeName.indexOf("_PL_") >= 0) {

+ 116 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeServiceImpl.java

@@ -405,6 +405,122 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
         return true;
     }
 
+    @Override
+    public Object getQueryValueByType(String queryValue, String wbsId, String projectId, String type) {
+        if (StringUtils.isNotEmpty(queryValue)) {
+            if (("1").equals(type)) {//节点
+                if (ObjectUtil.isEmpty(projectId)) {//公有
+                    Set<WbsTree> resultNodes = new HashSet<>();
+                    List<WbsTree> wbsTrees = baseMapper.selectList(Wrappers.<WbsTree>lambdaQuery().eq(WbsTree::getType, 1).eq(WbsTree::getWbsId, wbsId).like(WbsTree::getNodeName, queryValue));
+                    this.getParentNodesPublicWbs(wbsTrees, resultNodes);
+                    resultNodes.addAll(wbsTrees);
+                    List<WbsTreeQueryValueVO> wbsTreeQueryValueVOS = BeanUtil.copyProperties(resultNodes, WbsTreeQueryValueVO.class);
+                    if (wbsTreeQueryValueVOS.size() > 0) {
+                        List<WbsTreeQueryValueVO> listRoot = wbsTreeQueryValueVOS.stream().filter(f -> f.getParentId() == 0L).collect(Collectors.toList());
+                        Map<Long, List<WbsTreeQueryValueVO>> mapAll = wbsTreeQueryValueVOS.stream().collect(Collectors.groupingBy(WbsTreeQueryValueVO::getParentId));
+                        this.buildWbsTreeByGetQueryValueByType(listRoot, mapAll);
+                        return listRoot;
+                    }
+                } else {//私有
+                    Set<WbsTreePrivate> resultNodes = new HashSet<>();
+                    List<WbsTreePrivate> wbsTreePrivates = wbsTreePrivateMapper.selectList(Wrappers.<WbsTreePrivate>lambdaQuery().eq(WbsTreePrivate::getType, 1).eq(WbsTreePrivate::getWbsId, wbsId).eq(WbsTreePrivate::getProjectId, projectId).like(WbsTreePrivate::getNodeName, queryValue));
+                    this.getParentNodesPrivateWbs(wbsTreePrivates, resultNodes, projectId, wbsId);
+                    resultNodes.addAll(wbsTreePrivates);
+                    List<WbsTreePrivateQueryValueVO> wbsTreePrivateQueryValueVOS = BeanUtil.copyProperties(resultNodes, WbsTreePrivateQueryValueVO.class);
+                    if (wbsTreePrivateQueryValueVOS.size() > 0) {
+                        List<WbsTreePrivateQueryValueVO> listRoot = wbsTreePrivateQueryValueVOS.stream().filter(f -> f.getParentId() == 0L).collect(Collectors.toList());
+                        Map<Long, List<WbsTreePrivateQueryValueVO>> mapAll = wbsTreePrivateQueryValueVOS.stream().collect(Collectors.groupingBy(WbsTreePrivateQueryValueVO::getParentId));
+                        this.buildWbsTreePrivateByGetQueryValueByType(listRoot, mapAll);
+                        return listRoot;
+                    }
+                }
+            } else if (("2").equals(type)) {//表
+                if (ObjectUtil.isEmpty(projectId)) {//公有
+                    Set<WbsTree> resultNodes = new HashSet<>();
+                    List<WbsTree> wbsTreesTab = baseMapper.selectList(Wrappers.<WbsTree>lambdaQuery().eq(WbsTree::getType, 2).eq(WbsTree::getWbsId, wbsId).like(WbsTree::getNodeName, queryValue));
+                    this.getParentNodesPublicWbs(wbsTreesTab, resultNodes);
+                    resultNodes.addAll(wbsTreesTab);
+                    List<WbsTreeQueryValueVO> wbsTreeQueryValueVOS = BeanUtil.copyProperties(resultNodes, WbsTreeQueryValueVO.class);
+                    if (wbsTreeQueryValueVOS.size() > 0) {
+                        List<WbsTreeQueryValueVO> listRoot = wbsTreeQueryValueVOS.stream().filter(f -> f.getParentId() == 0L).collect(Collectors.toList());
+                        Map<Long, List<WbsTreeQueryValueVO>> mapAll = wbsTreeQueryValueVOS.stream().collect(Collectors.groupingBy(WbsTreeQueryValueVO::getParentId));
+                        this.buildWbsTreeByGetQueryValueByType(listRoot, mapAll);
+                        return listRoot;
+                    }
+                } else {//私有
+                    Set<WbsTreePrivate> resultNodes = new HashSet<>();
+                    List<WbsTreePrivate> wbsTreePrivatesTab = wbsTreePrivateMapper.selectList(Wrappers.<WbsTreePrivate>lambdaQuery().eq(WbsTreePrivate::getType, 2).eq(WbsTreePrivate::getWbsId, wbsId).eq(WbsTreePrivate::getProjectId, projectId).like(WbsTreePrivate::getNodeName, queryValue));
+                    this.getParentNodesPrivateWbs(wbsTreePrivatesTab, resultNodes, projectId, wbsId);
+                    resultNodes.addAll(wbsTreePrivatesTab);
+                    List<WbsTreePrivateQueryValueVO> wbsTreePrivateQueryValueVOS = BeanUtil.copyProperties(resultNodes, WbsTreePrivateQueryValueVO.class);
+                    if (wbsTreePrivateQueryValueVOS.size() > 0) {
+                        List<WbsTreePrivateQueryValueVO> listRoot = wbsTreePrivateQueryValueVOS.stream().filter(f -> f.getParentId() == 0L).collect(Collectors.toList());
+                        Map<Long, List<WbsTreePrivateQueryValueVO>> mapAll = wbsTreePrivateQueryValueVOS.stream().collect(Collectors.groupingBy(WbsTreePrivateQueryValueVO::getParentId));
+                        this.buildWbsTreePrivateByGetQueryValueByType(listRoot, mapAll);
+                        return listRoot;
+                    }
+                }
+            }
+        }
+        return null;
+    }
+
+    /**
+     * 公有树构造,获取所有父级节点
+     */
+    private void getParentNodesPublicWbs(List<WbsTree> wbsTrees, Set<WbsTree> resultNodes) {
+        Set<Long> parentIds = wbsTrees.stream().map(WbsTree::getParentId).collect(Collectors.toSet());
+        if (parentIds.size() > 0) {
+            List<WbsTree> parentNodes = baseMapper.selectList(Wrappers.<WbsTree>lambdaQuery().in(WbsTree::getId, parentIds));
+            if (parentNodes.size() > 0) {
+                resultNodes.addAll(parentNodes);
+                this.getParentNodesPublicWbs(parentNodes, resultNodes);
+            }
+        }
+    }
+
+    private void buildWbsTreeByGetQueryValueByType(List<WbsTreeQueryValueVO> listRoot, Map<Long, List<WbsTreeQueryValueVO>> mapAll) {
+        for (WbsTreeQueryValueVO wbsTree : listRoot) {
+            List<WbsTreeQueryValueVO> childrenList = mapAll.get(wbsTree.getId());
+            if (childrenList != null && childrenList.size() > 0) {
+                wbsTree.setChildren(childrenList);
+                wbsTree.setHasChildren(true);
+                this.buildWbsTreeByGetQueryValueByType(childrenList, mapAll);
+            }
+        }
+    }
+
+    /**
+     * 私有树构造,获取所有父级节点
+     */
+    private void getParentNodesPrivateWbs(List<WbsTreePrivate> wbsTreePrivates, Set<WbsTreePrivate> resultNodes, String projectId, String wbsId) {
+        Set<Long> parentIds = wbsTreePrivates.stream().map(WbsTreePrivate::getParentId).collect(Collectors.toSet());
+        if (parentIds.size() > 0) {
+            List<WbsTreePrivate> parentNodes = wbsTreePrivateMapper.selectList(Wrappers.<WbsTreePrivate>lambdaQuery().in(WbsTreePrivate::getId, parentIds).eq(WbsTreePrivate::getType, 1).eq(WbsTreePrivate::getWbsId, wbsId).eq(WbsTreePrivate::getProjectId, projectId));
+            if (parentNodes.size() > 0) {
+                resultNodes.addAll(parentNodes);
+                this.getParentNodesPrivateWbs(parentNodes, resultNodes, projectId, wbsId);
+            }
+        }
+    }
+
+    private void buildWbsTreePrivateByGetQueryValueByType(List<WbsTreePrivateQueryValueVO> listRoot, Map<Long, List<WbsTreePrivateQueryValueVO>> mapAll) {
+        for (WbsTreePrivateQueryValueVO wbsTree : listRoot) {
+            List<WbsTreePrivateQueryValueVO> childrenList = mapAll.get(wbsTree.getId());
+            wbsTree.setChildren(childrenList);
+            if (childrenList != null && childrenList.size() > 0) {
+                wbsTree.setHasChildren(true);
+                this.buildWbsTreePrivateByGetQueryValueByType(childrenList, mapAll);
+            }
+        }
+    }
+
+    /**
+     * 获取现在项目的子级节点
+     *
+     * @param obj
+     * @return
+     */
     private List<WbsTreePrivate> getChildNodesAllNowProject(WbsTreePrivate obj) {
         List<WbsTreePrivate> childNodesAllNowProject = this.getChildNodes(obj);
         if (childNodesAllNowProject == null) {

+ 27 - 6
blade-service/blade-manager/src/main/java/org/springblade/manager/utils/FileUtils.java

@@ -305,6 +305,12 @@ public class FileUtils {
         }
     }
 
+    public static void main11(String[] args) {
+        String excelPath="/Users/hongchuangyanfa/Downloads/A11 施工放样报验单 (1).xlsx";
+        String pdfPath="/Users/hongchuangyanfa/Downloads/A11 施工放样报验单 (1).pdf";
+
+        FileUtils.setExcelScaleToPdf(excelPath, pdfPath);
+    }
 
     /**
      * excel设置 打印缩放比例
@@ -329,14 +335,29 @@ public class FileUtils {
             for (int i = 0; i < workbook.getNumberOfSheets(); i++) {//获取每个Sheet表
                 XSSFSheet sheet = workbook.getSheetAt(i);
                 //打印设置
-                XSSFPrintSetup print = sheet.getPrintSetup();
-                // print.setLandscape(true); // 打印方向,true:横向,false:纵向(默认)
-                //   print.setFitHeight((short)0);//设置高度为自动分页
+                XSSFPrintSetup printSetup = sheet.getPrintSetup();
+                /*print.setLandscape(false); // 打印方向,true:横向,false:纵向(默认)
+                print.setFitHeight((short)0);//设置高度为自动分页
                 print.setFitWidth((short) 1);//设置宽度为一页
-                print.setPaperSize(HSSFPrintSetup.A4_PAPERSIZE); //纸张类型
-//                print.setScale((short)55);//自定义缩放①,此处100为无缩放
+                print.setPaperSize(HSSFPrintSetup.A4_EXTRA_PAPERSIZE); //纸张类型
+                print.setScale((short)100);//自定义缩放①,此处100为无缩放
                 //启用“适合页面”打印选项的标志
-                sheet.setFitToPage(true);
+                sheet.setFitToPage(true);*/
+
+                sheet.setHorizontallyCenter(true);//设置打印页面为水平居中
+                sheet.setVerticallyCenter(true);
+                sheet.setAutobreaks(true);
+               // printSetup.setLandscape(false);
+                sheet.setMargin(XSSFSheet.BottomMargin, (double) 0.1);// 页边距(下)
+                sheet.setMargin(XSSFSheet.LeftMargin, (double) 0.7);// 页边距(左)
+                sheet.setMargin(XSSFSheet.RightMargin, (double) 0.7);// 页边距(右)
+                sheet.setMargin(XSSFSheet.TopMargin, (double) 0.1);// 页边距(上)
+                printSetup.setScale((short) 100);//自定义缩放①,此处100为无缩放
+                System.out.print(sheet.getAutobreaks());
+                printSetup.setPaperSize(HSSFPrintSetup.A4_PAPERSIZE);
+              //  printSetup.setFitHeight((short) 1);//设置高度为自动分页
+               // printSetup.setFitWidth((short) 1);//设置宽度为一页
+               // sheet.setFitToPage(true);
             }
             // Excel文件生成后存储的位置。
             outReport = new ByteArrayOutputStream();

+ 17 - 0
blade-service/blade-system/src/main/java/org/springblade/system/controller/DeptController.java

@@ -209,5 +209,22 @@ public class DeptController extends BladeController {
     }
 
 
+    /**
+     * 获取所有部门
+     */
+    @GetMapping("/listAllByType")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "deptName", value = "部门名称", paramType = "query", dataType = "string"),
+            @ApiImplicitParam(name = "fullName", value = "部门全称", paramType = "query", dataType = "string"),
+            @ApiImplicitParam(name = "deptType", value = "部门类型", paramType = "query", dataType = "string")
+    })
+    @ApiOperationSupport(order = 11)
+    @ApiOperation(value = "列表", notes = "传入dept")
+    public R<List<DeptVO>> listAllByType(@ApiIgnore @RequestParam Map<String, Object> dept, BladeUser bladeUser) {
+
+        List<DeptVO> list = deptService.listAllByType(bladeUser.getTenantId(),dept.get("deptType")+"" );
+
+        return R.data(list);
+    }
 
 }

+ 3 - 0
blade-service/blade-system/src/main/java/org/springblade/system/mapper/DeptMapper.java

@@ -73,4 +73,7 @@ public interface DeptMapper extends BaseMapper<Dept> {
      * @return
      */
     List<DeptVO> getUserDeptTreeInfo(String tenantId,String deptType);
+
+    //获取所有部门信息
+    List<DeptVO> listAllByType(String tenantId,String deptType);
 }

+ 24 - 0
blade-service/blade-system/src/main/java/org/springblade/system/mapper/DeptMapper.xml

@@ -28,6 +28,7 @@
         <result column="is_deleted" property="isDeleted"/>
         <result column="dept_type" property="deptType"/>
         <result column="has_children" property="hasChildren"/>
+        <result column="minLevel" property="minLevel"/>
     </resultMap>
 
     <resultMap id="treeNodeResultMap" type="org.springblade.manager.vo.TreeNodeVO">
@@ -132,4 +133,27 @@
         </if>
         --ORDER BY sort
     </select>
+
+
+    <select id="listAllByType" resultMap="deptVOResultMap">
+        select *,
+        (
+        SELECT
+        CASE WHEN count(1) > 0 THEN 0 ELSE 1 END
+        FROM
+        blade_view_postuser
+        WHERE
+        parent_id = a.id
+        and tenant_id = #{param1}
+        and dept_type = #{param2}
+        ) AS "minLevel"
+        from  blade_view_postuser a where 1=1
+        <if test="param1!=null and param1!=''">
+            and tenant_id = #{param1}
+        </if>
+        <if test="param2!=null and param2!=''">
+            and dept_type = #{param2}
+        </if>
+        --ORDER BY sort
+    </select>
 </mapper>

+ 4 - 0
blade-service/blade-system/src/main/java/org/springblade/system/service/IDeptService.java

@@ -117,4 +117,8 @@ public interface IDeptService extends IService<Dept> {
     List<DeptVO> search(String deptName, Long parentId);
 
     List<DeptVO> getUserDeptTreeInfo(String tenantId,String deptType);
+
+    List<DeptVO> listAllByType(String tenantId,String deptType);
+
+
 }

+ 11 - 1
blade-service/blade-system/src/main/java/org/springblade/system/service/impl/DeptServiceImpl.java

@@ -180,7 +180,17 @@ public class DeptServiceImpl extends ServiceImpl<DeptMapper, Dept> implements ID
 
     @Override
     public List<DeptVO> getUserDeptTreeInfo(String tenantId,String deptType) {
-        return ForestNodeMerger.merge(baseMapper.getUserDeptTreeInfo(tenantId,deptType));
+        if(deptType.equals("-1")){
+            deptType="";
+            return ForestNodeMerger.merge(baseMapper.getUserDeptTreeInfo(tenantId,deptType));
+        }else{
+            return baseMapper.getUserDeptTreeInfo(tenantId,deptType);
+        }
+    }
+
+    @Override
+    public List<DeptVO> listAllByType(String tenantId, String deptType) {
+        return baseMapper.listAllByType(tenantId,deptType);
     }
 
 }

+ 1 - 1
blade-service/blade-user/src/main/java/org/springblade/system/user/service/impl/UserServiceImpl.java

@@ -269,7 +269,7 @@ public class UserServiceImpl extends BaseServiceImpl<UserMapper, User> implement
     public boolean updateUserInfo(User user) {
 
         // 当为内控是 可以修改密码
-        if(user.getUserType().equals("5") && StringUtil.isNotBlank(user.getPassword())){
+        if( StringUtils.isNotEmpty(user.getUserType()) && user.getUserType().equals("5") && StringUtil.isNotBlank(user.getPassword())){
             user.setPassword(DigestUtil.encrypt(user.getPassword()));
         }else{
             user.setPassword(null);

Vissa filer visades inte eftersom för många filer har ändrats