From a0469a082320c33fc19d4e7239b7ddde67945227 Mon Sep 17 00:00:00 2001 From: “djh” <“3298565835@qq.com”> Date: 星期四, 03 七月 2025 14:07:53 +0800 Subject: [PATCH] 修改 --- multi-system/src/main/java/com/gkhy/exam/system/mapper/SysCompanyMapper.java | 2 multi-system/src/main/resources/mapper/system/CompanyIndustryTemplateMapper.xml | 18 +++ multi-admin/src/main/java/com/gkhy/exam/admin/controller/web/CompanyBasicController.java | 15 +++ multi-system/src/main/java/com/gkhy/exam/system/service/impl/SysCompanyServiceImpl.java | 5 + multi-system/src/main/java/com/gkhy/exam/system/mapper/CompanyIndustryTemplateMapper.java | 3 multi-system/src/main/java/com/gkhy/exam/system/domain/CompanyIndustryTemplate.java | 11 ++ multi-system/src/main/java/com/gkhy/exam/system/service/CompanyIndustryTemplateService.java | 5 + multi-system/src/main/java/com/gkhy/exam/system/service/impl/CompanyIndustryTemplateServiceImpl.java | 175 ++++++++++++++++++++++++++++++++++ multi-system/src/main/resources/mapper/system/SysCompanyMapper.xml | 4 multi-system/src/main/java/com/gkhy/exam/system/service/SysCompanyService.java | 5 + 10 files changed, 239 insertions(+), 4 deletions(-) diff --git a/multi-admin/src/main/java/com/gkhy/exam/admin/controller/web/CompanyBasicController.java b/multi-admin/src/main/java/com/gkhy/exam/admin/controller/web/CompanyBasicController.java index 2d623d5..0f6b536 100644 --- a/multi-admin/src/main/java/com/gkhy/exam/admin/controller/web/CompanyBasicController.java +++ b/multi-admin/src/main/java/com/gkhy/exam/admin/controller/web/CompanyBasicController.java @@ -1,6 +1,9 @@ package com.gkhy.exam.admin.controller.web; +import com.gkhy.exam.common.annotation.Log; +import com.gkhy.exam.common.annotation.RepeatSubmit; import com.gkhy.exam.common.api.CommonResult; +import com.gkhy.exam.common.enums.BusinessType; import com.gkhy.exam.system.domain.*; import com.gkhy.exam.system.service.*; import io.swagger.annotations.Api; @@ -10,6 +13,9 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; @Api(tags = "企业基础信息管理") @RestController @@ -326,6 +332,15 @@ return companyIndustryTemplateService.deletedCompanyIndustryTemplate(industryTemplateId); } + @RepeatSubmit + @Log(title = "行业管理", businessType = BusinessType.DELETE) + @ApiOperation(value = "导入行业") + @PostMapping("/industryTemplate/upload") + public CommonResult uploadQuestion(@RequestParam("file") MultipartFile file) throws IOException { + return companyIndustryTemplateService.uploadQuestion(file); + } + + } diff --git a/multi-system/src/main/java/com/gkhy/exam/system/domain/CompanyIndustryTemplate.java b/multi-system/src/main/java/com/gkhy/exam/system/domain/CompanyIndustryTemplate.java index 6e78dbb..b90929e 100644 --- a/multi-system/src/main/java/com/gkhy/exam/system/domain/CompanyIndustryTemplate.java +++ b/multi-system/src/main/java/com/gkhy/exam/system/domain/CompanyIndustryTemplate.java @@ -27,12 +27,21 @@ @NotNull(message = "企业Id不可为空") @ApiModelProperty(value = "企业ID") @TableField("company_id") - private Integer companyId; + private Long companyId; @ApiModelProperty(value = "企业名称") @TableField("company_name") private String companyName; + @ApiModelProperty(value = "章节") + @TableField("chapter") + private String chapter; + + @ApiModelProperty(value = "分类") + @TableField("type") + private String type; + + @ApiModelProperty(value = "模板名称") @TableField("template_name") @NotBlank(message = "模板名称不可为空") diff --git a/multi-system/src/main/java/com/gkhy/exam/system/mapper/CompanyIndustryTemplateMapper.java b/multi-system/src/main/java/com/gkhy/exam/system/mapper/CompanyIndustryTemplateMapper.java index 68d0ba4..ec0aa5d 100644 --- a/multi-system/src/main/java/com/gkhy/exam/system/mapper/CompanyIndustryTemplateMapper.java +++ b/multi-system/src/main/java/com/gkhy/exam/system/mapper/CompanyIndustryTemplateMapper.java @@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.gkhy.exam.system.domain.CompanyIndustryTemplate; import com.gkhy.exam.system.domain.CompanyRoster; +import org.apache.ibatis.annotations.Param; import org.mapstruct.Mapper; import java.util.List; @@ -12,4 +13,6 @@ List<CompanyIndustryTemplate> selectCompanyIndustryTemplateList(CompanyIndustryTemplate companyId); int updateCompanyIndustryTemplateById(CompanyIndustryTemplate template); + + int insertIndustrys(@Param("companyIndustryTemplates") List<CompanyIndustryTemplate> companyIndustryTemplates); } diff --git a/multi-system/src/main/java/com/gkhy/exam/system/mapper/SysCompanyMapper.java b/multi-system/src/main/java/com/gkhy/exam/system/mapper/SysCompanyMapper.java index 7bfe3bb..d00bf46 100644 --- a/multi-system/src/main/java/com/gkhy/exam/system/mapper/SysCompanyMapper.java +++ b/multi-system/src/main/java/com/gkhy/exam/system/mapper/SysCompanyMapper.java @@ -66,4 +66,6 @@ List<CompanyPaperStudentVO> getOfflineCompanyPaperStudentCount(@Param("companyIds")List<Long> companyIds,@Param("startTime")String startTime,@Param("endTime")String endTime); + List<SysCompany> selectCompanyListS(); + } diff --git a/multi-system/src/main/java/com/gkhy/exam/system/service/CompanyIndustryTemplateService.java b/multi-system/src/main/java/com/gkhy/exam/system/service/CompanyIndustryTemplateService.java index f6c1f8d..a77c846 100644 --- a/multi-system/src/main/java/com/gkhy/exam/system/service/CompanyIndustryTemplateService.java +++ b/multi-system/src/main/java/com/gkhy/exam/system/service/CompanyIndustryTemplateService.java @@ -5,6 +5,9 @@ import com.gkhy.exam.common.api.CommonResult; import com.gkhy.exam.system.domain.CompanyIndustryTemplate; import com.gkhy.exam.system.domain.CompanyRoster; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; public interface CompanyIndustryTemplateService extends IService<CompanyIndustryTemplate> { CommonPage selectCompanyIndustryTemplateList(CompanyIndustryTemplate companyId); @@ -14,4 +17,6 @@ CommonResult updateCompanyIndustryTemplate(CompanyIndustryTemplate companyIndustryTemplate); CommonResult deletedCompanyIndustryTemplate(Integer companyIndustryTemplateId); + + CommonResult uploadQuestion(MultipartFile file) throws IOException; } diff --git a/multi-system/src/main/java/com/gkhy/exam/system/service/SysCompanyService.java b/multi-system/src/main/java/com/gkhy/exam/system/service/SysCompanyService.java index 5cd597a..e26d0d5 100644 --- a/multi-system/src/main/java/com/gkhy/exam/system/service/SysCompanyService.java +++ b/multi-system/src/main/java/com/gkhy/exam/system/service/SysCompanyService.java @@ -4,6 +4,8 @@ import com.gkhy.exam.common.api.CommonPage; import com.gkhy.exam.system.domain.SysCompany; +import java.util.List; + /** * <p> * 企业表 服务类 @@ -74,4 +76,7 @@ */ public void assignPeriod(SysCompany company); + List<SysCompany> selectCompanyLists(); + + } diff --git a/multi-system/src/main/java/com/gkhy/exam/system/service/impl/CompanyIndustryTemplateServiceImpl.java b/multi-system/src/main/java/com/gkhy/exam/system/service/impl/CompanyIndustryTemplateServiceImpl.java index c500fe4..856bce3 100644 --- a/multi-system/src/main/java/com/gkhy/exam/system/service/impl/CompanyIndustryTemplateServiceImpl.java +++ b/multi-system/src/main/java/com/gkhy/exam/system/service/impl/CompanyIndustryTemplateServiceImpl.java @@ -1,5 +1,6 @@ package com.gkhy.exam.system.service.impl; +import com.alibaba.fastjson2.JSONObject; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.gkhy.exam.common.api.CommonPage; import com.gkhy.exam.common.api.CommonResult; @@ -7,18 +8,27 @@ import com.gkhy.exam.common.exception.ApiException; import com.gkhy.exam.common.utils.PageUtils; import com.gkhy.exam.common.utils.SecurityUtils; -import com.gkhy.exam.system.domain.CompanyIndustryTemplate; -import com.gkhy.exam.system.domain.CompanyRoster; -import com.gkhy.exam.system.domain.SysCompany; +import com.gkhy.exam.common.utils.StringUtils; +import com.gkhy.exam.system.domain.*; import com.gkhy.exam.system.mapper.CompanyIndustryTemplateMapper; import com.gkhy.exam.system.mapper.CompanyRosterMapper; +import com.gkhy.exam.system.mapper.SysIndustryTypeMapper; import com.gkhy.exam.system.service.CompanyIndustryTemplateService; import com.gkhy.exam.system.service.SysCompanyService; +import com.gkhy.exam.system.service.SysIndustryTypeService; +import org.apache.poi.ss.usermodel.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; +import java.io.IOException; import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; + +import static cn.hutool.poi.excel.cell.CellUtil.getCellValue; @Service public class CompanyIndustryTemplateServiceImpl extends ServiceImpl<CompanyIndustryTemplateMapper, CompanyIndustryTemplate> implements CompanyIndustryTemplateService { @@ -27,6 +37,9 @@ private CompanyIndustryTemplateMapper companyIndustryTemplateMapper; @Autowired private SysCompanyService sysCompanyService; + + @Autowired + private SysIndustryTypeMapper sysIndustryTypeMapper; @@ -86,4 +99,160 @@ } return CommonResult.failed(); } + + @Override + public CommonResult uploadQuestion(MultipartFile file) throws IOException { + List<CompanyIndustryType> companyIndustryTypes = sysIndustryTypeMapper.selectIndustryTypeList(); + List<SysCompany> list = sysCompanyService.selectCompanyLists(); + Workbook workbook = WorkbookFactory.create(file.getInputStream()); + Sheet sheet = workbook.getSheetAt(0); + +// 1. 创建列名-索引映射表 + Map<String, Integer> columnIndexMap = new HashMap<>(); + Row headerRow = sheet.getRow(0); + for (Cell cell : headerRow) { + String headerName = cell.getStringCellValue().trim(); + columnIndexMap.put(headerName, cell.getColumnIndex()); + } + +// 验证必要列是否存在 + String[] requiredHeaders = {"章节", "文件记录", "分类", "行业", "企业名称"}; + List<String> missingHeaders = new ArrayList<>(); + for (String header : requiredHeaders) { + if (!columnIndexMap.containsKey(header)) { + missingHeaders.add(header); + } + } + if (!missingHeaders.isEmpty()) { + workbook.close(); + return CommonResult.failed("缺少必要表头: " + String.join(", ", missingHeaders)); + } + List<CompanyIndustryTemplate> companyIndustryTemplates = new ArrayList<>(); + LoginUserDetails loginUser = SecurityUtils.getLoginUser(); + DataFormatter dataFormatter = new DataFormatter(); + StringBuilder errorBuilder = new StringBuilder(); + // 2. 获取各列的索引 + int chapterIndex = columnIndexMap.get("章节"); + int templateNameIndex = columnIndexMap.get("文件记录"); + int typeIndex = columnIndexMap.get("分类"); + int industryTypeIndex = columnIndexMap.get("行业"); + int companyNameIndex = columnIndexMap.get("企业名称"); + // 3. 从第二行开始处理数据 + for (int i = 1; i <= sheet.getLastRowNum(); i++) { + Row row = sheet.getRow(i); + if (row == null) continue; + + CompanyIndustryTemplate template = new CompanyIndustryTemplate(); + template.setCreateBy(loginUser.getUsername()); + template.setCreateTime(LocalDateTime.now()); + + // 4. 使用动态索引获取单元格 + template.setChapter(getCellValue(row, chapterIndex, dataFormatter)); + template.setTemplateName(getCellValue(row, templateNameIndex, dataFormatter)); + template.setType(getCellValue(row, typeIndex, dataFormatter)); + + // 5. 处理行业类型映射 + String industryName = getCellValue(row, industryTypeIndex, dataFormatter); + boolean industryFound = false; + for (CompanyIndustryType type : companyIndustryTypes) { + if (industryName.equals(type.getName())) { + template.setIndustryType(type.getId()); + industryFound = true; + break; + } + } + if (!industryFound) { + errorBuilder.append("第").append(i + 1).append("行: 未找到行业[").append(industryName).append("]; "); + } + + // 6. 处理企业映射 + String companyName = getCellValue(row, companyNameIndex, dataFormatter); + boolean companyFound = false; + for (SysCompany company : list) { + if (companyName.equals(company.getName())) { + template.setCompanyId(company.getId()); + companyFound = true; + break; + } + } + if (!companyFound) { + errorBuilder.append("第").append(i + 1).append("行: 未找到企业[").append(companyName).append("]; "); + } + if (SecurityUtils.getCompanyId()!=null){ + template.setCompanyId(SecurityUtils.getCompanyId()); + } + + companyIndustryTemplates.add(template); + } + + // 7. 错误处理 + if (errorBuilder.length() > 0) { + workbook.close(); + return CommonResult.failed(errorBuilder.toString()); + } + + // 8. 批量插入 + int affectedRows = companyIndustryTemplateMapper.insertIndustrys(companyIndustryTemplates); + workbook.close(); + + if (affectedRows < 1) { + throw new ApiException("导入行业模版失败"); + } + return CommonResult.success(); + } + // 安全获取单元格值 + private String getCellValue(Row row, int columnIndex, DataFormatter formatter) { + if (columnIndex < 0) return ""; + Cell cell = row.getCell(columnIndex, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK); + return formatter.formatCellValue(cell).trim(); + } + +// List<CompanyIndustryType> companyIndustryTypes = sysIndustryTypeMapper.selectIndustryTypeList(); +// List<SysCompany> list = sysCompanyService.selectCompanyLists(); +// Workbook workbook = WorkbookFactory.create(file.getInputStream()); +// Sheet sheetAt = workbook.getSheetAt(0); +// List<CompanyIndustryTemplate> companyIndustryTemplates = new ArrayList<>(); +// LoginUserDetails loginUser = SecurityUtils.getLoginUser(); +// DataFormatter dataFormatter = new DataFormatter(); +// StringBuilder stringBuilder = new StringBuilder(); +// for (int i = 0; i <sheetAt.getLastRowNum(); i++) { +// Row row = sheetAt.getRow(i + 1); +// CompanyIndustryTemplate companyIndustryTemplate = new CompanyIndustryTemplate(); +// if (row!=null){ +// companyIndustryTemplate.setChapter(dataFormatter.formatCellValue(row.getCell(0))); +// companyIndustryTemplate.setTemplateName(dataFormatter.formatCellValue(row.getCell(1))); +// companyIndustryTemplate.setType(dataFormatter.formatCellValue(row.getCell(2))); +// for (CompanyIndustryType companyIndustryType : companyIndustryTypes) { +// if (dataFormatter.formatCellValue(row.getCell(3)).equals(companyIndustryType.getName())){ +// companyIndustryTemplate.setIndustryType(companyIndustryType.getId()); +// } +// } +// if (companyIndustryTemplate.getIndustryType()==null){ +// stringBuilder.append("未找到对应行业类型:["+dataFormatter.formatCellValue(row.getCell(3))+"] ,"); +// } +// companyIndustryTemplate.setCreateBy(loginUser.getUsername()); +// companyIndustryTemplate.setCreateTime(LocalDateTime.now()); +// for (SysCompany sysCompany : list) { +// if (dataFormatter.formatCellValue(row.getCell(4)).equals(sysCompany.getName())){ +// companyIndustryTemplate.setCompanyId(sysCompany.getId()); +// } +// } +// if (companyIndustryTemplate.getCompanyId()==null){ +// stringBuilder.append("未找到对应企业:["+dataFormatter.formatCellValue(row.getCell(4))+"]"); +// } +// companyIndustryTemplates.add(companyIndustryTemplate); +// } +// } +// if (StringUtils.isNotBlank(stringBuilder)){ +// workbook.close(); +// return CommonResult.failed(stringBuilder.toString()); +// } +// int i = companyIndustryTemplateMapper.insertIndustrys(companyIndustryTemplates); +// if (i<1){ +// throw new ApiException("导入行业模版失败"); +// } +// workbook.close(); +// return CommonResult.success(); + + } diff --git a/multi-system/src/main/java/com/gkhy/exam/system/service/impl/SysCompanyServiceImpl.java b/multi-system/src/main/java/com/gkhy/exam/system/service/impl/SysCompanyServiceImpl.java index f412993..64651af 100644 --- a/multi-system/src/main/java/com/gkhy/exam/system/service/impl/SysCompanyServiceImpl.java +++ b/multi-system/src/main/java/com/gkhy/exam/system/service/impl/SysCompanyServiceImpl.java @@ -101,4 +101,9 @@ throw new ApiException("分配课时失败"); } } + + @Override + public List<SysCompany> selectCompanyLists() { + return baseMapper.selectCompanyListS(); + } } diff --git a/multi-system/src/main/resources/mapper/system/CompanyIndustryTemplateMapper.xml b/multi-system/src/main/resources/mapper/system/CompanyIndustryTemplateMapper.xml index a8011e9..cf772ec 100644 --- a/multi-system/src/main/resources/mapper/system/CompanyIndustryTemplateMapper.xml +++ b/multi-system/src/main/resources/mapper/system/CompanyIndustryTemplateMapper.xml @@ -1,6 +1,16 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.gkhy.exam.system.mapper.CompanyIndustryTemplateMapper"> + <insert id="insertIndustrys"> + INSERT INTO `company_industry_template` ( + `company_id`,`chapter`,`type`,`template_name`,`industry_type`,`create_by`,`create_time` + ) + VALUES + <foreach collection="companyIndustryTemplates" separator="," item="item"> + (#{item.companyId},#{item.chapter},#{item.type},#{item.templateName},#{item.industryType}, + #{item.createBy},#{item.createTime}) + </foreach> + </insert> <update id="updateCompanyIndustryTemplateById" parameterType="com.gkhy.exam.system.domain.CompanyIndustryTemplate"> UPDATE company_industry_template <set> @@ -9,6 +19,9 @@ </if> <if test="companyName != null and companyName != ''" > company_name = #{companyName}, + </if> + <if test="chapter!=null and chapter!=''"> + chapter = #{chapter}, </if> <if test="templateName != null and templateName !=''" > template_name = #{templateName}, @@ -49,6 +62,8 @@ ci.`id`, ci.`company_id`, ci.`company_name`, + ci.chapter, + ci.`type`, ci.`template_name`, ci.`industry_type`, cit.name as industry_name, @@ -71,6 +86,9 @@ <if test="industryType!=null"> and ci.industry_type = #{industryType} </if> + <if test="type!=null and type!=''"> + and ci.type like concat('%',#{type},'%') + </if> ORDER BY ci.create_time DESC </select> diff --git a/multi-system/src/main/resources/mapper/system/SysCompanyMapper.xml b/multi-system/src/main/resources/mapper/system/SysCompanyMapper.xml index 5560830..7c3e301 100644 --- a/multi-system/src/main/resources/mapper/system/SysCompanyMapper.xml +++ b/multi-system/src/main/resources/mapper/system/SysCompanyMapper.xml @@ -151,4 +151,8 @@ </if> group by a.company_id </select> + <select id="selectCompanyListS" resultType="com.gkhy.exam.system.domain.SysCompany"> + select id, name, credit_code, major, phone,remain_period,total_period,version, create_by, create_time, update_by, update_time, remark + from sys_company where del_flag = 0 + </select> </mapper> -- Gitblit v1.9.2