From 5f6e22652b55c1b202ffc7f6517fd8237c4d6c90 Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期六, 18 七月 2026 16:03:10 +0800
Subject: [PATCH] chore(project): 更新项目配置和忽略文件
---
.claude/identity.json | 9 +++
.claude/plan.md | 129 +++++++++++++++++++++++++++++++++++++++++++
2 files changed, 138 insertions(+), 0 deletions(-)
diff --git a/.claude/identity.json b/.claude/identity.json
new file mode 100644
index 0000000..d55b516
--- /dev/null
+++ b/.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"
+}
diff --git a/.claude/plan.md b/.claude/plan.md
new file mode 100644
index 0000000..0c3f965
--- /dev/null
+++ b/.claude/plan.md
@@ -0,0 +1,129 @@
+# 寰呮姤宸ュ彴璐� 鎺ュ彛鏂规
+
+## 闇�姹�
+
+鎺掍骇鍚庨渶瑕佷竴涓�"寰呮姤宸ュ彴璐�"锛氬睍绀哄凡鎺掍骇浣嗗皻鏈姤宸ュ畬鐨勪换鍔★紝鏍稿績鏄� **寰呮姤宸ユ暟閲� = 鎺掍骇鏁伴噺 鈭� 宸叉姤宸ユ暟閲�**銆�
+
+鏁版嵁婧愮敤 `mes_pro_task`锛堜换鍔$骇姹囨�伙紝姝g‘--寰呮姤宸ュぉ鐒舵槸浠诲姟绾ф蹇碉紱宸茬敓浜ф暟閲� 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` 鐢ㄨ8鍒楀悕锛氭湰鏌ヨ鏃� 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`锛氭帴鍙h矾寰勩�佽繃婊ゅ弬鏁般�佸搷搴斿瓧娈碉紙鍚� pendingQuantity/feedbackRate锛夈�佸墠绔〃鏍煎垪寤鸿銆�
+
+### 7. 缂栬瘧鏍¢獙
+
+`mvn compile -pl yudao-module-mes -am -Dmaven.compiler.source=25 -Dmaven.compiler.target=25 -q`锛堟寜 compile-check 瑙勫垯锛�
+
+## 琛屼负璇存槑
+
+| 浠诲姟鎯呭喌 | 鏄惁鍑虹幇鍦ㄥ緟鎶ュ伐鍙拌处 |
+|---------|--------------------|
+| 鐘舵��=杩涜涓紝宸叉姤宸� < 鎺掍骇 | 鉁� 鍑虹幇锛宲endingQuantity>0 |
+| 鐘舵��=杩涜涓紝宸叉姤宸� = 鎺掍骇锛堟姤婊′簡浣嗗伐鍗曟病瀹屽伐锛墊 鉂� 涓嶅嚭鐜帮紙pendingQuantity=0锛墊
+| 鐘舵��=宸插畬鎴�/宸插彇娑� | 鉂� 涓嶅嚭鐜� |
+| 鐘舵��=杩涜涓紝浠庢湭鎶ュ伐 | 鉁� 鍑虹幇锛宲endingQuantity=鎺掍骇鏁伴噺 |
+
+> 宸叉姤宸�=鎺掍骇浣嗕换鍔′粛 PREPARE 鐨勪换鍔′笉鍦ㄥ彴璐﹂噷锛堟病寰呮姤宸ラ噺浜嗭級銆傝嫢鎯崇湅"鎵�鏈夎繘琛屼腑浠诲姟"锛岀敤鐜版湁 `/mes/pro/task/page?status=0`銆�
+
+## 涓嶆敼鍔ㄩ」
+
+- 鎶ュ伐鐩稿叧閫昏緫涓嶅姩
+- `MesProTaskPageReqVO` 涓嶅姩锛堝鐢級
+- `selectPage` 鍘熼�昏緫涓嶅姩
+- 涓嶆柊寤虹嫭绔� ReqVO/RespVO锛堝鐢ㄧ幇鏈夛紝鏈�灏忔敼鍔級
+
+## 寰呯‘璁�
+
+- `feedbackRate`锛堝畬鎴愮巼锛夎涓嶈锛熼粯璁ゅ姞涓婏紝灞曠ず鏇寸洿瑙傦紱涓嶈鍙幓鎺夈��
+- 鏄惁闇�瑕�"鎸夊緟鎶ュ伐鏁伴噺鍊掑簭"鎺掑垪锛熷綋鍓嶆寜 id 鍊掑簭銆傚彲鏀� `orderByDesc(pendingQuantity)`锛屼絾 MPJ 瀵硅绠楀垪鎺掑簭闇� raw SQL锛岀暐绻併�傞粯璁� id 鍊掑簭锛岄渶瑕佸啀璇淬��
--
Gitblit v1.9.3