Pārlūkot izejas kodu

Merge remote-tracking branch 'origin/master'

yusm 3 mēneši atpakaļ
vecāks
revīzija
6b4633d391
26 mainītis faili ar 421 papildinājumiem un 37 dzēšanām
  1. 2 2
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/analysis/index.vue
  2. 1 1
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/contract/component/addEditor.vue
  3. 24 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/config/SuperSonicConfig.java
  4. 0 7
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/UserController.java
  5. 1 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/vo/UserVO.java
  6. 1 1
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/ContactsServiceImpl.java
  7. 61 3
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/UserServiceImpl.java
  8. 7 0
      fhKeeper/formulahousekeeper/management-crm/src/main/resources/application.yml
  9. 1 0
      fhKeeper/formulahousekeeper/management-crm/src/main/resources/i18n/messages.properties
  10. 1 0
      fhKeeper/formulahousekeeper/management-crm/src/main/resources/i18n/messages_en_US.properties
  11. 4 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectController.java
  12. 4 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/Project.java
  13. 28 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/ProjectDeptRelate.java
  14. 10 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/vo/ProjectDeptInfo.java
  15. 5 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/DepartmentMapper.java
  16. 2 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ParticipationMapper.java
  17. 11 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ProjectDeptRelateMapper.java
  18. 2 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ProjectService.java
  19. 34 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java
  20. 159 3
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/UserServiceImpl.java
  21. 15 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/DepartmentMapper.xml
  22. 6 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ParticipationMapper.xml
  23. 12 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ProjectDeptRelateMapper.xml
  24. 3 3
      fhKeeper/formulahousekeeper/timesheet/src/views/corpreport/list.vue
  25. 13 7
      fhKeeper/formulahousekeeper/timesheet/src/views/expense/expense.vue
  26. 14 5
      fhKeeper/formulahousekeeper/timesheet/src/views/project/list.vue

+ 2 - 2
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/analysis/index.vue

@@ -173,13 +173,13 @@ watchEffect(() => {
 <template>
   <div class="m-5 bg-white min-h-full p-4 rounded">
     <section>
-      <div class="h-[800px] w-full bg-[red] mb-5">
+      <!-- <div class="h-[800px] w-full bg-[red] mb-5">
         <iframe
           src="http://47.101.180.183:9080/webapp/agent"
           style="border: none;"
           class="w-full h-full"
         />
-      </div>
+      </div> -->
       <div class="flex gap-3 mb-4">
         <div class="w-40">
           <el-select

+ 1 - 1
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/contract/component/addEditor.vue

@@ -83,7 +83,7 @@ defineExpose({
             placeholder="回款日期" />
         </template>
       </el-table-column>
-      <el-table-column label="款金额">
+      <el-table-column label="款金额">
         <template #default="scope">
           <el-input v-model="scope.row.amount" v-enter-number placeholder="回款金额">
             <template #prefix>

+ 24 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/config/SuperSonicConfig.java

@@ -0,0 +1,24 @@
+package com.management.platform.config;
+
+import lombok.Data;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Configuration;
+
+@Data
+@Configuration
+public class SuperSonicConfig {
+    @Value("${supersonic.use:false}")
+    private Boolean supersonicUse;
+
+    @Value("${supersonic.ip:localhost}")
+    private String supersonicIP;
+
+    @Value("${supersonic.port:9080}")
+    private String supersonicPort;
+
+    @Value("${supersonic.username:admin}")
+    private String supersonicUserName;
+
+    @Value("${supersonic.password:e6+jQ26AESREiBBuKM1u1A==}")
+    private String supersonicPassWord;
+}

+ 0 - 7
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/UserController.java

@@ -1,17 +1,12 @@
 package com.management.platform.controller;
 
 
-import com.alibaba.fastjson.JSONArray;
-import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.management.platform.constant.Constant;
 import com.management.platform.entity.*;
 import com.management.platform.mapper.*;
 import com.management.platform.service.*;
-import com.management.platform.util.ColorUtil;
 import com.management.platform.util.HttpRespMsg;
-
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.ldap.core.LdapTemplate;
@@ -30,8 +25,6 @@ import javax.naming.ldap.LdapContext;
 import javax.naming.ldap.SortControl;
 import javax.servlet.http.HttpServletRequest;
 import java.io.IOException;
-import java.time.LocalDate;
-import java.time.LocalDateTime;
 import java.util.*;
 
 /**

+ 1 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/vo/UserVO.java

@@ -32,4 +32,5 @@ public class UserVO extends User {
     private Integer num;//客户数量
     private Integer saleNum;//交易客户数量
 
+    private String supersonicToken;
 }

+ 1 - 1
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/ContactsServiceImpl.java

@@ -8,11 +8,11 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.management.platform.entity.*;
 import com.management.platform.entity.vo.ContactsVo;
 import com.management.platform.mapper.*;
 import com.management.platform.service.ContactsService;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.management.platform.service.SysFunctionService;
 import com.management.platform.service.WxCorpInfoService;
 import com.management.platform.util.ExcelUtil;

+ 61 - 3
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/UserServiceImpl.java

@@ -5,9 +5,11 @@ import com.alibaba.fastjson.JSONObject;
 import com.aliyun.dysmsapi20170525.models.SendSmsResponse;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.management.platform.config.SuperSonicConfig;
 import com.management.platform.constant.Constant;
 import com.management.platform.entity.*;
 import com.management.platform.entity.vo.SysRichFunction;
@@ -33,9 +35,7 @@ import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
-import org.springframework.http.HttpMethod;
-import org.springframework.http.HttpStatus;
-import org.springframework.http.ResponseEntity;
+import org.springframework.http.*;
 import org.springframework.ldap.core.LdapTemplate;
 import org.springframework.ldap.filter.EqualsFilter;
 import org.springframework.stereotype.Service;
@@ -241,6 +241,10 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
     @Resource
     private SysDictService sysDictService;
 
+    @Resource
+    private SuperSonicConfig  superSonicConfig;
+
+
     //登录网页端
     @Override
     public HttpRespMsg loginAdmin(String username, String password){
@@ -306,6 +310,31 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
                 userVO.setHasAuditDept(num>0);
                 //获取当前角色的权限菜单
                 setUserRoleMenu(userVO);
+                //获取supersonicToken
+                if(superSonicConfig.getSupersonicUse()){
+                    String superSonicToken = getSuperSonicToken();
+                    if(org.apache.commons.lang3.StringUtils.isBlank(superSonicToken)){
+                        httpRespMsg.setError(MessageUtils.message("user.supersonicLogin"));
+                        return httpRespMsg;
+                    }else{
+                        userVO.setSupersonicToken(superSonicToken);
+                        Integer count = sysConfigMapper.selectCount(new LambdaQueryWrapper<SysConfig>()
+                                .eq(SysConfig::getParamKey, "supersonicToken")
+                        );
+                        if(count > 0){
+                            sysConfigMapper.update(null,new LambdaUpdateWrapper<SysConfig>()
+                                    .eq(SysConfig::getParamKey, "supersonicToken")
+                                    .set(SysConfig::getParamValue, superSonicToken)
+                            );
+                        }else{
+                            SysConfig sysConfig = new SysConfig();
+                            sysConfig.setParamKey("supersonicToken");
+                            sysConfig.setParamValue(superSonicToken);
+                            sysConfigMapper.insert(sysConfig);
+                        }
+
+                    }
+                }
                 httpRespMsg.data = userVO;
             }else {
                 httpRespMsg.setError(MessageUtils.message("user.pwdError"));
@@ -314,6 +343,35 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
         return httpRespMsg;
     }
 
+    public String getSuperSonicToken(){
+        String token = "";
+        String apiUrl = "http://"+superSonicConfig.getSupersonicIP()+":"+superSonicConfig.getSupersonicPort()+"/api/auth/user/login";
+        HttpHeaders headers = new HttpHeaders();
+        headers.setContentType(MediaType.APPLICATION_JSON);
+        JSONObject params = new JSONObject();
+        params.put("name", superSonicConfig.getSupersonicUserName());
+        params.put("password", superSonicConfig.getSupersonicPassWord());
+        String requestBody = params.toJSONString();
+        HttpEntity<String> entity = new HttpEntity<>(requestBody, headers);
+        ResponseEntity<String> responseEntity = restTemplate.exchange(apiUrl, HttpMethod.POST, entity, String.class);
+
+        if (responseEntity.getStatusCode() == HttpStatus.OK) {
+            String responseBody = responseEntity.getBody();
+            System.out.println("Response from API: " + responseBody);
+            JSONObject jsonObject = JSONObject.parseObject(responseBody);
+            System.out.println("jsonObject== "+jsonObject);
+            if(jsonObject.getString("msg").equals("success") && jsonObject.getString("code").equals("200")){
+                token = jsonObject.get("data").toString();
+//                System.out.println("token=== "+token);
+            }else{
+                System.out.println("请求失败");
+            }
+        } else {
+            System.out.println("请求失败");
+        }
+        return token;
+    }
+
     @Override
     public HttpRespMsg loginAdminByThirdParty(String jobNumber, String token) {
         HttpRespMsg httpRespMsg;

+ 7 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/resources/application.yml

@@ -175,3 +175,10 @@ sftp:
 
 defaultcommonmodules:
   path: [/customer,/contacts,/tasks]
+
+supersonic:
+  use: true
+  ip: localhost
+  port: 9080
+  username: admin
+  password: e6+jQ26AESREiBBuKM1u1A==

+ 1 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/resources/i18n/messages.properties

@@ -13,6 +13,7 @@ user.roleNameRepeat=角色名称不能重复
 user.pwdError=密码错误
 user.NoPermission=您尚无权使用系统,请联系管理员。
 user.AccountDeactivation=您的账号已停用,无法操作
+user.supersonicLogin=supersonic登录失败
 #注册相关
 register.codeError=验证码不正确
 register.phoneExist=该电话号码已注册

+ 1 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/resources/i18n/messages_en_US.properties

@@ -13,6 +13,7 @@ user.pwdError=password error
 user.NoPermission=You are not authorized to use the system. Please contact the administrator.
 user.roleNameRepeat=The role name cannot be duplicate.
 user.AccountDeactivation=Your account has been deactivated, unable to operate.
+user.supersonicLogin=supersonic login fail
 #注册相关
 register.codeError=Incorrect verification code.
 register.phoneExist=The phone number is already registered.

+ 4 - 2
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectController.java

@@ -210,11 +210,13 @@ public class ProjectController {
                                    String plate7,
                                    String plate8,
                                    String plate9,
-                                   String plate10) {
+                                   String plate10,
+                                   @RequestParam(required = false,value = "deptIds") String deptIds) {
         return projectService.editProject(id, name, code, userId, inchargerId, isPublic, planStartDate, planEndDate, level, contractAmount,changeContractReason,
                 projectBaseCostData,projectKeyNodesData,
                  budget,customerId,chosenLeaders, associateDegrees, associateDegreeNames,
-                taskGpIncharge,auditUserIds, ccUserIds, category, projectDesc,projectMainId, providerIds, providerNames, request,projectSeparate,outputValue,deptId,onlyChangeParticipate,buId,manDay,manDayStartDate,reviwerId, plate1,plate2,plate3,plate4,plate5,plate6,plate7,plate8,plate9,plate10);
+                taskGpIncharge,auditUserIds, ccUserIds, category, projectDesc,projectMainId, providerIds, providerNames, request,projectSeparate,outputValue,deptId,onlyChangeParticipate,buId,manDay,manDayStartDate,reviwerId, plate1,plate2,plate3,plate4,plate5,plate6,plate7,plate8,plate9,plate10
+        ,deptIds);
     }
 
     @RequestMapping("/adjustBase")

+ 4 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/Project.java

@@ -8,6 +8,7 @@ import com.fasterxml.jackson.annotation.JsonFormat;
 import com.fasterxml.jackson.annotation.JsonInclude;
 import com.management.platform.config.PropertyMsg;
 import com.management.platform.entity.vo.GroupEstimatedWorkVO;
+import com.management.platform.entity.vo.ProjectDeptInfo;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
@@ -487,6 +488,9 @@ public class Project extends Model<Project> {
     @TableField(exist = false)
     private String reviwerName;
 
+    @TableField(exist = false)
+    private List<ProjectDeptInfo> departmentList;
+
 
     @Override
     protected Serializable pkVal() {

+ 28 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/ProjectDeptRelate.java

@@ -0,0 +1,28 @@
+package com.management.platform.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+public class ProjectDeptRelate extends Model<ProjectDeptRelate> {
+    private static final long serialVersionUID=1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 项目表主键
+     */
+    @TableField("project_id")
+    private Integer projectId;
+
+    @TableField(value = "department_id")
+    private Integer departmentId;
+}

+ 10 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/vo/ProjectDeptInfo.java

@@ -0,0 +1,10 @@
+package com.management.platform.entity.vo;
+
+import lombok.Data;
+
+@Data
+public class ProjectDeptInfo {
+    private Integer departmentId;
+    private String departmentName;
+    private Integer projectId;
+}

+ 5 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/DepartmentMapper.java

@@ -2,6 +2,7 @@ package com.management.platform.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.management.platform.entity.Department;
+import com.management.platform.entity.vo.ProjectDeptInfo;
 import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Update;
 
@@ -33,4 +34,8 @@ public interface DepartmentMapper extends BaseMapper<Department> {
 
     @Update("update department set superior_id = null where department_id = #{departmentId}")
     void updateNullSuperior(Integer departmentId);
+
+    List<ProjectDeptInfo> getNameWithProjectRelate(@Param("id") Integer id);
+
+    List<ProjectDeptInfo> getNameWithProjectRelates(@Param("projectIds") List<Integer> projectIds);
 }

+ 2 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ParticipationMapper.java

@@ -22,4 +22,6 @@ public interface ParticipationMapper extends BaseMapper<Participation> {
     List<ParticipationUser> getAllParticipator(@Param("projectIdList") List<Integer> projectIdList, Integer companyId);
 
     void deleteBatchByUserId(@Param("userIds") List<String> userIds);
+
+    void insertBatch(@Param("toAddList") List<Participation> toAddList);
 }

+ 11 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ProjectDeptRelateMapper.java

@@ -0,0 +1,11 @@
+package com.management.platform.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.management.platform.entity.ProjectDeptRelate;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+public interface ProjectDeptRelateMapper  extends BaseMapper<ProjectDeptRelate> {
+    void insertBatch(@Param("projectId") Integer projectId,@Param("deptList") List<String> deptList);
+}

+ 2 - 2
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ProjectService.java

@@ -1,7 +1,6 @@
 package com.management.platform.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
-import com.management.platform.entity.ProFunWorkContext;
 import com.management.platform.entity.Project;
 import com.management.platform.entity.ProjectSeparate;
 import com.management.platform.entity.vo.OvertimeListVO;
@@ -61,7 +60,8 @@ public interface ProjectService extends IService<Project> {
                             String plate7,
                             String plate8,
                             String plate9,
-                            String plate10);
+                            String plate10,
+                            String deptIds);
 
     HttpRespMsg deleteProject(Integer id, Integer force);
 

+ 34 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java

@@ -255,6 +255,9 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
     @Resource
     private TaskExecutorService taskExecutorService;
 
+    @Resource
+    private ProjectDeptRelateMapper projectDeptRelateMapper;
+
     @Value(value = "${upload.path}")
     private String path;
     @Value("${configEnv.isDev}")
@@ -1458,6 +1461,12 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                     reportList = reportMapper.selectList(new QueryWrapper<Report>().select("id, create_date, project_id, working_time").in("project_id",projectIds).and(wrapper -> wrapper.eq("state", 0).or().eq("state", 1).or().eq("state", 3)));
                 }
             }
+            //获取项目关联的部门
+            List<ProjectDeptInfo> departments = departmentMapper.getNameWithProjectRelates(projectIds);
+            Map<Integer, List<ProjectDeptInfo>> deptRelateMap = new HashMap<>();
+            if(CollectionUtils.isNotEmpty(departments)){
+                deptRelateMap = departments.stream().collect(Collectors.groupingBy(ProjectDeptInfo::getProjectId));
+            }
             for (Project project : projectList) {
                 //todo:计算项目预算工时
                 if(project.getManDay()!=null){
@@ -1579,6 +1588,8 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                 maxFillDate.ifPresent(projectVO::setMaxFilingDate);
                 minFillDate.ifPresent(projectVO::setMinFilingDate);
 
+                //添加项目关联部门信息
+                projectVO.setDepartmentList(deptRelateMap.get(project.getId()));
                 list.add(projectVO);
             }
             long end = System.currentTimeMillis();
@@ -1675,7 +1686,8 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                                    String plate7,
                                    String plate8,
                                    String plate9,
-                                   String plate10) {
+                                   String plate10,
+                                   String deptIds) {
         HttpRespMsg httpRespMsg = new HttpRespMsg();
         User user = userMapper.selectById(request.getHeader("Token"));
         Integer companyId = user.getCompanyId();
@@ -2309,6 +2321,23 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                 projectMapper.cleanPublicProjectData(id);
             }
         }
+        //250214新需求:添加项目部门关联关系
+        if(org.apache.commons.lang3.StringUtils.isNotBlank(deptIds)){
+            List<String> deptList = null;
+            try {
+                deptList = Arrays.asList(deptIds.split(","));
+            } catch (Exception e) {
+                httpRespMsg.setError("部门解析失败");
+                return httpRespMsg;
+            }
+            projectDeptRelateMapper.delete(new LambdaQueryWrapper<ProjectDeptRelate>()
+                    .eq(ProjectDeptRelate::getProjectId,id)
+            );
+            if(CollectionUtils.isNotEmpty(deptList)){
+                projectDeptRelateMapper.insertBatch(id,deptList);
+            }
+
+        }
         return httpRespMsg;
     }
 
@@ -3544,6 +3573,10 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
             }
         }
         project.setPlateMap(map);
+
+        //设置项目关联部门
+        List<ProjectDeptInfo> departmentList = departmentMapper.getNameWithProjectRelate(project.getId());
+        project.setDepartmentList(departmentList);
         HttpRespMsg msg = new HttpRespMsg();
         msg.data = project;
 

+ 159 - 3
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/UserServiceImpl.java

@@ -21,6 +21,7 @@ import me.chanjar.weixin.mp.api.WxMpService;
 import me.chanjar.weixin.mp.api.impl.WxMpServiceImpl;
 import me.chanjar.weixin.mp.bean.template.WxMpTemplateData;
 import me.chanjar.weixin.mp.bean.template.WxMpTemplateMessage;
+import org.apache.commons.collections.CollectionUtils;
 import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
 import org.apache.poi.ss.usermodel.*;
 import org.apache.poi.xssf.usermodel.XSSFCell;
@@ -218,6 +219,9 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
     @Resource
     private UserReportDeptService userReportDeptService;
 
+    @Resource
+    private ProjectDeptRelateMapper projectDeptRelateMapper;
+
     @Resource
     private LdapTemplate ldapTemplate;
     @Resource
@@ -1434,6 +1438,22 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
                             });
                             userReportDeptService.saveBatch(userReportDeptList);
                         }
+                        //新增用户,查看项目部门关联表,若存在有直属部门,直接加入
+                        if(null != departmentId && 0 != departmentId){
+                            List<ProjectDeptRelate> projectDeptRelates = projectDeptRelateMapper.selectList(new LambdaQueryWrapper<ProjectDeptRelate>()
+                                    .eq(ProjectDeptRelate::getDepartmentId, departmentId)
+                            );
+                            if(CollectionUtils.isNotEmpty(projectDeptRelates)){
+                                List<Participation> toAddList = new ArrayList<>(projectDeptRelates.size());
+                                for (ProjectDeptRelate relate : projectDeptRelates) {
+                                    Participation participation = new Participation();
+                                    participation.setProjectId(relate.getProjectId());
+                                    participation.setUserId(String.valueOf(id));
+                                    toAddList.add(participation);
+                                }
+                                participationMapper.insertBatch(toAddList);
+                            }
+                        }
                     }
                 }
             } else {
@@ -1473,6 +1493,33 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
                     superiorChange = true;
                 }
 
+                //更新操作,判断前后部门是否变化,有变化则删除原部门关联项目下的该用户,新增到新部门关联的项目下
+                if(oldUser.getDepartmentId() != (departmentId == null ? 0 : departmentId)){
+                    List<ProjectDeptRelate> oldProjectDeptRelates = projectDeptRelateMapper.selectList(new LambdaQueryWrapper<ProjectDeptRelate>()
+                            .eq(ProjectDeptRelate::getDepartmentId, oldUser.getDepartmentId())
+                    );
+                    List<ProjectDeptRelate> newProjectDeptRelates = projectDeptRelateMapper.selectList(new LambdaQueryWrapper<ProjectDeptRelate>()
+                            .eq(ProjectDeptRelate::getDepartmentId, departmentId)
+                    );
+                    List<Integer> originalProjectIds = oldProjectDeptRelates.stream().map(ProjectDeptRelate::getProjectId).collect(Collectors.toList());
+                    if(CollectionUtils.isNotEmpty(originalProjectIds)){
+                        participationMapper.delete(new LambdaQueryWrapper<Participation>()
+                                .eq(Participation::getUserId,targetId)
+                                .in(Participation::getProjectId,originalProjectIds)
+                        );
+                    }
+                    List<Participation> toAddList = new ArrayList<>(newProjectDeptRelates.size());
+                    for (ProjectDeptRelate relate : newProjectDeptRelates) {
+                        Participation participation = new Participation();
+                        participation.setProjectId(relate.getProjectId());
+                        participation.setUserId(targetId);
+                        toAddList.add(participation);
+                    }
+                    if(CollectionUtils.isNotEmpty(toAddList)){
+                        participationMapper.insertBatch(toAddList);
+                    }
+                }
+
                 userMapper.updateById(oldUser
                         .setName(name)
                         .setPhone(phone)
@@ -1813,7 +1860,8 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
                     httpRespMsg.setError(MessageUtils.message("register.phoneUsed")+":" + userPhoneList.stream().filter(u->!u.getCompanyId().equals(companyId)).map(User::getPhone).collect(Collectors.joining(",")));
                     return httpRespMsg;
                 }
-
+                List<User> existUsers= new ArrayList<>();
+                List<User> unExistUsers = new ArrayList<>();
                 for (User oldUser : userPhoneList) {
                     for (User newUser : userList) {
                         if (oldUser.getPhone().equals(newUser.getPhone())) {
@@ -1825,12 +1873,75 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
                                     .setMonthCost(null)
                                     .setCost(null)
                                     .setSalaryType(null);
+                            existUsers.add(newUser);
                             break;
+                        }else{
+                            if(null != newUser.getDepartmentId() && 0 != newUser.getDepartmentId()){
+                                unExistUsers.add(newUser);
+                            }
                         }
                     }
                 }
 
+                //已存在的用户中查看部门是否有变化,变化则删除原部门关联项目的参与人,新增新部门关联项目
+                List<Participation> toAddList = new ArrayList<>();
+                if(CollectionUtils.isNotEmpty(existUsers)){
+                    List<Integer> collect = existUsers.stream().map(User::getDepartmentId).collect(Collectors.toList());
+                    Map<String, User> existMap = existUsers.stream().collect(Collectors.toMap(User::getId, t -> t));
+                    List<User> oldDeptCheckUsers = userMapper.selectList(new LambdaQueryWrapper<User>().in(User::getId, collect)
+                            .ne(User::getDepartmentId,0)
+                    );
+                    for (User oldDeptCheckUser : oldDeptCheckUsers) {
+                        User user = existMap.get(oldDeptCheckUser.getId());
+                        if(null != user && null != user.getDepartmentId() && 0!= user.getDepartmentId()){
+                            if(!Objects.equals(oldDeptCheckUser.getDepartmentId(), user.getDepartmentId())){
+                                List<ProjectDeptRelate> oldProjectDeptRelates = projectDeptRelateMapper.selectList(new LambdaQueryWrapper<ProjectDeptRelate>()
+                                        .eq(ProjectDeptRelate::getDepartmentId, oldDeptCheckUser.getDepartmentId())
+                                );
+                                List<ProjectDeptRelate> newProjectDeptRelates = projectDeptRelateMapper.selectList(new LambdaQueryWrapper<ProjectDeptRelate>()
+                                        .eq(ProjectDeptRelate::getDepartmentId, user.getDepartmentId())
+                                );
+                                List<Integer> originalProjectIds = oldProjectDeptRelates.stream().map(ProjectDeptRelate::getProjectId).collect(Collectors.toList());
+                                participationMapper.delete(new LambdaQueryWrapper<Participation>()
+                                        .eq(Participation::getUserId,user.getId())
+                                        .in(Participation::getProjectId,originalProjectIds)
+                                );
+                                for (ProjectDeptRelate relate : newProjectDeptRelates) {
+                                    Participation participation = new Participation();
+                                    participation.setProjectId(relate.getProjectId());
+                                    participation.setUserId(user.getId());
+                                    toAddList.add(participation);
+                                }
+                            }
+                        }
+
+                    }
+
+                }
+
+                //原先不存在用户直接往新部门关联项目中添加
+                if(CollectionUtils.isNotEmpty(unExistUsers)){
+                    for (User unExistUser : unExistUsers) {
+                        List<ProjectDeptRelate> relates = projectDeptRelateMapper.selectList(new LambdaQueryWrapper<ProjectDeptRelate>()
+                                .eq(ProjectDeptRelate::getDepartmentId, unExistUser.getDepartmentId())
+                        );
+                        for (ProjectDeptRelate relate : relates) {
+                            Participation participation = new Participation();
+                            participation.setUserId(unExistUser.getId());
+                            participation.setProjectId(relate.getProjectId());
+                            toAddList.add(participation);
+                        }
+                    }
+                }
+                if(CollectionUtils.isNotEmpty(toAddList)){
+                    toAddList = toAddList.stream().distinct().collect(Collectors.toList());
+                    participationMapper.insertBatch(toAddList);
+                }
+
+
+
                 saveOrUpdateBatch(userList);
+
             }
         } catch (IOException e) {
             e.printStackTrace();
@@ -2374,13 +2485,58 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
                 String deptCascade = deptId == null ?
                         convertDepartmentIdToCascade(0) :
                         convertDepartmentIdToCascade(deptId);
-                for (String id : array) {
+                List<User> users = userMapper.selectList(new LambdaQueryWrapper<User>()
+                        .in(User::getId, array)
+                );
+                List<Integer> oldDeptIds = users.stream().map(User::getDepartmentId).distinct()
+                        .collect(Collectors.toList());
+                List<ProjectDeptRelate> projectDeptRelates = projectDeptRelateMapper.selectList(new LambdaQueryWrapper<ProjectDeptRelate>()
+                        .in(ProjectDeptRelate::getDepartmentId, oldDeptIds)
+                );
+                Map<Integer, List<ProjectDeptRelate>> relateMap = new HashMap<>();
+                if(CollectionUtils.isNotEmpty(projectDeptRelates)){
+                    //涉及到项目关联的原部门相关的参与人要删除
+                    relateMap = projectDeptRelates.stream()
+                            .collect(Collectors.groupingBy(ProjectDeptRelate::getDepartmentId));
+                }
+                for (User user : users) {
+                    //删除该员工原部门关联的项目
+                    List<ProjectDeptRelate> tmpRelates = relateMap.get(user.getDepartmentId());
+                    if(CollectionUtils.isNotEmpty(tmpRelates)){
+                        participationMapper.delete(new LambdaQueryWrapper<Participation>()
+                                .eq(Participation::getUserId,user.getId())
+                                .in(Participation::getProjectId,tmpRelates.stream().map(ProjectDeptRelate::getProjectId).collect(Collectors.toList()))
+                        );
+                    }
                     User u = new User();
-                    u.setId(id);
+                    u.setId(user.getId());
                     u.setDepartmentId(deptId==null?0:deptId);
                     u.setDepartmentCascade(deptCascade);
                     userList.add(u);
                 }
+                //查看新部门关联的项目,向这些项目中插入这些人
+                List<ProjectDeptRelate> newDeptRelates = projectDeptRelateMapper.selectList(new LambdaQueryWrapper<ProjectDeptRelate>()
+                        .eq(ProjectDeptRelate::getDepartmentId, deptId)
+                );
+                if(CollectionUtils.isNotEmpty(newDeptRelates)){
+                    List<Participation> toAddList = new ArrayList<>();
+                    for (ProjectDeptRelate newDeptRelate : newDeptRelates) {
+                        users.forEach(tmpUser->{
+                            Participation participation = new Participation();
+                            participation.setUserId(tmpUser.getId());
+                            participation.setProjectId(newDeptRelate.getProjectId());
+                            toAddList.add(participation);
+                        });
+                    }
+                    participationMapper.insertBatch(toAddList);
+                }
+//                for (String id : array) {
+//                    User u = new User();
+//                    u.setId(id);
+//                    u.setDepartmentId(deptId==null?0:deptId);
+//                    u.setDepartmentCascade(deptCascade);
+//                    userList.add(u);
+//                }
                 updateBatchById(userList);
             } else {
                 //msg.setError("人员不能为空");

+ 15 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/DepartmentMapper.xml

@@ -140,4 +140,19 @@
         GROUP BY b.project_id, a.department_id
         having IFNULL(SUM(b.custom_data),0) > 0
     </select>
+    <select id="getNameWithProjectRelate" resultType="com.management.platform.entity.vo.ProjectDeptInfo">
+        select department.department_id,department.department_name
+        from department
+                 left join project_dept_relate pdr on department.department_id = pdr.department_id
+        where pdr.project_id = #{id}
+    </select>
+    <select id="getNameWithProjectRelates" resultType="com.management.platform.entity.vo.ProjectDeptInfo">
+        select department.department_id,department.department_name,pdr.project_id
+        from department
+                 left join project_dept_relate pdr on department.department_id = pdr.department_id
+        where pdr.project_id in
+        <foreach collection="projectIds" item="projectId" separator="," open="(" close=")">
+            #{projectId}
+        </foreach>
+    </select>
 </mapper>

+ 6 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ParticipationMapper.xml

@@ -13,6 +13,12 @@
     <sql id="Base_Column_List">
         id, user_id, project_id
     </sql>
+    <insert id="insertBatch">
+        insert into participation(user_id, project_id) VALUES
+        <foreach collection="toAddList" item="participation" separator=",">
+           (#{participation.userId},#{participation.projectId})
+        </foreach>
+    </insert>
     <delete id="deleteBatchByUserId">
         delete from participation where user_id in
         <foreach collection="userIds" item="userId" separator="," open="(" close=")">

+ 12 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ProjectDeptRelateMapper.xml

@@ -0,0 +1,12 @@
+<?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="com.management.platform.mapper.ProjectDeptRelateMapper">
+
+    <insert id="insertBatch">
+        insert into project_dept_relate(project_id, department_id) VALUES
+        <foreach collection="deptList" item="deptId" separator=",">
+            (#{projectId},#{deptId})
+        </foreach>
+    </insert>
+</mapper>

+ 3 - 3
fhKeeper/formulahousekeeper/timesheet/src/views/corpreport/list.vue

@@ -488,7 +488,7 @@
                     </template>
                 </el-table-column>
                 <!--开通合同管理模块的显示已回款金额-->
-                <el-table-column prop="payment" :label="$t('yi-hui-kuan-jin-e')" width="100" align="right" v-if="user.company.packageContract==1">
+                <el-table-column prop="payment" :label="$t('yi-hui-kuan-jin-e')" width="100" align="right" v-if="user.company.packageContract==1 && user.companyId != 4811">
                   <template slot-scope="scope">
                         {{scope.row.payment.toFixed(2)}}
                     </template>
@@ -517,12 +517,12 @@
                     </template>
                   </template>
                 </el-table-column>
-                <el-table-column  :label="$t('yiHuiKuanLiRun')"  width="100" align="right" v-if="user.company.packageContract == 1">
+                <el-table-column :label="$t('yiHuiKuanLiRun')"  width="100" align="right" v-if="user.company.packageContract == 1 && user.companyId != 4811">
                   <template slot-scope="scope">
                         {{((scope.row.payment==null?0:scope.row.payment) - (scope.row.budget)).toFixed(2)}}
                     </template>
                 </el-table-column>
-                <el-table-column  :label="$t('yiHuiKuanLiRunShuai')"  width="120" align="right" v-if="user.company.packageContract==1">
+                <el-table-column  :label="$t('yiHuiKuanLiRunShuai')"  width="120" align="right" v-if="user.company.packageContract==1 && user.companyId != 4811">
                   <template slot-scope="scope">
                         {{(scope.row.payment==null||scope.row.payment==0)?'-':((scope.row.payment - scope.row.budget)*100/scope.row.payment).toFixed(1)+"%"}}
                     </template>

+ 13 - 7
fhKeeper/formulahousekeeper/timesheet/src/views/expense/expense.vue

@@ -420,6 +420,7 @@
                 <span v-if="scope.row.reviewProcess == 1">{{ $t('daiDiErShenHeRenShenHe') }}</span>
                 <span v-if="scope.row.reviewProcess == 2">{{ $t('shenHeWanCheng') }}</span>
                 <span v-if="scope.row.reviewProcess == 3">未提交</span>
+                <span v-if="scope.row.reviewProcess == 4">已驳回</span>
               </template>
             </el-table-column>
             <!-- <el-table-column prop="denyReason" :label="$t('dismissreason')" width="180">
@@ -497,7 +498,7 @@
           <!-- 第一审核人 -->
           <el-form-item :label="$t('di-yi-shen-he-ren')" v-if="auditTypeItem.auditType == 2">
             <el-select v-if="user.userNameNeedTranslate != '1'" v-model="ParticularsList.firstCheckerId"
-              :placeholder="$t('message.Pleaseselectareviewer')" style="width: 150px" :disabled="ParticularsList.reviewProcess > 0"
+              :placeholder="$t('message.Pleaseselectareviewer')" style="width: 150px" :disabled="ParticularsList.reviewProcess > 0 || (flg || ParticularsList.ownerId == ParticularsList.operatorId)"
               filterable="true">
               <span v-for="(item, index) in users" :key="index">
                 <el-option :label="item.name" :value="item.id"></el-option>
@@ -505,13 +506,13 @@
             </el-select>
 
             <selectCat v-if="user.userNameNeedTranslate == '1'" :size="'medium'" :widthStr="'150'" :distinction="'6'"
-              :subject="users" :subjectId="ParticularsList.firstCheckerId" ref="selectCat" :disabled="ParticularsList.reviewProcess > 0"
+              :subject="users" :subjectId="ParticularsList.firstCheckerId" ref="selectCat" :disabled="ParticularsList.reviewProcess > 0 || (flg || ParticularsList.ownerId == ParticularsList.operatorId)"
               @selectCal="selectCal"></selectCat>
           </el-form-item>
           <!-- 第二审核人 -->
           <el-form-item :label="$t('di-er-shen-he-ren')" v-if="auditTypeItem.auditType == 2">
             <el-select v-if="user.userNameNeedTranslate != '1'" v-model="ParticularsList.secondCheckerId"
-              :placeholder="$t('message.Pleaseselectareviewer')" style="width: 150px" :disabled="ParticularsList.reviewProcess > 1"
+              :placeholder="$t('message.Pleaseselectareviewer')" style="width: 150px" :disabled="ParticularsList.reviewProcess > 1 || (flg || ParticularsList.ownerId == ParticularsList.operatorId)"
               filterable="true">
               <span v-for="(item, index) in users" :key="index">
                 <el-option :label="item.name" :value="item.id"></el-option>
@@ -519,7 +520,7 @@
             </el-select>
 
             <selectCat v-if="user.userNameNeedTranslate == '1'" :size="'medium'" :widthStr="'150'" :distinction="'7'"
-              :subject="users" :subjectId="ParticularsList.secondCheckerId" ref="selectCat" :disabled="ParticularsList.reviewProcess > 1"
+              :subject="users" :subjectId="ParticularsList.secondCheckerId" ref="selectCat" :disabled="ParticularsList.reviewProcess > 1 || (flg || ParticularsList.ownerId == ParticularsList.operatorId)"
               @selectCal="selectCal"></selectCat>
           </el-form-item>
 
@@ -1609,7 +1610,7 @@ export default {
     },
 
     denyReason(item) {
-      if (this.auditTypeItem.auditType == 0) {
+      if (this.auditTypeItem.auditType == 0 || this.auditTypeItem.auditType == 2) {
         this.denyForm.id = item.id
         this.denyForm.reason = ''
         // this.denyReasonDialog = true
@@ -1688,7 +1689,11 @@ export default {
       },
         res => {
           if (res.code == "ok") {
-            this.expenseMainTypes = res.data
+            if(this.user.roleName == '费用管理员') {
+              this.expenseMainTypes = res.data
+            } else {
+              this.expenseMainTypes = res.data.filter(item => item.id != 14454)
+            }
             this.expenseMainTypeValue = this.expenseMainTypes[0].id
           } else {
             this.$message({
@@ -1814,7 +1819,8 @@ export default {
             // this.users = res.data.records;
             const { id } = JSON.parse(sessionStorage.getItem('user'))
             this.users = res.data;
-            this.usersNoInfo = res.data.filter(item => item.id != id)
+            // this.usersNoInfo = res.data.filter(item => item.id != id)
+            this.usersNoInfo = res.data
             if (!this.permissions.costAudit) {
               this.addForm.ownerId = this.user.id;
               this.addForm.status = 1;

+ 14 - 5
fhKeeper/formulahousekeeper/timesheet/src/views/project/list.vue

@@ -38,7 +38,7 @@
                 </el-form-item>
                 <!-- 分类筛选 -->
                 <el-form-item >
-                    <span style="margin-left:5px;margin-right:5px;color:#606266;">{{ $t('fen-lei') }}</span>
+                    <span style="margin-left:5px;margin-right:5px;color:#606266;">{{ user.companyId == 4811 ? '项目分类' : $t('fen-lei') }}</span>
                     <el-select v-model="statusClf" style="width:140px;"  :placeholder="$t('defaultText.pleaseChoose')" clearable @change="searchClfList" size="small">
                         <el-option v-for="item in baseClfList" :key="item.id" :label="item.name" :value="item.id" ></el-option>
                     </el-select>
@@ -172,6 +172,8 @@
                     </template>
             </el-table-column> -->
             <el-table-column prop="projectCode" :label="user.companyId == '7030' ? '项目令号' : $t('Itemno')" sortable="custom" width="150"></el-table-column>
+            <el-table-column prop="projectMainName" :label="$t('zhu-xiang-mu')" sortable="custom" min-width="250" v-if="user.timeType.mainProjectState == '1'">
+            </el-table-column>
             <el-table-column prop="contractCode" :label="$t('contractno')" width="200" v-if="user.companyId == '936'">
                 <template slot-scope="scope">
                     <!-- <div v-if="scope.row.projectSeparate">
@@ -241,8 +243,6 @@
                     <TranslationOpenDataText type='departmentName' :openid='scope.row.departmentName'></TranslationOpenDataText>
                 </template>
             </el-table-column>
-            <el-table-column prop="projectMainName" :label="$t('zhu-xiang-mu')" sortable="custom" min-width="250" v-if="user.timeType.mainProjectState == '1'">
-            </el-table-column>
             <el-table-column prop="inchargerName" :label="$t('projectmanager')" sortable="custom" min-width="150">
                 <template slot-scope="scope">
                     <el-link type="primary" :underline="false" @click="showUser(scope.row.inchargerId)">
@@ -3980,7 +3980,6 @@ a {
 
             //确定选择参与人
             chooseParticip() {
-                this.chooseParticipVisible = false;
                 var chosenList = this.$refs.chooseMembTree.getCheckedNodes();
                 if(this.searchPersonnelFlg) {
                     chosenList = [...chosenList, ...this.chosenListBackup]
@@ -4005,6 +4004,11 @@ a {
                 console.log(this.addForm.userId)
                 console.log(this.addForm.userNames)
                 console.log(this.addFormUserNames)
+
+                console.log(chosenList, '<===== chosenList')
+                // console.log(parentId)
+                this.addForm.deptIds = [...new Set(chosenList.map(item => item.parentId))].filter(item => item != 0);
+                this.chooseParticipVisible = false;
             },
 
             //选中相关领导
@@ -5047,6 +5051,7 @@ a {
                         manDay:0,
                         fromOutside: 0,
                         // deptId: []
+                        deptIds: []
                     }
                     this.estimatedWorkTime=''
                     for(var i in this.dataList) {
@@ -5183,7 +5188,8 @@ a {
                         manDay:item.manDay==null?0:item.manDay,
                         manDayStartDate:item.manDayStartDate,
                         manDayDisable:item.manDay,
-                        fromOutside:item.fromOutside
+                        fromOutside:item.fromOutside,
+                        deptIds: (item.departmentList || []).map(item => item.departmentId)
                     }
                     for(var i in this.dataList) {
                         var str = 'plate' + (+i + 1)
@@ -5601,6 +5607,9 @@ a {
                         if (this.addForm.reviwerId) {
                             formData.append('reviwerId', this.addForm.reviwerId);
                         }
+
+                        const deptListNew = this.addForm.deptIds.filter(item => item)
+                        formData.append('deptIds', deptListNew.join(','))
                         this.http.uploadFile(this.port.project.add,formData,
                         res => {
                             this.addLoading = false;