lyhzzz 1 year ago
parent
commit
b3af5aa5a9

+ 3 - 0
src/main/java/com/fdkankan/agent/common/ResultCode.java

@@ -27,8 +27,11 @@ public enum ResultCode {
     NOT_PER(4024, "无权操作该分销商!"),
     NUM_NOT(4025, "剩余可售权益或次数不足!"),
     CAMERA_IS_GIVE(4026, "该相机已分发!"),
+    FILE_TYPE_ERROR(4027, "文件格式校验,需为xlsx文件"),
+    TEMPLATE_TYPE_ERROR(4028, "模板格式错误"),
 
     ;
+
     public int code;
     public String msg;
 

+ 49 - 6
src/main/java/com/fdkankan/agent/controller/CameraController.java

@@ -1,20 +1,33 @@
 package com.fdkankan.agent.controller;
 
 
+import com.alibaba.nacos.common.codec.Base64;
 import com.fdkankan.agent.common.BaseController;
+import com.fdkankan.agent.common.ResultCode;
 import com.fdkankan.agent.common.ResultData;
 import com.fdkankan.agent.common.util.JwtUtil;
 import com.fdkankan.agent.entity.AgentNew;
+import com.fdkankan.agent.exception.BusinessException;
 import com.fdkankan.agent.request.CameraParam;
 import com.fdkankan.agent.service.IAgentNewCameraService;
 import com.fdkankan.agent.service.IAgentNewService;
 import com.fdkankan.agent.service.ICameraService;
+import com.fdkankan.agent.service.IExcelService;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.io.FileUtils;
 import org.apache.ibatis.annotations.Param;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URLEncoder;
+import java.nio.charset.StandardCharsets;
 import java.util.List;
 
 /**
@@ -36,7 +49,8 @@ public class CameraController extends BaseController {
     IAgentNewService agentNewService;
     @Autowired
     IAgentNewCameraService agentNewCameraService;
-
+    @Autowired
+    IExcelService excelService;
 
     @PostMapping("/list")
     public ResultData list(@RequestBody CameraParam param){
@@ -49,7 +63,11 @@ public class CameraController extends BaseController {
 
     @PostMapping("/giveCamera")
     public ResultData giveCamera(@RequestBody CameraParam param){
-        agentNewCameraService.giveCamera(param,getAgent().getId());
+        if(param.getId() == null || param.getSubAgentId() == null){
+            throw new BusinessException(ResultCode.PARAM_MISS);
+        }
+        param.setAgentId(getAgent().getId());
+        agentNewCameraService.giveCamera(param);
         return ResultData.ok();
     }
 
@@ -57,12 +75,37 @@ public class CameraController extends BaseController {
     public ResultData giveCameraBatch(
             @RequestParam(required = false) Integer subAgentId,
             @RequestParam(required = false) MultipartFile file){
-        return ResultData.ok();
+        Integer count = excelService.uploadExcel(file,getAgent().getId(),subAgentId);
+        return ResultData.ok("成功导入"+count+"条数据。");
     }
 
-    @PostMapping("/downTemplate")
-    public ResultData downTemplate(@RequestBody CameraParam param){
-        return ResultData.ok();
+    @GetMapping("/downTemplate")
+    public void downInTemplate(@RequestParam(required = false,defaultValue = "0") Integer type,
+                               HttpServletResponse res, HttpServletRequest req) throws IOException {
+        String fileName = "";
+        switch (type){
+            case 0 : fileName = "giveCamera.xlsx"; break;
+            default: throw new BusinessException(ResultCode.PARAM_MISS);
+        }
+        InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("template/"+fileName);
+        OutputStream os = res.getOutputStream();
+        try {
+            String agent = req.getHeader("USER-AGENT");
+            if (agent != null && !agent.contains("MSIE") && !agent.contains("like Gecko")) {// FF
+                String enableFileName = "=?UTF-8?B?" + (new String(Base64.encodeBase64(fileName.getBytes(StandardCharsets.UTF_8))))
+                        + "?=";
+                res.setHeader("Content-Disposition", "attachment; filename=" + enableFileName);
+            } else { // IE
+                String enableFileName = URLEncoder.encode(fileName, "UTF-8");
+                res.setHeader("Content-Disposition", "attachment; filename=" + enableFileName);
+            }
+            File file = new File(fileName);
+            FileUtils.copyInputStreamToFile(inputStream,file);
+            os.write(FileUtils.readFileToByteArray(file));
+            os.flush();
+        } finally {
+            os.close();
+        }
     }
 }
 

+ 3 - 0
src/main/java/com/fdkankan/agent/mapper/ICameraMapper.java

@@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.fdkankan.agent.request.CameraParam;
 import com.fdkankan.agent.response.CameraDetailVo;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
 
 /**
  * <p>
@@ -19,4 +20,6 @@ import org.apache.ibatis.annotations.Mapper;
 public interface ICameraMapper extends BaseMapper<Camera> {
 
     Page<CameraDetailVo> pageList(Page<Object> page, CameraParam param);
+
+    Camera getBySnCodeAndAgentId(@Param("snCode") String snCode, @Param("agentId") Integer agentId);
 }

+ 3 - 1
src/main/java/com/fdkankan/agent/service/IAgentNewCameraService.java

@@ -17,9 +17,11 @@ import java.util.List;
  */
 public interface IAgentNewCameraService extends IService<AgentNewCamera> {
 
-    void giveCamera(CameraParam param, Integer id);
+    void giveCamera(CameraParam param);
 
     List<Long> getBySubAgent(Integer subAgentId);
 
     HashMap<Long, AgentNewCamera> getMapByCameraIds(List<Long> voCameraIds);
+
+    Integer giveCameraBatch(List<Long> cameraIds, Integer agentId, Integer subAgentId);
 }

+ 2 - 0
src/main/java/com/fdkankan/agent/service/ICameraService.java

@@ -24,4 +24,6 @@ public interface ICameraService extends IService<Camera> {
     List<Camera> getLikeBySnCode(String snCode);
 
     HashMap<Long, Camera> getByIds(List<Long> cameraIds2);
+
+    Camera getBySnCodeAndAgentId(String snCode,Integer agentId);
 }

+ 2 - 0
src/main/java/com/fdkankan/agent/service/IExcelService.java

@@ -22,4 +22,6 @@ public interface IExcelService {
 
     void commonExport(HttpServletRequest request, HttpServletResponse response,String name,List<?> result,Class<?> clazz) throws Exception;
 
+    Integer uploadExcel(MultipartFile file,Integer agentId, Integer subAgentId);
+
 }

+ 33 - 15
src/main/java/com/fdkankan/agent/service/impl/AgentNewCameraServiceImpl.java

@@ -3,11 +3,15 @@ package com.fdkankan.agent.service.impl;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.fdkankan.agent.common.ResultCode;
 import com.fdkankan.agent.entity.AgentNewCamera;
+import com.fdkankan.agent.entity.Camera;
 import com.fdkankan.agent.exception.BusinessException;
 import com.fdkankan.agent.mapper.IAgentNewCameraMapper;
 import com.fdkankan.agent.request.CameraParam;
 import com.fdkankan.agent.service.IAgentNewCameraService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fdkankan.agent.service.ICameraService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import java.util.HashMap;
@@ -23,30 +27,44 @@ import java.util.stream.Collectors;
  * @since 2024-06-18
  */
 @Service
+@Slf4j
 public class AgentNewCameraServiceImpl extends ServiceImpl<IAgentNewCameraMapper, AgentNewCamera> implements IAgentNewCameraService {
 
+    @Autowired
+    ICameraService cameraService;
     @Override
-    public void giveCamera(CameraParam param, Integer id) {
-        if(param.getId() == null || param.getAgentId() == null){
-            throw new BusinessException(ResultCode.PARAM_MISS);
-        }
-        List<AgentNewCamera> agentNewCameras = this.getByCameraId(param.getId());
-        if(!agentNewCameras.isEmpty()){
-            throw new BusinessException(ResultCode.CAMERA_IS_GIVE);
+    public void giveCamera(CameraParam param) {
+        giveCamera(param.getId(),param.getAgentId(),param.getSubAgentId());
+    }
+    public void giveCamera(Long cameraId,Integer agentId,Integer subAgentId) {
+        AgentNewCamera agentNewCamera = this.getByCameraId(cameraId);
+        if(agentNewCamera == null){
+            agentNewCamera = new AgentNewCamera();
         }
+        agentNewCamera.setCameraId(cameraId);
+        agentNewCamera.setAgentId(agentId);
+        agentNewCamera.setSubAgentId(subAgentId);
+        this.saveOrUpdate(agentNewCamera);
+    }
 
-        AgentNewCamera agentNewCamera = new AgentNewCamera();
-        agentNewCamera.setCameraId(param.getId());
-        agentNewCamera.setAgentId(id);
-        agentNewCamera.setSubAgentId(param.getAgentId());
-        this.save(agentNewCamera);
-
+    @Override
+    public Integer giveCameraBatch(List<Long> cameraIds, Integer agentId, Integer subAgentId) {
+        Integer successNum = 0;
+        for (Long cameraId : cameraIds) {
+            try {
+                successNum ++;
+                giveCamera(cameraId,agentId,subAgentId);
+            }catch (Exception e){
+                log.info("分发失败:cameraId:{},agentId:{},subAgentId:{}",cameraId,agentId,subAgentId);
+            }
+        }
+        return successNum;
     }
 
-    private List<AgentNewCamera> getByCameraId(Long cameraId) {
+    private AgentNewCamera getByCameraId(Long cameraId) {
         LambdaQueryWrapper<AgentNewCamera> wrapper = new LambdaQueryWrapper<>();
         wrapper.eq(AgentNewCamera::getCameraId,cameraId);
-        return this.list(wrapper);
+        return this.getOne(wrapper);
     }
 
     @Override

+ 5 - 0
src/main/java/com/fdkankan/agent/service/impl/CameraServiceImpl.java

@@ -126,4 +126,9 @@ public class CameraServiceImpl extends ServiceImpl<ICameraMapper, Camera> implem
         }
         return map;
     }
+
+    @Override
+    public Camera getBySnCodeAndAgentId(String snCode,Integer agentId) {
+        return this.getBaseMapper().getBySnCodeAndAgentId(snCode,agentId);
+    }
 }

+ 74 - 0
src/main/java/com/fdkankan/agent/service/impl/ExcelServiceImpl.java

@@ -3,7 +3,16 @@ package com.fdkankan.agent.service.impl;
 import com.alibaba.excel.EasyExcel;
 import com.alibaba.excel.ExcelWriter;
 import com.alibaba.excel.write.metadata.WriteSheet;
+import com.fdkankan.agent.common.ResultCode;
+import com.fdkankan.agent.entity.Camera;
+import com.fdkankan.agent.exception.BusinessException;
+import com.fdkankan.agent.service.IAgentNewCameraService;
+import com.fdkankan.agent.service.ICameraDetailService;
+import com.fdkankan.agent.service.ICameraService;
 import com.fdkankan.agent.service.IExcelService;
+import com.fdkankan.agent.util.ExcelErrorUtil;
+import com.fdkankan.agent.util.ExcelUtil;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.web.multipart.MultipartFile;
@@ -26,6 +35,12 @@ import java.util.List;
 @Service
 public class ExcelServiceImpl implements IExcelService {
 
+    @Autowired
+    IAgentNewCameraService agentNewCameraService;
+    @Autowired
+    ICameraService cameraService;
+    @Autowired
+    ICameraDetailService cameraDetailService;
 
     public void commonExport(HttpServletRequest request, HttpServletResponse response,String name,List<?> result,ExcelWriter excelWriter) throws Exception {
         response.setContentType("application/vnd.ms-excel");
@@ -57,4 +72,63 @@ public class ExcelServiceImpl implements IExcelService {
         }
     }
 
+
+    @Override
+    public Integer uploadExcel(MultipartFile file, Integer agentId,Integer subAgentId) {
+        String originalFilename = file.getOriginalFilename();
+        assert originalFilename != null;
+        String fileType=originalFilename.substring(originalFilename.lastIndexOf(".")+1);
+        if (!fileType.equalsIgnoreCase("xlsx")) {
+            throw new BusinessException(ResultCode.FILE_TYPE_ERROR);
+        }
+        List<HashMap<Integer, String>> excelRowList = new ArrayList<>();
+        try {
+            excelRowList = ExcelUtil.getExcelRowList(file);
+        }catch (Exception e){
+            throw new BusinessException(ResultCode.TEMPLATE_TYPE_ERROR);
+        }
+        List<Integer> errorIndex = new ArrayList<>();
+        List<String> snCodes = new ArrayList<>();
+        List<Long> cameraIds = new ArrayList<>();
+        Integer index = 0;
+        for (HashMap<Integer, String> map : excelRowList) {
+            index ++;
+            if(map.isEmpty()){
+                continue;
+            }
+            if(index == 0 && !map.get(0).equals("分销商设备清单")){
+                throw new BusinessException(ResultCode.TEMPLATE_TYPE_ERROR);
+            }
+            if(index <4){   //从第四行开始
+                continue;
+            }
+            String snCode = map.get(0);
+            if(StringUtils.isBlank(snCode)){
+                errorIndex.add(index);
+                continue;
+            }
+            if(StringUtils.isNotBlank(snCode)){
+                Camera camera = cameraService.getBySnCodeAndAgentId(snCode,agentId);
+                if(camera == null){
+                    errorIndex.add(index);
+                    continue;
+                }
+                cameraIds.add(camera.getId());
+            }
+            snCodes.add(snCode);
+        }
+        this.toExcelError(errorIndex);
+        if(!cameraIds.isEmpty()){
+            return agentNewCameraService.giveCameraBatch(cameraIds,agentId,subAgentId);
+        }
+        return 0;
+
+    }
+
+    public void toExcelError(List<Integer> errorList) {
+        String resultIn = ExcelErrorUtil.getResultIn(errorList);
+        if(StringUtils.isNotBlank(resultIn)){
+            throw new BusinessException(-1,resultIn);
+        }
+    }
 }

+ 21 - 0
src/main/java/com/fdkankan/agent/util/ExcelErrorUtil.java

@@ -0,0 +1,21 @@
+package com.fdkankan.agent.util;
+
+import java.util.HashSet;
+import java.util.List;
+
+public class ExcelErrorUtil {
+
+    public  static String getResultIn(List<Integer> errorList){
+        if(errorList.size() <=0){
+            return null;
+        }
+        HashSet<Integer> set = new HashSet<>(errorList);
+        StringBuilder res = new StringBuilder("第");
+        for (Integer index : set) {
+            res.append(index  +3).append(",");
+        }
+        res.deleteCharAt(res.lastIndexOf(","));
+        res.append("行存在错误");
+        return res.toString();
+    }
+}

+ 85 - 0
src/main/java/com/fdkankan/agent/util/ExcelUtil.java

@@ -0,0 +1,85 @@
+package com.fdkankan.agent.util;
+
+import org.apache.poi.hssf.usermodel.HSSFDateUtil;
+import org.apache.poi.hssf.usermodel.HSSFWorkbook;
+import org.apache.poi.ss.usermodel.*;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+
+public class ExcelUtil {
+
+
+    public static List<HashMap<Integer,String>> getExcelRowList(MultipartFile multipartFile) throws IOException {
+        //行List,也是最终要返回的List
+        List<HashMap<Integer,String>> rowList=new ArrayList<>();
+        Workbook workbook=getExcelWorkBook(multipartFile);
+        Sheet sheet = workbook.getSheetAt(0);
+        if (sheet == null) {
+            throw new IOException("创建Sheet失败!");
+        }
+        //开始遍历行
+        for (int i=0;i<= sheet.getLastRowNum();i++){
+            Row row = sheet.getRow(i);
+            //列List
+            HashMap<Integer,String> map = new HashMap<>();
+            //转换为List数组
+            for (int cellNum=0;cellNum<= row.getLastCellNum();cellNum++){
+                Cell cell = row.getCell(cellNum);
+                if (cell != null && cell.getCellTypeEnum() != CellType.STRING && HSSFDateUtil.isCellDateFormatted(cell))
+                {
+                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+                    Date date = HSSFDateUtil.getJavaDate(cell.getNumericCellValue());
+                    String value = sdf.format(date);
+                    map.put(cellNum,value);
+                    continue;
+                }
+                if(cell != null){
+                    String value = fommartNum(cell.toString().trim());
+                    map.put(cellNum,value);
+                }
+
+            }
+            rowList.add(map);
+        }
+        return rowList;
+    }
+
+  private static  String fommartNum(String value){
+        try {
+            if(isNumeric2(value) && value.contains(".")){
+                return Double.valueOf(value).intValue() +"";
+            }
+        }catch (Exception e){
+            return value;
+        }
+        return value;
+  }
+
+    public static boolean isNumeric2(String str) {
+        return str != null && str.matches("-?\\d+(\\.\\d+)?");
+    }
+
+
+    //获取WorkBook对象
+    private static Workbook getExcelWorkBook(MultipartFile multipartFile) throws IOException {
+        InputStream inputStream=multipartFile.getInputStream();
+        String originalFileName=multipartFile.getOriginalFilename();
+        assert originalFileName != null;
+        String fileType=originalFileName.substring(originalFileName.lastIndexOf(".")+1);
+        if (fileType.equalsIgnoreCase("xls")) {
+            //xls格式
+            return new HSSFWorkbook(inputStream);
+        } else {
+            //xlsx格式
+            return new XSSFWorkbook(inputStream);
+        }
+    }
+}

+ 4 - 0
src/main/resources/mapper/agent/CameraMapper.xml

@@ -38,4 +38,8 @@
 
         order by d.out_time desc
     </select>
+    <select id="getBySnCodeAndAgentId" resultType="com.fdkankan.agent.entity.Camera">
+        select c.* from t_camera c left join t_camera_detail d on c.id = d.camera_id
+        where c.sn_code = #{snCode} and d.agent_id = #{agentId}
+    </select>
 </mapper>

BIN
src/main/resources/template/giveCamera.xlsx