Browse Source

新增派单明细导入sop

wangliang 1 year ago
parent
commit
f74ce2d89c

+ 3 - 1
sop-api/src/main/java/com/qmth/sop/server/api/TBCrmDetailController.java

@@ -34,6 +34,7 @@ import java.util.Map;
 @RestController
 @RestController
 @RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + SystemConstant.PREFIX_URL_CRM_DETAIL)
 @RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + SystemConstant.PREFIX_URL_CRM_DETAIL)
 public class TBCrmDetailController {
 public class TBCrmDetailController {
+
     private final static Logger log = LoggerFactory.getLogger(TBCrmDetailController.class);
     private final static Logger log = LoggerFactory.getLogger(TBCrmDetailController.class);
 
 
     @Resource
     @Resource
@@ -47,6 +48,7 @@ public class TBCrmDetailController {
     @ApiResponses({ @ApiResponse(code = 200, message = "导入成功", response = EditResult.class) })
     @ApiResponses({ @ApiResponse(code = 200, message = "导入成功", response = EditResult.class) })
     public Result sopImport(@ApiParam(value = "上传文件", required = true) @RequestParam MultipartFile file,
     public Result sopImport(@ApiParam(value = "上传文件", required = true) @RequestParam MultipartFile file,
             @ApiParam(value = "派单号", required = true) @RequestParam String crmNo,
             @ApiParam(value = "派单号", required = true) @RequestParam String crmNo,
+            @ApiParam(value = "过程变量", required = true) @RequestParam String processVar,
             @ApiParam(value = "类型", required = true) @RequestParam ProductTypeEnum type) throws IOException {
             @ApiParam(value = "类型", required = true) @RequestParam ProductTypeEnum type) throws IOException {
         boolean lock = memoryLock.lock(SystemConstant.LOCK_CRM_DETAIL_SOP_PREFIX + crmNo, crmNo,
         boolean lock = memoryLock.lock(SystemConstant.LOCK_CRM_DETAIL_SOP_PREFIX + crmNo, crmNo,
                 SystemConstant.LOCK_CRM_DETAIL_SOP_TIME_OUT);
                 SystemConstant.LOCK_CRM_DETAIL_SOP_TIME_OUT);
@@ -55,7 +57,7 @@ public class TBCrmDetailController {
         }
         }
         Map<String, String> map = null;
         Map<String, String> map = null;
         try {
         try {
-            map = tbCrmDetailService.sopExcelImport(file, crmNo, type);
+            map = tbCrmDetailService.sopExcelImport(file, crmNo, processVar, type);
         } catch (Exception e) {
         } catch (Exception e) {
             log.error(SystemConstant.LOG_ERROR, e);
             log.error(SystemConstant.LOG_ERROR, e);
             if (e instanceof ApiException) {
             if (e instanceof ApiException) {

BIN
sop-api/src/main/resources/static/crm_detail.xlsx


+ 5 - 5
sop-business/src/main/java/com/qmth/sop/business/bean/dto/CrmDetailImportDto.java

@@ -33,7 +33,7 @@ public class CrmDetailImportDto extends BasicExcelRow implements Serializable {
     private String contacts;
     private String contacts;
 
 
     @ExcelProperty(value = "电话")
     @ExcelProperty(value = "电话")
-    private String mobile_number;
+    private String mobileNumber;
 
 
     @ExcelProperty(value = "服务范围")
     @ExcelProperty(value = "服务范围")
     @NotNull(message = "服务范围不能为空")
     @NotNull(message = "服务范围不能为空")
@@ -79,12 +79,12 @@ public class CrmDetailImportDto extends BasicExcelRow implements Serializable {
         this.contacts = contacts;
         this.contacts = contacts;
     }
     }
 
 
-    public String getMobile_number() {
-        return mobile_number;
+    public String getMobileNumber() {
+        return mobileNumber;
     }
     }
 
 
-    public void setMobile_number(String mobile_number) {
-        this.mobile_number = mobile_number;
+    public void setMobileNumber(String mobileNumber) {
+        this.mobileNumber = mobileNumber;
     }
     }
 
 
     public String getServiceScope() {
     public String getServiceScope() {

+ 30 - 0
sop-business/src/main/java/com/qmth/sop/business/entity/TBCrmDetail.java

@@ -1,8 +1,11 @@
 package com.qmth.sop.business.entity;
 package com.qmth.sop.business.entity;
 
 
+import cn.hutool.core.date.DateUtil;
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
 import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.qmth.sop.business.bean.dto.CrmDetailImportDto;
 import com.qmth.sop.common.base.BaseEntity;
 import com.qmth.sop.common.base.BaseEntity;
+import com.qmth.sop.common.contant.SystemConstant;
 import com.qmth.sop.common.enums.CrmStatusEnum;
 import com.qmth.sop.common.enums.CrmStatusEnum;
 import com.qmth.sop.common.enums.ServiceScopeEnum;
 import com.qmth.sop.common.enums.ServiceScopeEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModel;
@@ -66,6 +69,33 @@ public class TBCrmDetail extends BaseEntity implements Serializable {
     @ApiModelProperty(value = "阅卷结束时间")
     @ApiModelProperty(value = "阅卷结束时间")
     private Long markPaperEndTime;
     private Long markPaperEndTime;
 
 
+    public TBCrmDetail() {
+
+    }
+
+    public TBCrmDetail(String crmNo, String flowDeploymentId, String processVar, CrmDetailImportDto crmDetailImportDto,
+            Long userId) {
+        setId(SystemConstant.getDbUuid());
+        this.crmNo = crmNo;
+        this.flowDeploymentId = flowDeploymentId;
+        this.processVar = processVar;
+        this.courseName = crmDetailImportDto.getCourseName();
+        this.examStudentCount = crmDetailImportDto.getExamStudentCount();
+        this.contacts = crmDetailImportDto.getContacts();
+        this.mobileNumber = crmDetailImportDto.getMobileNumber();
+        this.serviceScope = ServiceScopeEnum.convertToName(crmDetailImportDto.getServiceScope());
+        this.scanStartTime = DateUtil.parse(crmDetailImportDto.getScanStartTime(),
+                SystemConstant.DEFAULT_DATE_CRM_DETAIL_SOP_PATTERN).getTime();
+        this.scanEndTime = DateUtil.parse(crmDetailImportDto.getScanEndTime(),
+                SystemConstant.DEFAULT_DATE_CRM_DETAIL_SOP_PATTERN).getTime();
+        this.markPaperStartTime = DateUtil.parse(crmDetailImportDto.getMarkPaperStartTime(),
+                SystemConstant.DEFAULT_DATE_CRM_DETAIL_SOP_PATTERN).getTime();
+        this.markPaperEndTime = DateUtil.parse(crmDetailImportDto.getMarkPaperEndTime(),
+                SystemConstant.DEFAULT_DATE_CRM_DETAIL_SOP_PATTERN).getTime();
+        this.status = CrmStatusEnum.UN_PUBLISH;
+        insertInfo(userId);
+    }
+
     public String getCrmNo() {
     public String getCrmNo() {
         return crmNo;
         return crmNo;
     }
     }

+ 9 - 6
sop-business/src/main/java/com/qmth/sop/business/service/TBCrmDetailService.java

@@ -19,12 +19,15 @@ import java.util.Map;
 public interface TBCrmDetailService extends IService<TBCrmDetail> {
 public interface TBCrmDetailService extends IService<TBCrmDetail> {
 
 
     /**
     /**
-     * @Description: 派单明细sop导入
-     * @Param: [file, crmNo, type]
-     * @return: java.util.Map<java.lang.String, java.lang.String>
-     * @Author: wangliang
-     * @Date: 2024/5/14
+     * 派单明细sop导入
+     *
+     * @param file
+     * @param crmNo
+     * @param processVar
+     * @param type
+     * @return
+     * @throws IOException
      */
      */
-    public Map<String, String> sopExcelImport(MultipartFile file, String crmNo, ProductTypeEnum type)
+    public Map<String, String> sopExcelImport(MultipartFile file, String crmNo, String processVar, ProductTypeEnum type)
             throws IOException;
             throws IOException;
 }
 }

+ 71 - 17
sop-business/src/main/java/com/qmth/sop/business/service/impl/TBCrmDetailServiceImpl.java

@@ -4,27 +4,34 @@ import com.alibaba.excel.EasyExcel;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.qmth.boot.api.exception.ApiException;
 import com.qmth.boot.api.exception.ApiException;
 import com.qmth.sop.business.bean.dto.CrmDetailImportDto;
 import com.qmth.sop.business.bean.dto.CrmDetailImportDto;
+import com.qmth.sop.business.entity.SysUser;
 import com.qmth.sop.business.entity.TBCrmDetail;
 import com.qmth.sop.business.entity.TBCrmDetail;
+import com.qmth.sop.business.entity.TFCustomFlow;
 import com.qmth.sop.business.mapper.TBCrmDetailMapper;
 import com.qmth.sop.business.mapper.TBCrmDetailMapper;
 import com.qmth.sop.business.service.TBCrmDetailService;
 import com.qmth.sop.business.service.TBCrmDetailService;
+import com.qmth.sop.business.service.TBCrmService;
+import com.qmth.sop.business.service.TFCustomFlowService;
+import com.qmth.sop.business.util.excel.BasicExcelListener;
 import com.qmth.sop.common.contant.SystemConstant;
 import com.qmth.sop.common.contant.SystemConstant;
 import com.qmth.sop.common.enums.ExceptionResultEnum;
 import com.qmth.sop.common.enums.ExceptionResultEnum;
 import com.qmth.sop.common.enums.FieldUniqueEnum;
 import com.qmth.sop.common.enums.FieldUniqueEnum;
 import com.qmth.sop.common.enums.ProductTypeEnum;
 import com.qmth.sop.common.enums.ProductTypeEnum;
-import com.qmth.sop.common.util.JacksonUtil;
+import com.qmth.sop.common.enums.TFCustomTypeEnum;
 import com.qmth.sop.common.util.ResultUtil;
 import com.qmth.sop.common.util.ResultUtil;
+import com.qmth.sop.common.util.ServletUtil;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.slf4j.LoggerFactory;
 import org.springframework.dao.DuplicateKeyException;
 import org.springframework.dao.DuplicateKeyException;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.LinkedMultiValueMap;
 import org.springframework.web.multipart.MultipartFile;
 import org.springframework.web.multipart.MultipartFile;
 
 
+import javax.annotation.Resource;
 import java.io.IOException;
 import java.io.IOException;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.StringJoiner;
+import java.util.*;
 
 
 /**
 /**
  * <p>
  * <p>
@@ -39,27 +46,74 @@ public class TBCrmDetailServiceImpl extends ServiceImpl<TBCrmDetailMapper, TBCrm
 
 
     private final static Logger log = LoggerFactory.getLogger(TBCrmDetailServiceImpl.class);
     private final static Logger log = LoggerFactory.getLogger(TBCrmDetailServiceImpl.class);
 
 
+    @Resource
+    TBCrmService tbCrmService;
+
+    @Resource
+    TBCrmDetailService tbCrmDetailService;
+
+    @Resource
+    TFCustomFlowService tfCustomFlowService;
+
     /**
     /**
-     * @Description: 派单明细sop导入
-     * @Param: [file, crmNo, type]
-     * @return: java.util.Map<java.lang.String, java.lang.String>
-     * @Author: wangliang
-     * @Date: 2024/5/14
+     * 派单明细sop导入
+     *
+     * @param file
+     * @param crmNo
+     * @param processVar
+     * @param type
+     * @return
+     * @throws IOException
      */
      */
     @Override
     @Override
     @Transactional
     @Transactional
-    public Map<String, String> sopExcelImport(MultipartFile file, String crmNo, ProductTypeEnum type)
+    public Map<String, String> sopExcelImport(MultipartFile file, String crmNo, String processVar, ProductTypeEnum type)
             throws IOException {
             throws IOException {
         log.debug("导入Excel开始...");
         log.debug("导入Excel开始...");
         long start = System.currentTimeMillis();
         long start = System.currentTimeMillis();
+
+        SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
+        tbCrmService.findByCrmNo(crmNo);
+        TFCustomFlow tfCustomFlow = null;
+        if (type == ProductTypeEnum.OFFICE) {
+            tfCustomFlow = tfCustomFlowService.findMaxVersion(null, null, TFCustomTypeEnum.OFFICE_SOP_FLOW);
+        }
+        Objects.requireNonNull(tfCustomFlow, "未找到教务处流程");
+
         Map<String, String> messageMap = new LinkedHashMap<>();
         Map<String, String> messageMap = new LinkedHashMap<>();
         try {
         try {
             StringJoiner errorData = new StringJoiner("");
             StringJoiner errorData = new StringJoiner("");
             StringJoiner successData = new StringJoiner("");
             StringJoiner successData = new StringJoiner("");
 
 
-            List<CrmDetailImportDto> list = EasyExcel.read(file.getInputStream()).headRowNumber(1).sheet(0)
-                    .doReadSync();
-            log.info("list:{}", JacksonUtil.parseJson(list));
+            LinkedMultiValueMap<String, CrmDetailImportDto> crmDetailImportDtoLinkedMultiValueMap = new LinkedMultiValueMap<>();
+            EasyExcel.read(file.getInputStream(), CrmDetailImportDto.class,
+                    new BasicExcelListener<CrmDetailImportDto>() {
+
+                        @Override
+                        public void handle(LinkedMultiValueMap<String, CrmDetailImportDto> dataList,
+                                StringJoiner errorDataSj, Exception exception) {
+                            crmDetailImportDtoLinkedMultiValueMap.addAll(dataList);
+                            errorData.add(errorDataSj.toString());
+                        }
+                    }).headRowNumber(2).sheet(0).doRead();
+
+            List<CrmDetailImportDto> crmDetailImportDtoList = crmDetailImportDtoLinkedMultiValueMap.get(
+                    BasicExcelListener.SUCCESS);
+            if (CollectionUtils.isNotEmpty(crmDetailImportDtoList)) {
+                if (crmDetailImportDtoList.size() > 1000) {
+                    throw ExceptionResultEnum.ERROR.exception("为效率着想,一次最多支持导入1000条");
+                }
+                List<TBCrmDetail> tbCrmDetailList = new ArrayList<>(crmDetailImportDtoList.size());
+                for (int i = 0; i < crmDetailImportDtoList.size(); i++) {
+                    CrmDetailImportDto c = crmDetailImportDtoList.get(i);
+                    tbCrmDetailList.add(
+                            new TBCrmDetail(crmNo, tfCustomFlow.getFlowDeploymentId(), processVar, c, sysUser.getId()));
+                }
+                if (!CollectionUtils.isEmpty(tbCrmDetailList)) {
+                    successData.add("共导入").add(crmDetailImportDtoList.size() + "").add("条数据");
+                    tbCrmDetailService.saveBatch(tbCrmDetailList);
+                }
+            }
 
 
             messageMap.put(SystemConstant.SUCCESS, successData.length() > 0 ? successData.toString() : "无");
             messageMap.put(SystemConstant.SUCCESS, successData.length() > 0 ? successData.toString() : "无");
             messageMap.put(SystemConstant.EXCEL_ERROR, errorData.length() > 0 ? errorData.toString() : "无");
             messageMap.put(SystemConstant.EXCEL_ERROR, errorData.length() > 0 ? errorData.toString() : "无");
@@ -67,10 +121,10 @@ public class TBCrmDetailServiceImpl extends ServiceImpl<TBCrmDetailMapper, TBCrm
             log.error(SystemConstant.LOG_ERROR, e);
             log.error(SystemConstant.LOG_ERROR, e);
             if (e instanceof DuplicateKeyException) {
             if (e instanceof DuplicateKeyException) {
                 String errorColumn = e.getCause().toString();
                 String errorColumn = e.getCause().toString();
-                String columnStr = errorColumn.substring(errorColumn.lastIndexOf("key") + 3, errorColumn.length())
-                        .replaceAll("'", "");
+                String[] strs = StringUtils.split(errorColumn, "-");
+                String[] columns = StringUtils.split(strs[strs.length - 1], "\\'");
                 throw ExceptionResultEnum.SQL_ERROR.exception(
                 throw ExceptionResultEnum.SQL_ERROR.exception(
-                        "[" + FieldUniqueEnum.convertToTitle(columnStr) + "]数据不允许重复插入");
+                        FieldUniqueEnum.convertToTitle(columns[columns.length - 1]) + ":[" + columns[0] + "]数据不允许重复插入");
             } else if (e instanceof ApiException) {
             } else if (e instanceof ApiException) {
                 ResultUtil.error((ApiException) e, ((ApiException) e).getCode(), e.getMessage());
                 ResultUtil.error((ApiException) e, ((ApiException) e).getCode(), e.getMessage());
             } else {
             } else {

+ 8 - 1
sop-business/src/main/resources/db/log/wangliang_update_log.sql

@@ -45,4 +45,11 @@ CREATE TABLE t_b_crm_detail
         COMMENT '更新时间' NULL,
         COMMENT '更新时间' NULL,
     PRIMARY KEY (`id`),
     PRIMARY KEY (`id`),
     UNIQUE KEY `t_b_crm_detail_unique` (`crm_no`,`flow_deployment_id`,`course_name`)
     UNIQUE KEY `t_b_crm_detail_unique` (`crm_no`,`flow_deployment_id`,`course_name`)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='派单明细';
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='派单明细';
+
+INSERT INTO sys_privilege
+(id, name, url, `type`, parent_id, `sequence`, property, related, enable, default_auth, front_display)
+VALUES(3079, '创建sop', 'CreateSop', 'LINK', 51, 4, 'AUTH', NULL, 1, 0, 1);
+INSERT INTO sys_privilege
+(id, name, url, `type`, parent_id, `sequence`, property, related, enable, default_auth, front_display)
+VALUES(3080, '派单管理', '/api/admin/tb/crm/detail/sop/import', 'URL', 3079, 1, 'AUTH', NULL, 1, 1, 0);

+ 1 - 0
sop-common/src/main/java/com/qmth/sop/common/contant/SystemConstant.java

@@ -81,6 +81,7 @@ public class SystemConstant {
     public static final String UPLOAD_TYPE = "uploadType";
     public static final String UPLOAD_TYPE = "uploadType";
     public static final String TEMP = "temp";
     public static final String TEMP = "temp";
     public static final String DEFAULT_DATE_PATTERN = "yyyy-MM-dd HH:mm:ss";
     public static final String DEFAULT_DATE_PATTERN = "yyyy-MM-dd HH:mm:ss";
+    public static final String DEFAULT_DATE_CRM_DETAIL_SOP_PATTERN = "yyyy/MM/dd HH:mm";
     public static final String DEFAULT_DATE_YMD_PATTERN = "yyyy-MM-dd";
     public static final String DEFAULT_DATE_YMD_PATTERN = "yyyy-MM-dd";
     public static final String DEFAULT_DATE_CODE_PATTERN = "yyyyMMdd";
     public static final String DEFAULT_DATE_CODE_PATTERN = "yyyyMMdd";
     public static final String DEFAULT_DATE_ATTACHMENT_PATTERN = "/yyyy/MM/dd";
     public static final String DEFAULT_DATE_ATTACHMENT_PATTERN = "/yyyy/MM/dd";

+ 3 - 1
sop-common/src/main/java/com/qmth/sop/common/enums/FieldUniqueEnum.java

@@ -63,7 +63,9 @@ public enum FieldUniqueEnum {
 
 
     t_b_user_archives_supplier_un("人员档案id-供应商id"),
     t_b_user_archives_supplier_un("人员档案id-供应商id"),
 
 
-    sys_supplier_un_name("供应商名称");
+    sys_supplier_un_name("供应商名称"),
+
+    t_b_crm_detail_unique("科目名称");
 
 
     private String title;
     private String title;
 
 

+ 17 - 0
sop-common/src/main/java/com/qmth/sop/common/enums/ServiceScopeEnum.java

@@ -1,5 +1,7 @@
 package com.qmth.sop.common.enums;
 package com.qmth.sop.common.enums;
 
 
+import java.util.Objects;
+
 /**
 /**
  * @Description: 服务范围enum
  * @Description: 服务范围enum
  * @Param:
  * @Param:
@@ -21,4 +23,19 @@ public enum ServiceScopeEnum {
     public String getTitle() {
     public String getTitle() {
         return title;
         return title;
     }
     }
+
+    /**
+     * 状态转换 toName
+     *
+     * @param title
+     * @return
+     */
+    public static ServiceScopeEnum convertToName(String title) {
+        for (ServiceScopeEnum e : ServiceScopeEnum.values()) {
+            if (Objects.equals(title, e.getTitle())) {
+                return e;
+            }
+        }
+        return null;
+    }
 }
 }