Merge branch 'main' into prod

This commit is contained in:
zzs 2025-03-10 18:03:36 +08:00
commit a8ea01e699
13 changed files with 173 additions and 17 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,15 +32,16 @@ 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")
@Operation(summary = "解析经销商登记Excel数据") @Operation(summary = "解析经销商登记Excel数据")
public CommonResult<List<DealerRegistrationModel>> parsing(MultipartFile file) throws IOException { public CommonResult<List<DealerRegistrationModel>> parsing(@RequestBody MultipartFile file) throws IOException {
return CommonResult.success(excelTemplateService.parsingExcel(file)); return CommonResult.success(excelTemplateService.parsingExcel(file));
} }
} }

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,8 @@ 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 com.fasterxml.jackson.annotation.JsonProperty;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Builder; import lombok.Builder;
import lombok.Data; import lombok.Data;
@ -25,25 +27,33 @@ import lombok.experimental.Accessors;
public class DealerRegistrationModel { public class DealerRegistrationModel {
@ExcelProperty("公司名称或客户姓名") @ExcelProperty("公司名称或客户姓名")
private String yem_tcompanyname_jxs; @JsonAlias({"yem_tcompanyname", "yem_tcompanyname_jxs"})
@JsonProperty("yem_tcompanyname_jxs")
private String yem_tcompanyname;
@ExcelProperty("客户联系人") @ExcelProperty("客户联系人")
private String yem_customerlxr_jxs; @JsonAlias({"yem_customerlxr_jxs", "yem_customerlxr"})
@JsonProperty("yem_customerlxr_jxs")
private String yem_customerlxr;
@ExcelProperty("客户联系方式") @ExcelProperty("客户联系方式")
private String yem_customercontact_jxs; @JsonAlias({"yem_customercontact_jxs", "yem_customercontact"})
@JsonProperty("yem_customercontact_jxs")
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", "yem_region_jxs_number"})
private String yem_region_jxs_number;
@ExcelProperty(value = "意向强度", converter = DictConvert.class) @ExcelProperty(value = "意向强度", converter = DictConvert.class)
@DictFormat(DictTypeConstants.INTENTION_OPTION) @DictFormat(DictTypeConstants.INTENTION_OPTION)
@ExcelColumnSelect(dictType = DictTypeConstants.INTENTION_OPTION) @ExcelColumnSelect(dictType = DictTypeConstants.INTENTION_OPTION)
private String yem_intentionality; private String yem_intentionality;
@ExcelProperty("转换客户") // @ExcelProperty(value = "转换客户", converter = DictConvert.class)
private String yem_switching; // @DictFormat(DictTypeConstants.BOOLEAN_OPTION)
// @ExcelColumnSelect(dictType = DictTypeConstants.BOOLEAN_OPTION)
// private Boolean 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,18 +29,57 @@ 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 {
return ExcelUtils.read(file, DealerRegistrationModel.class); List<DealerRegistrationModel> read = ExcelUtils.read(file, DealerRegistrationModel.class);
return read.stream().filter(d -> d.getYem_tcompanyname() != null && d.getYem_customerlxr() != null && d.getYem_customercontact() != null).collect(Collectors.toList());
} }
} }

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

@ -170,4 +170,17 @@ public class UserController {
return success(userService.importUserList(list, updateSupport)); return success(userService.importUserList(list, updateSupport));
} }
@GetMapping("/get/phone")
@Operation(summary = "手机号查询用户")
@Parameter(name = "phone", description = "手机号", required = true, example = "15898763434")
@PreAuthorize("@ss.hasPermission('system:user:query')")
public CommonResult<UserRespVO> getUser(@RequestParam("phone") String phone) {
AdminUserDO user = userService.getUserByPhone(phone);
if (user == null) {
return success(null);
}
// 拼接数据
DeptDO dept = deptService.getDept(user.getDeptId());
return success(UserConvert.INSTANCE.convert(user, dept));
}
} }

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

View File

@ -214,4 +214,6 @@ public interface AdminUserService {
*/ */
AdminUserDO getUserByOpenId(String openId); AdminUserDO getUserByOpenId(String openId);
AdminUserDO getUserByPhone(String phone);
} }

View File

@ -529,4 +529,16 @@ public class AdminUserServiceImpl implements AdminUserService {
return user; return user;
} }
} }
@Override
public AdminUserDO getUserByPhone(String phone) {
LambdaQueryWrapperX<AdminUserDO> queryWrapperX = new LambdaQueryWrapperX<>();
queryWrapperX.eq(AdminUserDO::getMobile, phone);
List<AdminUserDO> users = userMapper.selectList(queryWrapperX);
if (users.isEmpty()) {
return null;
}
return users.get(0);
}
} }