浏览代码

Merge remote-tracking branch 'origin/master'

yusm 2 月之前
父节点
当前提交
7ca0ca885a
共有 22 个文件被更改,包括 512 次插入172 次删除
  1. 33 8
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/TableColumnController.java
  2. 4 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/BusReportStore.java
  3. 9 4
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/Company.java
  4. 10 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/CusReportForm.java
  5. 5 5
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/ReportFormAccess.java
  6. 3 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/bo/FormStorePageBO.java
  7. 7 2
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/CusTableColumnService.java
  8. 264 64
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/CusTableColumnServiceImpl.java
  9. 4 4
      fhKeeper/formulahousekeeper/management-crm/src/main/resources/mapper/BusReportStoreMapper.xml
  10. 6 6
      fhKeeper/formulahousekeeper/management-crm/src/main/resources/mapper/ReportFormAccessMapper.xml
  11. 5 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectController.java
  12. 29 38
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportController.java
  13. 27 12
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/UserController.java
  14. 13 7
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/TimeType.java
  15. 2 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ProjectService.java
  16. 10 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java
  17. 0 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/WxCorpInfoServiceImpl.java
  18. 4 8
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/TaskMapper.xml
  19. 5 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/TimeTypeMapper.xml
  20. 1 1
      fhKeeper/formulahousekeeper/timesheet/src/i18n/zh.json
  21. 5 0
      fhKeeper/formulahousekeeper/timesheet/src/views/settings/timetype.vue
  22. 66 11
      fhKeeper/formulahousekeeper/timesheet/src/views/team/index.vue

+ 33 - 8
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/TableColumnController.java

@@ -3,11 +3,12 @@ package com.management.platform.controller;
 import com.management.platform.entity.BusReportStore;
 import com.management.platform.entity.CusReportForm;
 import com.management.platform.entity.bo.FormStorePageBO;
-import com.management.platform.entity.bo.PageBO;
 import com.management.platform.service.CusTableColumnService;
 import com.management.platform.util.HttpRespMsg;
-import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.*;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
 
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
@@ -19,6 +20,30 @@ public class TableColumnController {
     @Resource
     private CusTableColumnService cusTableColumnService;
 
+    /**获取所有文件夹*/
+    @PostMapping("/getAllStoresTree")
+    public HttpRespMsg getAllStoresTree(HttpServletRequest request){
+        HttpRespMsg msg = new HttpRespMsg();
+        msg = cusTableColumnService.getAllStoresTree(request);
+        return msg;
+    }
+
+    @PostMapping("/moveFormStore")
+    public HttpRespMsg moveFormStore(@RequestParam(value = "formId")Integer formId
+            ,@RequestParam(value = "targetStoreId")Integer targetStoreId
+            ,HttpServletRequest request){
+        HttpRespMsg msg = new HttpRespMsg();
+        msg = cusTableColumnService.moveFormStore(formId,targetStoreId,request);
+        return msg;
+    }
+
+    @PostMapping("/getFormResByFormId")
+    public HttpRespMsg getFormResByFormId(@RequestParam(value = "formId")Integer formId,HttpServletRequest request){
+        HttpRespMsg msg = new HttpRespMsg();
+        msg = cusTableColumnService.getFormResByFormId(formId,request);
+        return msg;
+    }
+
 
     @PostMapping("/deleteReportForm")
     public HttpRespMsg deleteReportForm(@RequestParam(value = "formId")Integer formId,HttpServletRequest request){
@@ -29,7 +54,7 @@ public class TableColumnController {
 
     /**更新报表*/
     @PostMapping("/addOrUpdateReportForm")
-    public HttpRespMsg addOrUpdateReportForm(@Validated @RequestBody CusReportForm cusReportForm, HttpServletRequest request){
+    public HttpRespMsg addOrUpdateReportForm(CusReportForm cusReportForm, HttpServletRequest request){
         HttpRespMsg msg = new HttpRespMsg();
         msg = cusTableColumnService.addOrUpdateReportForm(cusReportForm,request);
         return msg;
@@ -44,15 +69,15 @@ public class TableColumnController {
 
 
     /**更新文件夹*/
-    @PostMapping("/addOrUpdateFormStore")
-    public HttpRespMsg addOrUpdateFormStore(@Validated @RequestBody BusReportStore busReportStore, HttpServletRequest request){
+    @RequestMapping("/addOrUpdateFormStore")
+    public HttpRespMsg addOrUpdateFormStore(BusReportStore busReportStore, HttpServletRequest request){
         HttpRespMsg msg = new HttpRespMsg();
         msg = cusTableColumnService.addOrUpdateFormStore(busReportStore,request);
         return msg;
     }
 
-    @PostMapping("getFormStorePage")
-    public HttpRespMsg getFormStorePage(@RequestBody @Validated PageBO<FormStorePageBO> queryBO,HttpServletRequest request){
+    @RequestMapping("getFormStorePage")
+    public HttpRespMsg getFormStorePage(FormStorePageBO queryBO,HttpServletRequest request){
         HttpRespMsg msg = new HttpRespMsg();
         msg = cusTableColumnService.getFormStorePage(queryBO,request);
         return msg;

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

@@ -11,6 +11,7 @@ import lombok.experimental.Accessors;
 import org.springframework.format.annotation.DateTimeFormat;
 
 import java.util.Date;
+import java.util.List;
 
 @Data
 @EqualsAndHashCode(callSuper = false)
@@ -74,4 +75,7 @@ public class BusReportStore extends Model<BusReportStore> {
     /**所属公司id*/
     @TableField("company_id")
     private Integer companyId;
+
+    @TableField(exist = false)
+    private List<BusReportStore> childStoreList;
 }

+ 9 - 4
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/Company.java

@@ -1,15 +1,16 @@
 package com.management.platform.entity;
 
 import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.extension.activerecord.Model;
-import com.baomidou.mybatisplus.annotation.TableId;
-import java.time.LocalDateTime;
 import com.baomidou.mybatisplus.annotation.TableField;
-import java.io.Serializable;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
 
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
 /**
  * <p>
  * 
@@ -152,6 +153,10 @@ public class Company extends Model<Company> {
     @TableField("is_exist_business")
     private Integer isExistBusiness;
 
+    /**版本控制 1专业 2旗舰*/
+    @TableField("version_control")
+    private Integer versionControl;
+
     @Override
     protected Serializable pkVal() {
         return this.id;

+ 10 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/CusReportForm.java

@@ -50,6 +50,16 @@ public class CusReportForm extends Model<CusReportForm> {
     @TableField("company_id")
     private Integer companyId;
 
+    @TableField("form_json")
+    private String formJson;
+
+    @TableField(exist = false)
+    private List<Integer> departmentIds;
+
+
+    @TableField(exist = false)
+    private List<String> userIds;
+
     @TableField(exist = false)
     private List<ReportFormAccess> deptAccessList;
 

+ 5 - 5
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/ReportFormAccess.java

@@ -23,18 +23,18 @@ public class ReportFormAccess extends Model<ReportFormAccess> {
     private Integer accessType;
 
     /**关联报表id*/
-    @TableField("relate_from_id")
+    @TableField("relate_form_id")
     private Integer relateFormId;
 
-    /**1人员 2部门*/
+    /**人员id*/
     @TableField("user_id")
-    private Integer userId;
+    private String userId;
 
-    /**1人员 2部门*/
+    /**部门id*/
     @TableField("department_id")
     private Integer departmentId;
 
-    /**1人员 2部门*/
+    /**公司id*/
     @TableField("company_id")
     private Integer companyId;
 

+ 3 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/bo/FormStorePageBO.java

@@ -11,4 +11,7 @@ public class FormStorePageBO {
     private String userId;
     private Integer departmentId;
     private Integer companyId;
+
+    private Integer pageIndex;
+    private Integer pageSize;
 }

+ 7 - 2
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/CusTableColumnService.java

@@ -5,7 +5,6 @@ import com.management.platform.entity.BusReportStore;
 import com.management.platform.entity.CusReportForm;
 import com.management.platform.entity.CusTableColumn;
 import com.management.platform.entity.bo.FormStorePageBO;
-import com.management.platform.entity.bo.PageBO;
 import com.management.platform.util.HttpRespMsg;
 
 import javax.servlet.http.HttpServletRequest;
@@ -19,7 +18,7 @@ public interface CusTableColumnService extends IService<CusTableColumn> {
 
     HttpRespMsg getRelateBusTableByFromTable(String tableName, HttpServletRequest request);
 
-    HttpRespMsg getFormStorePage(PageBO<FormStorePageBO> queryBO,HttpServletRequest request);
+    HttpRespMsg getFormStorePage(FormStorePageBO queryBO,HttpServletRequest request);
 
     HttpRespMsg addOrUpdateFormStore(BusReportStore busReportStore, HttpServletRequest request);
 
@@ -28,4 +27,10 @@ public interface CusTableColumnService extends IService<CusTableColumn> {
     HttpRespMsg deleteFormStore(Integer storeId,HttpServletRequest request);
 
     HttpRespMsg deleteReportForm(Integer formId, HttpServletRequest request);
+
+    HttpRespMsg getFormResByFormId(Integer formId, HttpServletRequest request);
+
+    HttpRespMsg moveFormStore(Integer formId,Integer targetStoreId, HttpServletRequest request);
+
+    HttpRespMsg getAllStoresTree(HttpServletRequest request);
 }

+ 264 - 64
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/CusTableColumnServiceImpl.java

@@ -6,19 +6,25 @@ 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.bo.FormStorePageBO;
-import com.management.platform.entity.bo.PageBO;
 import com.management.platform.entity.vo.SysRichFunction;
 import com.management.platform.mapper.*;
 import com.management.platform.service.CusTableColumnService;
 import com.management.platform.util.HttpRespMsg;
 import com.management.platform.util.MessageUtils;
 import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
+import javax.sql.DataSource;
+import java.sql.*;
+import java.util.Date;
 import java.util.*;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 import java.util.stream.Collectors;
 
 @Service
@@ -51,6 +57,28 @@ public class CusTableColumnServiceImpl extends ServiceImpl<CusTableColumnMapper,
     @Resource
     private SysRoleFunctionMapper sysRoleFunctionMapper;
 
+    @Resource
+    private CompanyMapper companyMapper;
+
+    @Autowired
+    private DataSource dataSource;
+
+    public static final String REGEX_MAIN_TABLE = "(?i)\\bFROM\\b\\s+([a-zA-Z_][a-zA-Z0-9_]*)\\s+(?:AS\\s+)?([a-zA-Z_][a-zA-Z0-9_]*)";
+
+    public static final Pattern MAIN_TABLE_PATTERN = Pattern.compile(REGEX_MAIN_TABLE);
+
+    public static final String REGEX_DELETE_SIGN = "(?i)\\bdelete\\b";
+
+    public static final Pattern DELETE_SGIN_PATTERN = Pattern.compile(REGEX_DELETE_SIGN);
+
+    public static final String REGEX_UPDATE_SIGN = "(?i)\\bupdate\\b";
+
+    public static final Pattern UPDATE_SIGN_PATTERN = Pattern.compile(REGEX_UPDATE_SIGN);
+
+    public static final String REGEX_INSERT_SIGN = "(?i)\\binsert\\b";
+
+    public static final Pattern INSERT_SIGN_PATTERN = Pattern.compile(REGEX_INSERT_SIGN);
+
     @Override
     public HttpRespMsg getStructByTableName(String tableName, HttpServletRequest request) {
         HttpRespMsg msg = new HttpRespMsg();
@@ -105,17 +133,16 @@ public class CusTableColumnServiceImpl extends ServiceImpl<CusTableColumnMapper,
     }
 
     @Override
-    public HttpRespMsg getFormStorePage(PageBO<FormStorePageBO> queryBO,HttpServletRequest request) {
+    public HttpRespMsg getFormStorePage(FormStorePageBO queryBO,HttpServletRequest request) {
         HttpRespMsg msg = new HttpRespMsg();
         User user = userMapper.selectById(request.getHeader("token"));
         IPage<BusReportStore> page =new Page<>();
         page.setCurrent(queryBO.getPageIndex());
         page.setSize(queryBO.getPageSize());
-        FormStorePageBO pageQueryBO = queryBO.getData();
-        pageQueryBO.setUserId(user.getId());
-        pageQueryBO.setDepartmentId(user.getDepartmentId());
-        pageQueryBO.setCompanyId(user.getCompanyId());
-        page = busReportStoreMapper.getPrivilegedFormStore(page,queryBO.getData());
+        queryBO.setUserId(user.getId());
+        queryBO.setDepartmentId(user.getDepartmentId());
+        queryBO.setCompanyId(user.getCompanyId());
+        page = busReportStoreMapper.getPrivilegedFormStore(page,queryBO);
         List<BusReportStore> records = page.getRecords();
         if(CollectionUtils.isNotEmpty(records)){
             List<Integer> formIds = records.stream().filter(t -> null != t.getRelateFormId()).map(BusReportStore::getRelateFormId)
@@ -157,6 +184,13 @@ public class CusTableColumnServiceImpl extends ServiceImpl<CusTableColumnMapper,
         }
 
         if(null == busReportStore.getId()){
+            BusReportStore lastStore = busReportStoreMapper.selectOne(new LambdaQueryWrapper<BusReportStore>()
+                    .eq(BusReportStore::getCompanyId, user.getCompanyId())
+                    .eq(BusReportStore::getParentStoreId, busReportStore.getParentStoreId())
+                    .orderByDesc(BusReportStore::getOrderItem)
+                    .last(" limit 1")
+            );
+            busReportStore.setOrderItem(lastStore.getOrderItem()+1);
             busReportStore.setCreateBy(user.getId());
             busReportStore.setCompanyId(user.getCompanyId());
             busReportStoreMapper.insert(busReportStore);
@@ -171,88 +205,137 @@ public class CusTableColumnServiceImpl extends ServiceImpl<CusTableColumnMapper,
     }
 
     @Override
+    @Transactional
     public HttpRespMsg addOrUpdateReportForm(CusReportForm cusReportForm, HttpServletRequest request) {
         HttpRespMsg msg = new HttpRespMsg();
         User user = userMapper.selectById(request.getHeader("token"));
-        if(null == cusReportForm.getId()){
-            BusReportStore busReportStore = new BusReportStore();
-            busReportStore.setStoreName(cusReportForm.getReportFormName());
-            busReportStore.setCreateBy(user.getId());
-            busReportStore.setStoreType(2);
-            busReportStore.setOrderItem(cusReportForm.getOrderItem());
-            busReportStore.setParentStoreId(cusReportForm.getParentStoreId());
-            busReportStore.setDescription(cusReportForm.getDescription());
-            busReportStore.setCompanyId(user.getCompanyId());
-            busReportStoreMapper.insert(busReportStore);
-
-            cusReportForm.setCreateBy(user.getId());
-            cusReportForm.setCompanyId(user.getCompanyId());
-            cusReportFormMapper.insert(cusReportForm);
-
-            List<ReportFormAccess> toAddList = new ArrayList<>();
-            List<ReportFormAccess> deptAccessList = cusReportForm.getDeptAccessList();
-            if(CollectionUtils.isNotEmpty(deptAccessList)){
-                for (ReportFormAccess reportFormAccess : deptAccessList) {
-                    reportFormAccess.setRelateFormId(cusReportForm.getId());
-                    reportFormAccess.setCompanyId(user.getCompanyId());
-                    reportFormAccess.setAccessType(2);
-                    toAddList.add(reportFormAccess);
-                }
-            }
-
-            List<ReportFormAccess> userAccessList = cusReportForm.getUserAccessList();
-            if(CollectionUtils.isNotEmpty(userAccessList)){
-                for (ReportFormAccess reportFormAccess : userAccessList) {
-                    reportFormAccess.setRelateFormId(cusReportForm.getId());
-                    reportFormAccess.setCompanyId(user.getCompanyId());
-                    reportFormAccess.setAccessType(1);
-                    toAddList.add(reportFormAccess);
+        Matcher deleteMatcher = DELETE_SGIN_PATTERN.matcher(cusReportForm.getExecuteSql());
+        Matcher updateMatcher = UPDATE_SIGN_PATTERN.matcher(cusReportForm.getExecuteSql());
+        Matcher insertMatcher = INSERT_SIGN_PATTERN.matcher(cusReportForm.getExecuteSql());
+        if (deleteMatcher.find() || updateMatcher.find() || insertMatcher.find()) {
+            msg.setError("包含非法字符,无法存储");
+            return msg;
+        }
+        Matcher mainMatcher = MAIN_TABLE_PATTERN.matcher(cusReportForm.getExecuteSql());
+        String tableName = "";
+        String tableAlias = "";
+        if (mainMatcher.find()) {
+            tableName= mainMatcher.group(1);
+            tableAlias = mainMatcher.group(2);
+        } else {
+            msg.setError("主业务表无法识别公司,请联系管理员");
+            return msg;
+        }
+        if(StringUtils.isNotBlank(tableAlias) && StringUtils.isNotBlank(tableName)){
+            String s = cusReportForm.getExecuteSql()+" and "+tableAlias+".company_id="+user.getCompanyId()+" ";
+            cusReportForm.setExecuteSql(s);
+            if(null == cusReportForm.getId()){
+
+                Company company = companyMapper.selectById(user.getId());
+                if(1 == company.getVersionControl()){
+                    Integer count = busReportStoreMapper.selectCount(new LambdaQueryWrapper<BusReportStore>()
+                            .eq(BusReportStore::getCompanyId, user.getCompanyId())
+                    );
+                    if(count >= 5){
+                        msg.setError("专业版最多可创建5张报表,请升级到旗舰版");
+                        return msg;
+                    }
                 }
-            }
-            reportFormAccessMapper.batchInsert(toAddList);
 
-        }else{
-            BusReportStore busReportStore = busReportStoreMapper.selectOne(new LambdaQueryWrapper<BusReportStore>()
-                    .eq(BusReportStore::getRelateFormId, cusReportForm.getId())
-            );
-            if(null != busReportStore){
+                BusReportStore lastStore = busReportStoreMapper.selectOne(new LambdaQueryWrapper<BusReportStore>()
+                        .eq(BusReportStore::getCompanyId, user.getCompanyId())
+                        .eq(BusReportStore::getParentStoreId, cusReportForm.getParentStoreId())
+                        .orderByDesc(BusReportStore::getOrderItem)
+                        .last(" limit 1")
+                );
+                BusReportStore busReportStore = new BusReportStore();
                 busReportStore.setStoreName(cusReportForm.getReportFormName());
-                busReportStore.setUpdateBy(user.getId());
-                busReportStore.setUpdateTime(new Date());
-                busReportStore.setOrderItem(cusReportForm.getOrderItem());
+                busReportStore.setCreateBy(user.getId());
+                busReportStore.setStoreType(2);
                 busReportStore.setParentStoreId(cusReportForm.getParentStoreId());
                 busReportStore.setDescription(cusReportForm.getDescription());
-                busReportStoreMapper.updateById(busReportStore);
+                busReportStore.setCompanyId(user.getCompanyId());
+                if(null == lastStore){
+                    busReportStore.setOrderItem(1);
+                }else{
+                    busReportStore.setOrderItem(lastStore.getOrderItem()+1);
+                }
+                busReportStoreMapper.insert(busReportStore);
 
-                cusReportFormMapper.updateById(cusReportForm);
+                cusReportForm.setCreateBy(user.getId());
+                cusReportForm.setCompanyId(user.getCompanyId());
+                cusReportFormMapper.insert(cusReportForm);
 
                 List<ReportFormAccess> toAddList = new ArrayList<>();
-                List<ReportFormAccess> deptAccessList = cusReportForm.getDeptAccessList();
-                if(CollectionUtils.isNotEmpty(deptAccessList)){
-                    for (ReportFormAccess reportFormAccess : deptAccessList) {
+//            List<ReportFormAccess> deptAccessList = cusReportForm.getDeptAccessList();
+                List<Integer> departmentIds = cusReportForm.getDepartmentIds();
+                if(CollectionUtils.isNotEmpty(departmentIds)){
+                    for (Integer deptId: departmentIds) {
+                        ReportFormAccess reportFormAccess = new ReportFormAccess();
                         reportFormAccess.setRelateFormId(cusReportForm.getId());
                         reportFormAccess.setCompanyId(user.getCompanyId());
                         reportFormAccess.setAccessType(2);
+                        reportFormAccess.setDepartmentId(deptId);
                         toAddList.add(reportFormAccess);
                     }
                 }
 
-                List<ReportFormAccess> userAccessList = cusReportForm.getUserAccessList();
-                if(CollectionUtils.isNotEmpty(userAccessList)){
-                    for (ReportFormAccess reportFormAccess : userAccessList) {
+//            List<ReportFormAccess> userAccessList = cusReportForm.getUserAccessList();
+                List<String> userIds = cusReportForm.getUserIds();
+                if(CollectionUtils.isNotEmpty(userIds)){
+                    for (String userId: userIds) {
+                        ReportFormAccess reportFormAccess = new ReportFormAccess();
                         reportFormAccess.setRelateFormId(cusReportForm.getId());
                         reportFormAccess.setCompanyId(user.getCompanyId());
                         reportFormAccess.setAccessType(1);
+                        reportFormAccess.setUserId(userId);
                         toAddList.add(reportFormAccess);
                     }
                 }
-                reportFormAccessMapper.delete(new LambdaQueryWrapper<ReportFormAccess>()
-                        .eq(ReportFormAccess::getRelateFormId, cusReportForm.getId())
-                );
                 reportFormAccessMapper.batchInsert(toAddList);
 
             }else{
-                msg.setError("未找到对应报表");
+                BusReportStore busReportStore = busReportStoreMapper.selectOne(new LambdaQueryWrapper<BusReportStore>()
+                        .eq(BusReportStore::getRelateFormId, cusReportForm.getId())
+                );
+                if(null != busReportStore){
+                    busReportStore.setStoreName(cusReportForm.getReportFormName());
+                    busReportStore.setUpdateBy(user.getId());
+                    busReportStore.setUpdateTime(new Date());
+                    busReportStore.setParentStoreId(cusReportForm.getParentStoreId());
+                    busReportStore.setDescription(cusReportForm.getDescription());
+                    busReportStoreMapper.updateById(busReportStore);
+
+                    cusReportFormMapper.updateById(cusReportForm);
+
+                    List<ReportFormAccess> toAddList = new ArrayList<>();
+                    List<ReportFormAccess> deptAccessList = cusReportForm.getDeptAccessList();
+                    if(CollectionUtils.isNotEmpty(deptAccessList)){
+                        for (ReportFormAccess reportFormAccess : deptAccessList) {
+                            reportFormAccess.setRelateFormId(cusReportForm.getId());
+                            reportFormAccess.setCompanyId(user.getCompanyId());
+                            reportFormAccess.setAccessType(2);
+                            toAddList.add(reportFormAccess);
+                        }
+                    }
+
+                    List<ReportFormAccess> userAccessList = cusReportForm.getUserAccessList();
+                    if(CollectionUtils.isNotEmpty(userAccessList)){
+                        for (ReportFormAccess reportFormAccess : userAccessList) {
+                            reportFormAccess.setRelateFormId(cusReportForm.getId());
+                            reportFormAccess.setCompanyId(user.getCompanyId());
+                            reportFormAccess.setAccessType(1);
+                            toAddList.add(reportFormAccess);
+                        }
+                    }
+                    reportFormAccessMapper.delete(new LambdaQueryWrapper<ReportFormAccess>()
+                            .eq(ReportFormAccess::getRelateFormId, cusReportForm.getId())
+                    );
+                    reportFormAccessMapper.batchInsert(toAddList);
+
+                }else{
+                    msg.setError("未找到对应报表");
+                }
             }
         }
         return msg;
@@ -269,7 +352,7 @@ public class CusTableColumnServiceImpl extends ServiceImpl<CusTableColumnMapper,
             return msg;
         }
         BusReportStore busReportStore = busReportStoreMapper.selectById(storeId);
-        if(busReportStore.getCreateBy() != user.getId()){
+        if(!busReportStore.getCreateBy().equals(user.getId())){
             msg.setError("非创建人无法删除");
             return msg;
         }
@@ -288,7 +371,7 @@ public class CusTableColumnServiceImpl extends ServiceImpl<CusTableColumnMapper,
         HttpRespMsg msg = new HttpRespMsg();
         User user = userMapper.selectById(request.getHeader("token"));
         CusReportForm cusReportForm = cusReportFormMapper.selectById(formId);
-        if(cusReportForm.getCreateBy() != user.getId()){
+        if(!cusReportForm.getCreateBy().equals(user.getId())){
             msg.setError("非创建人不能删除");
         }
         cusReportFormMapper.deleteById(formId);
@@ -298,4 +381,121 @@ public class CusTableColumnServiceImpl extends ServiceImpl<CusTableColumnMapper,
         );
         return msg;
     }
+
+    @Override
+    public HttpRespMsg getFormResByFormId(Integer formId, HttpServletRequest request) {
+        HttpRespMsg msg = new HttpRespMsg();
+        List<Map<String,Object>> columnList = new ArrayList<>();
+        CusReportForm cusReportForm = cusReportFormMapper.selectById(formId);
+        if(null == cusReportForm){
+            msg.setError("未找到该报表,请联系管理员");
+            return msg;
+        }
+        String tableColumnSql = cusReportForm.getExecuteSql();
+        try (Connection connection = dataSource.getConnection()) {
+            PreparedStatement preparedStatement = connection.prepareStatement(tableColumnSql);
+            ResultSet resultSet = preparedStatement.executeQuery();
+            columnList = this.convertList(resultSet);
+        }catch (SQLException e) {
+            e.printStackTrace();
+            msg.setError("SQL语句有误,请联系管理员");
+            return msg;
+        }
+        msg.setData(columnList);
+        return msg;
+    }
+
+    /**移动报表到文件夹*/
+    @Override
+    public HttpRespMsg moveFormStore(Integer formId,Integer targetStoreId, HttpServletRequest request) {
+        HttpRespMsg msg = new HttpRespMsg();
+        User user = userMapper.selectById(request.getHeader("token"));
+        BusReportStore busReportStore = busReportStoreMapper.selectOne(new LambdaQueryWrapper<BusReportStore>()
+                .eq(BusReportStore::getCompanyId, user.getCompanyId())
+                .eq(BusReportStore::getRelateFormId, formId)
+        );
+
+        BusReportStore lastOneStore = busReportStoreMapper.selectOne(new LambdaQueryWrapper<BusReportStore>()
+                .eq(BusReportStore::getCompanyId, user.getCompanyId())
+                .eq(BusReportStore::getParentStoreId, busReportStore.getParentStoreId())
+                .orderByDesc(BusReportStore::getOrderItem)
+                .last(" limit 1 ")
+        );
+        if(null == lastOneStore){
+            busReportStore.setParentStoreId(targetStoreId);
+            busReportStore.setOrderItem(1);
+            busReportStore.setUpdateBy(user.getId());
+            busReportStore.setUpdateTime(new Date());
+        }else{
+            busReportStore.setParentStoreId(targetStoreId);
+            busReportStore.setOrderItem(lastOneStore.getOrderItem()+1);
+            busReportStore.setUpdateBy(user.getId());
+            busReportStore.setUpdateTime(new Date());
+        }
+
+        busReportStoreMapper.updateById(busReportStore);
+
+        return msg;
+    }
+
+    @Override
+    public HttpRespMsg getAllStoresTree(HttpServletRequest request) {
+        HttpRespMsg msg = new HttpRespMsg();
+        User user = userMapper.selectById(request.getHeader("token"));
+        List<BusReportStore> busReportStores = busReportStoreMapper.selectList(new LambdaQueryWrapper<BusReportStore>()
+                .eq(BusReportStore::getCompanyId, user.getCompanyId())
+        );
+        List<BusReportStore> listTree = this.listToTree(busReportStores);
+        msg.setData(listTree);
+        return msg;
+    }
+
+    private List<BusReportStore> listToTree(List<BusReportStore> treeNodeList){
+        if(null == treeNodeList){
+            return null;
+        }
+        List<BusReportStore> resList = new ArrayList<>();
+        Stack<BusReportStore> stack = new Stack<>();
+        resList = treeNodeList.stream().filter(ele -> 0 == ele.getParentStoreId()).collect(Collectors.toList());
+        stack.addAll(resList);
+
+        while(!stack.isEmpty()) {
+            BusReportStore store = stack.pop();
+            List<BusReportStore> child = treeNodeList.stream()
+                    .filter(ele -> store.getId().equals(ele.getParentStoreId())).collect(Collectors.toList());
+            if(!child.isEmpty()) {
+                store.setChildStoreList(child);
+            }
+            if(!child.isEmpty()) {
+                stack.addAll(child);
+            }
+        }
+        return resList;
+    }
+
+    public static List<Map<String, Object>> convertList(ResultSet rs) {
+        List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
+        try {
+            ResultSetMetaData md = rs.getMetaData();
+            int columnCount = md.getColumnCount();
+            while (rs.next()) {
+                Map<String, Object> rowData = new HashMap<String, Object>();
+                for (int i = 1; i <= columnCount; i++) {
+                    rowData.put(md.getColumnName(i), rs.getObject(i));
+                }
+                list.add(rowData);
+            }
+        } catch (SQLException e) {
+            e.printStackTrace();
+        } finally {
+            try {
+                if (rs != null)
+                    rs.close();
+                rs = null;
+            } catch (SQLException e) {
+                e.printStackTrace();
+            }
+        }
+        return list;
+    }
 }

+ 4 - 4
fhKeeper/formulahousekeeper/management-crm/src/main/resources/mapper/BusReportStoreMapper.xml

@@ -6,7 +6,7 @@
     <select id="getPrivilegedFormStore" resultType="com.management.platform.entity.BusReportStore">
         select  brs.id,brs.store_type,brs.store_name,brs.parent_store_id,brs.create_by,brs.create_time
              ,brs.update_by,brs.update_time,brs.description
-             ,brs.order_item,brs.relate_from_id,brs.company_id,u1.name as createName,u2.name as updateName
+             ,brs.order_item,brs.relate_form_id,brs.company_id,u1.name as createName,u2.name as updateName
         from bus_report_store brs
         left join user u1 on brs.create_by = u1.id
         left join user u2 on brs.update_by = u2.id
@@ -15,14 +15,14 @@
         select tmp.*,u1.name as createName,u2.name as updateName from (
                         select  brs.id,brs.store_type,brs.store_name,brs.parent_store_id,brs.create_by,brs.create_time
                              ,brs.update_by,brs.update_time,brs.description
-                             ,brs.order_item,brs.relate_from_id,brs.company_id
+                             ,brs.order_item,brs.relate_form_id,brs.company_id
                         from bus_report_store brs
-                                 left join cus_report_form crf on brs.relate_from_id = crf.id
+                                 left join cus_report_form crf on brs.relate_form_id = crf.id
                         where store_type = 2 and brs.company_id = #{queryBO.companyId} and brs.parent_store_id = #{queryBO.parentStoreId}
                           and (
                             crf.privilege = 1 or (crf.privilege = 2 and
                                                   exists(
-                                                      select 1 from report_from_access rfa where brs.relate_from_id = rfa.relate_from_id
+                                                      select 1 from report_from_access rfa where brs.relate_form_id = rfa.relate_form_id
                                                        and (rfa.user_id = #{queryBO.userId} or rfa.department_id = #{queryBO.departmentId} )
                                                   )
                                 )

+ 6 - 6
fhKeeper/formulahousekeeper/management-crm/src/main/resources/mapper/ReportFormAccessMapper.xml

@@ -3,32 +3,32 @@
         "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
 <mapper namespace="com.management.platform.mapper.ReportFormAccessMapper">
     <insert id="batchInsert">
-        insert into report_from_access (relate_from_id, access_type, user_id, department_id, company_id) VALUES
+        insert into report_from_access (relate_form_id, access_type, user_id, department_id, company_id) VALUES
         <foreach collection="toAddList" item="toAddItem" separator=",">
-            (#{toAddItem.accessType},#{toAddItem.relateFormId},#{toAddItem.userId}
+            (#{toAddItem.relateFormId},#{toAddItem.accessType},#{toAddItem.userId}
             ,#{toAddItem.departmentId},#{toAddItem.companyId})
         </foreach>
     </insert>
 
     <select id="getAccessesByFormIds" resultType="com.management.platform.entity.ReportFormAccess">
         select rfa.id,rfa.company_id,rfa.user_id
-             ,rfa.department_id,rfa.relate_from_id,rfa.access_type
+             ,rfa.department_id,rfa.relate_form_id,rfa.access_type
              ,u.name as finalName
         from report_from_access rfa
                  left join user u on rfa.user_id = u.id
         where rfa.company_id = #{companyId} and rfa.access_type = 1
-          and rfa.relate_from_id in
+          and rfa.relate_form_id in
         <foreach collection="formIds" item="formId" open="(" close=")"  separator=",">
             #{formId}
         </foreach>
         union
         select rfa.id,rfa.company_id,rfa.user_id
-             ,rfa.department_id,rfa.relate_from_id,rfa.access_type
+             ,rfa.department_id,rfa.relate_form_id,rfa.access_type
              ,d.department_name  as finalName
         from report_from_access rfa
                  left join department d on rfa.department_id = d.department_id
         where rfa.company_id = #{companyId}  and rfa.access_type = 2
-          and rfa.relate_from_id in
+          and rfa.relate_form_id in
         <foreach collection="formIds" item="formId" open="(" close=")"  separator=",">
             #{formId}
         </foreach>

+ 5 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectController.java

@@ -1606,5 +1606,10 @@ public class ProjectController {
     public HttpRespMsg batchSetProjectTaskExecutor(@RequestParam String projectIds,@RequestParam String userIds){
         return projectService.batchSetProjectTaskExecutor(projectIds,userIds);
     }
+
+    @RequestMapping("/transferProjectReviwer")
+    public HttpRespMsg transferProjectReviwer(String userId, String targetAuditorId){
+        return projectService.transferProjectReviwer(userId,targetAuditorId);
+    }
 }
 

+ 29 - 38
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportController.java

@@ -477,7 +477,6 @@ public class ReportController {
                 customData[i] = 0.0;
             }
         }
-        System.out.println("projectAuditorId:"+(projectAuditorId == null?"为Null":"Length="+projectAuditorId.length));
         if (projectAuditorId == null || projectAuditorId.length == 0) {
             projectAuditorId = new String[projectId.length];
             for(int i=0;i<projectAuditorId.length; i++) {
@@ -1193,38 +1192,7 @@ public class ReportController {
                                 //并非并行审核模式下的代填,需要设置审核状态
                                 report.setState(0);
                                 setReportWorkflowAuditor(auditWorkflowList, allDeptList, report,comTimeType);
-//                                if (auditWorkflowList.size() == 0) {
-//                                    //没有自定义审核流,直接代填的,还是走正常的审核流程
-//                                    report.setIsDeptAudit(0);
-//                                    report.setIsFinalAudit(1);
-//                                    report.setState(0);
-//                                } else {
-//                                    System.out.println("代填的情况下,有自定义审核流程");
-
-//                                    int projectLeaderNodeIndex = 0;
-//                                    for (int t=0;t<auditWorkflowList.size(); t++) {
-//                                        if (auditWorkflowList.get(t).getIsDeptAudit() == 0) {
-//                                            projectLeaderNodeIndex = t;
-//                                            break;
-//                                        }
-//                                    }
-//                                    if (projectLeaderNodeIndex == auditWorkflowList.size() -1) {
-//                                        //最后一个节点就是项目经理,那就不用审核了,直接通过
-//                                        report.setState(1);
-//                                    } else {
-//                                        //否则取下一个节点,待审核
-//                                        report.setState(0);
-//                                        int nextIndex = projectLeaderNodeIndex + 1;
-//                                        AuditWorkflowTimeSetting nextNode = auditWorkflowList.get(nextIndex);
-//                                        report.setIsFinalAudit((nextIndex == auditWorkflowList.size()-1)?1:0);
-//                                        report.setIsDeptAudit(nextNode.getIsDeptAudit());
-//                                        report.setAuditDeptid(nextNode.getAuditDeptId());
-//                                        report.setAuditDeptManagerid(nextNode.getAuditDeptId() != null?allDeptList.stream().filter(d->d.getDepartmentId().equals(nextNode.getAuditDeptId())).findFirst().get().getManagerId(): null);
-//                                    }
-//                                }
                             }
-
-
                             if (taskId != null && taskId[i] != null && taskId[i] != 0) {
                                 report.setTaskId(taskId[i]);
                             }
@@ -1607,11 +1575,18 @@ public class ReportController {
             for (User creator : creatorList) {
                 if (!StringUtils.isEmpty(creator.getSuperiorId())) {
                     User superior = userMapper.selectById(creator.getSuperiorId());
+                    //校验直属日报审核人是否已经离职
+                    if (superior.getIsActive() == 0) {
+                        HttpRespMsg msg = new HttpRespMsg();
+                        msg.setError("直属日报审核人已离职,请联系管理员重新设置后再提交");
+                        return msg;
+                    }
                     if (!tempAuditorUserList.stream().anyMatch(item -> item.getId().equals(superior.getId()))) {
                         tempAuditorUserList.add(superior);
                     }
                 }
             }
+
             for (Report report : reportList) {
                 report.setDepartmentAuditState(0);
                 //优先按照当前日报填写人的直属审核人审核
@@ -1631,6 +1606,14 @@ public class ReportController {
                             HttpRespMsg httpRespMsg=new HttpRespMsg();
                             httpRespMsg.setError("当前所在部门["+first.get().getDepartmentName()+"]不存在负责人,请联系管理员设置");
                             return httpRespMsg;
+                        } else {
+                            //检查部门负责人是否已经离职
+                            User deptAuditor = userMapper.selectById(first.get().getManagerId());
+                            if (deptAuditor.getIsActive() == 0) {
+                                HttpRespMsg msg = new HttpRespMsg();
+                                msg.setError("部门负责人已离职,请联系管理员重新设置后再提交");
+                                return msg;
+                            }
                         }
                         report.setAuditDeptid(first.get().getDepartmentId());
                         report.setProjectAuditorId(null);
@@ -1938,8 +1921,8 @@ public class ReportController {
             }
         }
         HttpRespMsg httpRespMsg = reportService.editReport(reportList, createDate.length > 0 ? createDate[0] : null, targetUserList, hourCost, user.getCompanyId(), summary, weeklyAttachment);
-        //填报自动通过功能:【上海绎维】、【火石演示】、【博通容合】、【威派格】使用
-        if (company.getId() == 862 || company.getId() == 10 || company.getId() == 3344 || company.getId() == 936) {
+        //填报自动通过功能:【上海绎维】、【火石演示】、【博通容合】、【威派格】使用;以及设置了自动审核通过的公司
+        if (company.getId() == 862 || company.getId() == 3344 || company.getId() == 936 || comTimeType.getAutoProjectApprove()) {
             //项目审核人是提交人的情况,直接审核
             List<String> reportIds = new ArrayList<>();
             for (int i = 0; i<id.length; i++) {
@@ -2971,7 +2954,7 @@ public class ReportController {
     }
 
     @RequestMapping("/denyByCheckId")
-    public HttpRespMsg denyByCheckId(String userId){
+    public HttpRespMsg denyByCheckId(String userId, @RequestParam(required = false,defaultValue = "true") Boolean isPermanent, HttpServletRequest request){
         HttpRespMsg msg=new HttpRespMsg();
         Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
         LambdaQueryWrapper<Report> queryWrapper = new LambdaQueryWrapper<>();
@@ -2981,6 +2964,7 @@ public class ReportController {
         List<Report> reportList = reportMapper.selectList(queryWrapper);
         reportList.forEach(r->{
             r.setState(2);
+            r.setRejectReason("审核人已离职,请重新提交日报");
         });
         if(!reportService.updateBatchById(reportList)){
             msg.setError("验证失败");
@@ -2989,12 +2973,16 @@ public class ReportController {
         User user = userMapper.selectById(userId);
         user.setIsActive(0);
         userMapper.updateById(user);
-        participationMapper.delete(new LambdaQueryWrapper<Participation>().eq(Participation::getUserId,user.getId()));
+        if (isPermanent) {
+            //永久移除,需要删除
+            participationMapper.delete(new LambdaQueryWrapper<Participation>().eq(Participation::getUserId,user.getId()));
+        }
+
         return msg;
     }
 
     @RequestMapping("/transferReportAuditor")
-    public HttpRespMsg transferReportAuditor(String userId, String targetAuditorId){
+    public HttpRespMsg transferReportAuditor(String userId, String targetAuditorId,@RequestParam(required = false,defaultValue = "true") Boolean isPermanent){
         HttpRespMsg msg=new HttpRespMsg();
         Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
         LambdaQueryWrapper<Report> queryWrapper = new LambdaQueryWrapper<>();
@@ -3016,7 +3004,10 @@ public class ReportController {
         User user = userMapper.selectById(userId);
         user.setIsActive(0);
         userMapper.updateById(user);
-        participationMapper.delete(new LambdaQueryWrapper<Participation>().eq(Participation::getUserId,user.getId()));
+        if (isPermanent) {
+            //永久移除,需要删除
+            participationMapper.delete(new LambdaQueryWrapper<Participation>().eq(Participation::getUserId,user.getId()));
+        }
         return msg;
     }
 

+ 27 - 12
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/UserController.java

@@ -111,11 +111,13 @@ public class UserController {
 
     @Resource
     private ParticipationMapper participationMapper;
-
+    @Resource
+    private ProjectMapper projectMapper;
     public static HashMap<String, Integer> corpddJobCenter = new HashMap();
     //用于控制线程锁
     public static HashMap<String, CorpwxJobResult> corpwxJobCenter = new HashMap();
 
+
     /**
      * 登录网页端
      * username 用户名
@@ -748,24 +750,37 @@ public class UserController {
     public HttpRespMsg changeSysManager(String toUserId, Integer myRoleId) {return userService.changeSysManager(toUserId, myRoleId, request); }
 
     @RequestMapping("/deactiveUser")
-    public HttpRespMsg deactiveUser(User user) {
+    public HttpRespMsg deactiveUser(User user, @RequestParam(required = false, defaultValue = "true") Boolean isPermanent) {
         HttpRespMsg msg = new HttpRespMsg();
         Integer companyId = userService.getById(request.getHeader("token")).getCompanyId();
-        //针对美莱德,飞锐特,湾创在对人员进行停用操作时,需要检查待他审核的日报
-        if(companyId==876||companyId==877||companyId==878 || companyId==10){
-            LambdaQueryWrapper<Report> queryWrapper = new LambdaQueryWrapper<>();
-            queryWrapper.eq(Report::getState,0);
-            queryWrapper.eq(Report::getCompanyId,companyId);
-            queryWrapper.and(wrapper->wrapper.and(wr->wr.eq(Report::getAuditDeptManagerid,user.getId()).eq(Report::getIsDeptAudit,1)).or(wr1->wr1.eq(Report::getProjectAuditorId,user.getId()).eq(Report::getIsDeptAudit,0)));
-            Integer count = reportMapper.selectCount(queryWrapper);
-            if(count>0){
-                msg.setError("当前员工有待审核日报,请确认处理方式?");
+        TimeType timeType = timeTypeMapper.selectById(companyId);
+        if (isPermanent && timeType.getReportAuditType() == 8) {
+            //项目经理先审核,复核人后审核,校验复核人
+            LambdaQueryWrapper<Project> projectLambdaQueryWrapper = new LambdaQueryWrapper<Project>();
+            projectLambdaQueryWrapper.eq(Project::getReviwerId, user.getId());
+            int cnt = projectMapper.selectCount(projectLambdaQueryWrapper);
+            if (cnt > 0) {
+                msg.setCode("project");
+                msg.setMsg("当前用户担任项目复核人,需要转移给其他人才能停用");
                 return msg;
             }
         }
+
+        //需要检查待他审核的日报
+        LambdaQueryWrapper<Report> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(Report::getState,0);
+        queryWrapper.eq(Report::getCompanyId,companyId);
+        queryWrapper.and(wrapper->wrapper.and(wr->wr.eq(Report::getAuditDeptManagerid,user.getId()).eq(Report::getIsDeptAudit,1)).or(wr1->wr1.eq(Report::getProjectAuditorId,user.getId()).eq(Report::getIsDeptAudit,0)));
+        Integer count = reportMapper.selectCount(queryWrapper);
+        if(count>0){
+            msg.setError("当前员工有担任审核人的日报,请确认处理方式?");
+            return msg;
+        }
         user.setIsActive(0);
         userService.updateById(user);
-        participationMapper.delete(new LambdaQueryWrapper<Participation>().eq(Participation::getUserId,user.getId()));
+        if (isPermanent) {
+            participationMapper.delete(new LambdaQueryWrapper<Participation>().eq(Participation::getUserId,user.getId()));
+        }
         return msg;
     }
 

+ 13 - 7
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/TimeType.java

@@ -1,23 +1,23 @@
 package com.management.platform.entity;
 
-import com.baomidou.mybatisplus.annotation.TableField;
-import com.baomidou.mybatisplus.annotation.TableId;
+import java.math.BigDecimal;
 import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableField;
+import java.io.Serializable;
+import java.util.List;
+
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
 
-import java.io.Serializable;
-import java.math.BigDecimal;
-import java.util.List;
-
 /**
  * <p>
  * 
  * </p>
  *
  * @author Seyason
- * @since 2025-01-04
+ * @since 2025-03-11
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
@@ -644,6 +644,11 @@ public class TimeType extends Model<TimeType> {
     @TableField("report_charge_msg")
     private Integer reportChargeMsg;
 
+    /**
+     * 项目审核人是自己时自动审核通过
+     */
+    @TableField("auto_project_approve")
+    private Boolean autoProjectApprove;
 
     @TableField(exist = false)
     private List<User> userList;
@@ -652,6 +657,7 @@ public class TimeType extends Model<TimeType> {
     @TableField(exist = false)
     private Integer saasSyncContact;
 
+
     @Override
     protected Serializable pkVal() {
         return this.companyId;

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

@@ -321,4 +321,6 @@ public interface ProjectService extends IService<Project> {
     HttpRespMsg getProjectTaskPlanAndRealCost(Integer pageIndex, Integer pageSize, Integer projectId,  HttpServletRequest request, Integer taskType);
 
     HttpRespMsg exportProjectTaskPlanAndRealCost(Integer projectId, HttpServletRequest request, Integer taskType);
+
+    HttpRespMsg transferProjectReviwer(String userId, String targetAuditorId);
 }

+ 10 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java

@@ -1224,6 +1224,15 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         return httpRespMsg;
     }
 
+    @Override
+    public HttpRespMsg transferProjectReviwer(String userId, String targetAuditorId) {
+        HttpRespMsg msg = new HttpRespMsg();
+        Project p = new Project();
+        p.setReviwerId(targetAuditorId);
+        projectMapper.update(p, new QueryWrapper<Project>().eq("reviwer_id", userId));
+        return msg;
+    }
+
     public HttpRespMsg getProjectEstimatedWork(Integer pageIndex, Integer pageSize, Integer projectId, HttpServletRequest request) {
         HttpRespMsg httpRespMsg = new HttpRespMsg();
         //通过公司id获取该公司所有的项目列表
@@ -13692,6 +13701,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         return msg;
     }
 
+    //依斯倍SAP项目同步
     @Override
     public HttpRespMsg syncProjectWithSap(String startDate,String endDate,String projectCodes) {
         HttpRespMsg msg=new HttpRespMsg();

+ 0 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/WxCorpInfoServiceImpl.java

@@ -995,7 +995,6 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
                 contactSyncLogMapper.insert(contactSyncLog);
                 user.setIsActive(0);//先同步过来,但是停用
                 userMapper.insert(user);
-                participationMapper.delete(new LambdaQueryWrapper<Participation>().eq(Participation::getUserId,user.getId()));
             }else {
                 userMapper.insert(user);
                 contactSyncLog.setResult(1);

+ 4 - 8
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/TaskMapper.xml

@@ -472,7 +472,7 @@
         left join task on tf.task_id = task.id
         left join project p on task.project_id = p.id
         <where>
-            task.task_status = 0 and task.final_charge_status = 0
+            task.final_charge_status = 0
             and case task.charge_stage
             when 1 then (p.incharger_id = task.charge_one_id and task.charge_one_status != 2)
             when 2 then (p.incharger_id = task.charge_two_id and task.charge_two_status != 2)
@@ -512,7 +512,7 @@
         left join user on task.creater_id = user.id
         left join department d on user.department_id = d.department_id
         <where>
-            task.task_status = 0 and task.final_charge_status = 0
+            task.final_charge_status = 0
             and case task.charge_stage
             when 1 then (d.manager_id = task.charge_one_id and task.charge_one_status != 2)
             when 2 then (d.manager_id = task.charge_two_id and task.charge_two_status != 2)
@@ -557,7 +557,7 @@
         left join task on tf.task_id = task.id
         left join project p on task.project_id = p.id
         <where>
-            task.task_status = 0 and task.final_charge_status = 0
+            task.final_charge_status = 0
             and case task.charge_stage
             when 1 then (p.incharger_id = task.charge_one_id and task.charge_one_status != 2)
             when 2 then (p.incharger_id = task.charge_two_id and task.charge_two_status != 2)
@@ -597,7 +597,7 @@
         left join user on task.creater_id = user.id
         left join department d on user.department_id = d.department_id
         <where>
-            task.task_status = 0 and task.final_charge_status = 0
+            task.final_charge_status = 0
             and case task.charge_stage
             when 1 then (d.manager_id = task.charge_one_id and task.charge_one_status != 2)
             when 2 then (d.manager_id = task.charge_two_id and task.charge_two_status != 2)
@@ -656,7 +656,6 @@
         <where>
             tf.need_file_charge = 1
             and tf.final_charge_status = 0
-            and task.task_status = 0
             and task.company_id = #{queryBO.companyId}
             and case tf.charge_stage
             when 1 then tf.charge_one_id = #{queryBO.userId} and tf.charge_one_status = 0
@@ -689,7 +688,6 @@
         <where>
             tf.need_file_charge = 1
             and tf.final_charge_status = 0
-            and task.task_status = 0
             and task.company_id = #{queryBO.companyId}
             and case tf.charge_stage
             when 1 then tf.charge_one_id = #{queryBO.userId} and tf.charge_one_status = 0
@@ -751,7 +749,6 @@
         <where>
             tf.need_file_charge = 1
             and tf.final_charge_status = 0
-            and task.task_status = 0
             and task.company_id = #{queryBO.companyId}
             and case tf.charge_stage
             when 1 then tf.charge_one_id != #{queryBO.userId} and tf.charge_one_status = 0
@@ -784,7 +781,6 @@
         <where>
             tf.need_file_charge = 1
             and tf.final_charge_status = 0
-            and task.task_status = 0
             and task.company_id = #{queryBO.companyId}
             and case tf.charge_stage
             when 1 then tf.charge_one_id != #{queryBO.userId} and tf.charge_one_status = 0

文件差异内容过多而无法显示
+ 5 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/TimeTypeMapper.xml


+ 1 - 1
fhKeeper/formulahousekeeper/timesheet/src/i18n/zh.json

@@ -198,7 +198,7 @@
     "read": "已读",
     "changeThePassword": "修改密码",
     "launchTheLogin": "退出登录",
-    "confirmExit": "确定退出吗",
+    "confirmExit": "确定退出吗",
     "prompts": "提示",
     "expired": "已过期",
     "AskForLeaveOnTheSameDay": "当日请假",

+ 5 - 0
fhKeeper/formulahousekeeper/timesheet/src/views/settings/timetype.vue

@@ -382,6 +382,11 @@
                 <!-- <span v-if="timeType.reportAuditType == 10">公司副总:{{timeType.thirdAuditor}}</span><el-link underline="none" v-if="timeType.reportAuditType == 10">设置</el-link> -->
             </el-tag>
         </div>
+        <div class="yanjiu" >
+            <p style="margin-left:10px;color:#666;">自动审核</p>
+            <el-switch style="margin-left: 55px" v-model="timeType.autoProjectApprove" :active-color="themeColor" > </el-switch>
+            <span style="margin-left:10px;color:#999;">项目审核人是自己时自动审核通过</span>
+        </div>
         <div class="yanjiu">
             <p style="margin-left:10px;color:#666;">{{ $t('xiangMuChaoQiHouBuKeTianBao') }}</p>
             <el-switch style="margin-left: 40px" v-model="timeType.notAllowedExpiredProject" :active-color="themeColor" > </el-switch>

+ 66 - 11
fhKeeper/formulahousekeeper/timesheet/src/views/team/index.vue

@@ -650,6 +650,14 @@
                 <el-form-item :label="$t('employeedeparture')" >
                     <el-date-picker type="date" v-model="deactiveDate" value-format="yyyy-MM-dd" format="yyyy-MM-dd" :placeholder="$t('defaultText.pleaseChoose')" />
                 </el-form-item>
+                <el-form-item label="停用时效" >
+                  <el-radio-group v-model="isPermanent">
+                      <el-radio :label="true" >永久停用</el-radio>
+                      <el-radio :label="false" >暂时停用</el-radio>
+                  </el-radio-group>
+                </el-form-item>
+                <p style="text-align:center; margin:0 auto; color:orange" v-if="isPermanent">永久停用会将该员工从项目参与人中移除</p>
+                <p style="text-align:center; margin:0 auto; color:orange" v-if="!isPermanent">临时停用会保留该员工参与的项目</p>
             </el-form>
             <span slot="footer" class="dialog-footer">
                 <el-button type="default" @click="deactiveDialog = false">{{ $t('btn.cancel') }}</el-button>
@@ -683,6 +691,25 @@
                 <el-button type="primary" @click="confirmInactiveWay" >{{ $t('btn.submit') }}</el-button>
             </span>
         </el-dialog>
+        <el-dialog title="离职信息转移" :visible.sync="projectReviewerSelectDialog" width="500px" >
+            <p>*该用户在项目中担任复审人,请选择其他人接手</p>
+            <el-form :model="userInActiveForm" label-width="120px">
+                <!-- 主要负责人 -->
+                <el-form-item label="选择新的复审人">
+                    <el-select v-model="userInActiveForm.targetAuditorId" filterable v-if="user.userNameNeedTranslate != '1'" clearable  :placeholder="$t('defaultText.pleaseChoose')" style="width: 200px">
+                        <el-option v-for="item in users" :key="item.id" :label="item.name" :value="item.id">
+                          <span style="float: left">{{ item.name }}</span>
+                          <span style="float: right; color: #8492a6; font-size: 13px">{{ item.jobNumber }}</span>
+                        </el-option>
+                    </el-select>
+                    <selectCat :size="'medium'" :filterable="true" :clearable="true" :widthStr="'360'" v-if="user.userNameNeedTranslate == '1'" :subject="users" :subjectId="userInActiveForm.targetAuditorId" :distinction="'30'" @selectCal="selectCal"></selectCat>
+                </el-form-item>
+            </el-form>
+            <span slot="footer" class="dialog-footer">
+                <el-button @click="projectReviewerSelectDialog = false">{{ $t('btn.cancel') }}</el-button>
+                <el-button type="primary" @click="confirmTransferReviwer" >{{ $t('btn.submit') }}</el-button>
+            </span>
+        </el-dialog>
         <!-- 管理专业证书 -->
         <el-dialog :title="$t('professionalCertificate inManagement')" :visible.sync="managementDiolog" width="500px" :before-close="handleClose">
             <div>
@@ -981,7 +1008,9 @@ export default {
   },
   data() {
     return {
+      isPermanent: true,
       reportAuditorSelectDialog: false,
+      projectReviewerSelectDialog: false,
       userInActiveForm:{way:0,targetAuditorId:null},
       isExporting: false,
       isSyncContact: false,
@@ -2298,6 +2327,7 @@ export default {
         {
           id: this.deactiveUser.id,
           inactiveDate: this.deactiveDate,
+          isPermanent: this.isPermanent
         },
         (res) => {
           if (res.code == "ok") {
@@ -2307,17 +2337,14 @@ export default {
               type: "success",
             });
             this.getUser();
-          } else {
-            if(this.user.companyId==876||this.user.companyId==877||this.user.companyId==878 || this.user.companyId == 10){
-              //新的模式
+          } else if (res.code == 'project') {
+              //项目复核人需要转移为其他人 
               this.userInActiveForm.userId = this.deactiveUser.id;
-              this.reportAuditorSelectDialog = true;
-            }else{
-              this.$message({
-                message: error,
-                type: "error",
-              });
-            }
+              this.projectReviewerSelectDialog = true;
+          }else {
+            //新的模式
+            this.userInActiveForm.userId = this.deactiveUser.id;
+            this.reportAuditorSelectDialog = true;
           }
         },
         (error) => {
@@ -2328,8 +2355,36 @@ export default {
         }
       );
     },
-
+    confirmTransferReviwer() {
+      var url = '/project/transferProjectReviwer'
+      this.http.post(
+          url,
+          this.userInActiveForm,
+          (res) => {
+            if (res.code == "ok") {
+              this.$message({
+                message: '复核人已转移,请继续停用',
+                type: "success",
+              });
+              this.projectReviewerSelectDialog = false;
+            } else {
+              this.$message({
+                message: res.msg,
+                type: "error",
+              });
+            }
+          },
+          (error) => {
+            this.listLoading = false;
+            this.$message({
+              message: error,
+              type: "error",
+            });
+          }
+        );
+    },
     confirmInactiveWay() {
+      this.userInActiveForm.isPermanent = this.isPermanent;
       var url = this.userInActiveForm.way?'/report/transferReportAuditor':'/report/denyByCheckId'
       this.http.post(
           url,