Przeglądaj źródła

Merge remote-tracking branch 'origin/master'

liuyc 2 lat temu
rodzic
commit
0a6b24cb2e
44 zmienionych plików z 673 dodań i 40 usunięć
  1. 1 1
      blade-common/src/main/java/org/springblade/common/constant/LauncherConstant.java
  2. 2 2
      blade-common/src/main/java/org/springblade/common/utils/CommonUtil.java
  3. 1 0
      blade-ops/blade-resource/src/main/java/org/springblade/resource/endpoint/LargeFileEndpoint.java
  4. 5 0
      blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/vo/ArchivesAutoVO.java
  5. 1 1
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/entity/CorporationInfo.java
  6. 48 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/BudgetAndPracticalByDeptVO.java
  7. 36 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/BudgetAndPracticalByMonthVO.java
  8. 2 1
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/UserFilesInfoVO.java
  9. 8 0
      blade-service-api/blade-user-api/src/main/java/org/springblade/system/user/feign/IUserClient.java
  10. 6 3
      blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchivesAutoController.java
  11. 2 2
      blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchivesAutoMapper.xml
  12. 1 1
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchivesAutoServiceImpl.java
  13. 65 1
      blade-service/blade-business/src/main/java/org/springblade/business/controller/MileageController.java
  14. 20 0
      blade-service/blade-control/src/main/java/org/springblade/control/controller/AnnualBudgetController.java
  15. 5 2
      blade-service/blade-control/src/main/java/org/springblade/control/controller/CorporationInfoController.java
  16. 13 0
      blade-service/blade-control/src/main/java/org/springblade/control/controller/DictInfoController.java
  17. 55 1
      blade-service/blade-control/src/main/java/org/springblade/control/controller/UserContractInfoController.java
  18. 22 2
      blade-service/blade-control/src/main/java/org/springblade/control/controller/UserFilesInfoController.java
  19. 2 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/ContractReturnedInfoMapper.java
  20. 8 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/ContractReturnedInfoMapper.xml
  21. 2 4
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/CorporationInfoMapper.xml
  22. 2 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/ProjectCostBudgetMapper.java
  23. 10 3
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/ProjectCostBudgetMapper.xml
  24. 1 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/ProjectInfoMapper.java
  25. 0 1
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/ProjectInfoMapper.xml
  26. 3 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/UserContractInfoMapper.xml
  27. 5 2
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/UserFilesInfoMapper.xml
  28. 4 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/IAnnualBudgetService.java
  29. 4 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/IContractReturnedInfoService.java
  30. 10 2
      blade-service/blade-control/src/main/java/org/springblade/control/service/IProjectCostBudgetService.java
  31. 1 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/IProjectInfoService.java
  32. 132 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/AnnualBudgetServiceImpl.java
  33. 42 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/ContractReturnedInfoServiceImpl.java
  34. 79 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/ProjectCostBudgetServiceImpl.java
  35. 30 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/ProjectInfoServiceImpl.java
  36. 1 1
      blade-service/blade-desk/src/main/java/org/springblade/desk/controller/LeaveController.java
  37. 1 1
      blade-service/blade-desk/src/main/java/org/springblade/desk/mapper/NoticeMapper.xml
  38. 23 5
      blade-service/blade-manager/src/main/java/com/mixsmart/utils/CustomFunction.java
  39. 5 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ArchiveTreeContractController.java
  40. 0 2
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/FormulaController.java
  41. 1 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsParamController.java
  42. 1 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaServiceImpl.java
  43. 6 0
      blade-service/blade-user/src/main/java/org/springblade/system/user/feign/UserClient.java
  44. 7 1
      blade-service/blade-user/src/main/java/org/springblade/system/user/service/impl/UserServiceImpl.java

+ 1 - 1
blade-common/src/main/java/org/springblade/common/constant/LauncherConstant.java

@@ -46,7 +46,7 @@ public interface LauncherConstant {
     String APPLICATION_XXLJOB_ADMIN_NAME = APPLICATION_NAME_PREFIX + "xxljob-admin";
 
     /**
-     * nacos dev 地址 172.31.222.127   192.168.0.109 127.0.0.1
+     * nacos dev 地址 172.31.222.127   192.168.0.109     127.0.0.1
      */
     String NACOS_DEV_ADDR = "127.0.0.1:8848";
 

+ 2 - 2
blade-common/src/main/java/org/springblade/common/utils/CommonUtil.java

@@ -504,7 +504,7 @@ public class CommonUtil {
     }
 
     public static String replaceOssUrl(String url) {
-        String osName = System.getProperty("os.name");
+       /* String osName = System.getProperty("os.name");
         if (osName != null && osName.toLowerCase().contains("linux")) {
             // 如果当前操作系统是Linux系统
             Map<String, String> envMap = System.getenv();
@@ -514,7 +514,7 @@ public class CommonUtil {
             }
         }
         //后续删除
-        System.out.println("replaceOssUrl " + url);
+        System.out.println("replaceOssUrl " + url);*/
         return url;
     }
 

+ 1 - 0
blade-ops/blade-resource/src/main/java/org/springblade/resource/endpoint/LargeFileEndpoint.java

@@ -519,6 +519,7 @@ public class LargeFileEndpoint {
                 }
             }
         } catch (IOException e) {
+
         } finally {
             try {
                 if (fileInputStream != null) {

+ 5 - 0
blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/vo/ArchivesAutoVO.java

@@ -143,6 +143,11 @@ public class ArchivesAutoVO extends ArchivesAuto {
 	 */
 	private Integer cabinetNumber;
 
+	/**
+	 * 柜子内案卷侧面名称
+	 */
+	private String sideNumber;
+
 	/**
 	 * 案卷在柜子里的状态
 	 */

+ 1 - 1
blade-service-api/blade-control-api/src/main/java/org/springblade/control/entity/CorporationInfo.java

@@ -42,7 +42,7 @@ public class CorporationInfo extends BaseEntity {
      * 制度pdf地址
      */
     @ApiModelProperty(value = "制度pdf地址")
-    private String link;
+    private String linkUrl;
     /**
      * 制度域名
      */

+ 48 - 0
blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/BudgetAndPracticalByDeptVO.java

@@ -0,0 +1,48 @@
+package org.springblade.control.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * @Param
+ * @Author wangwl
+ * @Date 2023/7/24 14:22
+ **/
+@Data
+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;
+}

+ 36 - 0
blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/BudgetAndPracticalByMonthVO.java

@@ -0,0 +1,36 @@
+package org.springblade.control.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * @Param
+ * @Author wangwl
+ * @Date 2023/7/24 14:22
+ **/
+@Data
+public class BudgetAndPracticalByMonthVO {
+
+    @ApiModelProperty(value = "时间")
+    private String time;
+
+    @ApiModelProperty(value = "年初每月收入")
+    private BigDecimal income1;
+
+    @ApiModelProperty(value = "年初每月支出")
+    private BigDecimal disburse1;
+
+    @ApiModelProperty(value = "每月计划收入")
+    private BigDecimal income2;
+
+    @ApiModelProperty(value = "每月计划支出")
+    private BigDecimal disburse2;
+
+    @ApiModelProperty(value = "实际每月收入")
+    private BigDecimal income3;
+
+    @ApiModelProperty(value = "实际每月支出")
+    private BigDecimal disburse3;
+}

+ 2 - 1
blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/UserFilesInfoVO.java

@@ -22,6 +22,7 @@ import lombok.Data;
 import lombok.EqualsAndHashCode;
 
 import java.time.LocalDate;
+import java.util.Date;
 
 /**
  * 档案职工信息表视图实体类
@@ -44,7 +45,7 @@ public class UserFilesInfoVO extends UserFilesInfo {
 	private String carName;
 
 	@ApiModelProperty(value = "性别")
-	private String sex;
+	private Integer sex;
 
 	@ApiModelProperty(value = "性别中文")
 	private String sexName;

+ 8 - 0
blade-service-api/blade-user-api/src/main/java/org/springblade/system/user/feign/IUserClient.java

@@ -59,6 +59,9 @@ public interface IUserClient {
     String USER_INFO_ALL = API_PREFIX + "/get-users-all";
     String USER_LIST_INFO_BY_IDS = API_PREFIX + "/getUserListByIds";
 
+    // 用户修改
+    String UPDATE_USER_INFO = API_PREFIX + "/updateUserInfo";
+
     /**
      * 获取所有有效用户
      */
@@ -124,6 +127,9 @@ public interface IUserClient {
     @PostMapping(SAVE_USER)
     R<Boolean> saveUser(@RequestBody User user);
 
+    @PostMapping(UPDATE_USER_INFO)
+    R<Boolean> updateUserInfo(@RequestBody User user);
+
     /**
      * 删除用户
      *
@@ -166,4 +172,6 @@ public interface IUserClient {
     @GetMapping(USER_LIST_INFO_BY_IDS)
     List<User> userInfoByIds(@RequestBody List<Long> userIds);
 
+
+
 }

+ 6 - 3
blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchivesAutoController.java

@@ -381,9 +381,12 @@ public class ArchivesAutoController extends BladeController {
 			//先验证当前项目是否在自动组卷中,组卷中直接返回
 			//ProjectInfo projectInfo = projectClient.getById(String.valueOf(projectId));
 			ContractInfo contract = contractClient.getContractById(contractId);
-			Integer isArchivesAuto = contract.getIsArchivesAuto();
-			if(isArchivesAuto==-1 || isArchivesAuto==null || isArchivesAuto==0){
-				isArchivesAuto=100;
+			Integer isArchivesAuto = 100;
+			if (contract != null) {
+				isArchivesAuto = contract.getIsArchivesAuto();
+				if(isArchivesAuto==-1 || isArchivesAuto==null || isArchivesAuto==0){
+					isArchivesAuto=100;
+				}
 			}
 			return R.data(isArchivesAuto);
 		}catch (Exception e){

+ 2 - 2
blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchivesAutoMapper.xml

@@ -172,7 +172,7 @@
                 #{nodeId}
             </foreach>
         </if>
-        order by u.tree_sort,u.auto_file_sort,u.file_number asc
+        order by u.tree_sort,u.auto_file_sort,u.file_number,u.create_time asc
         limit #{current}, #{size}
     </select>
 
@@ -610,7 +610,7 @@
     </select>
 
     <select id="pageByArchivesAuto3" resultMap="archivesAutoResultMap">
-        select uaa.id,uaa.name,uaa.file_number,uaa.unit,uaa.storage_time,uaa.secret_level
+        select uaa.id,uaa.name,uaa.file_number,uaa.unit,uaa.storage_time,uaa.secret_level,uaa.start_date,uaa.end_date
         from
         (SELECT id FROM m_archive_tree_contract WHERE project_id =#{vo.projectId}
         and  ancestors like concat('%',#{vo.nodeId},'%')

+ 1 - 1
blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchivesAutoServiceImpl.java

@@ -252,7 +252,7 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 				//柜子里面侧面编号
 				if (aa.getFileNumber() != null && aa.getFileNumber() != "") {
 					String[] split = aa.getFileNumber().split("_");
-					aa.setFileNumber(split[split.length - 1]);
+					aa.setSideNumber(split[split.length - 1]);
 				}
 				if (StringUtils.isNotBlank(aa.getStorageTime())) {
 					aa.setStorageTimeValue("3".equals(aa.getStorageTime()) ? "永久" : ("2".equals(aa.getStorageTime()) ? "30年" : "10年"));

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

@@ -31,6 +31,9 @@ import org.springblade.manager.dto.FormData;
 import org.springblade.manager.entity.Formula;
 import org.springblade.manager.feign.FormulaClient;
 import org.springframework.beans.BeanUtils;
+import org.springframework.messaging.handler.annotation.MessageMapping;
+import org.springframework.messaging.handler.annotation.Payload;
+import org.springframework.messaging.handler.annotation.SendTo;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 import springfox.documentation.annotations.ApiIgnore;
@@ -120,7 +123,7 @@ public class MileageController {
         if (StringUtil.isEmpty(b) || StringUtil.isEmpty(value) || StringUtil.isEmpty(jj) || StringUtil.isEmpty(projectId) || StringUtil.isEmpty(partId)) {
             return R.fail("参数不全");
         }
-        double[] aa = MileageUtill.azimuthZbXy(Double.parseDouble(value), Double.parseDouble(b), Double.parseDouble(jj), this.service.list(Wrappers.<Mileagexy>query().lambda().eq(Mileagexy::getPartId, partId).eq(Mileagexy::getProjectId, projectId)));
+        double[] aa = MileageUtill.azimuthZbXy(Double.parseDouble(value), Double.parseDouble(b), Double.parseDouble(jj), this.service.list(Wrappers.<Mileagexy>query().lambda().eq(Mileagexy::getPartId, partId)));
         if (aa == null) {
             return R.fail("线元信息不存在,请按照图纸录入系统");
         }
@@ -304,5 +307,66 @@ public class MileageController {
         return partNo + 'K' + xstr + sign + ystr;
     }
 
+/*
+    private static class CalculationRequest {
+        private int num1;
+        private int num2;
+        private char operator;
+
+        public int getNum1() {
+            return num1;
+        }
+
+        public void setNum1(int num1) {
+            this.num1 = num1;
+        }
+
+        public int getNum2() {
+            return num2;
+        }
+
+        public void setNum2(int num2) {
+            this.num2 = num2;
+        }
+
+        public char getOperator() {
+            return operator;
+        }
+
+        public void setOperator(char operator) {
+            this.operator = operator;
+        }
+    }
+
+
+    @MessageMapping("/websocket/calc")
+    @SendTo("/topic/result")
+    public int calculate(@Payload CalculationRequest request) {
+        int num1 = request.getNum1();
+        int num2 = request.getNum2();
+        char operator = request.getOperator();
+
+        int result = 0;
+        switch (operator) {
+            case '+':
+                result = num1 + num2;
+                break;
+            case '-':
+                result = num1 - num2;
+                break;
+            case '*':
+                result = num1 * num2;
+                break;
+            case '/':
+                result = num1 / num2;
+                break;
+            default:
+                // Handle invalid operator
+                break;
+        }
+
+        return result;
+    }*/
+
 
 }

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

@@ -227,4 +227,24 @@ public class AnnualBudgetController {
 //        return R.data(budgetService.portalRiskPlanDetail());
 //    }
 
+    /**
+     * 预算与实际统计-月度统计
+     */
+    @GetMapping("/budgetAndPracticalByMonth")
+    @ApiOperationSupport(order = 16)
+    @ApiOperation(value = "预算与实际统计-月度统计",notes = "传入年:2023年")
+    public R<List<BudgetAndPracticalByMonthVO>> budgetAndPracticalByMonth(String year) {
+        return R.data(budgetService.budgetAndPracticalByMonth(year));
+    }
+
+    /**
+     * 预算与实际统计-部门支出统计
+     */
+    @GetMapping("/budgetAndPracticalByDept")
+    @ApiOperationSupport(order = 17)
+    @ApiOperation(value = "预算与实际统计-部门支出统计",notes = "传入年:2023年")
+    public R<List<BudgetAndPracticalByDeptVO>> budgetAndPracticalByDept(String year) {
+        return R.data(budgetService.budgetAndPracticalByDept(year));
+    }
+
 }

+ 5 - 2
blade-service/blade-control/src/main/java/org/springblade/control/controller/CorporationInfoController.java

@@ -28,7 +28,9 @@ import org.hibernate.validator.constraints.Length;
 import org.springblade.core.mp.support.Condition;
 import org.springblade.core.mp.support.Query;
 import org.springblade.core.oss.model.BladeFile;
+import org.springblade.core.secure.annotation.PreAuth;
 import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.constant.RoleConstant;
 import org.springblade.core.tool.utils.FileUtil;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.resource.entity.Attach;
@@ -143,6 +145,7 @@ public class CorporationInfoController extends BladeController {
             @ApiImplicitParam(name = "file", value = "文件源", required = true),
             @ApiImplicitParam(name = "id", value = "制度主键Id(重新上传必须传)", required = false)
     })
+    @PreAuth(RoleConstant.HAS_ROLE_ADMIN)
     public R putFileAttach(@RequestParam("file") MultipartFile file, String id) {
         //
         CorporationInfo corporationInfo = new CorporationInfo();
@@ -170,7 +173,7 @@ public class CorporationInfoController extends BladeController {
             corporationInfo.setName(file.getName());
             corporationInfo.setOriginalName(file.getOriginalFilename());
             corporationInfo.setDomainUrl(newBladeFile.getDomain());
-            corporationInfo.setLink(newBladeFile.getPdfUrl());
+            corporationInfo.setLinkUrl(newBladeFile.getPdfUrl());
             corporationInfo.setName(newBladeFile.getName());
 
             corporationInfo.setAttachSize(newBladeFile.getFileSize());
@@ -180,7 +183,7 @@ public class CorporationInfoController extends BladeController {
             corporationInfo.setName(file.getName());
             corporationInfo.setOriginalName(file.getOriginalFilename());
             corporationInfo.setDomainUrl(newBladeFile.getDomain());
-            corporationInfo.setLink(newBladeFile.getPdfUrl());
+            corporationInfo.setLinkUrl(newBladeFile.getPdfUrl());
             corporationInfo.setName(newBladeFile.getName());
             corporationInfo.setAttachSize(newBladeFile.getFileSize());
             corporationInfo.setExtension(fileExtension);

+ 13 - 0
blade-service/blade-control/src/main/java/org/springblade/control/controller/DictInfoController.java

@@ -16,12 +16,14 @@
  */
 package org.springblade.control.controller;
 
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import io.swagger.annotations.*;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import lombok.AllArgsConstructor;
 
 import javax.validation.Valid;
 
+import org.springblade.control.entity.UserContractInfo;
 import org.springblade.core.cache.utils.CacheUtil;
 import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.mp.support.Condition;
@@ -74,12 +76,23 @@ public class DictInfoController extends BladeController {
     @ApiOperationSupport(order = 1)
     @ApiOperation(value = "新增或修改", notes = "传入dictInfo")
     public R submit(@Valid @RequestBody DictInfo dictInfo) {
+
         if (ObjectUtil.isNotEmpty(dictInfo.getId())) {
             DictInfo dictInfo1 = dictInfoService.getBaseMapper().selectById(dictInfo.getId());
             if (dictInfo1 != null && dictInfo1.getType().equals(6)) {
                 throw new ServiceException("没有权限,请联系管理员");
             }
         }
+
+        Long userCount = dictInfoService.getBaseMapper().selectCount(
+                Wrappers.<DictInfo>query().lambda()
+                        .eq(DictInfo::getDictName, dictInfo.getDictName())
+                        .eq(DictInfo::getType, dictInfo.getType())
+                        .eq(DictInfo::getIsDeleted, 0));
+        if(userCount>=1){
+            return R.success("数据已存在,请勿重复添加");
+        }
+
         CacheUtil.clear(DICT_CACHE, Boolean.FALSE);
         return R.status(dictInfoService.saveOrUpdate(dictInfo));
 

+ 55 - 1
blade-service/blade-control/src/main/java/org/springblade/control/controller/UserContractInfoController.java

@@ -16,6 +16,9 @@
  */
 package org.springblade.control.controller;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
@@ -24,10 +27,16 @@ import lombok.AllArgsConstructor;
 
 import javax.validation.Valid;
 
+import org.springblade.control.entity.DepartmentMonthPlan;
+import org.springblade.control.entity.UserFilesInfo;
+import org.springblade.control.service.IUserFilesInfoService;
 import org.springblade.core.mp.support.Condition;
 import org.springblade.core.mp.support.Query;
+import org.springblade.core.secure.BladeUser;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.Func;
+import org.springblade.core.tool.utils.StringUtil;
+import org.springblade.system.user.entity.User;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.RequestParam;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -50,6 +59,8 @@ public class UserContractInfoController extends BladeController {
 
     private final IUserContractInfoService userContractInfoService;
 
+    private final IUserFilesInfoService userFilesInfoService;
+
     /**
      * 详情
      */
@@ -79,6 +90,17 @@ public class UserContractInfoController extends BladeController {
     @ApiOperationSupport(order = 4)
     @ApiOperation(value = "新增", notes = "传入userContractInfo")
     public R save(@Valid @RequestBody UserContractInfo userContractInfo) {
+        if(userContractInfo.getType()==2){
+            Long userCount = userFilesInfoService.getBaseMapper().selectCount(
+                    Wrappers.<UserFilesInfo>query().lambda()
+                            .eq(UserFilesInfo::getUserId, userContractInfo.getUserId())
+                            .eq(UserFilesInfo::getIsDeleted, 0));
+            if(userCount<=0){
+                UserFilesInfo userFilesInfo = new UserFilesInfo();
+                userFilesInfo.setUserId(userContractInfo.getUserId());
+                userFilesInfoService.saveOrUpdate(userFilesInfo);
+            }
+        }
         return R.status(userContractInfoService.save(userContractInfo));
     }
 
@@ -89,6 +111,17 @@ public class UserContractInfoController extends BladeController {
     @ApiOperationSupport(order = 5)
     @ApiOperation(value = "修改", notes = "传入userContractInfo")
     public R update(@Valid @RequestBody UserContractInfo userContractInfo) {
+        if(userContractInfo.getType()==2){
+            Long userCount = userFilesInfoService.getBaseMapper().selectCount(
+                    Wrappers.<UserFilesInfo>query().lambda()
+                            .eq(UserFilesInfo::getUserId, userContractInfo.getUserId())
+                            .eq(UserFilesInfo::getIsDeleted, 0));
+            if(userCount<=0){
+                UserFilesInfo userFilesInfo = new UserFilesInfo();
+                userFilesInfo.setUserId(userContractInfo.getUserId());
+                userFilesInfoService.saveOrUpdate(userFilesInfo);
+            }
+        }
         return R.status(userContractInfoService.updateById(userContractInfo));
     }
 
@@ -98,7 +131,28 @@ public class UserContractInfoController extends BladeController {
     @PostMapping("/submit")
     @ApiOperationSupport(order = 6)
     @ApiOperation(value = "新增或修改", notes = "传入userContractInfo")
-    public R submit(@Valid @RequestBody UserContractInfo userContractInfo) {
+    public R submit(@Valid @RequestBody UserContractInfo userContractInfo, BladeUser bladeUser) {
+
+        if(userContractInfo.getType()==2){
+            Long userCount = userFilesInfoService.getBaseMapper().selectCount(
+                    Wrappers.<UserFilesInfo>query().lambda()
+                            .eq(UserFilesInfo::getUserId, userContractInfo.getUserId())
+                            .eq(UserFilesInfo::getIsDeleted, 0));
+            if(userCount<=0){
+                UserFilesInfo userFilesInfo = new UserFilesInfo();
+                userFilesInfo.setUserId(userContractInfo.getUserId());
+                userFilesInfoService.saveOrUpdate(userFilesInfo);
+            }
+        }
+
+        UserContractInfo one = userContractInfoService.getOne( new LambdaQueryWrapper<UserContractInfo>()
+                .eq(UserContractInfo::getUserId, userContractInfo.getUserId())
+                .eq(UserContractInfo::getType, userContractInfo.getType())
+                .eq(UserContractInfo::getIsDeleted, 0));
+
+        if(one !=null && StringUtil.isNotBlank(one.getId()+"")) {
+            userContractInfo.setId(one.getId());
+        }
         return R.status(userContractInfoService.saveOrUpdate(userContractInfo));
     }
 

+ 22 - 2
blade-service/blade-control/src/main/java/org/springblade/control/controller/UserFilesInfoController.java

@@ -16,7 +16,6 @@
  */
 package org.springblade.control.controller;
 
-import com.alibaba.spring.util.BeanUtils;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
@@ -24,12 +23,19 @@ import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import lombok.AllArgsConstructor;
 import javax.validation.Valid;
 
+import org.apache.commons.lang.StringUtils;
 import org.springblade.control.wrapper.UserFilesWrapper;
 import org.springblade.core.mp.support.Condition;
 import org.springblade.core.mp.support.Query;
+import org.springblade.core.secure.BladeUser;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.BeanUtil;
+import org.springblade.core.tool.utils.DateTimeUtil;
+import org.springblade.core.tool.utils.DateUtil;
 import org.springblade.core.tool.utils.Func;
+import org.springblade.system.user.entity.User;
+import org.springblade.system.user.entity.UserInfo;
+import org.springblade.system.user.feign.IUserClient;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.RequestParam;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -38,6 +44,9 @@ import org.springblade.control.vo.UserFilesInfoVO;
 import org.springblade.control.service.IUserFilesInfoService;
 import org.springblade.core.boot.ctrl.BladeController;
 
+import java.time.LocalDate;
+import java.util.Date;
+
 /**
  * 档案职工信息表 控制器
  *
@@ -51,6 +60,7 @@ import org.springblade.core.boot.ctrl.BladeController;
 public class UserFilesInfoController extends BladeController {
 
 	private final IUserFilesInfoService userFilesInfoService;
+	private final IUserClient userClient;
 
 /*	*//**
 	 * 详情
@@ -117,6 +127,15 @@ public class UserFilesInfoController extends BladeController {
 	@ApiOperation(value = "新增或修改", notes = "传入userFilesInfo")
 	public R submit(@Valid @RequestBody UserFilesInfoVO userFilesInfoVO) {
 		UserFilesInfo userFilesInfo = BeanUtil.copy(userFilesInfoVO,UserFilesInfo.class);
+		User user = BeanUtil.copy(userFilesInfoVO, User.class);
+		if(StringUtils.isNotEmpty(userFilesInfoVO.getBirthday())){
+			String birders = userFilesInfoVO.getBirthday();
+			LocalDate localDate = DateTimeUtil.parseDate(birders);
+			Date date = DateUtil.toDate(localDate);
+			user.setBirthday(date);
+		}
+		user.setId(userFilesInfoVO.getUserId());
+		userClient.updateUserInfo(user);
 		return R.status(userFilesInfoService.saveOrUpdate(userFilesInfo));
 	}
 
@@ -147,7 +166,8 @@ public class UserFilesInfoController extends BladeController {
 	@GetMapping("/get-user-file-page")
 	@ApiOperationSupport(order = 9)
 	@ApiOperation(value = "分页档案职工信息表", notes = "传入userFilesInfo")
-	public R<IPage<UserFilesInfoVO>> page(UserFilesInfoVO userFilesInfo,Query query) {
+	public R<IPage<UserFilesInfoVO>> page(UserFilesInfoVO userFilesInfo, Query query, BladeUser bladeUser) {
+		userFilesInfo.setUserTypeName(bladeUser.getTenantId());
 		IPage<UserFilesInfoVO> pages = userFilesInfoService.selectUserFilesInfoPage(Condition.getPage(query),userFilesInfo);
 		return R.data(UserFilesWrapper.build().pageVO(pages));
 	}

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

@@ -30,4 +30,6 @@ public interface ContractReturnedInfoMapper extends BaseMapper<ContractReturnedI
     List<ContractReturnedInfo> getProjectReturnedByMonth(@Param("date") String date);
 
     void deleteByContractId(@Param("contractId") Long contractId);
+
+    List<ContractReturnedInfo> getAllMonthReturnedByYear(@Param("year") int y);
 }

+ 8 - 0
blade-service/blade-control/src/main/java/org/springblade/control/mapper/ContractReturnedInfoMapper.xml

@@ -46,4 +46,12 @@
         </if>
         and practical_returned_money is not null
     </select>
+    <select id="getAllMonthReturnedByYear" resultType="org.springblade.control.entity.ContractReturnedInfo">
+        SELECT *
+        from c_contract_returned_info
+        WHERE  is_deleted = 0
+        <if test="year != 0">
+            and DATE_FORMAT(practical_returned_time ,'%Y') = #{year}
+        </if>
+    </select>
 </mapper>

+ 2 - 4
blade-service/blade-control/src/main/java/org/springblade/control/mapper/CorporationInfoMapper.xml

@@ -12,7 +12,7 @@
         <result column="update_time" property="updateTime"/>
         <result column="status" property="status"/>
         <result column="is_deleted" property="isDeleted"/>
-        <result column="link" property="link"/>
+        <result column="link_url" property="linkUrl"/>
         <result column="domain_url" property="domainUrl"/>
         <result column="name" property="name"/>
         <result column="original_name" property="originalName"/>
@@ -22,9 +22,7 @@
 
 
     <select id="selectCorporationInfoPage" resultMap="corporationInfoResultMap">
-        select *
-        from c_corporation_info
-        where is_deleted = 0
+        select * from c_corporation_info where is_deleted = 0
     </select>
 
 </mapper>

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

@@ -108,4 +108,6 @@ public interface ProjectCostBudgetMapper extends BaseMapper<ProjectCostBudget> {
     Integer getUserMonthLog(@Param("userId") Long userId,@Param("start") LocalDate start,@Param("end") LocalDate end);
 
     List<ProjectCostBudgetVO> getDepartmentTimeOutPlan(@Param("costType") Integer costType,@Param("projectId") Long projectId);
+
+    List<ProjectCostBudget> getAllMonthBudgetByYear(@Param("year") int y);
 }

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

@@ -187,7 +187,7 @@
         FROM c_project_cost_budget pcb WHERE pcb.project_id = #{id} AND pcb.parent_id > 0
     </select>
     <select id="getBudgetByYear" resultType="org.springblade.control.entity.ProjectCostBudget">
-        select id,project_id,practical_finish_time ,actual_total_money  from c_project_cost_budget
+        select *  from c_project_cost_budget
         WHERE is_deleted = 0 and task_approve = 1 and DATE_FORMAT(practical_finish_time ,'%Y') = #{year}
     </select>
     <select id="getPlanByMonth" resultType="org.springblade.control.vo.ProjectCostBudgetVO2">
@@ -288,8 +288,8 @@
     </select>
     <select id="getAllMaintainPlan" resultType="org.springblade.control.entity.ProjectCostBudget">
         SELECT *
-        from c_project_cost_budget
-        WHERE plan_task_type > 0 and (SELECT dict_value from c_dict_info cdi WHERE id = plan_task_type) = 2
+        from c_project_cost_budget pcb
+        WHERE pcb.plan_task_type > 0 and (SELECT cdi.dict_value from c_dict_info cdi WHERE cdi.id = pcb.plan_task_type) = 2
     </select>
     <select id="getAllMaintainPlan2" resultType="org.springblade.control.entity.ProjectCostBudget">
         SELECT *
@@ -346,5 +346,12 @@
         WHERE pcb.cost_type = #{costType} and pcb.is_deleted = 0 and pcb.project_id = #{projectId} and pcb.plan_end_time &lt; pcb.practical_finish_time and pcb.status = 4
     </select>
 
+    <select id="getAllMonthBudgetByYear" resultType="org.springblade.control.entity.ProjectCostBudget">
+        select pcb.*
+        from c_project_cost_budget pcb
+        WHERE pcb.is_deleted = 0 and pcb.approve = 1
+            and DATE_FORMAT(pcb.plan_start_time ,'%Y') = #{year}
+    </select>
+
 
 </mapper>

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

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

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

@@ -118,5 +118,4 @@
         WHERE fri.is_deleted = 0 and fri.status = 2 and fri.project_id = #{projectId} and and pcb.costType = #{costType} and fri.budget_plan_ids > 0
     </select>
 
-
 </mapper>

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

@@ -41,6 +41,9 @@
         <if test="param2.type!=null and param2.type!=''">
             and type = #{userContractInfo.type}
         </if>
+        <if test="param2.userId!=null and param2.userId!=''">
+            and user_id = #{userContractInfo.userId}
+        </if>
     </select>
 
 </mapper>

+ 5 - 2
blade-service/blade-control/src/main/java/org/springblade/control/mapper/UserFilesInfoMapper.xml

@@ -67,7 +67,10 @@
         (SELECT dict_name from c_dict_info a where a.code='con_type' and parent_id!=0 and dict_value =a.con_type) as conTypeName,
         (SELECT dict_name from c_dict_info a where a.code='user_status' and parent_id!=0 and dict_value =a.user_status) as userStatusName,
         (SELECT dict_name from c_dict_info a where a.code='political_type' and parent_id!=0 and dict_value =a.political_type) as politicalName
-        from c_view_user_files_info a where a.is_deleted = 0
+        from c_view_user_files_info a where a.tenant_id = #{param2.userTypeName} and  is_deleted=0
+        <if test="param2.userId!=null and param2.userId!=''">
+            and user_id = #{param2.userId}
+        </if>
     </select>
 
     <select id="getUserFileDetail" resultMap="userFilesInfoResultVoMap">
@@ -78,6 +81,6 @@
             (SELECT dict_name from c_dict_info a where a.code='con_type' and parent_id!=0 and dict_value =a.con_type) as conTypeName,
             (SELECT dict_name from c_dict_info a where a.code='user_status' and parent_id!=0 and dict_value =a.user_status) as userStatusName,
             (SELECT dict_name from c_dict_info a where a.code='political_type' and parent_id!=0 and dict_value =a.political_type) as politicalName
-        from c_view_user_files_info a where a.is_deleted = 0 and id=#{id}
+        from c_view_user_files_info a where  id=#{id} and  is_deleted=0
     </select>
 </mapper>

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

@@ -50,4 +50,8 @@ public interface IAnnualBudgetService extends BaseService<AnnualBudget> {
     List<ProjectIncomeCostRatioVO> portalProjectIncomeRatio(String date);
 
     List<ProjectServiceProcessVO> portalProjectProcess(Long projectId);
+
+    List<BudgetAndPracticalByMonthVO> budgetAndPracticalByMonth(String year);
+
+    List<BudgetAndPracticalByDeptVO> budgetAndPracticalByDept(String year);
 }

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

@@ -40,4 +40,8 @@ public interface IContractReturnedInfoService extends BaseService<ContractReturn
     List<ContractReturnedInfo> getProjectReturnedByMonth(String date);
 
     void deleteByContractId(Long id);
+
+    //获取所有项目当年每月的,1返回应回款,2返回实际回款
+    List<BigDecimal> getAllMonthReturnedByYear(int y,int type);
+
 }

+ 10 - 2
blade-service/blade-control/src/main/java/org/springblade/control/service/IProjectCostBudgetService.java

@@ -98,10 +98,10 @@ public interface IProjectCostBudgetService extends BaseService<ProjectCostBudget
     //获取所有项目的截至目前的维护支出
     BigDecimal getAllMaintainCost2();
 
-    //获取所有项目截至当年的维护支出,分月返回
+    //获取所有项目截至当年的维护支出,分月返回,以项目为主键
     Map<Long,List<BigDecimal>> getAllMaintainCost3(int year);
 
-    //获取所有项目截至当年的维护支出,按年返回
+    //获取所有项目截至当年的维护支出,按年返回,以项目为主键
     Map<Long,BigDecimal> getAllMaintainCost4(int year);
 
     //获取所有项目截至目前的的维护支出,按项目返回
@@ -118,4 +118,12 @@ public interface IProjectCostBudgetService extends BaseService<ProjectCostBudget
 
     //获取项目的维护预算
     Set<Long> getAllMaintainBudgetId(Long projectId);
+
+    //根据年获取已经分配月的计划支出,按12个月返回
+    List<BigDecimal> getAllMonthBudgetByYear(int y);
+
+    //获取每月实际的人工支出
+    List<BigDecimal> getAllMonthStaffCostByYear(int y);
+    //获取每月实际的维护支出
+    List<BigDecimal> getAllMonthMaintainCostByYear(int y);
 }

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

@@ -63,4 +63,5 @@ public interface IProjectInfoService extends BaseService<ControlProjectInfo> {
     //根据项目id获取项目截至目前-某个费用分类的的报销支出,按项目环节返回
     Map<Long,BigDecimal> getProjectReimburseByCostType(Long projectId,Integer costType);
 
+    List<BigDecimal> getAllMonthReimburseByYear(int y);
 }

+ 132 - 0
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/AnnualBudgetServiceImpl.java

@@ -94,6 +94,39 @@ public class AnnualBudgetServiceImpl extends BaseServiceImpl<AnnualBudgetMapper,
     @Override
     @Transactional
     public void updateAnnualBudget(AnnualBudgetDTO dto) {
+        //收入数据校验
+        List<AnnualBudgetIncome> incomeList = dto.getIncomeList();
+        if (incomeList != null && incomeList.size() > 0){
+            for (AnnualBudgetIncome income : incomeList) {
+                if (income.getProjectId() == null){
+                    throw new ServiceException("请选择项目名称");
+                }
+                if (income.getIncomeType() == null){
+                    throw new ServiceException("请选择收入类别");
+                }
+                if (income.getPredictSignDate() == null){
+                    throw new ServiceException("请选择预计签单时间");
+                }
+                if (income.getPredictContractMoney() == null){
+                    throw new ServiceException("请输入预计新签合同额");
+                }
+                if (income.getPredictAnnualReturned() == null){
+                    throw new ServiceException("请输入预计本年度回款额");
+                }
+            }
+        }
+        //支出数据校验
+        List<AnnualBudgetDisburse> disburseList = dto.getDisburseList();
+        if (disburseList != null && disburseList.size() > 0){
+            for (AnnualBudgetDisburse disburse : disburseList) {
+                if (disburse.getBudgetSubject() == null){
+                    throw new ServiceException("请选择预算科目");
+                }
+                if (disburse.getSecondSubject() == null){
+                    throw new ServiceException("请选择二级科目");
+                }
+            }
+        }
         //统计支出
         Map<String, BigDecimal> map = statisticDisburse(dto);
         BigDecimal disburseTotal = map.get("1");
@@ -941,6 +974,105 @@ public class AnnualBudgetServiceImpl extends BaseServiceImpl<AnnualBudgetMapper,
         return vos;
     }
 
+    /**
+     * 预算与实际统计-月度统计
+     */
+    @Override
+    public List<BudgetAndPracticalByMonthVO> budgetAndPracticalByMonth(String year) {
+        int y = Integer.parseInt(year.substring(0, 4));
+        //获取年度预算
+        AnnualBudget budget = baseMapper.getThisYearBudget(y);
+        Boolean isAnnual = true;
+        AnnualBudgetVO2 preview;
+        List<AnnualBudgetVO2.IncomeDetail> monthIncome = new ArrayList<>();
+        List<AnnualBudgetVO2.disburseDetail> monthDisburse = new ArrayList<>();
+        if (budget != null) {
+            preview = this.preview(budget.getId());
+            monthIncome = preview.getMonthIncome();
+            monthDisburse = preview.getMonthDisburse();
+        }else {
+            isAnnual = false;
+        }
+
+        //获取所有项目当年每月的应回款
+        List<BigDecimal> returned1 = returnedInfoService.getAllMonthReturnedByYear(y,1);
+        //获取已经指定年分配月的成本测算
+        List<BigDecimal> budgets = budgetService.getAllMonthBudgetByYear(y);
+        //获取所有项目当年每月的实际回款
+        List<BigDecimal> returned2 = returnedInfoService.getAllMonthReturnedByYear(y,2);
+        //获取每月实际的人工支出
+        List<BigDecimal> staffCost = budgetService.getAllMonthStaffCostByYear(y);
+        //获取每月实际的维护支出
+        List<BigDecimal> maintainCost = budgetService.getAllMonthMaintainCostByYear(y);
+        //获取每月实际的报销支出
+        List<BigDecimal> reimburse = projectInfoService.getAllMonthReimburseByYear(y);
+        //结果集
+        List<BudgetAndPracticalByMonthVO> list = new ArrayList<>();
+
+        //分别计算12个月
+        List<String> months = Arrays.asList("一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月");
+        BigDecimal c1 = new BigDecimal(0);
+        BigDecimal c2 = new BigDecimal(0);
+        BigDecimal c3 = new BigDecimal(0);
+        BigDecimal c4 = new BigDecimal(0);
+        BigDecimal c5 = new BigDecimal(0);
+        BigDecimal c6 = new BigDecimal(0);
+        for (int i = 1; i <= 12; i++) {
+            BudgetAndPracticalByMonthVO vo1 = new BudgetAndPracticalByMonthVO();
+            //月份
+            vo1.setTime(months.get(i-1));
+            //年初月收入
+            if (isAnnual) {
+                vo1.setIncome1(monthIncome.get(i-1).getIncome());
+                c1 = c1.add(monthIncome.get(i-1).getIncome());
+            }else {
+                vo1.setIncome1(new BigDecimal(0));
+                c1 = c1.add(new BigDecimal(0));
+            }
+            //年初月支出
+            if (isAnnual) {
+                vo1.setDisburse1(monthDisburse.get(i-1).getDisburse());
+                c2 = c2.add(monthDisburse.get(i-1).getDisburse());
+            }else {
+                vo1.setDisburse1(new BigDecimal(0));
+                c2 = c2.add(new BigDecimal(0));
+            }
+            //每月计划收入
+            vo1.setIncome2(returned1.get(i-1));
+            c3 = c3.add(returned1.get(i-1));
+            //每月计划支出
+            vo1.setDisburse2(budgets.get(i-1));
+            c4 = c4.add(budgets.get(i-1));
+            //实际每月收入
+            vo1.setIncome3(returned2.get(i-1));
+            c5 = c5.add(returned2.get(i-1));
+            //实际每月支出
+            vo1.setDisburse3(staffCost.get(i-1).add(maintainCost.get(i-1).add(reimburse.get(i-1))));
+            c6 = c6.add(staffCost.get(i-1).add(maintainCost.get(i-1).add(reimburse.get(i-1))));
+
+        list.add(vo1);
+        }
+        BudgetAndPracticalByMonthVO vo2 = new BudgetAndPracticalByMonthVO();
+        vo2.setTime("总计");
+        vo2.setIncome1(c1);
+        vo2.setDisburse1(c2);
+        vo2.setIncome2(c3);
+        vo2.setDisburse2(c4);
+        vo2.setIncome3(c5);
+        vo2.setDisburse3(c6);
+        list.add(vo2);
+        return list;
+    }
+
+    /**
+     * 预算与实际统计-部门支出统计
+     */
+    @Override
+    public List<BudgetAndPracticalByDeptVO> budgetAndPracticalByDept(String year) {
+        //
+        return null;
+    }
+
     /**
      * 统计支出 1支出总和2工资总和
      */

+ 42 - 0
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/ContractReturnedInfoServiceImpl.java

@@ -19,6 +19,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.stream.Collectors;
 
@@ -121,4 +122,45 @@ public class ContractReturnedInfoServiceImpl extends BaseServiceImpl<ContractRet
     public void deleteByContractId(Long contractId) {
         baseMapper.deleteByContractId(contractId);
     }
+
+    /**
+     * 获取所有项目当年每月的回款
+     * @param y
+     * @return
+     */
+    @Override
+    public List<BigDecimal> getAllMonthReturnedByYear(int y,int type) {
+        //获取当年所有回款
+        List<ContractReturnedInfo> infos = baseMapper.getAllMonthReturnedByYear(y);
+        List<BigDecimal> list = new ArrayList<>();
+        //计算每月回款
+        if (infos != null && infos.size() > 0){
+            if (type == 1){
+                for (int i = 0; i < 12; i++) {
+                    BigDecimal big = new BigDecimal(0);
+                    for (ContractReturnedInfo info : infos) {
+                        if (info.getShouldReturnedTime().getMonthValue() == (i+1)){
+                            big = big.add(info.getShouldReturnedMoney());
+                        }
+                    }
+                    list.add(big);
+                }
+            }else {
+                for (int i = 0; i < 12; i++) {
+                    BigDecimal big = new BigDecimal(0);
+                    for (ContractReturnedInfo info : infos) {
+                        if (info.getPracticalReturnedTime().getMonthValue() == (i+1)){
+                            big = big.add(info.getPracticalReturnedMoney());
+                        }
+                    }
+                    list.add(big);
+                }
+            }
+        }else {
+            for (int i = 0; i < 12; i++) {
+                list.add(new BigDecimal(0));
+            }
+        }
+        return list;
+    }
 }

+ 79 - 0
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/ProjectCostBudgetServiceImpl.java

@@ -2050,6 +2050,85 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
         return null;
     }
 
+    /**
+     * 根据年获取已经分配月的计划支出,按12个月返回
+     * @param y
+     * @return
+     */
+    @Override
+    public List<BigDecimal> getAllMonthBudgetByYear(int y) {
+        List<ProjectCostBudget> budgets = baseMapper.getAllMonthBudgetByYear(y);
+        List<BigDecimal> list = new ArrayList<>();
+        if (budgets != null && budgets.size() > 0){
+            for (int i = 0; i < 12; i++) {
+                BigDecimal big = new BigDecimal(0);
+                for (ProjectCostBudget budget : budgets) {
+                    if (budget.getPlanStartTime().getMonthValue() == (i+1)){
+                        big = big.add(budget.getBudgetCountMoney());
+                    }
+                }
+                list.add(big);
+            }
+        }else {
+            for (int i = 0; i < 12; i++) {
+                list.add(new BigDecimal(0));
+            }
+        }
+        return list;
+    }
+
+    /**
+     * 获取每月实际的人工支出,
+     * @param y
+     * @return
+     */
+    @Override
+    public List<BigDecimal> getAllMonthStaffCostByYear(int y) {
+        List<ProjectCostBudget> budgets = baseMapper.getBudgetByYear(y);
+        List<BigDecimal> list = new ArrayList<>();
+        if (budgets != null && budgets.size() > 0){
+            for (int i = 0; i < 12; i++) {
+                BigDecimal big = new BigDecimal(0);
+                for (ProjectCostBudget budget : budgets) {
+                    if (budget.getPracticalFinishTime().getMonthValue() == (i+1)){
+                        big = big.add(budget.getActualTotalMoney());
+                    }
+                }
+                list.add(big);
+            }
+        }else {
+            for (int i = 0; i < 12; i++) {
+                list.add(new BigDecimal(0));
+            }
+        }
+        return list;
+    }
+
+    /**
+     * 获取每月实际的维护支出
+     * @param year
+     * @return
+     */
+    @Override
+    public List<BigDecimal> getAllMonthMaintainCostByYear(int year) {
+        Map<Long, List<BigDecimal>> map = this.getAllMaintainCost3(year);
+        List<BigDecimal> list = new ArrayList<>();
+        if (map != null && map.size() > 0){
+            for (int i = 0; i < 12; i++) {
+                BigDecimal big = new BigDecimal(0);
+                for (Long aLong : map.keySet()) {
+                    big = big.add(map.get(aLong).get(i));
+                }
+                list.add(big);
+            }
+        }else {
+            for (int i = 0; i < 12; i++) {
+                list.add(new BigDecimal(0));
+            }
+        }
+        return list;
+    }
+
     /**
      * 统计一行的几个总金额
      */

+ 30 - 0
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/ProjectInfoServiceImpl.java

@@ -1,5 +1,6 @@
 package org.springblade.control.service.impl;
 
+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;
@@ -290,6 +291,13 @@ public class ProjectInfoServiceImpl extends BaseServiceImpl<ProjectInfoMapper, C
                 vo.setPracticalCost(practicalCost);
                 list.add(vo);
             }
+            if(list.size() > 0){
+                BigDecimal big = new BigDecimal(0);
+                for (AllProjectStatsVO vo : list) {
+                    big = big.add(vo.getPracticalCost());
+                }
+                list.get(0).setTotal(big);
+            }
             return list;
         }else {
             if (isMaintain){
@@ -503,5 +511,27 @@ public class ProjectInfoServiceImpl extends BaseServiceImpl<ProjectInfoMapper, C
         return decimalMap;
     }
 
+    @Override
+    public List<BigDecimal> getAllMonthReimburseByYear(int y) {
+        List<EMFinancialReimbursementInfo> reimburse = baseMapper.getYearReimburseByMonth(y);
+        List<BigDecimal> list = new ArrayList<>();
+        if (reimburse != null && reimburse.size() > 0){
+            for (int i = 0; i < 12; i++) {
+                BigDecimal big = new BigDecimal(0);
+                for (EMFinancialReimbursementInfo info : reimburse) {
+                    if (info.getFrDate().getMonth() == i){
+                        big = big.add(info.getFrMoney());
+                    }
+                }
+                list.add(big);
+            }
+        }else {
+            for (int i = 0; i < 12; i++) {
+                list.add(new BigDecimal(0));
+            }
+        }
+        return list;
+    }
+
 
 }

+ 1 - 1
blade-service/blade-desk/src/main/java/org/springblade/desk/controller/LeaveController.java

@@ -39,7 +39,7 @@ import springfox.documentation.annotations.ApiIgnore;
 @AllArgsConstructor
 public class LeaveController extends BladeController implements CacheNames {
 
-   // private final ILeaveService leaveService;
+    private final ILeaveService leaveService;
 
     /**
      * 详情

+ 1 - 1
blade-service/blade-desk/src/main/java/org/springblade/desk/mapper/NoticeMapper.xml

@@ -43,7 +43,7 @@
         LEFT JOIN ( SELECT * FROM blade_dict WHERE CODE = 'notice' ) d ON n.category = d.dict_key
         WHERE
         n.is_deleted = 0 and n.tenant_id = #{notice.tenantId}
-         test="notice.title!=null">
+         <if test="notice.title!=null">
             and n.title like concat(concat('%', #{notice.title}), '%')
         </if>
         <if test="notice.category!=null">

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

@@ -429,6 +429,8 @@ public class CustomFunction {
         }
         return "";
     }
+
+
     public static Object dateOffset(List<String> dateList,LinkedList<Integer> offSet){
             List<String> result = new ArrayList<>();
             if(ListUtils.isNotEmpty(dateList)&&ListUtils.isNotEmpty(offSet)){
@@ -2576,6 +2578,12 @@ public class CustomFunction {
         return dXd(design, data, xN, scale, mode);
     }
 
+//    public static void main(String[] args) {
+//        String a="100*100";
+//        List<Object>list  = new ArrayList<>(Arrays.asList("101*102","201*198"));
+//        list.forEach(d-> System.out.println(dXd(a,d)));
+//    }
+
     /**
      * @return java.lang.Object
      * @Description 求偏差公式  支持AXA-BXB=DXD或者A-B=D的格式
@@ -2591,16 +2599,26 @@ public class CustomFunction {
             if (StringUtils.isEmpty(scale)) {
                 scale = 0;
             }
-            String delimiter = handleNull(matcherFindGroup("[^0-9.]", design.toString(), 0, false));
+            String delimiter = handleNull(matcherFindGroup("[^0-9./]", design.toString(), 0, false));
             if (StringUtils.isEmpty(delimiter)) {
                 delimiter = CONCAT;
             }
+            String delimiter2 = handleNull(matcherFindGroup("[^0-9.]", design.toString(), 0, false));
+            if (StringUtils.isEmpty(delimiter2)) {
+                delimiter2 = CONCAT;
+            }
             String[] dArr = handleNull(design).split("[" + delimiter + "]");
-            String[] bArr = handleNull(data).split("[" + delimiter + "]");
+            String[] bArr = handleNull(data).split("[" + delimiter2 + "]");
             Object _dx = null;
             for (int n = 0; n < dArr.length; n++) {
-                BigDecimal a = new BigDecimal(dArr[n]);
-                BigDecimal b = new BigDecimal(bArr[n]);
+                String dsg=dArr[n];
+                String xd=bArr[n];
+                if(dsg.contains("/")){
+                    String[] dsgA= dsg.split("/");
+                    dsg= Arrays.stream(dsgA).filter(StringUtils::isNumber).min(Comparator.comparingDouble(e->Math.abs(StringUtils.obj2Double(calculate(xd,e,3,2))))).orElse(dsg);
+                }
+                BigDecimal a = new BigDecimal(dsg);
+                BigDecimal b = new BigDecimal(xd);
                 String _data;
                 if (StringUtils.isEquals(1, mode)) {
                     _data = b.multiply(a).multiply(new BigDecimal(xN.toString())).setScale(Integer.parseInt(scale.toString()), ROUND_HALF_UP).toString();
@@ -2608,7 +2626,7 @@ public class CustomFunction {
                     _data = b.subtract(a).multiply(new BigDecimal(xN.toString())).setScale(Integer.parseInt(scale.toString()), ROUND_HALF_UP).toString();
                 }
                 if (StringUtils.isNotEmpty(_dx)) {
-                    _dx = StringUtils.join(_dx, _data, delimiter);
+                    _dx = StringUtils.join(_dx, _data, delimiter2);
                 } else {
                     _dx = _data;
                 }

+ 5 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ArchiveTreeContractController.java

@@ -250,6 +250,11 @@ public class ArchiveTreeContractController extends BladeController {
 //		}
         List<ArchiveTreeContractVO2> tree = archiveTreeContractService.lazyTree2(AuthUtil.getTenantId(), parentId, projectId, contractId);
         if (tree != null && tree.size() > 0) {
+            List<ArchiveTreeContractVO2> newTrees = new ArrayList<>();
+            if (parentId == 0 && tree.size() > 1) {
+                newTrees.add(tree.get(0));
+                tree = newTrees;
+            }
             archiveTreeContractService.fillDefaultArchiveAutoInfo(tree, projectId);
             return R.data(tree);
         }

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

@@ -241,8 +241,6 @@ public class FormulaController {
             Map<String, Map> map = new HashMap<>();
             elementIds.forEach(e -> {
                 Formula formula = new Formula();
-//                     formula.setElementId(e);
-//                     formula.setNodeId(bean.getNodeId());
                 formula.setOutm(Formula.FULL);
                 Map<String, String> m = new HashMap<>();
                 m.put("name", bean.getName());

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

@@ -377,6 +377,7 @@ public class WbsParamController {
                     Map<String, Object> tmpMap = new HashMap<>();
                     List<Map<String, Object>> finalElementMap = elementMap;
                     paramList.forEach(e -> {
+                        /*复用节点参数公式,只要公式脚本一样就直接引用*/
                         Formula formula = this.formulaService.getOne(Wrappers.<Formula>lambdaQuery().eq(Formula::getParamId, e.getId()));
                         if (formula == null) {
                             formula = new Formula();

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

@@ -1219,7 +1219,7 @@ public  List<ElementData> setScale(Integer scale,List<ElementData> data){
     private List<KeyMapper> listForContract(List<Long> ids,String projectId,String nodeId){
         String pkIds=ids.stream().map(String::valueOf).collect(Collectors.joining(","));
         List<Map<String,Object>> listMap = listMap(ids,ExecuteType.INSPECTION);
-        Map<String,Object> wtpMap= this.jdbcTemplate.queryForMap("select b.parent_id parentId,b.wbs_id wbsId from m_wbs_tree_contract  a join m_wbs_tree_private b on (a.id=b.id or a.old_id=b.id ) where a.p_key_id ="+ids.get(0)+" and b.project_id="+projectId+" limit 1");
+        Map<String,Object> wtpMap= this.jdbcTemplate.queryForMap("select b.id parentId,b.wbs_id wbsId from m_wbs_tree_contract  a join m_wbs_tree_private b on (a.id=b.id or a.old_id=b.id ) where a.p_key_id ="+nodeId+" and b.project_id="+projectId+" limit 1");
         if(Func.isNotEmpty(listMap)){
             /*当前节点的某个元素存在多种作用域的公式,作用域范围越小优先级越高*/
             List<KeyMapper> list= listMap.stream().map(m->BeanUtil.toBean(m,KeyMapper.class)).collect(Collectors.toList());

+ 6 - 0
blade-service/blade-user/src/main/java/org/springblade/system/user/feign/UserClient.java

@@ -87,6 +87,11 @@ public class UserClient implements IUserClient {
         return R.data(service.submit(user));
     }
 
+    @Override
+    public R<Boolean> updateUserInfo(User user) {
+        return R.data(service.saveOrUpdate(user));
+    }
+
     @Override
     @PostMapping(REMOVE_USER)
     public R<Boolean> removeUser(String tenantIds) {
@@ -124,4 +129,5 @@ public class UserClient implements IUserClient {
         return service.getBaseMapper().selectBatchIds(userIds);
     }
 
+
 }

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

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