Forráskód Böngészése

项目成本预算修改

seyason 3 éve
szülő
commit
84325ed349
50 módosított fájl, 1029 hozzáadás és 62 törlés
  1. 10 3
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/DingDingController.java
  2. 21 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectAddcostItemController.java
  3. 56 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectAddcostRecordController.java
  4. 12 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectController.java
  5. 60 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectCurrentcostController.java
  6. 58 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportController.java
  7. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/WeiXinCorpController.java
  8. 61 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/ProjectAddcostItem.java
  9. 54 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/ProjectAddcostRecord.java
  10. 7 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/ProjectBasecostSetting.java
  11. 62 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/ProjectCurrentcost.java
  12. 8 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/Report.java
  13. 13 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/TimeType.java
  14. 16 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ProjectAddcostItemMapper.java
  15. 19 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ProjectAddcostRecordMapper.java
  16. 16 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ProjectCurrentcostMapper.java
  17. 3 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ProjectMapper.java
  18. 2 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ReportMapper.java
  19. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/DingDingService.java
  20. 16 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ProjectAddcostItemService.java
  21. 22 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ProjectAddcostRecordService.java
  22. 16 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ProjectCurrentcostService.java
  23. 4 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ProjectService.java
  24. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/WxCorpInfoService.java
  25. 4 4
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/DingDingServiceImpl.java
  26. 20 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectAddcostItemServiceImpl.java
  27. 135 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectAddcostRecordServiceImpl.java
  28. 20 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectCurrentcostServiceImpl.java
  29. 38 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java
  30. 46 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java
  31. 11 17
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/WxCorpInfoServiceImpl.java
  32. 4 4
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/task/TimingTask.java
  33. 20 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ProjectAddcostItemMapper.xml
  34. 37 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ProjectAddcostRecordMapper.xml
  35. 2 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ProjectBasecostSettingMapper.xml
  36. 19 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ProjectCurrentcostMapper.xml
  37. 15 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ProjectMapper.xml
  38. 22 10
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ReportMapper.xml
  39. 3 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/TimeTypeMapper.xml
  40. 1 1
      fhKeeper/formulahousekeeper/octopus/config/index.js
  41. 39 4
      fhKeeper/formulahousekeeper/timesheet/src/views/settings/timetype.vue
  42. 17 2
      fhKeeper/formulahousekeeper/timesheet/src/views/workReport/daily.vue
  43. 6 1
      fhKeeper/formulahousekeeper/timesheet/src/views/workReport/list.vue
  44. 1 1
      fhKeeper/formulahousekeeper/timesheet/src/views/workReport/list_department.vue
  45. 1 1
      fhKeeper/formulahousekeeper/timesheet/src/views/workReport/list_profession.vue
  46. 25 1
      fhKeeper/formulahousekeeper/timesheet_h5/src/views/edit/index.vue
  47. 1 0
      fhKeeper/formulahousekeeper/timesheet_h5/src/views/review/department_list.vue
  48. 1 0
      fhKeeper/formulahousekeeper/timesheet_h5/src/views/review/index.vue
  49. 1 0
      fhKeeper/formulahousekeeper/timesheet_h5/src/views/review/profession_list.vue
  50. 1 0
      fhKeeper/formulahousekeeper/timesheet_h5/src/views/view/index.vue

+ 10 - 3
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/DingDingController.java

@@ -138,6 +138,7 @@ public class DingDingController {
                      */
                     JSONArray bizData = eventJson.getJSONArray("bizData");
                     if (bizData.size() > 0) {
+                        //优先处理suite_ticket推送
                         for (int i=0;i<bizData.size(); i++) {
                             JSONObject bizItem = bizData.getJSONObject(i);
                             int bizType = bizItem.getInteger("biz_type");
@@ -149,7 +150,13 @@ public class DingDingController {
                                     System.out.println("==Push 推送事件 suite_ticket===");
                                     dingDingService.updateSuiteTicket(biz_data.getString("suiteTicket"));
                                 }
-                            } else if (bizType == 4) {
+                            }
+                        }
+                        //再处理其他的情况
+                        for (int i=0;i<bizData.size(); i++) {
+                            JSONObject bizItem = bizData.getJSONObject(i);
+                            int bizType = bizItem.getInteger("biz_type");
+                            if (bizType == 4) {
                                 //企业授权变更,包含授权、解除授权、授权变更。
                                 JSONObject biz_data = JSONObject.parseObject(bizItem.getString("biz_data"));
                                 System.out.println("授权变更数据===@@");
@@ -318,7 +325,7 @@ public class DingDingController {
                 return msg;
             } else {
                 long t1 = System.currentTimeMillis();
-                dingDingService.syncUserWorkData(dingding, startDate, endDate);
+                dingDingService.syncUserWorkData(dingding, startDate, endDate, true);
                 long t2 = System.currentTimeMillis();
                 System.out.println("总共耗时:"+(t2-t1)+"ms");
             }
@@ -335,7 +342,7 @@ public class DingDingController {
             } else {
                 long t1 = System.currentTimeMillis();
                 for (int i=0;i<dingdingList.size(); i++) {
-                    dingDingService.syncUserWorkData(dingdingList.get(i), startDate, endDate);
+                    dingDingService.syncUserWorkData(dingdingList.get(i), startDate, endDate, true);
                 }
                 long t2 = System.currentTimeMillis();
                 System.out.println("总共耗时:"+(t2-t1)+"ms");

+ 21 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectAddcostItemController.java

@@ -0,0 +1,21 @@
+package com.management.platform.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-05-07
+ */
+@RestController
+@RequestMapping("/project-addcost-item")
+public class ProjectAddcostItemController {
+
+}
+

+ 56 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectAddcostRecordController.java

@@ -0,0 +1,56 @@
+package com.management.platform.controller;
+
+
+import com.management.platform.entity.ProjectAddcostRecord;
+import com.management.platform.service.ProjectAddcostRecordService;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-05-07
+ */
+@RestController
+@RequestMapping("/project-addcost-record")
+public class ProjectAddcostRecordController {
+    @Resource
+    ProjectAddcostRecordService projectAddcostRecordService;
+
+    /**
+     * 下拨预算
+     * @param item
+     * @param itemList
+     * @return
+     */
+    @RequestMapping("/add")
+    public HttpRespMsg add(ProjectAddcostRecord item, String itemList) {
+        return projectAddcostRecordService.add(item, itemList);
+    }
+
+    /**
+     * 撤销下拨
+     * @param id
+     * @return
+     */
+    @RequestMapping("/revert")
+    public HttpRespMsg revert(Integer id) {
+        return projectAddcostRecordService.revert(id);
+    }
+
+    /**
+     *
+     */
+    @RequestMapping("/getAddList")
+    public HttpRespMsg getAddList(Integer companyId, Integer projectId) {
+        return projectAddcostRecordService.getAddList(companyId, projectId);
+    }
+}
+

+ 12 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectController.java

@@ -64,6 +64,13 @@ public class ProjectController {
         return projectService.getProjectPage(pageIndex, pageSize, keyword,searchField, status, category, request);
     }
 
+    @RequestMapping("/saveBatchAccoDegrees")
+    public HttpRespMsg saveBatchAccoDegrees(String ids,
+                                   String associateDegrees,
+                                   String associateDegreeNames) {
+        return projectService.saveBatchAccoDegrees(ids, associateDegrees, associateDegreeNames, request);
+    }
+
     /**
      * 添加或编辑项目
      * id 要编辑项目的id 可填
@@ -292,7 +299,11 @@ public class ProjectController {
         return projectService.getProjectInAndOut(pageIndex, pageSize, request);
     }
 
-
+    //分页查询项目收支平衡表
+    @RequestMapping("/getProjectCostAlarm")
+    public HttpRespMsg getProjectCostAlarm(@RequestParam Integer pageIndex, @RequestParam Integer pageSize) {
+        return projectService.getProjectCostAlarm(pageIndex, pageSize, request);
+    }
     //导出项目收支平衡表
     @RequestMapping("/exportProjectInAndOut")
     public HttpRespMsg exportProjectInAndOut() {

+ 60 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectCurrentcostController.java

@@ -0,0 +1,60 @@
+package com.management.platform.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.management.platform.entity.ProjectBasecostSetting;
+import com.management.platform.entity.ProjectCurrentcost;
+import com.management.platform.mapper.ProjectBasecostSettingMapper;
+import com.management.platform.mapper.ProjectCurrentcostMapper;
+import com.management.platform.mapper.ReportMapper;
+import com.management.platform.service.ProjectCurrentcostService;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Optional;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-05-07
+ */
+@RestController
+@RequestMapping("/project-currentcost")
+public class ProjectCurrentcostController {
+    @Resource
+    private ProjectCurrentcostService projectCurrentcostService;
+    @Resource
+    private ReportMapper reportMapper;
+    @Resource
+    ProjectBasecostSettingMapper projectBasecostSettingMapper;
+
+    @RequestMapping("/get")
+    public HttpRespMsg get(Integer companyId, Integer projectId) {
+        List<ProjectCurrentcost> projectCurrentcosts = projectCurrentcostService.list(new QueryWrapper<ProjectCurrentcost>().eq("project_id", projectId));
+        HttpRespMsg msg = new HttpRespMsg();
+        List<ProjectBasecostSetting> basecostSettingList = projectBasecostSettingMapper.selectList(new QueryWrapper<ProjectBasecostSetting>().eq("company_id", companyId).eq("alarm_type", 1));
+        double costLimit = projectCurrentcosts.stream().filter(cur->basecostSettingList.stream().anyMatch(setting -> setting.getId().equals(cur.getBaseId()))).mapToDouble(ProjectCurrentcost::getBaseAmount).sum();
+        projectCurrentcosts.forEach(cur->{
+            Optional<ProjectBasecostSetting> first = basecostSettingList.stream().filter(base -> base.getId().equals(cur.getBaseId())).findFirst();
+            if (first.isPresent()) {
+                cur.setAlarmType(first.get().getAlarmType());
+            }
+        });
+        double cost = reportMapper.getOneProjectCost(projectId);
+        HashMap map = new HashMap();
+        map.put("list", projectCurrentcosts);
+        map.put("reportCost", cost);
+        map.put("costLimit", costLimit);
+        msg.data = projectCurrentcosts;
+        return msg;
+    }
+}
+

+ 58 - 2
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportController.java

@@ -48,6 +48,8 @@ public class ReportController {
     @Autowired
     private ReportService reportService;
     @Resource
+    private ProjectBasecostSettingMapper projectBasecostSettingMapper;
+    @Resource
     private HttpServletRequest request;
     @Resource
     private AuditWorkflowTimeSettingMapper auditWorkflowTimeSettingMapper;
@@ -56,10 +58,14 @@ public class ReportController {
     @Resource
     private DepartmentMapper departmentMapper;
     @Resource
+    private ProjectCurrentcostMapper projectCurrentcostMapper;
+    @Resource
     private UserSalaryService userSalaryService;
     @Resource
     private TimeTypeMapper timeTypeMapper;
     @Resource
+    private ReportMapper reportMapper;
+    @Resource
     private ProjectMapper projectMapper;
     @Resource
     private SysFunctionMapper sysFunctionMapper;
@@ -151,7 +157,8 @@ public class ReportController {
                                   Integer[] groupId,//任务分组id
                                   Double[] customData,//自定义的数值
                                   String[] projectAuditorId,
-                                  Double[] overtimeHours //加班时长
+                                  Double[] overtimeHours, //加班时长
+                                  String[] customText
                                     ) {
         List<Report> reportList = new ArrayList<>();
         String token = request.getHeader("Token");
@@ -219,6 +226,12 @@ public class ReportController {
                 taskFinish[i] = 0;
             }
         }
+        if (customText == null) {
+            customText = new String[projectId.length];
+            for(int i=0;i<customText.length; i++) {
+                customText[i] = "-";
+            }
+        }
 
         //检查项目是否截止
         List<Integer> integers = Arrays.asList(projectId);
@@ -404,7 +417,6 @@ public class ReportController {
             for (int i = 0; i < id.length; i++) {
                 if (createDate[i].contains("@")) {
                     DateTimeFormatter mdFormatter = DateTimeFormatter.ofPattern("MM-dd");
-                    System.out.println("============这是批量填报=");
                     //这是批量填报的情况,日期有范围
                     String[] dateArray = createDate[i].split("@");
                     String startDate = dateArray[0];
@@ -455,6 +467,7 @@ public class ReportController {
                             report.setProjectAuditState(0);
                             report.setProjectAuditorId(projectAuditorId[i]);
                             report.setTaskFinish(taskFinish[i]);
+                            report.setCustomText(customText[i]);
 
                             if (auditWorkflowList.size() == 0) {
                                 //没有自定义审核流,默认的直接是项目负责人审核
@@ -512,6 +525,7 @@ public class ReportController {
                                         .setProjectAuditorId(projectAuditorId[i]);
                                 report.setProjectAuditState(0);
                                 report.setTaskFinish(taskFinish[i]);
+                                report.setCustomText(customText[i]);
                                 if (auditWorkflowList.size() == 0) {
                                     //没有自定义审核流,默认的直接是项目负责人审核
                                     report.setIsDeptAudit(0);
@@ -568,6 +582,7 @@ public class ReportController {
                         report.setProjectAuditState(0);
                         report.setProjectAuditorId(projectAuditorId[i]);
                         report.setTaskFinish(taskFinish[i]);
+                        report.setCustomText(customText[i]);
                         if (auditWorkflowList.size() == 0) {
                             //没有自定义审核流,默认的直接是项目负责人审核
                             report.setIsDeptAudit(0);
@@ -629,6 +644,7 @@ public class ReportController {
                                     .setFillUserid(token);
                             report.setProjectAuditState(1);
                             report.setTaskFinish(taskFinish[i]);
+                            report.setCustomText(customText[i]);
                             if (auditWorkflowList.size() == 0) {
                                 //没有自定义审核流,直接代填的,就算审核通过
                                 report.setIsDeptAudit(0);
@@ -715,6 +731,46 @@ public class ReportController {
             }
         }
 
+        //检查成本是否超过预算
+        List<ProjectBasecostSetting> projectBasecostSettings = projectBasecostSettingMapper.selectList(new QueryWrapper<ProjectBasecostSetting>().eq("company_id", user.getCompanyId()).eq("alarm_type", 1));
+        if (projectBasecostSettings.size() > 0) {
+            List<Integer> collect = projectBasecostSettings.stream().map(ProjectBasecostSetting::getId).collect(Collectors.toList());
+            List<Integer> projectIds = reportList.stream().map(Report::getProjectId).distinct().collect(Collectors.toList());
+            //获取当前项目的成本基线值
+            List<ProjectCurrentcost> projectCurrentcosts = projectCurrentcostMapper.selectList(new QueryWrapper<ProjectCurrentcost>().in("base_id", collect).in("project_id", projectIds));
+            Map<Integer, List<ProjectCurrentcost>> listMap = projectCurrentcosts.stream().collect(Collectors.groupingBy(ProjectCurrentcost::getProjectId));
+            List<Map<String, Object>> costList = reportMapper.getProjectCost(user.getCompanyId(), projectIds);
+            for (Integer pId : projectIds) {
+                List<ProjectCurrentcost> projectCurrentcosts1 = listMap.get(pId);
+                if (projectCurrentcosts1 != null) {
+                    //预算总上限
+                    double total = projectCurrentcosts1.stream().mapToDouble(ProjectCurrentcost::getBaseAmount).sum();
+                    double fillCost = 0;
+                    for (int i=0;i<costList.size(); i++) {
+                        Map<String, Object> mapItem = costList.get(i);
+                        if (((Integer)mapItem.get("projectId")).intValue() == pId) {
+                            fillCost = (double)mapItem.get("cost");
+                            break;
+                        }
+                    }
+                    double leftCost = total - fillCost;
+                    BigDecimal bigDecimal = new BigDecimal(0);
+                    for (Report report : reportList) {
+                        if (report.getProjectId().equals(pId)) {
+                            bigDecimal = bigDecimal.add(report.getCost());
+                        }
+                    }
+                    double curFillCost = bigDecimal.doubleValue();
+                    if (curFillCost > leftCost) {
+                        String name = projectList.stream().filter(p->p.getId().equals(pId)).findFirst().get().getProjectName();
+                        HttpRespMsg msg = new HttpRespMsg();
+                        msg.setError("项目["+name+"]工时相关预算不足,请联系管理人员下拨预算");
+                        return msg;
+                    }
+                }
+            }
+        }
+
         return reportService.editReport(reportList, createDate.length > 0 ? createDate[0] : null, targetUserList, hourCost, user.getCompanyId());
     }
 

+ 1 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/WeiXinCorpController.java

@@ -948,7 +948,7 @@ public class WeiXinCorpController {
     public HttpRespMsg getUserCheckInDayData(int companyId, String userId, String startDate, String endDate) {
         LocalDateTime start = LocalDateTime.parse(startDate+" 00:00:00", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
         LocalDateTime end = LocalDateTime.parse(endDate+" 00:00:00", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
-        return wxCorpInfoService.getUserCheckInDayData(companyId, userId, start, end);
+        return wxCorpInfoService.getUserCheckInDayData(companyId, userId, start, end, true);
     }
 
 

+ 61 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/ProjectAddcostItem.java

@@ -0,0 +1,61 @@
+package com.management.platform.entity;
+
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.baomidou.mybatisplus.annotation.TableField;
+import java.io.Serializable;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-05-07
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+public class ProjectAddcostItem extends Model<ProjectAddcostItem> {
+
+    private static final long serialVersionUID=1L;
+
+    @TableField("id")
+    private Integer id;
+
+    /**
+     * 项目id
+     */
+    @TableField("project_id")
+    private Integer projectId;
+
+    /**
+     * 预算项id
+     */
+    @TableField("base_id")
+    private Integer baseId;
+
+    /**
+     * 预算项名称
+     */
+    @TableField("base_name")
+    private String baseName;
+
+    /**
+     * 预算金额
+     */
+    @TableField("base_amount")
+    private Double baseAmount;
+
+    @TableField("record_id")
+    private Integer recordId;
+
+
+    @Override
+    protected Serializable pkVal() {
+        return null;
+    }
+
+}

+ 54 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/ProjectAddcostRecord.java

@@ -0,0 +1,54 @@
+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 java.util.List;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-05-07
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+public class ProjectAddcostRecord extends Model<ProjectAddcostRecord> {
+
+    private static final long serialVersionUID=1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @TableField("project_id")
+    private Integer projectId;
+
+    @TableField("user_id")
+    private String userId;
+
+    @TableField("user_name")
+    private String userName;
+
+    @TableField("indate")
+    private LocalDateTime indate;
+
+
+    @TableField(exist = false)
+    private List<ProjectAddcostItem> addItemList;
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+}

+ 7 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/ProjectBasecostSetting.java

@@ -15,7 +15,7 @@ import lombok.experimental.Accessors;
  * </p>
  *
  * @author Seyason
- * @since 2021-08-02
+ * @since 2022-05-07
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
@@ -39,6 +39,12 @@ public class ProjectBasecostSetting extends Model<ProjectBasecostSetting> {
     @TableField("company_id")
     private Integer companyId;
 
+    /**
+     * 0-无预警,1-工时成本预警
+     */
+    @TableField("alarm_type")
+    private Integer alarmType;
+
 
     @Override
     protected Serializable pkVal() {

+ 62 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/ProjectCurrentcost.java

@@ -0,0 +1,62 @@
+package com.management.platform.entity;
+
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.baomidou.mybatisplus.annotation.TableField;
+import java.io.Serializable;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-05-07
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+public class ProjectCurrentcost extends Model<ProjectCurrentcost> {
+
+    private static final long serialVersionUID=1L;
+
+    @TableField("id")
+    private Integer id;
+
+    /**
+     * 项目id
+     */
+    @TableField("project_id")
+    private Integer projectId;
+
+    /**
+     * 预算项id
+     */
+    @TableField("base_id")
+    private Integer baseId;
+
+    /**
+     * 预算项名称
+     */
+    @TableField("base_name")
+    private String baseName;
+
+    /**
+     * 预算金额
+     */
+    @TableField("base_amount")
+    private Double baseAmount;
+
+    @TableField(exist = false)
+    private Integer alarmType;
+
+
+
+    @Override
+    protected Serializable pkVal() {
+        return null;
+    }
+
+}

+ 8 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/Report.java

@@ -24,7 +24,7 @@ import org.springframework.format.annotation.DateTimeFormat;
  * </p>
  *
  * @author Seyason
- * @since 2022-04-20
+ * @since 2022-05-08
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
@@ -308,6 +308,13 @@ public class Report extends Model<Report> {
     @TableField(exist = false)
     private Integer taskFinish;
 
+    /**
+     * 自定义文本信息内容
+     */
+    @TableField("custom_text")
+    private String customText;
+
+
     @Override
     protected Serializable pkVal() {
         return this.id;

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

@@ -15,7 +15,7 @@ import lombok.experimental.Accessors;
  * </p>
  *
  * @author Seyason
- * @since 2022-04-28
+ * @since 2022-05-08
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
@@ -186,6 +186,18 @@ public class TimeType extends Model<TimeType> {
     @TableField("show_corpwx_cardtime")
     private Integer showCorpwxCardtime;
 
+    /**
+     * 自定义文本信息是否开启
+     */
+    @TableField("custom_text_active")
+    private Integer customTextActive;
+
+    /**
+     * 自定义文本信息字段名称
+     */
+    @TableField("custom_text_name")
+    private String customTextName;
+
 
     @Override
     protected Serializable pkVal() {

+ 16 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ProjectAddcostItemMapper.java

@@ -0,0 +1,16 @@
+package com.management.platform.mapper;
+
+import com.management.platform.entity.ProjectAddcostItem;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-05-07
+ */
+public interface ProjectAddcostItemMapper extends BaseMapper<ProjectAddcostItem> {
+
+}

+ 19 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ProjectAddcostRecordMapper.java

@@ -0,0 +1,19 @@
+package com.management.platform.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.management.platform.entity.ProjectAddcostRecord;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+import java.util.List;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-05-07
+ */
+public interface ProjectAddcostRecordMapper extends BaseMapper<ProjectAddcostRecord> {
+    List<ProjectAddcostRecord> getWithSubList(Integer projectId);
+}

+ 16 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ProjectCurrentcostMapper.java

@@ -0,0 +1,16 @@
+package com.management.platform.mapper;
+
+import com.management.platform.entity.ProjectCurrentcost;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-05-07
+ */
+public interface ProjectCurrentcostMapper extends BaseMapper<ProjectCurrentcost> {
+
+}

+ 3 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ProjectMapper.java

@@ -73,4 +73,7 @@ public interface ProjectMapper extends BaseMapper<Project> {
     List<HashMap<String, Object>> getExportData(Integer companyId, String userId);
 
     List<Map<String, Object>> getOvertimeDetail(String userId, Integer companyId, String startDate, String endDate, Integer projectId);
+
+    //获取项目的成本预警和实际工时表
+    List<HashMap> getProjectCostAlarm(Integer companyId, Integer pageStart, Integer pageSize);
 }

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

@@ -106,5 +106,7 @@ public interface ReportMapper extends BaseMapper<Report> {
 
     List<Map<String, Object>> getWaitingApproveCnt(Integer companyId);
 
+    List<Map<String, Object>> getProjectCost(Integer companyId, List<Integer> projectIds);
 
+    Double getOneProjectCost(Integer projectId);
 }

+ 1 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/DingDingService.java

@@ -28,7 +28,7 @@ public interface DingDingService {
 
     void syncLeaveTime(Integer companyId, String userId, String startDate, String endDate);
 
-    void syncUserWorkData(CompanyDingding dingding, String startDate, String endDate);
+    void syncUserWorkData(CompanyDingding dingding, String startDate, String endDate, boolean showLog);
 
     void getCorpSelfDefSmartReport(CompanyDingding dingding);
 }

+ 16 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ProjectAddcostItemService.java

@@ -0,0 +1,16 @@
+package com.management.platform.service;
+
+import com.management.platform.entity.ProjectAddcostItem;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-05-07
+ */
+public interface ProjectAddcostItemService extends IService<ProjectAddcostItem> {
+
+}

+ 22 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ProjectAddcostRecordService.java

@@ -0,0 +1,22 @@
+package com.management.platform.service;
+
+import com.management.platform.entity.ProjectAddcostRecord;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.management.platform.util.HttpRespMsg;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-05-07
+ */
+public interface ProjectAddcostRecordService extends IService<ProjectAddcostRecord> {
+
+    HttpRespMsg add(ProjectAddcostRecord item, String itemList);
+
+    HttpRespMsg revert(Integer id);
+
+    HttpRespMsg getAddList(Integer companyId, Integer projectId);
+}

+ 16 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ProjectCurrentcostService.java

@@ -0,0 +1,16 @@
+package com.management.platform.service;
+
+import com.management.platform.entity.ProjectCurrentcost;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-05-07
+ */
+public interface ProjectCurrentcostService extends IService<ProjectCurrentcost> {
+
+}

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

@@ -111,4 +111,8 @@ public interface ProjectService extends IService<Project> {
     HttpRespMsg getMyParticiPMList(HttpServletRequest request);
 
     HttpRespMsg getOvertimeDetail(String userId, Integer projectId, String startDate, String endDate, HttpServletRequest request);
+
+    HttpRespMsg saveBatchAccoDegrees(String ids, String associateDegrees, String associateDegreeNames, HttpServletRequest request);
+
+    HttpRespMsg getProjectCostAlarm(Integer pageIndex, Integer pageSize, HttpServletRequest request);
 }

+ 1 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/WxCorpInfoService.java

@@ -23,5 +23,5 @@ public interface WxCorpInfoService extends IService<WxCorpInfo> {
 
     public String testDownloadFile();
 
-    public HttpRespMsg getUserCheckInDayData(int companyId, String userId, LocalDateTime startDateTime, LocalDateTime endDateTime);
+    public HttpRespMsg getUserCheckInDayData(int companyId, String userId, LocalDateTime startDateTime, LocalDateTime endDateTime, boolean showLog);
 }

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

@@ -1080,7 +1080,7 @@ public class DingDingServiceImpl implements DingDingService {
 
     //获取当天的员工考勤数据,包括打卡,请假/出差申请单; 仅企业内部应用有权限
     @Override
-    public void syncUserWorkData(CompanyDingding dingding, String startDate, String endDate) {
+    public void syncUserWorkData(CompanyDingding dingding, String startDate, String endDate, boolean showLog) {
         DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
         LocalDate sDate = LocalDate.parse(startDate, dateTimeFormatter);
         LocalDate eDate = LocalDate.parse(endDate, dateTimeFormatter);
@@ -1090,7 +1090,7 @@ public class DingDingServiceImpl implements DingDingService {
             LocalDate workDate = sDate.plusDays(i);
             String wDate = dateTimeFormatter.format(workDate);
             System.out.println("同步钉钉考勤假期出差第:"+i+"天, " + wDate);
-            sycUserOneDayWorkData(dingding, wDate);
+            sycUserOneDayWorkData(dingding, wDate, showLog);
             //到达结束日期,结束了
             if (workDate.isEqual(eDate)) {
                 break;
@@ -1099,7 +1099,7 @@ public class DingDingServiceImpl implements DingDingService {
         }
     }
 
-    private void sycUserOneDayWorkData(CompanyDingding dingding, String workDate) {
+    private void sycUserOneDayWorkData(CompanyDingding dingding, String workDate, boolean showLog) {
         List<User> userList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", dingding.getCompanyId()));
         String accessToken = null;
         try {
@@ -1112,7 +1112,7 @@ public class DingDingServiceImpl implements DingDingService {
                 OapiAttendanceGetupdatedataResponse rsp = null;
                 try {
                     rsp = client.execute(req, accessToken);
-                    System.out.println(user.getName()+":"+rsp.getBody());
+                    if (showLog)System.out.println(user.getName()+":"+rsp.getBody());
                     JSONObject json = JSONObject.parseObject(rsp.getBody());
                     JSONObject result = json.getJSONObject("result");
                     //考勤数据

+ 20 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectAddcostItemServiceImpl.java

@@ -0,0 +1,20 @@
+package com.management.platform.service.impl;
+
+import com.management.platform.entity.ProjectAddcostItem;
+import com.management.platform.mapper.ProjectAddcostItemMapper;
+import com.management.platform.service.ProjectAddcostItemService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-05-07
+ */
+@Service
+public class ProjectAddcostItemServiceImpl extends ServiceImpl<ProjectAddcostItemMapper, ProjectAddcostItem> implements ProjectAddcostItemService {
+
+}

+ 135 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectAddcostRecordServiceImpl.java

@@ -0,0 +1,135 @@
+package com.management.platform.service.impl;
+
+import com.alibaba.fastjson.JSONArray;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.management.platform.entity.ProjectAddcostItem;
+import com.management.platform.entity.ProjectAddcostRecord;
+import com.management.platform.entity.ProjectBasecostSetting;
+import com.management.platform.entity.ProjectCurrentcost;
+import com.management.platform.mapper.ProjectAddcostItemMapper;
+import com.management.platform.mapper.ProjectAddcostRecordMapper;
+import com.management.platform.mapper.ProjectBasecostSettingMapper;
+import com.management.platform.mapper.ProjectCurrentcostMapper;
+import com.management.platform.service.ProjectAddcostItemService;
+import com.management.platform.service.ProjectAddcostRecordService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.management.platform.service.ProjectCurrentcostService;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Optional;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-05-07
+ */
+@Service
+@Transactional
+public class ProjectAddcostRecordServiceImpl extends ServiceImpl<ProjectAddcostRecordMapper, ProjectAddcostRecord> implements ProjectAddcostRecordService {
+    @Resource
+    private ProjectAddcostRecordMapper projectAddcostRecordMapper;
+    @Resource
+    private ProjectAddcostItemMapper projectAddcostItemMapper;
+    @Resource
+    private ProjectAddcostItemService projectAddcostItemService;
+    @Resource
+    private ProjectCurrentcostMapper projectCurrentcostMapper;
+    @Resource
+    private ProjectCurrentcostService projectCurrentcostService;
+    @Resource
+    private ProjectBasecostSettingMapper projectBasecostSettingMapper;
+
+    @Override
+    public HttpRespMsg add(ProjectAddcostRecord item, String itemList) {
+        projectAddcostRecordMapper.insert(item);
+        List<ProjectAddcostItem> list = JSONArray.parseArray(itemList, ProjectAddcostItem.class);
+        List<ProjectCurrentcost> curList = projectCurrentcostMapper.selectList(new QueryWrapper<ProjectCurrentcost>().eq("project_id", item.getProjectId()));
+        list.forEach(li->{
+            li.setRecordId(item.getId());
+            li.setProjectId(item.getProjectId());
+        });
+        projectAddcostItemService.saveBatch(list);
+        //当前预算要增加此次的金额
+        if (curList.size() == 0) {
+            list.forEach(li->{
+                ProjectCurrentcost curCost = new ProjectCurrentcost();
+                curCost.setBaseAmount(li.getBaseAmount());
+                curCost.setBaseId(li.getBaseId());
+                curCost.setBaseName(li.getBaseName());
+                curCost.setProjectId(li.getProjectId());
+                curList.add(curCost);
+            });
+            projectCurrentcostService.saveBatch(curList);
+        } else {
+            list.forEach(li->{
+                int baseId = li.getBaseId();
+                Optional<ProjectCurrentcost> find = curList.stream().filter(cur->cur.getBaseId().intValue() == baseId).findFirst();
+                if (find.isPresent()) {
+                    ProjectCurrentcost oldCostItem = find.get();
+                    //加上此次下拨的金额
+                    oldCostItem.setBaseAmount(oldCostItem.getBaseAmount() + li.getBaseAmount());
+                } else {
+                    //不存在的就加上,防止有新的预算项产生
+                    ProjectCurrentcost curCost = new ProjectCurrentcost();
+                    curCost.setBaseAmount(li.getBaseAmount());
+                    curCost.setBaseId(li.getBaseId());
+                    curCost.setBaseName(li.getBaseName());
+                    curCost.setProjectId(li.getProjectId());
+                    curList.add(curCost);
+                }
+            });
+            projectCurrentcostService.saveOrUpdateBatch(curList);
+            List<Integer> deleteIds = curList.stream().filter(cur->!list.stream().anyMatch(li->li.getBaseId().intValue() == cur.getBaseId())).map(ProjectCurrentcost::getId).collect(Collectors.toList());
+            if (deleteIds.size() > 0) {
+                projectCurrentcostMapper.delete(new QueryWrapper<ProjectCurrentcost>().in("id", deleteIds));
+            }
+        }
+        return new HttpRespMsg();
+    }
+
+    @Override
+    public HttpRespMsg revert(Integer id) {
+        HttpRespMsg msg = new HttpRespMsg();
+        ProjectAddcostRecord record = projectAddcostRecordMapper.selectById(id);
+        if (record == null) {
+            msg.setError("该记录不存在");
+        } else {
+            //检查是否是最新的一条
+            List<ProjectAddcostRecord> latestItem = projectAddcostRecordMapper.selectList(new QueryWrapper<ProjectAddcostRecord>().eq("project_id", record.getProjectId()).orderByDesc("id").last("limit 1"));
+            if (latestItem.get(0).getId().equals(record.getId())) {
+                List<ProjectAddcostItem> itemList = projectAddcostItemMapper.selectList(new QueryWrapper<ProjectAddcostItem>().eq("record_id", id));
+                //使用当前的来减掉
+                List<ProjectCurrentcost> curList = projectCurrentcostMapper.selectList(new QueryWrapper<ProjectCurrentcost>().eq("project_id", record.getProjectId()));
+                curList.forEach(cur->{
+                    ProjectAddcostItem matchItem = itemList.stream().filter(item->item.getBaseId().intValue() == cur.getBaseId().intValue()).findFirst().get();
+                    cur.setBaseAmount(cur.getBaseAmount() - matchItem.getBaseAmount());
+                });
+                projectCurrentcostService.updateBatchById(curList);
+            } else {
+                msg.setError("只有最新的一次下拨可以撤销");
+            }
+        }
+        return msg;
+    }
+
+    @Override
+    public HttpRespMsg getAddList(Integer companyId, Integer projectId) {
+        List<ProjectBasecostSetting> settingList = projectBasecostSettingMapper.selectList(new QueryWrapper<ProjectBasecostSetting>().eq("company_id", companyId));
+        HashMap map = new HashMap();
+        map.put("columns", settingList);
+        List<ProjectAddcostRecord> recordList = projectAddcostRecordMapper.getWithSubList(projectId);
+        map.put("recordList", recordList);
+        HttpRespMsg msg = new HttpRespMsg();
+        msg.data = map;
+        return msg;
+    }
+}

+ 20 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectCurrentcostServiceImpl.java

@@ -0,0 +1,20 @@
+package com.management.platform.service.impl;
+
+import com.management.platform.entity.ProjectCurrentcost;
+import com.management.platform.mapper.ProjectCurrentcostMapper;
+import com.management.platform.service.ProjectCurrentcostService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-05-07
+ */
+@Service
+public class ProjectCurrentcostServiceImpl extends ServiceImpl<ProjectCurrentcostMapper, ProjectCurrentcost> implements ProjectCurrentcostService {
+
+}

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

@@ -2198,6 +2198,44 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         return msg;
     }
 
+    @Override
+    public HttpRespMsg saveBatchAccoDegrees(String ids, String associateDegrees, String associateDegreeNames, HttpServletRequest request) {
+        HttpRespMsg msg = new HttpRespMsg();
+        if (!StringUtils.isEmpty(ids)) {
+            List<Integer> array = JSONArray.parseArray(ids, Integer.class);
+            if (array.size() > 0) {
+                Project project = new Project();
+                project.setAssociateDegrees(associateDegrees);
+                project.setAssociateDegreeNames(associateDegreeNames);
+                projectMapper.update(project, new QueryWrapper<Project>().in("id", array));
+            } else {
+                msg.setError("项目不能为空");
+            }
+        } else {
+            msg.setError("项目不能为空");
+        }
+
+        return msg;
+    }
+
+    @Override
+    public HttpRespMsg getProjectCostAlarm(Integer pageIndex, Integer pageSize, HttpServletRequest request) {
+        User user = userMapper.selectById(request.getHeader("Token"));
+        Integer companyId = user.getCompanyId();
+        //撤销的项目不算
+        QueryWrapper<Project> queryWrapper = new QueryWrapper<Project>().eq("company_id", companyId);
+        queryWrapper.and(wrapper->wrapper.isNull("status").or().ne("status", 3));
+        int total = projectMapper.selectCount(queryWrapper);
+        int pageStart = (pageIndex -1) * pageSize;
+        List projectData = projectMapper.getProjectCostAlarm(companyId, pageStart, pageSize);
+        HttpRespMsg httpRespMsg = new HttpRespMsg();
+        Map<String, Object> map = new HashMap<>();
+        map.put("records", projectData);
+        map.put("total", total);
+        httpRespMsg.data = map;
+        return httpRespMsg;
+    }
+
 
     private List<Department> getSubDepts(Department dp, List<Department> list) {
         List<Department> collect = list.stream().filter(l -> dp.getDepartmentId().equals(l.getSuperiorId())).collect(Collectors.toList());;

+ 46 - 2
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java

@@ -628,7 +628,6 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
     @Override
     public HttpRespMsg editReport(List<Report> reportList, String date, List<User> userList, BigDecimal hourCost, Integer companyId) {
         System.out.println("传过来的数据"+reportList.toString()+"=========="+reportList.size()+"===="+reportList.get(0));
-        System.out.println(date);
         HttpRespMsg httpRespMsg = new HttpRespMsg();
         TimeType timeType = timeTypeMapper.selectById(companyId);
         //删除不在本次更新名单中的老记录
@@ -808,6 +807,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
             User curUser = userMapper.selectById(request.getHeader("Token"));
             Integer companyId = curUser.getCompanyId();
+            TimeType timeType = timeTypeMapper.selectById(companyId);
             Integer isEngeering = companyMapper.selectById(companyId).getPackageEngineering();
             String leaderId = null;
             List<SysRichFunction> functionList = sysFunctionMapper.getRoleFunctions(curUser.getRoleId(), "审核全员日报");
@@ -823,11 +823,13 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             for (Map a : auditReportList) {
                 String createDate = (String)a.get("date");
                 String name = (String)a.get("name");
+                String uid = (String)a.get("userId");
 
                 if (lastName == null || !(lastName.get("name").equals(name) && lastName.get("dateStr").equals(createDate))) {
                     lastName = new HashMap<String, Object>();
                     lastName.put("dateStr", createDate);
                     lastName.put("name", name);
+                    lastName.put("userId", uid);
                     nameList.add(lastName);
                     userDailyReportList = new ArrayList<>();
                     lastName.put("data", userDailyReportList);
@@ -889,7 +891,49 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                         report.put("worktimeList", JSONArray.parse(timeStr));
                     }
                 }
-
+            }
+            DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+            //设置每人每日考勤打卡时长
+            if (timeType.getShowCorpwxCardtime() == 1) {
+                //企业微信的情况
+                QueryWrapper<UserCorpwxTime> userCorpwxTimeQueryWrapper = new QueryWrapper<>();
+                for (Map map : nameList) {
+                    String name = (String)map.get("name");
+                    String dateStr = (String)map.get("dateStr");
+                    userCorpwxTimeQueryWrapper.or(wrapper->wrapper.eq("name", name).eq("create_date", dateStr));
+                }
+                List<UserCorpwxTime> timeList = userCorpwxTimeMapper.selectList(userCorpwxTimeQueryWrapper);
+                //过滤匹配当前的数据
+                for (Map map : nameList) {
+                    String name = (String)map.get("name");
+                    String dateStr = (String)map.get("dateStr");
+                    Optional<UserCorpwxTime> first = timeList.stream().filter(time -> time.getName().equals(name) && dtf.format(time.getCreateDate()).equals(dateStr)).findFirst();
+                    if (first.isPresent()) {
+                        double wh = first.get().getWorkHours();
+                        //赋值打卡时长
+                        map.put("cardHours", wh);
+                    }
+                }
+            } else if (timeType.getShowDdCardtime() == 1) {
+                //钉钉的情况
+                QueryWrapper<UserDingdingTime> userDingdingTimeQueryWrapper = new QueryWrapper<>();
+                for (Map map : nameList) {
+                    String itemUid = (String)map.get("userId");
+                    String dateStr = (String)map.get("dateStr");
+                    userDingdingTimeQueryWrapper.or(wrapper->wrapper.eq("user_id", itemUid).eq("work_date", dateStr));
+                }
+                List<UserDingdingTime> timeList = userDingdingTimeMapper.selectList(userDingdingTimeQueryWrapper);
+                //过滤匹配当前的数据
+                for (Map map : nameList) {
+                    String itemUid = (String)map.get("userId");
+                    String dateStr = (String)map.get("dateStr");
+                    Optional<UserDingdingTime> first = timeList.stream().filter(time -> time.getUserId().equals(itemUid) && dtf.format(time.getWorkDate()).equals(dateStr)).findFirst();
+                    if (first.isPresent()) {
+                        double wh = first.get().getWorkHours();
+                        //赋值打卡时长
+                        map.put("cardHours", wh);
+                    }
+                }
             }
             httpRespMsg.data = nameList;
         } catch (NullPointerException e) {

+ 11 - 17
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/WxCorpInfoServiceImpl.java

@@ -231,7 +231,7 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
     }
 
     @Override
-    public HttpRespMsg getUserCheckInDayData(int companyId, String userId, LocalDateTime startDateTime, LocalDateTime endDateTime) {
+    public HttpRespMsg getUserCheckInDayData(int companyId, String userId, LocalDateTime startDateTime, LocalDateTime endDateTime, boolean showLog) {
         HttpRespMsg msg = new HttpRespMsg();
         WxCorpInfo corpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", companyId));
         if (corpInfo == null) {
@@ -242,10 +242,8 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
         try {
 
             startDateTime = startDateTime.withHour(0).withMinute(0).withSecond(0).withNano(0);
-            System.out.println(startDateTime.toString());
             long startTime = startDateTime.toEpochSecond(ZoneOffset.of("+8"));
             endDateTime = endDateTime.withHour(0).withMinute(0).withSecond(0).withNano(0);
-            System.out.println(endDateTime.toString());
             long endTime = endDateTime.toEpochSecond(ZoneOffset.of("+8"));
             System.out.println("startTime="+startTime+",endTime="+endTime);
 
@@ -272,7 +270,7 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
                 int toIndex = (i+1) * batchSize;
                 if (toIndex > totalLength) toIndex = totalLength;
                 Object[] objects = corpwxUserIds.subList(fromIndex, toIndex).toArray(new String[0]);
-                reqOnceCardTime(corpInfo, startTime, endTime, objects);
+                reqOnceCardTime(corpInfo, startTime, endTime, objects, showLog);
             }
 
         } catch (Exception exception) {
@@ -283,7 +281,7 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
     }
 
 
-    private void reqOnceCardTime(WxCorpInfo corpInfo, long startTime, long endTime, Object[] objects) throws Exception {
+    private void reqOnceCardTime(WxCorpInfo corpInfo, long startTime, long endTime, Object[] objects, boolean showLog) throws Exception {
         DateTimeFormatter mdFormat = DateTimeFormatter.ofPattern("yyyy/M/d");
         String url = GET_CHECKIN_DAYDATA.replace("ACCESS_TOKEN", getCorpAccessToken(corpInfo));
         HttpHeaders headers = new HttpHeaders();
@@ -299,7 +297,7 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
 
         if (responseEntity.getStatusCode() == HttpStatus.OK) {
             String resp = responseEntity.getBody();
-            System.out.println(resp);
+            if (showLog)System.out.println(resp);
             JSONObject json = JSONObject.parseObject(resp);
             if (json.getIntValue("errcode") == 0) {
                 JSONArray datas = json.getJSONArray("datas");
@@ -369,8 +367,8 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
                                         leaveStart = "09:00";
                                     }
                                 } else {
-                                    System.out.println("跨天请假@@@@");
-                                    System.out.println("当天=="+localDate+", sDate=" + sDate+", 比较="+(localDate.isEqual(sDate)));
+                                    if (showLog)System.out.println("跨天请假@@@@");
+                                    if (showLog)System.out.println("当天=="+localDate+", sDate=" + sDate+", 比较="+(localDate.isEqual(sDate)));
                                     //跨天请假
                                     if (localDate.isEqual(sDate)) {
                                         //当前日期就是最后一天,需判断上下午半天请假的情况
@@ -395,7 +393,7 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
                                         //中间日期就是全天
                                         leaveEnd = "00:00";
                                         leaveStart = "00:00";
-                                        System.out.println("===中间天请假===");
+                                        if (showLog)System.out.println("===中间天请假===");
                                     }
                                 }
 
@@ -439,11 +437,7 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
                         timeDelta = ct.getCardTime();
                     }
 
-                    System.out.println("上下班间隔时长为=="+timeDelta);
-//                        double hoursFromDouble = DateTimeUtil.getHoursFromDouble(hoursFromSeconds);
-//                        System.out.println("四舍五入后cardTime时间=="+hoursFromDouble);
-//                        ct.setCardTime(hoursFromSeconds);
-
+                    if (showLog)System.out.println("上下班间隔时长为=="+timeDelta);
                     ct.setName(name);
                     //解析请假和外出的情况
                     JSONArray sp_items = jsonObject.getJSONArray("sp_items");
@@ -492,11 +486,11 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
                                 //检查请假时间段是否在打卡的时间范围内
                                 if ("上午".equals(leaveEnd) || "下午".equals(leaveEnd)) {
                                     //半天或者全天请假, 上面已经处理过结束时间为请假之前的时间了,此处不需要再处理了
-                                    System.out.println("====半天或者全天请假 =转化为8小时制下的时间="+(ct.getAskLeaveTime()/24*8.0));
+                                    if (showLog)System.out.println("====半天或者全天请假 =转化为8小时制下的时间="+(ct.getAskLeaveTime()/24*8.0));
                                     ct.setAskLeaveTime(ct.getAskLeaveTime()/24*8.0);//转换成一天8小时工作制
                                 } else if (ct.getStartTime().compareTo(leaveStart) <= 0 && ct.getEndTime().compareTo(leaveEnd) >= 0) {
                                     String hourLeaveTime = leaveText.replaceAll("请假", "").replaceAll("小时", "");
-                                    System.out.println("请假时长=" + hourLeaveTime);
+                                    if (showLog)System.out.println("请假时长=" + hourLeaveTime);
 //                                        ct.setCardTime(ct.getCardTime() - Double.parseDouble(hourLeaveTime));
                                 }
                             }
@@ -514,7 +508,7 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
                     if (workHours < 0) {
                         workHours = 0;
                     }
-                    System.out.println("工作时长=="+workHours);
+                    if (showLog)System.out.println("工作时长=="+workHours);
                     ct.setWorkHours(DateTimeUtil.getHoursFromDouble(workHours));
 //                        if (regular_work_sec < standard_work_sec) {
 //                            ct.setWorkHours(DateTimeUtil.getHoursFromDouble(ct.getCardTime() + ct.getOutdoorTime()));

+ 4 - 4
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/task/TimingTask.java

@@ -144,7 +144,7 @@ public class TimingTask {
             for (int i=0;i<dingdingList.size(); i++) {
                 System.out.println("钉钉公司:"+dingdingList.get(i).getCorpName());
                 long t1 = System.currentTimeMillis();
-                dingDingService.syncUserWorkData(dingdingList.get(i), startDate, endDate);
+                dingDingService.syncUserWorkData(dingdingList.get(i), startDate, endDate, false);
                 long t2 = System.currentTimeMillis();
                 System.out.println("同步 "+dingdingList.get(i).getCorpName()+", 总共耗时:"+(t2-t1)+"ms");
             }
@@ -163,7 +163,7 @@ public class TimingTask {
         List<TimeType> typeList = timeTypeMapper.selectList(new QueryWrapper<TimeType>().eq("sync_corpwx_time", 1));
         for (TimeType type : typeList) {
             Integer companyId = type.getCompanyId();
-            wxCorpInfoService.getUserCheckInDayData(companyId, null, yestoday, yestoday);
+            wxCorpInfoService.getUserCheckInDayData(companyId, null, yestoday, yestoday, false);
         }
     }
 
@@ -195,7 +195,7 @@ public class TimingTask {
         List<TimeType> typeList = timeTypeMapper.selectList(new QueryWrapper<TimeType>().eq("sync_corpwx_time", 1));
         for (TimeType type : typeList) {
             Integer companyId = type.getCompanyId();
-            wxCorpInfoService.getUserCheckInDayData(companyId, null, start, end);
+            wxCorpInfoService.getUserCheckInDayData(companyId, null, start, end, false);
         }
     }
 
@@ -211,7 +211,7 @@ public class TimingTask {
         List<TimeType> typeList = timeTypeMapper.selectList(new QueryWrapper<TimeType>().eq("sync_corpwx_time", 1));
         for (TimeType type : typeList) {
             Integer companyId = type.getCompanyId();
-            wxCorpInfoService.getUserCheckInDayData(companyId, null, start, end);
+            wxCorpInfoService.getUserCheckInDayData(companyId, null, start, end, false);
         }
     }
 

+ 20 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ProjectAddcostItemMapper.xml

@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.management.platform.mapper.ProjectAddcostItemMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.management.platform.entity.ProjectAddcostItem">
+        <result column="id" property="id" />
+        <result column="project_id" property="projectId" />
+        <result column="base_id" property="baseId" />
+        <result column="base_name" property="baseName" />
+        <result column="base_amount" property="baseAmount" />
+        <result column="record_id" property="recordId" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, project_id, base_id, base_name, base_amount, record_id
+    </sql>
+
+</mapper>

+ 37 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ProjectAddcostRecordMapper.xml

@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.management.platform.mapper.ProjectAddcostRecordMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.management.platform.entity.ProjectAddcostRecord">
+        <id column="id" property="id" />
+        <result column="project_id" property="projectId" />
+        <result column="user_id" property="userId" />
+        <result column="user_name" property="userName" />
+        <result column="indate" property="indate" />
+    </resultMap>
+
+    <resultMap id="CompMap" type="com.management.platform.entity.ProjectAddcostRecord">
+        <id column="id" property="id" />
+        <result column="project_id" property="projectId" />
+        <result column="user_id" property="userId" />
+        <result column="user_name" property="userName" />
+        <result column="indate" property="indate" />
+        <collection property="addItemList" javaType="List" ofType="com.management.platform.entity.ProjectAddcostItem"
+                    select="getItemList" column="{recordId = id}" >
+
+        </collection>
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, project_id, user_id, user_name, indate
+    </sql>
+
+    <select id="getWithSubList" resultMap="CompMap">
+        select * from project_addcost_record where project_id=#{projectId}
+    </select>
+    <select id="getItemList" resultMap="CompMap">
+        select * from project_addcost_item where record_id=#{recordId}
+    </select>
+</mapper>

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

@@ -7,11 +7,12 @@
         <id column="id" property="id" />
         <result column="name" property="name" />
         <result column="company_id" property="companyId" />
+        <result column="alarm_type" property="alarmType" />
     </resultMap>
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        id, name, company_id
+        id, name, company_id, alarm_type
     </sql>
 
 </mapper>

+ 19 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ProjectCurrentcostMapper.xml

@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.management.platform.mapper.ProjectCurrentcostMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.management.platform.entity.ProjectCurrentcost">
+        <result column="id" property="id" />
+        <result column="project_id" property="projectId" />
+        <result column="base_id" property="baseId" />
+        <result column="base_name" property="baseName" />
+        <result column="base_amount" property="baseAmount" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, project_id, base_id, base_name, base_amount
+    </sql>
+
+</mapper>

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

@@ -407,4 +407,19 @@
         </if>
         GROUP BY project.id
     </select>
+
+    <!--分页获取项目工时成本预警表 -->
+    <select id="getProjectCostAlarm" resultType="java.util.HashMap">
+        SELECT project.id, project.`project_code` as projectCode, project.`project_name` as projectName,(SELECT IFNULL(SUM(base_amount), 0) FROM project_currentcost
+        WHERE base_id IN(SELECT id FROM project_basecost_setting WHERE company_id=#{companyId})
+        AND project_id=project.id) AS cur_cost, (SELECT IFNULL(SUM(base_amount), 0) FROM project_currentcost
+        WHERE base_id IN(SELECT id FROM project_basecost_setting WHERE company_id=#{companyId} AND alarm_type = 1)
+        AND project_id=project.id) AS costLimit,
+        (SELECT IFNULL(SUM(cost),0) FROM report WHERE state = 1 AND project_id = project.id) AS feeMan
+        FROM project WHERE company_id=#{companyId}
+        and (project.status &lt;&gt; 3 or project.status is null)
+        <if test="pageStart != null and pageSize != null">
+            LIMIT #{pageStart},#{pageSize}
+        </if>
+    </select>
 </mapper>

A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 22 - 10
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ReportMapper.xml


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

@@ -31,11 +31,13 @@
         <result column="only_importreport" property="onlyImportreport" />
         <result column="show_dd_cardtime" property="showDdCardtime" />
         <result column="show_corpwx_cardtime" property="showCorpwxCardtime" />
+        <result column="custom_text_active" property="customTextActive" />
+        <result column="custom_text_name" property="customTextName" />
     </resultMap>
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        company_id, allday, am, pm, month_days, hour_cost_input_type, type, pay_overtime, alert_time, multi_worktime, fix_monthcost, fill_months, custom_degree_active, custom_degree_name, alert_msg, sync_corpwx_time, need_dept_audit, report_workflow, custom_data_active, custom_data_name, finance_audit, overtime_ratio, sync_dingding, is_cro, only_importreport, show_dd_cardtime, show_corpwx_cardtime
+        company_id, allday, am, pm, month_days, hour_cost_input_type, type, pay_overtime, alert_time, multi_worktime, fix_monthcost, fill_months, custom_degree_active, custom_degree_name, alert_msg, sync_corpwx_time, need_dept_audit, report_workflow, custom_data_active, custom_data_name, finance_audit, overtime_ratio, sync_dingding, is_cro, only_importreport, show_dd_cardtime, show_corpwx_cardtime, custom_text_active, custom_text_name
     </sql>
 
 </mapper>

+ 1 - 1
fhKeeper/formulahousekeeper/octopus/config/index.js

@@ -2,7 +2,7 @@ var path = require('path')
 
 //  var ip = '127.0.0.1'
 // var ip = '192.168.2.13'
-var ip = '47.100.37.243' 
+// var ip = '47.100.37.243' 
 
 var os = require('os'), ip = '', ifaces = os.networkInterfaces() // 获取本机ip
 for (var i in ifaces) {

+ 39 - 4
fhKeeper/formulahousekeeper/timesheet/src/views/settings/timetype.vue

@@ -227,6 +227,24 @@
                 </div>
             </el-col>
         </el-row>
+
+        <!-- 设置数值填报 -->
+        <div class="yanjiu" >
+            <p style="margin-left:10px;color:#666;"><span>自定义日报填报文本</span></p>
+            <el-switch style="margin-left: 40px" v-model="timeType.customTextActive" active-color="#13ce66" inactive-color="#ff4949"> </el-switch>
+            <span style="margin-left:10px;color:#999;">开启后可员工可额外填写该信息</span>
+        </div>
+        <el-row v-if="timeType.customTextActive" :gutter="20" style="padding-top:10px;width:100%;margin:0 auto;padding-left:10px;padding-right:10px;">
+            <el-col :span="24" >
+                <div class="panel" style="height:60px;">
+                    <el-form :inline="true" :model="timeType"  style="margin-top:10px;">
+                        <el-form-item label="字段名称 ">
+                            <el-input placeholder="请输入字段名称" maxlength="5" size="small" v-model="timeType.customTextName" clearable> </el-input>
+                        </el-form-item>
+                    </el-form>
+                </div>
+            </el-col>
+        </el-row>
         
         <!-- 是否开启导入审核 -->
         <div class="yanjiu">
@@ -461,6 +479,11 @@
                 } else {
                     this.timeType.customDataActive = true
                 }
+                if(this.timeType.customTextActive == 0) {
+                    this.timeType.customTextActive = false
+                } else {
+                    this.timeType.customTextActive = true
+                }
                 // this.customDegreeName = this.timeType.customDegreeName
             },
             initTime() {
@@ -481,29 +504,41 @@
                             param.needDeptAudit = 0
                         }
                         if(param.customDegreeActive) {
-                            param.customDegreeActive = 1
                             if(param.customDegreeName.replace(/^ +| +$/g,'') == ''){
                                 this.$message({
-                                    message:"请输入 自定义日报填报列表 的字段名称",
+                                    message:"请输入[自定义日报填报列表]的字段名称",
                                     type:"error"
                                 })
                                 return
                             }
+                            param.customDegreeActive = 1
                         } else {
                             param.customDegreeActive = 0
                         }
                         if(param.customDataActive) {
-                            param.customDataActive = 1
                             if(param.customDataName.replace(/^ +| +$/g,'') == ''){
                                 this.$message({
-                                    message:"请输入 自定义日报填报数值 的字段名称",
+                                    message:"请输入[自定义日报填报数值]的字段名称",
                                     type:"error"
                                 })
                                 return
                             }
+                            param.customDataActive = 1
                         } else {
                             param.customDataActive = 0
                         }
+                        if(param.customTextActive) {
+                            if(param.customTextName == null || param.customTextName.replace(/^ +| +$/g,'') == ''){
+                                this.$message({
+                                    message:"请输入[自定义日报填报文本]的字段名称",
+                                    type:"error"
+                                })
+                                return
+                            }
+                            param.customTextActive = 1
+                        } else {
+                            param.customTextActive = 0
+                        }
                         if(param.payOvertime) {
                             if(param.overtimeRatio == 0 || param.overtimeRatio == '') {
                                 this.$message({

+ 17 - 2
fhKeeper/formulahousekeeper/timesheet/src/views/workReport/daily.vue

@@ -170,6 +170,8 @@
                                             <p v-if="item2.groupId != 0">任务分组:{{item2.groupName}} <span v-if="item2.stage != null && item2.stage != '-'" style="margin-left:10px;">投入阶段:{{item2.stage}}</span></p>
                                             <p v-if="user.timeType.customDegreeActive==1 && item2.degree_id != null && item2.degree_id != -1">{{user.timeType.customDegreeName}}:{{item2.degreeName}}</p>
                                             <p v-if="user.timeType.customDataActive==1">{{user.timeType.customDataName}}:{{item2.customData}}</p>
+                                            <!-- 自定义日报文本 -->
+                                            <p v-if="user.timeType.customTextActive==1">{{user.timeType.customTextName}}:{{item2.customText}}</p>
 
                                             <p v-if="user.company.packageEngineering == 1">
                                                 专业进度:
@@ -369,10 +371,13 @@
                         </el-select>
                     </el-form-item>
                     <!-- 相关数值 -->
-                    <el-form-item :label="yonghuUser.customDataName" v-if="domain.projectId && yonghuUser.customDataActive == 1">
+                    <el-form-item :label="yonghuUser.customDataName" v-if="yonghuUser.customDataActive == 1">
                         <el-input-number :id="'numberData_'+index" :disabled="!canEdit" v-model="domain.customData" style="width:200px;" @keyup.native="restrictNumber('numberData_'+index)"></el-input-number>
                     </el-form-item>
-
+                    <!-- 自定义文本 -->
+                    <el-form-item :label="yonghuUser.customTextName" v-if="yonghuUser.customTextActive == 1">
+                        <el-input :disabled="!canEdit" v-model="domain.customText" style="width:500px;" maxlength="25" show-word-limit></el-input>
+                    </el-form-item>
                     <el-form-item v-if="reportTimeType.type == 3" label="用时占比" :prop="'domains.' + index + '.'+timeFields[reportTimeType.type]"
                         :rules="{ required: true, message: '请设置用时占比', trigger: 'blur' }">
                         <div style="width:300px;">
@@ -476,6 +481,10 @@
                         <el-form-item :label="yonghuUser.customDataName" v-if="domain.projectId && yonghuUser.customDataActive == 1">
                             <el-input-number :id="'numberData_'+index" v-model="domain.customData" style="width:200px;" @keyup.native="restrictNumber('numberData_'+index)"></el-input-number>
                         </el-form-item>
+                        <!-- 自定义文本 -->
+                        <el-form-item :label="yonghuUser.customTextName" v-if="yonghuUser.customTextActive == 1">
+                            <el-input :disabled="!canEdit" v-model="domain.customText" style="width:500px;" maxlength="25" show-word-limit></el-input>
+                        </el-form-item>
                         <!--项目管理专业版模式下,项目下的近期执行的任务 -->
                         <el-form-item label="相关任务" :prop="'domains.' + index + '.taskId'" v-if="user.company.packageProject==1" >
                             <el-select v-model="domain.taskId" placeholder="请选择" style="width:75%;margin-right:7%" filterable="true" 
@@ -3355,6 +3364,7 @@
                                     projectAuditorId: list.report[i].projectAuditorId,
                                     projectAuditorName: list.report[i].projectAuditorName,
                                     overtimeHours: list.report[i].overtimeHours,
+                                    customText: list.report[i].customText,
                                 })
                                 if (list.report[i].state >= 2) {
                                     this.canEdit = true;
@@ -4338,6 +4348,11 @@
                             } else {
                                 formData.append("customData", 0);
                             }
+                            if(this.workForm.domains[i].customText) {
+                                formData.append("customText", this.workForm.domains[i].customText);
+                            } else {
+                                formData.append("customText", '-');
+                            }
                             if (this.workForm.domains[i].id) {
                                 formData.append("id", this.workForm.domains[i].id);
                             } else {

+ 6 - 1
fhKeeper/formulahousekeeper/timesheet/src/views/workReport/list.vue

@@ -71,7 +71,7 @@
                                 </b></p>
                                 <p v-if="user.timeType.customDegreeActive==1 && item.degree_id != null">{{user.timeType.customDegreeName}}:{{item.degreeName}}</p>
                                 <p v-if="user.timeType.customDataActive==1">{{user.timeType.customDataName}}:{{item.customData}}</p>
-
+                                <p v-if="user.timeType.customTextActive==1">{{user.timeType.customTextName}}:{{item.customText}}</p>
                                 <p v-if="user.company.packageEngineering == 1">
                                     专业进度:
                                     <span style="margin-right:10px;" v-for="progressItem in item.professionProgressList" :key="progressItem.id">
@@ -131,6 +131,11 @@
                 <template slot-scope="scope">
                     {{scope.row.reportTime | amounts}}
                 </template>
+            </el-table-column>
+             <el-table-column prop="cardHours" label="考勤时长(h)" v-if="user.timeType.showCorpwxCardtime==1||user.timeType.showDdCardtime==1">
+                <template slot-scope="scope">
+                    {{scope.row.cardHours?scope.row.cardHours.toFixed(1):'-'}}
+                </template>
             </el-table-column>
             <el-table-column prop="state" label="状态" sortable>
                 <template slot-scope="scope">

+ 1 - 1
fhKeeper/formulahousekeeper/timesheet/src/views/workReport/list_department.vue

@@ -30,7 +30,7 @@
                                 <p>项目:<b>{{item.project}}<span v-if="item.subProjectName != null"> / {{item.subProjectName}}</span>
                                 <p v-if="user.timeType.customDegreeActive==1 && item.degree_id != null">{{user.timeType.customDegreeName}}:{{item.degreeName}}</p>
                                 <p v-if="user.timeType.customDataActive==1">{{user.timeType.customDataName}}:{{item.customData}}</p>
-
+                                <p v-if="user.timeType.customTextActive==1">{{user.timeType.customTextName}}:{{item.customText}}</p>
                                 <span v-if="user.company.packageEngineering == 1" style="color:#DAA520;">{{item.departmentAuditState==-1?'待专业审核':'待部门审核'}}</span>
                                 </b></p>
                                 <p v-if="user.company.packageEngineering == 1">

+ 1 - 1
fhKeeper/formulahousekeeper/timesheet/src/views/workReport/list_profession.vue

@@ -36,7 +36,7 @@
                                 <p>项目:<b>{{item.project}}<span v-if="item.subProjectName != null"> / {{item.subProjectName}}</span></b></p>
                                 <p v-if="user.timeType.customDegreeActive==1 && item.degree_id != null">{{user.timeType.customDegreeName}}:{{item.degreeName}}</p>
                                 <p v-if="user.timeType.customDataActive==1">{{user.timeType.customDataName}}:{{item.customData}}</p>
-
+                                <p v-if="user.timeType.customTextActive==1">{{user.timeType.customTextName}}:{{item.customText}}</p>
                                 <p v-if="user.company.packageEngineering == 1">
                                     专业进度:
                                     <span style="margin-right:10px;" v-for="progressItem in item.professionProgressList" :key="progressItem.id">

+ 25 - 1
fhKeeper/formulahousekeeper/timesheet_h5/src/views/edit/index.vue

@@ -78,6 +78,9 @@
                     <!-- 自定义数值 -->
                     <van-field v-if="user.timeType.customDataActive==1" type="number" :disabled="!canEdit" v-model="item.customData" :label="user.timeType.customDataName" 
                          placeholder="请输入数字" ></van-field> 
+                    <!-- 自定义文本 -->
+                    <van-field v-if="user.timeType.customTextActive==1" :disabled="!canEdit" v-model="item.customText" :label="user.timeType.customTextName" 
+                         placeholder="请输入" maxlength="25"></van-field> 
 
                     <van-cell title="专业进度" v-if="user.company.packageEngineering == 1">
                     </van-cell>
@@ -887,6 +890,7 @@
                                     projectAuditorName: list[i].projectAuditorName,
                                     auditUserList: list[i].auditUserList,
                                     overtimeHours: list[i].overtimeHours,
+                                    customText: list[i].customText
                                 })
                                 if (list[i].state >= 2) {
                                     this.canEdit = true;
@@ -1276,6 +1280,11 @@
                     } else {
                         formData.append("customData", "0");
                     }
+                    if(this.form.domains[i].customText) {
+                        formData.append("customText", this.form.domains[i].customText);
+                    } else {
+                        formData.append("customText", "-");
+                    }
                     
                     if (this.form.domains[i].id) {
                         formData.append("id", this.form.domains[i].id);
@@ -1438,9 +1447,13 @@
                                     'getLocation',
                                 ] 
                                 });
+                                var that = this;
                                 wx.ready(function(){
                                     // config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。
-                                    console.log('企业微信初始化执行成功了。 ');
+                                    // if (that.user.companyId == 7) {
+                                    //     that.$toast('wx init success==7 ');
+                                    //     that.getLocation();
+                                    // }
                                 });
                             } else {
                                 this.$toast.fail('获取失败');
@@ -1460,6 +1473,17 @@
                 //传递到后台的数据也要做同步删除
                 item.serverPics.splice(index,1);
                 this.$forceUpdate();
+            },
+            //企业微信获取定位
+            getLocation() {
+                wx.getLocation({
+                    type: 'wgs84', // 默认为wgs84的gps坐标,如果要返回直接给openLocation用的火星坐标,可传入'gcj02'
+                    success: function (res) {
+                        var latitude = res.latitude; // 纬度,浮点数,范围为90 ~ -90
+                        var longitude = res.longitude; // 经度,浮点数,范围为180 ~ -180。
+                        alert(JSON.stringify(res));
+                    }
+                });
             }
         },
         

+ 1 - 0
fhKeeper/formulahousekeeper/timesheet_h5/src/views/review/department_list.vue

@@ -24,6 +24,7 @@
                         <!--自定义维度 -->
                         <div class="project_title" v-if="user.timeType.customDegreeActive == 1" >{{user.timeType.customDegreeName}}:{{item1.degreeName}}</div>
                         <div class="project_title" v-if="user.timeType.customDataActive == 1" >{{user.timeType.customDataName}}:{{item1.customData}}</div>
+                        <div class="project_title" v-if="user.timeType.customTextActive == 1" >{{user.timeType.customTextName}}:{{item1.customText}}</div>
                         <div class="project_title" v-if="user.company.packageEngineering == 1">
                             专业进度:
                             <span style="margin-right:10px;" v-for="progressItem in item1.professionProgressList" :key="progressItem.id">{{progressItem.professionName}}({{progressItem.progress}}%) 

+ 1 - 0
fhKeeper/formulahousekeeper/timesheet_h5/src/views/review/index.vue

@@ -42,6 +42,7 @@
                         <!--自定义维度 -->
                         <div class="project_title" v-if="user.timeType.customDegreeActive == 1" >{{user.timeType.customDegreeName}}:{{item1.degreeName}}</div>
                         <div class="project_title" v-if="user.timeType.customDataActive == 1" >{{user.timeType.customDataName}}:{{item1.customData}}</div>
+                        <div class="project_title" v-if="user.timeType.customTextActive == 1" >{{user.timeType.customTextName}}:{{item1.customText}}</div>
                         <div class="project_title" v-if="user.company.packageEngineering == 1">
                             专业进度:
                             <span style="margin-right:10px;" v-for="progressItem in item1.professionProgressList" :key="progressItem.id">{{progressItem.professionName}}({{progressItem.progress}}%) 

+ 1 - 0
fhKeeper/formulahousekeeper/timesheet_h5/src/views/review/profession_list.vue

@@ -22,6 +22,7 @@
                         <!--自定义维度 -->
                         <div class="project_title" v-if="user.timeType.customDegreeActive == 1" >{{user.timeType.customDegreeName}}:{{item1.degreeName}}</div>
                         <div class="project_title" v-if="user.timeType.customDataActive == 1" >{{user.timeType.customDataName}}:{{item1.customData}}</div>
+                        <div class="project_title" v-if="user.timeType.customTextActive == 1" >{{user.timeType.customTextName}}:{{item1.customText}}</div>
                         <div class="project_title" v-if="user.company.packageEngineering == 1">
                             专业进度:
                             <span style="margin-right:10px;" v-for="progressItem in item1.professionProgressList" :key="progressItem.id">{{progressItem.professionName}}({{progressItem.progress}}%) 

+ 1 - 0
fhKeeper/formulahousekeeper/timesheet_h5/src/views/view/index.vue

@@ -45,6 +45,7 @@
                         <!--自定义维度 -->
                         <div class="project_title" v-if="user.timeType.customDegreeActive == 1" >{{user.timeType.customDegreeName}}:{{item1.degreeName}}</div>
                         <div class="project_title" v-if="user.timeType.customDataActive == 1" >{{user.timeType.customDataName}}:{{item1.customData}}</div>
+                        <div class="project_title" v-if="user.timeType.customTextActive == 1" >{{user.timeType.customTextName}}:{{item1.customText}}</div>
                         <div class="project_title" v-if="user.company.packageEngineering == 1">
                             专业进度:
                             <span style="margin-right:10px;" v-for="progressItem in item1.professionProgress" :key="progressItem.id">{{progressItem.professionName}}({{progressItem.progress}}%)