IQC来料检验申请-后端设计.md 5.5 KB

IQC 来料检验申请列表 - 后端设计(MVP)

目标

  • 聚焦“来料检验申请”列表接口,满足前端列表展示/筛选/分页
  • 单据编号使用 FBILLNO,申请人用 system_users.username,状态返回中文

1) VO 定义(建议先定 VO)

IqcApplyPageReqVO

  • keyword: String(模糊匹配 FBILLNO/FCOMMENT)
  • statusList: List(值:待检验/检验中/检验完成)
  • applicantIds: List
  • beginTime: LocalDateTime(申请时间起)
  • endTime: LocalDateTime(申请时间止)
  • pageNo: Integer
  • pageSize: Integer
  • IqcApplyPageRespVO

    • id: String(FBILLNO)
    • applicantId: Long(FAPPLYUSER)
    • applicantName: String(system_users.username)
    • applyTime: LocalDateTime(FAPPLYTIME)
    • status: String(中文:待检验/检验中/检验完成)
    • materialCount: Integer(子表行数)
    • remark: String(FCOMMENT)

    2) DO(最小字段集)

    qms_qcp_inspecapplyn(主表)

    • id: Long
    • FBILLNO: String
    • FAPPLYUSER: Long
    • FAPPLYTIME: LocalDateTime
    • FCOMMENT: String
    • FCREATETIME: LocalDateTime(排序可用)

    qms_qcp_insappnentry(子表)

    • id: Long
    • glid: Long(关联主表 id)
    • FINSPECTSTATUS: String(中文:待检验/检验中/检验完成)

    system_users(用户表)

    • id: Long
    • username: String

    3) Mapper SQL 草案(分页列表)

    要点

    • 状态由子表汇总:
      • 任一行“检验中” => 检验中
      • 全部“检验完成” => 检验完成
      • 其他/无子表 => 待检验
    • 申请人通过 system_users.id 关联 system_users.username

    示意 SQL(MyBatis 可按此改写) SELECT a.FBILLNO AS id, a.FAPPLYUSER AS applicantId, u.username AS applicantName, a.FAPPLYTIME AS applyTime, a.FCOMMENT AS remark, COUNT(b.id) AS materialCount, CASE

    WHEN SUM(CASE WHEN b.FINSPECTSTATUS = '检验中' THEN 1 ELSE 0 END) > 0 THEN '检验中'
    WHEN COUNT(b.id) > 0
      AND SUM(CASE WHEN b.FINSPECTSTATUS = '检验完成' THEN 1 ELSE 0 END) = COUNT(b.id) THEN '检验完成'
    ELSE '待检验'
    

    END AS status FROM qms_qcp_inspecapplyn a LEFT JOIN system_users u ON u.id = a.FAPPLYUSER LEFT JOIN qms_qcp_insappnentry b ON b.glid = a.id WHERE 1 = 1 -- keyword:FBILLNO/FCOMMENT 模糊匹配 -- applicantIds:a.FAPPLYUSER IN (...) -- 时间:a.FAPPLYTIME BETWEEN beginTime AND endTime GROUP BY a.FBILLNO, a.FAPPLYUSER, u.username, a.FAPPLYTIME, a.FCOMMENT -- 若要按状态筛选,可在外层包一层并对 status 过滤 ORDER BY a.FCREATETIME DESC

    4) Mapper XML 示例(分页列表)

    说明

    • 先在子查询中计算 status,再在外层按 status 过滤,避免 HAVING 复杂度
    • SQL 仅示意,按实际分页插件(MyBatis-Plus / PageHelper)调整

    示例(XML 片段)

    <select id="selectIqcApplyPage" resultType="cn.iocoder.yudao.module.qms.controller.admin.iqc.vo.IqcApplyPageRespVO">
      SELECT *
      FROM (
        SELECT
          a.FBILLNO AS id,
          a.FAPPLYUSER AS applicantId,
          u.username AS applicantName,
          a.FAPPLYTIME AS applyTime,
          a.FCOMMENT AS remark,
          COUNT(b.id) AS materialCount,
          CASE
            WHEN SUM(CASE WHEN b.FINSPECTSTATUS = '检验中' THEN 1 ELSE 0 END) > 0 THEN '检验中'
            WHEN COUNT(b.id) > 0
              AND SUM(CASE WHEN b.FINSPECTSTATUS = '检验完成' THEN 1 ELSE 0 END) = COUNT(b.id) THEN '检验完成'
            ELSE '待检验'
          END AS status
        FROM qms_qcp_inspecapplyn a
        LEFT JOIN system_users u ON u.id = a.FAPPLYUSER
        LEFT JOIN qms_qcp_insappnentry b ON b.glid = a.id
        <where>
          <if test="keyword != null and keyword != ''">
            AND (a.FBILLNO LIKE CONCAT('%', #{keyword}, '%')
                 OR a.FCOMMENT LIKE CONCAT('%', #{keyword}, '%'))
          </if>
          <if test="applicantIds != null and applicantIds.size() > 0">
            AND a.FAPPLYUSER IN
            <foreach collection="applicantIds" item="id" open="(" separator="," close=")">
              #{id}
            </foreach>
          </if>
          <if test="beginTime != null and endTime != null">
            AND a.FAPPLYTIME BETWEEN #{beginTime} AND #{endTime}
          </if>
        </where>
        GROUP BY a.FBILLNO, a.FAPPLYUSER, u.username, a.FAPPLYTIME, a.FCOMMENT
      ) t
      <where>
        <if test="statusList != null and statusList.size() > 0">
          AND t.status IN
          <foreach collection="statusList" item="status" open="(" separator="," close=")">
            #{status}
          </foreach>
        </if>
      </where>
      ORDER BY t.applyTime DESC
    </select>
    

    5) Service / Controller 设计(建议)

    Controller

    • GET /admin-api/qms/iqc-apply/page
      • 入参:IqcApplyPageReqVO
      • 出参:PageResult
    • Service

      • IqcApplyService#getIqcApplyPage(IqcApplyPageReqVO reqVO)
        • 负责参数校验、调用 Mapper、封装分页结果

      6) 接口契约(示例)

      请求示例

      GET /admin-api/qms/iqc-apply/page?keyword=IQC&statusList=待检验&applicantIds=1&pageNo=1&pageSize=20
      

      响应示例

      {
        "code": 0,
        "data": {
          "list": [
            {
              "id": "IQC20240115001",
              "applicantId": 1,
              "applicantName": "zhangsan",
              "applyTime": "2024-01-15 09:30:00",
              "status": "待检验",
              "materialCount": 5,
              "remark": "紧急物料,请优先处理"
            }
          ],
          "total": 1
        }
      }
      

      7) 前端对接清单(最小改动)

      • 列表接口地址:/admin-api/qms/iqc-apply/page
      • 字段映射:
        • id -> 单据编号(FBILLNO)
        • applicantName -> 申请人
        • applyTime -> 申请时间
        • status -> 状态(中文)
        • materialCount -> 物料数
        • remark -> 备注
      • 状态显示:已在 StatusBadge 与筛选项里支持中文