4 天以前 5f6e22652b55c1b202ffc7f6517fd8237c4d6c90
chore(project): 更新项目配置和忽略文件

- 在 .gitignore 中添加 Claude Code 相关配置文件
- 移除 .claude/identity.json 配置文件
- 移除 .claude/plan.md 计划文档
- 移除 .claude/settings.local.json 本地设置文件
已添加2个文件
138 ■■■■■ 文件已修改
.claude/identity.json 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.claude/plan.md 129 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.claude/identity.json
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,9 @@
{
  "name": "product-inventory-management",
  "description": "Product inventory management system with JDK 25+",
  "language": "Java",
  "framework": "Spring Boot",
  "database": "MySQL",
  "orm": "MyBatis",
  "javaVersion": "25"
}
.claude/plan.md
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,129 @@
# å¾…报工台账 æŽ¥å£æ–¹æ¡ˆ
## éœ€æ±‚
排产后需要一个"待报工台账":展示已排产但尚未报工完的任务,核心是 **待报工数量 = æŽ’产数量 âˆ’ å·²æŠ¥å·¥æ•°é‡**。
数据源用 `mes_pro_task`(任务级汇总,正确--待报工天然是任务级概念;已生产数量 producedQuantity ç”±æŠ¥å·¥å®¡æ‰¹ç´¯åŠ å›žå†™ï¼Œæ— éœ€çŽ°ç®— feedback)。
## æ ¸å¿ƒè¿‡æ»¤ä¸Žå­—段
- **过滤**:`status = PREPARE(0)`(进行中,排除已完成/已取消)AND `(quantity - IFNULL(produced_quantity,0)) > 0`(仍有待报工量)
- **新增展示字段**:
  - `pendingQuantity` å¾…报工数量 = `quantity - producedQuantity`
  - `feedbackRate` æŠ¥å·¥å®Œæˆçއ = `producedQuantity / quantity Ã— 100`(排产数量为 0 æ—¶ç»™ 0)
- å…¶ä½™å±•示字段复用现有 `MesProTaskRespVO`(工单号、产品、工序、工位、客户、排产/已生产/合格/不良数量、需求日期等,已由 `buildTaskRespVOList` æ‰¹é‡å…³è”拼好)
## æ”¹åŠ¨æ¸…å•
### 1. `MesProTaskRespVO` åŠ ä¸¤ä¸ªå­—æ®µ
`controller/admin/pro/task/vo/MesProTaskRespVO.java`,在 `unqualifyQuantity` ä¹‹åŽï¼š
```java
@Schema(description = "待报工数量", example = "50.00")
private BigDecimal pendingQuantity;
@Schema(description = "报工完成率(%)", example = "50.00")
private BigDecimal feedbackRate;
```
### 2. `MesProTaskController.buildTaskRespVOList` è®¡ç®—这两个字段
在 `convertList` çš„ lambda é‡Œï¼Œ`BeanUtils.toBean` ä¹‹åŽè¿½åŠ ï¼š
```java
BigDecimal quantity = task.getQuantity() == null ? BigDecimal.ZERO : task.getQuantity();
BigDecimal produced = task.getProducedQuantity() == null ? BigDecimal.ZERO : task.getProducedQuantity();
vo.setPendingQuantity(quantity.subtract(produced));
vo.setFeedbackRate(quantity.compareTo(BigDecimal.ZERO) == 0 ? BigDecimal.ZERO
        : produced.multiply(new BigDecimal("100")).divide(quantity, 2, RoundingMode.HALF_UP));
```
> çŽ°æœ‰ page / get / gantt éƒ½èµ° `buildTaskRespVOList`,加这两列后它们也会带出,无害且更完整。
### 3. `MesProTaskMapper` åŠ  `selectPendingFeedbackPage`
`dal/mysql/pro/task/MesProTaskMapper.java`,仿 `selectPage`,强制 `status=PREPARE` + å¾…报工量>0,复用其余过滤条件,不需要 checkFlag join:
```java
default PageResult<MesProTaskDO> selectPendingFeedbackPage(MesProTaskPageReqVO reqVO) {
    MPJLambdaWrapperX<MesProTaskDO> query = new MPJLambdaWrapperX<>();
    query.selectAll(MesProTaskDO.class);
    query.eq(MesProTaskDO::getStatus, MesProTaskStatusEnum.PREPARE.getStatus()); // å¾…报工=进行中
    query.apply("(quantity - IFNULL(produced_quantity, 0)) > 0");                  // ä»æœ‰å¾…报工量
    query.likeIfPresent(MesProTaskDO::getCode, reqVO.getCode())
            .likeIfPresent(MesProTaskDO::getName, reqVO.getName())
            .eqIfPresent(MesProTaskDO::getWorkOrderId, reqVO.getWorkOrderId())
            .eqIfPresent(MesProTaskDO::getRouteId, reqVO.getRouteId())
            .eqIfPresent(MesProTaskDO::getProcessId, reqVO.getProcessId())
            .eqIfPresent(MesProTaskDO::getWorkstationId, reqVO.getWorkstationId())
            .betweenIfPresent(MesProTaskDO::getCreateTime, reqVO.getCreateTime())
            .orderByDesc(MesProTaskDO::getId);
    return selectPage(reqVO, query);
}
```
> `apply` ç”¨è£¸åˆ—名:本查询无 join,`quantity`/`produced_quantity` æ— æ­§ä¹‰ã€‚`reqVO.getStatus()`/`getStatuses()` åœ¨æ­¤æŽ¥å£è¢«å¿½ç•¥ï¼ˆå¼ºåˆ¶ PREPARE),符合"待报工"语义。
### 4. `MesProTaskService` + Impl åŠ æ–¹æ³•
接口加:
```java
PageResult<MesProTaskDO> getPendingFeedbackPage(MesProTaskPageReqVO pageReqVO);
```
Impl:
```java
@Override
public PageResult<MesProTaskDO> getPendingFeedbackPage(MesProTaskPageReqVO pageReqVO) {
    return taskMapper.selectPendingFeedbackPage(pageReqVO);
}
```
### 5. `MesProTaskController` åŠ æŽ¥å£
复用 `buildTaskRespVOList` æ‹¼å±•示字段,复用 `MesProTaskPageReqVO` åšè¿‡æ»¤ï¼š
```java
@GetMapping("/pending-feedback-page")
@Operation(summary = "获得待报工台账分页", description = "已排产且仍有待报工数量的任务(状态=进行中)")
@PreAuthorize("@ss.hasPermission('mes:pro-task:query')")
public CommonResult<PageResult<MesProTaskRespVO>> getPendingFeedbackPage(@Valid MesProTaskPageReqVO pageReqVO) {
    PageResult<MesProTaskDO> pageResult = taskService.getPendingFeedbackPage(pageReqVO);
    return success(new PageResult<>(buildTaskRespVOList(pageResult.getList()), pageResult.getTotal()));
}
```
### 6. å‰ç«¯æ–‡æ¡£
按 frontend-docs è§„则输出 `docs/task_pending_feedback_ledger.md`:接口路径、过滤参数、响应字段(含 pendingQuantity/feedbackRate)、前端表格列建议。
### 7. ç¼–译校验
`mvn compile -pl yudao-module-mes -am -Dmaven.compiler.source=25 -Dmaven.compiler.target=25 -q`(按 compile-check è§„则)
## è¡Œä¸ºè¯´æ˜Ž
| ä»»åŠ¡æƒ…å†µ | æ˜¯å¦å‡ºçŽ°åœ¨å¾…æŠ¥å·¥å°è´¦ |
|---------|--------------------|
| çŠ¶æ€=进行中,已报工 < æŽ’产 | âœ… å‡ºçŽ°ï¼ŒpendingQuantity>0 |
| çŠ¶æ€=进行中,已报工 = æŽ’产(报满了但工单没完工)| âŒ ä¸å‡ºçŽ°ï¼ˆpendingQuantity=0)|
| çŠ¶æ€=已完成/已取消 | âŒ ä¸å‡ºçް |
| çŠ¶æ€=进行中,从未报工 | âœ… å‡ºçŽ°ï¼ŒpendingQuantity=排产数量 |
> å·²æŠ¥å·¥=排产但任务仍 PREPARE çš„任务不在台账里(没待报工量了)。若想看"所有进行中任务",用现有 `/mes/pro/task/page?status=0`。
## ä¸æ”¹åЍ项
- æŠ¥å·¥ç›¸å…³é€»è¾‘不动
- `MesProTaskPageReqVO` ä¸åŠ¨ï¼ˆå¤ç”¨ï¼‰
- `selectPage` åŽŸé€»è¾‘ä¸åŠ¨
- ä¸æ–°å»ºç‹¬ç«‹ ReqVO/RespVO(复用现有,最小改动)
## å¾…确认
- `feedbackRate`(完成率)要不要?默认加上,展示更直观;不要可去掉。
- æ˜¯å¦éœ€è¦"按待报工数量倒序"排列?当前按 id å€’序。可改 `orderByDesc(pendingQuantity)`,但 MPJ å¯¹è®¡ç®—列排序需 raw SQL,略繁。默认 id å€’序,需要再说。