feat:export entry data

This commit is contained in:
zzs 2025-03-10 10:10:52 +08:00
parent fc9f684716
commit 7d90fef64f
10 changed files with 137 additions and 13 deletions

View File

@ -21,7 +21,7 @@ spring:
- id: crm-api-proxy # ???????? - id: crm-api-proxy # ????????
uri: http://127.0.0.1:38080 uri: http://127.0.0.1:38080
predicates: predicates:
- Path=/crm-api/proxy/file/** - Path=/crm-api/proxy/**
servlet: servlet:
multipart: multipart:
max-file-size: 20MB max-file-size: 20MB

View File

@ -1,13 +1,15 @@
package com.ensign.crm.module.crm.controller.crm; package com.ensign.crm.module.crm.controller.crm;
import com.ensign.crm.framework.common.pojo.CommonResult; import com.ensign.crm.framework.common.pojo.CommonResult;
import com.ensign.crm.module.crm.controller.crm.vs.GenerateTemplateReqVo;
import com.ensign.crm.module.crm.model.DealerRegistrationModel; import com.ensign.crm.module.crm.model.DealerRegistrationModel;
import com.ensign.crm.module.crm.service.ExcelTemplateService; import com.ensign.crm.module.crm.service.ExcelTemplateService;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
@ -30,10 +32,11 @@ public class ExcelTemplateController {
@Autowired @Autowired
private ExcelTemplateService excelTemplateService; private ExcelTemplateService excelTemplateService;
@GetMapping("/download-template") @PostMapping("/download-template")
@Operation(summary = "下载经销商登记引出模板") @Operation(summary = "下载经销商登记引出模板")
public void generateTemplate(HttpServletResponse response) throws IOException { @Transactional
excelTemplateService.generateDealerRegistration(response); public void generateTemplate(@RequestBody GenerateTemplateReqVo presetData, HttpServletResponse response) throws IOException {
excelTemplateService.generateDealerRegistration(presetData, response);
} }
@PostMapping("/upload/parsing") @PostMapping("/upload/parsing")

View File

@ -0,0 +1,26 @@
package com.ensign.crm.module.crm.controller.crm.vs;
import com.ensign.crm.module.crm.model.DealerRegistrationModel;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* @Description: TODO
* @Date: 2025/3/10 9:14
* @Created: by ZZSLL
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class GenerateTemplateReqVo {
private List<DealerRegistrationModel> data;
private List<RegionOptionItem> region;
}

View File

@ -0,0 +1,21 @@
package com.ensign.crm.module.crm.controller.crm.vs;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @Description: TODO
* @Date: 2025/3/10 9:15
* @Created: by ZZSLL
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class RegionOptionItem {
private String label;
private String value;
}

View File

@ -5,6 +5,7 @@ import com.ensign.crm.framework.excel.core.annotations.DictFormat;
import com.ensign.crm.framework.excel.core.annotations.ExcelColumnSelect; import com.ensign.crm.framework.excel.core.annotations.ExcelColumnSelect;
import com.ensign.crm.framework.excel.core.convert.DictConvert; import com.ensign.crm.framework.excel.core.convert.DictConvert;
import com.ensign.crm.module.system.enums.DictTypeConstants; import com.ensign.crm.module.system.enums.DictTypeConstants;
import com.fasterxml.jackson.annotation.JsonAlias;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Builder; import lombok.Builder;
import lombok.Data; import lombok.Data;
@ -25,18 +26,22 @@ import lombok.experimental.Accessors;
public class DealerRegistrationModel { public class DealerRegistrationModel {
@ExcelProperty("公司名称或客户姓名") @ExcelProperty("公司名称或客户姓名")
private String yem_tcompanyname_jxs; @JsonAlias({"yem_tcompanyname", "yem_tcompanyname_jxs"})
private String yem_tcompanyname;
@ExcelProperty("客户联系人") @ExcelProperty("客户联系人")
private String yem_customerlxr_jxs; @JsonAlias({"yem_customerlxr_jxs", "yem_customerlxr"})
private String yem_customerlxr;
@ExcelProperty("客户联系方式") @ExcelProperty("客户联系方式")
private String yem_customercontact_jxs; @JsonAlias({"yem_customercontact_jxs", "yem_customercontact"})
private String yem_customercontact;
@ExcelProperty(value = "区域", converter = DictConvert.class) @ExcelProperty(value = "区域", converter = DictConvert.class)
@DictFormat(DictTypeConstants.REGION_OPTION) @DictFormat(DictTypeConstants.REGION_OPTION)
@ExcelColumnSelect(dictType = DictTypeConstants.REGION_OPTION) @ExcelColumnSelect(dictType = DictTypeConstants.REGION_OPTION)
private String yem_region_jxs; @JsonAlias({"yem_region_jxs", "yem_region_qy_number"})
private String yem_region_qy_number;
@ExcelProperty(value = "意向强度", converter = DictConvert.class) @ExcelProperty(value = "意向强度", converter = DictConvert.class)
@DictFormat(DictTypeConstants.INTENTION_OPTION) @DictFormat(DictTypeConstants.INTENTION_OPTION)
@ -44,6 +49,7 @@ public class DealerRegistrationModel {
private String yem_intentionality; private String yem_intentionality;
@ExcelProperty("转换客户") @ExcelProperty("转换客户")
@DictFormat(DictTypeConstants.BOOLEAN_OPTION)
@ExcelColumnSelect(dictType = DictTypeConstants.BOOLEAN_OPTION)
private String yem_switching; private String yem_switching;
} }

View File

@ -1,7 +1,15 @@
package com.ensign.crm.module.crm.service; package com.ensign.crm.module.crm.service;
import com.ensign.crm.framework.common.enums.CommonStatusEnum;
import com.ensign.crm.framework.excel.core.util.ExcelUtils; import com.ensign.crm.framework.excel.core.util.ExcelUtils;
import com.ensign.crm.module.crm.controller.crm.vs.GenerateTemplateReqVo;
import com.ensign.crm.module.crm.controller.crm.vs.RegionOptionItem;
import com.ensign.crm.module.crm.model.DealerRegistrationModel; import com.ensign.crm.module.crm.model.DealerRegistrationModel;
import com.ensign.crm.module.system.controller.admin.dict.vo.data.DictDataSaveReqVO;
import com.ensign.crm.module.system.dal.dataobject.dict.DictDataDO;
import com.ensign.crm.module.system.enums.DictTypeConstants;
import com.ensign.crm.module.system.service.dict.DictDataService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
@ -9,6 +17,8 @@ import javax.servlet.http.HttpServletResponse;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/** /**
* @Description: TODO * @Description: TODO
@ -19,15 +29,53 @@ import java.util.List;
@Service @Service
public class ExcelTemplateService { public class ExcelTemplateService {
@Autowired
private DictDataService dictDataService;
/** /**
* 经销商登记 * 经销商登记
* *
* @param data
* @param response * @param response
*/ */
public void generateDealerRegistration(HttpServletResponse response) throws IOException { public void generateDealerRegistration(GenerateTemplateReqVo data, HttpServletResponse response) throws IOException {
List<RegionOptionItem> region = data.getRegion();
Map<String, String> regionMap = region.stream().collect(Collectors.toMap(RegionOptionItem::getValue, RegionOptionItem::getLabel));
List<DictDataDO> existData = dictDataService.getDictDataList(CommonStatusEnum.ENABLE.getStatus(), DictTypeConstants.REGION_OPTION);
List<DictDataDO> update = new ArrayList<>();
List<RegionOptionItem> insert = new ArrayList<>();
for (DictDataDO item : existData) {
String name = item.getLabel();
String value = item.getValue();
if (regionMap.containsKey(value)) {
if (!name.equals(regionMap.get(name))) {
item.setLabel(regionMap.get(value));
update.add(item);
}
}
}
List<DealerRegistrationModel> emptyData = new ArrayList<>(); Map<String, DictDataDO> existMap = existData.stream().collect(Collectors.toMap(DictDataDO::getValue, d -> d));
ExcelUtils.write(response, "经销商登记引出模板.xlsx", "Sheet1", DealerRegistrationModel.class, emptyData); List<DictDataDO> delete = existMap.entrySet().stream()
.filter(entry -> !regionMap.containsKey(entry.getKey()))
.map(Map.Entry::getValue)
.collect(Collectors.toList());
for (Map.Entry<String, String> entry : regionMap.entrySet()) {
String key = entry.getKey();
String value = entry.getValue();
if (!existMap.containsKey(key)) {
insert.add(new RegionOptionItem(value, key));
}
}
dictDataService.updateById(update);
for (RegionOptionItem item : insert) {
dictDataService.createDictData(new DictDataSaveReqVO(null, 0, item.getLabel(), item.getValue(), DictTypeConstants.REGION_OPTION, CommonStatusEnum.ENABLE.getStatus(), null, null, null));
}
dictDataService.deleteById(delete.stream().map(DictDataDO::getId).collect(Collectors.toSet()));
ExcelUtils.write(response, "经销商登记引出模板.xlsx", "Sheet1", DealerRegistrationModel.class, data.getData());
} }
public List<DealerRegistrationModel> parsingExcel(MultipartFile file) throws IOException { public List<DealerRegistrationModel> parsingExcel(MultipartFile file) throws IOException {

View File

@ -27,4 +27,6 @@ public interface DictTypeConstants {
String REGION_OPTION = "crm_region_option"; String REGION_OPTION = "crm_region_option";
String INTENTION_OPTION = "crm_intention_option"; String INTENTION_OPTION = "crm_intention_option";
String BOOLEAN_OPTION = "infra_boolean_string";
} }

View File

@ -3,6 +3,7 @@ package com.ensign.crm.module.system.controller.admin.dict.vo.data;
import com.ensign.crm.framework.common.enums.CommonStatusEnum; import com.ensign.crm.framework.common.enums.CommonStatusEnum;
import com.ensign.crm.framework.common.validation.InEnum; import com.ensign.crm.framework.common.validation.InEnum;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotBlank;
@ -11,6 +12,7 @@ import javax.validation.constraints.Size;
@Schema(description = "管理后台 - 字典数据创建/修改 Request VO") @Schema(description = "管理后台 - 字典数据创建/修改 Request VO")
@Data @Data
@AllArgsConstructor
public class DictDataSaveReqVO { public class DictDataSaveReqVO {
@Schema(description = "字典数据编号", example = "1024") @Schema(description = "字典数据编号", example = "1024")

View File

@ -107,4 +107,8 @@ public interface DictDataService {
*/ */
List<DictDataDO> getDictDataListByDictType(String dictType); List<DictDataDO> getDictDataListByDictType(String dictType);
void updateById(List<DictDataDO> data);
void deleteById(Collection<Long> ids);
} }

View File

@ -176,4 +176,16 @@ public class DictDataServiceImpl implements DictDataService {
return list; return list;
} }
@Override
public void updateById(List<DictDataDO> data) {
dictDataMapper.updateById(data);
}
@Override
public void deleteById(Collection<Long> ids) {
if (ids != null && !ids.isEmpty()) {
dictDataMapper.deleteByIds(ids);
}
}
} }