Преглед изворни кода

Merge remote-tracking branch 'origin/master'

# Conflicts:
#	fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/Custom.java
Guo1B0 пре 1 година
родитељ
комит
f600fe8db5
42 измењених фајлова са 1664 додато и 435 уклоњено
  1. 174 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/AttachmentCenterController.java
  2. 39 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/AuditLogCenterController.java
  3. 0 110
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/OrderController.java
  4. 204 13
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/ProductController.java
  5. 186 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/SalesOrderController.java
  6. 88 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/AttachmentCenter.java
  7. 73 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/AuditLogCenter.java
  8. 3 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/BusinessOpportunity.java
  9. 6 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/Product.java
  10. 7 1
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/Order.java
  11. 16 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/mapper/AttachmentCenterMapper.java
  12. 16 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/mapper/AuditLogCenterMapper.java
  13. 16 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/mapper/ProductAuditLogMapper.java
  14. 3 3
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/mapper/OrderMapper.java
  15. 16 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/AttachmentCenterService.java
  16. 16 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/AuditLogCenterService.java
  17. 4 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/ProductService.java
  18. 7 2
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/OrderService.java
  19. 20 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/AttachmentCenterServiceImpl.java
  20. 20 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/AuditLogCenterServiceImpl.java
  21. 0 141
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/OrderServiceImpl.java
  22. 46 2
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/ProductServiceImpl.java
  23. 374 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/SalesOrderServiceImpl.java
  24. 4 14
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/TaskServiceImpl.java
  25. 25 0
      fhKeeper/formulahousekeeper/management-crm/src/main/resources/mapper/AttachmentCenterMapper.xml
  26. 21 0
      fhKeeper/formulahousekeeper/management-crm/src/main/resources/mapper/AuditLogCenterMapper.xml
  27. 2 1
      fhKeeper/formulahousekeeper/management-crm/src/main/resources/mapper/ProductMapper.xml
  28. 2 2
      fhKeeper/formulahousekeeper/management-crm/src/main/resources/mapper/OrderMapper.xml
  29. 153 120
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/FeishuInfoController.java
  30. 4 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/HolidaySettingController.java
  31. 17 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/UserWithBeisenController.java
  32. 1 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/vo/UserMonthWork.java
  33. 1 3
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ExpenseSheetServiceImpl.java
  34. 3 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/FeishuInfoServiceImpl.java
  35. 11 11
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java
  36. 51 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java
  37. 2 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/task/TimingTask.java
  38. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ReportMapper.xml
  39. 7 1
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java
  40. 14 0
      fhKeeper/formulahousekeeper/timesheet/src/views/settings/timetype.vue
  41. 8 0
      fhKeeper/formulahousekeeper/timesheet/src/views/team/index.vue
  42. 3 4
      fhKeeper/formulahousekeeper/timesheet/src/views/workReport/daily.vue

+ 174 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/AttachmentCenterController.java

@@ -0,0 +1,174 @@
+package com.management.platform.controller;
+
+
+import com.management.platform.entity.AttachmentCenter;
+import com.management.platform.entity.User;
+import com.management.platform.mapper.*;
+import com.management.platform.task.SFTPAsyncUploader;
+import com.management.platform.util.DocumentTypeUtil;
+import com.management.platform.util.FileUtil;
+import com.management.platform.util.HttpRespMsg;
+import com.management.platform.util.MessageUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+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;
+import javax.servlet.http.HttpServletResponse;
+import java.io.File;
+import java.io.IOException;
+import java.util.UUID;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2024-04-15
+ */
+@RestController
+@RequestMapping("/attachment")
+public class AttachmentCenterController {
+    @Resource
+    private HttpServletRequest request;
+
+    @Resource
+    private UserMapper userMapper;
+    @Resource
+    private AttachmentCenterMapper attachmentCenterMapper;
+    @Value("${upload.path}")
+    private String uploadPath;
+
+    @Autowired
+    public SFTPAsyncUploader sftpAsyncUploader;
+
+    /**
+     * 上传文件
+     * @param files 上传的文件
+     * @param response
+     * @return
+     * @throws Exception
+     */
+    @RequestMapping(value="uploadAttachment")
+    public HttpRespMsg uploadAttachment(
+            @RequestParam Integer moduleId,
+            @RequestParam String moduleCode,
+            @RequestParam("file") MultipartFile[] files,
+            HttpServletResponse response) throws Exception {
+        HttpRespMsg msg = new HttpRespMsg();
+        User user = (User) userMapper.selectById(request.getHeader("Token"));
+
+        ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3);
+        for (MultipartFile file : files) {
+            AttachmentCenter record = new AttachmentCenter();
+            record.setCreatorId(user.getId());
+            record.setCreatorName(user.getName());
+            record.setAttachmentName(file.getOriginalFilename());
+            record.setModuleId(moduleId);
+            record.setModuleCode(moduleCode);
+            if (file != null && !file.isEmpty()) {
+                //截取文件后缀
+                String fileSuffix = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
+                record.setAttachmentType(DocumentTypeUtil.DocumentType(fileSuffix));
+                //处理文件
+                File dir = new File(uploadPath);
+                if (!dir.exists()) {
+                    dir.mkdir();
+                }
+                String fileName= "";
+                if (file!=null && !file.isEmpty()) {
+                    fileName = file.getOriginalFilename();
+
+                    int pos = fileName.lastIndexOf(".");
+                    String suffix = fileName.substring(pos).toLowerCase();
+                    //用uuid替换原始的文件名
+                    String purFName = UUID.randomUUID().toString().replaceAll("-", "");
+                    fileName = purFName + suffix;
+                    File saveFile = new File(dir, fileName);
+                    try {
+                        saveFile.createNewFile();
+                        file.transferTo(saveFile);
+                        //异步上传到备份服务器
+                        sftpAsyncUploader.uploadFileAsync(saveFile);
+
+                        //计算文件大小
+                        long fileSize = saveFile.length();
+                        String fileLength = FileUtil.getReadableFileSize(fileSize);
+                        record.setServerName(uploadPath + fileName);
+
+                        record.setSize(fileLength);
+                        String pathPrefix = "/upload/";
+                        record.setUrl(pathPrefix + fileName);
+                        attachmentCenterMapper.insert(record);
+                        String path = uploadPath;
+                        //生成原文件名称与服务器文件名称对应
+                        msg.data = record;
+                    } catch (IOException e) {
+                        e.printStackTrace();
+                        fileName = null;
+                        msg.setError(e.getMessage()+", path="+dir.getAbsolutePath());
+                    } catch (Exception e) {
+                        e.printStackTrace();
+                        fileName = null;
+                        msg.setError(e.getMessage()+", path="+dir.getAbsolutePath());
+                    }
+                } else {
+                    msg.setError(MessageUtils.message("file.nonExistentError"));
+                }
+            }
+        }
+        return msg;
+    }
+
+    @RequestMapping("/rename")
+    public HttpRespMsg rename(Integer id,String name){
+        HttpRespMsg msg=new HttpRespMsg();
+        AttachmentCenter attachmentCenter = attachmentCenterMapper.selectById(id);
+        File file = new File(uploadPath+ attachmentCenter.getAttachmentName());
+        if(file.exists()){
+            File newFile = new File(uploadPath + name);
+            boolean b = file.renameTo(newFile);
+            if(b){
+                attachmentCenter.setAttachmentName(name);
+                attachmentCenter.setServerName(uploadPath+name);
+                String pathPrefix = "/upload/";
+                attachmentCenter.setUrl(pathPrefix + name);
+                attachmentCenterMapper.updateById(attachmentCenter);
+                msg.setError("文件重命名成功");
+            }else {
+                msg.setError("文件重命名失败");
+            }
+        }else {
+            msg.setError("文件不存在");
+        }
+        return msg;
+    }
+
+    @RequestMapping("/delete")
+    public HttpRespMsg delete(Integer id){
+        HttpRespMsg msg=new HttpRespMsg();
+        AttachmentCenter attachmentCenter = attachmentCenterMapper.selectById(id);
+        File file = new File(uploadPath+ attachmentCenter.getAttachmentName());
+        if(file.exists()){
+            boolean delete = file.delete();
+            if(delete){
+                attachmentCenterMapper.deleteById(id);
+                msg.setError("文件删除成功");
+            }else {
+                msg.setError("文件删除失败");
+            }
+        }else {
+            msg.setError("文件不存在");
+        }
+        return msg;
+    }
+}
+

+ 39 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/AuditLogCenterController.java

@@ -0,0 +1,39 @@
+package com.management.platform.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.management.platform.entity.AuditLogCenter;
+import com.management.platform.service.AuditLogCenterService;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2024-04-15
+ */
+@RestController
+@RequestMapping("/audit-log-center")
+public class AuditLogCenterController {
+
+    @Resource
+    private AuditLogCenterService auditLogCenterService;
+
+    @RequestMapping("/list")
+    public HttpRespMsg list(String moduleCode,Integer id){
+        HttpRespMsg msg=new HttpRespMsg();
+        List<AuditLogCenter> list = auditLogCenterService.list(new LambdaQueryWrapper<AuditLogCenter>().eq(AuditLogCenter::getModuleCode, moduleCode).eq(AuditLogCenter::getModuleId,id));
+        msg.setData(list);
+        return msg;
+    }
+
+}
+

+ 0 - 110
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/OrderController.java

@@ -1,110 +0,0 @@
-package com.management.platform.controller;
-
-
-import com.alibaba.fastjson.JSONArray;
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.management.platform.entity.Order;
-import com.management.platform.entity.OrderProductDetail;
-import com.management.platform.entity.Product;
-import com.management.platform.entity.Task;
-import com.management.platform.mapper.UserMapper;
-import com.management.platform.service.OrderProductDetailService;
-import com.management.platform.service.OrderService;
-import com.management.platform.service.ProductService;
-import com.management.platform.service.TaskService;
-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;
-import java.util.List;
-
-/**
- * <p>
- *  前端控制器
- * </p>
- *
- * @author Seyason
- * @since 2024-02-28
- */
-@RestController
-@RequestMapping("/order")
-public class OrderController {
-    @Resource
-    private OrderService orderService;
-    @Resource
-    private UserMapper userMapper;
-    @Resource
-    private HttpServletRequest request;
-    @Resource
-    private OrderProductDetailService orderProductDetailService;
-
-    @RequestMapping("/list")
-    public HttpRespMsg list(String userId, String orderName,String orderCode, String productCode, Integer pageIndex, Integer pageSize,Integer isDelete){
-        return orderService.getList(userId,orderName,orderCode,productCode,pageIndex,pageSize,isDelete);
-    }
-
-    @RequestMapping("/addOrUpdate")
-    public HttpRespMsg addOrUpdate(Order order){
-        HttpRespMsg msg=new HttpRespMsg();
-        Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
-        order.setCompanyId(companyId);
-        int count;
-        if(order.getId()==null){
-            count = orderService.count(new LambdaQueryWrapper<Order>().eq(Order::getCompanyId, companyId).eq(Order::getOrderCode, order.getOrderCode()));
-        }else {
-            count = orderService.count(new LambdaQueryWrapper<Order>().eq(Order::getCompanyId, companyId).ne(Order::getId,order.getId()).eq(Order::getOrderCode,order.getOrderCode()));
-        }
-        if(count>0){
-            msg.setError("订单编号为["+order.getOrderCode()+"]的订单已存在");
-            return msg;
-        }
-        if(!orderService.saveOrUpdate(order)){
-            msg.setError("验证失败");
-            return msg;
-        }
-        //处理订单下的产品数据
-        if(!StringUtils.isEmpty(order.getOrderProductDetailString())){
-            String orderProductDetailString = order.getOrderProductDetailString();
-            List<OrderProductDetail> orderProductDetails = JSONArray.parseArray(orderProductDetailString, OrderProductDetail.class);
-            if(orderProductDetails.size()>0){
-                orderProductDetails.forEach(o->{
-                    o.setOrderId(order.getId());
-                });
-                orderProductDetailService.saveOrUpdateBatch(orderProductDetails);
-            }
-        }
-        return msg;
-    }
-
-    @RequestMapping("/delete")
-    public HttpRespMsg delete(Integer id){
-        HttpRespMsg msg=new HttpRespMsg();
-        Order order = orderService.getById(id);
-        order.setIsDelete(1);
-        if(!orderService.updateById(order)){
-            msg.setError("验证失败");
-            return msg;
-        }
-        return msg;
-    }
-
-    @RequestMapping("/recover")
-    public HttpRespMsg recover(Integer id){
-        HttpRespMsg msg=new HttpRespMsg();
-        Order order = orderService.getById(id);
-        order.setIsDelete(0);
-        if(!orderService.updateById(order)){
-            msg.setError("验证失败");
-            return msg;
-        }
-        return msg;
-    }
-
-}
-

+ 204 - 13
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/ProductController.java

@@ -2,16 +2,11 @@ package com.management.platform.controller;
 
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.management.platform.entity.*;
 import com.management.platform.mapper.UserMapper;
-import com.management.platform.service.ProductService;
-import com.management.platform.service.TaskService;
+import com.management.platform.service.*;
+import com.management.platform.util.BeanChangeUtil;
 import com.management.platform.util.HttpRespMsg;
-import com.management.platform.util.MessageUtils;
-import org.apache.poi.hssf.usermodel.*;
-import org.apache.poi.ss.usermodel.*;
-import org.apache.poi.ss.util.CellRangeAddressList;
 import org.springframework.util.StringUtils;
 import org.springframework.web.bind.annotation.RequestMapping;
 
@@ -20,11 +15,10 @@ import org.springframework.web.multipart.MultipartFile;
 
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
-import java.io.File;
-import java.io.FileOutputStream;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
+import java.util.Optional;
 import java.util.stream.Collectors;
 
 /**
@@ -46,6 +40,20 @@ public class ProductController {
     private HttpServletRequest request;
     @Resource
     private TaskService taskService;
+    @Resource
+    private AuditLogCenterService auditLogCenterService;
+    @Resource
+    private BusinessOpportunityService businessOpportunityService;
+    @Resource
+    private BusinessItemProductService businessItemProductService;
+    @Resource
+    private CustomService customService;
+    @Resource
+    private OrderProductDetailService orderProductDetailService;
+    @Resource
+    private SalesOrderService salesOrderService;
+    @Resource
+    private SysDictService sysDictService;
 
     @RequestMapping("/list")
     public HttpRespMsg list(String userId,String productName,String productCode,Integer pageIndex,Integer pageSize){
@@ -70,10 +78,36 @@ public class ProductController {
             msg.setError("产品编码为["+product.getProductCode()+"]的产品已存在");
             return msg;
         }
+        //todo:生成操作记录
+        AuditLogCenter auditLogCenter =new AuditLogCenter();
+        auditLogCenter.setAuditorId(user.getId());
+        auditLogCenter.setAuditorName(user.getName());
+        boolean isNew=true;
+        if(product.getId()==null){
+            auditLogCenter.setAuditorContent("创建了产品");
+        }else {
+            Product oldProduct = productService.getById(product.getId());
+            BeanChangeUtil<Product> beanChangeUtil = new BeanChangeUtil();
+            String content = beanChangeUtil.contrastObj(oldProduct, product);
+            //发生变化才生成记录
+            if(!StringUtils.isEmpty(content.trim())){
+                isNew=false;
+                auditLogCenter.setModuleId(product.getId());
+                auditLogCenter.setModuleCode("Product");
+                auditLogCenter.setAuditorContent("编辑了产品");
+                auditLogCenterService.save(auditLogCenter);
+            }
+
+        }
         if(!productService.saveOrUpdate(product)){
             msg.setError("验证失败");
             return msg;
         }
+        if(isNew){
+            auditLogCenter.setModuleId(product.getId());
+            auditLogCenter.setModuleCode("Product");
+            auditLogCenterService.save(auditLogCenter);
+        }
         return msg;
     }
 
@@ -81,17 +115,41 @@ public class ProductController {
     @RequestMapping("/delete")
     public HttpRespMsg delete(String ids){
         HttpRespMsg msg=new HttpRespMsg();
+        User user = userMapper.selectById(request.getHeader("token"));
         if(!StringUtils.isEmpty(ids)){
             String[] split = ids.split(",");
-            List<String> idList = Arrays.asList(split);
+            List<String> splitList = Arrays.asList(split);
+            List<Integer> idList = splitList.stream().map(i -> Integer.valueOf(i)).collect(Collectors.toList());
             int count = taskService.count(new LambdaQueryWrapper<Task>().in(Task::getProductId, idList));
             if(count>0){
                 msg.setError("当前产品已绑定到相关任务,删除失败");
                 return msg;
             }
-            if(!productService.removeByIds(idList)){
-                msg.setError("验证失败");
-                return msg;
+            if(idList.size()>0){
+                List<Product> productList = productService.list(new LambdaQueryWrapper<Product>().in(Product::getId, idList));
+                productList.forEach(p->{
+                    p.setIsDelete(1);
+                });
+                if(!productService.updateBatchById(productList)){
+                    msg.setError("验证失败");
+                    return msg;
+                }
+            }
+            List<AuditLogCenter> auditLogCenters =new ArrayList<>();
+            if(idList.size()>0){
+                idList.forEach(i->{
+                    //todo: 生成操作记录
+                    AuditLogCenter auditLogCenter =new AuditLogCenter();
+                    auditLogCenter.setAuditorContent("删除了产品");
+                    auditLogCenter.setAuditorId(user.getId());
+                    auditLogCenter.setAuditorName(user.getName());
+                    auditLogCenter.setModuleId(Integer.valueOf(i));
+                    auditLogCenter.setModuleCode("Product");
+                    auditLogCenters.add(auditLogCenter);
+                });
+            }
+            if(auditLogCenters.size()>0){
+                auditLogCenterService.saveBatch(auditLogCenters);
             }
         }
         return msg;
@@ -107,5 +165,138 @@ public class ProductController {
         return productService.exportData(userId,productName,productCode);
     }
 
+    @RequestMapping("/detail")
+    public HttpRespMsg detail(Integer id){
+        return productService.getDetail(id);
+    }
+
+    @RequestMapping("/transferIncharger")
+    public HttpRespMsg transferIncharger(Integer id,String userId){
+        HttpRespMsg msg=new HttpRespMsg();
+        User user = userMapper.selectById(request.getHeader("token"));
+        Product byId = productService.getById(id);
+        if(!StringUtils.isEmpty(userId)){
+            byId.setInchargerId(userId);
+        }
+        if(!productService.updateById(byId)){
+            msg.setError("验证失败");
+        }
+        //todo:生成操作记录
+        AuditLogCenter auditLogCenter =new AuditLogCenter();
+        if(!StringUtils.isEmpty(byId.getInchargerId())){
+            if(!byId.getInchargerId().equals(userId)){
+                auditLogCenter.setModuleId(byId.getId())
+                        .setModuleCode("Product")
+                        .setAuditorId(user.getId())
+                        .setAuditorName(user.getName())
+                        .setAuditorContent("转移了产品");
+                auditLogCenterService.save(auditLogCenter);
+            }
+        }
+        return msg;
+    }
+
+    @RequestMapping("/businessListWithProduct")
+    public HttpRespMsg businessListWithProduct(Integer id){
+        HttpRespMsg msg=new HttpRespMsg();
+        Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
+        List<BusinessItemProduct> businessItemProducts = businessItemProductService.list(new LambdaQueryWrapper<BusinessItemProduct>().eq(BusinessItemProduct::getProductId, id));
+        List<Integer> businessIds = businessItemProducts.stream().map(BusinessItemProduct::getBusinessId).distinct().collect(Collectors.toList());
+        businessIds.add(-1);
+        List<BusinessOpportunity> opportunityList = businessOpportunityService.list(new LambdaQueryWrapper<BusinessOpportunity>().in(BusinessOpportunity::getId, businessIds));
+        List<Custom> customList = customService.list(new LambdaQueryWrapper<Custom>().eq(Custom::getCompanyId, companyId));
+        List<User> userList = userMapper.selectList(new LambdaQueryWrapper<User>().eq(User::getCompanyId, companyId));
+        List<SysDict> businessStageList = sysDictService.list(new LambdaQueryWrapper<SysDict>().eq(SysDict::getCode, "BusinessStage"));
+        opportunityList.forEach(c->{
+            Optional<Custom> custom = customList.stream().filter(ct -> ct.getId().equals(c.getCustomerId())).findFirst();
+            if(custom.isPresent()){
+                c.setCustomerName(custom.get().getCustomName());
+            }
+            Optional<User> user = userList.stream().filter(u -> u.getId().equals(c.getCreatorId())).findFirst();
+            if(user.isPresent()){
+                c.setCreatorName(user.get().getName());
+            }
+            Optional<User> incharger = userList.stream().filter(u -> u.getId().equals(c.getInchargerId())).findFirst();
+            if(incharger.isPresent()){
+                c.setInchargerName(incharger.get().getName());
+            }
+            Optional<SysDict> businessStage = businessStageList.stream().filter(b -> b.getId().equals(c.getStageId())).findFirst();
+            if(businessStage.isPresent()){
+                c.setStageValue(businessStage.get().getName());
+            }
+        });
+        msg.setData(opportunityList);
+        return msg;
+    }
+
+    @RequestMapping("/orderWithProduct")
+    public HttpRespMsg orderWithProduct(Integer id){
+        HttpRespMsg msg=new HttpRespMsg();
+        Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
+        List<OrderProductDetail> productDetailList = orderProductDetailService.list(new LambdaQueryWrapper<OrderProductDetail>().eq(OrderProductDetail::getProductId, id));
+        List<Integer> orderIds = productDetailList.stream().map(OrderProductDetail::getOrderId).distinct().collect(Collectors.toList());
+        List<Custom> customList = customService.list(new LambdaQueryWrapper<Custom>().eq(Custom::getCompanyId, companyId));
+        List<User> userList = userMapper.selectList(new LambdaQueryWrapper<User>().eq(User::getCompanyId, companyId));
+        orderIds.add(-1);
+        List<SalesOrder> orderList = salesOrderService.list(new LambdaQueryWrapper<SalesOrder>().in(SalesOrder::getId, orderIds));
+        List<SysDict> orderTypeList = sysDictService.list(new LambdaQueryWrapper<SysDict>().eq(SysDict::getCode, "OrderType"));
+        orderList.forEach(o->{
+            Optional<Custom> custom = customList.stream().filter(ct -> ct.getId().equals(o.getCustomId())).findFirst();
+            if(custom.isPresent()){
+                o.setCustomName(custom.get().getCustomName());
+            }
+            Optional<User> user = userList.stream().filter(u -> u.getId().equals(o.getCreatorId())).findFirst();
+            if(user.isPresent()){
+                o.setCreatorName(user.get().getName());
+            }
+            Optional<User> incharger = userList.stream().filter(u -> u.getId().equals(o.getInchargerId())).findFirst();
+            if(incharger.isPresent()){
+                o.setInchargerName(incharger.get().getName());
+            }
+            Optional<SysDict> orderType = orderTypeList.stream().filter(ot -> ot.getId().equals(o.getType())).findFirst();
+            if(orderType.isPresent()){
+                o.setTypeName(orderType.get().getName());
+            }
+        });
+        msg.setData(orderList);
+        return msg;
+    }
+
+    @RequestMapping("/recycleList")
+    public HttpRespMsg recycleList(Integer pageIndex,Integer pageSize){
+        return productService.recycleList(pageIndex,pageSize);
+    }
+
+    @RequestMapping("/batchRecoveryProduct")
+    public HttpRespMsg recovery(String ids){
+        HttpRespMsg msg=new HttpRespMsg();
+        if(!StringUtils.isEmpty(ids)){
+            String[] idsSplit = ids.split(",");
+            List<String> splitList = Arrays.asList(idsSplit);
+            List<Integer> idList = splitList.stream().map(i -> Integer.valueOf(i)).collect(Collectors.toList());
+            idList.add(-1);
+            List<Product> productList = productService.list(new LambdaQueryWrapper<Product>().in(Product::getId, idList));
+            if(productList.size()>0){
+                productList.forEach(p->{
+                    p.setIsDelete(0);
+                });
+                productService.updateBatchById(productList);
+            }
+        }
+        return msg;
+    }
+
+    @RequestMapping("/batchDeleteProduct")
+    public HttpRespMsg batchDeleteProduct(String ids){
+        HttpRespMsg msg=new HttpRespMsg();
+        if(!StringUtils.isEmpty(ids)){
+            String[] idsSplit = ids.split(",");
+            List<String> splitList = Arrays.asList(idsSplit);
+            List<Integer> idList = splitList.stream().map(i -> Integer.valueOf(i)).collect(Collectors.toList());
+            idList.add(-1);
+            productService.removeByIds(idList);
+        }
+        return msg;
+    }
 }
 

+ 186 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/SalesOrderController.java

@@ -0,0 +1,186 @@
+package com.management.platform.controller;
+
+
+import com.alibaba.fastjson.JSONArray;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.management.platform.entity.*;
+import com.management.platform.mapper.ProductMapper;
+import com.management.platform.mapper.UserMapper;
+import com.management.platform.service.*;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.util.StringUtils;
+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;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Optional;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2024-02-28
+ */
+@RestController
+@RequestMapping("/order")
+public class SalesOrderController {
+    @Resource
+    private SalesOrderService salesOrderService;
+    @Resource
+    private UserMapper userMapper;
+    @Resource
+    private HttpServletRequest request;
+    @Resource
+    private OrderProductDetailService orderProductDetailService;
+    @Resource
+    private ProductMapper productMapper;
+    @Resource
+    private SysDictService sysDictService;
+    @Resource
+    private TaskService taskService;
+
+    @RequestMapping("/list")
+    public HttpRespMsg list(String userId, String orderName,String orderCode, String productCode, Integer pageIndex, Integer pageSize,Integer isDelete){
+        return salesOrderService.getList(userId,orderName,orderCode,productCode,pageIndex,pageSize,isDelete);
+    }
+
+    @RequestMapping("/addOrUpdate")
+    public HttpRespMsg addOrUpdate(SalesOrder order){
+        HttpRespMsg msg=new HttpRespMsg();
+        Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
+        order.setCompanyId(companyId);
+        int count;
+        if(order.getId()==null){
+            count = salesOrderService.count(new LambdaQueryWrapper<SalesOrder>().eq(SalesOrder::getCompanyId, companyId).eq(SalesOrder::getOrderCode, order.getOrderCode()));
+        }else {
+            count = salesOrderService.count(new LambdaQueryWrapper<SalesOrder>().eq(SalesOrder::getCompanyId, companyId).ne(SalesOrder::getId,order.getId()).eq(SalesOrder::getOrderCode,order.getOrderCode()));
+        }
+        if(count>0){
+            msg.setError("订单编号为["+order.getOrderCode()+"]的订单已存在");
+            return msg;
+        }
+        if(!salesOrderService.saveOrUpdate(order)){
+            msg.setError("验证失败");
+            return msg;
+        }
+        //处理订单下的产品数据
+        if(!StringUtils.isEmpty(order.getOrderProductDetailString())){
+            String orderProductDetailString = order.getOrderProductDetailString();
+            List<OrderProductDetail> orderProductDetails = JSONArray.parseArray(orderProductDetailString, OrderProductDetail.class);
+            if(orderProductDetails.size()>0){
+                orderProductDetails.forEach(o->{
+                    o.setOrderId(order.getId());
+                });
+                orderProductDetailService.saveOrUpdateBatch(orderProductDetails);
+            }
+        }
+        return msg;
+    }
+
+    @RequestMapping("/delete")
+    public HttpRespMsg delete(String ids){
+        HttpRespMsg msg=new HttpRespMsg();
+        if(!StringUtils.isEmpty(ids)){
+            String[] idSplit = ids.split(",");
+            List<String> splitList = Arrays.asList(idSplit);
+            List<Integer> idList = splitList.stream().map(s -> Integer.valueOf(s)).collect(Collectors.toList());
+            List<SalesOrder> orderList = salesOrderService.list(new LambdaQueryWrapper<SalesOrder>().in(SalesOrder::getId, idList));
+            orderList.forEach(o->{
+                o.setIsDelete(1);
+            });
+            if(!salesOrderService.updateBatchById(orderList)){
+                msg.setError("验证失败");
+                return msg;
+            }
+        }
+        return msg;
+    }
+
+    @RequestMapping("/recover")
+    public HttpRespMsg recover(String ids){
+        HttpRespMsg msg=new HttpRespMsg();
+        if(!StringUtils.isEmpty(ids)){
+            String[] idSplit = ids.split(",");
+            List<String> splitList = Arrays.asList(idSplit);
+            List<Integer> idList = splitList.stream().map(s -> Integer.valueOf(s)).collect(Collectors.toList());
+            List<SalesOrder> orderList = salesOrderService.list(new LambdaQueryWrapper<SalesOrder>().in(SalesOrder::getId, idList));
+            orderList.forEach(o->{
+                o.setIsDelete(0);
+            });
+            if(!salesOrderService.updateBatchById(orderList)){
+                msg.setError("验证失败");
+                return msg;
+            }
+        }
+        return msg;
+    }
+
+    @RequestMapping("/importData")
+    public HttpRespMsg importData(MultipartFile multipartFile){
+        return salesOrderService.importData(multipartFile);
+    }
+
+    @RequestMapping("/exportData")
+    public HttpRespMsg exportData(String userId, String orderName,String orderCode, String productCode) throws Exception {
+        return salesOrderService.exportData(userId,orderName,orderCode,productCode);
+    }
+
+    @RequestMapping("/productWithOrder")
+    public HttpRespMsg productWithOrder(Integer id){
+        HttpRespMsg msg=new HttpRespMsg();
+        Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
+        List<User> userList = userMapper.selectList(new LambdaQueryWrapper<User>().eq(User::getCompanyId, companyId));
+        List<SysDict> sysDictOfProductUnit = sysDictService.list(new LambdaQueryWrapper<SysDict>().eq(SysDict::getCode, "ProductUnit"));
+        List<SysDict> sysDictOfProductType = sysDictService.list(new LambdaQueryWrapper<SysDict>().eq(SysDict::getCode, "ProductType"));
+        List<OrderProductDetail> orderProductDetails = orderProductDetailService.list(new LambdaQueryWrapper<OrderProductDetail>().eq(OrderProductDetail::getOrderId, id));
+        List<Integer> productIds = orderProductDetails.stream().map(OrderProductDetail::getProductId).collect(Collectors.toList());
+        productIds.add(-1);
+        List<Product> productList = productMapper.selectList(new LambdaQueryWrapper<Product>().in(Product::getId, productIds));
+        productList.forEach(p->{
+            Optional<User> user = userList.stream().filter(u -> u.getId().equals(p.getInchargerId())).findFirst();
+            if(user.isPresent()){
+                p.setInchargerName(user.get().getName());
+            }
+            Optional<User> creator = userList.stream().filter(u -> u.getId().equals(p.getCreatorId())).findFirst();
+            if(creator.isPresent()){
+                p.setCreatorName(creator.get().getName());
+            }
+            Optional<SysDict> unit = sysDictOfProductUnit.stream().filter(u -> u.getId().equals(p.getUnit())).findFirst();
+            if(unit.isPresent()){
+                p.setUnitName(unit.get().getName());
+            }
+            Optional<SysDict> type = sysDictOfProductType.stream().filter(u -> u.getId().equals(p.getType())).findFirst();
+            if(type.isPresent()){
+                p.setTypeName(type.get().getName());
+            }
+        });
+        msg.setData(productList);
+        return msg;
+    }
+
+    @RequestMapping("/taskWithOrder")
+    public HttpRespMsg taskWithOrder(Integer id){
+        HttpRespMsg msg=new HttpRespMsg();
+        Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
+        List<User> userList = userMapper.selectList(new LambdaQueryWrapper<User>().eq(User::getCompanyId, companyId));
+        List<Task> taskList = taskService.list(new LambdaQueryWrapper<Task>().eq(Task::getOrderId, id));
+        taskList.forEach(p->{
+            Optional<User> user = userList.stream().filter(u -> u.getId().equals(p.getExecutorId())).findFirst();
+            if(user.isPresent()){
+                p.setExecutorName(user.get().getName());
+            }
+        });
+        msg.setData(taskList);
+        return msg;
+    }
+
+}
+

+ 88 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/AttachmentCenter.java

@@ -0,0 +1,88 @@
+package com.management.platform.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.baomidou.mybatisplus.annotation.TableId;
+import java.time.LocalDateTime;
+import com.baomidou.mybatisplus.annotation.TableField;
+import java.io.Serializable;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author Seyason
+ * @since 2024-04-17
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+public class AttachmentCenter extends Model<AttachmentCenter> {
+
+    private static final long serialVersionUID=1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 附件名称
+     */
+    @TableField("attachment_name")
+    private String attachmentName;
+
+    /**
+     * 服务器生成的附件
+     */
+    @TableField("server_name")
+    private String serverName;
+
+    /**
+     * 对外访问地址
+     */
+    @TableField("url")
+    private String url;
+
+    @TableField("creator_id")
+    private String creatorId;
+
+    @TableField("creator_name")
+    private String creatorName;
+
+    @TableField("indate")
+    private LocalDateTime indate;
+
+    /**
+     * 模块id
+     */
+    @TableField("module_id")
+    private Integer moduleId;
+
+    /**
+     * 模块代码
+     */
+    @TableField("module_code")
+    private String moduleCode;
+
+    /**
+     * 文件大小
+     */
+    @TableField("size")
+    private String size;
+
+    /**
+     * 文件类型
+     */
+    @TableField("attachment_type")
+    private Integer attachmentType;
+
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+}

+ 73 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/AuditLogCenter.java

@@ -0,0 +1,73 @@
+package com.management.platform.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.baomidou.mybatisplus.annotation.TableId;
+import java.time.LocalDateTime;
+import com.baomidou.mybatisplus.annotation.TableField;
+import java.io.Serializable;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author Seyason
+ * @since 2024-04-17
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+public class AuditLogCenter extends Model<AuditLogCenter> {
+
+    private static final long serialVersionUID=1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 模块id
+     */
+    @TableField("module_id")
+    private Integer moduleId;
+
+    /**
+     * 模块编码
+     */
+    @TableField("module_code")
+    private String moduleCode;
+
+    /**
+     * 操作时间
+     */
+    @TableField("audit_time")
+    private LocalDateTime auditTime;
+
+    /**
+     * 操作人id
+     */
+    @TableField("auditor_id")
+    private String auditorId;
+
+    /**
+     * 操作人
+     */
+    @TableField("auditor_name")
+    private String auditorName;
+
+    /**
+     * 操作内容
+     */
+    @TableField("auditor_content")
+    private String auditorContent;
+
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+}

+ 3 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/BusinessOpportunity.java

@@ -83,6 +83,7 @@ public class BusinessOpportunity extends Model<BusinessOpportunity> {
      */
     @TableField("stage_id")
     private Integer stageId;
+
     @TableField(exist = false)
     private String stageValue;
     @TableField(exist = false)
@@ -92,6 +93,8 @@ public class BusinessOpportunity extends Model<BusinessOpportunity> {
      * 创建时间
      */
     @TableField("create_time")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd")
     private Date createTime;
     @TableField(exist = false)
     private String startTime;

+ 6 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/Product.java

@@ -133,6 +133,12 @@ public class Product extends Model<Product> {
     @TableField("descs")
     private String descs;
 
+    /**
+     * 回收站 0-否 1-是
+     */
+    @TableField("is_delete")
+    private Integer isDelete;
+
     @TableField(exist = false)
     private String inchargerName;
 

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

@@ -27,7 +27,7 @@ import org.springframework.format.annotation.DateTimeFormat;
 @Data
 @EqualsAndHashCode(callSuper = false)
 @Accessors(chain = true)
-public class Order extends Model<Order> {
+public class SalesOrder extends Model<SalesOrder> {
 
     private static final long serialVersionUID=1L;
 
@@ -202,6 +202,12 @@ public class Order extends Model<Order> {
     @TableField(exist = false)
     private String inchargerName;
 
+    @TableField(exist = false)
+    private String customName;
+
+    @TableField(exist = false)
+    private String creatorName;
+
 
     @Override
     protected Serializable pkVal() {

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

@@ -0,0 +1,16 @@
+package com.management.platform.mapper;
+
+import com.management.platform.entity.AttachmentCenter;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author Seyason
+ * @since 2024-04-15
+ */
+public interface AttachmentCenterMapper extends BaseMapper<AttachmentCenter> {
+
+}

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

@@ -0,0 +1,16 @@
+package com.management.platform.mapper;
+
+import com.management.platform.entity.AuditLogCenter;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author Seyason
+ * @since 2024-04-15
+ */
+public interface AuditLogCenterMapper extends BaseMapper<AuditLogCenter> {
+
+}

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

@@ -0,0 +1,16 @@
+package com.management.platform.mapper;
+
+import com.management.platform.entity.AuditLogCenter;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author Seyason
+ * @since 2024-04-15
+ */
+public interface ProductAuditLogMapper extends BaseMapper<AuditLogCenter> {
+
+}

+ 3 - 3
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/mapper/OrderMapper.java

@@ -1,6 +1,6 @@
 package com.management.platform.mapper;
 
-import com.management.platform.entity.Order;
+import com.management.platform.entity.SalesOrder;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.management.platform.entity.User;
 import org.apache.ibatis.annotations.Select;
@@ -15,8 +15,8 @@ import java.util.List;
  * @author Seyason
  * @since 2024-02-28
  */
-public interface OrderMapper extends BaseMapper<Order> {
+public interface SalesOrderMapper extends BaseMapper<SalesOrder> {
 
     @Select("select * from `order` WHERE company_id = #{companyId} AND is_delete = 0 ")
-    List<Order> getList(User user);
+    List<SalesOrder> getList(User user);
 }

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

@@ -0,0 +1,16 @@
+package com.management.platform.service;
+
+import com.management.platform.entity.AttachmentCenter;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2024-04-15
+ */
+public interface AttachmentCenterService extends IService<AttachmentCenter> {
+
+}

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

@@ -0,0 +1,16 @@
+package com.management.platform.service;
+
+import com.management.platform.entity.AuditLogCenter;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2024-04-15
+ */
+public interface AuditLogCenterService extends IService<AuditLogCenter> {
+
+}

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

@@ -22,4 +22,8 @@ public interface ProductService extends IService<Product> {
     HttpRespMsg importData(MultipartFile multipartFile);
 
     HttpRespMsg exportData(String userId, String productName, String productCode) throws Exception;
+
+    HttpRespMsg getDetail(Integer id);
+
+    HttpRespMsg recycleList(Integer pageIndex, Integer pageSize);
 }

+ 7 - 2
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/OrderService.java

@@ -1,8 +1,9 @@
 package com.management.platform.service;
 
-import com.management.platform.entity.Order;
+import com.management.platform.entity.SalesOrder;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.management.platform.util.HttpRespMsg;
+import org.springframework.web.multipart.MultipartFile;
 
 /**
  * <p>
@@ -12,7 +13,11 @@ import com.management.platform.util.HttpRespMsg;
  * @author Seyason
  * @since 2024-02-28
  */
-public interface OrderService extends IService<Order> {
+public interface SalesOrderService extends IService<SalesOrder> {
 
     HttpRespMsg getList(String userId, String orderName,String orderCode, String productCode, Integer pageIndex, Integer pageSize,Integer isDelete);
+
+    HttpRespMsg importData(MultipartFile multipartFile);
+
+    HttpRespMsg exportData(String userId, String orderName, String orderCode, String productCode) throws Exception;
 }

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

@@ -0,0 +1,20 @@
+package com.management.platform.service.impl;
+
+import com.management.platform.entity.AttachmentCenter;
+import com.management.platform.mapper.AttachmentCenterMapper;
+import com.management.platform.service.AttachmentCenterService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2024-04-15
+ */
+@Service
+public class AttachmentCenterServiceImpl extends ServiceImpl<AttachmentCenterMapper, AttachmentCenter> implements AttachmentCenterService {
+
+}

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

@@ -0,0 +1,20 @@
+package com.management.platform.service.impl;
+
+import com.management.platform.entity.AuditLogCenter;
+import com.management.platform.mapper.AuditLogCenterMapper;
+import com.management.platform.service.AuditLogCenterService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2024-04-15
+ */
+@Service
+public class AuditLogCenterServiceImpl extends ServiceImpl<AuditLogCenterMapper, AuditLogCenter> implements AuditLogCenterService {
+
+}

+ 0 - 141
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/OrderServiceImpl.java

@@ -1,141 +0,0 @@
-package com.management.platform.service.impl;
-
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.management.platform.entity.*;
-import com.management.platform.mapper.*;
-import com.management.platform.service.DepartmentService;
-import com.management.platform.service.OrderService;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.management.platform.service.SysFunctionService;
-import com.management.platform.util.HttpRespMsg;
-import org.springframework.stereotype.Service;
-import org.springframework.util.StringUtils;
-
-import javax.annotation.Resource;
-import javax.servlet.http.HttpServletRequest;
-import java.util.*;
-import java.util.stream.Collectors;
-
-/**
- * <p>
- *  服务实现类
- * </p>
- *
- * @author Seyason
- * @since 2024-02-28
- */
-@Service
-public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements OrderService {
-
-    @Resource
-    private OrderMapper orderMapper;
-    @Resource
-    private HttpServletRequest request;
-    @Resource
-    private UserMapper userMapper;
-    @Resource
-    private SysFunctionService sysFunctionService;
-    @Resource
-    private DepartmentMapper departmentMapper;
-    @Resource
-    private DepartmentOtherManagerMapper departmentOtherManagerMapper;
-    @Resource
-    private SysDictMapper sysDictMapper;
-
-    @Override
-    public HttpRespMsg getList(String userId, String orderName,String orderCode, String productCode, Integer pageIndex, Integer pageSize,Integer isDelete) {
-        HttpRespMsg msg=new HttpRespMsg();
-        User user = userMapper.selectById(request.getHeader("token"));
-        List<Department> departments = departmentMapper.selectList(new LambdaQueryWrapper<Department>().eq(Department::getCompanyId, user.getCompanyId()));
-        boolean viewAll = sysFunctionService.hasPriviledge(user.getRoleId(), "查看全部订单");
-        boolean viewDept = sysFunctionService.hasPriviledge(user.getRoleId(), "查看负责部门订单");
-        List<User> userList = userMapper.selectList(new LambdaQueryWrapper<User>().eq(User::getCompanyId, user.getCompanyId()));
-        List<SysDict> sysDictOfOrderType = sysDictMapper.selectList(new LambdaQueryWrapper<SysDict>().eq(SysDict::getCompanyId, user.getCompanyId()).eq(SysDict::getCode, "OrderType"));
-        LambdaQueryWrapper<Order> orderLambdaQueryWrapper = new LambdaQueryWrapper<>();
-        orderLambdaQueryWrapper.eq(Order::getCompanyId,user.getCompanyId());
-        if(isDelete!=null){
-            orderLambdaQueryWrapper.eq(Order::getIsDelete,isDelete);
-        }else {
-            orderLambdaQueryWrapper.eq(Order::getIsDelete,0);
-        }
-        orderLambdaQueryWrapper.eq(Order::getStatus,1);
-        //判断查看全部的权限
-        if(!viewAll){
-            //判断查看负责部门的权限
-            if(!viewDept){
-                //都没有就只能看自己创建的
-                orderLambdaQueryWrapper.eq(Order::getCreatorId,user.getId());
-            }else {
-                List<Department> departmentList = departmentMapper.selectList(new LambdaQueryWrapper<Department>().eq(Department::getManagerId, user.getId()));
-                List<DepartmentOtherManager> otherManagerList = departmentOtherManagerMapper.selectList(new LambdaQueryWrapper<DepartmentOtherManager>().eq(DepartmentOtherManager::getOtherManagerId, user.getId()));
-                List<Integer> deptIds=new ArrayList<>();
-                deptIds.add(-1);
-                List<Integer> managerDeptIds = departmentList.stream().map(Department::getDepartmentId).distinct().collect(Collectors.toList());
-                List<Integer> otherManagerDeptIds = otherManagerList.stream().map(DepartmentOtherManager::getDepartmentId).distinct().collect(Collectors.toList());
-                deptIds.addAll(managerDeptIds);
-                List<Integer> finalDeptIds1 = deptIds;
-                managerDeptIds.forEach(m->{
-                    List<Integer> branchDepartment = getBranchDepartment(m, departments);
-                    finalDeptIds1.addAll(branchDepartment);
-                });
-                deptIds.addAll(otherManagerDeptIds);
-                List<Integer> finalDeptIds = deptIds;
-                otherManagerDeptIds.forEach(o->{
-                    List<Integer> branchDepartment = getBranchDepartment(o, departments);
-                    finalDeptIds.addAll(branchDepartment);
-                });
-                deptIds=deptIds.stream().distinct().collect(Collectors.toList());
-                List<Integer> finalDeptIds2 = deptIds;
-                List<String> userIds = userList.stream().filter(u -> finalDeptIds2.contains(u.getDepartmentId())).map(User::getId).collect(Collectors.toList());
-                orderLambdaQueryWrapper.in(Order::getCreatorId,userIds);
-            }
-        }
-        if(!StringUtils.isEmpty(orderName)){
-            orderLambdaQueryWrapper.like(Order::getOrderName,orderName);
-        }
-        if(!StringUtils.isEmpty(orderCode)){
-            orderLambdaQueryWrapper.like(Order::getOrderCode,orderCode);
-        }
-        if(!StringUtils.isEmpty(productCode)){
-            orderLambdaQueryWrapper.inSql(Order::getId,
-                    "select o.order_id from order_product_detail o left join product p on o.product_id=p.id " +
-                            "where p.company_id="+user.getCompanyId()+" and p.product_code like '%"+productCode+"%'");
-        }
-        if(pageIndex==null||pageSize==null){
-            pageIndex=-1;
-            pageSize=-1;
-        }
-        IPage<Order> orderIPage = orderMapper.selectPage(new Page<>(pageIndex, pageSize), orderLambdaQueryWrapper);
-        List<Order> records = orderIPage.getRecords();
-        records.forEach(r->{
-            Optional<User> item = userList.stream().filter(u -> u.getId().equals(r.getCreatorId())).findFirst();
-            if(item.isPresent()){
-                r.setInchargerName(item.get().getName());
-            }
-            Optional<SysDict> type = sysDictOfOrderType.stream().filter(u -> u.getId().equals(r.getCreatorId())).findFirst();
-            if(type.isPresent()){
-                r.setTypeName(type.get().getName());
-            }
-        });
-        Map map=new HashMap();
-        map.put("record",records);
-        map.put("total",orderIPage.getTotal());
-        msg.setData(map);
-        return msg;
-    }
-
-    //递归获取子部门
-    public List<Integer> getBranchDepartment(Integer departmentId, List<Department> departmentList) {
-        List<Integer> list = new ArrayList<>();
-        list.add(departmentId);
-        //搜到子部门进行添加
-        for (Department department : departmentList) {
-            if (departmentId.equals(department.getSuperiorId())) {
-                list.addAll(getBranchDepartment(department.getDepartmentId(), departmentList));
-            }
-        }
-        return list;
-    }
-}

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

@@ -79,6 +79,7 @@ public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> impl
         List<Department> departments = departmentMapper.selectList(new LambdaQueryWrapper<Department>().eq(Department::getCompanyId, companyId));
         LambdaQueryWrapper<Product> queryWrapper = new LambdaQueryWrapper<>();
         queryWrapper.eq(Product::getCompanyId,companyId);
+        queryWrapper.eq(Product::getIsDelete,0);
         List<User> userList = userMapper.selectList(new LambdaQueryWrapper<User>().eq(User::getCompanyId, companyId));
         List<SysDict> sysDictOfProductType = sysDictMapper.selectList(new LambdaQueryWrapper<SysDict>().eq(SysDict::getCompanyId, companyId).eq(SysDict::getCode, "ProductType"));
         List<SysDict> sysDictOfProductUnit = sysDictMapper.selectList(new LambdaQueryWrapper<SysDict>().eq(SysDict::getCompanyId, companyId).eq(SysDict::getCode, "ProductUnit"));
@@ -128,7 +129,7 @@ public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> impl
             pageIndex=-1;
             pageSize=-1;
         }
-        IPage<Product> productIPage = productMapper.selectPage(new Page<>(pageIndex, pageSize), queryWrapper);
+        IPage<Product> productIPage = productMapper.selectPage(new Page<>(pageIndex, pageSize,true), queryWrapper);
         List<Product> records = productIPage.getRecords();
         records.forEach(r->{
             Optional<User> user = userList.stream().filter(u -> u.getId().equals(r.getInchargerId())).findFirst();
@@ -143,7 +144,7 @@ public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> impl
             if(unit.isPresent()){
                 r.setUnitName(unit.get().getName());
             }
-            Optional<SysDict> type = sysDictOfProductType.stream().filter(u -> u.getId().equals(r.getCreatorId())).findFirst();
+            Optional<SysDict> type = sysDictOfProductType.stream().filter(u -> u.getId().equals(r.getType())).findFirst();
             if(type.isPresent()){
                 r.setTypeName(type.get().getName());
             }
@@ -407,6 +408,49 @@ public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> impl
         return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,fileName,dataList,path);
     }
 
+    @Override
+    public HttpRespMsg getDetail(Integer id) {
+        HttpRespMsg msg=new HttpRespMsg();
+        Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
+        List<User> userList = userMapper.selectList(new LambdaQueryWrapper<User>().eq(User::getCompanyId, companyId));
+        List<SysDict> sysDictOfProductType = sysDictMapper.selectList(new LambdaQueryWrapper<SysDict>().eq(SysDict::getCompanyId, companyId).eq(SysDict::getCode, "ProductType"));
+        List<SysDict> sysDictOfProductUnit = sysDictMapper.selectList(new LambdaQueryWrapper<SysDict>().eq(SysDict::getCompanyId, companyId).eq(SysDict::getCode, "ProductUnit"));
+        Product product = productMapper.selectById(id);
+        Optional<User> user = userList.stream().filter(u -> u.getId().equals(product.getInchargerId())).findFirst();
+        if(user.isPresent()){
+            product.setInchargerName(user.get().getName());
+        }
+        Optional<User> creator = userList.stream().filter(u -> u.getId().equals(product.getCreatorId())).findFirst();
+        if(creator.isPresent()){
+            product.setCreatorName(creator.get().getName());
+        }
+        Optional<SysDict> unit = sysDictOfProductUnit.stream().filter(u -> u.getId().equals(product.getUnit())).findFirst();
+        if(unit.isPresent()){
+            product.setUnitName(unit.get().getName());
+        }
+        Optional<SysDict> type = sysDictOfProductType.stream().filter(u -> u.getId().equals(product.getType())).findFirst();
+        if(type.isPresent()){
+            product.setTypeName(type.get().getName());
+        }
+        msg.setData(product);
+        return msg;
+    }
+
+    @Override
+    public HttpRespMsg recycleList(Integer pageIndex, Integer pageSize) {
+        HttpRespMsg msg=new HttpRespMsg();
+        User user = userMapper.selectById(request.getHeader("token"));
+        LambdaQueryWrapper<Product> productLambdaQueryWrapper = new LambdaQueryWrapper<>();
+        productLambdaQueryWrapper.eq(Product::getCompanyId,user.getCompanyId());
+        productLambdaQueryWrapper.eq(Product::getIsDelete,1);
+        IPage<Product> productIPage = productMapper.selectPage(new Page<>(pageIndex, pageSize), productLambdaQueryWrapper);
+        Map<String,Object> map=new HashMap<>();
+        map.put("record",productIPage.getRecords());
+        map.put("total",productIPage.getTotal());
+        msg.setData(map);
+        return msg;
+    }
+
     //递归获取子部门
     public List<Integer> getBranchDepartment(Integer departmentId, List<Department> departmentList) {
         List<Integer> list = new ArrayList<>();

+ 374 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/SalesOrderServiceImpl.java

@@ -0,0 +1,374 @@
+package com.management.platform.service.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.management.platform.entity.*;
+import com.management.platform.mapper.*;
+import com.management.platform.service.*;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.management.platform.util.ExcelUtil;
+import com.management.platform.util.HttpRespMsg;
+import org.apache.poi.hssf.usermodel.HSSFCell;
+import org.apache.poi.hssf.usermodel.HSSFRow;
+import org.apache.poi.hssf.usermodel.HSSFSheet;
+import org.apache.poi.hssf.usermodel.HSSFWorkbook;
+import org.apache.poi.ss.usermodel.CellType;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import org.springframework.util.StringUtils;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.io.*;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2024-02-28
+ */
+@Service
+public class SalesOrderServiceImpl extends ServiceImpl<SalesOrderMapper, SalesOrder> implements SalesOrderService {
+
+    @Resource
+    private SalesOrderMapper salesOrderMapper;
+    @Resource
+    private HttpServletRequest request;
+    @Resource
+    private UserMapper userMapper;
+    @Resource
+    private SysFunctionService sysFunctionService;
+    @Resource
+    private DepartmentMapper departmentMapper;
+    @Resource
+    private DepartmentOtherManagerMapper departmentOtherManagerMapper;
+    @Resource
+    private SysDictMapper sysDictMapper;
+    @Resource
+    private ExcelExportService excelExportService;
+    @Resource
+    private SysFormMapper sysFormMapper;
+    @Resource
+    private WxCorpInfoService wxCorpInfoService;
+    @Value(value = "${upload.path}")
+    private String path;
+
+    @Override
+    public HttpRespMsg getList(String userId, String orderName,String orderCode, String productCode, Integer pageIndex, Integer pageSize,Integer isDelete) {
+        HttpRespMsg msg=new HttpRespMsg();
+        User user = userMapper.selectById(request.getHeader("token"));
+        List<Department> departments = departmentMapper.selectList(new LambdaQueryWrapper<Department>().eq(Department::getCompanyId, user.getCompanyId()));
+        boolean viewAll = sysFunctionService.hasPriviledge(user.getRoleId(), "查看全部订单");
+        boolean viewDept = sysFunctionService.hasPriviledge(user.getRoleId(), "查看负责部门订单");
+        List<User> userList = userMapper.selectList(new LambdaQueryWrapper<User>().eq(User::getCompanyId, user.getCompanyId()));
+        List<SysDict> sysDictOfOrderType = sysDictMapper.selectList(new LambdaQueryWrapper<SysDict>().eq(SysDict::getCompanyId, user.getCompanyId()).eq(SysDict::getCode, "OrderType"));
+        LambdaQueryWrapper<SalesOrder> orderLambdaQueryWrapper = new LambdaQueryWrapper<>();
+        orderLambdaQueryWrapper.eq(SalesOrder::getCompanyId,user.getCompanyId());
+        if(isDelete!=null){
+            orderLambdaQueryWrapper.eq(SalesOrder::getIsDelete,isDelete);
+        }else {
+            orderLambdaQueryWrapper.eq(SalesOrder::getIsDelete,0);
+        }
+        orderLambdaQueryWrapper.eq(SalesOrder::getStatus,1);
+        //判断查看全部的权限
+        if(!viewAll){
+            //判断查看负责部门的权限
+            if(!viewDept){
+                //都没有就只能看自己创建的
+                orderLambdaQueryWrapper.eq(SalesOrder::getCreatorId,user.getId());
+            }else {
+                List<Department> departmentList = departmentMapper.selectList(new LambdaQueryWrapper<Department>().eq(Department::getManagerId, user.getId()));
+                List<DepartmentOtherManager> otherManagerList = departmentOtherManagerMapper.selectList(new LambdaQueryWrapper<DepartmentOtherManager>().eq(DepartmentOtherManager::getOtherManagerId, user.getId()));
+                List<Integer> deptIds=new ArrayList<>();
+                deptIds.add(-1);
+                List<Integer> managerDeptIds = departmentList.stream().map(Department::getDepartmentId).distinct().collect(Collectors.toList());
+                List<Integer> otherManagerDeptIds = otherManagerList.stream().map(DepartmentOtherManager::getDepartmentId).distinct().collect(Collectors.toList());
+                deptIds.addAll(managerDeptIds);
+                List<Integer> finalDeptIds1 = deptIds;
+                managerDeptIds.forEach(m->{
+                    List<Integer> branchDepartment = getBranchDepartment(m, departments);
+                    finalDeptIds1.addAll(branchDepartment);
+                });
+                deptIds.addAll(otherManagerDeptIds);
+                List<Integer> finalDeptIds = deptIds;
+                otherManagerDeptIds.forEach(o->{
+                    List<Integer> branchDepartment = getBranchDepartment(o, departments);
+                    finalDeptIds.addAll(branchDepartment);
+                });
+                deptIds=deptIds.stream().distinct().collect(Collectors.toList());
+                List<Integer> finalDeptIds2 = deptIds;
+                List<String> userIds = userList.stream().filter(u -> finalDeptIds2.contains(u.getDepartmentId())).map(User::getId).collect(Collectors.toList());
+                orderLambdaQueryWrapper.in(SalesOrder::getCreatorId,userIds);
+            }
+        }
+        if(!StringUtils.isEmpty(orderName)){
+            orderLambdaQueryWrapper.like(SalesOrder::getOrderName,orderName);
+        }
+        if(!StringUtils.isEmpty(orderCode)){
+            orderLambdaQueryWrapper.like(SalesOrder::getOrderCode,orderCode);
+        }
+        if(!StringUtils.isEmpty(productCode)){
+            orderLambdaQueryWrapper.inSql(SalesOrder::getId,
+                    "select o.order_id from order_product_detail o left join product p on o.product_id=p.id " +
+                            "where p.company_id="+user.getCompanyId()+" and p.product_code like '%"+productCode+"%'");
+        }
+        if(pageIndex==null||pageSize==null){
+            pageIndex=-1;
+            pageSize=-1;
+        }
+        IPage<SalesOrder> orderIPage = salesOrderMapper.selectPage(new Page<>(pageIndex, pageSize), orderLambdaQueryWrapper);
+        List<SalesOrder> records = orderIPage.getRecords();
+        records.forEach(r->{
+            Optional<User> item = userList.stream().filter(u -> u.getId().equals(r.getCreatorId())).findFirst();
+            if(item.isPresent()){
+                r.setInchargerName(item.get().getName());
+            }
+            Optional<SysDict> type = sysDictOfOrderType.stream().filter(u -> u.getId().equals(r.getCreatorId())).findFirst();
+            if(type.isPresent()){
+                r.setTypeName(type.get().getName());
+            }
+        });
+        Map map=new HashMap();
+        map.put("record",records);
+        map.put("total",orderIPage.getTotal());
+        msg.setData(map);
+        return msg;
+    }
+
+    @Override
+    public HttpRespMsg importData(MultipartFile multipartFile) {
+        HttpRespMsg msg=new HttpRespMsg();
+        String fileName = multipartFile.getOriginalFilename();
+        File file = new File(fileName == null ? "file" : fileName);
+        User user = userMapper.selectById(request.getHeader("token"));
+        Integer companyId = user.getCompanyId();
+        WxCorpInfo wxCorpInfo = wxCorpInfoService.getOne(new LambdaQueryWrapper<WxCorpInfo>().eq(WxCorpInfo::getCompanyId, companyId));
+        List<SalesOrder> orderList = salesOrderMapper.selectList(new LambdaQueryWrapper<SalesOrder>().eq(SalesOrder::getCompanyId, companyId));
+        List<User> userList = userMapper.selectList(new LambdaQueryWrapper<User>().eq(User::getCompanyId, companyId));
+        List<SysDict> sysDictOfProductType = sysDictMapper.selectList(new LambdaQueryWrapper<SysDict>().eq(SysDict::getCompanyId, companyId).eq(SysDict::getCode, "ProductType"));
+        List<SysDict> sysDictOfProductUnit = sysDictMapper.selectList(new LambdaQueryWrapper<SysDict>().eq(SysDict::getCompanyId, companyId).eq(SysDict::getCode, "ProductUnit"));
+        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();
+            //解析表格
+            HSSFWorkbook workbook = new HSSFWorkbook(new FileInputStream(file));
+            //我们只需要第一个sheet
+            HSSFSheet sheet = workbook.getSheetAt(0);
+            //由于第一行需要指明列对应的标题
+            int rowNum = sheet.getLastRowNum();
+            //获取当前表单模板 校验规则
+            SysForm sysForm = sysFormMapper.selectOne(new LambdaQueryWrapper<SysForm>().eq(SysForm::getCode, "Product").eq(SysForm::getCompanyId, companyId).eq(SysForm::getIsCurrent, 1));
+            if(sysForm==null){
+                msg.setError("当前模块未配置自定义模板,需先完成配置");
+                return msg;
+            }
+            String config = sysForm.getConfig();
+            JSONObject configOb = JSON.parseObject(config);
+            JSONArray configObJSONArray = configOb.getJSONArray("list");
+            List<SalesOrder>  importOrderList=new ArrayList<>();
+            List<String> userNameList=new ArrayList<>();
+            HttpRespMsg respMsg=new HttpRespMsg();
+            for (int rowIndex = 0; rowIndex <= rowNum; rowIndex++) {
+                HSSFRow row = sheet.getRow(rowIndex);
+                if (row == null) {
+                    continue;
+                }
+                //跳过空行
+                if (ExcelUtil.isRowEmpty(row)) {
+                    continue;
+                }
+                //获取到当前行的列数据
+                int cellNum = row.getLastCellNum();
+                for (int i = 0; i < cellNum; i++) {
+                    JSONObject item = configObJSONArray.getJSONObject(i);
+                    String modelName = item.getString("model");
+                    HSSFCell cell = row.getCell(i);
+                    if(cell!=null){
+                        switch (item.getString("type")){
+                            case "time":cell.setCellType(CellType.NUMERIC);
+                                break;
+                            default:cell.setCellType(CellType.STRING);
+                        }
+                    }
+                    if(modelName.equals("inchargerId")){
+                        if(!StringUtils.isEmpty(cell.getStringCellValue())){
+                            userNameList.add(cell.getStringCellValue());
+                        }
+                    }
+
+                }
+            }
+            System.out.println("参与搜素的人员列表"+userNameList + userNameList.size());
+            if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1&&userNameList.size()>0){
+                respMsg = wxCorpInfoService.getBatchSearchUserInfo(wxCorpInfo, userNameList,null);
+                if(respMsg.code.equals("0")){
+                    msg.setError("姓名为["+String.valueOf(respMsg.data)+"]的人员存在重复,请使用工号!");
+                    return msg;
+                }
+            }
+            List<User> targetUserList= (List<User>) respMsg.data;
+            for (int rowIndex = 0; rowIndex <= rowNum; rowIndex++) {
+                HSSFRow row = sheet.getRow(rowIndex);
+                if (row == null) {
+                    continue;
+                }
+                //跳过空行
+                if (ExcelUtil.isRowEmpty(row)) {
+                    continue;
+                }
+                //获取到当前行的列数据
+                int cellNum = row.getLastCellNum();
+                SalesOrder order=new SalesOrder();
+                order.setCompanyId(companyId);
+                order.setCreatorId(user.getId());
+                for (int i = 0; i < cellNum; i++) {
+                    JSONObject item = configObJSONArray.getJSONObject(i);
+                    String modelName = item.getString("model");
+                    String className = modelName.substring(0, 1).toUpperCase() + modelName.substring(1);
+                    String getter="get"+className;
+                    String setter="set"+className;
+                    HSSFCell cell = row.getCell(i);
+                    if(cell!=null){
+                        switch (item.getString("type")){
+                            case "time":cell.setCellType(CellType.NUMERIC);
+                                break;
+                            default:cell.setCellType(CellType.STRING);
+                        }
+                    }
+//                    Class<?> productClass = Class.forName("com.management.platform.entity.Product");
+                    Class<Product> productClass = Product.class;
+                    Method method = productClass.getMethod(setter, String.class);
+                    //校验当前列是否为必填
+                    JSONObject options = item.getJSONObject("options");
+                    JSONObject rules = options.getJSONObject("rules");
+                    Boolean required = rules.getBoolean("required");
+                    if(required){
+                        if(StringUtils.isEmpty(cell.getStringCellValue())){
+                            msg.setError(item.getString("label")+"值不能为空值");
+                            return msg;
+                        }
+                    }
+                    if(modelName.equals("orderCode")){
+                        if(!StringUtils.isEmpty(cell.getStringCellValue())){
+                            //系统中同公司已存在的产品编码 更新
+                            Optional<SalesOrder> first = orderList.stream().filter(p ->p.getOrderCode()!=null&& p.getOrderCode().equals(cell.getStringCellValue())).findFirst();
+                            if(first.isPresent()){
+                                order.setId(first.get().getId());
+                            }
+                        }
+                    }
+                    if(modelName.equals("inchargerId")){
+                        if(!StringUtils.isEmpty(cell.getStringCellValue())){
+                            String userName = cell.getStringCellValue();
+                            Optional<User> first;
+                            if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                                Optional<User> optional = targetUserList.stream().filter(tl -> tl.getName().equals(userName)).findFirst();
+                                first= userList.stream().filter(u ->(u.getJobNumber()!=null&&u.getJobNumber().equals(userName))||(optional.isPresent()&&u.getCorpwxUserid()!=null&&u.getCorpwxUserid().equals(optional.get().getCorpwxUserid()))).findFirst();
+                            }else {
+                                first= userList.stream().filter(u -> u.getName().equals(userName)||(u.getJobNumber()!=null&&u.getJobNumber().equals(userName))).findFirst();
+                            }
+                            if (first.isPresent()) {
+                                order.setInchargerId(first.get().getId());
+                            } else {
+                                throw new Exception("["+userName+"]在系统中不存在");
+                            }
+                        }
+                    }
+                    if(!StringUtils.isEmpty(cell.getStringCellValue())){
+                        method.invoke(order,cell.getStringCellValue());
+                    }
+                }
+                importOrderList.add(order);
+            }
+            if(importOrderList.size()>0){
+                if(!saveOrUpdateBatch(importOrderList)){
+                    msg.setError("验证失败");
+                    return msg;
+                }
+            }
+        } catch (IOException | NoSuchMethodException e) {
+            e.printStackTrace();
+        } catch (IllegalAccessException e) {
+            e.printStackTrace();
+        } catch (InvocationTargetException e) {
+            e.printStackTrace();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return msg;
+    }
+
+    @Override
+    public HttpRespMsg exportData(String userId, String orderName, String orderCode, String productCode) throws Exception {
+        User user = userMapper.selectById(request.getHeader("token"));
+        SysForm sysForm = sysFormMapper.selectOne(new LambdaQueryWrapper<SysForm>().eq(SysForm::getCompanyId, user.getCompanyId()).eq(SysForm::getCode, "Product").eq(SysForm::getIsCurrent, 1));
+        WxCorpInfo wxCorpInfo = wxCorpInfoService.getOne(new LambdaQueryWrapper<WxCorpInfo>().eq(WxCorpInfo::getCompanyId, user.getCompanyId()));
+        String config = sysForm.getConfig();
+        JSONObject configOb = JSON.parseObject(config);
+        JSONArray configObJSONArray = configOb.getJSONArray("list");
+        List<List<String>> dataList=new ArrayList<>();
+        List<String> titleList=new ArrayList<>();
+        for (int i = 0; i < configObJSONArray.size(); i++) {
+            JSONObject item = configObJSONArray.getJSONObject(i);
+            titleList.add(item.getString("label"));
+        }
+        dataList.add(titleList);
+        HttpRespMsg respMsg = getList( userId, orderName,orderCode, productCode, null, null,0);
+        Map<String, Object> msgData = (Map<String, Object>) respMsg.getData();
+        List<Product> productList = (List<Product>) msgData.get("record");
+        for (Product product : productList) {
+            List<String> item=new ArrayList<>();
+            for (int i = 0; i < configObJSONArray.size(); i++) {
+                JSONObject target = configObJSONArray.getJSONObject(i);
+                String model = target.getString("model");
+                String targetName = model.substring(0, 1).toUpperCase() + model.substring(1);
+                Class<? extends Product> aClass = product.getClass();
+                String value = String.valueOf(aClass.getMethod("get" + targetName).invoke(product)==null?"":aClass.getMethod("get" + targetName).invoke(product));
+                if(model.equals("inchargerId")){
+                    if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                        value = "$userName"+String.valueOf(aClass.getMethod("getInchargerName").invoke(product))+"$";
+                    }else {
+                        value = String.valueOf(aClass.getMethod("getInchargerName").invoke(product));
+                    }
+                }
+                item.add(value);
+            }
+            dataList.add(item);
+        }
+        String fileName="销售表导出_"+ System.currentTimeMillis();
+        return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,fileName,dataList,path);
+    }
+
+    //递归获取子部门
+    public List<Integer> getBranchDepartment(Integer departmentId, List<Department> departmentList) {
+        List<Integer> list = new ArrayList<>();
+        list.add(departmentId);
+        //搜到子部门进行添加
+        for (Department department : departmentList) {
+            if (departmentId.equals(department.getSuperiorId())) {
+                list.addAll(getBranchDepartment(department.getDepartmentId(), departmentList));
+            }
+        }
+        return list;
+    }
+}

+ 4 - 14
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/TaskServiceImpl.java

@@ -10,19 +10,13 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.management.platform.entity.*;
 import com.management.platform.entity.dto.TaskDto;
 import com.management.platform.entity.vo.TasKVo;
-import com.management.platform.entity.vo.TasKVo;
 import com.management.platform.mapper.*;
 import com.management.platform.service.*;
 import com.management.platform.util.ExcelUtil;
 import com.management.platform.util.HttpRespMsg;
-import com.management.platform.util.MessageUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.poi.hssf.usermodel.*;
 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.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
@@ -35,14 +29,10 @@ import java.io.*;
 import java.lang.reflect.Field;
 import java.lang.reflect.Method;
 import java.text.SimpleDateFormat;
-import java.time.LocalDate;
-import java.time.LocalDateTime;
-import java.time.format.DateTimeFormatter;
 import java.util.*;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import java.util.stream.Collectors;
-import java.util.stream.Stream;
 
 /**
  * <p>
@@ -93,7 +83,7 @@ public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements Ta
     private BusinessOpportunityMapper businessOpportunityMapper;
 
     @Resource
-    private OrderMapper orderMapper;
+    private SalesOrderMapper salesOrderMapper;
 
     @Resource
     private ClueMapper clueMapper;
@@ -328,7 +318,7 @@ public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements Ta
             List<Custom> customList=customMapper.selectList(new LambdaQueryWrapper<Custom>().eq(Custom::getCompanyId, user.getCompanyId()).eq(Custom::getIsDelete,0));
             List<BusinessOpportunity> opportunityList = businessOpportunityMapper.selectList(new LambdaQueryWrapper<BusinessOpportunity>()
                     .eq(BusinessOpportunity::getCompanyId, user.getCompanyId()).eq(BusinessOpportunity::getIsDelete, 0));
-            List<Order> orderList = orderMapper.getList(user);
+            List<SalesOrder> orderList = salesOrderMapper.getList(user);
              List<Clue> clueList = clueMapper.selectList(new LambdaQueryWrapper<Clue>().eq(Clue::getCompanyId, user.getCompanyId()).eq(Clue::getIsDelete, 0).orderByDesc(Clue::getCreateTime));
             for (int rowIndex = 1; rowIndex <= rowNum; rowIndex++) {
                 HSSFRow row = sheet.getRow(rowIndex);
@@ -578,11 +568,11 @@ public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements Ta
                     if (modelName.equals("orderId")){
                         if(cell!=null&&!StringUtils.isEmpty(cell.getStringCellValue())){
                             String orderName = cell.getStringCellValue();
-                            List<Order> collect = orderList.stream().filter(order -> orderName.equals(order.getOrderName())).collect(Collectors.toList());
+                            List<SalesOrder> collect = orderList.stream().filter(order -> orderName.equals(order.getOrderName())).collect(Collectors.toList());
                             if (collect.size()>1){
                                 throw new Exception("["+orderName+"]对应的销售订单存在多个");
                             }else if (collect.size()==1) {
-                                Order order=collect.get(0);
+                                SalesOrder order=collect.get(0);
                                 if (task.getContactsId()!=null){
                                     if (!order.getContactsId().equals(task.getContactsId())){
                                         throw new Exception("["+orderName+"]对应的销售订单没有对应填写的联系人");

+ 25 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/resources/mapper/AttachmentCenterMapper.xml

@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.management.platform.mapper.AttachmentCenterMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.management.platform.entity.AttachmentCenter">
+        <id column="id" property="id" />
+        <result column="attachment_name" property="attachmentName" />
+        <result column="server_name" property="serverName" />
+        <result column="url" property="url" />
+        <result column="creator_id" property="creatorId" />
+        <result column="creator_name" property="creatorName" />
+        <result column="indate" property="indate" />
+        <result column="module_id" property="moduleId" />
+        <result column="module_code" property="moduleCode" />
+        <result column="size" property="size" />
+        <result column="attachment_type" property="attachmentType" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, attachment_name, server_name, url, creator_id, creator_name, indate, module_id, module_code, size, attachment_type
+    </sql>
+
+</mapper>

+ 21 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/resources/mapper/AuditLogCenterMapper.xml

@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.management.platform.mapper.AuditLogCenterMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.management.platform.entity.AuditLogCenter">
+        <id column="id" property="id" />
+        <result column="module_id" property="moduleId" />
+        <result column="module_code" property="moduleCode" />
+        <result column="audit_time" property="auditTime" />
+        <result column="auditor_id" property="auditorId" />
+        <result column="auditor_name" property="auditorName" />
+        <result column="auditor_content" property="auditorContent" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, module_id, module_code, audit_time, auditor_id, auditor_name, auditor_content
+    </sql>
+
+</mapper>

+ 2 - 1
fhKeeper/formulahousekeeper/management-crm/src/main/resources/mapper/ProductMapper.xml

@@ -22,11 +22,12 @@
         <result column="plate4" property="plate4" />
         <result column="plate5" property="plate5" />
         <result column="descs" property="descs" />
+        <result column="is_delete" property="isDelete" />
     </resultMap>
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        id, company_id, product_name, product_code, type, unit, price, inventory, status, incharger_id, create_time, creator_id, plate1, plate2, plate3, plate4, plate5, descs
+        id, company_id, product_name, product_code, type, unit, price, inventory, status, incharger_id, create_time, creator_id, plate1, plate2, plate3, plate4, plate5, descs, is_delete
     </sql>
 
 </mapper>

+ 2 - 2
fhKeeper/formulahousekeeper/management-crm/src/main/resources/mapper/OrderMapper.xml

@@ -1,9 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-<mapper namespace="com.management.platform.mapper.OrderMapper">
+<mapper namespace="com.management.platform.mapper.SalesOrderMapper">
 
     <!-- 通用查询映射结果 -->
-    <resultMap id="BaseResultMap" type="com.management.platform.entity.Order">
+    <resultMap id="BaseResultMap" type="com.management.platform.entity.SalesOrder">
         <id column="id" property="id" />
         <result column="company_id" property="companyId" />
         <result column="order_name" property="orderName" />

+ 153 - 120
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/FeishuInfoController.java

@@ -11,10 +11,7 @@ import com.management.platform.constant.Constant;
 import com.management.platform.entity.*;
 import com.management.platform.entity.vo.UserVO;
 import com.management.platform.mapper.*;
-import com.management.platform.service.DepartmentOtherManagerService;
-import com.management.platform.service.FeishuInfoService;
-import com.management.platform.service.SysRoleService;
-import com.management.platform.service.UserService;
+import com.management.platform.service.*;
 import com.management.platform.service.impl.FeishuInfoServiceImpl;
 import com.management.platform.util.*;
 import com.taobao.api.ApiException;
@@ -22,6 +19,7 @@ import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.http.*;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.StringUtils;
 import org.springframework.web.bind.annotation.*;
 
@@ -67,8 +65,12 @@ public class FeishuInfoController {
     @Resource
     private DepartmentFeishuMapper departmentFeishuMapper;
     @Resource
+    private DepartmentFeishuService departmentFeishuService;
+    @Resource
     private DepartmentMapper departmentMapper;
     @Resource
+    private DepartmentService departmentService;
+    @Resource
     private SysRoleMapper sysRoleMapper;
     @Resource
     private UserService userService;
@@ -644,6 +646,7 @@ public class FeishuInfoController {
         if(feishuInfoList.size()>0){
             FeishuInfo feishuInfo = feishuInfoList.get(0);
             List<User> allUserList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", feishuInfo.getCompanyId()));
+            List<Department> allDepartmentList = departmentMapper.selectList(new LambdaQueryWrapper<Department>().eq(Department::getCompanyId, feishuInfo.getCompanyId()));
             SysRole role = sysRoleMapper.selectOne(new QueryWrapper<SysRole>().eq("company_id",feishuInfo.getCompanyId()).eq("rolename","普通员工"));
             //通讯录权限范围变更
             //todo:新增的
@@ -655,9 +658,11 @@ public class FeishuInfoController {
                 allNeedTodo.addAll(departmentArray);
                 for (int i = 0; i < departmentArray.size(); i++) {
                     JSONObject ob = departmentArray.getJSONObject(i);
-                    JSONArray jsonArray = getSubDepartmentList(feishuInfo, ob.getString("open_department_id"));
-                    if(jsonArray!=null&&jsonArray.size()>0){
-                        allNeedTodo.addAll(jsonArray);
+                    if(ob.getString("open_department_id")!=null){
+                        JSONArray jsonArray = getSubDepartmentList(feishuInfo, ob.getString("open_department_id"));
+                        if(jsonArray!=null&&jsonArray.size()>0){
+                            allNeedTodo.addAll(jsonArray);
+                        }
                     }
                 }
                 List<Department> departmentList=new ArrayList<>();
@@ -670,8 +675,7 @@ public class FeishuInfoController {
                     String openDepartmentId = String.valueOf(ob.getString("open_department_id"));
                     String departmentParentId =String.valueOf(ob.getString("parent_department_id"));
                     JSONArray leaders = ob.getJSONArray("leaders");
-                    Integer cut = departmentFeishuMapper.selectCount(new QueryWrapper<DepartmentFeishu>().eq("corpid",feishuInfo.getCorpid()).eq("feishu_deptid",departmentId));
-                    if(cut==0&&!departmentId.equals("0")){
+                    if(!departmentId.equals("0")){
                         System.out.println("join===========");
                         DepartmentFeishu departmentFeishu=new DepartmentFeishu();
                         departmentFeishu.setCorpid(feishuInfo.getCorpid())
@@ -683,7 +687,11 @@ public class FeishuInfoController {
                         department.setCompanyId(feishuInfo.getCompanyId());
                         department.setDepartmentName(departmentName);
                         department.setFeishuDeptid(openDepartmentId);
-                        departmentMapper.insert(department);
+                        Optional<Department> optional = allDepartmentList.stream().filter(a -> a.getFeishuDeptid().equals(openDepartmentId)).findFirst();
+                        if(optional.isPresent()){
+                            department.setDepartmentId(optional.get().getDepartmentId());
+                        }
+                        departmentService.saveOrUpdate(department);
                         List<DepartmentOtherManager> odList=new ArrayList<>();
                         if(leaders!=null&&leaders.size()>0){
                             //todo:处理主要负责人
@@ -741,65 +749,70 @@ public class FeishuInfoController {
                         JSONObject userJson = userInfoWithDepartment.getJSONObject(m);
                         String curUserid = userJson.getString("user_id");
                         String openUserid = userJson.getString("open_id");
-                        if(!userJson.getJSONObject("status").getBoolean("is_activated")){
-                            continue;
-                        }
                         List<String> departments = (List<String>) userJson.get("department_ids");
                         System.out.println("user info======:"+userJson.toString());
-                        boolean b = allUserList.stream().anyMatch(al -> al.getFeishuUserid() != null && al.getFeishuUserid().equals(userJson.getString("open_id")));
-                        if(!b){
-                            //不存在的人员, 进行插入
-                            User user = new User();
-                            //在当前部门下的员工
-                            user.setId(SnowFlake.nextId()+"")
-                                    .setRoleId(role.getId())//默认普通员工
-                                    .setRoleName(role.getRolename())
-                                    .setCompanyId(feishuInfo.getCompanyId())
-                                    .setName(userJson.getString("name"))
-                                    .setFeishuUserid(openUserid)
-                                    .setColor(ColorUtil.randomColor())
-                                    .setJobNumber(curUserid)
-                                    .setPassword(MD5Util.getPassword("000000"))
-                                    .setFeishuDeptid(departmentFeishu.getFeishuDeptid());
-                            String max = departments.get(0);
-                            Optional<DepartmentFeishu> dpFs = departmentFeishuList.stream().filter(dl -> dl.getFeishuOpenDeptid().equals(max)).findFirst();
-                            if(dpFs.isPresent()){
-                                Optional<Department> dp = departmentList.stream().filter(dl -> dl.getDepartmentId().equals(dpFs.get().getSysDeptid())).findFirst();
-                                if(dp.isPresent()){
-                                    user.setDepartmentName(dp.get().getDepartmentName());
-                                    user.setDepartmentId(dp.get().getDepartmentId());
-                                    user.setDepartmentCascade(convertDepartmentIdToCascade(dp.get().getDepartmentId(),departmentList));
-                                }
-                            }
-                            boolean c = newUserList.stream().anyMatch(ul ->ul.getFeishuUserid()!=null&&ul.getFeishuUserid().equals(user.getFeishuUserid()));
-                            if(!c){
-                                newUserList.add(user);
+                        Optional<User> optional = allUserList.stream().filter(al -> al.getFeishuUserid() != null && al.getFeishuUserid().equals(userJson.getString("open_id"))).findFirst();
+                        //不存在的人员, 进行插入
+                        User user = new User();
+                        //在当前部门下的员工
+                        if(optional.isPresent()){
+                            user.setId(optional.get().getId());
+                        }else {
+                            user.setId(SnowFlake.nextId()+"");
+                        }
+                        user.setRoleId(role.getId())//默认普通员工
+                                .setRoleName(role.getRolename())
+                                .setCompanyId(feishuInfo.getCompanyId())
+                                .setName(userJson.getString("name"))
+                                .setFeishuUserid(openUserid)
+                                .setColor(ColorUtil.randomColor())
+                                .setJobNumber(curUserid)
+                                .setPassword(MD5Util.getPassword("000000"))
+                                .setFeishuDeptid(departmentFeishu.getFeishuDeptid())
+                                .setIsActive(userJson.getJSONObject("status").getBoolean("is_activated")?1:0);
+                        String max = departments.get(0);
+                        Optional<DepartmentFeishu> dpFs = departmentFeishuList.stream().filter(dl -> dl.getFeishuOpenDeptid().equals(max)).findFirst();
+                        if(dpFs.isPresent()){
+                            Optional<Department> dp = departmentList.stream().filter(dl -> dl.getDepartmentId().equals(dpFs.get().getSysDeptid())).findFirst();
+                            if(dp.isPresent()){
+                                user.setDepartmentName(dp.get().getDepartmentName());
+                                user.setDepartmentId(dp.get().getDepartmentId());
+                                user.setDepartmentCascade(convertDepartmentIdToCascade(dp.get().getDepartmentId(),departmentList));
                             }
                         }
+                        boolean c = newUserList.stream().anyMatch(ul ->ul.getFeishuUserid()!=null&&ul.getFeishuUserid().equals(user.getFeishuUserid()));
+                        if(!c){
+                            newUserList.add(user);
+                        }
                     }
                 }
                 //todo:处理人员
                 JSONArray userArrays = addedOb.getJSONArray("users");
                 if(userArrays!=null&&userArrays.size()>0){
                     for (int i = 0; i < userArrays.size(); i++) {
-                        JSONObject userOb = userArrays.getJSONObject(i);
-                        boolean b = allUserList.stream().anyMatch(al -> al.getFeishuUserid() != null && al.getFeishuUserid().equals(userOb.getString("open_id")));
-                        if(!b){
-                            //不存在的人员, 进行插入
-                            User user = new User();
-                            user.setId(SnowFlake.nextId()+"")
-                                    .setRoleId(role.getId())//默认普通员工
-                                    .setRoleName(role.getRolename())
-                                    .setCompanyId(feishuInfo.getCompanyId())
-                                    .setName(userOb.getString("name"))
-                                    .setFeishuUserid(userOb.getString("open_id"))
-                                    .setColor(ColorUtil.randomColor())
-                                    .setJobNumber(userOb.getString("user_id"))
-                                    .setPassword(MD5Util.getPassword("000000"));
-                            boolean c = newUserList.stream().anyMatch(ul ->ul.getFeishuUserid()!=null&&ul.getFeishuUserid().equals(user.getFeishuUserid()));
-                            if(!c){
-                                newUserList.add(user);
-                            }
+                        String uid = userArrays.getString(i);
+                        Optional<User> optional = allUserList.stream().filter(al -> al.getFeishuUserid() != null && al.getFeishuUserid().equals(uid)).findFirst();
+                        //不存在的人员, 进行插入
+                        User user = new User();
+                        //在当前部门下的员工
+                        if(optional.isPresent()){
+                            user.setId(optional.get().getId());
+                        }else {
+                            user.setId(SnowFlake.nextId()+"");
+                        }
+                        JSONObject userOb = feishuInfoService.getUserInfo(feishuInfo, uid);
+                        user.setRoleId(role.getId())
+                                .setRoleId(role.getId())//默认普通员工
+                                .setRoleName(role.getRolename())
+                                .setCompanyId(feishuInfo.getCompanyId())
+                                .setName(userOb.getString("name"))
+                                .setFeishuUserid(userOb.getString("open_id"))
+                                .setColor(ColorUtil.randomColor())
+                                .setJobNumber(userOb.getString("user_id"))
+                                .setPassword(MD5Util.getPassword("000000"));
+                        boolean c = newUserList.stream().anyMatch(ul ->ul.getFeishuUserid()!=null&&ul.getFeishuUserid().equals(user.getFeishuUserid()));
+                        if(!c){
+                            newUserList.add(user);
                         }
                     }
                 }
@@ -815,10 +828,12 @@ public class FeishuInfoController {
     }
 
     @RequestMapping("/getFeishuMembsFromPlatform")
+    @Transactional(rollbackFor = Exception.class)
     public HttpRespMsg getFeishuMembsFromPlatform(HttpServletRequest request){
         HttpRespMsg msg=new HttpRespMsg();
         Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
         FeishuInfo feishuInfo = feishuInfoMapper.selectOne(new LambdaQueryWrapper<FeishuInfo>().eq(FeishuInfo::getCompanyId, companyId));
+        List<Department> allDepartmentList = departmentMapper.selectList(new LambdaQueryWrapper<Department>().eq(Department::getCompanyId, companyId));
         List<User> allUserList = userMapper.selectList(new LambdaQueryWrapper<User>().eq(User::getCompanyId, companyId));
         String corpId = feishuInfo.getCorpid();
         if(feishuInfo==null){
@@ -845,13 +860,16 @@ public class FeishuInfoController {
         JSONArray departmentArray = departmentInfoArrays;
         JSONArray allNeedTodo=new JSONArray();
         allNeedTodo.addAll(departmentArray);
-        for (int i = 0; i < departmentArray.size(); i++) {
-            JSONObject ob = departmentArray.getJSONObject(i);
-            JSONArray jsonArray = getSubDepartmentList(feishuInfo, ob.getString("open_department_id"));
-            if(jsonArray!=null&&jsonArray.size()>0){
-                allNeedTodo.addAll(jsonArray);
-            }
-        }
+//        for (int i = 0; i < departmentArray.size(); i++) {
+//            JSONObject ob = departmentArray.getJSONObject(i);
+//            System.out.println("ob对象数据"+ob.toJSONString());
+//            if(ob.getString("open_department_id")!=null){
+//                JSONArray jsonArray = getSubDepartmentList(feishuInfo, ob.getString("open_department_id"));
+//                if(jsonArray!=null&&jsonArray.size()>0){
+//                    allNeedTodo.addAll(jsonArray);
+//                }
+//            }
+//        }
         List<Department> departmentList=new ArrayList<>();
         List<DepartmentFeishu> departmentFeishuList=new ArrayList<>();
         for (int j = 0; j < allNeedTodo.size(); j++) {
@@ -862,8 +880,7 @@ public class FeishuInfoController {
             String openDepartmentId = String.valueOf(ob.getString("open_department_id"));
             String departmentParentId =String.valueOf(ob.getString("parent_department_id"));
             JSONArray leaders = ob.getJSONArray("leaders");
-            Integer cut = departmentFeishuMapper.selectCount(new QueryWrapper<DepartmentFeishu>().eq("corpid",feishuInfo.getCorpid()).eq("feishu_deptid",departmentId));
-            if(cut==0&&!departmentId.equals("0")){
+            if(!departmentId.equals("0")){
                 System.out.println("join===========");
                 DepartmentFeishu departmentFeishu=new DepartmentFeishu();
                 departmentFeishu.setCorpid(feishuInfo.getCorpid())
@@ -875,7 +892,11 @@ public class FeishuInfoController {
                 department.setCompanyId(feishuInfo.getCompanyId());
                 department.setDepartmentName(departmentName);
                 department.setFeishuDeptid(openDepartmentId);
-                departmentMapper.insert(department);
+                Optional<Department> optional = allDepartmentList.stream().filter(a -> a.getFeishuDeptid().equals(openDepartmentId)).findFirst();
+                if(optional.isPresent()){
+                    department.setDepartmentId(optional.get().getDepartmentId());
+                }
+                departmentService.saveOrUpdate(department);
                 List<DepartmentOtherManager> odList=new ArrayList<>();
                 if(leaders!=null&&leaders.size()>0){
                     //todo:处理主要负责人
@@ -908,12 +929,17 @@ public class FeishuInfoController {
                 departmentMapper.updateById(department);
                 departmentList.add(department);
                 departmentFeishu.setSysDeptid(department.getDepartmentId());
-                departmentFeishuMapper.insert(departmentFeishu);
+                DepartmentFeishu feishu = departmentFeishuMapper.selectOne(new LambdaQueryWrapper<DepartmentFeishu>().eq(DepartmentFeishu::getFeishuOpenDeptid, departmentFeishu.getFeishuOpenDeptid()));
+                if(feishu!=null){
+                    departmentFeishu.setId(feishu.getId());
+                }
+                departmentFeishuService.saveOrUpdate(departmentFeishu);
                 departmentFeishuList.add(departmentFeishu);
                 departmentOtherManagerService.saveBatch(odList);
             }
         }
         List<User> newUserList=new ArrayList<>();
+        System.out.println("departmentFeishuList========"+departmentFeishuList.toString());
         for (DepartmentFeishu departmentFeishu : departmentFeishuList) {
             Optional<Department> first = departmentList.stream().filter(dl -> dl.getDepartmentId().equals(departmentFeishu.getSysDeptid())).findFirst();
             //获取到当前部门的上级部门
@@ -929,45 +955,48 @@ public class FeishuInfoController {
             }
             //处理部门下的人员
             JSONArray userInfoWithDepartment=feishuInfoService.getUserInfoWithDepartment(feishuInfo,departmentFeishu.getFeishuOpenDeptid(),null);
+            System.out.println("userInfoWithDepartment=========="+userInfoWithDepartment.toJSONString());
             for (int m=0;m<userInfoWithDepartment.size(); m++) {
                 JSONObject userJson = userInfoWithDepartment.getJSONObject(m);
                 String curUserid = userJson.getString("user_id");
                 String openUserid = userJson.getString("open_id");
-                if(!userJson.getJSONObject("status").getBoolean("is_activated")){
-                    continue;
-                }
                 List<String> departments = (List<String>) userJson.get("department_ids");
                 System.out.println("user info======:"+userJson.toString());
-                boolean b = allUserList.stream().anyMatch(al -> al.getFeishuUserid() != null && al.getFeishuUserid().equals(userJson.getString("open_id")));
-                if(!b){
-                    //不存在的人员, 进行插入
-                    User user = new User();
-                    //在当前部门下的员工
-                    user.setId(SnowFlake.nextId()+"")
-                            .setRoleId(role.getId())//默认普通员工
-                            .setRoleName(role.getRolename())
-                            .setCompanyId(feishuInfo.getCompanyId())
-                            .setName(userJson.getString("name"))
-                            .setFeishuUserid(openUserid)
-                            .setColor(ColorUtil.randomColor())
-                            .setJobNumber(curUserid)
-                            .setPassword(MD5Util.getPassword("000000"))
-                            .setFeishuDeptid(departmentFeishu.getFeishuDeptid());
-                    String max = departments.get(0);
-                    Optional<DepartmentFeishu> dpFs = departmentFeishuList.stream().filter(dl -> dl.getFeishuOpenDeptid().equals(max)).findFirst();
-                    if(dpFs.isPresent()){
-                        Optional<Department> dp = departmentList.stream().filter(dl -> dl.getDepartmentId().equals(dpFs.get().getSysDeptid())).findFirst();
-                        if(dp.isPresent()){
-                            user.setDepartmentName(dp.get().getDepartmentName());
-                            user.setDepartmentId(dp.get().getDepartmentId());
-                            user.setDepartmentCascade(convertDepartmentIdToCascade(dp.get().getDepartmentId(),departmentList));
-                        }
-                    }
-                    boolean c = newUserList.stream().anyMatch(ul ->ul.getFeishuUserid()!=null&&ul.getFeishuUserid().equals(user.getFeishuUserid()));
-                    if(!c){
-                        newUserList.add(user);
+                Optional<User> optional = allUserList.stream().filter(al -> al.getFeishuUserid() != null && al.getFeishuUserid().equals(userJson.getString("open_id"))).findFirst();
+                //不存在的人员, 进行插入
+                User user = new User();
+                //在当前部门下的员工
+                if(optional.isPresent()){
+                    user.setId(optional.get().getId());
+                }else {
+                    user.setId(SnowFlake.nextId()+"");
+                }
+                user.setRoleId(role.getId())//默认普通员工
+                        .setRoleName(role.getRolename())
+                        .setCompanyId(feishuInfo.getCompanyId())
+                        .setName(userJson.getString("name"))
+                        .setFeishuUserid(openUserid)
+                        .setColor(ColorUtil.randomColor())
+                        .setJobNumber(curUserid)
+                        .setPassword(MD5Util.getPassword("000000"))
+                        .setFeishuDeptid(departmentFeishu.getFeishuDeptid())
+                        .setIsActive(userJson.getJSONObject("status").getBoolean("is_activated")?1:0);
+                String max = departments.get(0);
+                System.out.println("maxDept====="+max);
+                Optional<DepartmentFeishu> dpFs = departmentFeishuList.stream().filter(dl -> dl.getFeishuOpenDeptid().equals(max)).findFirst();
+                if(dpFs.isPresent()){
+                    Optional<Department> dp = departmentList.stream().filter(dl -> dl.getDepartmentId().equals(dpFs.get().getSysDeptid())).findFirst();
+                    if(dp.isPresent()){
+                        System.out.println("Set Dept");
+                        user.setDepartmentName(dp.get().getDepartmentName());
+                        user.setDepartmentId(dp.get().getDepartmentId());
+                        user.setDepartmentCascade(convertDepartmentIdToCascade(dp.get().getDepartmentId(),departmentList));
                     }
                 }
+                boolean c = newUserList.stream().anyMatch(ul ->ul.getFeishuUserid()!=null&&ul.getFeishuUserid().equals(user.getFeishuUserid()));
+                if(!c){
+                    newUserList.add(user);
+                }
             }
         }
         //todo:处理人员
@@ -977,29 +1006,33 @@ public class FeishuInfoController {
         if(userArrays!=null&&userArrays.size()>0){
             for (int i = 0; i < userArrays.size(); i++) {
                 String uid = userArrays.getString(i);
-                boolean b = allUserList.stream().anyMatch(al -> al.getFeishuUserid() != null && al.getFeishuUserid().equals(uid));
-                if(!b){
-                    //不存在的人员, 进行插入
-                    User user = new User();
-                    JSONObject userOb = feishuInfoService.getUserInfo(feishuInfo, uid);
-                    user.setId(SnowFlake.nextId()+"")
-                            .setRoleId(role.getId())//默认普通员工
-                            .setRoleName(role.getRolename())
-                            .setCompanyId(feishuInfo.getCompanyId())
-                            .setName(userOb.getString("name"))
-                            .setFeishuUserid(userOb.getString("open_id"))
-                            .setColor(ColorUtil.randomColor())
-                            .setJobNumber(userOb.getString("user_id"))
-                            .setPassword(MD5Util.getPassword("000000"));
-                    boolean c = newUserList.stream().anyMatch(ul ->ul.getFeishuUserid()!=null&&ul.getFeishuUserid().equals(user.getFeishuUserid()));
-                    if(!c){
-                        newUserList.add(user);
-                    }
+                Optional<User> optional = allUserList.stream().filter(al -> al.getFeishuUserid() != null && al.getFeishuUserid().equals(uid)).findFirst();
+                //不存在的人员, 进行插入
+                User user = new User();
+                //在当前部门下的员工
+                if(optional.isPresent()){
+                    user.setId(optional.get().getId());
+                }else {
+                    user.setId(SnowFlake.nextId()+"");
+                }
+                JSONObject userOb = feishuInfoService.getUserInfo(feishuInfo, uid);
+                user.setRoleId(role.getId())
+                        .setRoleId(role.getId())//默认普通员工
+                        .setRoleName(role.getRolename())
+                        .setCompanyId(feishuInfo.getCompanyId())
+                        .setName(userOb.getString("name"))
+                        .setFeishuUserid(userOb.getString("open_id"))
+                        .setColor(ColorUtil.randomColor())
+                        .setJobNumber(userOb.getString("user_id"))
+                        .setPassword(MD5Util.getPassword("000000"));
+                boolean c = newUserList.stream().anyMatch(ul ->ul.getFeishuUserid()!=null&&ul.getFeishuUserid().equals(user.getFeishuUserid()));
+                if(!c){
+                    newUserList.add(user);
                 }
             }
         }
         if(newUserList.size()>0){
-            userService.saveBatch(newUserList);
+            userService.saveOrUpdateBatch(newUserList);
         }
         return msg;
     }

+ 4 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/HolidaySettingController.java

@@ -61,6 +61,10 @@ public class HolidaySettingController {
             return msg;
         }
         holidaySetting.setCompanyId(companyId);
+        if(holidaySetting.getRangeType()==0){
+            holidaySetting.setTargetUsers("");
+            holidaySetting.setTargetDepts("");
+        }
         if(!holidaySettingService.saveOrUpdate(holidaySetting)){
             msg.setError("验证失败");
         }

+ 17 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/UserWithBeisenController.java

@@ -11,6 +11,7 @@ import com.management.platform.mapper.TimeTypeMapper;
 import com.management.platform.mapper.UserMapper;
 import com.management.platform.mapper.UserWithBeisenMapper;
 import com.management.platform.service.UserFvTimeService;
+import com.management.platform.service.UserService;
 import com.management.platform.service.UserWithBeisenService;
 import com.management.platform.util.BeiSenUtils;
 import com.management.platform.util.HttpRespMsg;
@@ -59,11 +60,14 @@ public class UserWithBeisenController {
     private UserFvTimeService userFvTimeService;
     @Resource
     private TimeTypeMapper timeTypeMapper;
+    @Resource
+    private UserService userService;
 
     @RequestMapping("/getByTimeWindow")
     public HttpRespMsg getByTimeWindow(String startTime,String stopTime){
         HttpRespMsg httpRespMsg=new HttpRespMsg();
         Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
+        List<User> userList = userMapper.selectList(new LambdaQueryWrapper<User>().eq(User::getCompanyId, companyId));
         BeisenConfig beisenConfig = beisenConfigMapper.selectById(companyId);
         if(beisenConfig==null){
             httpRespMsg.setError("北森基础数据配置未完成,请联系服务商完成配置");
@@ -71,6 +75,8 @@ public class UserWithBeisenController {
         }
         List<UserWithBeisen> allBeisenList = userWithBeisenService.list(new LambdaQueryWrapper<UserWithBeisen>().eq(UserWithBeisen::getCompanyId, companyId));
         List<UserWithBeisen> userWithBeisenList=new ArrayList<>();
+        //更新电话到工时
+        List<User> needUpdateUsers=new ArrayList<>();
         List<JSONArray> byTimeWindow = BeiSenUtils.getByTimeWindow("",startTime,stopTime,companyId,beisenConfig.getAppKey(),beisenConfig.getAppSecret());
         for (JSONArray array : byTimeWindow) {
             for (int i = 0; i < array.size(); i++) {
@@ -95,6 +101,14 @@ public class UserWithBeisenController {
                     continue;
                 }
                 userWithBeisenList.add(userWithBeisen);
+                Optional<User> user = userList.stream().filter(u ->u.getJobNumber()!=null&&u.getJobNumber().equals(userWithBeisen.getJobNumber())).findFirst();
+                if(user.isPresent()){
+                    User u=new User();
+                    u.setId(user.get().getId());
+                    u.setPhone(userWithBeisen.getMobilePhone());
+                    u.setJobNumber(userWithBeisen.getJobNumber());
+                    needUpdateUsers.add(u);
+                }
             }
         }
         if(userWithBeisenList.size()>0){
@@ -103,6 +117,9 @@ public class UserWithBeisenController {
                 return httpRespMsg;
             }
         }
+        if(needUpdateUsers.size()>0){
+            userService.updateBatchById(needUpdateUsers);
+        }
         return httpRespMsg;
     }
 

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

@@ -7,6 +7,7 @@ public class UserMonthWork {
     public String userId;
     public String name;
     public String departmentName;
+    public String deptId;
     public String inactiveDate;
     public String corpwxUserId;
     public String corpwxDeptId;

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

@@ -146,9 +146,7 @@ public class ExpenseSheetServiceImpl extends ServiceImpl<ExpenseSheetMapper, Exp
                     //项目经理审核,默认为待审核状态
                     sheet.setStatus(1);
                 }else if (auditSetting.getAuditType() == 2) {
-                    if (sheet.getStatus() == null) {
-                        sheet.setStatus(1);//默认提交时为待审核状态
-                    }
+                    sheet.setStatus(1);//修改为待审核状态
                 }
             }
         }

+ 3 - 2
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/FeishuInfoServiceImpl.java

@@ -178,7 +178,7 @@ public class FeishuInfoServiceImpl extends ServiceImpl<FeishuInfoMapper, FeishuI
                 Map resultMap=new HashMap();
                 JSONArray departmentResult=new JSONArray();
                 JSONArray userResult=new JSONArray();
-                String url = GET_AVAILABLE_RANGE;
+                String url = GET_AVAILABLE_RANGE+"?page_size={page_size}";
                 HttpHeaders headers = new HttpHeaders();
                 RestTemplate restTemplate = new RestTemplate();
                 MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8");
@@ -191,8 +191,9 @@ public class FeishuInfoServiceImpl extends ServiceImpl<FeishuInfoMapper, FeishuI
                 map.put("page_token",null);
                 if(pageToken!=null){
                         map.put("page_token",pageToken);
+                        url+="&page_token={page_token}";
                 }
-                ResponseEntity<String> ResponseEntity = restTemplate.exchange(url+"?page_size={page_size}&page_token={page_token}",HttpMethod.GET,httpEntity,String.class,map);
+                ResponseEntity<String> ResponseEntity = restTemplate.exchange(url,HttpMethod.GET,httpEntity,String.class,map);
                 if (ResponseEntity.getStatusCode() == HttpStatus.OK) {
                         String resp = ResponseEntity.getBody();
                         JSONObject respJson = JSONObject.parseObject(resp);

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

@@ -8108,7 +8108,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         List<SysRichFunction> functionAllList = sysFunctionMapper.getRoleFunctions(targetUser.getRoleId(), "全公司填报及时率");
         List<SysRichFunction> functionDeptList = sysFunctionMapper.getRoleFunctions(targetUser.getRoleId(), "负责部门填报及时率");
         //获取到公司设置的特殊节假日设置
-        List<HolidaySetting> holidaySettingList = holidaySettingService.list(new LambdaQueryWrapper<HolidaySetting>().eq(HolidaySetting::getCompanyId, targetUser.getCompanyId()));
+        List<HolidaySetting> holidaySettingList = holidaySettingService.list(new LambdaQueryWrapper<HolidaySetting>().eq(HolidaySetting::getCompanyId, targetUser.getCompanyId()).isNotNull(HolidaySetting::getHolidayDate));
         List<Integer> deptIds=new ArrayList<>();
         List<Department> allDepartmentList=departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id",targetUser.getCompanyId()));
         List<Department> userDepartmentList = departmentMapper.selectList(new QueryWrapper<Department>().eq("manager_id", targetUser.getId()).eq("company_id",targetUser.getCompanyId()));
@@ -8160,6 +8160,10 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         List<LeaveSheet> leaveSheetList = leaveSheetMapper.selectList(new LambdaQueryWrapper<LeaveSheet>()
                 .eq(LeaveSheet::getCompanyId, targetUser.getCompanyId()).le(LeaveSheet::getStartDate,endDate).ge(LeaveSheet::getEndDate,startDate));
         List<TimelinessRateVO> resultList=new ArrayList<>();
+        //针对美莱德 去除2024-02-09
+        //针对人员已经特殊节假日设置去除相对应的日期
+        List<HolidaySetting> allUsersSetting = holidaySettingList.stream().filter(h -> h.getRangeType() == 0).collect(Collectors.toList());
+        List<HolidaySetting> targetUserOrDeptSetting = holidaySettingList.stream().filter(h -> h.getRangeType() == 1).collect(Collectors.toList());
         for (User user : userList){
             LocalDateTime sDate;
             LocalDateTime eDate = LocalDate.parse(endDate).atTime(LocalTime.MIN);
@@ -8173,10 +8177,6 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                 }
             }else  sDate = LocalDate.parse(startDate).atTime(LocalTime.MIN);
             AtomicReference<List<LocalDateTime>> dateTimeList= new AtomicReference<>(getDays(sDate, eDate));
-            //针对美莱德 去除2024-02-09
-            //针对人员已经特殊节假日设置去除相对应的日期
-            List<HolidaySetting> allUsersSetting = holidaySettingList.stream().filter(h -> h.getRangeType() == 0).collect(Collectors.toList());
-            List<HolidaySetting> targetUserOrDeptSetting = holidaySettingList.stream().filter(h -> h.getRangeType() == 1).collect(Collectors.toList());
             if(allUsersSetting.size()>0){
                 List<LocalDateTime> holidayDateList = allUsersSetting.stream().map(h->h.getHolidayDate().atTime(LocalTime.MIN)).collect(Collectors.toList());
                 dateTimeList.set(dateTimeList.get().stream().filter(d -> !holidayDateList.contains(d)).collect(Collectors.toList()));
@@ -8184,15 +8184,15 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
             if(targetUserOrDeptSetting.size()>0){
                 targetUserOrDeptSetting.forEach(t->{
                     LocalDateTime holidayDate = t.getHolidayDate().atTime(LocalTime.MIN);
-                    if(!StringUtils.isEmpty(t.getTargetUsers())){
+                    if(!StringUtils.isEmpty(t.getTargetUsers())&&!t.getTargetUsers().equals("")){
                         String[] userSplit = t.getTargetUsers().split(",");
                         List<String> userAsList = Arrays.asList(userSplit);
                         if(userAsList.contains(user.getId())){
                             dateTimeList.set(dateTimeList.get().stream().filter(d -> !d.isEqual(holidayDate)).collect(Collectors.toList()));
                         }
                     }
-                    if(!StringUtils.isEmpty(t.getTargetDepts())){
-                        String[] deptSplit = t.getTargetUsers().split(",");
+                    if(!StringUtils.isEmpty(t.getTargetDepts())&&!t.getTargetDepts().equals("")){
+                        String[] deptSplit = t.getTargetDepts().split(",");
                         List<String> deptAsList = Arrays.asList(deptSplit);
                         for (String deptId : deptAsList) {
                             List<Integer> subDeptIds = getBranchDepartment(Integer.valueOf(deptId), departmentList);
@@ -8266,7 +8266,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                     if(targetUserOrDeptSetting.size()>0){
                         targetUserOrDeptSetting.forEach(t->{
                             LocalDateTime holidayDate = t.getHolidayDate().atTime(LocalTime.MIN);
-                            if(!StringUtils.isEmpty(t.getTargetUsers())){
+                            if(!StringUtils.isEmpty(t.getTargetUsers())&&!t.getTargetUsers().equals("")){
                                 String[] userSplit = t.getTargetUsers().split(",");
                                 List<String> userAsList = Arrays.asList(userSplit);
                                 if(userAsList.contains(user.getId())){
@@ -8274,8 +8274,8 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                                     list.set(list.get().stream().filter(d -> !d.isEqual(holidayDate)).collect(Collectors.toList()));
                                 }
                             }
-                            if(!StringUtils.isEmpty(t.getTargetDepts())){
-                                String[] deptSplit = t.getTargetUsers().split(",");
+                            if(!StringUtils.isEmpty(t.getTargetDepts())&&!t.getTargetDepts().equals("")){
+                                String[] deptSplit = t.getTargetDepts().split(",");
                                 List<String> deptAsList = Arrays.asList(deptSplit);
                                 for (String deptId : deptAsList) {
                                     List<Integer> subDeptIds = getBranchDepartment(Integer.valueOf(deptId), departmentList);

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

@@ -204,6 +204,8 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
     private ExcelExportService excelExportService;
     @Resource
     private ProjectMainMapper projectMainMapper;
+    @Resource
+    private HolidaySettingService holidaySettingService;
     @Autowired
     RestTemplate restTemplate;
 
@@ -4209,8 +4211,35 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
         User user = userMapper.selectById(token);
         Integer companyId = user.getCompanyId();
         Company company = companyMapper.selectById(companyId);
+        //准备部门数据
+        List<Department> departmentList = departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id", companyId));
         List<UserFvTime> userFvTimeList = userFvTimeMapper.selectList(new LambdaQueryWrapper<UserFvTime>().between(UserFvTime::getWorkDate, startDate, endDate));
         List<User> userList = userMapper.selectList(new LambdaQueryWrapper<User>().eq(User::getCompanyId, company.getId()));
+        //处理特殊节假日设置
+        //特殊节假日配置
+        List<HolidaySetting> holidaySettingList = holidaySettingService.list(new LambdaQueryWrapper<HolidaySetting>().eq(HolidaySetting::getCompanyId, companyId));
+        //针对全员生效的日期
+        List<LocalDate> holidayForAllUser = holidaySettingList.stream().filter(h -> h.getRangeType() == 0).collect(Collectors.toList()).stream().map(HolidaySetting::getHolidayDate).distinct().collect(Collectors.toList());
+        //针对指定人员的日期
+        List<LocalDate> holidayForTarget = holidaySettingList.stream().filter(h -> h.getRangeType() == 1).collect(Collectors.toList()).stream().map(HolidaySetting::getHolidayDate).distinct().collect(Collectors.toList());
+        //针对指定人员的人员已经部门
+        String userIdStr = holidaySettingList.stream().filter(f -> f.getRangeType() == 1).collect(Collectors.toList()).stream().map(HolidaySetting::getTargetUsers).collect(Collectors.joining(","));
+        String deptIdStr = holidaySettingList.stream().filter(f -> f.getRangeType() == 1).collect(Collectors.toList()).stream().map(HolidaySetting::getTargetDepts).collect(Collectors.joining(","));
+        List<Integer> targetDeptIds=new ArrayList<>();
+        if(!StringUtils.isEmpty(deptIdStr)&&!deptIdStr.equals("")){
+            String[] deptSplit = deptIdStr.split(",");
+            List<String> deptArray = Arrays.asList(deptSplit);
+            for (String deptId : deptArray) {
+                List<Integer> subDeptIds = getBranchDepartment(Integer.valueOf(deptId), departmentList);
+                targetDeptIds.add(Integer.valueOf(deptId));
+                targetDeptIds.addAll(subDeptIds);
+            }
+        }
+        List<String> targetUserIds=new ArrayList<>();
+        if(!StringUtils.isEmpty(userIdStr)&&!userIdStr.equals("")){
+            String[] userSplit = userIdStr.split(",");
+            targetUserIds = Arrays.asList(userSplit);
+        }
         List<UserCustom> userCustomList = userCustomMapper.selectList(new LambdaQueryWrapper<UserCustom>().eq(UserCustom::getCompanyId, companyId));
         DateTimeFormatter df=DateTimeFormatter.ofPattern("yyyy-MM-dd");
         //String[] weekDayCHN = {"周一","周二","周三","周四","周五","周六","周日"};
@@ -4255,8 +4284,6 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             }
         }
         List<UserMonthWork> userMonthWorks = new ArrayList<UserMonthWork>();
-        //准备部门数据
-        List<Department> departmentList = departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id", companyId));
         //获取所有同步的企业微信数据
         List<Map> userCorpwxTimeMapList = userCorpwxTimeMapper.selectByAsk(companyId,startDate,endDate);
         String lastUserId = null;
@@ -4265,6 +4292,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             String id = (String)data.get("id");
             String name = (String)data.get("name");
             String departmentName = (String) data.get("departmentName");
+            String deptId = String.valueOf(data.get("deptId"));
             String corpwxUserId = (String) data.get("corpwxUserId");
             Integer corpwxDeptId = (Integer) data.get("corpwxDeptId");
             Map<String, Object> map = new HashMap<>();
@@ -4310,6 +4338,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                 lastUserData.userId = id;
                 lastUserData.name = name;
                 lastUserData.departmentName = departmentName;
+                lastUserData.deptId = deptId;
                 lastUserData.corpwxUserId = corpwxUserId;
                 lastUserData.corpwxDeptId = String.valueOf(corpwxDeptId);
                 lastUserData.worktimeList = new ArrayList<>();
@@ -4420,6 +4449,26 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                     }
                 });
             }
+            if(worktimeList!=null&&worktimeList.size()>0){
+                Iterator<Map<String, Object>> iterator = worktimeList.iterator();
+                while (iterator.hasNext()){
+                    Map<String, Object> w = iterator.next();
+                    if(holidayForAllUser.size()>0){
+                        boolean match = holidayForAllUser.stream().anyMatch(h -> h.isEqual(LocalDate.parse(String.valueOf(w.get("createDate")), df)));
+                        if(match){
+                            iterator.remove();
+                        }
+                    }
+                    if(holidayForTarget.size()>0){
+                        boolean dayMatch = holidayForTarget.stream().anyMatch(h -> h.isEqual(LocalDate.parse(String.valueOf(w.get("createDate")), df)));
+                        if(dayMatch){
+                            if((userMonthWork.deptId!=null&&targetDeptIds.contains(Integer.valueOf(userMonthWork.deptId)))||targetUserIds.contains(userMonthWork.userId)){
+                                iterator.remove();
+                            };
+                        }
+                    }
+                }
+            }
         }
         HashMap map = new HashMap();
         List<HashMap> days = new ArrayList<HashMap>();

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

@@ -2005,7 +2005,6 @@ public class TimingTask {
         if(isDev){
             return;
         }
-        List<UserWithBeisen> allBeisenList = userWithBeisenService.list(new LambdaQueryWrapper<UserWithBeisen>().eq(UserWithBeisen::getCompanyId, 936));
         List<UserWithBeisen> userWithBeisenList=new ArrayList<>();
         LocalDate now=LocalDate.now();
         DateTimeFormatter df=DateTimeFormatter.ofPattern("yyyy-MM-dd");
@@ -2020,6 +2019,7 @@ public class TimingTask {
             if(beisenConfig!=null){
                 List<JSONArray> byTimeWindow = BeiSenUtils.getByTimeWindow("",startTime,endTime,beisenConfig.getCompanyId(),beisenConfig.getAppKey(),beisenConfig.getAppSecret());
                 List<User> userList = userMapper.selectList(new LambdaQueryWrapper<User>().eq(User::getCompanyId, beisenConfig.getCompanyId()));
+                List<UserWithBeisen> allBeisenList = userWithBeisenService.list(new LambdaQueryWrapper<UserWithBeisen>().eq(UserWithBeisen::getCompanyId, beisenConfig.getCompanyId()));
                 if(byTimeWindow.size()>0){
                     for (JSONArray array : byTimeWindow) {
                         for (int i = 0; i < array.size(); i++) {
@@ -2037,7 +2037,7 @@ public class TimingTask {
                                 userWithBeisen.setId(first.get().getId());
                             }
                             userWithBeisenList.add(userWithBeisen);
-                            Optional<User> user = userList.stream().filter(u -> u.getJobNumber().equals(userWithBeisen.getJobNumber())).findFirst();
+                            Optional<User> user = userList.stream().filter(u ->u.getJobNumber()!=null&&u.getJobNumber().equals(userWithBeisen.getJobNumber())).findFirst();
                             if(user.isPresent()){
                                 User u=new User();
                                 u.setId(user.get().getId());

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

@@ -879,7 +879,7 @@
         WHERE r.create_date BETWEEN #{startDate} AND #{endDate} AND r.creator_id = #{userId} GROUP BY r.create_date
     </select>
     <select id="getUserDailyWorkTime" resultType="java.util.Map">
-        SELECT user.id, user.name,department.department_name as departmentName,department.corpwx_deptid as corpwxDeptId, report.create_date as createDate, sum(working_time) as workingTime,user.inactive_date as inactiveDate,user.corpwx_userid as corpwxUserId
+        SELECT user.id, user.name,department.department_name as departmentName,department.department_id as deptId,department.corpwx_deptid as corpwxDeptId, report.create_date as createDate, sum(working_time) as workingTime,user.inactive_date as inactiveDate,user.corpwx_userid as corpwxUserId
         FROM user
         left join report on user.id = report.creator_id
         left join department on department.department_id = user.department_id

+ 7 - 1
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java

@@ -134,6 +134,10 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
     @Value(value = "${upload.path}")
     private String path;
 
+
+    public static final Object locker = new Object();
+    public static int times = 0;
+
     @Override
     public synchronized HttpRespMsg submitReport(Report report, HttpServletRequest request) {
         HttpRespMsg httpRespMsg = new HttpRespMsg();
@@ -162,6 +166,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
 
         //检查当天该员工的该工序是否已经有报工
         Report todayReport = reportMapper.selectOne(new QueryWrapper<Report>().eq("creator_id", token).eq("user_procedure_team_id", report.getUserProcedureTeamId()).eq("create_date", targetDate));
+        System.out.println(LocalDateTime.now().toString()+", 读取Report 是否为Null = "+todayReport == null);
         //计算工作时长
         ProdProcedureTeam prodProcedureTeam = prodProcedureTeamMapper.selectById(report.getUserProcedureTeamId());
         //总计划任务的工序中有总工时和总工价
@@ -214,6 +219,8 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
 
         if (todayReport == null) {
             reportMapper.insert(report);
+            log.debug("插入Report, ===id=="+report.getId()+"=="+report.getCreatorId()+" "+report.getCreateDate());
+            System.out.println(LocalDateTime.now().toString()+" 插入Report, ===id=="+report.getId()+"=="+report.getCreatorId()+" "+report.getCreateDate());
             //处理钢印号
             if (!StringUtils.isEmpty(report.getSteelNumArray())) {
                 JSONArray array = JSONArray.parseArray(report.getSteelNumArray());
@@ -249,7 +256,6 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
         }
         planProcedureTotal.setTotalFillTime(workingTime);
         planProcedureTotal.setTotalProgress((int)((workingTime / planProcedureTotal.getTotalWorkingHours()) * 100));
-        System.out.println("planProcedureTotal.getId()=="+planProcedureTotal.getId()+"--进度 1 workingTime:"+workingTime+" totalWorkingHours:"+planProcedureTotal.getTotalWorkingHours()+" totalProgress:"+planProcedureTotal.getTotalProgress());
         planProcedureTotalMapper.updateById(planProcedureTotal);
         //检查该计划下的所有工序是否都已经完成
         List<PlanProcedureTotal> planProcedureTotalList = planProcedureTotalMapper.selectList(new QueryWrapper<PlanProcedureTotal>().eq("plan_id", planProcedureTotal.getPlanId()));

+ 14 - 0
fhKeeper/formulahousekeeper/timesheet/src/views/settings/timetype.vue

@@ -1004,6 +1004,20 @@
                     }
                     this.specialHolidaysDept = newDeptForm
                     this.specialHolidaysUser = newUserForm
+                }else{
+                    this.holidaySeetingForm.holidayDate = ""
+                    this.holidaySeetingForm.id = null
+                    this.holidaySeetingForm.rangeType = "0"
+                    let newDeptForm = {
+                        values: [],
+                        labels: []
+                    }
+                    let newUserForm = {
+                        values: [],
+                        labels: []
+                    }
+                    this.specialHolidaysDept = newDeptForm
+                    this.specialHolidaysUser = newUserForm
                 }
                 this.addHolidaySeeting = true;
             },

+ 8 - 0
fhKeeper/formulahousekeeper/timesheet/src/views/team/index.vue

@@ -2629,10 +2629,17 @@ export default {
       );
     },
     syncFeishu(){
+      const loading = this.$loading({
+          lock: true,
+          text: '同步中',
+          spinner: 'el-icon-loading',
+          background: 'rgba(0, 0, 0, 0.7)'
+        });
       this.http.post(
             "/feishu-info/getFeishuMembsFromPlatform",
             {},
             (res) => {
+              loading.close()
               if (res.code == "ok") {
                 this.$message({
                   message: '同步成功',
@@ -2646,6 +2653,7 @@ export default {
               }
             },
             (error) => {
+              loading.close()
               this.listLoading = false;
               this.$message({
                 message: error,

+ 3 - 4
fhKeeper/formulahousekeeper/timesheet/src/views/workReport/daily.vue

@@ -18,7 +18,8 @@
                                 <br>
                                 <span style="font-size:10px;text-align:center;color:#999;">{{item.weekDay}}</span>
                                 <span class="chooseDate" v-if="index == choseDay"></span>
-                                <el-tooltip v-if="item.exceedCardTime" effect="dark" content="填报时长超过北森考勤时长" placement="top-start">
+                                <!--针对景昱-->
+                                <el-tooltip v-if="user.companyId == 5978 && item.exceedCardTime == 1" effect="dark" content="填报时长异常" placement="top-start">
                                 <i class="el-icon-warning" style="color:red;"></i>
                                 </el-tooltip>
                                 </div>
@@ -4403,16 +4404,14 @@
                                 var fillInfo = null;
                                 d.state = null;
                                 this.fillStatusList.forEach(s=>{
-                                    // console.log(d)
                                     var d1 = s.createDate.split('-')[2];
                                     var d2 = d.date.split(this.$t('weekDay.month'))[1].split(this.$t('weekDay.day'))[0];
-                                    // console.log(d2, '我被执行了')
                                     if (d1.indexOf('0') == 0) {
                                         d1 = d1.substring(1,d1.length);
                                     }
-                                    
                                     if (d1 == d2) {
                                         d.state = s.state;
+                                        d.exceedCardTime = s.exceedCardTime
                                     }
                                 })
                             })