通过easyexcel导入数据,添加表格参数的校验,同表格内校验以及和已有数据的校验

 引入依赖

<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.2.11</version><scope>compile</scope></dependency>

需要导入到某个目录下

如果产品名称相同,就追加里面的型号,如果型号也相同就返回提示,

如果产品名称相同,表格内的数据要和浏览器录入的 型号对应参数保持一致,顺序、名称、数量等都要完全一致

如果产品名称相同,表格内部的 型号对应的参数必须保持一致,顺序、名称、数量等都要完全一致;

例如:

 导入的表格要个浏览器对应上

controller

	/*** 导入设备*/@PostMapping("importProduct")@ApiOperationSupport(order = 11)@ApiOperation(value = "导入设备", notes = "传入excel/产品")public R importProduct(MultipartFile file, Long categoryId) throws IOException {//此处判断文件大小不能为0if (file.getSize() == 0) {return R.fail("文件大小不能为空");}if (categoryId == null || categoryId <= 0) {return R.fail("请选择所属产品分类");}return productService.importProduct(file, categoryId);}

services

	//导入产品@Override@Transactional(rollbackFor = Exception.class)public R importProduct(MultipartFile file, Long categoryId) throws IOException {CategoryEntity category = categoryService.getById(categoryId);if (category == null) {throw new ServiceException("产品分类不存在");}DataExcelListener<ProductImportExcel> listener = new DataExcelListener<ProductImportExcel>();// headRowNumber(2):表示第一、二行为表头,从第三行取值ExcelReader excelReader = EasyExcelFactory.read(file.getInputStream(), ProductImportExcel.class, listener).headRowNumber(2).build();excelReader.readAll();List<ProductImportExcel> data = listener.getDatas();excelReader.finish();Map<String, List<CodeProTypeJson>> map = new LinkedHashMap<>();//获取表格数据,根据表格每一行的列数量不同,获取数据后组装型号jsongetExcelData(data, map);// 转换数据并添加产品List<ProductEntity> productList = new ArrayList<>();//判断导入的产品名称和已有的产品名称是否相同,如果相同就追加型号List<String> productNameList = new ArrayList<>();for (Map.Entry<String, List<CodeProTypeJson>> listEntry : map.entrySet()) {String productName = listEntry.getKey();List<CodeProTypeJson> value = listEntry.getValue();ProductEntity product = new ProductEntity();product.setCategoryId(categoryId);product.setCodeProName(productName);product.setCodeProType(JSON.toJSONString(value));product.setCodeProTypeNum(value.size());product.setEnterpriseId(IotAuthUtil.getEnterpriseId());productNameList.add(productName);productList.add(product);}// 批量查询 已经存在的产品 存在就覆盖 不存在就新增if (productNameList != null && productNameList.size() > 0) {LambdaQueryWrapper<ProductEntity> queryWrapper = new LambdaQueryWrapper<>();queryWrapper.in(ProductEntity::getCodeProName, productNameList);List<ProductEntity> selectList = baseMapper.selectList(queryWrapper);List<ProductEntity> updateList = new ArrayList<>();List<ProductEntity> addList = new ArrayList<>();for (ProductEntity entity : productList) {// 判断产品是否已经添加,如已添加就走修改逻辑,未添加就走添加逻辑ProductEntity product = containsProductEntity(entity, selectList);if (product != null) {entity.setId(product.getId());updateList.add(entity);} else {addList.add(entity);}/*Long productId = containsProductEntity(entity, selectList);if (productId != null) {entity.setId(productId);updateList.add(entity);} else {addList.add(entity);}*/}// 批量更新if (updateList != null && updateList.size() > 0) {this.updateBatchById(updateList);}// 批量添加if (addList != null && addList.size() > 0) {this.saveBatch(addList);}}return R.success("导入成功!");}

 Excel导入数据 解析监听器 用于获取excel表格的数据

package com.bluebird.code.util;import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.excel.metadata.Cell;import java.util.ArrayList;
import java.util.List;
import java.util.Map;/*** Excel导入数据 解析监听器 用于获取excel表格的数据*/
public class DataExcelListener<T> extends AnalysisEventListener<T> {/*** 自定义用于暂时存储data* 可以通过实例获取该值*/private List<T> datas = new ArrayList<>();/*** 每解析一行都会回调invoke()方法** @param object  读取后的数据对象* @param context 内容*/@Override@SuppressWarnings("unchecked")public void invoke(Object object, AnalysisContext context) {T data = (T) object;//数据存储到list,供批量处理,判断每一行是否为空行。if (data != null && !isEmptyRow(context.readRowHolder().getCellMap())) {datas.add(data);}}@Overridepublic void doAfterAllAnalysed(AnalysisContext context) {//解析结束销毁不用的资源//注意不要调用datas.clear(),否则getDatas为null}/*** 返回数据** @return 返回读取的数据集合**/public List<T> getDatas() {return datas;}/*** 设置读取的数据集合** @param datas 设置读取的数据集合**/public void setDatas(List<T> datas) {this.datas = datas;}/*** 判断一行是否为空行* @param cellMap 当前行的单元格映射* @return 如果所有单元格都为空,则返回 true,否则返回 false*/private boolean isEmptyRow(Map<Integer, Cell> cellMap) {for (Object cellValue : cellMap.values()) {if (cellValue != null && !cellValue.toString().trim().isEmpty()) {return false;}}return true;}}

获取数据后组装型号json串 (同时处理表格内部相同产品名称不同型号参数名的问题,要确保相同参数名称的参数名保持一致)

// 获取数据后组装型号json串 (同时处理表格内部相同产品名称不同型号参数名的问题,要确保相同参数名称的参数名保持一致)public void getExcelData(List<ProductImportExcel> data, Map<String, List<CodeProTypeJson>> map) {int count = 2;// 判断产品名称和型号是否相等,如过相等就返回提示,产品名和型号组成合并后需要唯一Map<String, String> proNameTypeMap = new HashMap<>();// 定义一个map集合,key:产品名称,value:型号集合的名称拼接Map<String, String> mapProductType = new LinkedHashMap<>();for (ProductImportExcel entity : data) {count++;String productName = entity.getCodeProName();String codeProType = entity.getCodeProType();String proNameType = productName + codeProType;if (StringUtils.isBlank(productName) || StringUtils.isEmpty(productName)) {throw new ServiceException("第 " + count + " 行产品名称不能为空!");}if (StringUtils.isBlank(codeProType) || StringUtils.isEmpty(codeProType)) {throw new ServiceException("第 " + count + " 行规格型号不能为空!");}//String proNameTypeStr = proNameTypeMap.get(proNameType);if (StringUtils.isNotBlank(proNameTypeStr)) {throw new ServiceException("第 " + count + " 行和第 " + (count - 1) + "产品名称下的规格型号不能重复!");}proNameTypeMap.put(proNameType, proNameType);List<CodeProTypeJson> list = map.get(productName);CodeProTypeJson json = new CodeProTypeJson();List<CodeProTypeJson.SkuParamsList> listDate = new ArrayList<>();json.setSkuName(entity.getCodeProType());json.setSkuId(IdWorker.getIdStr());// 将参数名进行拼接StringBuilder paramSb = new StringBuilder();// 根据型号参数名字处理表格数据,如果此单元格为空就不处理(因为每个产品的型号数量不确定)if (StringUtils.isNotEmpty(entity.getParamName1())) {CodeProTypeJson.SkuParamsList skuParamsList = new CodeProTypeJson.SkuParamsList();skuParamsList.setParamId(IdWorker.getIdStr());skuParamsList.setParamName(entity.getParamName1());skuParamsList.setParamValue(entity.getParamValue1());listDate.add(skuParamsList);paramSb.append(entity.getParamName1());}// 根据型号参数名字处理表格数据,如果此单元格为空就不处理(因为每个产品的型号数量不确定)if (StringUtils.isNotEmpty(entity.getParamName2())) {CodeProTypeJson.SkuParamsList skuParamsList = new CodeProTypeJson.SkuParamsList();skuParamsList.setParamId(IdWorker.getIdStr());skuParamsList.setParamName(entity.getParamName2());skuParamsList.setParamValue(entity.getParamValue2());listDate.add(skuParamsList);paramSb.append("->");paramSb.append(entity.getParamName2());}// 根据型号参数名字处理表格数据,如果此单元格为空就不处理(因为每个产品的型号数量不确定)if (StringUtils.isNotEmpty(entity.getParamName3())) {CodeProTypeJson.SkuParamsList skuParamsList = new CodeProTypeJson.SkuParamsList();skuParamsList.setParamId(IdWorker.getIdStr());skuParamsList.setParamName(entity.getParamName3());skuParamsList.setParamValue(entity.getParamValue3());listDate.add(skuParamsList);paramSb.append("->");paramSb.append(entity.getParamName3());}// 根据型号参数名字处理表格数据,如果此单元格为空就不处理(因为每个产品的型号数量不确定)if (StringUtils.isNotEmpty(entity.getParamName4())) {CodeProTypeJson.SkuParamsList skuParamsList = new CodeProTypeJson.SkuParamsList();skuParamsList.setParamId(IdWorker.getIdStr());skuParamsList.setParamName(entity.getParamName4());skuParamsList.setParamValue(entity.getParamValue4());listDate.add(skuParamsList);paramSb.append("->");paramSb.append(entity.getParamName4());}// 根据型号参数名字处理表格数据,如果此单元格为空就不处理(因为每个产品的型号数量不确定)if (StringUtils.isNotEmpty(entity.getParamName5())) {CodeProTypeJson.SkuParamsList skuParamsList = new CodeProTypeJson.SkuParamsList();skuParamsList.setParamId(IdWorker.getIdStr());skuParamsList.setParamName(entity.getParamName5());skuParamsList.setParamValue(entity.getParamValue5());listDate.add(skuParamsList);paramSb.append("->");paramSb.append(entity.getParamName5());}// 根据型号参数名字处理表格数据,如果此单元格为空就不处理(因为每个产品的型号数量不确定)if (StringUtils.isNotEmpty(entity.getParamName6())) {CodeProTypeJson.SkuParamsList skuParamsList = new CodeProTypeJson.SkuParamsList();skuParamsList.setParamId(IdWorker.getIdStr());skuParamsList.setParamName(entity.getParamName6());skuParamsList.setParamValue(entity.getParamValue6());listDate.add(skuParamsList);paramSb.append("->");paramSb.append(entity.getParamName6());}// 根据型号参数名字处理表格数据,如果此单元格为空就不处理(因为每个产品的型号数量不确定)if (StringUtils.isNotEmpty(entity.getParamName7())) {CodeProTypeJson.SkuParamsList skuParamsList = new CodeProTypeJson.SkuParamsList();skuParamsList.setParamId(IdWorker.getIdStr());skuParamsList.setParamName(entity.getParamName7());skuParamsList.setParamValue(entity.getParamValue7());listDate.add(skuParamsList);paramSb.append("->");paramSb.append(entity.getParamName7());}// 根据型号参数名字处理表格数据,如果此单元格为空就不处理(因为每个产品的型号数量不确定)if (StringUtils.isNotEmpty(entity.getParamName8())) {CodeProTypeJson.SkuParamsList skuParamsList = new CodeProTypeJson.SkuParamsList();skuParamsList.setParamId(IdWorker.getIdStr());skuParamsList.setParamName(entity.getParamName8());skuParamsList.setParamValue(entity.getParamValue8());listDate.add(skuParamsList);paramSb.append("->");paramSb.append(entity.getParamName8());}// 将参数名拼接后转换字符串String paramSbStr = paramSb.toString();// 根据当前行的产品名称去map集合获取已经存入的参数名的拼接串String paramNameMap = mapProductType.get(productName);if (Func.isNotBlank( paramNameMap ) && !paramNameMap.equals( paramSbStr )) {String msg = "[ " + paramNameMap + " ] 和 [ " + paramSbStr + " ] 型号参数名称、数量、顺序需保持一致";throw new ServiceException(" 产品名称为:[ " + productName + " ] 的型号参数与表格其他行的参数名称或顺序不一致,请修改!</br>" + msg);}// 如果校验通过后添加参数拼接串到map集合中mapProductType.put(productName, paramSbStr);json.setSkuParamsList(listDate);if (list == null) {list = new ArrayList<>();}List<CodeProTypeJson> typeJsons = map.get(productName);if (typeJsons != null && typeJsons.size() > 0) {typeJsons.add(json);map.put(productName, typeJsons);} else {list.add(json);map.put(productName, list);}}}

判断产品是否已经添加,如已添加就走修改逻辑,未添加就走添加逻辑  excel:entity

	// 判断产品是否已经添加,如已添加就走修改逻辑,未添加就走添加逻辑  excel:entityprivate static ProductEntity containsProductEntity(ProductEntity entity, List<ProductEntity> selectList) {for (ProductEntity item : selectList) {if (item.getCodeProName().equals(entity.getCodeProName())) {// 如果导入的产品名称和已经添加的产品名称相同,就追加型号,如果型号相同,就返回提示List<CodeProTypeJson> itemTypeJsonList = JSONObject.parseArray(Func.toStr(item.getCodeProType()), CodeProTypeJson.class);List<CodeProTypeJson> excelTypeJsonList = JSONObject.parseArray(Func.toStr(entity.getCodeProType()), CodeProTypeJson.class);for (CodeProTypeJson itemJson : itemTypeJsonList) {for (CodeProTypeJson excelJson : excelTypeJsonList) {if (Objects.equals(itemJson.getSkuName(), excelJson.getSkuName())) {throw new ServiceException(" 产品名称为: " + item.getCodeProName() + " 的 " + itemJson.getSkuName() + " 型号已存在,请先修改该型号");}}}// 比较 如果导入的产品名称和数据库已有的数据产品名称相同,就比对型号的名称和顺序是否一致,如果不一致就返回提示if (itemTypeJsonList != null && itemTypeJsonList.size() > 0 && excelTypeJsonList != null && excelTypeJsonList.size() > 0) {// 获取查询到的第一个型号的参数列表CodeProTypeJson codeProTypeJson = itemTypeJsonList.get(0);List<CodeProTypeJson.SkuParamsList> itemSkuParamsList = codeProTypeJson.getSkuParamsList();// 将参数名进行拼接StringBuilder sbItem = new StringBuilder();for (int i = 0; i < itemSkuParamsList.size(); i++) {CodeProTypeJson.SkuParamsList param = itemSkuParamsList.get(i);sbItem.append(param.getParamName());if (i < itemSkuParamsList.size() - 1) {sbItem.append("->");}}String itemTypeJson = sbItem.toString();// 遍历excel表格里面的所有型号对应的参数列表for (CodeProTypeJson json : excelTypeJsonList) {List<CodeProTypeJson.SkuParamsList> skuParamsList = json.getSkuParamsList();// 遍历某个型号的所有参数名,将参数名进行拼接StringBuilder sbJson = new StringBuilder();for (int i = 0; i < skuParamsList.size(); i++) {CodeProTypeJson.SkuParamsList param = skuParamsList.get(i);sbJson.append(param.getParamName());if (i < skuParamsList.size() - 1) {sbJson.append("->");}}String excelTypeJson = sbJson.toString();System.out.println("itemTypeJson " + itemTypeJson);System.out.println("excelTypeJson " + excelTypeJson);System.out.println(itemTypeJson.equals(excelTypeJson));// 比对数据库查询的 拼接参数和excel表格里面的 拼接参数是否一致if (!itemTypeJson.equals(excelTypeJson)) {String msg = "原参数[ " + itemTypeJson + " ] 新参数 [ " + excelTypeJson + " ]";throw new ServiceException(" 产品名称为:[ " + item.getCodeProName() + " ]的型号参数与已有参数名称不一致或顺序不一致,请修改!</br>" + msg);}}}itemTypeJsonList.addAll(excelTypeJsonList);entity.setCodeProType(JSON.toJSONString(itemTypeJsonList));entity.setCodeProTypeNum(itemTypeJsonList.size());entity.setId(item.getId());return entity;}}return null;}

ProductEntity实体类

package com.bluebird.code.entity;import com.baomidou.mybatisplus.annotation.TableName;
import com.bluebird.core.tenant.mp.TenantEntity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;/*** 赋码 - 产品表 实体类 */
@Data
@TableName("t_code_product")
@ApiModel(value = "Product对象", description = "赋码 - 产品表")
@EqualsAndHashCode(callSuper = true)
public class ProductEntity extends TenantEntity {/*** 企业id*/@ApiModelProperty(value = "企业id")private Long enterpriseId;/*** 产品名称*/@ApiModelProperty(value = "产品名称")private String codeProName;/*** 产品编号*/@ApiModelProperty(value = "产品编号")private String codeProNum;/*** 产品分类*/@ApiModelProperty(value = "产品分类")private Long categoryId;/*** 产品图片*/@ApiModelProperty(value = "产品图片")private String codeProImage;/*** 产品主图图片*/@ApiModelProperty(value = "产品主图图片")private String codeMainImage;/*** 产品视频*/@ApiModelProperty(value = "产品视频")private String codeProVideo;/*** 产品型号(第一组元素必须为规格型号)** @see com.bluebird.code.dto.CodeProTypeJson*/@ApiModelProperty(value = "产品型号(第一组元素必须为规格型号)")
//	private CodeProTypeJson codeProType;private String codeProType;/*** 产品简介*/@ApiModelProperty(value = "产品简介")private String codeProDesc;/*** 规格数量*/@ApiModelProperty(value = "规格数量")private Integer codeProTypeNum;/*** 排序*/@ApiModelProperty(value = "排序")private Integer sort;/*** 备注*/@ApiModelProperty(value = "备注")private String remark;}

CodeProTypeJson 产品型号Json对象 (第一组元素必须为规格型号)

package com.bluebird.code.dto;import lombok.Data;import java.util.List;/**** 产品型号Json对象 (第一组元素必须为规格型号)*** @return:* @date: 2024/6/20*/
@Data
public class CodeProTypeJson {//产品idprivate String skuId;//产品型号private String skuName;//规格英文名称private String skuEnName;//产品规格参数Listprivate List<SkuParamsList> skuParamsList;@Datapublic static class SkuParamsList {//规格idprivate String paramId;//规格名称private String paramName;//规格英文名称private String paramEnName;//规格参数值private String paramValue;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/368486.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

收银系统源码-收银台营销功能-购物卡

1. 功能描述 购物卡&#xff1a;基于会员的电子购物卡&#xff0c;支持设置时效、适用门店、以及可用商品&#xff1b;支持售卖和充值赠送&#xff0c;在收银台可以使用&#xff1b; 2.适用场景 会员充值赠送活动&#xff0c;例如会员充值1000元&#xff0c;赠送面值100元购…

Redis基础教程(一):redis配置

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; &#x1f49d;&#x1f49…

【FFmpeg】av_read_frame函数

目录 1.av_read_frame1.2 从pkt buffer中读取帧&#xff08;avpriv_packet_list_get&#xff09;1.3 从流当中读取帧&#xff08;read_frame_internal&#xff09;1.3.1 读取帧&#xff08;ff_read_packet&#xff09;1.3.2 解析packet&#xff08;parse_packet&#xff09;1.3…

【有哪些GPU算力租用平台值得推荐】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

性能测试、负载测试、压力测试、稳定性测试简单区分【超详细】

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 性能测试是一个总称&#xff0c;可细分为性能测试、负载测试、压力测试、稳定性测试。 性能测试…

嵌入式底层系统了解

当裸机功能不复杂的时候&#xff0c;即类似与点亮一个LED灯&#xff0c;驱动LCD和OLED这样的模块&#xff0c;以及各位大学生的搭积木式的毕业设计(狗头保命&#xff09;&#xff0c;此时可以简单地分为硬件和软件层&#xff08;应用层),以及以中间层作为中间联系。 当需要实现…

必备的 Adobe XD 辅助工具

想要高效便捷的使用 Adobe XD&#xff0c; Adobe XD 插件是必不可少的&#xff0c; Adobe XD 的插件非常多&#xff0c;但 90%都是英文&#xff0c;并且良莠不齐。在这儿挑选 9 个好用的 Adobe XD 插件给大家&#xff0c;这里是我整理的一些实用 Adobe XD 插件&#xff0c;让你…

No module named ‘MySQLdb‘

python 运行代码的时候遇到No module named ‘MySQLdb’报错如何解决&#xff1f; 解决办法 如果没有安装可以先安装以下依赖库 pip install PyMySQL如果已经安装了PyMySQL&#xff0c;仍然报MySQLdb模块找不到&#xff0c;可以尝试安装以下依赖库。 pip install mysqlclient

window下git bash设置启动后默认路径进入自己的工程

方法一&#xff1a;更改快捷方式 方法二&#xff1a;修改~/.bashrc

Vulkan学习——渲染3D模型

摘要&#xff1a;本文简要描述了Vulkan渲染一个3D模型需要做的事情&#xff0c;不会对太细节的内容进行深究。   关键字&#xff1a;Vulkan,Render,3D 源码 1 简介 1.1 Vulkan简介 Vulkan是一个低开销、跨平台的二维、三维图形与计算的应用程序接口&#xff08;API&#x…

在windows上安装objection

安装命令pip install objection -i https://mirrors.aliyun.com/pypi/simple hook指定进程 objection -g 测试 explore 进程名不定是包名&#xff0c;也可能是app名字&#xff0c;如“测试”就是app的名字 若出现如下错误&#xff0c;说明python 缺少setuptools 直接安装setu…

全面教程:在Ubuntu上快速部署ZeroTier,实现Windows与VSCode的局域网无缝访问

文章目录 1 背景介绍2 Windows上的操作3 Ubuntu上的操作4 连接 1 背景介绍 在现代工作环境中&#xff0c;远程访问公司内网的Ubuntu主机对于开发者来说是一项基本需求。然而&#xff0c;由于内网的限制&#xff0c;传统的远程控制软件如向日葵和todesk往往无法满足这一需求。作…

Java教程之IO模式精讲,NIO+BIO

第一章 BIO、NIO、AIO介绍 背景 在java的软件设计开发中&#xff0c;通信架构是不可避免的&#xff0c;我们在进行不同系统或者不同进程之间的数据交互&#xff0c;或 者在高并发下的通信场景下都需要用到网络通信相关的技术&#xff0c;对于一些经验丰富的程序员来说&#x…

【JavaEE】多线程代码案例(2)

&#x1f38f;&#x1f38f;&#x1f38f;个人主页&#x1f38f;&#x1f38f;&#x1f38f; &#x1f38f;&#x1f38f;&#x1f38f;JavaEE专栏&#x1f38f;&#x1f38f;&#x1f38f; &#x1f38f;&#x1f38f;&#x1f38f;上一篇文章&#xff1a;多线程代码案例(1)&a…

用户资料门户的构建

1. 需求背景 老的页面停止维护了,且老旧, 功能单一,且页面分散. 急需做功能集成的平台化建设原先的用户资料查询没有做权限管控, 每一次查询都会消耗我们组的人力资源. 2. 项目介绍 2.1. 项目地址 服务地址: [公司内网服务(略)] 工蜂地址: [公司内网仓库(略)] 2.2 项目的价…

​​服务拆分的原则

目录 一、单一职责原则 二、服务自治原则 三、单向依赖 一、单一职责原则 单⼀职责原则原本是面向对象设计中的⼀个基本原则, 它指的是⼀个类应该专注于单⼀功能. 不要存在多于⼀个导致类变更的原因 在微服务架构中, ⼀个微服务也应该只负责⼀个功能或业务领域, 每个服务应该…

2024亚太赛(中文赛)数学建模竞赛选题建议+初步分析

提示&#xff1a;DS C君认为的难度&#xff1a;B<C<A&#xff0c;开放度&#xff1a;C<A<B。 综合评价来看 A题适合有较强计算几何和优化能力的团队&#xff0c;难度较高&#xff0c;但适用面较窄。 B题数据处理和分析为主&#xff0c;适合数据科学背景的团队…

【秋招突围】2024届秋招笔试-科大讯飞笔试题-04-三语言题解(Java/Cpp/Python)

&#x1f36d; 大家好这里是清隆学长 &#xff0c;一枚热爱算法的程序员 ✨ 本系计划跟新各公司春秋招的笔试题 &#x1f4bb; ACM银牌&#x1f948;| 多次AK大厂笔试 &#xff5c; 编程一对一辅导 &#x1f44f; 感谢大家的订阅➕ 和 喜欢&#x1f497; &#x1f4e7; 清隆这边…

PDM系统中物料分类与编码规则生成方案

在企业管理软件中&#xff0c;PDM系统是企业管理的前端软件&#xff0c;用于管理研发图纸、BOM等数据&#xff0c;然后生成相关物料表或BOM&#xff0c;递交给后端ERP系统进行生产管理。在PDM系统中&#xff0c;有两种方式可以生成物料编码。 1第一种是用户可以通过软件接口将…

Linux学习第54天:Linux WIFI 驱动:蓝星互联

Linux版本号4.1.15 芯片I.MX6ULL 大叔学Linux 品人间百味 思文短情长 数字化、现代化的今天&#xff0c;随处的WIFI给与了大众极大的方便&#xff0c;也感受到了科技的力量。万物互联、无线互联越来越成为一个不可逆转的趋势。现在比较火…