Browse Source

项目金额,报销金额,都从整数改成小数点后两位

seyason 3 years ago
parent
commit
c78c566b2e
26 changed files with 397 additions and 136 deletions
  1. 5 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/DepartmentController.java
  2. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectBasecostController.java
  3. 11 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectBasecostSettingController.java
  4. 2 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectController.java
  5. 1 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/Department.java
  6. 5 10
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/EarningSnapshot.java
  7. 7 4
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/Project.java
  8. 2 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/ProjectBasecost.java
  9. 2 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/DepartmentService.java
  10. 2 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ProjectService.java
  11. 43 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/DepartmentServiceImpl.java
  12. 75 63
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java
  13. 1 3
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/UserServiceImpl.java
  14. 4 4
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/application-prod.yml
  15. 6 5
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ProjectMapper.xml
  16. 26 3
      fhKeeper/formulahousekeeper/timesheet/src/assets/myfont/demo_index.html
  17. 7 3
      fhKeeper/formulahousekeeper/timesheet/src/assets/myfont/iconfont.css
  18. 1 1
      fhKeeper/formulahousekeeper/timesheet/src/assets/myfont/iconfont.js
  19. 7 0
      fhKeeper/formulahousekeeper/timesheet/src/assets/myfont/iconfont.json
  20. BIN
      fhKeeper/formulahousekeeper/timesheet/src/assets/myfont/iconfont.ttf
  21. BIN
      fhKeeper/formulahousekeeper/timesheet/src/assets/myfont/iconfont.woff
  22. BIN
      fhKeeper/formulahousekeeper/timesheet/src/assets/myfont/iconfont.woff2
  23. 1 1
      fhKeeper/formulahousekeeper/timesheet/src/routes.js
  24. 3 1
      fhKeeper/formulahousekeeper/timesheet/src/views/project/fileCenter.vue
  25. 15 21
      fhKeeper/formulahousekeeper/timesheet/src/views/project/info.vue
  26. 170 10
      fhKeeper/formulahousekeeper/timesheet/src/views/project/list.vue

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

@@ -33,6 +33,11 @@ public class DepartmentController {
         return departmentService.getDepartmentList(request);
     }
 
+    @RequestMapping("/listAllMemb")
+    public HttpRespMsg listAllMemb(HttpServletRequest request) {
+        return departmentService.listAllMemb(request);
+    }
+
     /**
      * 获取不带有层级的部门列表
      */

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

@@ -53,7 +53,7 @@ public class ProjectBasecostController {
                 add.setBaseName(all.getName());
                 add.setBaseId(all.getId());
                 add.setProjectId(projectId);
-                add.setBaseAmount(0);
+                add.setBaseAmount(0.0);
                 additionalList.add(add);
             }
         });

+ 11 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectBasecostSettingController.java

@@ -82,6 +82,17 @@ public class ProjectBasecostSettingController {
 
         Integer companyId = userMapper.selectById(request.getHeader("TOKEN")).getCompanyId();
         List<ProjectBasecostSetting> list = projectBasecostSettingMapper.selectList(new QueryWrapper<ProjectBasecostSetting>().eq("company_id", companyId));
+        if (list.size() == 0) {
+            //生成项目的成本基线默认条目
+            String[] array = com.management.platform.util.Constant.DEFAULT_BASE_COST_ITEMS;
+            for (String baseItem : array) {
+                ProjectBasecostSetting setting = new ProjectBasecostSetting();
+                setting.setName(baseItem);
+                setting.setCompanyId(companyId);
+                projectBasecostSettingMapper.insert(setting);
+            }
+            list = projectBasecostSettingMapper.selectList(new QueryWrapper<ProjectBasecostSetting>().eq("company_id", companyId));
+        }
         msg.data = list;
 
         return msg;

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

@@ -62,8 +62,8 @@ public class ProjectController {
                                    String planStartDate,
                                    String planEndDate,
                                    Integer level,
-                                   Integer contractAmount,
-                                   Integer budget,
+                                   Double contractAmount,
+                                   Double budget,
                                    Integer customerId,
                                    String projectBaseCostData
                                    ) {

+ 1 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/Department.java

@@ -56,6 +56,7 @@ public class Department extends Model<Department> {
     private String managerId;
 
 
+
     @Override
     protected Serializable pkVal() {
         return this.departmentId;

+ 5 - 10
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/EarningSnapshot.java

@@ -8,11 +8,9 @@ import com.baomidou.mybatisplus.annotation.TableField;
 import java.io.Serializable;
 import java.util.List;
 
-import com.fasterxml.jackson.annotation.JsonFormat;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
-import org.springframework.format.annotation.DateTimeFormat;
 
 /**
  * <p>
@@ -20,7 +18,7 @@ import org.springframework.format.annotation.DateTimeFormat;
  * </p>
  *
  * @author Seyason
- * @since 2021-08-02
+ * @since 2021-08-09
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
@@ -42,8 +40,6 @@ public class EarningSnapshot extends Model<EarningSnapshot> {
      * 发生时间
      */
     @TableField("indate")
-    @JsonFormat(pattern = "yyyy-MM-dd")
-    @DateTimeFormat(pattern = "yyyy-MM-dd")
     private LocalDateTime indate;
 
     /**
@@ -62,13 +58,13 @@ public class EarningSnapshot extends Model<EarningSnapshot> {
      * 项目金额
      */
     @TableField("contract_amount")
-    private Integer contractAmount;
+    private Double contractAmount;
 
     /**
      * 利润
      */
     @TableField("profit")
-    private Integer profit;
+    private Double profit;
 
     /**
      * 利润率
@@ -80,7 +76,7 @@ public class EarningSnapshot extends Model<EarningSnapshot> {
      * 总成本
      */
     @TableField("cost_total")
-    private Integer costTotal;
+    private Double costTotal;
 
     /**
      * 细分项
@@ -90,8 +86,7 @@ public class EarningSnapshot extends Model<EarningSnapshot> {
 
 
     @TableField(exist = false)
-    private List<ProjectBasecost> costList;
-
+    List<ProjectBasecost> costList;
     @Override
     protected Serializable pkVal() {
         return this.id;

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

@@ -21,7 +21,7 @@ import org.springframework.format.annotation.DateTimeFormat;
  * </p>
  *
  * @author Seyason
- * @since 2021-08-01
+ * @since 2021-08-09
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
@@ -76,6 +76,7 @@ public class Project extends Model<Project> {
     @DateTimeFormat(pattern = "yyyy-MM-dd")
     private LocalDate planEndDate;
 
+
     /**
      * 项目进度
      */
@@ -94,6 +95,7 @@ public class Project extends Model<Project> {
     @TableField("status")
     private Integer status;
 
+
     /**
      * 实际完成日期
      */
@@ -122,17 +124,18 @@ public class Project extends Model<Project> {
     @DateTimeFormat(pattern = "yyyy-MM-dd")
     private LocalDate createDate;
 
+
     /**
      * 项目金额:单位元
      */
     @TableField("contract_amount")
-    private Integer contractAmount;
+    private Double contractAmount;
 
     /**
      * 基线总成本:单位元
      */
     @TableField("budget")
-    private Integer budget;
+    private Double budget;
 
     /**
      * 人员成本:单位元
@@ -188,12 +191,12 @@ public class Project extends Model<Project> {
     @TableField("fee_man")
     private Double feeMan;
 
-
     @TableField(exist = false)
     private String inchargerName;
 
     @TableField(exist = false)
     private List<Map<String, Object>> participationList;
+
     /**
      * 客户id
      */

+ 2 - 2
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/ProjectBasecost.java

@@ -15,7 +15,7 @@ import lombok.experimental.Accessors;
  * </p>
  *
  * @author Seyason
- * @since 2021-08-02
+ * @since 2021-08-09
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
@@ -49,7 +49,7 @@ public class ProjectBasecost extends Model<ProjectBasecost> {
      * 预算金额
      */
     @TableField("base_amount")
-    private Integer baseAmount;
+    private Double baseAmount;
 
 
     @Override

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

@@ -30,4 +30,6 @@ public interface DepartmentService extends IService<Department> {
     HttpRespMsg getUserStatistics(String startDate, String endDate, Integer departmentId, HttpServletRequest request);
 
     HttpRespMsg exportUserStatistic(String startDate, String endDate, String userIds, HttpServletRequest request);
+
+    HttpRespMsg listAllMemb(HttpServletRequest request);
 }

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

@@ -25,9 +25,9 @@ public interface ProjectService extends IService<Project> {
                             String planStartDate,
                             String planEndDate,
                             Integer level,
-                            Integer contractAmount,
+                            Double contractAmount,
                             String projectBaseCostData,
-                            Integer budget,
+                            Double budget,
                             Integer customerId,
                             HttpServletRequest request);
 

+ 43 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/DepartmentServiceImpl.java

@@ -15,12 +15,14 @@ import com.management.platform.util.ListUtil;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
+import org.springframework.web.bind.annotation.RequestMapping;
 
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 import java.math.BigDecimal;
 import java.text.DecimalFormat;
 import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -38,6 +40,8 @@ public class DepartmentServiceImpl extends ServiceImpl<DepartmentMapper, Departm
     private UserMapper userMapper;
     @Resource
     private DepartmentMapper departmentMapper;
+    @Resource
+    private DepartmentService departmentService;
 
     //新增部门
     @Override
@@ -503,6 +507,45 @@ public class DepartmentServiceImpl extends ServiceImpl<DepartmentMapper, Departm
         return httpRespMsg;
     }
 
+    @Override
+    public HttpRespMsg listAllMemb(HttpServletRequest request) {
+        Integer companyId = userMapper.selectById(request.getHeader("TOKEN")).getCompanyId();
+        HttpRespMsg departmentList = departmentService.getDepartmentList(request);
+        List<DepartmentVO> list = (List<DepartmentVO>) departmentList.data;
+        //加上未分配的部门
+        DepartmentVO unAssignedDept = new DepartmentVO();
+        unAssignedDept.setId(0);
+        unAssignedDept.setLabel("未分配");
+        list.add(unAssignedDept);
+
+        //获取公司全部人员
+        List<User> userList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", companyId));
+        List<HashMap> userMapList = new ArrayList<>();
+        for (User u : userList) {
+            HashMap<String, Object> user = new HashMap<String, Object>();
+            user.put("id", u.getId());
+            user.put("name", u.getName());
+            user.put("departmentId", u.getDepartmentId());
+            userMapList.add(user);
+        }
+        fillDeptUser(list, userMapList);
+
+        HttpRespMsg msg = new HttpRespMsg();
+        msg.data = list;
+        return msg;
+    }
+
+
+    private void fillDeptUser(List<DepartmentVO> list, List<HashMap> userList) {
+        list.forEach(l->{
+            List<HashMap> collect = userList.stream().filter(u -> u.get("departmentId").equals(l.getId())).collect(Collectors.toList());
+            l.setUserList(collect);
+            if (l.getChildren() != null) {
+                fillDeptUser(l.getChildren(), userList);
+            }
+        });
+    }
+
     //获取某个部门所有子部门id
     private List<Integer> getBranchDepartment(Integer departmentId, Integer companyId) {
         List<Department> departmentList = departmentMapper.selectList(new QueryWrapper<Department>()

+ 75 - 63
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java

@@ -90,11 +90,14 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
     public HttpRespMsg getProjectList(HttpServletRequest request) {
         HttpRespMsg httpRespMsg = new HttpRespMsg();
         try {
-            //通过公司id获取该公司所有的项目列表
-//            Integer companyId = userMapper.selectById(request.getHeader("Token")).getCompanyId();
-//            httpRespMsg.data = projectMapper.selectList(new QueryWrapper<Project>().eq("company_id", companyId));
-            //现在是获取本人相关的项目列表
-            httpRespMsg.data = projectMapper.getParticipatedProject(request.getHeader("Token"));
+            User user = userMapper.selectById(request.getHeader("Token"));
+            if (user.getRole() == 0) {
+                //普通员工只能看本人相关的项目列表
+                httpRespMsg.data = projectMapper.getParticipatedProject(user.getId());
+            } else {
+                //其他的管理员,都可以看全部的
+                httpRespMsg.data = projectMapper.selectList(new QueryWrapper<Project>().eq("company_id", user.getCompanyId()));
+            }
         } catch (NullPointerException e) {
             httpRespMsg.setError("验证失败");
             return httpRespMsg;
@@ -176,9 +179,9 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                                    String planStartDate,
                                    String planEndDate,
                                    Integer level,
-                                   Integer contractAmount,
+                                   Double contractAmount,
                                    String projectBaseCostData,
-                                   Integer budget,
+                                   Double budget,
                                    Integer customerId,
                                    HttpServletRequest request) {
         HttpRespMsg httpRespMsg = new HttpRespMsg();
@@ -219,23 +222,26 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                     if (projectMapper.insert(project) == 0) {
                         httpRespMsg.setError("操作失败");
                     } else {
-                        updateProjectBaseCostData(projectBaseCostData, project.getId());
-
-                        //创建项目涉及到基线成本数据,要填写到快照表中
-                        EarningSnapshot snapshot = new EarningSnapshot();
-                        snapshot.setProjectId(project.getId());
-                        snapshot.setContractAmount(project.getContractAmount());
-                        snapshot.setCostData(projectBaseCostData);
-                        snapshot.setCreatorId(user.getId());
-                        snapshot.setCreatorName(user.getName());
-                        snapshot.setCostTotal(budget);
-
-                        if (project.getContractAmount() == null || project.getContractAmount() == 0 ) {
-                            //无需处理
-                        } else {
-                            snapshot.setProfit(project.getContractAmount() - budget);
-                            snapshot.setProfitPercent(100.0*(project.getContractAmount() - budget)/project.getContractAmount());
-                            earningSnapshotMapper.insert(snapshot);
+                        if (projectBaseCostData != null) {
+                            System.out.println("projectBaseCostData===="+projectBaseCostData);
+                            updateProjectBaseCostData(projectBaseCostData, project.getId());
+
+                            //创建项目涉及到基线成本数据,要填写到快照表中
+                            EarningSnapshot snapshot = new EarningSnapshot();
+                            snapshot.setProjectId(project.getId());
+                            snapshot.setContractAmount(project.getContractAmount());
+                            snapshot.setCostData(projectBaseCostData);
+                            snapshot.setCreatorId(user.getId());
+                            snapshot.setCreatorName(user.getName());
+                            snapshot.setCostTotal(budget);
+
+                            if (project.getContractAmount() == null || project.getContractAmount() == 0 ) {
+                                //无需处理
+                            } else {
+                                snapshot.setProfit(project.getContractAmount() - budget);
+                                snapshot.setProfitPercent(100.0*(project.getContractAmount() - budget)/project.getContractAmount());
+                                earningSnapshotMapper.insert(snapshot);
+                            }
                         }
                     }
                     id = project.getId();
@@ -275,56 +281,62 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                     ProjectTimer timer = new ProjectTimer();
                     timer.setProjectName(name);
                     projectTimerMapper.update(timer, new QueryWrapper<ProjectTimer>().eq("project_id", id));
+                    if (projectBaseCostData != null) {
+                        List<ProjectBasecost> costList = updateProjectBaseCostData(projectBaseCostData, p.getId());
 
-                    List<ProjectBasecost> costList = updateProjectBaseCostData(projectBaseCostData, p.getId());
-
-                    //如果不存在基线成本快照,则生成
-                    List<EarningSnapshot> earningSnapshots = earningSnapshotMapper.selectList(new QueryWrapper<EarningSnapshot>().eq("project_id", p.getId()).orderByDesc("id").last("limit 1"));
-                    boolean shouldAdd = false;
-                    if (earningSnapshots.size() == 0) {
-                        shouldAdd = true;
-                    } else {
-                        //检查是否发生变化
-                        String data = earningSnapshots.get(0).getCostData();
-                        if (data == null) {
+                        //如果不存在基线成本快照,则生成
+                        List<EarningSnapshot> earningSnapshots = earningSnapshotMapper.selectList(new QueryWrapper<EarningSnapshot>().eq("project_id", p.getId()).orderByDesc("id").last("limit 1"));
+                        boolean shouldAdd = false;
+                        if (earningSnapshots.size() == 0) {
                             shouldAdd = true;
                         } else {
-                            JSONArray oldArray = JSONArray.parseArray(data);
-                            if (oldArray.size() != costList.size()) {
-                                //条目数量有变化,需要新增
+                            //检查是否发生变化
+                            String data = earningSnapshots.get(0).getCostData();
+                            if (data == null) {
                                 shouldAdd = true;
                             } else {
-                                for (int i=0; i<oldArray.size(); i++) {
-                                    JSONObject jsonObject = oldArray.getJSONObject(i);
-                                    ProjectBasecost projectBasecost = JSONObject.toJavaObject(jsonObject, ProjectBasecost.class);
-                                    Optional<ProjectBasecost> first = costList.stream().filter(cost -> cost.getBaseId().equals(projectBasecost.getBaseId())).findFirst();
-                                    if (first.isPresent()) {
-                                        if (!first.get().getBaseAmount().equals(projectBasecost.getBaseAmount())) {
+                                JSONArray oldArray = JSONArray.parseArray(data);
+                                if (oldArray.size() != costList.size()) {
+                                    //条目数量有变化,需要新增
+                                    shouldAdd = true;
+                                } else {
+                                    for (int i=0; i<oldArray.size(); i++) {
+                                        JSONObject jsonObject = oldArray.getJSONObject(i);
+                                        ProjectBasecost projectBasecost = JSONObject.toJavaObject(jsonObject, ProjectBasecost.class);
+                                        Optional<ProjectBasecost> first = costList.stream().filter(cost -> cost.getBaseId().equals(projectBasecost.getBaseId())).findFirst();
+                                        if (first.isPresent()) {
+                                            if (!first.get().getBaseAmount().equals(projectBasecost.getBaseAmount())) {
+                                                shouldAdd = true;
+                                                break;
+                                            }
+                                        } else {
+                                            //有新增的条目,需要增加
                                             shouldAdd = true;
                                             break;
                                         }
-                                    } else {
-                                        //有新增的条目,需要增加
-                                        shouldAdd = true;
-                                        break;
                                     }
                                 }
+
                             }
+                        }
 
+                        if (shouldAdd) {
+                            EarningSnapshot record = new EarningSnapshot();
+                            record.setProjectId(p.getId());
+                            record.setCreatorId(user.getId());
+                            record.setCreatorName(user.getName());
+                            record.setContractAmount(p.getContractAmount());
+                            record.setCostData(projectBaseCostData);
+                            record.setCostTotal(p.getBudget());
+                            record.setProfit(p.getContractAmount() - p.getBudget());
+                            if (p.getContractAmount() == 0) {
+                                record.setProfitPercent(0.0);
+                            } else {
+                                record.setProfitPercent(100.0*(p.getContractAmount() - p.getBudget())/p.getContractAmount());
+                            }
+                            earningSnapshotMapper.insert(record);
                         }
                     }
-                    if (shouldAdd) {
-                        EarningSnapshot record = new EarningSnapshot();
-                        record.setProjectId(p.getId());
-                        record.setCreatorId(user.getId());
-                        record.setCreatorName(user.getName());
-                        record.setContractAmount(p.getContractAmount());
-                        record.setCostData(projectBaseCostData);
-                        record.setCostTotal(p.getBudget());
-                        record.setProfit(p.getContractAmount() - p.getBudget());
-                        record.setProfitPercent(100.0*(p.getContractAmount() - p.getBudget())/p.getContractAmount());
-                        earningSnapshotMapper.insert(record);
-                    }
                 }
             }
         }
@@ -588,7 +600,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         //计算项目总成本
         projectBasecostMapper.delete(new QueryWrapper<ProjectBasecost>().eq("project_id", project.getId()));
         JSONArray array = JSONArray.parseArray(baseCostData);
-        int totalBudget = 0;
+        double totalBudget = 0;
         for (int i=0;i<array.size(); i++) {
             JSONObject obj = array.getJSONObject(i);
             ProjectBasecost cost = JSONObject.toJavaObject(obj, ProjectBasecost.class);
@@ -683,7 +695,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         String userId = request.getHeader("TOKEN");
         Integer companyId = userMapper.selectById(userId).getCompanyId();
         List<Project> projectList = projectMapper.selectList(new QueryWrapper<Project>().eq("company_id", companyId));
-        
+
         return null;
     }
 
@@ -1093,7 +1105,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                     project.setPlanEndDate(LocalDate.parse(sdf.format(endDateCell.getDateCellValue()), DateTimeFormatter.ofPattern("yyyy-MM-dd")));
                 }
                 if (amountCell !=null && !StringUtils.isEmpty(amountCell.getStringCellValue())) {
-                    project.setContractAmount(Integer.parseInt(amountCell.getStringCellValue()));
+                    project.setContractAmount(Double.parseDouble(amountCell.getStringCellValue()));
                 }
 
                 projectMapper.insert(project);

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

@@ -385,9 +385,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
             BigDecimal monthCostValue = (monthCost == null ? BigDecimal.valueOf(0) : BigDecimal.valueOf(monthCost));
             if (targetId == null) {
                 //新增
-                if (creator.getRole() == 2 && role != 0) {
-                    httpRespMsg.setError("管理员只能新增普通员工");
-                } else if (role == 3) {
+                if (role == 1) {
                     httpRespMsg.setError("不可新增负责人");
                 } else {
                     //电话号码列 检测重名

+ 4 - 4
fhKeeper/formulahousekeeper/management-platform/src/main/resources/application-prod.yml

@@ -48,11 +48,11 @@ spring:
 logging:
   level:
     root: info
-    org.mybatis: info
-    java.sql: info
-    org.springframework.web: trace
+    org.mybatis: error
+    java.sql: error
+    org.springframework.web: error
     #打印sql语句
-    com.management.platform.mapper: info
+    com.management.platform.mapper: error
   path: /log/
   file: worktime.log
 ##########

+ 6 - 5
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ProjectMapper.xml

@@ -33,6 +33,11 @@
         <result column="customer_name" property="customerName" />
     </resultMap>
 
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, project_name, company_id, project_code, incharger_id, plan_start_date, plan_end_date, progress, level, status, finish_date, creator_id, creator_name, create_date, contract_amount, budget, base_man, base_outsourcing, base_risk1, base_risk2, base_fee, fee_normal, fee_travel, fee_outsourcing, fee_man, customer_id, customer_name
+    </sql>
+
     <resultMap id="CustomerResultMap" type="com.management.platform.entity.vo.CustomerProject" >
         <result column="customer_id" property="customerId" />
         <result column="customer_name" property="customerName" />
@@ -45,10 +50,6 @@
         <result column="project_ids" property="projectIds" />
         <result column="project_names" property="projectNames" />
     </resultMap>
-    <!-- 通用查询结果列 -->
-    <sql id="Base_Column_List">
-        id, project_name, company_id, project_code, incharger_id, plan_start_date, plan_end_date, progress, level, status, finish_date, creator_id, creator_name, create_date, contract_amount, budget, base_man, base_outsourcing, base_risk1, base_risk2, base_fee, fee_normal, fee_travel, fee_outsourcing, fee_man, customer_id, customer_name
-    </sql>
 
     <!--获取查询者所在公司每个项目的工时成本-->
     <select id="getParticipatedProject" resultType="java.util.Map">
@@ -170,6 +171,6 @@
         FROM project WHERE project.`company_id` = #{companyId}
         and id IN <foreach collection="ids" close=")" open="(" separator="," index="" item="item">
         #{item}
-        </foreach>
+    </foreach>
     </select>
 </mapper>

+ 26 - 3
fhKeeper/formulahousekeeper/timesheet/src/assets/myfont/demo_index.html

@@ -54,6 +54,12 @@
       <div class="content unicode" style="display: block;">
           <ul class="icon_lists dib-box">
           
+            <li class="dib">
+              <span class="icon iconfont">&#xe60f;</span>
+                <div class="name">客户管理</div>
+                <div class="code-name">&amp;#xe60f;</div>
+              </li>
+          
             <li class="dib">
               <span class="icon iconfont">&#xe634;</span>
                 <div class="name">流程</div>
@@ -372,9 +378,9 @@
 <pre><code class="language-css"
 >@font-face {
   font-family: 'iconfont';
-  src: url('iconfont.woff2?t=1627295057848') format('woff2'),
-       url('iconfont.woff?t=1627295057848') format('woff'),
-       url('iconfont.ttf?t=1627295057848') format('truetype');
+  src: url('iconfont.woff2?t=1628309598492') format('woff2'),
+       url('iconfont.woff?t=1628309598492') format('woff'),
+       url('iconfont.ttf?t=1628309598492') format('truetype');
 }
 </code></pre>
           <h3 id="-iconfont-">第二步:定义使用 iconfont 的样式</h3>
@@ -400,6 +406,15 @@
       <div class="content font-class">
         <ul class="icon_lists dib-box">
           
+          <li class="dib">
+            <span class="icon iconfont firerock-iconkehuguanli"></span>
+            <div class="name">
+              客户管理
+            </div>
+            <div class="code-name">.firerock-iconkehuguanli
+            </div>
+          </li>
+          
           <li class="dib">
             <span class="icon iconfont firerock-iconliucheng"></span>
             <div class="name">
@@ -877,6 +892,14 @@
       <div class="content symbol">
           <ul class="icon_lists dib-box">
           
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#firerock-iconkehuguanli"></use>
+                </svg>
+                <div class="name">客户管理</div>
+                <div class="code-name">#firerock-iconkehuguanli</div>
+            </li>
+          
             <li class="dib">
                 <svg class="icon svg-icon" aria-hidden="true">
                   <use xlink:href="#firerock-iconliucheng"></use>

+ 7 - 3
fhKeeper/formulahousekeeper/timesheet/src/assets/myfont/iconfont.css

@@ -1,8 +1,8 @@
 @font-face {
   font-family: "iconfont"; /* Project id 2390497 */
-  src: url('iconfont.woff2?t=1627295057848') format('woff2'),
-       url('iconfont.woff?t=1627295057848') format('woff'),
-       url('iconfont.ttf?t=1627295057848') format('truetype');
+  src: url('iconfont.woff2?t=1628309598492') format('woff2'),
+       url('iconfont.woff?t=1628309598492') format('woff'),
+       url('iconfont.ttf?t=1628309598492') format('truetype');
 }
 
 .iconfont {
@@ -13,6 +13,10 @@
   -moz-osx-font-smoothing: grayscale;
 }
 
+.firerock-iconkehuguanli:before {
+  content: "\e60f";
+}
+
 .firerock-iconliucheng:before {
   content: "\e634";
 }

File diff suppressed because it is too large
+ 1 - 1
fhKeeper/formulahousekeeper/timesheet/src/assets/myfont/iconfont.js


+ 7 - 0
fhKeeper/formulahousekeeper/timesheet/src/assets/myfont/iconfont.json

@@ -5,6 +5,13 @@
   "css_prefix_text": "firerock-icon",
   "description": "",
   "glyphs": [
+    {
+      "icon_id": "3686260",
+      "name": "客户管理",
+      "font_class": "kehuguanli",
+      "unicode": "e60f",
+      "unicode_decimal": 58895
+    },
     {
       "icon_id": "1868952",
       "name": "流程",

BIN
fhKeeper/formulahousekeeper/timesheet/src/assets/myfont/iconfont.ttf


BIN
fhKeeper/formulahousekeeper/timesheet/src/assets/myfont/iconfont.woff


BIN
fhKeeper/formulahousekeeper/timesheet/src/assets/myfont/iconfont.woff2


+ 1 - 1
fhKeeper/formulahousekeeper/timesheet/src/routes.js

@@ -178,7 +178,7 @@ export const allRouters = [//组织架构
         path: '/',
         component: Home,
         name: '客户管理',
-        iconCls: 'iconfont firerock-iconbaobiao',
+        iconCls: 'iconfont firerock-iconkehuguanli',
         leaf: true,
         children: [
             { path: '/customer', component: customer, name: '客户管理' }

+ 3 - 1
fhKeeper/formulahousekeeper/timesheet/src/views/project/fileCenter.vue

@@ -38,7 +38,9 @@
                     </template>
                 </el-table-column>
                 <el-table-column width="60">
-                <el-button icon="el-icon-download"  circle size="mini" style="margin-left:10px;" @click.stop.native="downloadByA(scope.row)"></el-button>
+                <template slot-scope="scope">
+                        <el-button icon="el-icon-download"  circle size="mini" style="margin-left:10px;" @click.stop.native="downloadByA(scope.row)"></el-button>
+                </template>
                 </el-table-column>
             </el-table>
         </el-col>

+ 15 - 21
fhKeeper/formulahousekeeper/timesheet/src/views/project/info.vue

@@ -146,8 +146,8 @@
                         <el-option v-for="item in importanceList" :key="item.id" :label="item.label" :value="item.id"></el-option>
                     </el-select>
                     <span style="margin-left:50px;margin-right:10px;">合同金额</span>
-                    <el-input v-model="addForm.contractAmount"    style="width:32%;"
-                    placeholder="整数" clearable @keyup.native="number"></el-input><span style="margin-left:10px;">元</span>
+                    <el-input v-model="addForm.contractAmount"  id="contractAmount"  style="width:32%;"
+                    placeholder="整数" clearable @keyup.native="restrictNumber('contractAmount')"></el-input><span style="margin-left:10px;">元</span>
                 </el-form-item>
                 <el-form-item label="开始日期" prop="planStartDate">
                     <el-date-picker v-model="addForm.planStartDate" 
@@ -175,25 +175,9 @@
 
         <el-dialog title="校正成本基线" v-if="addBaseFormVisible" :visible.sync="addBaseFormVisible" :close-on-click-modal="false" customClass="customWidth" width="600px">
             <el-form ref="basicInfoForm" label-width="120px">
-                <el-form-item v-for="item in modBaseCostData" :label="item.baseName" :key="item.id">
-                    <el-input v-model="item.baseAmount"  placeholder="请输入" clearable></el-input>
+                <el-form-item v-for="(item, index) in modBaseCostData" :label="item.baseName" :key="item.id">
+                    <el-input :id="'baseCost'+index" v-model="item.baseAmount"  placeholder="请输入" clearable  @keyup.native="restrictNumber('baseCost'+index)"></el-input>
                 </el-form-item>
-                <!-- <el-form-item label="人工成本" >
-                    <el-input v-model="addForm.baseMan"  placeholder="请输入" clearable></el-input>
-                </el-form-item>
-                <el-form-item label="费用" prop="baseFee">
-                    <el-input v-model="addForm.baseFee"  placeholder="请输入" clearable></el-input>
-                </el-form-item>
-                <el-form-item label="外包费用" prop="baseOutsourcing">
-                    <el-input v-model="addForm.baseOutsourcing"  placeholder="请输入" clearable></el-input>
-                </el-form-item>
-                <el-form-item label="风险预留金额1" prop="baseRisk1">
-                    <el-input v-model="addForm.baseRisk1"  placeholder="请输入" clearable></el-input>
-                </el-form-item>
-                <el-form-item label="风险预留金额2" prop="baseRisk2">
-                    <el-input v-model="addForm.baseRisk2"  placeholder="请输入" clearable></el-input>
-                </el-form-item> -->
-                
             </el-form>
             <div slot="footer" class="dialog-footer">
                 <el-button @click.native="addBaseFormVisible = false">取消</el-button>
@@ -322,6 +306,16 @@
             }
         },
         methods: {
+            restrictNumber(targetId) {
+                let inpu = document.getElementById(targetId);
+                inpu.value = inpu.value.replace(/[^\d.]/g, "");  //仅保留数字和"."
+                inpu.value = inpu.value.replace(/\.{2,}/g, "."); //两个连续的"."仅保留第一个"."
+                inpu.value = inpu.value.replace(".", "$#*").replace(/\./g,'').replace('$#*','.');//去除其他"."
+                inpu.value = inpu.value.replace(/^(\d+)\.(\d\d).*$/, '$1.$2');;//限制只能输入两个小数
+                if (inpu.value.indexOf(".") < 0 && inpu.value != "") { //首位是0的话去掉
+                    inpu.value = parseFloat(inpu.value);
+                }
+            },
             getProjectBaseData(projectId) {
                 this.http.post('/project-basecost/get',{projectId: projectId},
                         res => {
@@ -566,7 +560,7 @@
                             this.addLoading = false;
                             if (res.code == "ok") {
                                 this.$message({
-                                    message: this.addForm.id!=null?'修改':'创建'+"成功",
+                                    message: (this.addForm.id!=null?'修改':'创建')+"成功",
                                     type: "success"
                                 });
                                 this.addFormVisible = false;

+ 170 - 10
fhKeeper/formulahousekeeper/timesheet/src/views/project/list.vue

@@ -122,11 +122,12 @@
                     </el-select>
                 </el-form-item>
                 <el-form-item label="全部参与者">
-                    <el-select v-model="addForm.userId" multiple filterable placeholder="请选择参与者" style="width:100%;" @change="changeParticipator">
+                    <el-input  @focus="showChooseMembTree" v-model="addForm.userNames"></el-input>
+                    <!-- <el-select v-model="addForm.userId" multiple filterable placeholder="请选择参与者" style="width:100%;" @change="changeParticipator">
                         <el-option v-for="item in users" :key="item.id" :label="item.name" :value="item.id"></el-option>
-                    </el-select>
+                    </el-select> -->
                 </el-form-item>
-                <el-form-item label="主要负责人" >
+                <el-form-item label="负责人" >
                     <el-select v-model="addForm.inchargerId" :disabled="addForm.userId.length==0 ||  user.role==0" filterable placeholder="请选择负责人" style="width:100%;" >
                         <el-option v-for="item in participator" :key="item.id" :label="item.name" :value="item.id"></el-option>
                     </el-select>
@@ -142,8 +143,8 @@
 
                 <!-- 增加合同金额字段 -->
                         <span style="margin-left:63px;margin-right:10px;" v-if="user.company.packageProject==1">合同金额</span>
-                        <el-input v-model="addForm.contractAmount" style="width:33%;"
-                        placeholder="整数" clearable  @keyup.native="addForm.contractAmount=addForm.contractAmount.replace(/[^\d]/g,'');" ></el-input><span style="margin-left:10px;">元</span>
+                        <el-input id="contractAmount" v-model="addForm.contractAmount" style="width:33%;"
+                        placeholder="整数" clearable  @keyup.native="restrictNumber('contractAmount')" ></el-input><span style="margin-left:10px;">元</span>
                 <!-- 增加合同金额字段 -->   
 
                 </el-form-item>
@@ -171,10 +172,10 @@
                     <span class="el-dialog__title">成本基线</span>
                 </div>
             <!--新版 -->
-            <span class="rg_span" v-for="(item) in projectBaseCostData" :key="item.id">
+            <span class="rg_span" v-for="(item, index) in projectBaseCostData" :key="item.id">
                 <span style="width:120px;display: inline-block;" v-if="user.company.packageProject==1">{{item.baseName}}</span>
-                <el-input @input="addUpfun()" v-model="item.baseAmount" style="width:200px; margin-bottom: 20px"
-                placeholder="整数" clearable  @keyup.native="item.baseAmount=item.baseAmount.replace(/[^\d]/g,'');"></el-input><span style="margin-left:10px;">元</span>
+                <el-input :id="'baseCost'+index" @input="addUpfun()" v-model="item.baseAmount" style="width:200px; margin-bottom: 20px"
+                placeholder="整数" clearable  @keyup.native="restrictNumber('baseCost'+index)"></el-input><span style="margin-left:10px;">元</span>
             </span>    
 
             <!-- <span class="rg_span">
@@ -298,6 +299,24 @@
                 <el-button type="primary" @click="submitInsertBaseItem" :loading="addLoading">提交</el-button>
             </div>
         </el-dialog>
+
+        <!-- 按部门选择人员 -->
+        <el-dialog title="选择参与人员"  v-if="chooseParticipVisible" :visible.sync="chooseParticipVisible" :close-on-click-modal="false" customClass="customWidth" width="500px">
+            <!-- <el-input style="width:100%" v-model="filterName" placeholder="请输入姓名搜索" @change="findUserInTree"></el-input> -->
+            <div class="tree" style="height:400px">
+                <el-scrollbar style="height:100%">
+                <el-tree :data="deptMembData" show-checkbox :props="defaultProps" node-key="id"
+                    ref="chooseMembTree" @check-change="onTreeItemChange" :default-checked-keys="addForm.userId"
+                    highlight-current ></el-tree>
+                </el-scrollbar>
+            </div>
+            <div>已选中&nbsp;{{chosenMembCount}}&nbsp;人</div>
+            <div slot="footer" class="dialog-footer">
+                <el-button  @click="chooseParticipVisible = false" >取消</el-button>
+                <el-button type="primary" @click="chooseParticip()" >确定</el-button>
+            </div>
+        </el-dialog>
+
     </section>
 </template>
 <style scoped>
@@ -319,6 +338,27 @@
     export default {
         data() {
             return {
+                chosenMembCount:0,
+                chosenMembList:[],//选中的人员
+                allMembData:[],
+
+                deptMembData: [
+                    {
+                        id: 0,
+                        label: '未分配',
+                    }
+                ],
+                option: [],
+                depData: {
+                    id: -1,
+                    label: '全部人员',
+                },
+                defaultProps: {
+                    children: 'children',
+                    label: 'label'
+                },
+                filterName:null,
+                chooseParticipVisible: false,
                 projectBaseCostData:[],
                 addBaseItemDialog:false,
                 showBaseConfig:false,
@@ -381,6 +421,115 @@
             }
         },
         methods: {
+            restrictNumber(targetId) {
+                let inpu = document.getElementById(targetId);
+                inpu.value = inpu.value.replace(/[^\d.]/g, "");  //仅保留数字和"."
+                inpu.value = inpu.value.replace(/\.{2,}/g, "."); //两个连续的"."仅保留第一个"."
+                inpu.value = inpu.value.replace(".", "$#*").replace(/\./g,'').replace('$#*','.');//去除其他"."
+                inpu.value = inpu.value.replace(/^(\d+)\.(\d\d).*$/, '$1.$2');;//限制只能输入两个小数
+                if (inpu.value.indexOf(".") < 0 && inpu.value != "") { //首位是0的话去掉
+                    inpu.value = parseFloat(inpu.value);
+                }
+            },
+            showChooseMembTree() {
+                this.chosenMembCount = this.participator.length;
+                this.chooseParticipVisible = true;
+            },
+            onTreeItemChange() {
+                var chosenList = this.$refs.chooseMembTree.getCheckedNodes();
+                var list = chosenList.filter(item=>item.isUser == 1);
+                this.chosenMembCount = list.length;
+            },
+            findUserInTree() {
+                if (this.filterName == '') {
+                    this.deptMembData = this.allMembData;
+                } else {
+                    var list = this.findRecursively(this.filterName, this.allMembData);
+                    this.deptMembData = list;
+                }
+            },
+
+            findRecursively(username, list) {
+                var filterList = [];
+                for (var i=0;i<list.length; i++) {
+                    if (list[i].isUser == 1) {
+                        if (list[i].label.indexOf(username) >= 0) {
+                            //匹配上了
+                            filterList.push(list[i]);
+                        }
+                    } else if (list[i].children != null && list[i].children.length > 0) {
+                        var subList = this.findRecursively(username, list[i].children);
+                        if (subList.length > 0) {
+                            subList.forEach(s=>filterList.push(s));
+                        }
+                    }
+                }
+                return filterList;
+            },
+
+            //确定选择参与人
+            chooseParticip() {
+                this.chooseParticipVisible = false;
+                var chosenList = this.$refs.chooseMembTree.getCheckedNodes();
+                this.chosenMembList = chosenList.filter(item=>item.isUser == 1);
+                this.addForm.userNames = '';
+                this.addForm.userId = [];
+                this.participator = [];
+                for (var i=0;i<this.chosenMembList.length; i++) {
+                    this.addForm.userId.push(this.chosenMembList[i].id);
+                    this.addForm.userNames += this.chosenMembList[i].label+',';
+                    var item = {id:this.chosenMembList[i].id, name:this.chosenMembList[i].label};
+                    this.participator.push(item);
+                }
+                if (this.addForm.userNames.length > 0) {
+                    this.addForm.userNames = this.addForm.userNames.substring(0, this.addForm.userNames.length-1);
+                }
+            },
+            // 获取部门列表
+            getDepartment() {
+                this.http.post("/department/listAllMemb", {},
+                res => {
+                    if (res.code == "ok") {
+                        var list = res.data;
+                        //设置员工到部门下面
+                        this.setUserToDept(list);
+                        this.deptMembData = list;
+                        //用于筛选过滤
+                        this.allMembData = JSON.parse(JSON.stringify(this.deptMembData));
+                    } else {
+                        this.$message({
+                            message: res.msg,
+                            type: "error"
+                        });
+                    }
+                },
+                error => {
+                    this.$message({
+                        message: error,
+                        type: "error"
+                    });
+                });
+            },
+            
+            setUserToDept(list) {
+                for (var i in list) {
+                    if (list[i].children != null) {
+                        this.setUserToDept(list[i].children);
+                    }
+                    
+                    if (list[i].userList != null) {
+                        if (list[i].children == null) {
+                            list[i].children = [];
+                        }
+                        list[i].userList.forEach(element => {
+                            var obj = {id: element.id, label:element.name, parentId:element.departmentId, isUser:1};
+                            list[i].children.push(obj);
+                        });
+                    }
+                }
+            },
+            
+
             getProjectBaseConfigList() {
                 this.http.post('/project-basecost-setting/list',{},
                     res => {
@@ -736,6 +885,7 @@
                     this.addForm = {
                         name: '',
                         userId: [],
+                        userNames:'',
                         code:'',
                         inchargerId:null,
                         level:1,
@@ -748,13 +898,19 @@
                 } else {
                     this.title = "修改项目";
                     var list = item.participator , arr = [];
+                    var names = '';
                     for(var j in list) {
                         arr.push(list[j].id)
+                        names += list[j].name+',';
+                    }
+                    if (names.length > 0) {
+                        names = names.substring(0, names.length -1);
                     }
                     this.addForm = {
                         id: item.id,
                         name: item.projectName,
                         userId: arr,
+                        userNames:names,
                         code:item.projectCode,
                         inchargerId: item.inchargerId,
                         level: item.level,
@@ -832,7 +988,7 @@
             addUpfun() {
                 var total = 0;
                 for (var i=0;i<this.projectBaseCostData.length; i++) {
-                    total += parseInt(this.projectBaseCostData[i].baseAmount);
+                    total += parseFloat(this.projectBaseCostData[i].baseAmount);
                 }
                 this.addForm.budget = total;
                 // var a = '0'
@@ -887,6 +1043,9 @@
                         if (this.projectBaseCostData != null) {
                             formData.append("projectBaseCostData", JSON.stringify(this.projectBaseCostData));
                             //计算总预算成本
+                            if (this.addForm.budget == null) {
+                                this.addForm.budget = 0;
+                            }
                             formData.append("budget", this.addForm.budget);
                         }
                         if (this.addForm.customerId == null) {
@@ -900,7 +1059,7 @@
                             this.addLoading = false;
                             if (res.code == "ok") {
                                 this.$message({
-                                    message: this.addForm.id!=null?'修改':'创建'+"成功",
+                                    message: (this.addForm.id!=null?'修改':'创建')+"成功",
                                     type: "success"
                                 });
                                 this.addFormVisible = false;
@@ -975,6 +1134,7 @@
             };
         },
         mounted() {
+            this.getDepartment();
             this.getList();
             this.getUsers();
             this.getCustomerList();