Browse Source

Merge branch 'master' of http://47.100.37.243:10191/wutt/manHourHousekeeper

Guo1B0 1 year ago
parent
commit
ad859200d4
14 changed files with 208 additions and 106 deletions
  1. 56 4
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/ProductServiceImpl.java
  2. 72 69
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectApprovalController.java
  3. 2 5
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/UserWithBeisenController.java
  4. 24 8
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java
  5. 4 3
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/WxCorpInfoServiceImpl.java
  6. 2 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/util/BeiSenUtils.java
  7. 4 2
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ReportMapper.xml
  8. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/TaskMapper.xml
  9. 4 0
      fhKeeper/formulahousekeeper/octopus/src/views/customer/list.vue
  10. 6 0
      fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/entity/Company.java
  11. 4 1
      fhKeeper/formulahousekeeper/ops-platform/src/main/resources/mapper/CompanyMapper.xml
  12. 3 3
      fhKeeper/formulahousekeeper/timesheet-workshop/src/views/product/list.vue
  13. 22 3
      fhKeeper/formulahousekeeper/timesheet/src/views/projectApproval/projectApproval.vue
  14. 4 5
      fhKeeper/formulahousekeeper/timesheet/src/views/workReport/daily.vue

+ 56 - 4
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/ProductServiceImpl.java

@@ -7,12 +7,10 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.management.platform.entity.*;
-import com.management.platform.mapper.ProductMapper;
-import com.management.platform.mapper.SysDictMapper;
-import com.management.platform.mapper.SysFormMapper;
-import com.management.platform.mapper.UserMapper;
+import com.management.platform.mapper.*;
 import com.management.platform.service.ProductService;
 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;
 import com.management.platform.util.HttpRespMsg;
@@ -37,6 +35,7 @@ import java.time.LocalDateTime;
 import java.time.LocalTime;
 import java.time.format.DateTimeFormatter;
 import java.util.*;
+import java.util.stream.Collectors;
 import java.util.zip.DataFormatException;
 
 /**
@@ -66,15 +65,54 @@ public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> impl
     private SysDictMapper sysDictMapper;
     @Resource
     private ExcelExportServiceImpl excelExportService;
+    @Resource
+    private SysFunctionService sysFunctionService;
+    @Resource
+    private DepartmentMapper departmentMapper;
+    @Resource
+    private DepartmentOtherManagerMapper departmentOtherManagerMapper;
 
     @Override
     public HttpRespMsg getList(Integer companyId,String userId, String productName, String productCode, Integer pageIndex, Integer pageSize) {
         HttpRespMsg msg=new HttpRespMsg();
+        User targetUsr = userMapper.selectById(request.getHeader("token"));
+        List<Department> departments = departmentMapper.selectList(new LambdaQueryWrapper<Department>().eq(Department::getCompanyId, companyId));
         LambdaQueryWrapper<Product> queryWrapper = new LambdaQueryWrapper<>();
         queryWrapper.eq(Product::getCompanyId,companyId);
         List<User> userList = userMapper.selectList(new LambdaQueryWrapper<User>().eq(User::getCompanyId, companyId));
         List<SysDict> sysDictOfProductType = sysDictMapper.selectList(new LambdaQueryWrapper<SysDict>().eq(SysDict::getCompanyId, companyId).eq(SysDict::getCode, "ProductType"));
         List<SysDict> sysDictOfProductUnit = sysDictMapper.selectList(new LambdaQueryWrapper<SysDict>().eq(SysDict::getCompanyId, companyId).eq(SysDict::getCode, "ProductUnit"));
+        boolean hasPriviledgeAll = sysFunctionService.hasPriviledge(targetUsr.getRoleId(), "查看全部产品数据");
+        boolean hasPriviledgeDept = sysFunctionService.hasPriviledge(targetUsr.getRoleId(), "查看全部产品数据");
+        //判断查看全部的权限
+        if(!hasPriviledgeAll){
+            //判断查看负责部门的权限
+            if(!hasPriviledgeDept){
+                //都没有就只能看自己创建的
+                queryWrapper.eq(Product::getCreatorId,targetUsr.getId());
+            }else {
+                List<Department> departmentList = departmentMapper.selectList(new LambdaQueryWrapper<Department>().eq(Department::getManagerId, targetUsr.getId()));
+                List<DepartmentOtherManager> otherManagerList = departmentOtherManagerMapper.selectList(new LambdaQueryWrapper<DepartmentOtherManager>().eq(DepartmentOtherManager::getOtherManagerId, targetUsr.getId()));
+                List<Integer> deptIds=new ArrayList<>();
+                deptIds.add(-1);
+                List<Integer> managerDeptIds = departmentList.stream().map(Department::getDepartmentId).distinct().collect(Collectors.toList());
+                List<Integer> otherManagerDeptIds = otherManagerList.stream().map(DepartmentOtherManager::getDepartmentId).distinct().collect(Collectors.toList());
+                deptIds.addAll(managerDeptIds);
+                List<Integer> finalDeptIds1 = deptIds;
+                managerDeptIds.forEach(m->{
+                    List<Integer> branchDepartment = getBranchDepartment(m, departments);
+                    finalDeptIds1.addAll(branchDepartment);
+                });
+                deptIds.addAll(otherManagerDeptIds);
+                List<Integer> finalDeptIds = deptIds;
+                otherManagerDeptIds.forEach(o->{
+                    List<Integer> branchDepartment = getBranchDepartment(o, departments);
+                    finalDeptIds.addAll(branchDepartment);
+                });
+                deptIds=deptIds.stream().distinct().collect(Collectors.toList());
+                queryWrapper.in(Product::getCreatorId,deptIds);
+            }
+        }
         if(!StringUtils.isEmpty(userId)){
             queryWrapper.eq(Product::getCreatorId,userId);
         }
@@ -362,4 +400,18 @@ public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> impl
         String fileName="产品表导出_"+ System.currentTimeMillis();
         return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,fileName,dataList,path);
     }
+
+    //递归获取子部门
+    public List<Integer> getBranchDepartment(Integer departmentId, List<Department> departmentList) {
+        List<Integer> list = new ArrayList<>();
+        list.add(departmentId);
+        //搜到子部门进行添加
+        for (Department department : departmentList) {
+            if (departmentId.equals(department.getSuperiorId())) {
+                list.addAll(getBranchDepartment(department.getDepartmentId(), departmentList));
+            }
+        }
+        return list;
+    }
+
 }

+ 72 - 69
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectApprovalController.java

@@ -85,6 +85,7 @@ public class ProjectApprovalController {
         String[] arr=new String[]{"正常","紧急","重要","重要且紧急","低风险","中风险","高风险"};
         User user = userMapper.selectById(request.getHeader("token"));
         Integer companyId = user.getCompanyId();
+        WxCorpInfo wxCorpInfo = wxCorpInfoService.getOne(new LambdaQueryWrapper<WxCorpInfo>().eq(WxCorpInfo::getCompanyId, companyId));
         List<User> userList = userMapper.selectList(new LambdaQueryWrapper<User>().eq(User::getCompanyId, companyId));
         List<ProjectCategory> categoryList = projectCategoryService.list(new LambdaQueryWrapper<ProjectCategory>().eq(ProjectCategory::getCompanyId, companyId));
         projectApproval.setCompanyId(companyId);
@@ -155,77 +156,79 @@ public class ProjectApprovalController {
             }
             if(projectApprovalCheckList.size()>0){
                 projectApprovalCheckService.saveOrUpdateBatch(projectApprovalCheckList);
-                //更新审核人 发送到企业微信完成审核动作
-                String detail = wxCorpInfoService.getTemplateDetail(request, 0);
-                if(detail!=null&&!StringUtils.isEmpty(detail)){
-                    DateTimeFormatter df=DateTimeFormatter.ofPattern("yyyy-MM-dd");
-                    JSONObject resultOb = JSONObject.parseObject(detail);
-                    JSONObject template_content = resultOb.getJSONObject("template_content");
-                    JSONArray controls = template_content.getJSONArray("controls");
-                    Map<String,Object> templateMap=new HashMap<>();
-                    WxCorpTemplate template = wxCorpTemplateService.getById(companyId);
-                    JSONObject requestData=new JSONObject();
-                    requestData.put("template_id",template.getTemplateId());
-                    requestData.put("creator_userid",user.getCorpwxUserid());
-                    //审核模式  0-通过接口指定审批人、抄送人(此时approver、notifyer等参数可用);1-使用此模板在管理后台设置的审批流程(需要保证审批流程中没有“申请人自选”节点),支持条件审批
-                    requestData.put("use_template_approver",1);
-                    JSONObject apply_data=new JSONObject();
-                    JSONArray contents=new JSONArray();
-                    for (int i = 0; i < controls.size(); i++) {
-                        JSONObject item = controls.getJSONObject(i);
-                        JSONObject property = item.getJSONObject("property");
-                        //控件id指定到指定控件
-                        String templateId = property.getString("id");
-                        //控件名称 这里为了统一工时管家格式 限制企业需要用到我们提供的名称(项目编号 项目名称 项目分类 项目类型 项目经理 级别 合同金额 计划开始日期 计划结束日期)
-                        String title = property.getString("title");
-                        //控件类型 在这里统一用Text  Text-文本;Textarea-多行文本;Number-数字;Money-金额;Date-日期/日期+时间;Selector-单选/多选;Contact-成员/部门;Tips-说明文字;File-附件;Table-明细;Attendance-假勤控件;Vacation-请假控件;Location-位置;RelatedApproval-关联审批单;Formula-公式;DateRange-时长;BankAccount-收款账户
-                        String control = property.getString("control");
-                        //是否必填
-                        String require = property.getString("require");
-                        //是否打印
-                        String un_print = property.getString("un_print");
-                        JSONObject content=new JSONObject();
-                        content.put("control",control);
-                        content.put("id",templateId);
-                        JSONObject value=new JSONObject();
-                        switch (title){
-                            case "项目编号":
-                                value.put("text",projectApproval.getProjectCode());
-                                break;
-                            case "项目名称":
-                                value.put("text",projectApproval.getProjectName());
-                                break;
-                            case "项目分类":
-                                value.put("text",projectApproval.getCategoryName());
-                                break;
-                            case "项目类型":
-                                value.put("text",projectApproval.getIsPublic()==0?"正式项目":"非项目");
-                                break;
-                            case "项目经理":
-                                value.put("text",projectApproval.getInchargerName());
-                                break;
-                            case "级别":
-                                value.put("text",arr[projectApproval.getLevel()-1]);
-                                break;
-                            case "合同金额":
-                                value.put("text",projectApproval.getContractAmount());
-                                break;
-                            case "计划开始日期":
-                                value.put("text",df.format(projectApproval.getPlanStartDate()));
-                                break;
-                            case "计划结束日期":
-                                value.put("text",df.format(projectApproval.getPlanEndDate()));
-                                break;
+                if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                    //更新审核人 发送到企业微信完成审核动作
+                    String detail = wxCorpInfoService.getTemplateDetail(request, 0);
+                    if(detail!=null&&!StringUtils.isEmpty(detail)){
+                        DateTimeFormatter df=DateTimeFormatter.ofPattern("yyyy-MM-dd");
+                        JSONObject resultOb = JSONObject.parseObject(detail);
+                        JSONObject template_content = resultOb.getJSONObject("template_content");
+                        JSONArray controls = template_content.getJSONArray("controls");
+                        Map<String,Object> templateMap=new HashMap<>();
+                        WxCorpTemplate template = wxCorpTemplateService.getById(companyId);
+                        JSONObject requestData=new JSONObject();
+                        requestData.put("template_id",template.getTemplateId());
+                        requestData.put("creator_userid",user.getCorpwxUserid());
+                        //审核模式  0-通过接口指定审批人、抄送人(此时approver、notifyer等参数可用);1-使用此模板在管理后台设置的审批流程(需要保证审批流程中没有“申请人自选”节点),支持条件审批
+                        requestData.put("use_template_approver",1);
+                        JSONObject apply_data=new JSONObject();
+                        JSONArray contents=new JSONArray();
+                        for (int i = 0; i < controls.size(); i++) {
+                            JSONObject item = controls.getJSONObject(i);
+                            JSONObject property = item.getJSONObject("property");
+                            //控件id指定到指定控件
+                            String templateId = property.getString("id");
+                            //控件名称 这里为了统一工时管家格式 限制企业需要用到我们提供的名称(项目编号 项目名称 项目分类 项目类型 项目经理 级别 合同金额 计划开始日期 计划结束日期)
+                            String title = property.getString("title");
+                            //控件类型 在这里统一用Text  Text-文本;Textarea-多行文本;Number-数字;Money-金额;Date-日期/日期+时间;Selector-单选/多选;Contact-成员/部门;Tips-说明文字;File-附件;Table-明细;Attendance-假勤控件;Vacation-请假控件;Location-位置;RelatedApproval-关联审批单;Formula-公式;DateRange-时长;BankAccount-收款账户
+                            String control = property.getString("control");
+                            //是否必填
+                            String require = property.getString("require");
+                            //是否打印
+                            String un_print = property.getString("un_print");
+                            JSONObject content=new JSONObject();
+                            content.put("control",control);
+                            content.put("id",templateId);
+                            JSONObject value=new JSONObject();
+                            switch (title){
+                                case "项目编号":
+                                    value.put("text",projectApproval.getProjectCode());
+                                    break;
+                                case "项目名称":
+                                    value.put("text",projectApproval.getProjectName());
+                                    break;
+                                case "项目分类":
+                                    value.put("text",projectApproval.getCategoryName());
+                                    break;
+                                case "项目类型":
+                                    value.put("text",projectApproval.getIsPublic()==0?"正式项目":"非项目");
+                                    break;
+                                case "项目经理":
+                                    value.put("text",projectApproval.getInchargerName());
+                                    break;
+                                case "级别":
+                                    value.put("text",arr[projectApproval.getLevel()-1]);
+                                    break;
+                                case "合同金额":
+                                    value.put("text",projectApproval.getContractAmount());
+                                    break;
+                                case "计划开始日期":
+                                    value.put("text",df.format(projectApproval.getPlanStartDate()));
+                                    break;
+                                case "计划结束日期":
+                                    value.put("text",df.format(projectApproval.getPlanEndDate()));
+                                    break;
+                            }
+                            content.put("value",value);
+                            contents.add(content);
                         }
-                        content.put("value",value);
-                        contents.add(content);
-                    }
-                    apply_data.put("contents",contents);
-                    requestData.put("apply_data",apply_data);
-                    System.out.println("===============>发送到企业微信的数据"+requestData);
+                        apply_data.put("contents",contents);
+                        requestData.put("apply_data",apply_data);
+                        System.out.println("===============>发送到企业微信的数据"+requestData);
 //                    wxCorpInfoService.applyEvent(request,requestData);
-                }else {
-                    throw  new Exception("企业暂未同步服务商审批模板,推送企业微信审批失败,请联系服务商!");
+                    }else {
+                        throw  new Exception("企业暂未同步服务商审批模板,推送企业微信审批失败,请联系服务商!");
+                    }
                 }
             }
         }

+ 2 - 5
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/UserWithBeisenController.java

@@ -23,6 +23,7 @@ import org.springframework.web.bind.annotation.RestController;
 
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
+import java.time.Duration;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.LocalTime;
@@ -232,7 +233,7 @@ public class UserWithBeisenController {
             return msg;
         }
         JSONObject item = BeiSenUtils.getAttendanceStatisticWithUser(createDate,withBeisen.get().getUserId(), beisenConfig.getAppKey(), beisenConfig.getAppSecret());
-        JSONArray allOverTimeList = BeiSenUtils.getScheduledOverTimeRangeList(createDate,createDate,withBeisen.get().getUserId(), beisenConfig.getAppKey(), beisenConfig.getAppSecret());
+        JSONArray allOverTimeList = BeiSenUtils.getOverTimeList(createDate,beisenConfig.getAppKey(),beisenConfig.getAppSecret(),1,100);
         //获取当前数据下的人员工号对应到工时管家
         Optional<User> first = userList.stream().filter(f -> f.getJobNumber().equals(withBeisen.get().getJobNumber())).findFirst();
         System.out.println("考勤数据:"+item.toString());
@@ -249,10 +250,6 @@ public class UserWithBeisenController {
             if(beisen.isPresent()){
                 List<JSONObject> overTimeList = overTimeStream.filter(a -> a.getString("StaffId").equals(beisen.get().getUserId())
                         && a.getIntValue("ApproveStatus") == 2).collect(Collectors.toList());
-                System.out.println("加班时长数据:"+overTimeList.toString());
-                for (JSONObject jsonObject : overTimeList) {
-                    System.out.println("加班时长:"+jsonObject.getDouble("ActualOverTimeDuration"));
-                }
                 if(overTimeList.size()>0){
                     double actualOverTimeDuration = overTimeList.stream().mapToDouble(i -> i.getDouble("ActualOverTimeDuration")).sum();
                     if(workDay){

+ 24 - 8
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java

@@ -8177,6 +8177,10 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                 }
             }else  sDate = LocalDate.parse(startDate).atTime(LocalTime.MIN);
             List<LocalDateTime> dateTimeList=getDays(sDate, eDate);
+            //针对美莱德 去除2024-02-09
+            if(user.getCompanyId()==876){
+                dateTimeList=dateTimeList.stream().filter(d->d.isEqual(LocalDate.parse(startDate).atTime(LocalTime.MIN))).collect(Collectors.toList());
+            }
             List<Map<String,Object>> dataList=new ArrayList<>();
             long days =dateTimeList.size();
             List<LeaveSheet> leaveSheets = leaveSheetList.stream().filter(ls -> ls.getOwnerId().equals(user.getId())
@@ -8223,12 +8227,15 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
             if(leaveSheets.size()>0){
                 for (LeaveSheet leaveSheet : leaveSheets) {
                     List<LocalDateTime> leaveDateList = getDays(leaveSheet.getStartDate().atTime(LocalTime.MIN), leaveSheet.getEndDate().atTime(LocalTime.MIN));
-                    /*if(leaveSheet.getTimeDays()<=1){
-                        days-=1;
-                    }else{
-                        days-=leaveSheet.getTimeDays();
-                    }*/
+                    //针对美莱德 去除2024-02-09
+                    if(user.getCompanyId()==876){
+                        leaveDateList=leaveDateList.stream().filter(d->d.isEqual(LocalDate.parse("2024-02-09").atTime(LocalTime.MIN))).collect(Collectors.toList());
+                    }
                     List<LocalDateTime> list = getDays(leaveSheet.getStartDate().atTime(LocalTime.now()), leaveSheet.getEndDate().atTime(LocalTime.now()));
+                    //针对美莱德 去除2024-02-09
+                    if(user.getCompanyId()==876){
+                        list=list.stream().filter(d->d.isEqual(LocalDate.parse("2024-02-09").atTime(LocalTime.MIN))).collect(Collectors.toList());
+                    }
                     if(list.size()>1){
                         days-=list.size();
                     }else {
@@ -8267,6 +8274,12 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                     //去掉sql返回的毫秒值
                     Timestamp timestamp = (Timestamp) map.get("createTime");
                     LocalDate createDate = LocalDate.parse(String.valueOf(date));
+//                    针对美莱德 去除2024-02-09
+                    if(user.getCompanyId()==876){
+                        if(createDate.isEqual(LocalDate.parse("2024-02-09"))){
+                            continue;
+                        }
+                    }
                     LocalDate createTimeDate =timestamp.toLocalDateTime().toLocalDate();
                     //根据设置
                     switch (timeliness){
@@ -13119,18 +13132,19 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         row_first.add("");
         row_first.add("");
         row_first.add("");
+        row_first.add("");
         row_first.add("工时耗用率");
         for (int i = 0; i < row_first.size(); i++) {
             SXSSFCell tempCell = row0.createCell(i);
             tempCell.setCellValue(row_first.get(i));
             tempCell.setCellStyle(headStyle);
         }
-        sheet.addMergedRegion(new CellRangeAddress(0,0,4,7));
+        sheet.addMergedRegion(new CellRangeAddress(0,0,4,8));
         sheet.addMergedRegion(new CellRangeAddress(0,1,0,0));
         sheet.addMergedRegion(new CellRangeAddress(0,1,1,1));
         sheet.addMergedRegion(new CellRangeAddress(0,1,2,2));
         sheet.addMergedRegion(new CellRangeAddress(0,1,3,3));
-        sheet.addMergedRegion(new CellRangeAddress(0,1,8,8));
+        sheet.addMergedRegion(new CellRangeAddress(0,1,9,9));
         //第二行
         SXSSFRow row1 = sheet.createRow(rowNum++);
         row1.setHeight((short)500);
@@ -13139,6 +13153,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         row_second.add("");
         row_second.add("");
         row_second.add("");
+        row_second.add("增补工时");
         row_second.add("正常工时");
         row_second.add("加班工时");
         row_second.add("合计工时");
@@ -13180,6 +13195,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
             }
             list.add(String.valueOf(map.get("groupName")));
             list.add(String.valueOf(map.get("planHour")));
+            list.add(String.valueOf(map.get("afterSetPlanHour")));
             list.add(String.valueOf(map.get("normalHour")));
             list.add(String.valueOf(map.get("overHour")));
             list.add(String.valueOf(map.get("realHour")));
@@ -13190,7 +13206,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         for(int i = 0;i<mapList.size();i++){
             SXSSFRow tempRow = sheet.createRow(rowNum++);
             tempRow.setHeight((short)500);
-            for(int j=0;j<9;j++){
+            for(int j=0;j<10;j++){
                 SXSSFCell tempCell = tempRow.createCell(j);
                 String cellValue = "";
                 tempCell.setCellStyle(cellStyle);

+ 4 - 3
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/WxCorpInfoServiceImpl.java

@@ -2357,14 +2357,14 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
     public void copyTemplate(HttpServletRequest request,Integer templateType) throws Exception {
         User user = userMapper.selectById(request.getHeader("token"));
         WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", user.getCompanyId()));
-        String url=GET_TEMPLATE_DETAIL.replace("ACCESS_TOKEN",getCorpAccessToken(wxCorpInfo));
+        String url=COPY_TEMPLATE.replace("ACCESS_TOKEN",getCorpAccessToken(wxCorpInfo));
         HttpHeaders headers = new HttpHeaders();
         RestTemplate restTemplate = new RestTemplate();
         MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8");
         headers.setContentType(type);
         headers.add("Accept", MediaType.APPLICATION_JSON.toString());
         JSONObject requestMap = new JSONObject();
-        requestMap.put("template_id","1bc0b9fc084369083b6abb970d658f3a_75187226");
+        requestMap.put("open_template_id","1bc0b9fc084369083b6abb970d658f3a_75187226");
         HttpEntity<JSONObject> entity = new HttpEntity<>(requestMap, headers);
         ResponseEntity<String> ResponseEntity = restTemplate.postForEntity(url, entity, String.class);
         if (ResponseEntity.getStatusCode() == HttpStatus.OK) {
@@ -2391,7 +2391,7 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
             copyTemplate(request,templateType);
             template = wxCorpTemplateService.getById(wxCorpInfo.getCompanyId());
         }
-        String url=COPY_TEMPLATE.replace("ACCESS_TOKEN",getCorpAccessToken(wxCorpInfo));
+        String url=GET_TEMPLATE_DETAIL.replace("ACCESS_TOKEN",getCorpAccessToken(wxCorpInfo));
         HttpHeaders headers = new HttpHeaders();
         RestTemplate restTemplate = new RestTemplate();
         MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8");
@@ -2425,6 +2425,7 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
         ResponseEntity<String> ResponseEntity = restTemplate.postForEntity(url, entity, String.class);
         if (ResponseEntity.getStatusCode() == HttpStatus.OK) {
             String resp = ResponseEntity.getBody();
+            System.out.println(resp);
         }
     }
 }

+ 2 - 2
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/util/BeiSenUtils.java

@@ -292,8 +292,8 @@ public class BeiSenUtils {
         headers.add("Authorization","Bearer "+accessToken);
         JSONObject requestMap = new JSONObject();
         requestMap.put("startDate",startDate);
-        List<String> staffIds=new ArrayList<>();
-        staffIds.add(userId);
+        List<Integer> staffIds=new ArrayList<>();
+        staffIds.add(Integer.valueOf(userId));
         requestMap.put("stopDate",endDate);
         requestMap.put("staffIds",staffIds);
         System.out.println("--------headers请求头数据-------"+headers);

+ 4 - 2
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ReportMapper.xml

@@ -838,8 +838,10 @@
         group by p.id,u.id,tg.id
     </select>
     <select id="getReportFillStatus" resultType="java.util.Map">
-        SELECT DATE_FORMAT(create_date,'%Y-%m-%d') as createDate, IF (MAX(state) = 1, MIN(state), MAX(state)) AS state FROM report
-        WHERE create_date BETWEEN #{startDate} AND #{endDate} AND creator_id = #{userId} GROUP BY create_date
+        SELECT DATE_FORMAT(r.create_date,'%Y-%m-%d') AS createDate, IF (MAX(r.state) = 1, MIN(r.state), MAX(r.state)) AS state,IF(ufv.work_hours &lt; r.working_time,1,0) AS exceedCardTime
+        FROM report r
+        LEFT JOIN user_fv_time ufv ON ufv.work_date=r.create_date AND ufv.user_id=r.creator_id
+        WHERE r.create_date BETWEEN #{startDate} AND #{endDate} AND r.creator_id = #{userId} GROUP BY r.create_date
     </select>
     <select id="getUserDailyWorkTime" resultType="java.util.Map">
         SELECT user.id, user.name,department.department_name as departmentName,department.corpwx_deptid as corpwxDeptId, report.create_date as createDate, sum(working_time) as workingTime,user.inactive_date as inactiveDate,user.corpwx_userid as corpwxUserId

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

@@ -255,7 +255,7 @@
         <if test="groupId != null">
             and task.group_id = #{groupId}
         </if>
-        and task_status = 0 order by task.id desc limit 50
+        and task_status = 0 order by task.id desc limit 300
     </select>
     <select id="selectMilepost" resultType="com.management.platform.entity.Task">
         select * from task where

+ 4 - 0
fhKeeper/formulahousekeeper/octopus/src/views/customer/list.vue

@@ -151,6 +151,7 @@
                         <div style="width:33%; float:left;"><el-checkbox v-model="dialogData.packageSimple">简单表格</el-checkbox></div>
                         <div style="width:33%; float:left;"><el-checkbox v-model="dialogData.packageFinance">财务核算</el-checkbox></div>
                         <div style="width:33%; float:left;"><el-checkbox v-model="dialogData.packageProvider">供应商管理</el-checkbox></div>
+                        <div style="width:33%; float:left;"><el-checkbox v-model="dialogData.packageProjectApproval">立项管理</el-checkbox></div>
                     </div>
                     
                     <!-- <span>{{scope.row.packageWorktime ? "工时 +" : ""}}</span>
@@ -405,6 +406,7 @@ import App from '../../App.vue';
                     this.dialogData.packageFinance = this.dialogData.packageFinance ? true : false,
                     this.dialogData.packageProvider = this.dialogData.packageProvider ? true : false,
                     this.dialogData.financeAudit = this.dialogData.financeAudit ? true : false
+                    this.dialogData.packageProjectApproval = this.dialogData.packageProjectApproval ? true : false
                 }
                 else if(i == 'D'){ this.editDialogD = true }
                 else if (i=='E') {
@@ -672,6 +674,7 @@ import App from '../../App.vue';
                         packageSimple: this.dialogData.packageSimple ? 1 : 0,
                         packageFinance: this.dialogData.packageFinance ? 1 : 0,
                         packageProvider: this.dialogData.packageProvider ? 1 : 0,
+                        packageProjectApproval: this.dialogData.packageProjectApproval ? 1 : 0,
                     },
                 res => {
                     this.listLoading = false;
@@ -935,6 +938,7 @@ import App from '../../App.vue';
                             res.data.records[i].packageEngineering == 1 ? arrList.push('工程专业') : ''
                             res.data.records[i].packageSimple == 1 ? arrList.push('简单表格') : ''
                             res.data.records[i].packageFinance == 1 ? arrList.push('财务核算') : ''
+                            res.data.records[i].packageProjectApproval == 1 ? arrList.push('立项管理') : ''
                             res.data.records[i].arrList = arrList
                         }
                         var list = res.data.records;

+ 6 - 0
fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/entity/Company.java

@@ -72,6 +72,12 @@ public class Company extends Model<Company> {
     @TableField("package_project")
     private Integer packageProject;
 
+    /**
+     * 立项管理
+     */
+    @TableField("package_project_approval")
+    private Integer packageProjectApproval;
+
     /**
      * 合同平台
      */

+ 4 - 1
fhKeeper/formulahousekeeper/ops-platform/src/main/resources/mapper/CompanyMapper.xml

@@ -20,13 +20,16 @@
         <result column="package_simple" property="packageSimple" />
         <result column="package_finance" property="packageFinance" />
         <result column="package_provider" property="packageProvider" />
+        <result column="package_project_approval" property="packageProjectApproval" />
         <result column="is_international" property="isInternational" />
         <result column="create_date" property="createDate" />
+        <result column="reg_from" property="regFrom" />
+        <result column="non_project_simple" property="nonProjectSimple" />
     </resultMap>
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        id, company_name, staff_count_max, expiration_date, set_meal, package_worktime, package_project, package_contract, package_oa, package_etimecard, package_expense, package_customer, package_engineering, package_simple, package_finance, package_provider, is_international, create_date
+        id, company_name, staff_count_max, expiration_date, set_meal, package_worktime, package_project, package_contract, package_oa, package_etimecard, package_expense, package_customer, package_engineering, package_simple, package_finance, package_provider, package_project_approval, is_international, create_date, reg_from, non_project_simple
     </sql>
 
 </mapper>

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

@@ -232,7 +232,7 @@
                     </el-table-column>
                     <el-table-column prop="workingTime" label="单件工时(分)"  width="140">
                         <template slot-scope="scope">
-                            <el-input v-model.number="scope.row.workingTime"   clearable maxlength="11" placeholder="请输入"></el-input>
+                            <el-input type="number" v-model="scope.row.workingTime"   clearable maxlength="11" placeholder="请输入"></el-input>
                         </template>
                     </el-table-column>
                     <el-table-column prop="unitPrice" label="单件工价(元)" width="140">
@@ -262,8 +262,8 @@
                         <i class="el-icon-plus" @click="addProcedure()"></i>
                         <span>合计</span>
                     </div>
-                    <div class="workshopTotalText">{{ pieceHourTotal }}</div>
-                    <div>{{ priceSingleTotal }}</div>
+                    <div class="workshopTotalText">{{ pieceHourTotal.toFixed(2) }}</div>
+                    <div>{{ priceSingleTotal.toFixed(2) }}</div>
                 </div>
 
             </div>

+ 22 - 3
fhKeeper/formulahousekeeper/timesheet/src/views/projectApproval/projectApproval.vue

@@ -231,11 +231,12 @@
                                     <div>
                                         <div v-for="(item, index) in pointList" :key="index" >
                                         第{{index+1}}审核人:
-                                        <el-select :disabled="item.status!=0" v-if="user.userNameNeedTranslate != 1" v-model="item.userId" style="width:140px;" :placeholder="$t('defaultText.pleaseChoose')" clearable @change="manageSelect" size="small" filterable popper-class="managePopperClass">
-                                            <el-option v-for="item in users" :key="item.id" :label="item.name" :value="item.id">
+                                        <el-select  v-if="user.userNameNeedTranslate != 1" :disabled="item.status!=0" v-model="item.userId" style="width:140px;" :placeholder="$t('defaultText.pleaseChoose')" clearable @change="manageSelect" size="small" filterable popper-class="managePopperClass">
+                                            <el-option v-for="item in participator" :key="item.id" :label="item.name" :value="item.id">
                                                 <span style="float: left">{{ item.name }}</span>
                                             </el-option>
                                         </el-select> 
+                                        <selectCat v-if="user.userNameNeedTranslate == 1" :size="'medium'" :subject="participator" :subjectId="item.userId" :distinction="'12'" @selectCal="selectCal" :disabled="canOnlyModParticipator || projectManagerEdit || isShowProjectName"></selectCat>
                                         <i class="el-icon-circle-plus-outline" @click="addInput(index)" v-if="index==pointList.length-1"></i>
                                         <i class="el-icon-remove-outline" v-if="pointList.length>1 && item.status==0"  @click="deleteInput(index)"></i>
                                         <span>{{item.status==0?'待审核':item.status==1?"已审核":"已驳回"}}</span>
@@ -363,9 +364,12 @@
 </template>
 
 <script>
+import selectCat from "@/components/select.vue"
 export default {
 name: '',
-components: {},
+components: {
+    selectCat
+},
 props: { },
 data() { 
 return {
@@ -647,6 +651,10 @@ methods: {
             for (var m=0;m<this.baseCostItemList.length; m++) {
                 this.projectBaseCostData.push({baseId: this.baseCostItemList[m].id, baseName:this.baseCostItemList[m].name, baseAmount:0});
             }
+            this.pointList=[{
+                "userId":"",
+                "status":0
+            }]
         } else {
             this.http.post('/project-approval/getDetail', {id: item.id},
             res => {
@@ -1028,6 +1036,12 @@ methods: {
             let userList = obj.id
             console.log(obj)
             this.curProfessionRow.membList[obj.other].membId = userList
+        } else if(obj.distinction == '12') {
+            this.pointList.push({
+                "userId":obj.id,
+                "status":0
+            })
+            this.pointList=this.pointList.filter(i=>i.userId!="")
         }
     },
     getProjectBaseData(projectId) {
@@ -1065,6 +1079,11 @@ methods: {
                     if (res.code == "ok") {
                         if(res.data.length>0){
                             this.pointList = res.data;
+                        }else{
+                            this.pointList=[{
+                                "userId":"",
+                                "status":0
+                            }]
                         }
                     } else {
                         this.$message({

+ 4 - 5
fhKeeper/formulahousekeeper/timesheet/src/views/workReport/daily.vue

@@ -18,9 +18,9 @@
                                 <br>
                                 <span style="font-size:10px;text-align:center;color:#999;">{{item.weekDay}}</span>
                                 <span class="chooseDate" v-if="index == choseDay"></span>
-                                <!-- <el-tooltip v-if="index == choseDay" effect="dark" content="填报时长超过北森考勤时长" placement="top-start">
+                                <el-tooltip v-if="item.exceedCardTime" effect="dark" content="填报时长超过北森考勤时长" placement="top-start">
                                 <i class="el-icon-warning" style="color:red;"></i>
-                                </el-tooltip> -->
+                                </el-tooltip>
                                 </div>
                             </div>
                             </span>
@@ -2814,9 +2814,8 @@
             refreshBeiSengAttendance(workdate) {
                  if (!workdate) return;
                 this.syncTimeLoading = true;
-                this.http.post('/user-with-beisen/syncAttendanceFromBeisen',{
-                    startDate: workdate,
-                    endDate: workdate
+                this.http.post('/user-with-beisen/getAttendanceStatisticWithUser',{
+                    createDate: workdate
                 },res => {
                     this.syncTimeLoading = false;
                     if(res.code == 'ok'){