Browse Source

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

ggooalice 2 years ago
parent
commit
8c7b4434f0

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

@@ -56,7 +56,7 @@ public class CompanyDingdingController {
         item.setKey("测试");
         item.setValue("试试成功没");
         form.add(item);
-        companyDingdingService.sendOAMsg(companyDingding, "040534176023851922", "OA提醒测试","这是一次测试",form);
+        companyDingdingService.sendOAMsg(companyDingding, "040534176023851922", "OA提醒测试","这是一次测试",form,null);
         return new HttpRespMsg();
     }
 }

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

@@ -1,7 +1,6 @@
 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.entity.vo.SysRichFunction;
@@ -10,9 +9,9 @@ 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;
-
 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;
@@ -89,6 +88,9 @@ public class ExpenseSheetController {
         return expenseSheetService.deny(id);
 
     }
-
+    @RequestMapping("/importData")
+    public HttpRespMsg importData(HttpServletRequest request,MultipartFile[] files){
+        return expenseSheetService.importData(request,files);
+    }
 }
 

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

@@ -31,7 +31,7 @@ public interface CompanyDingdingService extends IService<CompanyDingding> {
 
     public void sendFinishMileStoneMsg(CompanyDingding dingding, String useridList, String taskName, Integer projectId, String project, String finishDate);
 
-    public void sendOAMsg(CompanyDingding dingding, String useridList,String titleText,String content, List<OapiMessageCorpconversationAsyncsendV2Request.Form> form);
+    public void sendOAMsg(CompanyDingding dingding, String useridList,String titleText,String content, List<OapiMessageCorpconversationAsyncsendV2Request.Form> form,Integer projectId);
 
     public void sendInnerLinkMsg(CompanyDingding dingding, String useridList, String title, String alertMsg);
 }

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

@@ -1,9 +1,11 @@
 package com.management.platform.service;
 
-import com.management.platform.entity.ExpenseSheet;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.management.platform.entity.ExpenseSheet;
 import com.management.platform.util.HttpRespMsg;
-import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletRequest;
 
 /**
  * <p>
@@ -28,4 +30,6 @@ public interface ExpenseSheetService extends IService<ExpenseSheet> {
     HttpRespMsg approve(Integer id);
 
     HttpRespMsg deny(Integer id);
+
+    HttpRespMsg importData(HttpServletRequest request, MultipartFile[] files);
 }

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

@@ -79,7 +79,7 @@ public class CompanyDingdingServiceImpl extends ServiceImpl<CompanyDingdingMappe
             item.setKey("说明:");
             item.setValue(msg);
             form.add(item);
-            sendOAMsg(dingding,useridList,"日报漏填提醒","您有日报漏填,请及时填报",form);
+            sendOAMsg(dingding,useridList,"日报漏填提醒","您有日报漏填,请及时填报",form,null);
         } else {
             DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/message/corpconversation/sendbytemplate");
             OapiMessageCorpconversationSendbytemplateRequest req = new OapiMessageCorpconversationSendbytemplateRequest();
@@ -126,7 +126,7 @@ public class CompanyDingdingServiceImpl extends ServiceImpl<CompanyDingdingMappe
             item3.setKey("审批人:");
             item3.setValue(auditorName);
             form.add(item3);
-            sendOAMsg(dingding,useridList,"日报驳回提醒","您的日报被驳回,请及时查看",form);
+            sendOAMsg(dingding,useridList,"日报驳回提醒","您的日报被驳回,请及时查看",form,null);
         } else {
             DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/message/corpconversation/sendbytemplate");
             OapiMessageCorpconversationSendbytemplateRequest req = new OapiMessageCorpconversationSendbytemplateRequest();
@@ -162,7 +162,7 @@ public class CompanyDingdingServiceImpl extends ServiceImpl<CompanyDingdingMappe
             item.setKey("说明:");
             item.setValue(msg);
             form.add(item);
-            sendOAMsg(dingding,useridList,"请假提交审批提醒","您的请假还未提交审批,请及时提交",form);
+            sendOAMsg(dingding,useridList,"请假提交审批提醒","您的请假还未提交审批,请及时提交",form,null);
         } else {
             DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/message/corpconversation/sendbytemplate");
             OapiMessageCorpconversationSendbytemplateRequest req = new OapiMessageCorpconversationSendbytemplateRequest();
@@ -199,7 +199,7 @@ public class CompanyDingdingServiceImpl extends ServiceImpl<CompanyDingdingMappe
             item.setKey("待审核数量:");
             item.setValue(String.valueOf(auditNum));
             form.add(item);
-            sendOAMsg(dingding,useridList,"您还有日报暂未审核","请及时审核",form);
+            sendOAMsg(dingding,useridList,"您还有日报暂未审核","请及时审核",form,null);
         } else {
             DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/message/corpconversation/sendbytemplate");
             OapiMessageCorpconversationSendbytemplateRequest req = new OapiMessageCorpconversationSendbytemplateRequest();
@@ -261,7 +261,7 @@ public class CompanyDingdingServiceImpl extends ServiceImpl<CompanyDingdingMappe
             item1.setKey("截至日期:");
             item1.setValue(endDate);
             form.add(item1);
-            sendOAMsg(dingding,ddUserid,"新任务提醒","您有一条新的任务待执行,请关注",form);
+            sendOAMsg(dingding,ddUserid,"新任务提醒","您有一条新的任务待执行,请关注",form,null);
         } else {
             //异步发送
             new Thread() {
@@ -308,7 +308,7 @@ public class CompanyDingdingServiceImpl extends ServiceImpl<CompanyDingdingMappe
             item2.setKey("完成时间:");
             item2.setValue(finishDate);
             form.add(item2);
-            sendOAMsg(dingding,useridList,"里程碑完成提醒","我们刚刚完成了以下里程碑,感谢大家的努力!",form);
+            sendOAMsg(dingding,useridList,"里程碑完成提醒","我们刚刚完成了以下里程碑,感谢大家的努力!",form,projectId);
         } else {
             DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/message/corpconversation/sendbytemplate");
             OapiMessageCorpconversationSendbytemplateRequest req = new OapiMessageCorpconversationSendbytemplateRequest();
@@ -337,7 +337,7 @@ public class CompanyDingdingServiceImpl extends ServiceImpl<CompanyDingdingMappe
 
 
     @Override
-    public void sendOAMsg(CompanyDingding dingding, String useridList,String titleText,String content,List<OapiMessageCorpconversationAsyncsendV2Request.Form> from) {
+    public void sendOAMsg(CompanyDingding dingding, String useridList,String titleText,String content,List<OapiMessageCorpconversationAsyncsendV2Request.Form> form,Integer projectId) {
         DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/message/corpconversation/asyncsend_v2");
         OapiMessageCorpconversationAsyncsendV2Request request = new OapiMessageCorpconversationAsyncsendV2Request();
         request.setAgentId(dingding.getAgentId());
@@ -378,10 +378,15 @@ public class CompanyDingdingServiceImpl extends ServiceImpl<CompanyDingdingMappe
         msg.getOa().getHead().setText(titleText);
         msg.getOa().setBody(new OapiMessageCorpconversationAsyncsendV2Request.Body());
         msg.getOa().getBody().setContent(content);
-        msg.getOa().getBody().setForm(from);
+        msg.getOa().getBody().setForm(form);
         msg.setMsgtype("oa");
-        msg.getOa().setMessageUrl("dingtalk://dingtalkclient/action/openapp?corpid="+dingding.getCorpid()
-                +"&container_type=work_platform&app_id=0_"+dingding.getAgentId()+"&redirect_type=jump&redirect_url="+ URLEncoder.encode(dingding.getWebUrl()+"?corpid="+dingding.getCorpid()));
+        if(form.get(0).getKey().equals("里程碑")){
+            msg.getOa().setMessageUrl("dingtalk://dingtalkclient/action/openapp?corpid="+dingding.getCorpid()
+                    +"&container_type=work_platform&app_id=0_"+dingding.getAgentId()+"&redirect_type=jump&redirect_url="+ URLEncoder.encode(dingding.getWebUrl()+"?corpid="+dingding.getCorpid())+"&jumpto=/info/"+projectId);
+        }else {
+            msg.getOa().setMessageUrl("dingtalk://dingtalkclient/action/openapp?corpid="+dingding.getCorpid()
+                    +"&container_type=work_platform&app_id=0_"+dingding.getAgentId()+"&redirect_type=jump&redirect_url="+ URLEncoder.encode(dingding.getWebUrl()+"?corpid="+dingding.getCorpid()));
+        }
         request.setMsg(msg);
 
 //        msg.setActionCard(new OapiMessageCorpconversationAsyncsendV2Request.ActionCard());

+ 213 - 8
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ExpenseSheetServiceImpl.java

@@ -5,30 +5,40 @@ import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.management.platform.entity.ExpenseItem;
 import com.management.platform.entity.ExpenseSheet;
 import com.management.platform.entity.Project;
 import com.management.platform.entity.User;
 import com.management.platform.mapper.ExpenseItemMapper;
 import com.management.platform.mapper.ExpenseSheetMapper;
+import com.management.platform.mapper.ProjectMapper;
 import com.management.platform.mapper.UserMapper;
 import com.management.platform.service.ExpenseItemService;
 import com.management.platform.service.ExpenseSheetService;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.management.platform.util.ExcelUtil;
 import com.management.platform.util.HttpRespMsg;
+import org.apache.poi.EncryptedDocumentException;
+import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
+import org.apache.poi.ss.usermodel.CellType;
+import org.apache.poi.xssf.usermodel.XSSFCell;
+import org.apache.poi.xssf.usermodel.XSSFRow;
+import org.apache.poi.xssf.usermodel.XSSFSheet;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.StringUtils;
-import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.multipart.MultipartFile;
 
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
+import java.io.*;
+import java.math.BigDecimal;
+import java.time.Instant;
 import java.time.LocalDate;
+import java.time.ZoneId;
 import java.time.format.DateTimeFormatter;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 /**
  * <p>
@@ -49,8 +59,8 @@ public class ExpenseSheetServiceImpl extends ServiceImpl<ExpenseSheetMapper, Exp
     private ExpenseItemService expenseItemService;
     @Resource
     private ExpenseItemMapper expenseItemMapper;
-
-
+    @Resource
+    private ProjectMapper projectMapper;
     @Override
     public HttpRespMsg add(ExpenseSheet sheet, String items, String userId) {
         HttpRespMsg msg = new HttpRespMsg();
@@ -184,4 +194,199 @@ public class ExpenseSheetServiceImpl extends ServiceImpl<ExpenseSheetMapper, Exp
         expenseSheetMapper.updateById(sheet);
         return new HttpRespMsg();
     }
+
+    @Override
+    public HttpRespMsg importData(HttpServletRequest request,MultipartFile[] files) {
+        HttpRespMsg msg = new HttpRespMsg();
+        User user = userMapper.selectById(request.getHeader("token"));
+        //然后处理文件
+//        List<MultipartFile> multipartFiles = JSONArray.parseArray(files, MultipartFile.class);
+        for (MultipartFile multipartFile : files) {
+            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();
+                //然后解析表格
+                XSSFWorkbook workbook = new XSSFWorkbook(file);
+                //我们只需要第一个sheet
+                XSSFSheet sheet = workbook.getSheetAt(0);
+                //获取全部人员
+                List<User> userList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", user.getCompanyId()));
+                List<Project> projectList = projectMapper.selectList(new QueryWrapper<Project>().eq("company_id", user.getCompanyId()));
+                System.out.println(projectList);
+                //由于第一行需要指明报销人列对应的标题
+                XSSFRow firstRow = sheet.getRow(2);
+                if (firstRow == null) {
+                    msg.setError("错误数据,导入失败");
+                    return msg;
+                }
+                //报销人 填报日期 费用类型 备注
+                XSSFCell reimburserCell = firstRow.getCell(0);
+                XSSFCell reportDateCell = firstRow.getCell(1);
+                XSSFCell expenseTypeCell = firstRow.getCell(2);
+                XSSFCell remarksCell = firstRow.getCell(3);
+
+                if (reimburserCell != null) reimburserCell.setCellType(CellType.STRING);
+                if (reportDateCell != null) reportDateCell.setCellType(CellType.NUMERIC);
+                if (expenseTypeCell != null) expenseTypeCell.setCellType(CellType.STRING);
+                if (remarksCell != null) remarksCell.setCellType(CellType.STRING);
+                if (reimburserCell == null) {//报销人为空的直接跳过
+                    throw new Exception("报销人名称不能为空");
+                }
+                if (expenseTypeCell == null) {
+                    throw new Exception("费用类型不能为空");
+                }
+                ExpenseSheet expenseSheet = new ExpenseSheet();
+                //处理编号
+                DateTimeFormatter yyyyMMdd = DateTimeFormatter.ofPattern("yyyyMMdd");
+                String format = yyyyMMdd.format(LocalDate.now());
+                List<ExpenseSheet> list = expenseSheetMapper.selectList(new QueryWrapper<ExpenseSheet>()
+                        .eq("company_id", user.getCompanyId())
+                        .like("code", format).orderByDesc("id").last("limit 1"));
+                int start = 1;
+                if (list.size() > 0) {
+                    String code = list.get(0).getCode();
+                    code = code.substring(format.length(), code.length());
+                    System.out.println("code=====" + code);
+                    if (code.length() > 0) {
+                        start = Integer.parseInt(code) + 1;
+                    }
+                }
+                expenseSheet.setCode(format + start);
+                expenseSheet.setCompanyId(user.getCompanyId());
+                LocalDate localDate = Instant.ofEpochMilli(reportDateCell.getDateCellValue().getTime())
+                        .atZone(ZoneId.systemDefault()).toLocalDate();
+                expenseSheet.setCreateDate(localDate);
+                Optional<User> first = userList.stream().filter(us -> us.getName().equals(reimburserCell.getStringCellValue())).findFirst();
+                if (first.isPresent()) {
+                    expenseSheet.setOwnerId(first.get().getId());
+                    expenseSheet.setOwnerName(first.get().getName());
+                } else {
+                    throw new Exception("报销人[" +reimburserCell+"]不存在");
+                }
+                expenseSheet.setOperatorId(user.getId());
+                expenseSheet.setRemark(remarksCell.getStringCellValue());
+                switch (expenseTypeCell.getStringCellValue()) {
+                    case "一般":
+                        expenseSheet.setType(0);
+                        break;
+                    case "差旅":
+                        expenseSheet.setType(1);
+                        break;
+                    case "外包":
+                        expenseSheet.setType(2);
+                        break;
+                }
+                expenseSheetMapper.insert(expenseSheet);
+                //前提需要指定第一二行为报销人数据 从第三行数据开始处理 报销单据详情
+                int rowNum = sheet.getLastRowNum();
+                //计算总费用
+                BigDecimal bigDecimal = new BigDecimal(0);
+                List<ExpenseItem> expenseItemList = new ArrayList<>();
+                for (int rowIndex = 5; rowIndex <= rowNum; rowIndex++) {
+                    XSSFRow row = sheet.getRow(rowIndex);
+                    if (row == null) {
+                        continue;
+                    }
+                    //跳过空行
+                    if (ExcelUtil.isRowEmpty(row)) {
+                        continue;
+                    }
+                    //项目编号 费用日期 发拍种类 费用类型 费用金额 发票号 税率 税额 备注
+                    XSSFCell codeCell = row.getCell(0);
+                    XSSFCell happenDateCell = row.getCell(1);
+                    XSSFCell invoiceTypeCell = row.getCell(2);
+                    XSSFCell subExpenseTypeCell = row.getCell(3);
+                    XSSFCell amountCell = row.getCell(4);
+                    XSSFCell invoiceNoCell = row.getCell(5);
+                    XSSFCell taxPercentCell = row.getCell(6);
+                    XSSFCell remarkCell = row.getCell(7);
+
+                    if (codeCell != null) codeCell.setCellType(CellType.STRING);
+                    if (happenDateCell != null) happenDateCell.setCellType(CellType.NUMERIC);
+                    if (invoiceTypeCell != null) invoiceTypeCell.setCellType(CellType.STRING);
+                    if (subExpenseTypeCell != null) subExpenseTypeCell.setCellType(CellType.STRING);
+                    if (amountCell != null) amountCell.setCellType(CellType.NUMERIC);
+                    if (invoiceNoCell != null) invoiceNoCell.setCellType(CellType.STRING);
+                    if (taxPercentCell != null) taxPercentCell.setCellType(CellType.NUMERIC);
+                    if (remarkCell != null) remarkCell.setCellType(CellType.STRING);
+                    ExpenseItem expenseItem = new ExpenseItem();
+                    Optional<Project> project = projectList.stream().filter(pro ->(StringUtils.isEmpty(pro.getProjectCode())?"":pro.getProjectCode()).equals(codeCell.getStringCellValue())
+                            || (StringUtils.isEmpty(pro.getProjectName())?"":pro.getProjectName()).equals(codeCell.getStringCellValue())).findFirst();
+                    if (project.isPresent()) {
+                        expenseItem.setProjectId(project.get().getId());
+                    } else {
+                        throw new Exception("项目编号为[" + codeCell.getStringCellValue() + "]的项目不存在");
+                    }
+                    expenseItem.setExpenseId(expenseSheet.getId());
+                    LocalDate happenDate = Instant.ofEpochMilli(happenDateCell.getDateCellValue().getTime())
+                            .atZone(ZoneId.systemDefault()).toLocalDate();
+                    expenseItem.setHappenDate(String.valueOf(happenDate));
+                    switch (invoiceTypeCell.getStringCellValue()) {
+                        case "增值税专用发票":
+                            expenseItem.setInvoiceType(0);
+                            break;
+                        case "增值税普通发票":
+                            expenseItem.setInvoiceType(1);
+                            break;
+                    }
+                    expenseItem.setInvoiceNo(invoiceNoCell.getStringCellValue());
+                    expenseItem.setAmount(amountCell.getNumericCellValue());
+                    expenseItem.setRemark(remarkCell.getStringCellValue());
+                    //计算税额
+                    BigDecimal bd = new BigDecimal(amountCell.getNumericCellValue());
+                    //原始金额
+                    BigDecimal divide = bd.divide(BigDecimal.valueOf((1 + taxPercentCell.getNumericCellValue())),2,BigDecimal.ROUND_HALF_UP);
+                    BigDecimal subtract = bd.subtract(divide);
+                    expenseItem.setTaxValue(subtract.doubleValue());
+                    bigDecimal.add(BigDecimal.valueOf(amountCell.getNumericCellValue()));
+                    expenseItemList.add(expenseItem);
+                }
+                expenseSheet.setTotalAmount(bigDecimal.doubleValue());
+                expenseSheetMapper.updateById(expenseSheet);
+                expenseItemService.saveBatch(expenseItemList);
+            } catch (IOException e) {
+                e.printStackTrace();
+            } catch (NullPointerException e) {
+                e.printStackTrace();
+                msg.setError("数据格式有误或存在空数据 导入失败");
+                return msg;
+            } catch (InvalidFormatException e) {
+                e.printStackTrace();
+                msg.setError("文件格式错误,如果安装了加密软件需要先解密再上传");
+            } catch (EncryptedDocumentException e) {
+                e.printStackTrace();
+                msg.setError("文件加密状态,需要先解除加密状态再上传");
+                return msg;
+            } catch (Exception e) {
+                e.printStackTrace();
+                msg.setError("上传失败:" + e.getMessage());
+                return msg;
+            } finally {
+                //关闭流
+                try {
+                    if (outputStream != null && inputStream != null) {
+                        outputStream.close();
+                        inputStream.close();
+                        System.out.println("流已关闭");
+                    }
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+//            file.deleteOnExit();//程序退出时删除临时文件
+                System.out.println(file.delete());
+            }
+        }
+        return msg;
+    }
 }