瀏覽代碼

客户管家

Min 1 年之前
父節點
當前提交
ad137b9bae
共有 23 個文件被更改,包括 1146 次插入39 次删除
  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. 97 20
      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. 86 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/AttachmentCenter.java
  6. 71 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/AuditLogCenter.java
  7. 3 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/BusinessOpportunity.java
  8. 6 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/Order.java
  9. 6 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/Product.java
  10. 16 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/mapper/AttachmentCenterMapper.java
  11. 16 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/mapper/AuditLogCenterMapper.java
  12. 16 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/mapper/ProductAuditLogMapper.java
  13. 16 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/AttachmentCenterService.java
  14. 16 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/AuditLogCenterService.java
  15. 5 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/OrderService.java
  16. 4 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/ProductService.java
  17. 20 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/AttachmentCenterServiceImpl.java
  18. 20 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/AuditLogCenterServiceImpl.java
  19. 237 3
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/OrderServiceImpl.java
  20. 46 2
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/ProductServiceImpl.java
  21. 25 0
      fhKeeper/formulahousekeeper/management-crm/src/main/resources/mapper/AttachmentCenterMapper.xml
  22. 21 0
      fhKeeper/formulahousekeeper/management-crm/src/main/resources/mapper/AuditLogCenterMapper.xml
  23. 2 1
      fhKeeper/formulahousekeeper/management-crm/src/main/resources/mapper/ProductMapper.xml

+ 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;
+    }
+
+}
+

+ 97 - 20
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/OrderController.java

@@ -3,15 +3,10 @@ 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.entity.*;
+import com.management.platform.mapper.ProductMapper;
 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.service.*;
 import com.management.platform.util.HttpRespMsg;
 import org.springframework.util.StringUtils;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -22,7 +17,10 @@ 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>
@@ -43,6 +41,12 @@ public class OrderController {
     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){
@@ -83,28 +87,101 @@ public class OrderController {
     }
 
     @RequestMapping("/delete")
-    public HttpRespMsg delete(Integer id){
+    public HttpRespMsg delete(String ids){
         HttpRespMsg msg=new HttpRespMsg();
-        Order order = orderService.getById(id);
-        order.setIsDelete(1);
-        if(!orderService.updateById(order)){
-            msg.setError("验证失败");
-            return msg;
+        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<Order> orderList = orderService.list(new LambdaQueryWrapper<Order>().in(Order::getId, idList));
+            orderList.forEach(o->{
+                o.setIsDelete(1);
+            });
+            if(!orderService.updateBatchById(orderList)){
+                msg.setError("验证失败");
+                return msg;
+            }
         }
         return msg;
     }
 
     @RequestMapping("/recover")
-    public HttpRespMsg recover(Integer id){
+    public HttpRespMsg recover(String ids){
         HttpRespMsg msg=new HttpRespMsg();
-        Order order = orderService.getById(id);
-        order.setIsDelete(0);
-        if(!orderService.updateById(order)){
-            msg.setError("验证失败");
-            return msg;
+        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<Order> orderList = orderService.list(new LambdaQueryWrapper<Order>().in(Order::getId, idList));
+            orderList.forEach(o->{
+                o.setIsDelete(0);
+            });
+            if(!orderService.updateBatchById(orderList)){
+                msg.setError("验证失败");
+                return msg;
+            }
         }
         return msg;
     }
 
+    @RequestMapping("/importData")
+    public HttpRespMsg importData(MultipartFile multipartFile){
+        return orderService.importData(multipartFile);
+    }
+
+    @RequestMapping("/exportData")
+    public HttpRespMsg exportData(String userId, String orderName,String orderCode, String productCode) throws Exception {
+        return orderService.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;
+    }
+
 }
 

+ 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 OrderService orderService;
+    @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>().eq(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<Order> orderList = orderService.list(new LambdaQueryWrapper<Order>().in(Order::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;
+    }
 }
 

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

@@ -0,0 +1,86 @@
+package com.management.platform.entity;
+
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+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-15
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+public class AttachmentCenter extends Model<AttachmentCenter> {
+
+    private static final long serialVersionUID=1L;
+
+    @TableField("id")
+    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 null;
+    }
+
+}

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

@@ -0,0 +1,71 @@
+package com.management.platform.entity;
+
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+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-15
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+public class AuditLogCenter extends Model<AuditLogCenter> {
+
+    private static final long serialVersionUID=1L;
+
+    @TableField("id")
+    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 null;
+    }
+
+}

+ 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/Order.java

@@ -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() {

+ 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;
 

+ 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> {
+
+}

+ 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> {
+
+}

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

@@ -3,6 +3,7 @@ package com.management.platform.service;
 import com.management.platform.entity.Order;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.management.platform.util.HttpRespMsg;
+import org.springframework.web.multipart.MultipartFile;
 
 /**
  * <p>
@@ -15,4 +16,8 @@ import com.management.platform.util.HttpRespMsg;
 public interface OrderService extends IService<Order> {
 
     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;
 }

+ 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);
 }

+ 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 {
+
+}

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

@@ -1,20 +1,33 @@
 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.DepartmentService;
-import com.management.platform.service.OrderService;
+import com.management.platform.service.*;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.management.platform.service.SysFunctionService;
+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.bind.annotation.RequestParam;
+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;
 
@@ -43,6 +56,14 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
     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) {
@@ -126,6 +147,219 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
         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<Order> orderList = orderMapper.selectList(new LambdaQueryWrapper<Order>().eq(Order::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<Order>  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();
+                Order order=new Order();
+                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<Order> 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<>();

+ 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<>();

+ 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">
+        <result 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">
+        <result 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>