Appearance
partMain 链路分析
源文件:
docs/front end/dm/lemes-web/src/views/devicemate/information/partMain/partMain.vue前端 API:
docs/front end/dm/lemes-web/src/views/devicemate/api/information/partMain/partMain.js后端落点:
lemes-cloud/lemes-business-devicemate/lemes-service-dm-store/lemes-service-dm-store-server/src/main/java/com/lenovo/lemes/service/dm/store/controller/PartMainController.java/lemes-cloud/lemes-business-devicemate/lemes-service-dm-store/lemes-service-dm-store-server/src/main/java/com/lenovo/lemes/service/dm/store/service/impl/PartMainServiceImpl.java主表:
part_main
Vue 组件总览
| 组件 | 层级路径 | 角色 | 是否主链路 | 是否直接CRUD | 独立MD | 跳转 | 一句话作用 |
|---|---|---|---|---|---|---|---|
index | index | 主页面 | 是 | 否 | 当前页 | 查看 | 承接 partMain 页面主入口、列表查询,以及 2 个重点子组件的调度。 |
addPartMain | index > addPartMain | 重点子组件 | 是 | 是 | 是 | 查看 | 承接新增表单录入、校验和提交。 |
updatePartMain | index > updatePartMain | 重点子组件 | 是 | 是 | 是 | 查看 | 承接详情回显、字段修改和提交。 |
importFile | index > importFile | 业务化公共组件 | 是 | 是 | 否 | 查看 | 复用通用组件外壳,但当前页通过 :import-file-ajax 注入业务配置,承接Excel 导入。 |
importZipFile | index > importZipFile | 业务化公共组件 | 是 | 是 | 否 | 查看 | 复用通用组件外壳,但当前页通过 :import-zip-file-ajax 注入业务配置,承接图片导入。 |
辅助组件说明
boxSearch:负责查询条件区,支持搜索和清空事件触发。iTable:负责通用列表渲染、分页、多选、排序和操作列承载。dialogs:负责通用弹窗容器、确认和关闭交互,在addPartMain/updatePartMain/importFile/importZipFile中复用。
技术图

Flow 布局:
standard
Summary 布局:
standard
1. 页面概览
- 当前节点对应文件
docs/front end/dm/lemes-web/src/views/devicemate/information/partMain/partMain.vue。 - 当前节点识别到 4 个重点组件、11 个辅助组件。
- 当前节点识别到 0 条业务页面跳转链路、10 个真实接口。
- 页面激活时会先加载字典数据,再自动触发首屏分页查询。
- 搜索动作会把
filterList同步到searchFilter,并把页码重置为第 1 页。 - 重置动作会清空查询条件,再走一次分页查询。
- 表格排序会把前端排序字段写入
field/order,再触发服务端排序查询。 - 导出动作会把当前筛选条件、排序字段以及勾选 ids 一起传给导出接口。
- 批量删除依赖
selectionData,先二次确认,再把勾选 id 数组传给删除接口。
2. 上游入口
- 当前节点是本次递归文档的根入口。
3. 业务页面跳转链路
- 当前节点未识别出业务页面跳转链路。
4. 前端真实调用链
- <boxSearch> @research -> research ->
pageAjax - <boxSearch> @reempty -> reempty ->
pageAjax - <iTable> @size-change / <iTable> @current-change -> currentChange ->
pageAjax - <el-button> @click -> deletePartMainArr ->
partMaindeleteArr/pageAjax - <el-button> @click -> exportAction ->
exportAjax - <importFile> @importAction -> importAction ->
pageAjax - <importZipFile> @importZipAction -> importZipAction ->
pageAjax - activated 生命周期 -> activated ->
pageAjax - <el-button> @click -> getTemplateData ->
getTemplateList
5. 接口总览
| method | path | 功能 | 所属节点 | 前端触发 | 后端入口 |
|---|---|---|---|---|---|
| POST | /dm-store/partMain/page | 分页查询 | 主页面 | <boxSearch> @research -> research -> currentChange -> getPage -> pageAjax | partMainPage |
| GET | /dm-store/partMain/detail/{id} | 详情回显 | updatePartMain 编辑页 | 父页 updateDate = id / updateFlag = true -> updatePartMain.vue approvalOpen -> getDetailData -> getDetail | partMainDetail |
| POST | /dm-store/partMain/add | 新增提交 | 主页面 addPartMain 新增页 | 父页 addFlag = true -> addPartMain.vue approvalAction -> emit addAction -> 父页 addAction -> partMainAdd | addPartMain |
| POST | /dm-store/partMain/update | 更新提交 | 主页面 updatePartMain 编辑页 | 父页 updateDate = id / updateFlag = true -> updatePartMain.vue approvalAction -> emit updateAction -> 父页 updateSubmitAction -> partMainUpdate | update |
| GET | /dm-store/partMain/deletePicture/{id} | 附件删除 | updatePartMain 编辑页 | updatePartMain.vue removeImage -> deleteImg | deletePicture |
| POST | /dm-store/partMain/delete | 删除提交 | 主页面 | <el-button> @click -> deletePartMainArr -> partMaindeleteArr | deletePartMain |
| POST | /dm-store/partMain/fileUpload | 附件上传 | addPartMain 新增页 updatePartMain 编辑页 | addPartMain.vue UploadFile -> uploadImg | fileUpload |
| POST | /dm-store/partMain/importExcel | Excel 导入 | 主页面 | - | importExcel |
| POST | /dm-store/partMain/importPic | 图片导入 | 主页面 | - | importPic |
| POST | /dm-store/partMain/exportExcel | Excel 导出 | 主页面 | <el-button> @click -> exportAction -> exportAjax | exportExcel |
6. 接口详细说明
6.1 POST /dm-store/partMain/page
接口信息
- 请求地址:
/dm-store/partMain/page - 请求方式:
POST - 功能简述:分页查询
- 所属页面:主页面
- 前端触发链路:
- <boxSearch> @research -> research -> currentChange -> getPage -> pageAjax
- <boxSearch> @reempty -> reempty -> currentChange -> getPage -> pageAjax
- <iTable> @size-change / <iTable> @current-change -> currentChange -> getPage -> pageAjax
- <el-button> @click -> deletePartMainArr -> currentChange -> getPage -> pageAjax
- <importFile> @importAction -> importAction -> currentChange -> getPage -> pageAjax
- <importZipFile> @importZipAction -> importZipAction -> currentChange -> getPage -> pageAjax
- activated 生命周期 -> activated -> currentChange -> getPage -> pageAjax
- 后端入口:
partMainPage - Service 方法:
query
入参
- 后端接口实际接收对象:
PartMainQueryVo - 参数位置:
body
json
{
"pageSize": 10,
"pageNum": 1,
"field": "",
"order": "",
"bigCategory": "",
"smallCategory": "",
"sonCategory": "",
"partCode": "",
"partName": "",
"controlType": "",
"spec": "",
"useModel": "",
"description": "",
"isPeriod": "",
"isLife": "",
"preciousType": ""
}已在源码中确认的有效字段包括:
field;类型:String;来源:前端当前页面实际发送/可发送order;类型:String;来源:前端当前页面实际发送/可发送factoryNo;类型:String;来源:后端对象支持,当前页面未发送ids;类型:List<Long>;说明:id集合;来源:后端对象支持,当前页面未发送partNoList;类型:List<String>;说明:物料代号集合;来源:后端对象支持,当前页面未发送bigCategory;类型:String;说明:大类;来源:前端当前页面实际发送/可发送smallCategory;类型:String;说明:小类;来源:前端当前页面实际发送/可发送sonCategory;类型:String;说明:子类;来源:前端当前页面实际发送/可发送partCode;类型:String;说明:物料编码;校验:长度不超过 50;来源:前端当前页面实际发送/可发送partName;类型:String;说明:物料名称;校验:长度不超过 100;来源:前端当前页面实际发送/可发送controlType;类型:Integer;说明:控制类型;来源:前端当前页面实际发送/可发送spec;类型:String;说明:物料规格;校验:长度不超过 100;来源:前端当前页面实际发送/可发送useModel;类型:String;说明:使用机型;校验:长度不超过 20;来源:前端当前页面实际发送/可发送description;类型:String;说明:物料备注;校验:长度不超过 500;来源:前端当前页面实际发送/可发送preciousType;类型:Integer;说明:ABC分类;来源:前端当前页面实际发送/可发送isPeriod;类型:Integer;说明:是否有效期件;来源:前端当前页面实际发送/可发送isLife;类型:Integer;说明:是否寿命件;来源:前端当前页面实际发送/可发送partCodeOrName;类型:String;来源:后端对象支持,当前页面未发送validFlag;类型:Integer;说明:是否可用;来源:后端对象支持,当前页面未发送
出参
- 外层响应:ResultData,前端实际消费的是 data 中的 rows / total。
- 业务数据体:rows + total
json
{
"rows": [
{
"id": 1,
"partNo": "...",
"partCode": "...",
"partName": "...",
"bigCategory": "...",
"smallCategory": "...",
"sonCategory": "...",
"spec": "...",
"uom": "...",
"controlType": 1,
"currency": 1,
"price": 0,
"preferredSupplier": "...",
"supplierNo": "...",
"isPeriod": 1,
"isLife": 1,
"maxLife": 0,
"maxLifeUom": "...",
"useModel": "...",
"preciousType": 1,
"validFlag": 1,
"description": "...",
"packageNumber": 1,
"serialRule": 1
}
],
"total": 0
}idpartNo;类型:String;说明:物料代号partCode;类型:String;说明:物料编码;校验:必填 / 长度不超过 50partName;类型:String;说明:物料名称;校验:必填 / 长度不超过 100bigCategory;类型:String;说明:大类;校验:长度不超过 20smallCategory;类型:String;说明:小类;校验:长度不超过 20sonCategory;类型:String;说明:子类;校验:长度不超过 20spec;类型:String;说明:物料规格;校验:长度不超过 100uom;类型:String;说明:单位;校验:长度不超过 20controlType;类型:Integer;说明:控制类型;校验:必填currency;类型:Integer;说明:币种price;类型:BigDecimal;说明:价格preferredSupplier;类型:String;说明:首选供应商supplierNo;类型:String;说明:供应商代号isPeriod;类型:Integer;说明:是否有效期件isLife;类型:Integer;说明:是否寿命件maxLife;类型:BigDecimal;说明:最大寿命值maxLifeUom;类型:String;说明:最大寿命单位;校验:长度不超过 5useModel;类型:String;说明:使用机型;校验:长度不超过 20preciousType;类型:Integer;说明:ABC分类validFlag;类型:Integer;说明:是否可用description;类型:String;说明:备注;校验:长度不超过 500packageNumber;类型:Long;说明:包装数量serialRule;类型:Integer;说明:序列号生成规则 1 自动生成 2手动输入baseUrl;类型:StringBaseController.getDataTable(IPage<?>)会固定组装rows与total。前端
ajax.js会继续把ResultData.data解包后返回给页面。
后端逻辑链路
- 校验
- Controller 入口为
partMainPage(@Validated @RequestBody PartMainQueryVo partMainQueryVo),由@Validated和请求对象注解触发基础参数校验。 - 已确认的长度校验字段:
partCode、partName、spec、useModel、description。
- 预处理
- Service 内先构造
LambdaQueryWrapper作为条件容器。 - 调用
findPartMainCondition(...)统一组装筛选条件。 - 把查询对象复制为
QueryRequest,提取分页与排序参数。 - 通过
SortUtil.handlePageSort(...)写入分页与排序信息。
- 核心业务
- 使用 MyBatis-Plus 通用分页查询主表数据。
- 把
IPage<PartMainDo>转为IPage<PartMainVo>。 - 额外查询供应商全集,并按
preferredSupplier反查补充supplierNo。 - 调用文件服务批量查询附件,再拼接前端展示用
baseUrl。 - 对价格统一保留 3 位小数。
- 按
controlType规则清洗或归一化maxLife。 - 按
controlType规则清洗或归一化packageNumber。
- 状态变更
- 当前链路无数据库写操作。
- 数据影响
- 库存、金额、业务状态都不会发生持久化变更;若有价格处理,仅作用于返回值或导出值。
- 收尾
- Controller 调用
getDataTable(...)把分页对象组装成{rows, total}。 - 最终通过
success(map)返回ResultData。
数据链路
| 接口 | 调用类型 | 库名.表名 | mapper.page | sql作用(简写) |
|---|---|---|---|---|
POST /dm-store/partMain/page | 查询 | ?.part_main | MyBatis-Plus ServiceImpl.page | 按筛选条件分页查询物料主数据 |
POST /dm-store/partMain/page | 查询 | ?.supplier | supplierService.findAllSupplier | 查询供应商并补充 preferredSupplier 对应的 supplierNo |
POST /dm-store/partMain/page | 远程读取 | ?.附件数据 | fileClient.listFile | 批量查询附件并补充图片地址 |
数据流走向
- 数据来源:
- 前端页面通过 <boxSearch> @research -> research -> currentChange -> getPage -> pageAjax 触发请求
- 数据处理路径:
- Controller:
partMainPage - Service:
query - 使用 MyBatis-Plus 通用分页查询主表数据。
- 把
IPage<PartMainDo>转为IPage<PartMainVo>。 - 额外查询供应商全集,并按
preferredSupplier反查补充supplierNo。 - 调用文件服务批量查询附件,再拼接前端展示用
baseUrl。 - 数据落点:
- ?.part_main
- ?.supplier
- ?.附件数据
备注
bigCategory:大小写双路like。smallCategory:大小写双路like。sonCategory:大小写双路like。partCode:大小写双路like。partName:通过UPPER(part_name) LIKE做大小写无关匹配。spec:大小写双路like。useModel:大小写双路like。description:大小写双路like。controlType:精确匹配。validFlag:精确匹配。isPeriod:精确匹配。isLife:精确匹配。preciousType:精确匹配。ids:in查询。partNoList:in查询。- 默认排序:
create_time desc。 - 指定排序时,会把前端
field驼峰转下划线后拼接ORDER BY。 - 固定条件:
is_delete = 0。 - 当前
/page主链没有走自定义 Mapper XML,而是走 MyBatis-Plus 通用分页查询。 - 前端请求路径含服务前缀
/dm-store,合理推断该前缀来自网关或服务路由。 PartMainServiceImpl类上存在@DSTransactional,但只读接口本身不会产生写事务效果。
6.2 GET /dm-store/partMain/detail/:id
接口信息
- 请求地址:
/dm-store/partMain/detail/{id} - 请求方式:
GET - 功能简述:详情回显
- 所属页面:updatePartMain 编辑页
- 前端触发链路:
- 父页
updateDate= id /updateFlag= true -> updatePartMain.vue approvalOpen -> getDetailData -> getDetail - 后端入口:
partMainDetail - Service 方法:
findPartMainById
入参
- 后端接口实际接收对象:
Long - 参数位置:
path
json
{
"id": 1
}已在源码中确认的有效字段包括:
id;类型:Long;说明:路径中的业务 id;校验:必填
出参
- 外层响应:ResultData<PartMainVo>
- 业务数据体:单个 PartMainVo 对象
json
{
"id": 1,
"partNo": "...",
"partCode": "...",
"partName": "...",
"spec": "...",
"uom": "...",
"controlType": 1,
"price": 0,
"preferredSupplier": "...",
"isPeriod": 1,
"isLife": 1,
"maxLife": 0,
"maxLifeUom": "...",
"useModel": "...",
"preciousType": 1,
"validFlag": 1,
"description": "...",
"packageNumber": 1,
"attachmentVoList": "...",
"baseUrl": "..."
}idpartNo;类型:String;说明:物料代号partCode;类型:String;说明:物料编码;校验:必填 / 长度不超过 50partName;类型:String;说明:物料名称;校验:必填 / 长度不超过 100spec;类型:String;说明:物料规格;校验:长度不超过 100uom;类型:String;说明:单位;校验:长度不超过 20controlType;类型:Integer;说明:控制类型;校验:必填price;类型:BigDecimal;说明:价格preferredSupplier;类型:String;说明:首选供应商isPeriod;类型:Integer;说明:是否有效期件isLife;类型:Integer;说明:是否寿命件maxLife;类型:BigDecimal;说明:最大寿命值maxLifeUom;类型:String;说明:最大寿命单位;校验:长度不超过 5useModel;类型:String;说明:使用机型;校验:长度不超过 20preciousType;类型:Integer;说明:ABC分类validFlag;类型:Integer;说明:是否可用description;类型:String;说明:备注;校验:长度不超过 500packageNumber;类型:Long;说明:包装数量attachmentVoListbaseUrl;类型:String详情接口会把附件集合写入
attachmentVoList,并补充前端可直接回显的baseUrl。
后端逻辑链路
- 校验
- 当前链路未识别出额外步骤。
- 预处理
- 当前链路未识别出额外步骤。
- 核心业务
- 按目标 id 拉取附件集合,并回填
attachmentVoList/baseUrl。
- 状态变更
- 当前链路无数据库写操作。
- 数据影响
- 库存、金额、业务状态都不会发生持久化变更;若有价格处理,仅作用于返回值或导出值。
- 收尾
- Controller 通过
success(...)返回框架统一成功响应。
数据链路
| 接口 | 调用类型 | 库名.表名 | mapper.page | sql作用(简写) |
|---|---|---|---|---|
GET /dm-store/partMain/detail/{id} | 查询 | ?.part_main | MyBatis-Plus getById | 按 id 查询物料详情 |
GET /dm-store/partMain/detail/{id} | 远程读取 | ?.附件数据 | fileClient.listFileWithTarget | 按业务目标查询附件并回填 attachmentVoList 或 baseUrl |
数据流走向
- 数据来源:
- 前端页面通过 父页
updateDate= id /updateFlag= true -> updatePartMain.vue approvalOpen -> getDetailData -> getDetail 触发请求 - 数据处理路径:
- Controller:
partMainDetail - Service:
findPartMainById - 按目标 id 拉取附件集合,并回填
attachmentVoList/baseUrl。 - 数据落点:
- ?.part_main
- ?.附件数据
备注
- 前端请求路径含服务前缀
/dm-store,合理推断该前缀来自网关或服务路由。 PartMainServiceImpl类上存在@DSTransactional,但只读接口本身不会产生写事务效果。
6.3 POST /dm-store/partMain/add
接口信息
- 请求地址:
/dm-store/partMain/add - 请求方式:
POST - 功能简述:新增提交
- 所属页面:主页面 / addPartMain 新增页
- 前端触发链路:
- 父页
addFlag= true -> addPartMain.vue approvalAction -> emit addAction -> 父页 addAction -> partMainAdd - 后端入口:
addPartMain - Service 方法:
save
入参
- 后端接口实际接收对象:
PartMainVo - 参数位置:
body
json
{
"partCode": "",
"partName": "",
"spec": "",
"bigCategory": "",
"smallCategory": "",
"sonCategory": "",
"currency": "",
"preferredSupplier": "",
"uom": "",
"price": "",
"controlType": "",
"useModel": "",
"validFlag": "",
"description": "",
"attachmentVoList": "",
"packageNumber": "",
"preciousType": "",
"maxLife": "",
"serialRule": "",
"maxLifeUom": "",
"isPeriod": "",
"isLife": ""
}已在源码中确认的有效字段包括:
partCode;类型:String;说明:物料编码;校验:必填 / 长度不超过 50bigCategory;类型:String;说明:大类;校验:长度不超过 20smallCategory;类型:String;说明:小类;校验:长度不超过 20sonCategory;类型:String;说明:子类;校验:长度不超过 20partName;类型:String;说明:物料名称;校验:必填 / 长度不超过 100spec;类型:String;说明:物料规格;校验:长度不超过 100uom;类型:String;说明:单位;校验:长度不超过 20controlType;类型:Integer;说明:控制类型;校验:必填currency;类型:Integer;说明:币种price;类型:BigDecimal;说明:价格preferredSupplier;类型:String;说明:首选供应商isPeriod;类型:Integer;说明:是否有效期件isLife;类型:Integer;说明:是否寿命件maxLife;类型:BigDecimal;说明:最大寿命值maxLifeUom;类型:String;说明:最大寿命单位;校验:长度不超过 5useModel;类型:String;说明:使用机型;校验:长度不超过 20preciousType;类型:Integer;说明:ABC分类validFlag;类型:Integer;说明:是否可用description;类型:String;说明:备注;校验:长度不超过 500packageNumber;类型:Long;说明:包装数量serialRule;类型:Integer;说明:序列号生成规则 1 自动生成 2手动输入
出参
外层响应:ResultData
业务数据体:框架统一成功响应
当前链路重点在业务动作与后端处理,公共包裹字段未继续展开。
后端逻辑链路
- 校验
- Controller 入口为
addPartMain(@Validated @RequestBody PartMainVo partMainVo),由@Validated和请求对象注解触发基础参数校验。 - 业务校验会额外检查库存台账占用、物料名称重复和物料编码重复。
- 预处理
- 新增时会先通过 Redis 序列号服务生成
partNo。
- 核心业务
- 对价格统一保留 3 位小数。
- 状态变更
- 会向
part_main插入一条新记录,并在有附件时回写附件targetId。
- 数据影响
- 主表新增一条物料主数据;附件记录绑定到新生成的业务 id。
- 收尾
- Controller 通过
success(...)返回框架统一成功响应。
数据链路
| 接口 | 调用类型 | 库名.表名 | mapper.page | sql作用(简写) |
|---|---|---|---|---|
POST /dm-store/partMain/add | 新增 | ?.part_main | MyBatis-Plus save | 新增物料主数据 |
POST /dm-store/partMain/add | 远程写入 | ?.附件数据 | fileClient.updateFile | 回写附件 targetId,绑定业务对象 |
数据流走向
- 数据来源:
- 前端页面通过 父页
addFlag= true -> addPartMain.vue approvalAction -> emit addAction -> 父页 addAction -> partMainAdd 触发请求 - 数据处理路径:
- Controller:
addPartMain - Service:
save - 对价格统一保留 3 位小数。
- 数据落点:
- ?.part_main
- ?.附件数据
备注
- 前端请求路径含服务前缀
/dm-store,合理推断该前缀来自网关或服务路由。 PartMainServiceImpl类上存在@DSTransactional,但只读接口本身不会产生写事务效果。
6.4 POST /dm-store/partMain/update
接口信息
- 请求地址:
/dm-store/partMain/update - 请求方式:
POST - 功能简述:更新提交
- 所属页面:主页面 / updatePartMain 编辑页
- 前端触发链路:
- 父页
updateDate= id /updateFlag= true -> updatePartMain.vue approvalAction -> emit updateAction -> 父页 updateSubmitAction -> partMainUpdate - 后端入口:
update - Service 方法:
update
入参
- 后端接口实际接收对象:
PartMainVo - 参数位置:
body
json
{
"id": "",
"partCode": "",
"partName": "",
"spec": "",
"bigCategory": "",
"smallCategory": "",
"sonCategory": "",
"currency": "",
"preferredSupplier": "",
"uom": "",
"price": "",
"controlType": "",
"useModel": "",
"validFlag": "",
"description": "",
"attachmentVoList": "",
"packageNumber": "",
"preciousType": "",
"maxLife": "",
"maxLifeUom": "",
"serialRule": "",
"isPeriod": "",
"isLife": ""
}已在源码中确认的有效字段包括:
partCode;类型:String;说明:物料编码;校验:必填 / 长度不超过 50bigCategory;类型:String;说明:大类;校验:长度不超过 20smallCategory;类型:String;说明:小类;校验:长度不超过 20sonCategory;类型:String;说明:子类;校验:长度不超过 20partName;类型:String;说明:物料名称;校验:必填 / 长度不超过 100spec;类型:String;说明:物料规格;校验:长度不超过 100uom;类型:String;说明:单位;校验:长度不超过 20controlType;类型:Integer;说明:控制类型;校验:必填currency;类型:Integer;说明:币种price;类型:BigDecimal;说明:价格preferredSupplier;类型:String;说明:首选供应商isPeriod;类型:Integer;说明:是否有效期件isLife;类型:Integer;说明:是否寿命件maxLife;类型:BigDecimal;说明:最大寿命值maxLifeUom;类型:String;说明:最大寿命单位;校验:长度不超过 5useModel;类型:String;说明:使用机型;校验:长度不超过 20preciousType;类型:Integer;说明:ABC分类validFlag;类型:Integer;说明:是否可用description;类型:String;说明:备注;校验:长度不超过 500packageNumber;类型:Long;说明:包装数量serialRule;类型:Integer;说明:序列号生成规则 1 自动生成 2手动输入
出参
外层响应:ResultData
业务数据体:框架统一成功响应
当前链路重点在业务动作与后端处理,公共包裹字段未继续展开。
后端逻辑链路
- 校验
- Controller 入口为
update(@Validated @RequestBody PartMainVo partMainVo),由@Validated和请求对象注解触发基础参数校验。
- 预处理
- Service 内先构造
LambdaQueryWrapper作为条件容器。
- 核心业务
- 使用 ServiceImpl 通用查询能力拉取目标数据集合。
- 按目标 id 拉取附件集合,并回填
attachmentVoList/baseUrl。 - 按
controlType规则清洗或归一化maxLife。 - 按
controlType规则清洗或归一化packageNumber。 - 附件删除会先查旧附件,再调用文件服务删除文件。
- 状态变更
- 会更新
part_main现有记录;若上传了新附件,会先删旧图再绑定新图。
- 数据影响
- 主表更新既有物料主数据,附件关联可能被替换。
- 收尾
- Controller 通过
success(...)返回框架统一成功响应。
数据链路
| 接口 | 调用类型 | 库名.表名 | mapper.page | sql作用(简写) |
|---|---|---|---|---|
POST /dm-store/partMain/update | 更新 | ?.part_main | MyBatis-Plus updateById | 按 id 更新物料主数据 |
POST /dm-store/partMain/update | 远程读取 | ?.附件数据 | fileClient.listFileWithTarget | 按业务目标查询附件并回填 attachmentVoList 或 baseUrl |
POST /dm-store/partMain/update | 远程写入 | ?.附件数据 | fileClient.updateFile | 回写附件 targetId,绑定业务对象 |
POST /dm-store/partMain/update | 远程写入 | ?.附件数据 | fileClient.deleteFiles | 删除旧附件文件 |
数据流走向
- 数据来源:
- 前端页面通过 父页
updateDate= id /updateFlag= true -> updatePartMain.vue approvalAction -> emit updateAction -> 父页 updateSubmitAction -> partMainUpdate 触发请求 - 数据处理路径:
- Controller:
update - Service:
update - 使用 ServiceImpl 通用查询能力拉取目标数据集合。
- 按目标 id 拉取附件集合,并回填
attachmentVoList/baseUrl。 - 按
controlType规则清洗或归一化maxLife。 - 按
controlType规则清洗或归一化packageNumber。 - 数据落点:
- ?.part_main
- ?.附件数据
- ?.附件数据
- ?.附件数据
备注
- 前端请求路径含服务前缀
/dm-store,合理推断该前缀来自网关或服务路由。 PartMainServiceImpl类上存在@DSTransactional,但只读接口本身不会产生写事务效果。
6.5 GET /dm-store/partMain/deletePicture/:id
接口信息
- 请求地址:
/dm-store/partMain/deletePicture/{id} - 请求方式:
GET - 功能简述:附件删除
- 所属页面:updatePartMain 编辑页
- 前端触发链路:
- updatePartMain.vue removeImage -> deleteImg
- 后端入口:
deletePicture - Service 方法:
deletePicture
入参
- 后端接口实际接收对象:
Long - 参数位置:
path
json
{
"id": 1
}已在源码中确认的有效字段包括:
id;类型:Long;说明:路径中的业务 id;校验:必填
出参
外层响应:ResultData
业务数据体:框架统一成功响应
当前链路重点在业务动作与后端处理,公共包裹字段未继续展开。
后端逻辑链路
- 校验
- 当前链路未识别出额外步骤。
- 预处理
- 当前链路未识别出额外步骤。
- 核心业务
- 按目标 id 拉取附件集合,并回填
attachmentVoList/baseUrl。 - 附件删除会先查旧附件,再调用文件服务删除文件。
- 状态变更
- 当前链路未识别出额外步骤。
- 数据影响
- 当前链路未识别出额外步骤。
- 收尾
- Controller 通过
success(...)返回框架统一成功响应。
数据链路
| 接口 | 调用类型 | 库名.表名 | mapper.page | sql作用(简写) |
|---|---|---|---|---|
GET /dm-store/partMain/deletePicture/{id} | 远程读取 | ?.附件数据 | fileClient.listFileWithTarget | 按业务目标查询附件并回填 attachmentVoList 或 baseUrl |
GET /dm-store/partMain/deletePicture/{id} | 远程写入 | ?.附件数据 | fileClient.deleteFiles | 删除旧附件文件 |
数据流走向
- 数据来源:
- 前端页面通过 updatePartMain.vue removeImage -> deleteImg 触发请求
- 数据处理路径:
- Controller:
deletePicture - Service:
deletePicture - 按目标 id 拉取附件集合,并回填
attachmentVoList/baseUrl。 - 附件删除会先查旧附件,再调用文件服务删除文件。
- 数据落点:
- ?.附件数据
- ?.附件数据
备注
- 前端请求路径含服务前缀
/dm-store,合理推断该前缀来自网关或服务路由。 PartMainServiceImpl类上存在@DSTransactional,但只读接口本身不会产生写事务效果。
6.6 POST /dm-store/partMain/delete
接口信息
- 请求地址:
/dm-store/partMain/delete - 请求方式:
POST - 功能简述:删除提交
- 所属页面:主页面
- 前端触发链路:
- <el-button> @click -> deletePartMainArr -> partMaindeleteArr
- 后端入口:
deletePartMain - Service 方法:
delete
入参
- 后端接口实际接收对象:
Long[] - 参数位置:
body
json
{
"ids": []
}已在源码中确认的有效字段包括:
ids;类型:Long[];说明:待删除物料主数据 id 集合
出参
外层响应:ResultData
业务数据体:框架统一成功响应
当前链路重点在业务动作与后端处理,公共包裹字段未继续展开。
后端逻辑链路
- 校验
- Controller 入口为
deletePartMain(@RequestBody Long[] ids),由@Validated和请求对象注解触发基础参数校验。 - 删除前会先查库存台账,若物料已被库存台账使用则拒绝删除。
- 预处理
- Service 内先构造
LambdaQueryWrapper作为条件容器。
- 核心业务
- 使用 ServiceImpl 通用查询能力拉取目标数据集合。
- 调用文件服务批量查询附件,再拼接前端展示用
baseUrl。 - 附件删除会先查旧附件,再调用文件服务删除文件。
- 状态变更
- 执行的是逻辑删除:更新
is_delete、update_user、update_time。
- 数据影响
- 物料主数据不会物理删库,但会被标记为删除,同时删除对应附件。
- 收尾
- Controller 通过
success(...)返回框架统一成功响应。
数据链路
| 接口 | 调用类型 | 库名.表名 | mapper.page | sql作用(简写) |
|---|---|---|---|---|
POST /dm-store/partMain/delete | 逻辑删除 | ?.part_main | MyBatis-Plus LambdaUpdateWrapper.update | 更新 is_delete、update_user、update_time,逻辑删除物料主数据 |
POST /dm-store/partMain/delete | 校验查询 | ?.stock_main | stockMainService.findListByParam | 删除或保存前校验物料是否被库存台账占用 |
POST /dm-store/partMain/delete | 远程读取 | ?.附件数据 | fileClient.listFile | 批量查询附件并补充图片地址 |
POST /dm-store/partMain/delete | 远程写入 | ?.附件数据 | fileClient.deleteFiles | 删除旧附件文件 |
数据流走向
- 数据来源:
- 前端页面通过 <el-button> @click -> deletePartMainArr -> partMaindeleteArr 触发请求
- 数据处理路径:
- Controller:
deletePartMain - Service:
delete - 使用 ServiceImpl 通用查询能力拉取目标数据集合。
- 调用文件服务批量查询附件,再拼接前端展示用
baseUrl。 - 附件删除会先查旧附件,再调用文件服务删除文件。
- 数据落点:
- ?.part_main
- ?.stock_main
- ?.附件数据
- ?.附件数据
备注
- 前端请求路径含服务前缀
/dm-store,合理推断该前缀来自网关或服务路由。 PartMainServiceImpl类上存在@DSTransactional,但只读接口本身不会产生写事务效果。
6.7 POST /dm-store/partMain/fileUpload
接口信息
- 请求地址:
/dm-store/partMain/fileUpload - 请求方式:
POST - 功能简述:附件上传
- 所属页面:addPartMain 新增页 / updatePartMain 编辑页
- 前端触发链路:
- addPartMain.vue UploadFile -> uploadImg
- updatePartMain.vue UploadFile -> uploadImg
- 后端入口:
fileUpload - Service 方法:
fileUpload
入参
- 后端接口实际接收对象:
MultipartFile - 参数位置:
formData
已在源码中确认的有效字段包括:
multipartFile;类型:MultipartFile;说明:上传文件;校验:必填
出参
外层响应:ResultData<LsscAttachmentVo>
业务数据体:上传后的附件元数据
当前链路只确认返回附件对象,未继续展开其全部字段定义。
后端逻辑链路
- 校验
- 当前链路未识别出额外步骤。
- 预处理
- 当前链路未识别出额外步骤。
- 核心业务
- 文件上传接口会把文件直接转发给文件服务并返回附件元数据。
- 状态变更
- 当前接口只写文件服务,不直接改主表。
- 数据影响
- 返回附件元数据,真正业务绑定发生在后续保存或更新流程。
- 收尾
- Controller 通过
success(...)返回框架统一成功响应。
数据链路
| 接口 | 调用类型 | 库名.表名 | mapper.page | sql作用(简写) |
|---|---|---|---|---|
POST /dm-store/partMain/fileUpload | 远程写入 | ?.附件数据 | fileClient.uploadFile | 上传附件到文件服务 |
数据流走向
- 数据来源:
- 前端页面通过 addPartMain.vue UploadFile -> uploadImg 触发请求
- 数据处理路径:
- Controller:
fileUpload - Service:
fileUpload - 文件上传接口会把文件直接转发给文件服务并返回附件元数据。
- 数据落点:
- ?.附件数据
备注
- 前端请求路径含服务前缀
/dm-store,合理推断该前缀来自网关或服务路由。 PartMainServiceImpl类上存在@DSTransactional,但只读接口本身不会产生写事务效果。
6.8 POST /dm-store/partMain/importExcel
接口信息
- 请求地址:
/dm-store/partMain/importExcel - 请求方式:
POST - 功能简述:Excel 导入
- 所属页面:主页面
- 后端入口:
importExcel - Service 方法:
importExcel
入参
- 后端接口实际接收对象:
MultipartFile - 参数位置:
formData
已在源码中确认的有效字段包括:
file;类型:MultipartFile;说明:Excel 文件;校验:必填
出参
外层响应:ResultData<ImportResultInfo>
业务数据体:导入结果对象
当前链路可证实返回导入成功/失败汇总,但未继续展开
ImportResultInfo的全部字段定义。
后端逻辑链路
- 校验
- 导入链路除了基础 Bean 校验,还会检查文件内重复、必填字段、
controlType联动规则以及供应商有效性。
- 预处理
- 当前链路未识别出额外步骤。
- 核心业务
- 导入入口交给
ExcelImportHandler.execute(...),再由handleImportData(...)做明细校验与落库。
- 状态变更
- 成功导入后会批量新增或更新
part_main。
- 数据影响
- 导入数据会对主表做批量 upsert。
- 收尾
- Controller 通过
success(...)返回框架统一成功响应。
数据链路
| 接口 | 调用类型 | 库名.表名 | mapper.page | sql作用(简写) |
|---|---|---|---|---|
POST /dm-store/partMain/importExcel | 更新 | ?.part_main | MyBatis-Plus saveOrUpdateBatch | 批量新增或更新物料主数据 |
数据流走向
- 数据来源:
- 前端页面通过 当前页面动作 触发请求
- 数据处理路径:
- Controller:
importExcel - Service:
importExcel - 导入入口交给
ExcelImportHandler.execute(...),再由handleImportData(...)做明细校验与落库。 - 数据落点:
- ?.part_main
备注
- 前端请求路径含服务前缀
/dm-store,合理推断该前缀来自网关或服务路由。 PartMainServiceImpl类上存在@DSTransactional,但只读接口本身不会产生写事务效果。
6.9 POST /dm-store/partMain/importPic
接口信息
- 请求地址:
/dm-store/partMain/importPic - 请求方式:
POST - 功能简述:图片导入
- 所属页面:主页面
- 后端入口:
importPic - Service 方法:
importPictures
入参
- 后端接口实际接收对象:
MultipartFile - 参数位置:
formData
已在源码中确认的有效字段包括:
multipartFile;类型:MultipartFile;说明:上传文件;校验:必填
出参
外层响应:ResultData<ImportResultInfo>
业务数据体:导入结果对象
当前链路可证实返回导入成功/失败汇总,但未继续展开
ImportResultInfo的全部字段定义。
后端逻辑链路
- 校验
- 当前链路未识别出额外步骤。
- 预处理
- Service 内先构造
LambdaQueryWrapper作为条件容器。
- 核心业务
- 使用 ServiceImpl 通用查询能力拉取目标数据集合。
- 状态变更
- 不会改动主表字段,但会替换附件文件。
- 数据影响
- 附件文件服务数据会被删旧传新。
- 收尾
- Controller 通过
success(...)返回框架统一成功响应。
数据链路
- 当前链路未识别到明确数据库表操作。
数据流走向
- 数据来源:
- 前端页面通过 当前页面动作 触发请求
- 数据处理路径:
- Controller:
importPic - Service:
importPictures - 使用 ServiceImpl 通用查询能力拉取目标数据集合。
- 数据落点:
- 当前链路未识别到明确数据落点。
备注
- 图片压缩包导入会校验压缩包内文件名是否命中物料编码,并在导入前检测重名。
- 前端请求路径含服务前缀
/dm-store,合理推断该前缀来自网关或服务路由。 PartMainServiceImpl类上存在@DSTransactional,但只读接口本身不会产生写事务效果。
6.10 POST /dm-store/partMain/exportExcel
接口信息
- 请求地址:
/dm-store/partMain/exportExcel - 请求方式:
POST - 功能简述:Excel 导出
- 所属页面:主页面
- 前端触发链路:
- <el-button> @click -> exportAction -> exportAjax
- 后端入口:
exportExcel - Service 方法:
exportPartMainExcel
入参
- 后端接口实际接收对象:
PartMainQueryVo - 参数位置:
body
json
{
"ids": [],
"field": "",
"order": "",
"bigCategory": "",
"smallCategory": "",
"sonCategory": "",
"partCode": "",
"partName": "",
"controlType": "",
"spec": "",
"useModel": "",
"description": "",
"isPeriod": "",
"isLife": "",
"preciousType": ""
}已在源码中确认的有效字段包括:
field;类型:String;来源:前端导出动作实际可发送order;类型:String;来源:前端导出动作实际可发送factoryNo;类型:String;来源:后端对象支持,当前导出动作未发送ids;类型:List<Long>;说明:id集合;来源:前端导出动作实际可发送partNoList;类型:List<String>;说明:物料代号集合;来源:后端对象支持,当前导出动作未发送bigCategory;类型:String;说明:大类;来源:前端导出动作实际可发送smallCategory;类型:String;说明:小类;来源:前端导出动作实际可发送sonCategory;类型:String;说明:子类;来源:前端导出动作实际可发送partCode;类型:String;说明:物料编码;校验:长度不超过 50;来源:前端导出动作实际可发送partName;类型:String;说明:物料名称;校验:长度不超过 100;来源:前端导出动作实际可发送controlType;类型:Integer;说明:控制类型;来源:前端导出动作实际可发送spec;类型:String;说明:物料规格;校验:长度不超过 100;来源:前端导出动作实际可发送useModel;类型:String;说明:使用机型;校验:长度不超过 20;来源:前端导出动作实际可发送description;类型:String;说明:物料备注;校验:长度不超过 500;来源:前端导出动作实际可发送preciousType;类型:Integer;说明:ABC分类;来源:前端导出动作实际可发送isPeriod;类型:Integer;说明:是否有效期件;来源:前端导出动作实际可发送isLife;类型:Integer;说明:是否寿命件;来源:前端导出动作实际可发送partCodeOrName;类型:String;来源:后端对象支持,当前导出动作未发送validFlag;类型:Integer;说明:是否可用;来源:后端对象支持,当前导出动作未发送
出参
外层响应:文件下载流
业务数据体:Excel 二进制响应
前端通过下载服务直接处理文件响应,不经过普通 JSON 列表渲染。
后端逻辑链路
- 校验
- Controller 入口为
exportExcel(@Validated @RequestBody PartMainQueryVo partMainQueryVo, HttpServletResponse response),由@Validated和请求对象注解触发基础参数校验。
- 预处理
- Service 内先构造
LambdaQueryWrapper作为条件容器。 - 调用
findPartMainCondition(...)统一组装筛选条件。
- 核心业务
- 使用 ServiceImpl 通用查询能力拉取目标数据集合。
- 对价格统一保留 3 位小数。
- 把查询结果转成 Excel 视图对象后导出文件。
- 状态变更
- 当前链路无数据库写操作。
- 数据影响
- 库存、金额、业务状态都不会发生持久化变更;若有价格处理,仅作用于返回值或导出值。
- 收尾
- 当前链路未识别出额外步骤。
数据链路
| 接口 | 调用类型 | 库名.表名 | mapper.page | sql作用(简写) |
|---|---|---|---|---|
POST /dm-store/partMain/exportExcel | 查询 | ?.part_main | MyBatis-Plus ServiceImpl.list | 按筛选条件导出物料主数据 |
数据流走向
- 数据来源:
- 前端页面通过 <el-button> @click -> exportAction -> exportAjax 触发请求
- 数据处理路径:
- Controller:
exportExcel - Service:
exportPartMainExcel - 使用 ServiceImpl 通用查询能力拉取目标数据集合。
- 对价格统一保留 3 位小数。
- 把查询结果转成 Excel 视图对象后导出文件。
- 数据落点:
- ?.part_main
备注
- 前端请求路径含服务前缀
/dm-store,合理推断该前缀来自网关或服务路由。 PartMainServiceImpl类上存在@DSTransactional,但只读接口本身不会产生写事务效果。
重点组件说明
组件:index
- 角色:主页面
- 层级路径:
index - 是否直接CRUD:否
- 一句话作用:承接 partMain 页面主入口、列表查询,以及 2 个重点子组件的调度。
- 业务动作:新增提交、删除提交、更新提交、Excel 导入、图片导入
- 下游重点组件:
addPartMain/updatePartMain/importFile/importZipFile
组件:addPartMain
- 角色:重点子组件
- 层级路径:
index > addPartMain - 父组件:
index - 是否直接CRUD:是
- 一句话作用:承接新增表单录入、校验和提交。
- 业务动作:新增提交
- 详细说明:查看独立说明
组件:updatePartMain
- 角色:重点子组件
- 层级路径:
index > updatePartMain - 父组件:
index - 是否直接CRUD:是
- 一句话作用:承接详情回显、字段修改和提交。
- 业务动作:更新提交
- 详细说明:查看独立说明
组件:importFile
- 角色:业务化公共组件
- 层级路径:
index > importFile - 父组件:
index - 是否直接CRUD:是
- 一句话作用:复用通用组件外壳,但当前页通过
:import-file-ajax注入业务配置,承接Excel 导入。 - 业务动作:Excel 导入
- 详细说明:不单独生成 MD,说明保留在当前主页面文档。
组件:importZipFile
- 角色:业务化公共组件
- 层级路径:
index > importZipFile - 父组件:
index - 是否直接CRUD:是
- 一句话作用:复用通用组件外壳,但当前页通过
:import-zip-file-ajax注入业务配置,承接图片导入。 - 业务动作:图片导入
- 详细说明:不单独生成 MD,说明保留在当前主页面文档。
7. 子组件列表
addPartMain:组件角色 重点子组件updatePartMain:组件角色 重点子组件
8. 修改入口
- 改当前节点逻辑:先看上游入口,再看组件总览和业务页面跳转链路,最后核对接口与后端落点。
- 当前节点含附件链路,上传、删除和业务绑定顺序要一起核对。
- 重点组件较多,改组件分类或主链路时要同时看组件链和路由链。