Explorar el Código

销售线索csv上传乱码

yangzian hace 3 años
padre
commit
aa80344201

+ 76 - 19
ruixuan-common/src/main/java/com/ruixuan/common/utils/file/FileUtils.java

@@ -6,6 +6,7 @@ import java.nio.charset.StandardCharsets;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
+import cn.hutool.core.text.csv.CsvWriter;
 import com.ruixuan.common.config.RuoYiConfig;
 import com.ruixuan.common.utils.uuid.IdUtils;
 import org.apache.commons.io.IOUtils;
@@ -294,26 +295,82 @@ public class FileUtils
      * @throws Exception
      */
     public static String getFileEncoding(File file) throws Exception {
-        BufferedInputStream bin = new BufferedInputStream(new FileInputStream(file));
-        int p = (bin.read() << 8) + bin.read();
-        bin.close();
-        String code = null;
-
-        switch (p) {
-            case 0xefbb:
-                code = "UTF-8";
-                break;
-            case 0xfffe:
-                code = "Unicode";
-                break;
-            case 0xfeff:
-                code = "UTF-16BE";
-                break;
-            default:
-                code = "GBK";
-        }
 
-        return code;
+            String charset = "GBK";
+            byte[] first3Bytes = new byte[3];
+            try {
+                boolean checked = false;
+                BufferedInputStream bis = new BufferedInputStream(
+                        new FileInputStream(file));
+                bis.mark(0);
+                int read = bis.read(first3Bytes, 0, 3);
+                if (read == -1)
+                    return charset;
+                if (first3Bytes[0] == (byte) 0xFF && first3Bytes[1] == (byte) 0xFE) {
+                    charset = "UTF-16LE";
+                    checked = true;
+                } else if (first3Bytes[0] == (byte) 0xFE
+                        && first3Bytes[1] == (byte) 0xFF) {
+                    charset = "UTF-16BE";
+                    checked = true;
+                } else if (first3Bytes[0] == (byte) 0xEF
+                        && first3Bytes[1] == (byte) 0xBB
+                        && first3Bytes[2] == (byte) 0xBF) {
+                    charset = "UTF-8";
+                    checked = true;
+                }
+                bis.reset();
+
+                if (!checked) {
+                    int loc = 0;
+                    while ((read = bis.read()) != -1) {
+                        loc++;
+                        if (read >= 0xF0)
+                            break;
+                        // 单独出现BF以下的,也算是GBK
+                        if (0x80 <= read && read <= 0xBF)
+                            break;
+                        if (0xC0 <= read && read <= 0xDF) {
+                            read = bis.read();
+                            if (0x80 <= read && read <= 0xBF)// 双字节 (0xC0 - 0xDF)
+                                // (0x80 -
+                                // 0xBF),也可能在GB编码内
+                                continue;
+                            else
+                                break;
+                            // 也有可能出错,但是几率较小
+                        } else if (0xE0 <= read && read <= 0xEF) {
+                            read = bis.read();
+                            if (0x80 <= read && read <= 0xBF) {
+                                read = bis.read();
+                                if (0x80 <= read && read <= 0xBF) {
+                                    charset = "UTF-8";
+                                    break;
+                                } else
+                                    break;
+                            } else
+                                break;
+                        }
+                    }
+
+                }
+                bis.close();
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+            return charset;
+    }
+
+
+
+    public static void addBom(File file) throws Exception{
+        FileOutputStream fileOutputStream = new FileOutputStream(file,true);
+        OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fileOutputStream,"UTF-8");
+        BufferedWriter bw = new BufferedWriter(outputStreamWriter);
+        byte[] bytes = new byte[]{(byte) 0xEF, (byte) 0xBB, (byte) 0xBF};
+        bw.newLine();
+        bw.write(new String(bytes));
+
     }
 
 

+ 4 - 3
ruixuan-salesLeads/src/main/java/com.ruixuan.salesLeads/controller/SaleClueInfoController.java

@@ -116,13 +116,14 @@ public class SaleClueInfoController extends BaseController {
 
 
 
-    @ApiOperation(value = "销售线索-转面销/电销",notes = "销售线索-转面销/电销")
+    @ApiOperation(value = "销售线索-转面销",notes = "销售线索-转面销")
     @PostMapping(value = "/saleClueToOffline")
     public ResultResponse saleClueToOffline(@ApiParam(value = "卖家id") @RequestParam(value = "sellerId") Long sellerId,
-                                            @ApiParam(value = "类型1-电销 2-面销") @RequestParam(value = "offlineSaleFlag") int offlineSaleFlag,
+                                            //@ApiParam(value = "类型1-电销 2-面销") @RequestParam(value = "offlineSaleFlag") String offlineSaleFlag,
+                                            @ApiParam(value = "销售id") @RequestParam(value = "saleId") Long saleId,
                                             @ApiParam(value = "创建人id") @RequestParam(value = "createUserId") Long createUserId){
 
-        return saleClueInfoServiceImpl.saleClueToOffline(sellerId,offlineSaleFlag,createUserId);
+        return saleClueInfoServiceImpl.saleClueToOffline(sellerId, 2,saleId,createUserId);
 
     }
 

+ 4 - 3
ruixuan-salesLeads/src/main/java/com.ruixuan.salesLeads/listener/ImportExcelListener.java

@@ -38,8 +38,6 @@ public class ImportExcelListener extends AnalysisEventListener<Map<Integer, Stri
 
         Map<String, String> ObjectMap = new HashMap<>();
 
-
-
         log.info("解析到的一条数据=====excelRow = {}", JSON.toJSONString(data));
 
         data.forEach((key,vlue) ->{
@@ -48,7 +46,10 @@ public class ImportExcelListener extends AnalysisEventListener<Map<Integer, Stri
 
                 String keyStr = (String)mapKey;
                 keyStr.replace(" ","");
-                vlue = vlue.replace(" ","");
+
+                if (StringUtils.isNotNull(vlue)){
+                    vlue = vlue.replace(" ","");
+                }
 
                 if (keyStr.contains("家ID")){
                     ObjectMap.put("sellerId",vlue);

+ 2 - 1
ruixuan-salesLeads/src/main/java/com.ruixuan.salesLeads/mapper/SaleClueInfoMapper.java

@@ -98,8 +98,9 @@ public interface SaleClueInfoMapper {
      * 修改销售线索 销售类别 电销或面销
      * @param sellerId 卖家id
      * @param offlineSaleFlag 类型 1-电销 2-面销
+     * @param saleId 销售
      */
-     void updateSaleClueOfflineFlag(@Param(value = "sellerId") Long sellerId,@Param(value = "offlineSaleFlag") int offlineSaleFlag);
+     void updateSaleClueOfflineFlag(@Param(value = "sellerId") Long sellerId,@Param(value = "offlineSaleFlag") int offlineSaleFlag,@Param(value = "saleId") Long saleId);
 
 
 

+ 2 - 2
ruixuan-salesLeads/src/main/java/com.ruixuan.salesLeads/pojo/SaleClueRecordInfoPojo.java

@@ -28,13 +28,13 @@ public class SaleClueRecordInfoPojo {
     private int recordTimes;
 
     @ApiModelProperty("跟进话术1-扶持 2-活动")
-    private int recordScript;
+    private String recordScript;
 
     @ApiModelProperty("是否继续跟进 1-继续跟进 2-意向合作 3-跟进完成无合作")
     private int continueFlag;
 
     @ApiModelProperty("意向合作 1-不合作可跟进 2-添加微信 3-操盘合作 4-服务商合作 5-金牛合作 6-无法添加微信")
-    private int intendedCooperation;
+    private String intendedCooperation;
 
     @ApiModelProperty("跟进详情")
     private String recordInfo;

+ 1 - 1
ruixuan-salesLeads/src/main/java/com.ruixuan.salesLeads/service/ISaleClueInfoService.java

@@ -37,6 +37,6 @@ public interface ISaleClueInfoService {
 
     ResultResponse insertSaleTaskRecord(SaleClueRecordInfoPojo recordInfoPojo);
 
-    ResultResponse saleClueToOffline(Long sellerId,int offlineSaleFlag,Long createUserId);
+    ResultResponse saleClueToOffline(Long sellerId,int offlineSaleFlag,Long saleId,Long createUserId);
 
 }

+ 6 - 5
ruixuan-salesLeads/src/main/java/com.ruixuan.salesLeads/service/impl/SaleClueInfoServiceImpl.java

@@ -123,8 +123,8 @@ public class SaleClueInfoServiceImpl implements ISaleClueInfoService {
             //excel 清除监听数据
             ImportExcelListener.importDataList.clear();
             ImportExcelListener.importHeadList.clear();
-            //e.printStackTrace();
-            log.error("上传文件出现了问题。",e.toString());
+            log.error("上传文件出现了问题。{}",e.toString());
+            e.printStackTrace();
             return ResultResponse.error("上传文件失败。");
         }
 
@@ -395,7 +395,7 @@ public class SaleClueInfoServiceImpl implements ISaleClueInfoService {
 
         if (recordInfoPojo.getContinueFlag() == 2){
             //意向合作 1-不合作可跟进 2-添加微信 3-操盘合作 4-服务商合作 5-金牛合作 6-无法添加微信
-            if (recordInfoPojo.getIntendedCooperation() == 1){
+            if (StringUtils.equals(recordInfoPojo.getIntendedCooperation(),"1")){
                 saleClueInfoMapper.updateSaleClueState(recordInfoPojo.getSellerId(),2);
             }
             saleClueInfoMapper.updateSaleClueState(recordInfoPojo.getSellerId(),3);
@@ -417,12 +417,13 @@ public class SaleClueInfoServiceImpl implements ISaleClueInfoService {
      *
      * @param sellerId 卖家id
      * @param offlineSaleFlag 类型1-电销 2-面销
+     * @param saleId 销售人员
      * @param createUserId
      * @return: com.ruixuan.common.core.domain.ResultResponse
      */
     @Override
-    public ResultResponse saleClueToOffline(Long sellerId,int offlineSaleFlag,Long createUserId){
-        saleClueInfoMapper.updateSaleClueOfflineFlag(sellerId,offlineSaleFlag);
+    public ResultResponse saleClueToOffline(Long sellerId,int offlineSaleFlag,Long saleId,Long createUserId){
+        saleClueInfoMapper.updateSaleClueOfflineFlag(sellerId,offlineSaleFlag,saleId);
         return ResultResponse.successMsg("成功。",null);
     }
 

+ 18 - 9
ruixuan-salesLeads/src/main/java/com.ruixuan.salesLeads/utils/CsvImportUtil.java

@@ -1,18 +1,18 @@
 package com.ruixuan.salesLeads.utils;
 
 
+import cn.hutool.core.text.csv.CsvWriter;
 import com.ruixuan.common.utils.StringUtils;
 import com.ruixuan.common.utils.file.FileUtils;
 import de.siegmar.fastcsv.reader.CsvContainer;
 import de.siegmar.fastcsv.reader.CsvReader;
 import de.siegmar.fastcsv.reader.CsvRow;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.poi.util.IOUtils;
+import org.bouncycastle.util.test.Test;
 import org.springframework.web.multipart.MultipartFile;
 
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.InputStreamReader;
+import java.io.*;
 import java.nio.charset.Charset;
 import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
@@ -50,12 +50,16 @@ public class CsvImportUtil {
         CsvContainer csv = csvReader.read(file, Charset.forName("gbk"));
 */
 
-        String encoding = System.getProperty("file.encoding");
-        System.out.println("系统编码===="+encoding);
+//        String encoding = System.getProperty("file.encoding");
+//        System.out.println("系统编码===="+encoding);
+//        String os = System.getProperty("os.name");
+//        System.out.println("system----------"+os);
 
         String charset = FileUtils.getFileEncoding(file);
         System.out.println("文件编码===="+charset);
 
+        //FileUtils.addBom(file);
+
         InputStreamReader isr = new InputStreamReader(new FileInputStream(file),charset);
         CsvContainer csv = csvReader.read(isr);
 
@@ -74,10 +78,15 @@ public class CsvImportUtil {
 
             rowMap.forEach((key,vlue)->{
                 System.out.println(key);
-                String keyStr = key.replace(" ","");
-                vlue = vlue.replace(" ","");
 
-                if (StringUtils.isNotNull(keyStr)){
+                if (StringUtils.isNotNull(key)){
+                    String keyStr = key.replace(" ","");
+
+                    if (StringUtils.isNotNull(vlue)){
+                        vlue = vlue.replace(" ","");
+                    }
+
+
 
                     if (keyStr.contains("家ID")){
                         objectMap.put("sellerId",vlue);

+ 2 - 1
ruixuan-salesLeads/src/main/resources/mapper/salesLeads/SaleClueInfoMapper.xml

@@ -278,7 +278,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 	<update id="updateSaleClueOfflineFlag">
 		UPDATE sale_clue_info
 		SET
-			offline_sale_flag = #{offlineSaleFlag}
+			offline_sale_flag = #{offlineSaleFlag},
+			sale_id = #{saleId}
 		WHERE
 			seller_id = #{sellerId}
 	</update>