Jelajahi Sumber

任务进展功能开发完善,财务成本核算同步到日报和人员成本

seyason 3 tahun lalu
induk
melakukan
b3a5a68ce5
51 mengubah file dengan 654 tambahan dan 126 penghapusan
  1. TEMPAT SAMPAH
      fhKeeper/formulahousekeeper/inva_4_tivo/images/img/bao2.png
  2. TEMPAT SAMPAH
      fhKeeper/formulahousekeeper/inva_4_tivo/images/img/项目报表服务.png
  3. 1 1
      fhKeeper/formulahousekeeper/inva_4_tivo/index.html
  4. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/AuthRedirectController.java
  5. 24 3
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ExpenseSheetController.java
  6. 4 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/FinanceController.java
  7. 13 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/GroupTemplateController.java
  8. 2 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectController.java
  9. 18 7
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectNotifyUserController.java
  10. 6 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/StagesController.java
  11. 5 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/TaskController.java
  12. 6 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/WeiXinCorpController.java
  13. 7 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/EarningSnapshot.java
  14. 9 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/ExpenseSheet.java
  15. 5 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/TaskComment.java
  16. 7 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/TaskProgress.java
  17. 4 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ReportMapper.java
  18. 3 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/StagesMapper.java
  19. 3 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/TaskProgressMapper.java
  20. 4 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ExpenseSheetService.java
  21. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/FinanceService.java
  22. 2 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/GroupTemplateService.java
  23. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ProjectService.java
  24. 2 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/StagesService.java
  25. 24 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ExpenseSheetServiceImpl.java
  26. 72 6
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/FinanceServiceImpl.java
  27. 56 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/GroupTemplateServiceImpl.java
  28. 13 14
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java
  29. 11 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/StagesServiceImpl.java
  30. 5 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/TaskProgressServiceImpl.java
  31. 7 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/util/UserNotFoundException.java
  32. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/application-dev.yml
  33. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/application-prod.yml
  34. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/application.yml
  35. 2 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/EarningSnapshotMapper.xml
  36. 2 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ExpenseSheetMapper.xml
  37. 12 12
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ProjectMapper.xml
  38. 9 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ReportMapper.xml
  39. 3 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/StagesMapper.xml
  40. 14 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/TaskProgressMapper.xml
  41. TEMPAT SAMPAH
      fhKeeper/formulahousekeeper/management-platform/导入成本2020.8.xlsx
  42. TEMPAT SAMPAH
      fhKeeper/formulahousekeeper/management-platform/导入成本3月份.xlsx
  43. TEMPAT SAMPAH
      fhKeeper/formulahousekeeper/management-platform/财务人员成本模板_测试.xlsx
  44. 2 2
      fhKeeper/formulahousekeeper/timesheet/src/main.js
  45. 5 5
      fhKeeper/formulahousekeeper/timesheet/src/views/Login.vue
  46. 115 23
      fhKeeper/formulahousekeeper/timesheet/src/views/expense/expense.vue
  47. 3 0
      fhKeeper/formulahousekeeper/timesheet/src/views/project/earning.vue
  48. 35 5
      fhKeeper/formulahousekeeper/timesheet/src/views/project/finance.vue
  49. 27 2
      fhKeeper/formulahousekeeper/timesheet/src/views/project/info.vue
  50. 6 7
      fhKeeper/formulahousekeeper/timesheet/src/views/project/list.vue
  51. 100 19
      fhKeeper/formulahousekeeper/timesheet/src/views/project/projectInside.vue

TEMPAT SAMPAH
fhKeeper/formulahousekeeper/inva_4_tivo/images/img/bao2.png


TEMPAT SAMPAH
fhKeeper/formulahousekeeper/inva_4_tivo/images/img/项目报表服务.png


+ 1 - 1
fhKeeper/formulahousekeeper/inva_4_tivo/index.html

@@ -259,7 +259,7 @@
                     <div class="lis"><img src="images/img/日报查看.png" alt=""></div>
                     <div class="lis"><img src="images/img/日报审核.png" alt=""></div>
                     <div class="lis"><img src="images/img/bao4.png" alt=""></div>
-                    <div class="lis"><img src="images/img/bao2.png" alt=""></div>
+                    <div class="lis"><img src="images/img/项目报表服务.png" alt=""></div>
                     <div class="lis"><img src="images/img/bao6.png" alt=""></div>
                     <div class="lis"><img src="images/img/bao7.png" alt=""></div>
                     <div class="lis"><img src="images/img/bao8.png" alt=""></div>

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

@@ -57,7 +57,7 @@ public class AuthRedirectController {
         String forObject = this.restTemplate.getForObject(url, String.class);
         JSONObject obj = JSONObject.parseObject(forObject);
         String wxUserId = obj.getString("UserId");
-        List<User> userList = userMapper.selectList(new QueryWrapper<User>().eq("corpwx_userid", wxUserId));
+        List<User> userList = userMapper.selectList(new QueryWrapper<User>().eq("corpwx_userid", wxUserId).eq("is_active", 1));
         if (userList.size() > 0) {
             //该用户已存在
             User curUser = userList.get(0);

+ 24 - 3
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ExpenseSheetController.java

@@ -3,6 +3,8 @@ package com.management.platform.controller;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.management.platform.entity.ExpenseSheet;
+import com.management.platform.entity.User;
+import com.management.platform.mapper.UserMapper;
 import com.management.platform.service.ExpenseSheetService;
 import com.management.platform.util.HttpRespMsg;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -24,7 +26,8 @@ import javax.servlet.http.HttpServletRequest;
 @RestController
 @RequestMapping("/expense-sheet")
 public class ExpenseSheetController {
-
+    @Resource
+    UserMapper userMapper;
     @Resource
     ExpenseSheetService expenseSheetService;
     @Resource
@@ -51,9 +54,13 @@ public class ExpenseSheetController {
 
     @RequestMapping("/list")
     public HttpRespMsg list(ExpenseSheet sheet, @RequestParam Integer pageIndex, @RequestParam Integer pageSize) {
-
+        String token = request.getHeader("TOKEN");
+        User user = userMapper.selectById(token);
+        if (user.getRole() == 0) {
+            //普通员工只能看自己的
+            sheet.setOwnerId(user.getId());
+        }
         return expenseSheetService.queryList(sheet, pageIndex, pageSize);
-
     }
 
     @RequestMapping("/getDetail")
@@ -62,5 +69,19 @@ public class ExpenseSheetController {
         return expenseSheetService.getDetail(id);
 
     }
+
+    @RequestMapping("/approve")
+    public HttpRespMsg approve(Integer id) {
+
+        return expenseSheetService.approve(id);
+
+    }
+    @RequestMapping("/deny")
+    public HttpRespMsg deny(Integer id) {
+
+        return expenseSheetService.deny(id);
+
+    }
+
 }
 

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

@@ -33,8 +33,10 @@ public class FinanceController {
     }
 
     @RequestMapping("/importData")
-    public HttpRespMsg importData(Integer companyId, String yearMonth, MultipartFile file, HttpServletRequest request) {
-        return financeService.importData(companyId, yearMonth, file, request);
+    public HttpRespMsg importData(Integer companyId, String yearMonth,
+                                  Boolean syncUserCost, Boolean syncHistoryReport,
+                                  MultipartFile file, HttpServletRequest request) {
+        return financeService.importData(companyId, yearMonth, syncUserCost, syncHistoryReport, file, request);
     }
 
     @RequestMapping("/exportData")

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

@@ -75,7 +75,7 @@ public class GroupTemplateController {
         String uid = request.getHeader("Token");
         User user = userService.getById(uid);
         QueryWrapper<GroupTemplate> templateQueryWrapper = new QueryWrapper<>();
-        templateQueryWrapper.eq("company_id", user.getCompanyId()).or().eq("is_system",1).orderByAsc("id");
+        templateQueryWrapper.eq("company_id", user.getCompanyId()).or().eq("is_system",1).orderByDesc("id");
         List<GroupTemplate> list = groupTemplateService.list(templateQueryWrapper);
         //查找任务列表名称
         for (GroupTemplate template:list
@@ -86,5 +86,17 @@ public class GroupTemplateController {
         msg.data = list;
         return msg;
     }
+
+    @RequestMapping("/addTemplate")
+    public HttpRespMsg addTemplate(Integer groupId, String name) {
+        String uid = request.getHeader("Token");
+        return groupTemplateService.addTemplate(uid, groupId, name);
+    }
+
+    @RequestMapping("/deleteTemplate")
+    public HttpRespMsg deleteTemplate(Integer id) {
+        groupTemplateService.removeById(id);
+        return new HttpRespMsg();
+    }
 }
 

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

@@ -75,9 +75,9 @@ public class ProjectController {
     }
 
     @RequestMapping("/adjustBase")
-    public HttpRespMsg adjustBase(String baseCostData, Project project
+    public HttpRespMsg adjustBase(String baseCostData, Project project, String remark
     ) {
-        return projectService.adjustBase(baseCostData, project,request);
+        return projectService.adjustBase(baseCostData, project, remark, request);
     }
 
 

+ 18 - 7
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectNotifyUserController.java

@@ -1,6 +1,8 @@
 package com.management.platform.controller;
 
 
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.management.platform.entity.ProjectNotifyUser;
 import com.management.platform.service.ProjectNotifyUserService;
@@ -10,6 +12,8 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
 import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.List;
 
 /**
  * <p>
@@ -25,14 +29,21 @@ public class ProjectNotifyUserController {
     @Resource
     ProjectNotifyUserService projectNotifyUserService;
 
-    @RequestMapping("/add")
-    public HttpRespMsg add(ProjectNotifyUser projectNotifyUser) {
+    @RequestMapping("/modify")
+    public HttpRespMsg add(Integer projectId, String chosenLeaders) {
         HttpRespMsg msg = new HttpRespMsg();
-        int count = projectNotifyUserService.count(new QueryWrapper<ProjectNotifyUser>().eq("project_id", projectNotifyUser.getProjectId()).eq("user_id", projectNotifyUser.getUserId()));
-        if (count > 0) {
-            msg.setError("该用户已存在,无法重复添加");
-        } else {
-            projectNotifyUserService.save(projectNotifyUser);
+        projectNotifyUserService.remove(new QueryWrapper<ProjectNotifyUser>().eq("project_id", projectId));
+
+        if (chosenLeaders != null && chosenLeaders.length() > 0) {
+            JSONArray array = JSONArray.parseArray(chosenLeaders);
+            List<ProjectNotifyUser> notifyUsers = new ArrayList<>();
+            for (int i = 0;i<array.size(); i++) {
+                JSONObject jsonObject = array.getJSONObject(i);
+                ProjectNotifyUser projectNotifyUser = JSONObject.toJavaObject(jsonObject, ProjectNotifyUser.class);
+                projectNotifyUser.setProjectId(projectId);
+                notifyUsers.add(projectNotifyUser);
+            }
+            projectNotifyUserService.saveBatch(notifyUsers);
         }
         return msg;
 

+ 6 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/StagesController.java

@@ -234,5 +234,11 @@ public class StagesController {
 
         return new HttpRespMsg();
     }
+
+    //按照项目选择任务列表名称,也可以做为工序/工种/岗位来筛选
+    @RequestMapping("/getProjectStages")
+    public HttpRespMsg changeStageOrder(Integer projectId) {
+        return stagesService.getProjectStages(projectId);
+    }
 }
 

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

@@ -67,6 +67,8 @@ public class TaskController {
     @Resource
     private TaskProgressService taskProgressService;
     @Resource
+    private TprogressPaticipatorsService tprogressPaticipatorsService;
+    @Resource
     private TaskCommentMapper taskCommentMapper;
 
     @RequestMapping("/save")
@@ -403,6 +405,9 @@ public class TaskController {
         List<TaskProgress> list = taskProgressService.list(new QueryWrapper<TaskProgress>().eq("task_id", id).orderByDesc("id").last("limit 1"));
         if (list.size() > 0) {
             t.setProgress(list.get(0));
+            //设置创建人姓名
+            String name = userMapper.selectById(list.get(0).getCreatorId()).getName();
+            list.get(0).setCreatorName(name);
         }
         msg.data = t;
         return msg;

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

@@ -671,6 +671,12 @@ public class WeiXinCorpController {
             msg.setError("该用户企业未授权");
         } else {
             curUser.setCorpwxUserid(wxUserId);
+            //如果之前有用户存在该企业微信wxopenid,需要清空掉
+            User newUser = new User();
+            newUser.setCorpwxUserid("");
+            QueryWrapper<User> queryWrapper = new QueryWrapper<>();
+            queryWrapper.eq("corpwx_userid", wxUserId).eq("company_id", curUser.getCompanyId());
+            userMapper.update(newUser, queryWrapper);
 
             userMapper.updateById(curUser);
             Company company = companyMapper.selectOne(new QueryWrapper<Company>().eq("id", curUser.getCompanyId()));

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

@@ -20,7 +20,7 @@ import org.springframework.format.annotation.DateTimeFormat;
  * </p>
  *
  * @author Seyason
- * @since 2021-08-09
+ * @since 2021-10-16
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
@@ -88,6 +88,12 @@ public class EarningSnapshot extends Model<EarningSnapshot> {
     @TableField("cost_data")
     private String costData;
 
+    /**
+     * 备注
+     */
+    @TableField("remark")
+    private String remark;
+
 
     @TableField(exist = false)
     List<ProjectBasecost> costList;

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

@@ -20,7 +20,7 @@ import org.springframework.format.annotation.DateTimeFormat;
  * </p>
  *
  * @author Seyason
- * @since 2021-05-18
+ * @since 2021-10-14
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
@@ -77,7 +77,7 @@ public class ExpenseSheet extends Model<ExpenseSheet> {
     private Integer type;
 
     /**
-     * 0-未提交,1-待审核,2-审核通过,3-驳
+     * 0-审核通过,1-待审核,2-驳回,3-已撤
      */
     @TableField("status")
     private Integer status;
@@ -94,9 +94,16 @@ public class ExpenseSheet extends Model<ExpenseSheet> {
     @TableField("total_amount")
     private Double totalAmount;
 
+    /**
+     * 录入人
+     */
+    @TableField("operator_id")
+    private String operatorId;
+
 
     @TableField(exist = false)
     private List<ExpenseItem> invoiceList;
+
     @Override
     protected Serializable pkVal() {
         return this.id;

+ 5 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/TaskComment.java

@@ -6,9 +6,12 @@ import com.baomidou.mybatisplus.annotation.TableId;
 import java.time.LocalDateTime;
 import com.baomidou.mybatisplus.annotation.TableField;
 import java.io.Serializable;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
+import org.springframework.format.annotation.DateTimeFormat;
 
 /**
  * <p>
@@ -56,6 +59,8 @@ public class TaskComment extends Model<TaskComment> {
      * 创建时间
      */
     @TableField("create_time")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private LocalDateTime createTime;
 
     /**

+ 7 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/TaskProgress.java

@@ -8,9 +8,11 @@ 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>
@@ -58,11 +60,16 @@ public class TaskProgress extends Model<TaskProgress> {
      * 发布时间
      */
     @TableField("indate")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private LocalDateTime indate;
 
     @TableField(exist = false)
     private List<TprogressPaticipators> paticipatorsList;
 
+    @TableField(exist = false)
+    private String creatorName;
+
     @Override
     protected Serializable pkVal() {
         return this.id;

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

@@ -63,4 +63,8 @@ public interface ReportMapper extends BaseMapper<Report> {
                                                @Param("companyId") Integer companyId);
 
     List<Map<String, Object>> getUserDailyWorkTime(Integer companyId, String startDate, String endDate, List<Integer> deptIds, String leaderId);
+
+    List<Map<String, Object>> getUserWorkingTimeByRange(Integer companyId, String startDate, String endDate);
+
+    List<Report> selectSimpleTime(Integer companyId, String startDate, String endDate);
 }

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

@@ -3,6 +3,8 @@ package com.management.platform.mapper;
 import com.management.platform.entity.Stages;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 
+import java.util.List;
+
 /**
  * <p>
  *  Mapper 接口
@@ -13,4 +15,5 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  */
 public interface StagesMapper extends BaseMapper<Stages> {
 
+    public List<String> getProjectStages(Integer projectId);
 }

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

@@ -3,6 +3,8 @@ package com.management.platform.mapper;
 import com.management.platform.entity.TaskProgress;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 
+import java.util.List;
+
 /**
  * <p>
  *  Mapper 接口
@@ -13,4 +15,5 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  */
 public interface TaskProgressMapper extends BaseMapper<TaskProgress> {
 
+    public List<TaskProgress> selectListWithName(Integer taskId);
 }

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

@@ -24,4 +24,8 @@ public interface ExpenseSheetService extends IService<ExpenseSheet> {
     HttpRespMsg getNextCode(String userId);
 
     HttpRespMsg getDetail(Integer id);
+
+    HttpRespMsg approve(Integer id);
+
+    HttpRespMsg deny(Integer id);
 }

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

@@ -19,7 +19,7 @@ public interface FinanceService extends IService<Finance> {
 
     HttpRespMsg getByMonth(Integer companyId, String yearMonth);
 
-    HttpRespMsg importData(Integer companyId, String yearMonth, MultipartFile multipartFile, HttpServletRequest request);
+    HttpRespMsg importData(Integer companyId, String yearMonth, Boolean syncUserCost, Boolean syncHistoryReport, MultipartFile multipartFile, HttpServletRequest request);
 
     HttpRespMsg exportData(String date, HttpServletRequest request);
 

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

@@ -2,6 +2,7 @@ package com.management.platform.service;
 
 import com.management.platform.entity.GroupTemplate;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.management.platform.util.HttpRespMsg;
 
 /**
  * <p>
@@ -12,5 +13,5 @@ import com.baomidou.mybatisplus.extension.service.IService;
  * @since 2021-05-05
  */
 public interface GroupTemplateService extends IService<GroupTemplate> {
-
+    public HttpRespMsg addTemplate(String token, Integer groupId, String name);
 }

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

@@ -55,7 +55,7 @@ public interface ProjectService extends IService<Project> {
 
     HttpRespMsg addMemb(Integer id, String[] userId);
 
-    HttpRespMsg adjustBase(String baseCostData, Project project, HttpServletRequest request);
+    HttpRespMsg adjustBase(String baseCostData, Project project, String remark, HttpServletRequest request);
 
     HttpRespMsg exportProfit(HttpServletRequest request);
 

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

@@ -2,6 +2,7 @@ package com.management.platform.service;
 
 import com.management.platform.entity.Stages;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.management.platform.util.HttpRespMsg;
 
 /**
  * <p>
@@ -13,4 +14,5 @@ import com.baomidou.mybatisplus.extension.service.IService;
  */
 public interface StagesService extends IService<Stages> {
 
+    public HttpRespMsg getProjectStages(Integer projectId);
 }

+ 24 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ExpenseSheetServiceImpl.java

@@ -64,6 +64,7 @@ public class ExpenseSheetServiceImpl extends ServiceImpl<ExpenseSheetMapper, Exp
                 return msg;
             }
         }
+        sheet.setOperatorId(userId);//设置操作人id
         JSONArray array = JSONArray.parseArray(items);
 //        sheet.setOwnerId(userId);
         User user = userMapper.selectById(userId);
@@ -106,9 +107,14 @@ public class ExpenseSheetServiceImpl extends ServiceImpl<ExpenseSheetMapper, Exp
         QueryWrapper<ExpenseSheet> queryWrapper = new QueryWrapper<ExpenseSheet>();
         HttpRespMsg httpRespMsg = new HttpRespMsg();
         queryWrapper.orderByDesc("id");
+
         if (!StringUtils.isEmpty(sheet.getCode())) {
             queryWrapper.eq("code", sheet.getCode());
         }
+        //增加状态
+        if (sheet.getStatus() != null) {
+            queryWrapper.eq("status", sheet.getStatus());
+        }
         if (!StringUtils.isEmpty(sheet.getOwnerId())) {
             queryWrapper.eq("owner_id", sheet.getOwnerId());
         }
@@ -161,4 +167,22 @@ public class ExpenseSheetServiceImpl extends ServiceImpl<ExpenseSheetMapper, Exp
         msg.data = expenseSheet;
         return msg;
     }
+
+    @Override
+    public HttpRespMsg approve(Integer id) {
+        ExpenseSheet sheet = new ExpenseSheet();
+        sheet.setId(id);
+        sheet.setStatus(0);
+        expenseSheetMapper.updateById(sheet);
+        return new HttpRespMsg();
+    }
+
+    @Override
+    public HttpRespMsg deny(Integer id) {
+        ExpenseSheet sheet = new ExpenseSheet();
+        sheet.setId(id);
+        sheet.setStatus(2);
+        expenseSheetMapper.updateById(sheet);
+        return new HttpRespMsg();
+    }
 }

+ 72 - 6
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/FinanceServiceImpl.java

@@ -5,10 +5,9 @@ import com.management.platform.entity.*;
 import com.management.platform.mapper.*;
 import com.management.platform.service.FinanceService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.management.platform.util.ExcelUtil;
-import com.management.platform.util.HttpRespMsg;
-import com.management.platform.util.MD5Util;
-import com.management.platform.util.SnowFlake;
+import com.management.platform.service.ReportService;
+import com.management.platform.service.UserService;
+import com.management.platform.util.*;
 import lombok.extern.log4j.Log4j;
 import org.apache.log4j.LogManager;
 import org.apache.log4j.Logger;
@@ -33,6 +32,7 @@ import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
 import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -43,6 +43,7 @@ import java.util.*;
  * @since 2021-02-18
  */
 @Service
+@Transactional
 public class FinanceServiceImpl extends ServiceImpl<FinanceMapper, Finance> implements FinanceService {
     Logger logger = LogManager.getLogger(org.apache.logging.log4j.LogManager.ROOT_LOGGER_NAME);
     @Resource
@@ -54,8 +55,14 @@ public class FinanceServiceImpl extends ServiceImpl<FinanceMapper, Finance> impl
     @Resource
     private DepartmentMapper departmentMapper;
     @Resource
+    private TimeTypeMapper timeTypeMapper;
+    @Resource
     private FinanceService financeService;
     @Resource
+    private ReportService reportService;
+    @Resource
+    private UserService userService;
+    @Resource
     private ProjectMapper projectMapper;
     @Value(value = "${upload.path}")
     private String path;
@@ -69,7 +76,7 @@ public class FinanceServiceImpl extends ServiceImpl<FinanceMapper, Finance> impl
     }
 
     @Override
-    public HttpRespMsg importData(Integer companyId, String yearMonth, MultipartFile multipartFile, HttpServletRequest request) {
+    public HttpRespMsg importData(Integer companyId, String yearMonth, Boolean syncUserCost, Boolean syncHistoryReport, MultipartFile multipartFile, HttpServletRequest request) {
         HttpRespMsg msg = new HttpRespMsg();
 
         //然后处理文件
@@ -103,6 +110,19 @@ public class FinanceServiceImpl extends ServiceImpl<FinanceMapper, Finance> impl
             LocalDateTime endDate = LocalDateTime.parse(dateStr,df);
             endDate = endDate.plusMonths(1);
 
+            TimeType timeType = timeTypeMapper.selectById(companyId);
+            BigDecimal monthHours = timeType.getMonthDays().multiply(new BigDecimal(timeType.getAllday()));
+
+            //需要更新成本的人员数据
+            List<User> updateUserList = new ArrayList<>();
+            LocalDate now = LocalDate.now();
+            String startStr = yearMonth + "-01";
+            String endStr = yearMonth + "-31";
+            //获取人员该月份填写的日报的总时长
+            List<Map<String, Object>> userTimeList = null;
+            if (syncUserCost || syncHistoryReport) {
+                userTimeList = reportMapper.getUserWorkingTimeByRange(companyId, startStr, endStr);
+            }
 
             //由于第一行需要指明列对应的标题
             int rowNum = sheet.getLastRowNum();
@@ -215,6 +235,27 @@ public class FinanceServiceImpl extends ServiceImpl<FinanceMapper, Finance> impl
                         total = total.add(value);
                     }
                     finance.setTotalCost(total);
+
+                    //如果需要更新员工成本
+                    if (syncUserCost || syncHistoryReport) {
+                        //设置人员总成本,计算时薪
+                        User localUser = new User();
+                        localUser.setId(finance.getUserId());
+                        localUser.setMonthCost(total);
+                        for (int i=0;i<userTimeList.size(); i++) {
+                            Map<String, Object> map = userTimeList.get(i);
+                            if (map.get("creatorId").equals(finance.getUserId())) {
+                                double time = (Double)map.get("workingTime");
+                                System.out.println(finance.getUserId()+", "+finance.getName()+" time====="+time+", total=" + total);
+
+                                localUser.setCost(total.divide(new BigDecimal(time), 2, BigDecimal.ROUND_HALF_UP));
+                                System.out.println("cost=="+localUser.getCost());
+                                break;
+                            }
+                        }
+
+                        updateUserList.add(localUser);
+                    }
                 } else {
                     msg.setError("用户["+name+"]不存在,请在组织结构中添加该成员");
                     return msg;
@@ -226,7 +267,9 @@ public class FinanceServiceImpl extends ServiceImpl<FinanceMapper, Finance> impl
 
             //批量插入
             financeService.saveOrUpdateBatch(financeList);
-
+            if (syncUserCost) {
+                userService.updateBatchById(updateUserList);
+            }
             //检查是否有删除的,需要删除掉
             List<Integer> readyForDelete = new ArrayList<>();
             oldFinanceList.forEach(old->{
@@ -241,10 +284,33 @@ public class FinanceServiceImpl extends ServiceImpl<FinanceMapper, Finance> impl
             if (readyForDelete.size() > 0) {
                 financeService.removeByIds(readyForDelete);
             }
+            //如果有必要,更新该月份的日报相关的成本
+            if (syncHistoryReport) {
+
+                List<Report> reportList = reportMapper.selectSimpleTime(companyId, startStr, endStr);
+                for (Report r : reportList) {
+                    Optional<User> first = updateUserList.stream().filter(u -> u.getId().equals(r.getCreatorId())).findFirst();
+                    if (!first.isPresent()) {
+                        String notFillUser = userMapper.selectById(r.getCreatorId()).getName();
+                        System.out.println("缺少[" + notFillUser + "]的薪资成本, 请修改数据重新上传");
+                        throw new UserNotFoundException("缺少[" + notFillUser + "]的薪资成本, 请修改数据重新上传");
+                    }
+                    BigDecimal hourCost = first.get().getCost();
+                    r.setCost(hourCost.multiply(new BigDecimal(r.getWorkingTime())));
+                    r.setCreatorId(null);
+                    r.setWorkingTime(null);
+                }
+                //批量更新日报的成本
+                reportService.updateBatchById(reportList);
+            }
         } catch (IOException e) {
             e.printStackTrace();
             msg.setError("文件处理出错");
             return msg;
+        } catch (UserNotFoundException e) {
+            e.printStackTrace();
+            msg.setError(e.getMessage());
+            return msg;
         } catch (NullPointerException e) {
             e.printStackTrace();
             msg.setError("数据格式有误或存在空数据 导入失败");

+ 56 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/GroupTemplateServiceImpl.java

@@ -1,10 +1,23 @@
 package com.management.platform.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.management.platform.entity.GroupTemplate;
+import com.management.platform.entity.GroupTmpstages;
+import com.management.platform.entity.Stages;
+import com.management.platform.entity.User;
 import com.management.platform.mapper.GroupTemplateMapper;
+import com.management.platform.mapper.StagesMapper;
+import com.management.platform.mapper.UserMapper;
 import com.management.platform.service.GroupTemplateService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.management.platform.service.GroupTmpstagesService;
+import com.management.platform.util.HttpRespMsg;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.List;
 
 /**
  * <p>
@@ -15,6 +28,49 @@ import org.springframework.stereotype.Service;
  * @since 2021-05-05
  */
 @Service
+@Transactional
 public class GroupTemplateServiceImpl extends ServiceImpl<GroupTemplateMapper, GroupTemplate> implements GroupTemplateService {
+    @Resource
+    UserMapper userMapper;
+    @Resource
+    GroupTemplateMapper groupTemplateMapper;
+    @Resource
+    StagesMapper stagesMapper;
+    @Resource
+    GroupTmpstagesService groupTmpstagesService;
+    @Override
+    public HttpRespMsg addTemplate(String token, Integer groupId, String name) {
+        User user = userMapper.selectById(token);
+        HttpRespMsg msg = new HttpRespMsg();
+        QueryWrapper<GroupTemplate> templateQueryWrapper = new QueryWrapper<>();
+        templateQueryWrapper.eq("company_id", user.getCompanyId()).eq("name", name);
+        int count = groupTemplateMapper.selectCount(templateQueryWrapper);
+        if (count > 0) {
+            msg.setError("该模板名称已存在");
+        } else {
+            List<Stages> stagesList = stagesMapper.selectList(new QueryWrapper<Stages>().eq("group_id", groupId).orderByAsc("sequence"));
+            if (stagesList.size() == 0) {
+                msg.setError("任务列表为空,无法保存");
+            } else {
+                GroupTemplate template = new GroupTemplate();
+                template.setIsSystem(0);
+                template.setCompanyId(user.getCompanyId());
+                template.setName(name);
+                groupTemplateMapper.insert(template);
+
+                //保存相关的任务列表名称
+                List<GroupTmpstages> tmpstagesList = new ArrayList<GroupTmpstages>();
+                for (Stages s : stagesList) {
+                    GroupTmpstages tmp = new GroupTmpstages();
+                    tmp.setStagesName(s.getStagesName());
+                    tmp.setSequence(s.getSequence());
+                    tmp.setTemplateId(template.getId());
+                    tmpstagesList.add(tmp);
+                }
+                groupTmpstagesService.saveBatch(tmpstagesList);
+            }
+        }
 
+        return msg;
+    }
 }

+ 13 - 14
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java

@@ -351,20 +351,18 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                 }
             }
             //生成相关领导的表
-            if (companyMapper.selectById(companyId).getPackageEngineering() == 1) {
-                projectNotifyUserService.remove(new QueryWrapper<ProjectNotifyUser>().eq("project_id", id));
-
-                if (chosenLeaders != null && chosenLeaders.length() > 0) {
-                    JSONArray array = JSONArray.parseArray(chosenLeaders);
-                    List<ProjectNotifyUser> notifyUsers = new ArrayList<>();
-                    for (int i = 0;i<array.size(); i++) {
-                        JSONObject jsonObject = array.getJSONObject(i);
-                        ProjectNotifyUser projectNotifyUser = JSONObject.toJavaObject(jsonObject, ProjectNotifyUser.class);
-                        projectNotifyUser.setProjectId(id);
-                        notifyUsers.add(projectNotifyUser);
-                    }
-                    projectNotifyUserService.saveBatch(notifyUsers);
+            projectNotifyUserService.remove(new QueryWrapper<ProjectNotifyUser>().eq("project_id", id));
+
+            if (chosenLeaders != null && chosenLeaders.length() > 0) {
+                JSONArray array = JSONArray.parseArray(chosenLeaders);
+                List<ProjectNotifyUser> notifyUsers = new ArrayList<>();
+                for (int i = 0;i<array.size(); i++) {
+                    JSONObject jsonObject = array.getJSONObject(i);
+                    ProjectNotifyUser projectNotifyUser = JSONObject.toJavaObject(jsonObject, ProjectNotifyUser.class);
+                    projectNotifyUser.setProjectId(id);
+                    notifyUsers.add(projectNotifyUser);
                 }
+                projectNotifyUserService.saveBatch(notifyUsers);
             }
             httpRespMsg.data = id;
         }
@@ -610,7 +608,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
     }
 
     @Override
-    public HttpRespMsg adjustBase(String baseCostData, Project project, HttpServletRequest request) {
+    public HttpRespMsg adjustBase(String baseCostData, Project project, String remark, HttpServletRequest request) {
         HttpRespMsg msg = new HttpRespMsg();
         if (project.getContractAmount() == 0) {
             msg.setError("项目金额不能为0");
@@ -634,6 +632,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         EarningSnapshot record = new EarningSnapshot();
         record.setProjectId(project.getId());
         record.setCreatorId(user.getId());
+        record.setRemark(remark);
         record.setCreatorName(user.getName());
         record.setContractAmount(project.getContractAmount());
         record.setCostData(baseCostData);

+ 11 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/StagesServiceImpl.java

@@ -4,8 +4,11 @@ import com.management.platform.entity.Stages;
 import com.management.platform.mapper.StagesMapper;
 import com.management.platform.service.StagesService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.management.platform.util.HttpRespMsg;
 import org.springframework.stereotype.Service;
 
+import javax.annotation.Resource;
+
 /**
  * <p>
  *  服务实现类
@@ -16,5 +19,13 @@ import org.springframework.stereotype.Service;
  */
 @Service
 public class StagesServiceImpl extends ServiceImpl<StagesMapper, Stages> implements StagesService {
+    @Resource
+    StagesMapper stagesMapper;
 
+    @Override
+    public HttpRespMsg getProjectStages(Integer projectId) {
+        HttpRespMsg msg = new HttpRespMsg();
+        msg.data = stagesMapper.getProjectStages(projectId);
+        return msg;
+    }
 }

+ 5 - 2
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/TaskProgressServiceImpl.java

@@ -55,7 +55,8 @@ public class TaskProgressServiceImpl extends ServiceImpl<TaskProgressMapper, Tas
         comment.setUserId(progress.getCreatorId());
         comment.setUserName(creator.getName());
         comment.setType(2);
-        comment.setContent(creator.getName()+"更新任务进展为 " + statusList[progress.getStatus()]);
+        String updateStr = creator.getName()+"更新任务进展为 " + statusList[progress.getStatus()];
+        comment.setContent(updateStr);
         taskCommentMapper.insert(comment);
 
         if (!StringUtils.isEmpty(participatorIds)) {
@@ -71,10 +72,12 @@ public class TaskProgressServiceImpl extends ServiceImpl<TaskProgressMapper, Tas
                 //发消息通知进展
                 Information information = new Information();
                 information.setContent(""+progress.getTaskId());
-                information.setMsg("任务有新进展");
+                information.setMsg(updateStr);
                 information.setUserId(user.getId());
                 information.setType(2);
                 informationMapper.insert(information);
+
+                //TODO:如果关联了微信或者企业微信,可以推送通知
             }
         }
 

+ 7 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/util/UserNotFoundException.java

@@ -0,0 +1,7 @@
+package com.management.platform.util;
+
+public class UserNotFoundException extends Exception {
+    public UserNotFoundException(String msg) {
+        super(msg);
+    }
+}

+ 1 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/resources/application-dev.yml

@@ -13,7 +13,7 @@ spring:
       max-request-size: 10000MB
   datasource:
     driver-class-name: com.mysql.cj.jdbc.Driver
-    url: jdbc:mysql://118.190.47.230:3306/man2?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8
+    url: jdbc:mysql://118.190.47.230:3306/man2?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&rewriteBatchedStatements=true
     username: root
     password: p011430seya1026
     hikari:

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

@@ -13,7 +13,7 @@ spring:
       max-request-size: 10000MB
   datasource:
     driver-class-name: com.mysql.cj.jdbc.Driver
-    url: jdbc:mysql://47.100.37.243:7644/man_hour_manager?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8
+    url: jdbc:mysql://47.100.37.243:7644/man_hour_manager?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&rewriteBatchedStatements=true
     username: root
     password: Ziyu20141026!@
     hikari:

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

@@ -14,7 +14,7 @@ spring:
       location: C:/upload/
   datasource:
     driver-class-name: com.mysql.cj.jdbc.Driver
-    url: jdbc:mysql://47.100.37.243:7644/man_dev?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8
+    url: jdbc:mysql://47.100.37.243:7644/man_dev?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&rewriteBatchedStatements=true
     username: root
     password: Ziyu20141026!@
     hikari:

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

@@ -14,11 +14,12 @@
         <result column="profit_percent" property="profitPercent" />
         <result column="cost_total" property="costTotal" />
         <result column="cost_data" property="costData" />
+        <result column="remark" property="remark" />
     </resultMap>
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        id, project_id, indate, creator_id, creator_name, contract_amount, profit, profit_percent, cost_total, cost_data
+        id, project_id, indate, creator_id, creator_name, contract_amount, profit, profit_percent, cost_total, cost_data, remark
     </sql>
 
 </mapper>

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

@@ -15,11 +15,12 @@
         <result column="status" property="status" />
         <result column="remark" property="remark" />
         <result column="total_amount" property="totalAmount" />
+        <result column="operator_id" property="operatorId" />
     </resultMap>
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        id, code, company_id, owner_id, owner_name, create_date, ticket_num, type, status, remark, total_amount
+        id, code, company_id, owner_id, owner_name, create_date, ticket_num, type, status, remark, total_amount, operator_id
     </sql>
 
 </mapper>

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

@@ -118,9 +118,9 @@
     <select id="getAllProjectCost" resultMap="BaseResultMap">
         SELECT project_code, project_name,
         (SELECT IFNULL(SUM(cost),0) FROM report WHERE state = 1 AND project_id = project.id) AS fee_man,
-        (SELECT IFNULL(SUM(amount),0) FROM expense_item , expense_sheet WHERE project_id = project.id AND  expense_sheet.id = expense_item.`expense_id` AND expense_sheet.type = 0) AS fee_normal,
-        (SELECT IFNULL(SUM(amount),0) FROM expense_item , expense_sheet WHERE project_id = project.id AND  expense_sheet.id = expense_item.`expense_id` AND expense_sheet.type = 1) AS fee_travel,
-        (SELECT IFNULL(SUM(amount),0) FROM expense_item , expense_sheet WHERE project_id = project.id AND  expense_sheet.id = expense_item.`expense_id` AND expense_sheet.type = 2) AS fee_outsourcing
+        (SELECT IFNULL(SUM(amount),0) FROM expense_item , expense_sheet WHERE project_id = project.id AND  expense_sheet.id = expense_item.`expense_id` AND expense_sheet.type = 0 and expense_sheet.status = 0) AS fee_normal,
+        (SELECT IFNULL(SUM(amount),0) FROM expense_item , expense_sheet WHERE project_id = project.id AND  expense_sheet.id = expense_item.`expense_id` AND expense_sheet.type = 1 and expense_sheet.status = 0) AS fee_travel,
+        (SELECT IFNULL(SUM(amount),0) FROM expense_item , expense_sheet WHERE project_id = project.id AND  expense_sheet.id = expense_item.`expense_id` AND expense_sheet.type = 2 and expense_sheet.status = 0) AS fee_outsourcing
         FROM project WHERE project.`company_id` = #{companyId}
         and (project.status &lt;&gt; 3 or project.status is null)
         <if test="pageStart != null and pageSize != null">
@@ -131,9 +131,9 @@
     <select id="getProjectInAndOut" resultMap="BaseResultMap">
         SELECT project_code, project_name,contract_amount,
         (SELECT IFNULL(SUM(cost),0) FROM report WHERE state = 1 AND project_id = project.id) AS fee_man,
-        (SELECT IFNULL(SUM(amount),0) FROM expense_item , expense_sheet WHERE project_id = project.id AND  expense_sheet.id = expense_item.`expense_id` AND expense_sheet.type = 0) AS fee_normal,
-        (SELECT IFNULL(SUM(amount),0) FROM expense_item , expense_sheet WHERE project_id = project.id AND  expense_sheet.id = expense_item.`expense_id` AND expense_sheet.type = 1) AS fee_travel,
-        (SELECT IFNULL(SUM(amount),0) FROM expense_item , expense_sheet WHERE project_id = project.id AND  expense_sheet.id = expense_item.`expense_id` AND expense_sheet.type = 2) AS fee_outsourcing
+        (SELECT IFNULL(SUM(amount),0) FROM expense_item , expense_sheet WHERE project_id = project.id AND  expense_sheet.id = expense_item.`expense_id` AND expense_sheet.type = 0 and expense_sheet.status = 0) AS fee_normal,
+        (SELECT IFNULL(SUM(amount),0) FROM expense_item , expense_sheet WHERE project_id = project.id AND  expense_sheet.id = expense_item.`expense_id` AND expense_sheet.type = 1 and expense_sheet.status = 0) AS fee_travel,
+        (SELECT IFNULL(SUM(amount),0) FROM expense_item , expense_sheet WHERE project_id = project.id AND  expense_sheet.id = expense_item.`expense_id` AND expense_sheet.type = 2 and expense_sheet.status = 0) AS fee_outsourcing
         FROM project WHERE project.`company_id` = #{companyId}
         and (project.status &lt;&gt; 3 or project.status is null)
         <if test="pageStart != null and pageSize != null">
@@ -146,9 +146,9 @@
         SELECT customer_id, customer_name, COUNT(1) AS project_num, GROUP_CONCAT( project.id) AS project_ids, GROUP_CONCAT( project_name) AS project_names,
         SUM(contract_amount) AS contract_amount ,
         SUM((SELECT IFNULL(SUM(cost),0) FROM report WHERE state = 1 AND project_id = project.id)) AS fee_man,
-        SUM((SELECT IFNULL(SUM(amount),0) FROM expense_item , expense_sheet WHERE project_id = project.id AND  expense_sheet.id = expense_item.`expense_id` AND expense_sheet.type = 0)) AS fee_normal,
-        SUM((SELECT IFNULL(SUM(amount),0) FROM expense_item , expense_sheet WHERE project_id = project.id AND  expense_sheet.id = expense_item.`expense_id` AND expense_sheet.type = 1)) AS fee_travel,
-        SUM((SELECT IFNULL(SUM(amount),0) FROM expense_item , expense_sheet WHERE project_id = project.id AND  expense_sheet.id = expense_item.`expense_id` AND expense_sheet.type = 2)) AS fee_outsourcing
+        SUM((SELECT IFNULL(SUM(amount),0) FROM expense_item , expense_sheet WHERE project_id = project.id AND  expense_sheet.id = expense_item.`expense_id` AND expense_sheet.type = 0 and expense_sheet.status = 0)) AS fee_normal,
+        SUM((SELECT IFNULL(SUM(amount),0) FROM expense_item , expense_sheet WHERE project_id = project.id AND  expense_sheet.id = expense_item.`expense_id` AND expense_sheet.type = 1 and expense_sheet.status = 0)) AS fee_travel,
+        SUM((SELECT IFNULL(SUM(amount),0) FROM expense_item , expense_sheet WHERE project_id = project.id AND  expense_sheet.id = expense_item.`expense_id` AND expense_sheet.type = 2 and expense_sheet.status = 0)) AS fee_outsourcing
         FROM project WHERE project.`company_id` = #{companyId} AND customer_id > 0
         AND (project.status &lt;&gt; 3 OR project.status IS NULL)
         GROUP BY customer_id
@@ -166,9 +166,9 @@
     <select id="getProjectInAndOutByRange" resultMap="CustomerResultMap">
         SELECT project.id as id, project.id as project_ids, project_code, project_name as project_names,contract_amount,
         (SELECT IFNULL(SUM(cost),0) FROM report WHERE state = 1 AND project_id = project.id) AS fee_man,
-        (SELECT IFNULL(SUM(amount),0) FROM expense_item , expense_sheet WHERE project_id = project.id AND  expense_sheet.id = expense_item.`expense_id` AND expense_sheet.type = 0) AS fee_normal,
-        (SELECT IFNULL(SUM(amount),0) FROM expense_item , expense_sheet WHERE project_id = project.id AND  expense_sheet.id = expense_item.`expense_id` AND expense_sheet.type = 1) AS fee_travel,
-        (SELECT IFNULL(SUM(amount),0) FROM expense_item , expense_sheet WHERE project_id = project.id AND  expense_sheet.id = expense_item.`expense_id` AND expense_sheet.type = 2) AS fee_outsourcing
+        (SELECT IFNULL(SUM(amount),0) FROM expense_item , expense_sheet WHERE project_id = project.id AND  expense_sheet.id = expense_item.`expense_id` AND expense_sheet.type = 0 and expense_sheet.status = 0) AS fee_normal,
+        (SELECT IFNULL(SUM(amount),0) FROM expense_item , expense_sheet WHERE project_id = project.id AND  expense_sheet.id = expense_item.`expense_id` AND expense_sheet.type = 1 and expense_sheet.status = 0) AS fee_travel,
+        (SELECT IFNULL(SUM(amount),0) FROM expense_item , expense_sheet WHERE project_id = project.id AND  expense_sheet.id = expense_item.`expense_id` AND expense_sheet.type = 2 and expense_sheet.status = 0) AS fee_outsourcing
         FROM project WHERE project.`company_id` = #{companyId}
         and id IN <foreach collection="ids" close=")" open="(" separator="," index="" item="item">
         #{item}

+ 9 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ReportMapper.xml

@@ -263,4 +263,13 @@
         </if>
         GROUP BY user.id, report.create_date;
     </select>
+    <select id="getUserWorkingTimeByRange" resultType="java.util.Map">
+    SELECT creator_id as creatorId, SUM(working_time) AS workingTime FROM report WHERE state = 1 AND creator_id IN(SELECT id FROM user WHERE company_id = #{companyId})
+    AND create_date BETWEEN #{startDate} and #{endDate}
+    GROUP BY creator_id
+    </select>
+    <select id="selectSimpleTime" resultMap="BaseResultMap">
+    SELECT id,creator_id, working_time, cost FROM report WHERE state = 1 AND creator_id IN(SELECT id FROM user WHERE company_id = #{companyId})
+    AND create_date BETWEEN #{startDate} and #{endDate}
+    </select>
 </mapper>

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

@@ -15,5 +15,7 @@
     <sql id="Base_Column_List">
         id, stages_name, project_id, sequence, group_id
     </sql>
-
+    <select id="getProjectStages" resultType="java.lang.String">
+        select distinct stages_name as name from stages where project_id = #{projectId} order by sequence
+    </select>
 </mapper>

+ 14 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/TaskProgressMapper.xml

@@ -12,9 +12,23 @@
         <result column="indate" property="indate" />
     </resultMap>
 
+    <resultMap id="ResultMap1" type="com.management.platform.entity.TaskProgress">
+        <id column="id" property="id" />
+        <result column="task_id" property="taskId" />
+        <result column="status" property="status" />
+        <result column="content" property="content" />
+        <result column="creator_id" property="creatorId" />
+        <result column="creator_name" property="creatorName" />
+        <result column="indate" property="indate" />
+    </resultMap>
+
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
         id, task_id, status, content, creator_id, indate
     </sql>
 
+    <select id="selectListWithName" resultMap="ResultMap1">
+        select id, task_id, status, content, creator_id, indate from task_progress left join user on user.id = creator_id where task_id=#{taskId}
+    </select>
+
 </mapper>

TEMPAT SAMPAH
fhKeeper/formulahousekeeper/management-platform/导入成本2020.8.xlsx


TEMPAT SAMPAH
fhKeeper/formulahousekeeper/management-platform/导入成本3月份.xlsx


TEMPAT SAMPAH
fhKeeper/formulahousekeeper/management-platform/财务人员成本模板_测试.xlsx


+ 2 - 2
fhKeeper/formulahousekeeper/timesheet/src/main.js

@@ -45,9 +45,9 @@ import 'nprogress/nprogress.css'
 
 var addRouFlag = false;
 //角色权限对应关系
-var userModules = [{role:0, modules:["工时报告","专业审核","部门审核","自动计时","项目管理"]},
+var userModules = [{role:0, modules:["工时报告","专业审核","部门审核","自动计时","费用报销","项目管理"]},
             {role:3, modules:["工时报告","工时成本统计","项目报表服务","费用报销","项目管理"]},
-            {role:4, modules:["工时报告","财务核算成本", "组织架构"]},
+            {role:4, modules:["工时报告","财务核算成本", "费用报销", "组织架构"]},
             {role:5, modules:["工时报告","自动计时","项目管理","专业管理"]},
             {role:6, modules:["工时报告","工时成本统计","财务核算成本","项目报表服务","费用报销","项目管理"]},];
 router.beforeEach((to, from, next) => {

+ 5 - 5
fhKeeper/formulahousekeeper/timesheet/src/views/Login.vue

@@ -26,17 +26,17 @@
                     <el-link type="primary" style="margin-right:5px;" @click="dialogVisible=true" :underline="false">
                         使用说明
                     </el-link>
-                    <el-link type="primary" @click="jumpTo" :underline="false">企业注册</el-link>
+                    <el-link type="primary" v-if="!isCorpWX" @click="jumpTo" :underline="false">企业注册</el-link>
                 </div>
             </el-form>
         </div>
         <el-dialog title="使用说明" :visible.sync="dialogVisible" width="500px">
-            <p><a style="color:#409EFF;text-decoration:none" href="upload/工时管家使用说明_管理员.docx" download="工时管家使用说明_管理员.docx" 
-                        target="_blank">工时管家使用说明_管理员.docx</a></p>
-            <p><a style="color:#409EFF;text-decoration:none" href="upload/工时管家使用说明_项目经理.docx" download="工时管家使用说明_项目经理.docx" 
+            <p><a style="color:#409EFF;text-decoration:none" href="upload/工时管家使用说明.docx" download="工时管家使用说明.docx" 
+                        target="_blank">工时管家使用说明.docx</a></p>
+            <!-- <p><a style="color:#409EFF;text-decoration:none" href="upload/工时管家使用说明_项目经理.docx" download="工时管家使用说明_项目经理.docx" 
                         target="_blank">工时管家使用说明_项目经理.docx</a></p>
             <p><a style="color:#409EFF;text-decoration:none" href="upload/工时管家使用说明_普通员工.docx" download="工时管家使用说明_普通员工.docx" 
-                        target="_blank">工时管家使用说明_普通员工.docx</a></p>
+                        target="_blank">工时管家使用说明_普通员工.docx</a></p> -->
             
         </el-dialog>
     </div>

+ 115 - 23
fhKeeper/formulahousekeeper/timesheet/src/views/expense/expense.vue

@@ -20,10 +20,18 @@
               <el-menu-item index="1-1"><p @click="ssl(0)"> 一般费用填报</p></el-menu-item>
               <el-menu-item index="1-2"><p @click="ssl(1)">差旅费用填报</p></el-menu-item>
               <el-menu-item index="1-3"><p @click="ssl(2)">外包费用填报</p></el-menu-item>
-            </el-submenu>
-            <el-menu-item index="2" @select="bills" @click="bills">
+          </el-submenu>
+          <el-submenu index="2" v-if="user.role != 0">
+            <template slot="title">
               <i class="iconfont firerock-iconbaoxiaodan"></i>
-              <span slot="title">报销单据列表</span>
+              <span>{{user.role == 0?"我的报销单据":"报销单据列表"}}</span>
+            </template>
+            <el-menu-item index="2-1" ><p @click="bills(false)" >单据列表</p></el-menu-item>
+            <el-menu-item index="2-2" ><p @click="bills(true)">单据审核</p></el-menu-item>
+          </el-submenu>
+            <el-menu-item index="3" @select="bills" @click="bills(false)" v-if="user.role == 0">
+              <i class="iconfont firerock-iconbaoxiaodan"></i>
+              <span slot="title">{{user.role == 0?"我的报销单据":"报销单据列表"}}</span>
             </el-menu-item>
           </el-menu>
            <!-- <el-menu
@@ -59,8 +67,9 @@
           <el-form :model="addForm" label-width="80px">
             <!-- <el-form :model="form" :rules="rules" ref="ruleForm" label-width="100px" class="demo-ruleForm"> -->
             <!-- 报销人 -->
-            <el-form-item label="报销人">
-              <el-select v-model="addForm.ownerId" placeholder="请选择报销人" style="width: 150px">
+            <el-form-item label="报销人" >
+              <!--普通员工只能自己填报自己的 -->
+              <el-select v-model="addForm.ownerId" placeholder="请选择报销人" style="width: 150px" :disabled="user.role == 0" filterable="true">
                 <span v-for="(item, index) in users" :key="index">
                   <el-option :label="item.name" :value="item.id"></el-option>
                 </span>
@@ -219,12 +228,25 @@
                   <span style="font-size:12px;">{{scope.row.remark}}</span>
                 </template>
               </el-table-column>
-              <el-table-column label="操作" width="160">
-                  <template slot-scope="scope">
-                      <el-button  icon="el-icon-view"  circle size="mini"  @click.stop.native="downloadByA(scope.row)"></el-button>
-                      <el-button icon="el-icon-edit" circle size="mini" style="margin-left:10px;" @click.stop.native="showEditName(scope.row)"></el-button>
-                      <el-button icon="el-icon-delete"  circle size="mini" style="margin-left:10px;" @click.stop.native="deleteItem(scope.row)"></el-button>
-                      
+              <el-table-column prop="status" label="状态" width="100">
+                <template slot-scope="scope">
+                  <span v-if="scope.row.status == 1" class="waiting">{{statusTxt[scope.row.status]}}</span>
+                  <span v-if="scope.row.status == 2" class="rejected">{{statusTxt[scope.row.status]}}</span>
+                  <span v-if="scope.row.status == 0 || scope.row.status == 3" >{{statusTxt[scope.row.status]}}</span>
+                </template>
+              </el-table-column>
+              <el-table-column label="操作" :width="isAuditList?220:160">
+                  <template slot-scope="scope" >
+                      <div v-if="!isAuditList">
+                      <el-button icon="el-icon-view"  circle size="mini"  @click.stop.native="downloadByA(scope.row)" ></el-button>
+                      <el-button icon="el-icon-edit" circle size="mini" style="margin-left:10px;" @click.stop.native="showEditName(scope.row)" v-show="(scope.row.status == 1 || scope.row.status == 2) || user.role > 0 "></el-button>
+                      <el-button icon="el-icon-delete"  circle size="mini" style="margin-left:10px;" @click.stop.native="deleteItem(scope.row)" v-show="(scope.row.status == 1 || scope.row.status == 2) || user.role > 0 "></el-button>
+                      </div>
+                      <div v-if="isAuditList">
+                        <el-button  size="mini"  @click.stop.native="downloadByA(scope.row)" >查看</el-button>
+                      <el-button  size="mini" style="margin-left:5px;" @click.stop.native="approve(scope.row)" >通过</el-button>
+                      <el-button  size="mini" style="margin-left:5px;" @click.stop.native="deny(scope.row)" >驳回</el-button>
+                      </div>
                   </template>
               </el-table-column>
           </el-table>
@@ -249,9 +271,9 @@
         <!-- 内容主体 -->
         <div class="informant"><!--  报销人 -->
           <el-form :model="ParticularsList" label-width="80px">
-            <el-form-item label="报销人">
-              <el-input v-show="flg" v-model="ParticularsList.ownerName" disabled ></el-input>
-              <el-select v-show="!flg" v-model="ParticularsList.ownerId" placeholder="请选择报销人" style="width: 150px" :disabled="flg">
+            <el-form-item label="报销人" style="width: 270px">
+              <!-- <el-input v-show="flg" v-model="ParticularsList.ownerName" disabled ></el-input> -->
+              <el-select v-model="ParticularsList.ownerId" placeholder="请选择报销人" style="width: 150px" :disabled="flg || ParticularsList.ownerId == ParticularsList.operatorId">
                 <span v-for="(item, index) in users" :key="index">
                   <el-option :label="item.name" :value="item.id"></el-option>
                 </span>
@@ -373,6 +395,9 @@ export default {
   props: {},
   data() {
     return {
+      isAuditList: false,
+      statusTxt:["审核通过","待审核", "已驳回", "已撤销"],
+      user: JSON.parse(sessionStorage.getItem("user")),
       allExpList:[],
       expenseTypeList:[],
       tian:{a: null,b: null,c: null,d: null,e: null,f: null,g: null,h: null,},
@@ -457,6 +482,48 @@ export default {
             inpu.value = parseFloat(inpu.value);
         }
     },
+    approve(item) {
+      //审核通过
+      this.http.post('/expense-sheet/approve', {id:item.id
+        },
+        res => {
+            if (res.code == "ok") {
+                this.getList();
+            } else {
+                this.$message({
+                message: res.msg,
+                type: "error"
+                });
+            }
+        },
+        error => {
+            this.$message({
+                message: error,
+                type: "error"
+            });
+        });
+    },
+    deny(item) {
+      //审核驳回
+      this.http.post('/expense-sheet/deny', {id:item.id
+        },
+        res => {
+            if (res.code == "ok") {
+                this.getList();
+            } else {
+                this.$message({
+                message: res.msg,
+                type: "error"
+                });
+            }
+        },
+        error => {
+            this.$message({
+                message: error,
+                type: "error"
+            });
+        });
+    },
     getExpList() {
       this.http.post('/expense-type/getList', {
         },
@@ -493,12 +560,18 @@ export default {
       this.getParticulars(val.id)
       this.expenseTypeList = this.allExpList.filter(a=>a.mainType == val.type);
     },
-    staffs() { // 控制员工费用报表
-      this.displayTable = false;
+    staffs(key, keyPath) { // 控制员工费用报表
+      if (keyPath[0] == '1') {
+        this.displayTable = false;
+      } else {
+        this.displayTable = true;
+        this.getList();
+      }
     },
-    bills() { // 控制
-      this.displayTable = true
-      this.getList()
+    bills(audit) { // 控制
+      this.isAuditList = audit;
+      this.getList();
+      this.displayTable = true;
     },
     present(){
       this.dialog = false
@@ -518,7 +591,7 @@ export default {
         this.http.post('/expense-sheet/add', this.ParticularsList,
         res => {
             if (res.code == "ok") {
-                this.bills()
+                this.bills(this.isAuditList);
                 this.$message({
                 message: '编辑成功',
                 type: "success"
@@ -548,6 +621,10 @@ export default {
         res => {
             if (res.code == "ok") {
                 this.users = res.data.records;
+                if (this.user.role == 0) {
+                    this.addForm.ownerId = this.user.id;
+                    this.addForm.status = 1;
+                }
             } else {
                 this.$message({
                 message: res.msg,
@@ -596,13 +673,19 @@ export default {
     },
     //获取单据列表
     getList() {
-      this.http.post('/expense-sheet/list', {pageIndex: this.page,
+      var param = {pageIndex: this.page,
                     pageSize: this.size,
                     code: this.code,
                     createDate: this.date,
                     ownerId:this.ownerId,
                     type:this.type,
-                    },
+                    };
+      if (this.isAuditList) {
+        param.status = 1;
+      }
+      this.list = [];
+      this.total = 0;
+      this.http.post('/expense-sheet/list', param,
         res => {
             if (res.code == "ok") {
                 this.list = res.data.records;
@@ -772,6 +855,10 @@ export default {
       this.addForm.type = index
       this.ins = index;
       this.expenseTypeList = this.allExpList.filter(a=>a.mainType == this.ins);
+      if (this.user.role == 0) {
+         this.addForm.ownerId = this.user.id;
+      }
+      
       this.getNextCode();
     },
     
@@ -974,5 +1061,10 @@ export default {
   margin-left: 50%;
 
 }
-
+.waiting {
+  color:orange;
+}
+.rejected {
+  color:red;
+}
 </style>

+ 3 - 0
fhKeeper/formulahousekeeper/timesheet/src/views/project/earning.vue

@@ -70,6 +70,9 @@
                                 ¥{{scope.row.baseRisk2 | numberToCurrency}}
                                 </template>
                             </el-table-column> -->
+                            <el-table-column  label="备注"  prop="remark">
+                                
+                            </el-table-column>
                             <el-table-column  label="选择" width="55" type="selection" v-if="deleteTxt == '确认删除'">
                                 
                             </el-table-column>

+ 35 - 5
fhKeeper/formulahousekeeper/timesheet/src/views/project/finance.vue

@@ -9,19 +9,21 @@
             <el-form-item style="float:right;">
                 <el-link type="primary" :underline="false" href="./upload/财务人员成本模板.xlsx" download="财务人员成本模板.xlsx">财务模板下载</el-link>
             </el-form-item>
-            <el-form-item style="float:right;">
+            <!-- <el-form-item style="float:right;">
                 <el-upload ref="upload" action="#" :limit="1" :http-request="importFinance" :show-file-list="false">
                         <el-link type="primary" :underline="false" >财务数据上传</el-link>
                     </el-upload>
+            </el-form-item> -->
+            <el-form-item style="float:right;">
+                <el-link type="primary" :underline="false" @click="importDialog = true;isUploading=false;">财务数据上传</el-link>
             </el-form-item>
             </el-form>
         </el-col>
-        
         <!--列表-->
         <el-table :data="list" highlight-current-row v-loading="listLoading" 
         show-summary=true
         ref="table"
-        height="300" style="width: 100%;">
+        :height="300" style="width: 100%;">
             <el-table-column prop="name" label="姓名" sortable width="150"></el-table-column>
             <el-table-column prop="monthCost" label="工资"  width="150"></el-table-column>
             <el-table-column prop="bonus" label="奖金" ></el-table-column>
@@ -33,10 +35,10 @@
             <el-table-column prop="others" label="其他" ></el-table-column>
             <el-table-column prop="totalCost" label="总成本" ></el-table-column>
         </el-table>
-       
+        
         <el-form :inline="true" >
             <el-form-item >
-                <el-link type="primary" :underline="false" @click="assignToProject">查看项目成本分配</el-link>
+                <el-link type="primary" :underline="false" @click="assignToProject" style="margin-left:5px;">查看项目成本分配</el-link>
             </el-form-item>
             <el-form-item style="float:right;">
                 <el-link type="primary" :underline="false" @click="exportData">导出数据</el-link>
@@ -80,6 +82,26 @@
                 <el-button type="primary" @click="userDetailVisible = false" >确定</el-button>
             </div>
         </el-dialog>
+         
+         <!--导入时的设置界面 -->
+         <el-dialog title="财务数据导入" v-if="importDialog" :visible.sync="importDialog" :close-on-click-modal="false" customClass="customWidth" width="500px">
+            <el-form ref="form3" :model="importParam" >
+                <el-form-item label="导入月份" >
+                    <div style="color:orange;">{{date}}</div>
+                </el-form-item>
+                <el-form-item prop="syncHistoryReport"  >
+                    <el-checkbox label="重新计算该月已填日报成本" v-model="importParam.syncHistoryReport"></el-checkbox>
+                </el-form-item>
+                <el-form-item prop="syncUserCost"  >
+                    <el-checkbox label="同步到组织架构中员工月薪成本" v-model="importParam.syncUserCost" ></el-checkbox>
+                </el-form-item>
+            </el-form>
+            <div slot="footer" class="dialog-footer">
+                <el-upload ref="upload" action="#" :limit="1" :http-request="importFinance" :show-file-list="false" >
+                        <el-button type="primary" style="width:100%;" :loading="isUploading" >选择文件并开始导入</el-button>
+                    </el-upload>
+            </div>
+        </el-dialog>
     </section>
 </template>
 <style scoped>
@@ -99,6 +121,9 @@
     export default {
         data() {
             return {
+                isUploading:false,
+                importDialog: false,
+                importParam:{syncUserCost:true, syncHistoryReport:true},
                 user: JSON.parse(sessionStorage.getItem("user")),
                 userDetailVisible: false,
                 userDetail:{},
@@ -281,15 +306,20 @@
                     formData.append("companyId", this.user.companyId);
                     console.log('date====='+this.date);
                     formData.append("yearMonth", this.date);
+                    formData.append("syncUserCost", this.importParam.syncUserCost);
+                    formData.append("syncHistoryReport", this.importParam.syncHistoryReport);
+                    this.isUploading = true;
                     this.http.uploadFile('/finance/importData', formData,
                     res => {
                         this.$refs.upload.clearFiles();
                         this.listLoading = false;
+                        this.isUploading = false;
                         if (res.code == "ok") {
                             this.$message({
                                 message: "导入成功",
                                 type: "success"
                             });
+                            this.importDialog = false;
                             //重新读取列表
                             this.getList();
                         } else {

+ 27 - 2
fhKeeper/formulahousekeeper/timesheet/src/views/project/info.vue

@@ -70,7 +70,7 @@
                 </div>
 
                 <!--项目相关领导 -->
-                <div class="box info" style="margin-top:10px;" v-if="user.company.packageEngineering == 1">
+                <div class="box info" style="margin-top:10px;" >
                     <div><label>相关领导<el-link v-if="user.id == project.creatorId || user.id == project.inchargerId" @click="showChooseLeaderTree" style="float:right;"><i class="el-icon-edit"  ></i></el-link></label>
                     
                     </div>
@@ -214,7 +214,11 @@
                 <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="remark"  placeholder="请输入校正原因" ></el-input>
+                </el-form-item>
             </el-form>
+            
             <div slot="footer" class="dialog-footer">
                 <el-button @click.native="addBaseFormVisible = false">取消</el-button>
                 <el-button type="primary" @click="adjustBase" :loading="addLoading">提交</el-button>
@@ -389,6 +393,7 @@
     export default {
         data() {
             return {
+                remark:null,
                 progressData:{},
                 deptMembData: [
                     {
@@ -517,6 +522,7 @@
                     });
                 });
             },
+
             getProjectNotifyUserList(projectId) {
                 this.http.post("/project-notify-user/get", {projectId: projectId},
                     res => {
@@ -574,6 +580,24 @@
                 if (this.addForm.notifyUserNames.length > 0) {
                     this.addForm.notifyUserNames = this.addForm.notifyUserNames.substring(0, this.addForm.notifyUserNames.length-1);
                 }
+                //提交数据修改
+                this.http.post("/project-notify-user/modify", {projectId: this.curProjectId, chosenLeaders: JSON.stringify(this.chosenLeaders)},
+                res => {
+                    if (res.code == "ok") {
+                        
+                    } else {
+                        this.$message({
+                            message: res.msg,
+                            type: "error"
+                        });
+                    }
+                },
+                error => {
+                    this.$message({
+                        message: error,
+                        type: "error"
+                    });
+                });
             },
 
             restrictNumber(targetId) {
@@ -853,13 +877,14 @@
                     id: this.addForm.id,
                     contractAmount: this.addForm.contractAmount,
                     baseCostData:JSON.stringify(this.modBaseCostData),
+                    remark: this.remark
                 },
                 res => {
                     if (res.code == "ok") {
                         this.getProjectBaseData(this.curProjectId);
                         this.addBaseFormVisible = false;
                         this.$message({
-                            message: '校成功',
+                            message: '校成功',
                             type: "success"
                         });
                         this.$emit("basecost-change", null);

+ 6 - 7
fhKeeper/formulahousekeeper/timesheet/src/views/project/list.vue

@@ -196,7 +196,7 @@
                             </div>
                         </div>
                     </el-tab-pane>
-                    <el-tab-pane label="工程专业" name="engineeringProfession" >
+                    <el-tab-pane label="工程专业" name="engineeringProfession" v-if="user.company.packageEngineering == 1">
                        <div style="padding-top:10px;">
                            <el-table :data="projectProfessionList" size="small" :key="Math.random()">
                                <el-table-column prop="professionId" width="200">
@@ -1313,9 +1313,10 @@
                     this.getProjectBaseData(item.id);
                     if (this.user.company.packageEngineering == 1) {
                         this.getProjectProfessions(item.id);
-                        //获取项目的相关领导
-                        this.getProjectNotifyUserList(item.id);
+                        
                     }
+                    //获取项目的相关领导
+                    this.getProjectNotifyUserList(item.id);
                 }
                 this.addFormVisible = true;
                 if (this.user.company.packageEngineering == 1) {
@@ -1456,10 +1457,8 @@
                         } else {
                             formData.append("customerId", this.addForm.customerId);
                         }
-                        if (this.user.company.packageEngineering == 1) {
-                            if (this.chosenLeaders != null && this.chosenLeaders.length > 0) {
-                                formData.append("chosenLeaders", JSON.stringify(this.chosenLeaders));
-                            }
+                        if (this.chosenLeaders != null && this.chosenLeaders.length > 0) {
+                            formData.append("chosenLeaders", JSON.stringify(this.chosenLeaders));
                         }
                         
                         this.http.uploadFile(this.port.project.add,formData,

+ 100 - 19
fhKeeper/formulahousekeeper/timesheet/src/views/project/projectInside.vue

@@ -41,6 +41,9 @@
                                         <el-dropdown-item divided @click.native="renameGroup(item)">
                                             <i class="el-icon-edit"></i>
                                             修改组名</el-dropdown-item>
+                                        <el-dropdown-item divided @click.native="addToTemplate(item)">
+                                            <i class="el-icon-plus"></i>
+                                            设为模板</el-dropdown-item>
                                         <el-dropdown-item divided @click.native="deleteGroup(item)">
                                             <i class="el-icon-delete"></i>删除分组</el-dropdown-item>
                                     </el-dropdown-menu>
@@ -340,13 +343,13 @@
                         </div>
                     </div> -->
 
-                    <div class="ddl" v-if="ProgressList.length > 0">
-                        <div class="elCard" v-for="item in ProgressList" :key="item.id" style="margin-bottom: 10px; height:" >
-                            <i class="el-icon-success" style="color: #43d14f;" v-if="item.status == 0"></i>
-                            <i class="el-icon-success" style="color: #fd7624;" v-else-if="item.status == 1"></i>
+                    <div class="ddl" v-if="recentProgressInfo != null && recentProgressInfo.id != null">
+                        <div class="elCard" style="margin-bottom: 10px; height:" >
+                            <i class="el-icon-success" style="color: #43d14f;" v-if="recentProgressInfo.status == 0"></i>
+                            <i class="el-icon-success" style="color: #fd7624;" v-else-if="recentProgressInfo.status == 1"></i>
                             <i class="el-icon-success" style="color: #fd4d47;" v-else></i>
-                            <span v-if="item.status == 0">状态正常</span>
-                            <span v-else-if="item.status == 1">状态正常</span>
+                            <span v-if="recentProgressInfo.status == 0">状态正常</span>
+                            <span v-else-if="recentProgressInfo.status == 1">状态正常</span>
                             <span v-else>进展逾期</span>
 
                             <el-dropdown trigger="click" style="float:right;cursor:pointer; float: right;">
@@ -354,11 +357,11 @@
                                     <el-dropdown-menu slot="dropdown">
 
                                         <el-dropdown-item divided>
-                                            <span @click="deleteTaskProgress(item.id)"><i class="el-icon-delete"></i>删除列表</span></el-dropdown-item>
+                                            <span @click="deleteTaskProgress(recentProgressInfo.id)"><i class="el-icon-delete"></i>删除列表</span></el-dropdown-item>
                                     </el-dropdown-menu>
                             </el-dropdown>
-                            <div class="elCard_qu">屈经理更新于{{item.indate | relativeTime}}</div>
-                            <p style="padding-left: 20px;">{{item.content}}</p>
+                            <div class="elCard_qu">{{recentProgressInfo.creatorName}}更新于{{recentProgressInfo.indate | relativeTime}}</div>
+                            <p style="padding-left: 20px;">{{recentProgressInfo.content}}</p>
                             <div class="examine"><el-button type="text" @click="innerVisibless = true" style="color: #8F87A3;">查看历史记录</el-button></div>
                         </div>
                     </div>
@@ -400,8 +403,7 @@
                          <!--  -->
                     </div>
                     <span slot="footer" class="dialog-footer">
-                        <el-button @click="innerVisibless = false">取 消</el-button>
-                        <el-button type="primary" @click="innerVisibless = false">确 定</el-button>
+                        <el-button type="primary" @click="innerVisibless = false">关闭</el-button>
                     </span>
                     </el-dialog>
 
@@ -559,17 +561,28 @@
                 </el-tab-pane>
                 <el-tab-pane label="从模板创建" name="template">
                     <el-card class="template_box" :style="t.selected?'border: 1px solid #409eff;':''" v-for="(t,tIndex) in groupTemplateList" :key="t.id"  @click.native="choseTemplate(tIndex)">
+                        <div>
                         <el-row >
                             <el-col :span="22">
-                                <div >{{t.name}}</div>
-                                <div style="margin-top:10px;"><span style="color:#8c8c8c;font-size:12px;" v-for="(s,index) in t.stagesList" :key="s.id">
+                                <div><span>{{t.name}}</span>
+                                <el-link :underline="false" type="primary" style="color:#aaa;margin-left:10px;"
+                                 @click="deleteTemplate(t)"><i class="el-icon-delete" v-show="t.isSystem == 0" ></i>
+                                </el-link>
+                                </div>
+                                <div style="margin-top:10px;">
+                                    <span style="color:#8c8c8c;font-size:12px;" v-for="(s,index) in t.stagesList" :key="s.id">
                                     <i class="el-icon-arrow-right" v-if="index>0"></i>
-                                    {{s.stagesName}}</span></div>
+                                    {{s.stagesName}}</span>
+                                    
+                                </div>
                             </el-col>
                             <el-col :span="2">
-                                <i class="el-icon-check" v-if="t.selected" style="font-size:20px;color:#409eff;margin-top:12px;"></i>
+                                <i class="el-icon-check" v-show="t.selected" style="font-size:20px;color:#409eff;margin-top:12px;"></i>
                             </el-col>
+                            
                         </el-row>
+                        
+                        </div>
                     </el-card>
                     <el-button type="primary" @click="addTemplateGroup" style="width:100%;" >创建</el-button>
                 </el-tab-pane>
@@ -587,11 +600,23 @@
                 <el-button type="primary" @click="addGroup" style="width:100%;" >保存</el-button>
             </div>
         </el-dialog>
+        <el-dialog title="添加为模板" v-if="addToTmpDialog" :visible.sync="addToTmpDialog" :close-on-click-modal="false" customClass="customWidth" width="500px">
+            <el-form ref="formTmp" :model="templateForm" :rules="rules" style="margin-top:10px;">
+                    <el-form-item prop="name">
+                        <el-input v-model="templateForm.name" placeholder="请输入模板名称" maxlength="12"
+                            show-word-limit clearable></el-input>
+                    </el-form-item>
+            </el-form>
+            <div slot="footer" class="dialog-footer">
+                <el-button type="primary" @click="createTemplate" style="width:100%;" >存为模板</el-button>
+            </div>
+        </el-dialog>
+        
         <!-- 新增任务列表弹出框 -->
-        <el-dialog title="新增/修改任务列表" v-if="addStageDialog" :visible.sync="addStageDialog" :close-on-click-modal="false" customClass="customWidth" width="300px">
+        <el-dialog title="新增/修改任务列表" v-if="addStageDialog" :visible.sync="addStageDialog" :close-on-click-modal="false" customClass="customWidth" width="500px">
             <el-form ref="form2" :model="stageForm" :rules="rules2" >
                 <el-form-item prop="stagesName">
-                    <el-input v-model="stageForm.stagesName" placeholder="请输入任务列表名称" maxlength="12"
+                    <el-input v-model="stageForm.stagesName" placeholder="请输入任务列表名称" maxlength="60"
                         show-word-limit clearable></el-input>
                 </el-form-item>
             </el-form>
@@ -671,6 +696,9 @@
         
         data() {
             return {
+                recentProgressInfo:{},
+                addToTmpDialog:false,
+                templateForm:{},
                 importTaskDialog:false,
                 importToStageId:null,
                 exportDialog: false,
@@ -798,7 +826,6 @@
                     color: '#F87872'
                     }],
                 ProgressList: [],
-                progres: {},
                 checkboxGrounp: [], // 选中人的数据
                 checkLists: [], // 选中人数据的ID
                 taskIid: null
@@ -806,6 +833,54 @@
             
         },
         methods: {
+            //删除模板
+            deleteTemplate(t) {
+                var that = this;
+                this.$confirm("确认要删除["+t.name+"]吗?", "提示", {
+                    //type: 'warning'
+                }).then(() => {
+                    this.http.post('/group-template/deleteTemplate', {id: t.id},
+                        res => {
+                            if (res.code == "ok") {
+                                this.getGroupTemplate();
+                                this.$message({
+                                    message: '删除模板成功',
+                                    type: "success"
+                                });
+                            } else {
+                                this.$message({
+                                    message: res.msg,
+                                    type: "error"
+                                });
+                            }
+                        }
+                    );
+                });
+            },
+            //创建模板
+            createTemplate() {
+                this.http.post('/group-template/addTemplate', this.templateForm,
+                    res => {
+                        if (res.code == "ok") {
+                            this.addToTmpDialog = false;
+                            this.getGroupTemplate();
+                            this.$message({
+                                message: '添加模板成功',
+                                type: "success"
+                            });
+                        } else {
+                            this.$message({
+                                message: res.msg,
+                                type: "error"
+                            });
+                        }
+                    }
+                );
+            },
+            addToTemplate(item) {
+                this.addToTmpDialog = true;
+                this.templateForm = {groupId: item.id, name:item.name};
+            },
             changeBase() {
                 this.$refs.earning.refreshPage();
             },
@@ -911,7 +986,8 @@
                     res => {
                         if (res.code == "ok") {
                             this.ProgressList = res.data;
-                            this.progres = res.data[0]
+                            this.recentProgressInfo = res.data[0]
+
                         } else {
                             this.$message({
                                 message: res.msg,
@@ -1403,6 +1479,7 @@
                         this.addForm.createDate = null;
                         this.addForm.indate = null;
                         this.addLoading = false;
+                        this.recentProgressInfo = this.addForm.progress;
                     } else {
                         this.$message({
                         message: res.msg,
@@ -1995,6 +2072,10 @@
 
 .taskList .stage {
     font-weight:bold;
+display:block;
+float:left;
+width:260px;
+overflow: auto;
 }