Skip to content

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跳转一句话作用
indexindex主页面当前页查看承接 partMain 页面主入口、列表查询,以及 2 个重点子组件的调度。
addPartMainindex > addPartMain重点子组件查看承接新增表单录入、校验和提交。
updatePartMainindex > updatePartMain重点子组件查看承接详情回显、字段修改和提交。
importFileindex > importFile业务化公共组件查看复用通用组件外壳,但当前页通过 :import-file-ajax 注入业务配置,承接Excel 导入。
importZipFileindex > importZipFile业务化公共组件查看复用通用组件外壳,但当前页通过 :import-zip-file-ajax 注入业务配置,承接图片导入。

辅助组件说明

  • boxSearch:负责查询条件区,支持搜索和清空事件触发。
  • iTable:负责通用列表渲染、分页、多选、排序和操作列承载。
  • dialogs:负责通用弹窗容器、确认和关闭交互,在 addPartMain / updatePartMain / importFile / importZipFile 中复用。

技术图

partMain 页面数据流图

  • Flow 布局:standardpartMain 页面摘要图

  • 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. 接口总览

methodpath功能所属节点前端触发后端入口
POST/dm-store/partMain/page分页查询主页面<boxSearch> @research -> research -> currentChange -> getPage -> pageAjaxpartMainPage
GET/dm-store/partMain/detail/{id}详情回显updatePartMain 编辑页父页 updateDate = id / updateFlag = true -> updatePartMain.vue approvalOpen -> getDetailData -> getDetailpartMainDetail
POST/dm-store/partMain/add新增提交主页面
addPartMain 新增页
父页 addFlag = true -> addPartMain.vue approvalAction -> emit addAction -> 父页 addAction -> partMainAddaddPartMain
POST/dm-store/partMain/update更新提交主页面
updatePartMain 编辑页
父页 updateDate = id / updateFlag = true -> updatePartMain.vue approvalAction -> emit updateAction -> 父页 updateSubmitAction -> partMainUpdateupdate
GET/dm-store/partMain/deletePicture/{id}附件删除updatePartMain 编辑页updatePartMain.vue removeImage -> deleteImgdeletePicture
POST/dm-store/partMain/delete删除提交主页面<el-button> @click -> deletePartMainArr -> partMaindeleteArrdeletePartMain
POST/dm-store/partMain/fileUpload附件上传addPartMain 新增页
updatePartMain 编辑页
addPartMain.vue UploadFile -> uploadImgfileUpload
POST/dm-store/partMain/importExcelExcel 导入主页面-importExcel
POST/dm-store/partMain/importPic图片导入主页面-importPic
POST/dm-store/partMain/exportExcelExcel 导出主页面<el-button> @click -> exportAction -> exportAjaxexportExcel

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&lt;Long&gt;;说明:id集合;来源:后端对象支持,当前页面未发送
  • partNoList;类型:List&lt;String&gt;;说明:物料代号集合;来源:后端对象支持,当前页面未发送
  • 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
}
  • id

  • partNo;类型:String;说明:物料代号

  • partCode;类型:String;说明:物料编码;校验:必填 / 长度不超过 50

  • partName;类型:String;说明:物料名称;校验:必填 / 长度不超过 100

  • bigCategory;类型:String;说明:大类;校验:长度不超过 20

  • smallCategory;类型:String;说明:小类;校验:长度不超过 20

  • sonCategory;类型:String;说明:子类;校验:长度不超过 20

  • spec;类型:String;说明:物料规格;校验:长度不超过 100

  • uom;类型:String;说明:单位;校验:长度不超过 20

  • controlType;类型:Integer;说明:控制类型;校验:必填

  • currency;类型:Integer;说明:币种

  • price;类型:BigDecimal;说明:价格

  • preferredSupplier;类型:String;说明:首选供应商

  • supplierNo;类型:String;说明:供应商代号

  • isPeriod;类型:Integer;说明:是否有效期件

  • isLife;类型:Integer;说明:是否寿命件

  • maxLife;类型:BigDecimal;说明:最大寿命值

  • maxLifeUom;类型:String;说明:最大寿命单位;校验:长度不超过 5

  • useModel;类型:String;说明:使用机型;校验:长度不超过 20

  • preciousType;类型:Integer;说明:ABC分类

  • validFlag;类型:Integer;说明:是否可用

  • description;类型:String;说明:备注;校验:长度不超过 500

  • packageNumber;类型:Long;说明:包装数量

  • serialRule;类型:Integer;说明:序列号生成规则 1 自动生成 2手动输入

  • baseUrl;类型:String

  • BaseController.getDataTable(IPage<?>) 会固定组装 rowstotal

  • 前端 ajax.js 会继续把 ResultData.data 解包后返回给页面。

后端逻辑链路

  1. 校验
  • Controller 入口为 partMainPage(@Validated @RequestBody PartMainQueryVo partMainQueryVo),由 @Validated 和请求对象注解触发基础参数校验。
  • 已确认的长度校验字段:partCodepartNamespecuseModeldescription
  1. 预处理
  • Service 内先构造 LambdaQueryWrapper 作为条件容器。
  • 调用 findPartMainCondition(...) 统一组装筛选条件。
  • 把查询对象复制为 QueryRequest,提取分页与排序参数。
  • 通过 SortUtil.handlePageSort(...) 写入分页与排序信息。
  1. 核心业务
  • 使用 MyBatis-Plus 通用分页查询主表数据。
  • IPage&lt;PartMainDo&gt; 转为 IPage&lt;PartMainVo&gt;
  • 额外查询供应商全集,并按 preferredSupplier 反查补充 supplierNo
  • 调用文件服务批量查询附件,再拼接前端展示用 baseUrl
  • 对价格统一保留 3 位小数。
  • controlType 规则清洗或归一化 maxLife
  • controlType 规则清洗或归一化 packageNumber
  1. 状态变更
  • 当前链路无数据库写操作。
  1. 数据影响
  • 库存、金额、业务状态都不会发生持久化变更;若有价格处理,仅作用于返回值或导出值。
  1. 收尾
  • Controller 调用 getDataTable(...) 把分页对象组装成 {rows, total}
  • 最终通过 success(map) 返回 ResultData

数据链路

接口调用类型库名.表名mapper.pagesql作用(简写)
POST /dm-store/partMain/page查询?.part_mainMyBatis-Plus ServiceImpl.page按筛选条件分页查询物料主数据
POST /dm-store/partMain/page查询?.suppliersupplierService.findAllSupplier查询供应商并补充 preferredSupplier 对应的 supplierNo
POST /dm-store/partMain/page远程读取?.附件数据fileClient.listFile批量查询附件并补充图片地址

数据流走向

  • 数据来源:
  • 前端页面通过 <boxSearch> @research -> research -> currentChange -> getPage -> pageAjax 触发请求
  • 数据处理路径:
  • Controller:partMainPage
  • Service:query
  • 使用 MyBatis-Plus 通用分页查询主表数据。
  • IPage&lt;PartMainDo&gt; 转为 IPage&lt;PartMainVo&gt;
  • 额外查询供应商全集,并按 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:精确匹配。
  • idsin 查询。
  • partNoListin 查询。
  • 默认排序: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": "..."
}
  • id

  • partNo;类型:String;说明:物料代号

  • partCode;类型:String;说明:物料编码;校验:必填 / 长度不超过 50

  • partName;类型:String;说明:物料名称;校验:必填 / 长度不超过 100

  • spec;类型:String;说明:物料规格;校验:长度不超过 100

  • uom;类型:String;说明:单位;校验:长度不超过 20

  • controlType;类型:Integer;说明:控制类型;校验:必填

  • price;类型:BigDecimal;说明:价格

  • preferredSupplier;类型:String;说明:首选供应商

  • isPeriod;类型:Integer;说明:是否有效期件

  • isLife;类型:Integer;说明:是否寿命件

  • maxLife;类型:BigDecimal;说明:最大寿命值

  • maxLifeUom;类型:String;说明:最大寿命单位;校验:长度不超过 5

  • useModel;类型:String;说明:使用机型;校验:长度不超过 20

  • preciousType;类型:Integer;说明:ABC分类

  • validFlag;类型:Integer;说明:是否可用

  • description;类型:String;说明:备注;校验:长度不超过 500

  • packageNumber;类型:Long;说明:包装数量

  • attachmentVoList

  • baseUrl;类型:String

  • 详情接口会把附件集合写入 attachmentVoList,并补充前端可直接回显的 baseUrl

后端逻辑链路

  1. 校验
  • 当前链路未识别出额外步骤。
  1. 预处理
  • 当前链路未识别出额外步骤。
  1. 核心业务
  • 按目标 id 拉取附件集合,并回填 attachmentVoList / baseUrl
  1. 状态变更
  • 当前链路无数据库写操作。
  1. 数据影响
  • 库存、金额、业务状态都不会发生持久化变更;若有价格处理,仅作用于返回值或导出值。
  1. 收尾
  • Controller 通过 success(...) 返回框架统一成功响应。

数据链路

接口调用类型库名.表名mapper.pagesql作用(简写)
GET /dm-store/partMain/detail/{id}查询?.part_mainMyBatis-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;说明:物料编码;校验:必填 / 长度不超过 50
  • bigCategory;类型:String;说明:大类;校验:长度不超过 20
  • smallCategory;类型:String;说明:小类;校验:长度不超过 20
  • sonCategory;类型:String;说明:子类;校验:长度不超过 20
  • partName;类型:String;说明:物料名称;校验:必填 / 长度不超过 100
  • spec;类型:String;说明:物料规格;校验:长度不超过 100
  • uom;类型:String;说明:单位;校验:长度不超过 20
  • controlType;类型:Integer;说明:控制类型;校验:必填
  • currency;类型:Integer;说明:币种
  • price;类型:BigDecimal;说明:价格
  • preferredSupplier;类型:String;说明:首选供应商
  • isPeriod;类型:Integer;说明:是否有效期件
  • isLife;类型:Integer;说明:是否寿命件
  • maxLife;类型:BigDecimal;说明:最大寿命值
  • maxLifeUom;类型:String;说明:最大寿命单位;校验:长度不超过 5
  • useModel;类型:String;说明:使用机型;校验:长度不超过 20
  • preciousType;类型:Integer;说明:ABC分类
  • validFlag;类型:Integer;说明:是否可用
  • description;类型:String;说明:备注;校验:长度不超过 500
  • packageNumber;类型:Long;说明:包装数量
  • serialRule;类型:Integer;说明:序列号生成规则 1 自动生成 2手动输入

出参

  • 外层响应:ResultData

  • 业务数据体:框架统一成功响应

  • 当前链路重点在业务动作与后端处理,公共包裹字段未继续展开。

后端逻辑链路

  1. 校验
  • Controller 入口为 addPartMain(@Validated @RequestBody PartMainVo partMainVo),由 @Validated 和请求对象注解触发基础参数校验。
  • 业务校验会额外检查库存台账占用、物料名称重复和物料编码重复。
  1. 预处理
  • 新增时会先通过 Redis 序列号服务生成 partNo
  1. 核心业务
  • 对价格统一保留 3 位小数。
  1. 状态变更
  • 会向 part_main 插入一条新记录,并在有附件时回写附件 targetId
  1. 数据影响
  • 主表新增一条物料主数据;附件记录绑定到新生成的业务 id。
  1. 收尾
  • Controller 通过 success(...) 返回框架统一成功响应。

数据链路

接口调用类型库名.表名mapper.pagesql作用(简写)
POST /dm-store/partMain/add新增?.part_mainMyBatis-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;说明:物料编码;校验:必填 / 长度不超过 50
  • bigCategory;类型:String;说明:大类;校验:长度不超过 20
  • smallCategory;类型:String;说明:小类;校验:长度不超过 20
  • sonCategory;类型:String;说明:子类;校验:长度不超过 20
  • partName;类型:String;说明:物料名称;校验:必填 / 长度不超过 100
  • spec;类型:String;说明:物料规格;校验:长度不超过 100
  • uom;类型:String;说明:单位;校验:长度不超过 20
  • controlType;类型:Integer;说明:控制类型;校验:必填
  • currency;类型:Integer;说明:币种
  • price;类型:BigDecimal;说明:价格
  • preferredSupplier;类型:String;说明:首选供应商
  • isPeriod;类型:Integer;说明:是否有效期件
  • isLife;类型:Integer;说明:是否寿命件
  • maxLife;类型:BigDecimal;说明:最大寿命值
  • maxLifeUom;类型:String;说明:最大寿命单位;校验:长度不超过 5
  • useModel;类型:String;说明:使用机型;校验:长度不超过 20
  • preciousType;类型:Integer;说明:ABC分类
  • validFlag;类型:Integer;说明:是否可用
  • description;类型:String;说明:备注;校验:长度不超过 500
  • packageNumber;类型:Long;说明:包装数量
  • serialRule;类型:Integer;说明:序列号生成规则 1 自动生成 2手动输入

出参

  • 外层响应:ResultData

  • 业务数据体:框架统一成功响应

  • 当前链路重点在业务动作与后端处理,公共包裹字段未继续展开。

后端逻辑链路

  1. 校验
  • Controller 入口为 update(@Validated @RequestBody PartMainVo partMainVo),由 @Validated 和请求对象注解触发基础参数校验。
  1. 预处理
  • Service 内先构造 LambdaQueryWrapper 作为条件容器。
  1. 核心业务
  • 使用 ServiceImpl 通用查询能力拉取目标数据集合。
  • 按目标 id 拉取附件集合,并回填 attachmentVoList / baseUrl
  • controlType 规则清洗或归一化 maxLife
  • controlType 规则清洗或归一化 packageNumber
  • 附件删除会先查旧附件,再调用文件服务删除文件。
  1. 状态变更
  • 会更新 part_main 现有记录;若上传了新附件,会先删旧图再绑定新图。
  1. 数据影响
  • 主表更新既有物料主数据,附件关联可能被替换。
  1. 收尾
  • Controller 通过 success(...) 返回框架统一成功响应。

数据链路

接口调用类型库名.表名mapper.pagesql作用(简写)
POST /dm-store/partMain/update更新?.part_mainMyBatis-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

  • 业务数据体:框架统一成功响应

  • 当前链路重点在业务动作与后端处理,公共包裹字段未继续展开。

后端逻辑链路

  1. 校验
  • 当前链路未识别出额外步骤。
  1. 预处理
  • 当前链路未识别出额外步骤。
  1. 核心业务
  • 按目标 id 拉取附件集合,并回填 attachmentVoList / baseUrl
  • 附件删除会先查旧附件,再调用文件服务删除文件。
  1. 状态变更
  • 当前链路未识别出额外步骤。
  1. 数据影响
  • 当前链路未识别出额外步骤。
  1. 收尾
  • Controller 通过 success(...) 返回框架统一成功响应。

数据链路

接口调用类型库名.表名mapper.pagesql作用(简写)
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

  • 业务数据体:框架统一成功响应

  • 当前链路重点在业务动作与后端处理,公共包裹字段未继续展开。

后端逻辑链路

  1. 校验
  • Controller 入口为 deletePartMain(@RequestBody Long[] ids),由 @Validated 和请求对象注解触发基础参数校验。
  • 删除前会先查库存台账,若物料已被库存台账使用则拒绝删除。
  1. 预处理
  • Service 内先构造 LambdaQueryWrapper 作为条件容器。
  1. 核心业务
  • 使用 ServiceImpl 通用查询能力拉取目标数据集合。
  • 调用文件服务批量查询附件,再拼接前端展示用 baseUrl
  • 附件删除会先查旧附件,再调用文件服务删除文件。
  1. 状态变更
  • 执行的是逻辑删除:更新 is_deleteupdate_userupdate_time
  1. 数据影响
  • 物料主数据不会物理删库,但会被标记为删除,同时删除对应附件。
  1. 收尾
  • Controller 通过 success(...) 返回框架统一成功响应。

数据链路

接口调用类型库名.表名mapper.pagesql作用(简写)
POST /dm-store/partMain/delete逻辑删除?.part_mainMyBatis-Plus LambdaUpdateWrapper.update更新 is_delete、update_user、update_time,逻辑删除物料主数据
POST /dm-store/partMain/delete校验查询?.stock_mainstockMainService.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>

  • 业务数据体:上传后的附件元数据

  • 当前链路只确认返回附件对象,未继续展开其全部字段定义。

后端逻辑链路

  1. 校验
  • 当前链路未识别出额外步骤。
  1. 预处理
  • 当前链路未识别出额外步骤。
  1. 核心业务
  • 文件上传接口会把文件直接转发给文件服务并返回附件元数据。
  1. 状态变更
  • 当前接口只写文件服务,不直接改主表。
  1. 数据影响
  • 返回附件元数据,真正业务绑定发生在后续保存或更新流程。
  1. 收尾
  • Controller 通过 success(...) 返回框架统一成功响应。

数据链路

接口调用类型库名.表名mapper.pagesql作用(简写)
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 的全部字段定义。

后端逻辑链路

  1. 校验
  • 导入链路除了基础 Bean 校验,还会检查文件内重复、必填字段、controlType 联动规则以及供应商有效性。
  1. 预处理
  • 当前链路未识别出额外步骤。
  1. 核心业务
  • 导入入口交给 ExcelImportHandler.execute(...),再由 handleImportData(...) 做明细校验与落库。
  1. 状态变更
  • 成功导入后会批量新增或更新 part_main
  1. 数据影响
  • 导入数据会对主表做批量 upsert。
  1. 收尾
  • Controller 通过 success(...) 返回框架统一成功响应。

数据链路

接口调用类型库名.表名mapper.pagesql作用(简写)
POST /dm-store/partMain/importExcel更新?.part_mainMyBatis-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 的全部字段定义。

后端逻辑链路

  1. 校验
  • 当前链路未识别出额外步骤。
  1. 预处理
  • Service 内先构造 LambdaQueryWrapper 作为条件容器。
  1. 核心业务
  • 使用 ServiceImpl 通用查询能力拉取目标数据集合。
  1. 状态变更
  • 不会改动主表字段,但会替换附件文件。
  1. 数据影响
  • 附件文件服务数据会被删旧传新。
  1. 收尾
  • 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&lt;Long&gt;;说明:id集合;来源:前端导出动作实际可发送
  • partNoList;类型:List&lt;String&gt;;说明:物料代号集合;来源:后端对象支持,当前导出动作未发送
  • 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 列表渲染。

后端逻辑链路

  1. 校验
  • Controller 入口为 exportExcel(@Validated @RequestBody PartMainQueryVo partMainQueryVo, HttpServletResponse response),由 @Validated 和请求对象注解触发基础参数校验。
  1. 预处理
  • Service 内先构造 LambdaQueryWrapper 作为条件容器。
  • 调用 findPartMainCondition(...) 统一组装筛选条件。
  1. 核心业务
  • 使用 ServiceImpl 通用查询能力拉取目标数据集合。
  • 对价格统一保留 3 位小数。
  • 把查询结果转成 Excel 视图对象后导出文件。
  1. 状态变更
  • 当前链路无数据库写操作。
  1. 数据影响
  • 库存、金额、业务状态都不会发生持久化变更;若有价格处理,仅作用于返回值或导出值。
  1. 收尾
  • 当前链路未识别出额外步骤。

数据链路

接口调用类型库名.表名mapper.pagesql作用(简写)
POST /dm-store/partMain/exportExcel查询?.part_mainMyBatis-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. 子组件列表

8. 修改入口

  • 改当前节点逻辑:先看上游入口,再看组件总览和业务页面跳转链路,最后核对接口与后端落点。
  • 当前节点含附件链路,上传、删除和业务绑定顺序要一起核对。
  • 重点组件较多,改组件分类或主链路时要同时看组件链和路由链。