Ver código fonte

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

山水共长天一色 3 anos atrás
pai
commit
22463a9a1c
17 arquivos alterados com 480 adições e 41 exclusões
  1. 15 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/CustomerInfoController.java
  2. 15 7
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/DingDingController.java
  3. 8 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportExtraDegreeController.java
  4. 5 5
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/UserYearleaveSettingController.java
  5. 6 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/vo/LeaveTypeVO.java
  6. 6 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/CustomerInfoService.java
  7. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/DingDingService.java
  8. 5 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ReportExtraDegreeService.java
  9. 7 7
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/CompanyDingdingServiceImpl.java
  10. 100 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/CustomerInfoServiceImpl.java
  11. 57 9
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/DingDingServiceImpl.java
  12. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java
  13. 97 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportExtraDegreeServiceImpl.java
  14. 17 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/UserServiceImpl.java
  15. 65 0
      fhKeeper/formulahousekeeper/timesheet/src/views/centerManage/centerManage.vue
  16. 66 1
      fhKeeper/formulahousekeeper/timesheet/src/views/customer/list.vue
  17. 9 5
      fhKeeper/formulahousekeeper/timesheet/src/views/project/list.vue

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

@@ -10,12 +10,13 @@ import com.management.platform.entity.User;
 import com.management.platform.mapper.CustomerInfoMapper;
 import com.management.platform.mapper.ProjectMapper;
 import com.management.platform.mapper.UserMapper;
+import com.management.platform.service.CustomerInfoService;
 import com.management.platform.util.HttpRespMsg;
 import org.springframework.util.StringUtils;
 import org.springframework.web.bind.annotation.RequestMapping;
-
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
 
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
@@ -43,6 +44,8 @@ public class CustomerInfoController {
     ProjectMapper projectMapper;
     @Resource
     CustomerInfoMapper customerInfoMapper;
+    @Resource
+    CustomerInfoService customerInfoService;
 
     @RequestMapping("/addOrMod")
     public HttpRespMsg addOrMod(CustomerInfo info) {
@@ -51,11 +54,17 @@ public class CustomerInfoController {
         User user = userMapper.selectById(token);
         List<CustomerInfo> customerInfoMapperAll = customerInfoMapper.getAll(user.getCompanyId());
         List<String> nameList=new ArrayList<>();
+        List<String> codeList=new ArrayList<>();
         customerInfoMapperAll.forEach(cu->{
             nameList.add(cu.getCustomerName());
+            codeList.add(cu.getCustomerCode());
         });
         if(nameList.contains(info.getCustomerName())){
-            msg.setError("客户名称重复");
+            msg.setError("客户名称已存在");
+            return msg;
+        }
+        if(codeList.contains(info.getCustomerCode())){
+            msg.setError("客户编号已存在");
             return msg;
         }
         if (info.getId() == null) {
@@ -113,6 +122,10 @@ public class CustomerInfoController {
         msg.data = all;
         return msg;
     }
+    @RequestMapping("/importData")
+    public HttpRespMsg importData(HttpServletRequest request, MultipartFile file){
+        return customerInfoService.importData(request,file);
+    }
 
 }
 

+ 15 - 7
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/DingDingController.java

@@ -360,11 +360,19 @@ public class DingDingController {
         return new HttpRespMsg();
     }
 //
-//    @RequestMapping("/testCorpVal")
-//    public HttpRespMsg testCorpVal(Integer companyId) {
-//        CompanyDingding companyDingding = companyDingdingService.getOne(new QueryWrapper<CompanyDingding>().eq("company_id", companyId));
-//
-//        dingDingService.getCorpSelfDefSmartReport(companyDingding);
-//        return new HttpRespMsg();
-//    }
+    @RequestMapping("/testCorpLeaveType")
+    public HttpRespMsg testCorpLeaveType(String leaveCode, Integer companyId, String userIds, long offset) {
+        CompanyDingding companyDingding = companyDingdingService.getOne(new QueryWrapper<CompanyDingding>().eq("company_id", companyId));
+
+        dingDingService.getLeaveTypeList(leaveCode, companyId, userIds, offset);
+        return new HttpRespMsg();
+    }
+
+    @RequestMapping("/testSendBusTripLink")
+    public HttpRespMsg testSendBusTripLink(Integer companyId) {
+        CompanyDingding dingding = companyDingdingMapper.selectOne(new QueryWrapper<CompanyDingding>().eq("company_id", companyId));
+
+        companyDingdingService.sendBusinessTripSettingMsg(companyId, dingding.getAgentId(), "040534176023851922");
+        return new HttpRespMsg();
+    }
 }

+ 8 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportExtraDegreeController.java

@@ -9,10 +9,12 @@ import com.management.platform.mapper.ProjectMapper;
 import com.management.platform.mapper.ReportExtraDegreeMapper;
 import com.management.platform.mapper.UserMapper;
 import com.management.platform.service.ProjectService;
+import com.management.platform.service.ReportExtraDegreeService;
 import com.management.platform.util.HttpRespMsg;
 import org.apache.poi.util.StringUtil;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
 
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
@@ -42,6 +44,8 @@ public class ReportExtraDegreeController {
     ProjectMapper projectMapper;
     @Resource
     ProjectService projectService;
+    @Resource
+    ReportExtraDegreeService reportExtraDegreeService;
 
     /**
      * addOrMod添加或者修改
@@ -145,5 +149,9 @@ public class ReportExtraDegreeController {
         msg.data = all;
         return msg;
     }
+    @RequestMapping("/importData")
+    public HttpRespMsg importData(HttpServletRequest request, MultipartFile file){
+       return reportExtraDegreeService.importData(request,file);
+    }
 }
 

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

@@ -82,10 +82,10 @@ public class UserYearleaveSettingController {
         msg.data = userYearleaveSettingMapper.getRichList(user.getCompanyId());
         return msg;
     }
-
-    @RequestMapping("/dingdingList")
-    public HttpRespMsg getDingDingList(Integer companyId) {
-        return dingDingService.getLeaveTypeList(companyId);
-    }
+//
+//    @RequestMapping("/dingdingList")
+//    public HttpRespMsg getDingDingList(Integer companyId) {
+//        return dingDingService.getLeaveTypeList(companyId);
+//    }
 }
 

+ 6 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/vo/LeaveTypeVO.java

@@ -0,0 +1,6 @@
+package com.management.platform.entity.vo;
+
+public class LeaveTypeVO {
+    public String leaveCode;
+    public String leaveName;
+}

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

@@ -1,7 +1,11 @@
 package com.management.platform.service;
 
-import com.management.platform.entity.CustomerInfo;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.management.platform.entity.CustomerInfo;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletRequest;
 
 /**
  * <p>
@@ -13,4 +17,5 @@ import com.baomidou.mybatisplus.extension.service.IService;
  */
 public interface CustomerInfoService extends IService<CustomerInfo> {
 
+    HttpRespMsg importData(HttpServletRequest request, MultipartFile file);
 }

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

@@ -32,5 +32,5 @@ public interface DingDingService {
 
     void getCorpSelfDefSmartReport(CompanyDingding dingding);
 
-    public HttpRespMsg getLeaveTypeList(Integer companyId);
+    public HttpRespMsg getLeaveTypeList(String leaveCode, Integer companyId, String userIds, long offset);
 }

+ 5 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ReportExtraDegreeService.java

@@ -2,6 +2,10 @@ package com.management.platform.service;
 
 import com.management.platform.entity.ReportExtraDegree;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletRequest;
 
 /**
  * <p>
@@ -13,4 +17,5 @@ import com.baomidou.mybatisplus.extension.service.IService;
  */
 public interface ReportExtraDegreeService extends IService<ReportExtraDegree> {
 
+    HttpRespMsg importData(HttpServletRequest request, MultipartFile file);
 }

+ 7 - 7
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/CompanyDingdingServiceImpl.java

@@ -72,7 +72,7 @@ public class CompanyDingdingServiceImpl extends ServiceImpl<CompanyDingdingMappe
         req.setUseridList(useridList);
         req.setTemplateId(TEMPLATE_ALERT_REPORT);
         JSONObject json = new JSONObject();
-        json.put("APPID", appId);
+        json.put("APPID", ""+appId);
         json.put("CORPID", dingding.getCorpid());
         json.put("msg", msg);
         req.setData(json.toJSONString());
@@ -100,7 +100,7 @@ public class CompanyDingdingServiceImpl extends ServiceImpl<CompanyDingdingMappe
         json.put("project", projectNames);
         json.put("reason", reason);
         json.put("auditUser", auditorName);
-        json.put("APPID", appId);
+        json.put("APPID", ""+appId);
         json.put("CORPID", dingding.getCorpid());
         req.setData(json.toJSONString());
         OapiMessageCorpconversationSendbytemplateResponse rsp = null;
@@ -128,7 +128,7 @@ public class CompanyDingdingServiceImpl extends ServiceImpl<CompanyDingdingMappe
         json.put("employeeName", "张辉");
         json.put("deptName", "质量部");
         json.put("date", "2022-03-29");
-        json.put("APPID", appId);
+        json.put("APPID", ""+appId);
         json.put("CORPID", dingding.getCorpid());
         req.setData(json.toJSONString());
         OapiMessageCorpconversationSendbytemplateResponse rsp = null;
@@ -153,7 +153,7 @@ public class CompanyDingdingServiceImpl extends ServiceImpl<CompanyDingdingMappe
         req.setTemplateId(TEMPLATE_REPORT_WAITING_APPLY);
         JSONObject json = new JSONObject();
         json.put("auditNum", ""+auditNum);
-        json.put("APPID", appId);
+        json.put("APPID", ""+appId);
         json.put("CORPID", dingding.getCorpid());
         req.setData(json.toJSONString());
         OapiMessageCorpconversationSendbytemplateResponse rsp = null;
@@ -176,7 +176,7 @@ public class CompanyDingdingServiceImpl extends ServiceImpl<CompanyDingdingMappe
         req.setUseridList(useridList);
         req.setTemplateId(TEMPLATE_BUSTRIP_SETTING);
         JSONObject json = new JSONObject();
-        json.put("APPID", appId);
+        json.put("APPID", ""+appId);
         json.put("CORPID", dingding.getCorpid());
         req.setData(json.toJSONString());
         OapiMessageCorpconversationSendbytemplateResponse rsp = null;
@@ -203,7 +203,7 @@ public class CompanyDingdingServiceImpl extends ServiceImpl<CompanyDingdingMappe
                 JSONObject json = new JSONObject();
                 json.put("name", ""+title);
                 json.put("endDate", ""+endDate);
-                json.put("APPID", appId);
+                json.put("APPID", ""+appId);
                 json.put("CORPID", dingding.getCorpid());
                 req.setData(json.toJSONString());
 
@@ -231,7 +231,7 @@ public class CompanyDingdingServiceImpl extends ServiceImpl<CompanyDingdingMappe
         JSONObject json = new JSONObject();
         json.put("taskName", taskName);
         json.put("project", project);
-        json.put("APPID", appId);
+        json.put("APPID", ""+appId);
         json.put("CORPID", dingding.getCorpid());
         req.setData(json.toJSONString());
         OapiMessageCorpconversationSendbytemplateResponse rsp = null;

+ 100 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/CustomerInfoServiceImpl.java

@@ -1,10 +1,26 @@
 package com.management.platform.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.management.platform.entity.CustomerInfo;
 import com.management.platform.mapper.CustomerInfoMapper;
+import com.management.platform.mapper.UserMapper;
 import com.management.platform.service.CustomerInfoService;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.management.platform.util.ExcelUtil;
+import com.management.platform.util.HttpRespMsg;
+import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
+import org.apache.poi.ss.usermodel.*;
 import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.io.*;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -16,5 +32,88 @@ import org.springframework.stereotype.Service;
  */
 @Service
 public class CustomerInfoServiceImpl extends ServiceImpl<CustomerInfoMapper, CustomerInfo> implements CustomerInfoService {
+    @Resource
+    CustomerInfoMapper customerInfoMapper;
+    @Resource
+    UserMapper userMapper;
+    @Override
+    public HttpRespMsg importData(HttpServletRequest request, MultipartFile multipartFile) {
+        HttpRespMsg msg=new HttpRespMsg();
+        Integer companyId=userMapper.selectById(request.getHeader("token")).getCompanyId();
+        String fileName=multipartFile.getOriginalFilename();
+        File file=new File(fileName == null ? "file" : fileName);
+        InputStream inputStream=null;
+        OutputStream outputStream=null;
+        try {
+            inputStream= multipartFile.getInputStream();
+            outputStream=new FileOutputStream(file);
+            byte[] buffer = new byte[4096];
+            int temp = 0;
+            while ((temp = inputStream.read(buffer, 0, 4096)) != -1) {
+                outputStream.write(buffer, 0, temp);
+            }
+            inputStream.close();
+            outputStream.close();
 
+            //然后解析表格
+            Workbook workbook = WorkbookFactory.create(new FileInputStream(file));
+            DateFormat df = new SimpleDateFormat("yyyy-MM");
+            //获取公司所有客户
+            List<CustomerInfo> allCustomerInfo = customerInfoMapper.selectList(new QueryWrapper<CustomerInfo>().eq("company_id", companyId));
+            Sheet sheet = workbook.getSheetAt(0);
+            //由于第一行需要指明列对应的标题
+            int rowNum = sheet.getLastRowNum();
+            if (rowNum == 0) {
+                msg.setError("请填写客户数据");
+                return msg;
+            }
+            List<String> nameList=new ArrayList<>();
+            int dataCount = 0;
+            for (int rowIndex = 1; rowIndex <= rowNum; rowIndex++) {
+                Row row = sheet.getRow(rowIndex);
+                dataCount++;
+                if (row == null) {
+                    continue;
+                }
+                if (ExcelUtil.isRowEmpty(row)) {
+                    continue;
+                }
+                    if (row.getCell(1) == null) {
+                        msg.setError("第"+dataCount+"行缺少客户名称");
+                        return msg;
+                    }
+                    if(nameList.contains(row.getCell(1).toString())){
+                        msg.setError("当前导入数据存在重复客户名称["+row.getCell(1).toString()+"]");
+                        return msg;
+                    }
+                    nameList.add(row.getCell(1).toString());
+                CustomerInfo customerInfo=new CustomerInfo();
+                List<CustomerInfo> collect = allCustomerInfo.stream().filter(sv -> sv.getCustomerName().equals(row.getCell(1).toString())).collect(Collectors.toList());
+                customerInfo.setCustomerCode(row.getCell(0).toString());
+                customerInfo.setCustomerName(row.getCell(1).toString());
+                customerInfo.setContactName(row.getCell(2).toString());
+                row.getCell(3).setCellType(CellType.STRING);
+                customerInfo.setContactPhone(row.getCell(3).getStringCellValue());
+                customerInfo.setEmail(row.getCell(4).toString());
+                customerInfo.setAddress(row.getCell(5).toString());
+                customerInfo.setCompanyId(companyId);
+                if(collect.size()>0){
+                    Integer id=collect.get(0).getId();
+                    customerInfo.setId(id);
+                    customerInfoMapper.updateById(customerInfo);
+                }else{
+                    customerInfoMapper.insert(customerInfo);
+                }
+            }
+            msg.data=dataCount;
+            return msg;
+        } catch (IOException e){
+            e.printStackTrace();
+            msg.setError("文件处理出错");
+            return msg;
+        } catch (InvalidFormatException e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
 }

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

@@ -14,6 +14,7 @@ import com.dingtalk.api.request.*;
 import com.dingtalk.api.response.*;
 import com.management.platform.constant.Constant;
 import com.management.platform.entity.*;
+import com.management.platform.entity.vo.LeaveTypeVO;
 import com.management.platform.entity.vo.UserVO;
 import com.management.platform.mapper.*;
 import com.management.platform.service.*;
@@ -379,6 +380,7 @@ public class DingDingServiceImpl implements DingDingService {
             }
             dingding.setInnerToken(response.getAccessToken());
             dingding.setInnerExpireTime(LocalDateTime.now().plusSeconds(response.getExpiresIn()));
+            companyDingdingMapper.updateById(dingding);
         }
         return dingding.getInnerToken();
     }
@@ -1343,23 +1345,69 @@ public class DingDingServiceImpl implements DingDingService {
         }
     }
 
-    public HttpRespMsg getLeaveTypeList(Integer companyId) {
+    public HttpRespMsg getLeaveTypeList(String leaveCode, Integer companyId, String userIds, long offset) {
         CompanyDingding dingding = companyDingdingMapper.selectOne(new QueryWrapper<CompanyDingding>().eq("company_id", companyId));
-
+        HttpRespMsg msg = new HttpRespMsg();
+        HashMap resultMap = new HashMap();
         DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/attendance/vacation/type/list");
         OapiAttendanceVacationTypeListRequest req = new OapiAttendanceVacationTypeListRequest();
         List<User> userList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", companyId).eq("role_name", "超级管理员"));
-        req.setOpUserid(userList.get(0).getDingdingUserid());
-        req.setVacationSource("all");
-        OapiAttendanceVacationTypeListResponse rsp = null;
-        try {
-            rsp = client.execute(req, getInnerCorpToken(dingding));
-            System.out.println(rsp.getBody());
+        String oaManagerDid =userList.get(0).getDingdingUserid();
+        if (leaveCode == null) {
+            req.setOpUserid(oaManagerDid);
+            req.setVacationSource("all");
+            OapiAttendanceVacationTypeListResponse rsp = null;
+            try {
+                rsp = client.execute(req, getInnerCorpToken(dingding));
+                System.out.println(rsp.getBody());
+                JSONObject json = JSONObject.parseObject(rsp.getBody());
+                JSONArray result = json.getJSONArray("result");
+                List<LeaveTypeVO> typeList = new ArrayList<>();
+                LeaveTypeVO defaultType = null;
+                for (int i=0;i<result.size(); i++) {
+                    JSONObject obj = result.getJSONObject(i);
+                    LeaveTypeVO vo = new LeaveTypeVO();
+                    vo.leaveCode = obj.getString("leave_code");
+                    vo.leaveName = obj.getString("leave_name");
+                    typeList.add(vo);
+                }
+                resultMap.put("leaveTypeList", typeList);
+                leaveCode = typeList.get(0).leaveCode;
+            } catch (ApiException e) {
+                e.printStackTrace();
+            }
+        }
+
+        //再调用查看假期余额的接口
+        client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/attendance/vacation/quota/list");
+        OapiAttendanceVacationQuotaListRequest quoataReq = new OapiAttendanceVacationQuotaListRequest();
+        quoataReq.setLeaveCode(leaveCode);
+        quoataReq.setOpUserid(oaManagerDid);
+        if (StringUtils.isEmpty(userIds)) {
+            //获取全部员工,离职的不看
+            userList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", companyId).eq("is_active", 1));
+            String collect = userList.stream().map(User::getDingdingUserid).collect(Collectors.joining(","));
+            userIds = collect;
+        }
+        quoataReq.setUserids(userIds);
 
+        quoataReq.setOffset(offset);
+        quoataReq.setSize(50L);
+        OapiAttendanceVacationQuotaListResponse quotaListResponse = null;
+        try {
+            quotaListResponse = client.execute(quoataReq, getInnerCorpToken(dingding));
         } catch (ApiException e) {
             e.printStackTrace();
         }
-        return new HttpRespMsg();
+        System.out.println(quotaListResponse.getBody());
+        JSONObject json = JSONObject.parseObject(quotaListResponse.getBody());
+        if (json.getInteger("errcode") == 0) {
+
+        } else {
+            msg.setError(json.getString("errmsg"));
+        }
+
+        return msg;
     }
 
     public void activateSuite(String authCorpid, String tmpAuthCode) throws ApiException {

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

@@ -184,7 +184,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
             if (category != null) {
                 queryWrapper.eq("category", category);
             }
-            queryWrapper.orderByDesc("is_public");
+            queryWrapper.orderByDesc("is_public").orderByAsc("id");
             IPage<Project> projectIPage = projectMapper.selectPage(new Page<>(pageIndex, pageSize),
                     queryWrapper);
             List<Project> projectList = projectIPage.getRecords();

+ 97 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportExtraDegreeServiceImpl.java

@@ -1,10 +1,29 @@
 package com.management.platform.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.management.platform.entity.ReportExtraDegree;
 import com.management.platform.mapper.ReportExtraDegreeMapper;
+import com.management.platform.mapper.UserMapper;
 import com.management.platform.service.ReportExtraDegreeService;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.management.platform.util.ExcelUtil;
+import com.management.platform.util.HttpRespMsg;
+import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
+import org.apache.poi.ss.usermodel.Row;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.usermodel.Workbook;
+import org.apache.poi.ss.usermodel.WorkbookFactory;
 import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.io.*;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -16,5 +35,82 @@ import org.springframework.stereotype.Service;
  */
 @Service
 public class ReportExtraDegreeServiceImpl extends ServiceImpl<ReportExtraDegreeMapper, ReportExtraDegree> implements ReportExtraDegreeService {
+    @Resource
+    ReportExtraDegreeMapper reportExtraDegreeMapper;
+    @Resource
+    UserMapper userMapper;
+    @Override
+    public HttpRespMsg importData(HttpServletRequest request, MultipartFile multipartFile) {
+        HttpRespMsg msg=new HttpRespMsg();
+        String fileName=multipartFile.getOriginalFilename();
+        File file=new File(fileName == null?"file":fileName);
+        InputStream inputStream=null;
+        OutputStream outputStream=null;
+        Integer companyId=userMapper.selectById(request.getHeader("token")).getCompanyId();
+        try {
+            inputStream= multipartFile.getInputStream();
+            outputStream=new FileOutputStream(file);
+            byte[] buffer = new byte[4096];
+            int temp = 0;
+            while ((temp = inputStream.read(buffer, 0, 4096)) != -1) {
+                outputStream.write(buffer, 0, temp);
+            }
+            inputStream.close();
+            outputStream.close();
 
+            //然后解析表格
+            Workbook workbook = WorkbookFactory.create(new FileInputStream(file));
+            DateFormat df = new SimpleDateFormat("yyyy-MM");
+            //获取公司所有客户
+            List<ReportExtraDegree> allReportExtraDegree = reportExtraDegreeMapper.selectList(new QueryWrapper<ReportExtraDegree>().eq("company_id", companyId));
+            Sheet sheet = workbook.getSheetAt(0);
+            //由于第一行需要指明列对应的标题
+            int rowNum = sheet.getLastRowNum();
+            if (rowNum == 0) {
+                msg.setError("请填写研究中心数据");
+                return msg;
+            }
+            List<String> nameList=new ArrayList<>();
+            int dataCount = 0;
+            for (int rowIndex = 1; rowIndex <= rowNum; rowIndex++) {
+                Row row = sheet.getRow(rowIndex);
+                dataCount++;
+                if (row == null) {
+                    continue;
+                }
+                if (ExcelUtil.isRowEmpty(row)) {
+                    continue;
+                }
+                if (row.getCell(0) == null) {
+                    msg.setError("第"+dataCount+"行缺少中心名称");
+                    return msg;
+                }
+                if(nameList.contains(row.getCell(0).toString())){
+                    msg.setError("当前导入数据存在重复中心名称["+row.getCell(1).toString()+"]");
+                    return msg;
+                }
+                nameList.add(row.getCell(0).toString());
+                ReportExtraDegree reportExtraDegree=new ReportExtraDegree();
+                List<ReportExtraDegree> collect = allReportExtraDegree.stream().filter(ap -> ap.getName().equals(row.getCell(0).toString())).collect(Collectors.toList());
+                reportExtraDegree.setName(row.getCell(0).toString());
+                reportExtraDegree.setCompanyId(companyId);
+                if(collect.size()>0){
+                    Integer id=collect.get(0).getId();
+                    reportExtraDegree.setId(id);
+                    reportExtraDegreeMapper.updateById(reportExtraDegree);
+                }else{
+                    reportExtraDegreeMapper.insert(reportExtraDegree);
+                }
+            }
+            msg.data=dataCount;
+            return msg;
+        } catch (IOException e){
+            e.printStackTrace();
+            msg.setError("文件处理出错");
+            return msg;
+        } catch (InvalidFormatException e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
 }

+ 17 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/UserServiceImpl.java

@@ -257,6 +257,22 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
             deptModule.setId(0);
             moduleList.add(2,deptModule);
         }
+        //开启了自定义日报列表的情况下,需要菜单上有
+        if (timeType.getCustomDegreeActive() == 1 && moduleList.stream().anyMatch(mod->mod.getName().equals("系统基础设置"))) {
+            SysModule centerManageModule = new SysModule();
+            centerManageModule.setName(timeType.getCustomDegreeName()+"管理");
+            centerManageModule.setPath("/centerManage");
+            centerManageModule.setId(0);
+            //加到组织架构前面
+            int findIndex = 0;
+            for (int i=0;i<moduleList.size(); i++) {
+                if (moduleList.get(i).getName().equals("组织架构") || moduleList.get(i).getName().equals("基础数据管理")) {
+                    findIndex = i;
+                    break;
+                }
+            }
+            moduleList.add(findIndex,centerManageModule);
+        }
         //组装层级关系,默认只有两级
         List<SysModule> menuList = new ArrayList<>();
         for (SysModule module : moduleList) {
@@ -268,6 +284,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
             List<SysModule> list = moduleList.stream().filter(mod -> mainMenu.getId().equals(mod.getParentId())).collect(Collectors.toList());
             mainMenu.setChildren(list);
         }
+
         user.setModuleList(menuList);
         //此处返回权限集合
         List<Integer> functionIdList = new ArrayList<>();

+ 65 - 0
fhKeeper/formulahousekeeper/timesheet/src/views/centerManage/centerManage.vue

@@ -4,6 +4,7 @@
             <el-form :inline="true">
                 <el-form-item label="研究中心管理">
                 </el-form-item>
+                <el-link type="primary" :underline="false" @click="intoCenterRatio" class="tanjia">批量导入研究中心</el-link>
                 <el-link icon="el-icon-circle-plus-outline" type="primary" :underline="false" class="tanjia" @click="addNewSubProject()">添加研究中心</el-link>
             </el-form>
         </el-col>
@@ -32,6 +33,27 @@
                 <el-button type="primary" @click="submitInsertSubProject" :loading="addLoading">提交</el-button>
             </div>
         </el-dialog>
+        <!-- 导入结果说明 -->
+        <el-dialog title="分摊比例导入结果" v-if="showImportResult" :visible.sync="showImportResult" customClass="customWidth" width="500px">
+            <div>
+                <span>{{importResultMsg}}</span>
+                
+            </div>
+            <span slot="footer" class="dialog-footer">
+                <el-button type="primary" @click="showImportResult=false">确定</el-button>
+            </span>
+        </el-dialog>
+        <el-dialog title="导入研究中心数据" v-if="intoCenterDialog" :visible.sync="intoCenterDialog" customClass="customWidth" width="500px">
+            <p>1. 下载
+            <el-link type="primary" style="margin-left:5px;" :underline="false" href="./upload/研究中心导入模板.xlsx" download="研究中心导入模板.xlsx">研究中心导入模板.xlsx</el-link>
+            </p>
+            <!-- <p>2. 填写excel模板,请确保模板中的项目和人员已添加到系统中。</p> -->
+            <p style="display: flex;justify-content: center;padding:1em 0">
+                <el-upload ref="upload"  action="#" :limit="1" :http-request="batchImportData" :show-file-list="false">
+                <el-button type="primary" :underline="false" :loading="importingData">开始导入</el-button>
+            </el-upload>
+            </p>
+        </el-dialog>
     </section>
 </template>
 <script>
@@ -48,9 +70,52 @@
                     name: [{ required: true, message: "请输入名称", trigger: "blur" }],
                 },
                 heightDoms: document.documentElement.clientHeight - 140,
+                intoCenterDialog:false,
+                importingData: false,
+                importResultMsg:null,
+                showImportResult:false,
             };
         },
         methods: {
+             intoCenterRatio(){
+                this.intoCenterDialog=true;
+            },
+            batchImportData(item) {
+                //首先判断文件类型
+                let str = item.file.name.split(".");
+                let format = str[str.length - 1];
+                if (format != "xls" && format != "xlsx") {
+                    this.$message({
+                        message: "请选择.xls或.xlsx文件",
+                        type: "error"
+                    });
+                } else {
+                    this.importingData = true;
+                    let formData = new FormData();
+                    formData.append("file", item.file);  
+                    this.http.uploadFile('/report-extra-degree/importData', formData,
+                    res => {
+                        this.$refs.upload.clearFiles();
+                        this.importingData = false;
+                        this.showImportResult = true;
+                        if (res.code == "ok") {
+                            //换成弹出框,以免有人等了半天回来啥也没看到
+                            this.importResultMsg = "成功导入/更新"+res.data+"条客户数据。"+(res.msg?res.msg:"");
+                            this.getSub();
+                        } else {
+                            this.importResultMsg = "导入失败:"+res.msg;
+                        }
+                    },
+                    error => {
+                        this.$refs.upload.clearFiles();
+                        this.importingData = false;
+                        this.$message({
+                            message: error,
+                            type: "error"
+                        });
+                    });
+                }
+            },
             getSub() {
                 this.listLoading = true;
                 this.http.post('/report-extra-degree/getAll ',{},

+ 66 - 1
fhKeeper/formulahousekeeper/timesheet/src/views/customer/list.vue

@@ -15,6 +15,7 @@
                 </el-form-item>
                 <el-form-item style="float:right;">
                     <el-link type="primary" :underline="false" @click="handleAdd(-1,null)">新增客户</el-link>
+                    <el-link type="primary" :underline="false" @click="intocustomerRatio">批量导入客户</el-link>
                 </el-form-item>
             </el-form>
         </el-col>
@@ -87,6 +88,27 @@
                 <el-button type="primary" @click="submitInsert" :loading="addLoading">提交</el-button>
             </div>
         </el-dialog>
+         <!-- 导入结果说明 -->
+        <el-dialog title="分摊比例导入结果" v-if="showImportResult" :visible.sync="showImportResult" customClass="customWidth" width="500px">
+            <div>
+                <span>{{importResultMsg}}</span>
+                
+            </div>
+            <span slot="footer" class="dialog-footer">
+                <el-button type="primary" @click="showImportResult=false">确定</el-button>
+            </span>
+        </el-dialog>
+         <el-dialog title="导入客户数据" v-if="intocustomerDialog" :visible.sync="intocustomerDialog" customClass="customWidth" width="500px">
+            <p>1. 下载
+            <el-link type="primary" style="margin-left:5px;" :underline="false" href="./upload/新增客户导入模板.xlsx" download="新增客户导入模板.xlsx">新增客户导入模板.xlsx</el-link>
+            </p>
+            <!-- <p>2. 填写excel模板,请确保模板中的项目和人员已添加到系统中。</p> -->
+            <p style="display: flex;justify-content: center;padding:1em 0">
+                <el-upload ref="upload"  action="#" :limit="1" :http-request="batchImportData" :show-file-list="false">
+                <el-button type="primary" :underline="false" :loading="importingData">开始导入</el-button>
+            </el-upload>
+            </p>
+        </el-dialog>
     </section>
 </template>
 <style scoped>
@@ -141,7 +163,11 @@
                 },
                 rules: {
                     customerName: [{ required: true, message: "请输入客户名称", trigger: "blur" }],
-                }
+                },
+                intocustomerDialog:false,
+                importingData: false,
+                importResultMsg:null,
+                showImportResult:false,
             };
         },
         // 过滤器
@@ -166,6 +192,45 @@
             }
         },
         methods: {
+            intocustomerRatio(){
+                this.intocustomerDialog=true;
+            },
+            batchImportData(item) {
+                //首先判断文件类型
+                let str = item.file.name.split(".");
+                let format = str[str.length - 1];
+                if (format != "xls" && format != "xlsx") {
+                    this.$message({
+                        message: "请选择.xls或.xlsx文件",
+                        type: "error"
+                    });
+                } else {
+                    this.importingData = true;
+                    let formData = new FormData();
+                    formData.append("file", item.file);
+                    this.http.uploadFile('/customer-info/importData', formData,
+                    res => {
+                        this.$refs.upload.clearFiles();
+                        this.importingData = false;
+                        this.showImportResult = true;
+                        if (res.code == "ok") {
+                            //换成弹出框,以免有人等了半天回来啥也没看到
+                            this.importResultMsg = "成功导入/更新"+res.data+"条客户数据。"+(res.msg?res.msg:"");
+                            this.getList();
+                        } else {
+                            this.importResultMsg = "导入失败:"+res.msg;
+                        }
+                    },
+                    error => {
+                        this.$refs.upload.clearFiles();
+                        this.importingData = false;
+                        this.$message({
+                            message: error,
+                            type: "error"
+                        });
+                    });
+                }
+            },
             importProject(item) {
                 //首先判断文件类型
                 let str = item.file.name.split(".");

+ 9 - 5
fhKeeper/formulahousekeeper/timesheet/src/views/project/list.vue

@@ -153,7 +153,7 @@
                     {{scope.row.progress==null?"-":scope.row.progress}}%
                 </template>
             </el-table-column>
-            <el-table-column label="操作" width="350" align="left">
+            <el-table-column label="操作" width="350" align="left" fixed="right">
                 <template slot-scope="scope">
                     <el-button v-if="permissions.projectManagement || user.id==scope.row.creatorId" size="mini"  @click="subProject(scope.row)">子项目</el-button>
                     <el-button size="mini" v-if="permissions.projectManagement || user.id==scope.row.inchargerId || user.id==scope.row.creatorId" type="primary" @click="handleAdd(scope.$index, scope.row)">编辑</el-button>
@@ -186,7 +186,7 @@
                 @size-change="handleSizeChange"
                 @current-change="handleCurrentChange"
                 :page-sizes="[20 , 50 , 80 , 100]"
-                :page-size="20"
+                :page-size="size"
                 layout="total, sizes, prev, pager, next"
                 :total="total"
                 style="float:right;"
@@ -691,6 +691,7 @@ a {
                     children: 'children',
                     label: 'label'
                 },
+
                 filterName:null,
                 chooseParticipVisible: false,
                 projectBaseCostData:[],
@@ -698,7 +699,7 @@ a {
                 showBaseConfig:false,
                 customerList:[],
                 roleArray:["普通员工","超级管理员", "系统管理员", "公司高层","财务管理员", "项目管理员"],
-                status:null,
+                status:"1",
                 statusTxt:["-","进行中","已完成","已撤销"],
                 importanceList:[{id:1,label:'正常'},{id:2,label:'紧急'},{id:3,label:'重要'},{id:4,label:'重要且紧急'}],
                 searchField:'1',
@@ -714,7 +715,7 @@ a {
                 listLoading: false,
                 total: 0,
                 page: 1,
-                size: 20,
+                size: localStorage.getItem("projectPageSize")==null?20:parseInt(localStorage.getItem("projectPageSize")),
                 list: [],
                 subProjectVisible: false,
                 subProjectList: [],//子项目列表
@@ -1933,6 +1934,7 @@ a {
 
             handleSizeChange(val) {
                 this.size = val;
+                localStorage.projectPageSize = this.size;
                 this.getList();
             },
 
@@ -1965,7 +1967,9 @@ a {
                         }
                         this.list = list;
                         this.total = res.data.total;
-                        console.log("列表",res.data);
+                        this.$nextTick(()=>{
+                            this.$refs.projectlistOfWudulist.doLayout();
+                        })
                     } else {
                         this.$message({
                         message: res.msg,