feat(crm): 实现CRM客户管理查看全部权限功能
- 新增场景类型枚举值"全部"(type=4),扩展客户查询功能
- 实现权限校验逻辑,支持crm:customer:view-all权限或crm_admin角色
- 添加权限降级机制,无权限用户自动切换为"我负责的"场景
- 更新数据库权限配置,新增view-all权限标识到客户公海菜单
- 完善前端文档说明,定义权限判断和Tab展示规则
- 修改MCP服务器端口配置,更新本地开发环境连接地址
| | |
| | | { |
| | | "mcpServers": { |
| | | "idea": { |
| | | "url": "http://127.0.0.1:64342/stream", |
| | | "url": "http://127.0.0.1:64417/stream", |
| | | "type": "http" |
| | | } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | { |
| | | "mcpServers": { |
| | | "idea": { |
| | | "url": "http://127.0.0.1:64417/stream", |
| | | "type": "http" |
| | | } |
| | | } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | - generic [active]: 工忰ååMOMç³»ç» |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | - generic [active]: 工忰ååMOMç³»ç» |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | - generic [ref=e7]: |
| | | - complementary [ref=e8]: |
| | | - generic [ref=e9]: |
| | | - link "工忰ååMOMç³»ç» å·¥åæ°ååMOMç³»ç»" [ref=e15] [cursor=pointer]: |
| | | - /url: javascript:void 0 |
| | | - img "工忰ååMOMç³»ç»" [ref=e18] |
| | | - generic [ref=e19]: 工忰ååMOMç³»ç» |
| | | - menu [ref=e22]: |
| | | - listitem [ref=e23]: |
| | | - generic [ref=e24] [cursor=pointer]: æ¦è§ |
| | | - listitem [ref=e34]: |
| | | - generic [ref=e35] [cursor=pointer]: åºç¡æ°æ® |
| | | - listitem [ref=e43]: |
| | | - generic [ref=e44] [cursor=pointer]: éè´ç®¡ç |
| | | - listitem [ref=e50]: |
| | | - generic [ref=e51] [cursor=pointer]: è¥é管ç |
| | | - listitem [ref=e57]: |
| | | - generic [ref=e58] [cursor=pointer]: 设å¤ç®¡ç |
| | | - listitem [ref=e65]: |
| | | - generic [ref=e66] [cursor=pointer]: ä»å¨ç©æµ |
| | | - listitem [ref=e74]: |
| | | - generic [ref=e75] [cursor=pointer]: çäº§ç®¡æ§ |
| | | - listitem [ref=e82]: |
| | | - generic [ref=e83] [cursor=pointer]: è´¨é管ç |
| | | - listitem [ref=e89]: |
| | | - generic [ref=e90] [cursor=pointer]: åååå
¬ |
| | | - listitem [ref=e96]: |
| | | - generic [ref=e97] [cursor=pointer]: 人åèµæº |
| | | - listitem [ref=e103]: |
| | | - generic [ref=e104] [cursor=pointer]: åºç¡è®¾æ½ |
| | | - listitem [ref=e110]: |
| | | - generic [ref=e111] [cursor=pointer]: ç³»ç»ç®¡ç |
| | | - listitem [ref=e117]: |
| | | - generic [ref=e118] [cursor=pointer]: IM 峿¶é讯 |
| | | - generic [ref=e131]: |
| | | - generic [ref=e132]: |
| | | - banner [ref=e133]: |
| | | - button [ref=e134] [cursor=pointer] |
| | | - button [ref=e137] [cursor=pointer] |
| | | - navigation "breadcrumb" [ref=e142]: |
| | | - list [ref=e143]: |
| | | - listitem [ref=e144]: |
| | | - link [ref=e145] [cursor=pointer]: |
| | | - /url: javascript:void 0 |
| | | - listitem [ref=e152] |
| | | - listitem [ref=e155]: |
| | | - link "ææ è¯¦æ
" [disabled] [ref=e156] |
| | | - generic [ref=e159]: |
| | | - generic [ref=e161] [cursor=pointer]: |
| | | - generic [ref=e165]: æç´¢ |
| | | - generic [ref=e166]: Ctrl K |
| | | - button [ref=e168] [cursor=pointer] |
| | | - button "dark" [ref=e173] [cursor=pointer] |
| | | - button [ref=e182] [cursor=pointer] |
| | | - button [ref=e188] [cursor=pointer] |
| | | - button [ref=e191] [cursor=pointer] |
| | | - button [ref=e197] [cursor=pointer]: |
| | | - button [ref=e199] |
| | | - button "å·¥ä½å°" [ref=e203] [cursor=pointer] |
| | | - button "æºç " [ref=e207] [cursor=pointer] |
| | | - generic [ref=e214]: |
| | | - generic [ref=e219]: |
| | | - generic [ref=e220] [cursor=pointer]: åæé¡µ |
| | | - generic [ref=e238] [cursor=pointer]: ææ è¯¦æ
|
| | | - button [ref=e254] [cursor=pointer] |
| | | - main [ref=e272]: |
| | | - generic [ref=e275]: |
| | | - generic [ref=e276]: |
| | | - button [ref=e277] [cursor=pointer] |
| | | - generic [ref=e280]: æµè¯é¡¹ç® |
| | | - generic [ref=e281]: æµè¯ç¼å· |
| | | - generic [ref=e282]: è¯æ ä¸ |
| | | - generic [ref=e283]: å
¬å¼ææ |
| | | - button "å·æ°" [ref=e284] [cursor=pointer] |
| | | - generic [ref=e290]: |
| | | - generic: |
| | | - generic "è稿" |
| | | - generic "åå¸" |
| | | - generic "ææ ä¸" |
| | | - generic "è¯æ ä¸" |
| | | - generic "已宿 " |
| | | - generic [ref=e291]: |
| | | - generic [ref=e292]: |
| | | - generic [ref=e293]: é¢ç®éé¢ |
| | | - generic [ref=e294]: 15,000 å
|
| | | - generic [ref=e295]: |
| | | - generic [ref=e296]: è´è´£äºº |
| | | - generic [ref=e297]: "-" |
| | | - generic [ref=e298]: |
| | | - generic [ref=e299]: éè´ç»ç» |
| | | - generic [ref=e300]: "-" |
| | | - generic [ref=e301]: |
| | | - generic [ref=e302]: 弿 æ¶é´ |
| | | - generic [ref=e303]: 2026-07-29 11:20:11 |
| | | - generic [ref=e304]: |
| | | - generic [ref=e305]: å¼å§æ¶é´ |
| | | - generic [ref=e306]: 2026-07-29 11:13:02 |
| | | - generic [ref=e307]: |
| | | - generic [ref=e308]: æªæ¢æ¶é´ |
| | | - generic [ref=e309]: 2026-07-29 19:13:06 |
| | | - generic [ref=e313]: |
| | | - tablist [ref=e314]: |
| | | - generic [ref=e316]: |
| | | - tab [ref=e318] [cursor=pointer] |
| | | - tab [ref=e323] [cursor=pointer] |
| | | - tab [ref=e328] [cursor=pointer] |
| | | - tab [ref=e333] [cursor=pointer] |
| | | - tab [ref=e338] [cursor=pointer] |
| | | - tab [active] [selected] [ref=e343] [cursor=pointer] |
| | | - tabpanel "宿 " [ref=e404]: |
| | | - generic [ref=e405]: |
| | | - generic "å°æªå®æ " |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | - generic [ref=e7]: |
| | | - complementary [ref=e8]: |
| | | - generic [ref=e9]: |
| | | - link "工忰ååMOMç³»ç» å·¥åæ°ååMOMç³»ç»" [ref=e15] [cursor=pointer]: |
| | | - /url: javascript:void 0 |
| | | - img "工忰ååMOMç³»ç»" [ref=e18] |
| | | - generic [ref=e19]: 工忰ååMOMç³»ç» |
| | | - menu [ref=e22]: |
| | | - listitem [ref=e23]: |
| | | - generic [ref=e24] [cursor=pointer]: æ¦è§ |
| | | - listitem [ref=e34]: |
| | | - generic [ref=e35] [cursor=pointer]: åºç¡æ°æ® |
| | | - listitem [ref=e43]: |
| | | - generic [ref=e44] [cursor=pointer]: éè´ç®¡ç |
| | | - listitem [ref=e50]: |
| | | - generic [ref=e51] [cursor=pointer]: è¥é管ç |
| | | - listitem [ref=e57]: |
| | | - generic [ref=e58] [cursor=pointer]: 设å¤ç®¡ç |
| | | - listitem [ref=e65]: |
| | | - generic [ref=e66] [cursor=pointer]: ä»å¨ç©æµ |
| | | - listitem [ref=e74]: |
| | | - generic [ref=e75] [cursor=pointer]: çäº§ç®¡æ§ |
| | | - listitem [ref=e82]: |
| | | - generic [ref=e83] [cursor=pointer]: è´¨é管ç |
| | | - listitem [ref=e89]: |
| | | - generic [ref=e90] [cursor=pointer]: åååå
¬ |
| | | - listitem [ref=e96]: |
| | | - generic [ref=e97] [cursor=pointer]: 人åèµæº |
| | | - listitem [ref=e103]: |
| | | - generic [ref=e104] [cursor=pointer]: åºç¡è®¾æ½ |
| | | - listitem [ref=e110]: |
| | | - generic [ref=e111] [cursor=pointer]: ç³»ç»ç®¡ç |
| | | - listitem [ref=e117]: |
| | | - generic [ref=e118] [cursor=pointer]: IM 峿¶é讯 |
| | | - generic [ref=e131]: |
| | | - generic [ref=e132]: |
| | | - banner [ref=e133]: |
| | | - button [ref=e134] [cursor=pointer] |
| | | - button [ref=e137] [cursor=pointer] |
| | | - navigation "breadcrumb" [ref=e142]: |
| | | - list [ref=e143]: |
| | | - listitem [ref=e144]: |
| | | - link [ref=e145] [cursor=pointer]: |
| | | - /url: javascript:void 0 |
| | | - listitem [ref=e152] |
| | | - listitem [ref=e155]: |
| | | - link "ææ è¯¦æ
" [disabled] [ref=e156] |
| | | - generic [ref=e159]: |
| | | - generic [ref=e161] [cursor=pointer]: |
| | | - generic [ref=e165]: æç´¢ |
| | | - generic [ref=e166]: Ctrl K |
| | | - button [ref=e168] [cursor=pointer] |
| | | - button "dark" [ref=e173] [cursor=pointer] |
| | | - button [ref=e182] [cursor=pointer] |
| | | - button [ref=e188] [cursor=pointer] |
| | | - button [ref=e191] [cursor=pointer] |
| | | - button [ref=e197] [cursor=pointer]: |
| | | - button [ref=e199] |
| | | - button "å·¥ä½å°" [ref=e203] [cursor=pointer] |
| | | - button "æºç " [ref=e207] [cursor=pointer] |
| | | - generic [ref=e214]: |
| | | - generic [ref=e219]: |
| | | - generic [ref=e220] [cursor=pointer]: åæé¡µ |
| | | - generic [ref=e238] [cursor=pointer]: ææ è¯¦æ
|
| | | - button [ref=e254] [cursor=pointer] |
| | | - main [ref=e272]: |
| | | - generic [ref=e275]: |
| | | - generic [ref=e276]: |
| | | - button [ref=e277] [cursor=pointer] |
| | | - generic [ref=e280]: æµè¯é¡¹ç® |
| | | - generic [ref=e281]: æµè¯ç¼å· |
| | | - generic [ref=e282]: è¯æ ä¸ |
| | | - generic [ref=e283]: å
¬å¼ææ |
| | | - button "å·æ°" [ref=e284] [cursor=pointer] |
| | | - generic [ref=e290]: |
| | | - generic: |
| | | - generic "è稿" |
| | | - generic "åå¸" |
| | | - generic "ææ ä¸" |
| | | - generic "è¯æ ä¸" |
| | | - generic "已宿 " |
| | | - generic [ref=e291]: |
| | | - generic [ref=e292]: |
| | | - generic [ref=e293]: é¢ç®éé¢ |
| | | - generic [ref=e294]: 15,000 å
|
| | | - generic [ref=e295]: |
| | | - generic [ref=e296]: è´è´£äºº |
| | | - generic [ref=e297]: "-" |
| | | - generic [ref=e298]: |
| | | - generic [ref=e299]: éè´ç»ç» |
| | | - generic [ref=e300]: "-" |
| | | - generic [ref=e301]: |
| | | - generic [ref=e302]: 弿 æ¶é´ |
| | | - generic [ref=e303]: 2026-07-29 11:20:11 |
| | | - generic [ref=e304]: |
| | | - generic [ref=e305]: å¼å§æ¶é´ |
| | | - generic [ref=e306]: 2026-07-29 11:13:02 |
| | | - generic [ref=e307]: |
| | | - generic [ref=e308]: æªæ¢æ¶é´ |
| | | - generic [ref=e309]: 2026-07-29 19:13:06 |
| | | - generic [ref=e313]: |
| | | - tablist [ref=e314]: |
| | | - generic [ref=e316]: |
| | | - tab [ref=e318] [cursor=pointer] |
| | | - tab [ref=e323] [cursor=pointer] |
| | | - tab [ref=e328] [cursor=pointer] |
| | | - tab [active] [selected] [ref=e333] [cursor=pointer] |
| | | - tab [ref=e338] [cursor=pointer] |
| | | - tab [ref=e343] [cursor=pointer] |
| | | - tabpanel "弿 " [ref=e406]: |
| | | - generic [ref=e407]: |
| | | - generic "å°æªå¼æ " |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | - generic [active]: 工忰ååMOMç³»ç» |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | - generic [ref=f1e7]: |
| | | - complementary [ref=f1e8]: |
| | | - generic [ref=f1e9]: |
| | | - link "工忰ååMOMç³»ç» å·¥åæ°ååMOMç³»ç»" [ref=f1e15] [cursor=pointer]: |
| | | - /url: javascript:void 0 |
| | | - img "工忰ååMOMç³»ç»" [ref=f1e18] |
| | | - generic [ref=f1e19]: 工忰ååMOMç³»ç» |
| | | - menu [ref=f1e22]: |
| | | - listitem [ref=f1e23]: |
| | | - generic [ref=f1e24] [cursor=pointer]: æ¦è§ |
| | | - listitem [ref=f1e34]: |
| | | - generic [ref=f1e35] [cursor=pointer]: åºç¡æ°æ® |
| | | - listitem [ref=f1e43]: |
| | | - generic [ref=f1e44] [cursor=pointer]: éè´ç®¡ç |
| | | - listitem [ref=f1e50]: |
| | | - generic [ref=f1e51] [cursor=pointer]: è¥é管ç |
| | | - listitem [ref=f1e57]: |
| | | - generic [ref=f1e58] [cursor=pointer]: 设å¤ç®¡ç |
| | | - listitem [ref=f1e65]: |
| | | - generic [ref=f1e66] [cursor=pointer]: ä»å¨ç©æµ |
| | | - listitem [ref=f1e74]: |
| | | - generic [ref=f1e75] [cursor=pointer]: çäº§ç®¡æ§ |
| | | - listitem [ref=f1e82]: |
| | | - generic [ref=f1e83] [cursor=pointer]: è´¨é管ç |
| | | - listitem [ref=f1e89]: |
| | | - generic [ref=f1e90] [cursor=pointer]: åååå
¬ |
| | | - listitem [ref=f1e96]: |
| | | - generic [ref=f1e97] [cursor=pointer]: 人åèµæº |
| | | - listitem [ref=f1e103]: |
| | | - generic [ref=f1e104] [cursor=pointer]: åºç¡è®¾æ½ |
| | | - listitem [ref=f1e110]: |
| | | - generic [ref=f1e111] [cursor=pointer]: ç³»ç»ç®¡ç |
| | | - listitem [ref=f1e117]: |
| | | - generic [ref=f1e118] [cursor=pointer]: IM 峿¶é讯 |
| | | - generic [ref=f1e131]: |
| | | - generic [ref=f1e132]: |
| | | - banner [ref=f1e133]: |
| | | - button [ref=f1e134] [cursor=pointer] |
| | | - button [ref=f1e137] [cursor=pointer] |
| | | - navigation "breadcrumb" [ref=f1e142]: |
| | | - list [ref=f1e143]: |
| | | - listitem [ref=f1e144]: |
| | | - link [ref=f1e145] [cursor=pointer]: |
| | | - /url: javascript:void 0 |
| | | - listitem [ref=f1e152] |
| | | - listitem [ref=f1e155]: |
| | | - link "ææ è¯¦æ
" [disabled] [ref=f1e156] |
| | | - generic [ref=f1e159]: |
| | | - generic [ref=f1e161] [cursor=pointer]: |
| | | - generic [ref=f1e165]: æç´¢ |
| | | - generic [ref=f1e166]: Ctrl K |
| | | - button [ref=f1e168] [cursor=pointer] |
| | | - button "dark" [ref=f1e173] [cursor=pointer] |
| | | - button [ref=f1e182] [cursor=pointer] |
| | | - button [ref=f1e188] [cursor=pointer] |
| | | - button [ref=f1e191] [cursor=pointer] |
| | | - button [ref=f1e197] [cursor=pointer]: |
| | | - button [ref=f1e199] |
| | | - button "å·¥ä½å°" [ref=f1e203] [cursor=pointer] |
| | | - button "æºç " [ref=f1e207] [cursor=pointer] |
| | | - generic [ref=f1e214]: |
| | | - generic [ref=f1e219]: |
| | | - generic [ref=f1e220] [cursor=pointer]: åæé¡µ |
| | | - generic [ref=f1e238] [cursor=pointer]: ææ è¯¦æ
|
| | | - button [ref=f1e254] [cursor=pointer] |
| | | - main [ref=f1e272]: |
| | | - generic [ref=f1e275]: |
| | | - generic [ref=f1e276]: |
| | | - button [ref=f1e277] [cursor=pointer] |
| | | - generic [ref=f1e280]: æµè¯é¡¹ç® |
| | | - generic [ref=f1e281]: æµè¯ç¼å· |
| | | - generic [ref=f1e282]: è¯æ ä¸ |
| | | - generic [ref=f1e283]: å
¬å¼ææ |
| | | - button "å·æ°" [ref=f1e284] [cursor=pointer] |
| | | - generic [ref=f1e290]: |
| | | - generic: |
| | | - generic "è稿" |
| | | - generic "åå¸" |
| | | - generic "ææ ä¸" |
| | | - generic "è¯æ ä¸" |
| | | - generic "已宿 " |
| | | - generic [ref=f1e291]: |
| | | - generic [ref=f1e292]: |
| | | - generic [ref=f1e293]: é¢ç®éé¢ |
| | | - generic [ref=f1e294]: 15,000 å
|
| | | - generic [ref=f1e295]: |
| | | - generic [ref=f1e296]: è´è´£äºº |
| | | - generic [ref=f1e297]: "-" |
| | | - generic [ref=f1e298]: |
| | | - generic [ref=f1e299]: éè´ç»ç» |
| | | - generic [ref=f1e300]: "-" |
| | | - generic [ref=f1e301]: |
| | | - generic [ref=f1e302]: 弿 æ¶é´ |
| | | - generic [ref=f1e303]: 2026-07-29 11:20:11 |
| | | - generic [ref=f1e304]: |
| | | - generic [ref=f1e305]: å¼å§æ¶é´ |
| | | - generic [ref=f1e306]: 2026-07-29 11:13:02 |
| | | - generic [ref=f1e307]: |
| | | - generic [ref=f1e308]: æªæ¢æ¶é´ |
| | | - generic [ref=f1e309]: 2026-07-29 19:13:06 |
| | | - generic [ref=f1e313]: |
| | | - tablist [ref=f1e314]: |
| | | - generic [ref=f1e316]: |
| | | - tab [ref=f1e318] [cursor=pointer] |
| | | - tab [ref=f1e323] [cursor=pointer] |
| | | - tab [ref=f1e328] [cursor=pointer] |
| | | - tab [ref=f1e333] [cursor=pointer] |
| | | - tab [ref=f1e338] [cursor=pointer] |
| | | - tab [active] [selected] [ref=f1e343] [cursor=pointer] |
| | | - tabpanel "宿 " [ref=f1e404]: |
| | | - generic [ref=f1e405]: |
| | | - generic "å°æªå®æ " |
| | | - button "åå»ºå®æ " [ref=f1e406] [cursor=pointer] |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | - generic [ref=f1e4]: |
| | | - generic [ref=f1e7]: |
| | | - complementary [ref=f1e8]: |
| | | - generic [ref=f1e9]: |
| | | - link "工忰ååMOMç³»ç» å·¥åæ°ååMOMç³»ç»" [ref=f1e15] [cursor=pointer]: |
| | | - /url: javascript:void 0 |
| | | - img "工忰ååMOMç³»ç»" [ref=f1e18] |
| | | - generic [ref=f1e19]: 工忰ååMOMç³»ç» |
| | | - menu [ref=f1e22]: |
| | | - listitem [ref=f1e23]: |
| | | - generic [ref=f1e24] [cursor=pointer]: æ¦è§ |
| | | - listitem [ref=f1e34]: |
| | | - generic [ref=f1e35] [cursor=pointer]: åºç¡æ°æ® |
| | | - listitem [ref=f1e43]: |
| | | - generic [ref=f1e44] [cursor=pointer]: éè´ç®¡ç |
| | | - listitem [ref=f1e50]: |
| | | - generic [ref=f1e51] [cursor=pointer]: è¥é管ç |
| | | - listitem [ref=f1e57]: |
| | | - generic [ref=f1e58] [cursor=pointer]: 设å¤ç®¡ç |
| | | - listitem [ref=f1e65]: |
| | | - generic [ref=f1e66] [cursor=pointer]: ä»å¨ç©æµ |
| | | - listitem [ref=f1e74]: |
| | | - generic [ref=f1e75] [cursor=pointer]: çäº§ç®¡æ§ |
| | | - listitem [ref=f1e82]: |
| | | - generic [ref=f1e83] [cursor=pointer]: è´¨é管ç |
| | | - listitem [ref=f1e89]: |
| | | - generic [ref=f1e90] [cursor=pointer]: åååå
¬ |
| | | - listitem [ref=f1e96]: |
| | | - generic [ref=f1e97] [cursor=pointer]: 人åèµæº |
| | | - listitem [ref=f1e103]: |
| | | - generic [ref=f1e104] [cursor=pointer]: åºç¡è®¾æ½ |
| | | - listitem [ref=f1e110]: |
| | | - generic [ref=f1e111] [cursor=pointer]: ç³»ç»ç®¡ç |
| | | - listitem [ref=f1e117]: |
| | | - generic [ref=f1e118] [cursor=pointer]: IM 峿¶é讯 |
| | | - generic [ref=f1e131]: |
| | | - generic [ref=f1e132]: |
| | | - banner [ref=f1e133]: |
| | | - button [ref=f1e134] [cursor=pointer] |
| | | - button [ref=f1e137] [cursor=pointer] |
| | | - navigation "breadcrumb" [ref=f1e142]: |
| | | - list [ref=f1e143]: |
| | | - listitem [ref=f1e144]: |
| | | - link [ref=f1e145] [cursor=pointer]: |
| | | - /url: javascript:void 0 |
| | | - listitem [ref=f1e152] |
| | | - listitem [ref=f1e155]: |
| | | - link "ææ è¯¦æ
" [disabled] [ref=f1e156] |
| | | - generic [ref=f1e159]: |
| | | - generic [ref=f1e161] [cursor=pointer]: |
| | | - generic [ref=f1e165]: æç´¢ |
| | | - generic [ref=f1e166]: Ctrl K |
| | | - button [ref=f1e168] [cursor=pointer] |
| | | - button "dark" [ref=f1e173] [cursor=pointer] |
| | | - button [ref=f1e182] [cursor=pointer] |
| | | - button [ref=f1e188] [cursor=pointer] |
| | | - button [ref=f1e191] [cursor=pointer] |
| | | - button [ref=f1e197] [cursor=pointer]: |
| | | - button [ref=f1e199] |
| | | - button "å·¥ä½å°" [ref=f1e203] [cursor=pointer] |
| | | - button "æºç " [ref=f1e207] [cursor=pointer] |
| | | - generic [ref=f1e214]: |
| | | - generic [ref=f1e219]: |
| | | - generic [ref=f1e220] [cursor=pointer]: åæé¡µ |
| | | - generic [ref=f1e238] [cursor=pointer]: ææ è¯¦æ
|
| | | - button [ref=f1e254] [cursor=pointer] |
| | | - main [ref=f1e272]: |
| | | - generic [ref=f1e275]: |
| | | - generic [ref=f1e276]: |
| | | - button [ref=f1e277] [cursor=pointer] |
| | | - generic [ref=f1e280]: æµè¯é¡¹ç® |
| | | - generic [ref=f1e281]: æµè¯ç¼å· |
| | | - generic [ref=f1e282]: è¯æ ä¸ |
| | | - generic [ref=f1e283]: å
¬å¼ææ |
| | | - button "å·æ°" [ref=f1e284] [cursor=pointer] |
| | | - generic [ref=f1e290]: |
| | | - generic: |
| | | - generic "è稿" |
| | | - generic "åå¸" |
| | | - generic "ææ ä¸" |
| | | - generic "è¯æ ä¸" |
| | | - generic "已宿 " |
| | | - generic [ref=f1e291]: |
| | | - generic [ref=f1e292]: |
| | | - generic [ref=f1e293]: é¢ç®éé¢ |
| | | - generic [ref=f1e294]: 15,000 å
|
| | | - generic [ref=f1e295]: |
| | | - generic [ref=f1e296]: è´è´£äºº |
| | | - generic [ref=f1e297]: "-" |
| | | - generic [ref=f1e298]: |
| | | - generic [ref=f1e299]: éè´ç»ç» |
| | | - generic [ref=f1e300]: "-" |
| | | - generic [ref=f1e301]: |
| | | - generic [ref=f1e302]: 弿 æ¶é´ |
| | | - generic [ref=f1e303]: 2026-07-29 11:20:11 |
| | | - generic [ref=f1e304]: |
| | | - generic [ref=f1e305]: å¼å§æ¶é´ |
| | | - generic [ref=f1e306]: 2026-07-29 11:13:02 |
| | | - generic [ref=f1e307]: |
| | | - generic [ref=f1e308]: æªæ¢æ¶é´ |
| | | - generic [ref=f1e309]: 2026-07-29 19:13:06 |
| | | - generic [ref=f1e313]: |
| | | - tablist [ref=f1e314]: |
| | | - generic [ref=f1e316]: |
| | | - tab [ref=f1e318] [cursor=pointer] |
| | | - tab [ref=f1e323] [cursor=pointer] |
| | | - tab [ref=f1e328] [cursor=pointer] |
| | | - tab [ref=f1e333] [cursor=pointer] |
| | | - tab [ref=f1e338] [cursor=pointer] |
| | | - tab [selected] [ref=f1e343] [cursor=pointer] |
| | | - tabpanel "宿 " [ref=f1e404]: |
| | | - generic [ref=f1e405]: |
| | | - generic "å°æªå®æ " |
| | | - button "åå»ºå®æ " [active] [ref=f1e406] [cursor=pointer] |
| | | - dialog "åå»ºå®æ " [ref=f1e412]: |
| | | - document: |
| | | - generic [ref=f1e413]: |
| | | - button "Close" [ref=f1e414] [cursor=pointer]: |
| | | - img "close" [ref=f1e416] |
| | | - generic [ref=f1e419]: åå»ºå®æ |
| | | - generic [ref=f1e422]: |
| | | - generic [ref=f1e424]: |
| | | - generic "宿 ç¼å·" [ref=f1e426]: "* 宿 ç¼å·" |
| | | - textbox "å¦ AWARD2024010001" [ref=f1e430] |
| | | - generic [ref=f1e431]: |
| | | - generic [ref=f1e434]: |
| | | - generic "ä¾åºå" [ref=f1e436]: "* ä¾åºå" |
| | | - generic [ref=f1e441]: |
| | | - combobox [ref=f1e443] |
| | | - generic "0" [ref=f1e444] |
| | | - generic [ref=f1e447]: |
| | | - generic "ææ " [ref=f1e449]: "* ææ " |
| | | - generic [ref=f1e454]: |
| | | - combobox [ref=f1e456] |
| | | - generic "0" [ref=f1e457] |
| | | - generic [ref=f1e459]: |
| | | - generic "宿 éé¢" [ref=f1e461]: "* 宿 éé¢" |
| | | - generic [ref=f1e466]: |
| | | - generic [ref=f1e467]: |
| | | - generic [ref=f1e468]: |
| | | - button "Increase Value" [ref=f1e469] [cursor=pointer]: |
| | | - img "up" [ref=f1e470] |
| | | - button "Decrease Value" [ref=f1e473] [cursor=pointer]: |
| | | - img "down" [ref=f1e474] |
| | | - spinbutton "宿 éé¢" [ref=f1e478] |
| | | - generic [ref=f1e479]: å
|
| | | - generic [ref=f1e481]: |
| | | - generic "夿³¨" [ref=f1e483] |
| | | - textbox "å¦ï¼ç»¼åè¯æ 第ä¸å" [ref=f1e487] |
| | | - generic [ref=f1e488]: |
| | | - button "å æ¶" [ref=f1e489] [cursor=pointer] |
| | | - button "ç¡® å®" [ref=f1e491] [cursor=pointer] |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | - generic [ref=f1e4]: |
| | | - generic [ref=f1e7]: |
| | | - complementary [ref=f1e8]: |
| | | - generic [ref=f1e9]: |
| | | - link "工忰ååMOMç³»ç» å·¥åæ°ååMOMç³»ç»" [ref=f1e15] [cursor=pointer]: |
| | | - /url: javascript:void 0 |
| | | - img "工忰ååMOMç³»ç»" [ref=f1e18] |
| | | - generic [ref=f1e19]: 工忰ååMOMç³»ç» |
| | | - menu [ref=f1e22]: |
| | | - listitem [ref=f1e23]: |
| | | - generic [ref=f1e24] [cursor=pointer]: æ¦è§ |
| | | - listitem [ref=f1e34]: |
| | | - generic [ref=f1e35] [cursor=pointer]: åºç¡æ°æ® |
| | | - listitem [ref=f1e43]: |
| | | - generic [ref=f1e44] [cursor=pointer]: éè´ç®¡ç |
| | | - listitem [ref=f1e50]: |
| | | - generic [ref=f1e51] [cursor=pointer]: è¥é管ç |
| | | - listitem [ref=f1e57]: |
| | | - generic [ref=f1e58] [cursor=pointer]: 设å¤ç®¡ç |
| | | - listitem [ref=f1e65]: |
| | | - generic [ref=f1e66] [cursor=pointer]: ä»å¨ç©æµ |
| | | - listitem [ref=f1e74]: |
| | | - generic [ref=f1e75] [cursor=pointer]: çäº§ç®¡æ§ |
| | | - listitem [ref=f1e82]: |
| | | - generic [ref=f1e83] [cursor=pointer]: è´¨é管ç |
| | | - listitem [ref=f1e89]: |
| | | - generic [ref=f1e90] [cursor=pointer]: åååå
¬ |
| | | - listitem [ref=f1e96]: |
| | | - generic [ref=f1e97] [cursor=pointer]: 人åèµæº |
| | | - listitem [ref=f1e103]: |
| | | - generic [ref=f1e104] [cursor=pointer]: åºç¡è®¾æ½ |
| | | - listitem [ref=f1e110]: |
| | | - generic [ref=f1e111] [cursor=pointer]: ç³»ç»ç®¡ç |
| | | - listitem [ref=f1e117]: |
| | | - generic [ref=f1e118] [cursor=pointer]: IM 峿¶é讯 |
| | | - generic [ref=f1e131]: |
| | | - generic [ref=f1e132]: |
| | | - banner [ref=f1e133]: |
| | | - button [ref=f1e134] [cursor=pointer] |
| | | - button [ref=f1e137] [cursor=pointer] |
| | | - navigation "breadcrumb" [ref=f1e142]: |
| | | - list [ref=f1e143]: |
| | | - listitem [ref=f1e144]: |
| | | - link [ref=f1e145] [cursor=pointer]: |
| | | - /url: javascript:void 0 |
| | | - listitem [ref=f1e152] |
| | | - listitem [ref=f1e155]: |
| | | - link "ææ è¯¦æ
" [disabled] [ref=f1e156] |
| | | - generic [ref=f1e159]: |
| | | - generic [ref=f1e161] [cursor=pointer]: |
| | | - generic [ref=f1e165]: æç´¢ |
| | | - generic [ref=f1e166]: Ctrl K |
| | | - button [ref=f1e168] [cursor=pointer] |
| | | - button "dark" [ref=f1e173] [cursor=pointer] |
| | | - button [ref=f1e182] [cursor=pointer] |
| | | - button [ref=f1e188] [cursor=pointer] |
| | | - button [ref=f1e191] [cursor=pointer] |
| | | - button [ref=f1e197] [cursor=pointer]: |
| | | - button [ref=f1e199] |
| | | - button "å·¥ä½å°" [ref=f1e203] [cursor=pointer] |
| | | - button "æºç " [ref=f1e207] [cursor=pointer] |
| | | - generic [ref=f1e214]: |
| | | - generic [ref=f1e219]: |
| | | - generic [ref=f1e220] [cursor=pointer]: åæé¡µ |
| | | - generic [ref=f1e238] [cursor=pointer]: ææ è¯¦æ
|
| | | - button [ref=f1e254] [cursor=pointer] |
| | | - main [ref=f1e272]: |
| | | - generic [ref=f1e275]: |
| | | - generic [ref=f1e276]: |
| | | - button [ref=f1e277] [cursor=pointer] |
| | | - generic [ref=f1e280]: æµè¯é¡¹ç® |
| | | - generic [ref=f1e281]: æµè¯ç¼å· |
| | | - generic [ref=f1e282]: è¯æ ä¸ |
| | | - generic [ref=f1e283]: å
¬å¼ææ |
| | | - button "å·æ°" [ref=f1e284] [cursor=pointer] |
| | | - generic [ref=f1e290]: |
| | | - generic: |
| | | - generic "è稿" |
| | | - generic "åå¸" |
| | | - generic "ææ ä¸" |
| | | - generic "è¯æ ä¸" |
| | | - generic "已宿 " |
| | | - generic [ref=f1e291]: |
| | | - generic [ref=f1e292]: |
| | | - generic [ref=f1e293]: é¢ç®éé¢ |
| | | - generic [ref=f1e294]: 15,000 å
|
| | | - generic [ref=f1e295]: |
| | | - generic [ref=f1e296]: è´è´£äºº |
| | | - generic [ref=f1e297]: "-" |
| | | - generic [ref=f1e298]: |
| | | - generic [ref=f1e299]: éè´ç»ç» |
| | | - generic [ref=f1e300]: "-" |
| | | - generic [ref=f1e301]: |
| | | - generic [ref=f1e302]: 弿 æ¶é´ |
| | | - generic [ref=f1e303]: 2026-07-29 11:20:11 |
| | | - generic [ref=f1e304]: |
| | | - generic [ref=f1e305]: å¼å§æ¶é´ |
| | | - generic [ref=f1e306]: 2026-07-29 11:13:02 |
| | | - generic [ref=f1e307]: |
| | | - generic [ref=f1e308]: æªæ¢æ¶é´ |
| | | - generic [ref=f1e309]: 2026-07-29 19:13:06 |
| | | - generic [ref=f1e313]: |
| | | - tablist [ref=f1e314]: |
| | | - generic [ref=f1e316]: |
| | | - tab [ref=f1e318] [cursor=pointer] |
| | | - tab [ref=f1e323] [cursor=pointer] |
| | | - tab [ref=f1e328] [cursor=pointer] |
| | | - tab [ref=f1e333] [cursor=pointer] |
| | | - tab [ref=f1e338] [cursor=pointer] |
| | | - tab [selected] [ref=f1e343] [cursor=pointer] |
| | | - tabpanel "宿 " [ref=f1e404]: |
| | | - generic [ref=f1e405]: |
| | | - generic "å°æªå®æ " |
| | | - button "åå»ºå®æ " [ref=f1e406] [cursor=pointer] |
| | | - dialog "åå»ºå®æ " [ref=f1e412]: |
| | | - document: |
| | | - generic [ref=f1e413]: |
| | | - button "Close" [ref=f1e414] [cursor=pointer]: |
| | | - img "close" [ref=f1e416] |
| | | - generic [ref=f1e419]: åå»ºå®æ |
| | | - generic [ref=f1e422]: |
| | | - generic [ref=f1e424]: |
| | | - generic "宿 ç¼å·" [ref=f1e426]: "* 宿 ç¼å·" |
| | | - textbox "å¦ AWARD2024010001" [ref=f1e430] |
| | | - generic [ref=f1e431]: |
| | | - generic [ref=f1e434]: |
| | | - generic "ä¾åºå" [ref=f1e436]: "* ä¾åºå" |
| | | - generic [ref=f1e441]: |
| | | - combobox [ref=f1e443] |
| | | - generic "0" [ref=f1e444] |
| | | - generic [ref=f1e447]: |
| | | - generic "ææ " [ref=f1e449]: "* ææ " |
| | | - generic [ref=f1e454]: |
| | | - combobox [ref=f1e456] |
| | | - generic "0" [ref=f1e457] |
| | | - generic [ref=f1e459]: |
| | | - generic "宿 éé¢" [ref=f1e461]: "* 宿 éé¢" |
| | | - generic [ref=f1e466]: |
| | | - generic [ref=f1e467]: |
| | | - generic [ref=f1e468]: |
| | | - button "Increase Value" [ref=f1e469] [cursor=pointer]: |
| | | - img "up" [ref=f1e470] |
| | | - button "Decrease Value" [ref=f1e473] [cursor=pointer]: |
| | | - img "down" [ref=f1e474] |
| | | - spinbutton "宿 éé¢" [ref=f1e478] |
| | | - generic [ref=f1e479]: å
|
| | | - generic [ref=f1e481]: |
| | | - generic "夿³¨" [ref=f1e483] |
| | | - textbox "å¦ï¼ç»¼åè¯æ 第ä¸å" [ref=f1e487] |
| | | - generic [ref=f1e488]: |
| | | - button "å æ¶" [ref=f1e489] [cursor=pointer] |
| | | - button "ç¡® å®" [ref=f1e491] [cursor=pointer] |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | - generic [active]: 工忰ååMOMç³»ç» |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | - generic [ref=f2e7]: |
| | | - complementary [ref=f2e8]: |
| | | - generic [ref=f2e9]: |
| | | - link "工忰ååMOMç³»ç» å·¥åæ°ååMOMç³»ç»" [ref=f2e15] [cursor=pointer]: |
| | | - /url: javascript:void 0 |
| | | - img "工忰ååMOMç³»ç»" [ref=f2e18] |
| | | - generic [ref=f2e19]: 工忰ååMOMç³»ç» |
| | | - menu [ref=f2e22]: |
| | | - listitem [ref=f2e23]: |
| | | - generic [ref=f2e24] [cursor=pointer]: æ¦è§ |
| | | - listitem [ref=f2e34]: |
| | | - generic [ref=f2e35] [cursor=pointer]: åºç¡æ°æ® |
| | | - listitem [ref=f2e43]: |
| | | - generic [ref=f2e44] [cursor=pointer]: éè´ç®¡ç |
| | | - listitem [ref=f2e50]: |
| | | - generic [ref=f2e51] [cursor=pointer]: è¥é管ç |
| | | - listitem [ref=f2e57]: |
| | | - generic [ref=f2e58] [cursor=pointer]: 设å¤ç®¡ç |
| | | - listitem [ref=f2e65]: |
| | | - generic [ref=f2e66] [cursor=pointer]: ä»å¨ç©æµ |
| | | - listitem [ref=f2e74]: |
| | | - generic [ref=f2e75] [cursor=pointer]: çäº§ç®¡æ§ |
| | | - listitem [ref=f2e82]: |
| | | - generic [ref=f2e83] [cursor=pointer]: è´¨é管ç |
| | | - listitem [ref=f2e89]: |
| | | - generic [ref=f2e90] [cursor=pointer]: åååå
¬ |
| | | - listitem [ref=f2e96]: |
| | | - generic [ref=f2e97] [cursor=pointer]: 人åèµæº |
| | | - listitem [ref=f2e103]: |
| | | - generic [ref=f2e104] [cursor=pointer]: åºç¡è®¾æ½ |
| | | - listitem [ref=f2e110]: |
| | | - generic [ref=f2e111] [cursor=pointer]: ç³»ç»ç®¡ç |
| | | - listitem [ref=f2e117]: |
| | | - generic [ref=f2e118] [cursor=pointer]: IM 峿¶é讯 |
| | | - generic [ref=f2e131]: |
| | | - generic [ref=f2e132]: |
| | | - banner [ref=f2e133]: |
| | | - button [ref=f2e134] [cursor=pointer] |
| | | - button [ref=f2e137] [cursor=pointer] |
| | | - navigation "breadcrumb" [ref=f2e142]: |
| | | - list [ref=f2e143]: |
| | | - listitem [ref=f2e144]: |
| | | - link [ref=f2e145] [cursor=pointer]: |
| | | - /url: javascript:void 0 |
| | | - listitem [ref=f2e152] |
| | | - listitem [ref=f2e155]: |
| | | - link "ææ è¯¦æ
" [disabled] [ref=f2e156] |
| | | - generic [ref=f2e159]: |
| | | - generic [ref=f2e161] [cursor=pointer]: |
| | | - generic [ref=f2e165]: æç´¢ |
| | | - generic [ref=f2e166]: Ctrl K |
| | | - button [ref=f2e168] [cursor=pointer] |
| | | - button "dark" [ref=f2e173] [cursor=pointer] |
| | | - button [ref=f2e182] [cursor=pointer] |
| | | - button [ref=f2e188] [cursor=pointer] |
| | | - button [ref=f2e191] [cursor=pointer] |
| | | - button [ref=f2e197] [cursor=pointer]: |
| | | - button [ref=f2e199] |
| | | - button "å·¥ä½å°" [ref=f2e203] [cursor=pointer] |
| | | - button "æºç " [ref=f2e207] [cursor=pointer] |
| | | - generic [ref=f2e214]: |
| | | - generic [ref=f2e219]: |
| | | - generic [ref=f2e220] [cursor=pointer]: åæé¡µ |
| | | - generic [ref=f2e238] [cursor=pointer]: ææ è¯¦æ
|
| | | - button [ref=f2e254] [cursor=pointer] |
| | | - main [ref=f2e272]: |
| | | - generic [ref=f2e275]: |
| | | - generic [ref=f2e276]: |
| | | - button [ref=f2e277] [cursor=pointer] |
| | | - generic [ref=f2e280]: æµè¯é¡¹ç® |
| | | - generic [ref=f2e281]: æµè¯ç¼å· |
| | | - generic [ref=f2e282]: 已宿 |
| | | - generic [ref=f2e283]: å
¬å¼ææ |
| | | - button "å·æ°" [ref=f2e284] [cursor=pointer] |
| | | - generic [ref=f2e290]: |
| | | - generic: |
| | | - generic "è稿" |
| | | - generic "åå¸" |
| | | - generic "ææ ä¸" |
| | | - generic "è¯æ ä¸" |
| | | - generic "已宿 " |
| | | - generic [ref=f2e291]: |
| | | - generic [ref=f2e292]: |
| | | - generic [ref=f2e293]: é¢ç®éé¢ |
| | | - generic [ref=f2e294]: 15,000 å
|
| | | - generic [ref=f2e295]: |
| | | - generic [ref=f2e296]: è´è´£äºº |
| | | - generic [ref=f2e297]: "-" |
| | | - generic [ref=f2e298]: |
| | | - generic [ref=f2e299]: éè´ç»ç» |
| | | - generic [ref=f2e300]: "-" |
| | | - generic [ref=f2e301]: |
| | | - generic [ref=f2e302]: 弿 æ¶é´ |
| | | - generic [ref=f2e303]: 2026-07-29 11:20:11 |
| | | - generic [ref=f2e304]: |
| | | - generic [ref=f2e305]: å¼å§æ¶é´ |
| | | - generic [ref=f2e306]: 2026-07-29 11:13:02 |
| | | - generic [ref=f2e307]: |
| | | - generic [ref=f2e308]: æªæ¢æ¶é´ |
| | | - generic [ref=f2e309]: 2026-07-29 19:13:06 |
| | | - generic [ref=f2e313]: |
| | | - tablist [ref=f2e314]: |
| | | - generic [ref=f2e316]: |
| | | - tab [ref=f2e318] [cursor=pointer] |
| | | - tab [ref=f2e323] [cursor=pointer] |
| | | - tab [ref=f2e328] [cursor=pointer] |
| | | - tab [ref=f2e333] [cursor=pointer] |
| | | - tab [ref=f2e338] [cursor=pointer] |
| | | - tab [active] [selected] [ref=f2e343] [cursor=pointer] |
| | | - tabpanel "宿 " [ref=f2e350]: |
| | | - generic [ref=f2e351]: |
| | | - generic [ref=f2e353]: |
| | | - generic [ref=f2e354]: å·²å®è¡¨ |
| | | - generic [ref=f2e355]: "12" |
| | | - generic [ref=f2e357]: 10,000 å
|
| | | - text: 2026-07-29 14:52:43 |
| | | - generic [ref=f2e358]: 已宿 |
| | | - text: å¾
çæç»¼åè¯å® |
| | | - generic [ref=f2e361]: |
| | | - generic "宿 宿" |
| | | - button "çæéè´è®¢å" [ref=f2e362] [cursor=pointer] |
| | | - button "å é¤å®æ " [ref=f2e366] [cursor=pointer] |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | - generic [active]: 工忰ååMOMç³»ç» |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | - generic [ref=f3e7]: |
| | | - complementary [ref=f3e8]: |
| | | - generic [ref=f3e9]: |
| | | - link "工忰ååMOMç³»ç» å·¥åæ°ååMOMç³»ç»" [ref=f3e15] [cursor=pointer]: |
| | | - /url: javascript:void 0 |
| | | - img "工忰ååMOMç³»ç»" [ref=f3e18] |
| | | - generic [ref=f3e19]: 工忰ååMOMç³»ç» |
| | | - menu [ref=f3e22]: |
| | | - listitem [ref=f3e23]: |
| | | - generic [ref=f3e24] [cursor=pointer]: æ¦è§ |
| | | - listitem [ref=f3e34]: |
| | | - generic [ref=f3e35] [cursor=pointer]: åºç¡æ°æ® |
| | | - listitem [ref=f3e43]: |
| | | - generic [ref=f3e44] [cursor=pointer]: éè´ç®¡ç |
| | | - listitem [ref=f3e50]: |
| | | - generic [ref=f3e51] [cursor=pointer]: è¥é管ç |
| | | - listitem [ref=f3e57]: |
| | | - generic [ref=f3e58] [cursor=pointer]: 设å¤ç®¡ç |
| | | - listitem [ref=f3e65]: |
| | | - generic [ref=f3e66] [cursor=pointer]: ä»å¨ç©æµ |
| | | - listitem [ref=f3e74]: |
| | | - generic [ref=f3e75] [cursor=pointer]: çäº§ç®¡æ§ |
| | | - listitem [ref=f3e82]: |
| | | - generic [ref=f3e83] [cursor=pointer]: è´¨é管ç |
| | | - listitem [ref=f3e89]: |
| | | - generic [ref=f3e90] [cursor=pointer]: åååå
¬ |
| | | - listitem [ref=f3e96]: |
| | | - generic [ref=f3e97] [cursor=pointer]: 人åèµæº |
| | | - listitem [ref=f3e103]: |
| | | - generic [ref=f3e104] [cursor=pointer]: åºç¡è®¾æ½ |
| | | - listitem [ref=f3e110]: |
| | | - generic [ref=f3e111] [cursor=pointer]: ç³»ç»ç®¡ç |
| | | - listitem [ref=f3e117]: |
| | | - generic [ref=f3e118] [cursor=pointer]: IM 峿¶é讯 |
| | | - generic [ref=f3e131]: |
| | | - generic [ref=f3e132]: |
| | | - banner [ref=f3e133]: |
| | | - button [ref=f3e134] [cursor=pointer] |
| | | - button [ref=f3e137] [cursor=pointer] |
| | | - navigation "breadcrumb" [ref=f3e142]: |
| | | - list [ref=f3e143]: |
| | | - listitem [ref=f3e144]: |
| | | - link [ref=f3e145] [cursor=pointer]: |
| | | - /url: javascript:void 0 |
| | | - listitem [ref=f3e152] |
| | | - listitem [ref=f3e155]: |
| | | - link "ææ è¯¦æ
" [disabled] [ref=f3e156] |
| | | - generic [ref=f3e159]: |
| | | - generic [ref=f3e161] [cursor=pointer]: |
| | | - generic [ref=f3e165]: æç´¢ |
| | | - generic [ref=f3e166]: Ctrl K |
| | | - button [ref=f3e168] [cursor=pointer] |
| | | - button "dark" [ref=f3e173] [cursor=pointer] |
| | | - button [ref=f3e182] [cursor=pointer] |
| | | - button [ref=f3e188] [cursor=pointer] |
| | | - button [ref=f3e191] [cursor=pointer] |
| | | - button [ref=f3e197] [cursor=pointer]: |
| | | - button [ref=f3e199] |
| | | - button "å·¥ä½å°" [ref=f3e203] [cursor=pointer] |
| | | - button "æºç " [ref=f3e207] [cursor=pointer] |
| | | - generic [ref=f3e214]: |
| | | - generic [ref=f3e219]: |
| | | - generic [ref=f3e220] [cursor=pointer]: åæé¡µ |
| | | - generic [ref=f3e238] [cursor=pointer]: ææ è¯¦æ
|
| | | - button [ref=f3e254] [cursor=pointer] |
| | | - main [ref=f3e272]: |
| | | - generic [ref=f3e275]: |
| | | - generic [ref=f3e276]: |
| | | - button [ref=f3e277] [cursor=pointer] |
| | | - generic [ref=f3e280]: æµè¯é¡¹ç® |
| | | - generic [ref=f3e281]: æµè¯ç¼å· |
| | | - generic [ref=f3e282]: 已宿 |
| | | - generic [ref=f3e283]: å
¬å¼ææ |
| | | - button "å·æ°" [ref=f3e284] [cursor=pointer] |
| | | - generic [ref=f3e290]: |
| | | - generic: |
| | | - generic "è稿" |
| | | - generic "åå¸" |
| | | - generic "ææ ä¸" |
| | | - generic "è¯æ ä¸" |
| | | - generic "已宿 " |
| | | - generic [ref=f3e291]: |
| | | - generic [ref=f3e292]: |
| | | - generic [ref=f3e293]: é¢ç®éé¢ |
| | | - generic [ref=f3e294]: 15,000 å
|
| | | - generic [ref=f3e295]: |
| | | - generic [ref=f3e296]: è´è´£äºº |
| | | - generic [ref=f3e297]: "-" |
| | | - generic [ref=f3e298]: |
| | | - generic [ref=f3e299]: éè´ç»ç» |
| | | - generic [ref=f3e300]: "-" |
| | | - generic [ref=f3e301]: |
| | | - generic [ref=f3e302]: 弿 æ¶é´ |
| | | - generic [ref=f3e303]: 2026-07-29 11:20:11 |
| | | - generic [ref=f3e304]: |
| | | - generic [ref=f3e305]: å¼å§æ¶é´ |
| | | - generic [ref=f3e306]: 2026-07-29 11:13:02 |
| | | - generic [ref=f3e307]: |
| | | - generic [ref=f3e308]: æªæ¢æ¶é´ |
| | | - generic [ref=f3e309]: 2026-07-29 19:13:06 |
| | | - generic [ref=f3e313]: |
| | | - tablist [ref=f3e314]: |
| | | - generic [ref=f3e316]: |
| | | - tab [ref=f3e318] [cursor=pointer] |
| | | - tab [ref=f3e323] [cursor=pointer] |
| | | - tab [ref=f3e328] [cursor=pointer] |
| | | - tab [ref=f3e333] [cursor=pointer] |
| | | - tab [ref=f3e338] [cursor=pointer] |
| | | - tab [active] [selected] [ref=f3e343] [cursor=pointer] |
| | | - tabpanel "宿 " [ref=f3e404]: |
| | | - generic [ref=f3e405]: |
| | | - generic [ref=f3e407]: |
| | | - generic [ref=f3e408]: å·²å®è¡¨ |
| | | - generic [ref=f3e409]: "12" |
| | | - generic [ref=f3e411]: 10,000 å
|
| | | - text: 2026-07-29 14:52:43 |
| | | - generic [ref=f3e412]: å·²çæè®¢å |
| | | - text: 18综åè¯å® |
| | | - generic [ref=f3e415]: |
| | | - generic "订åå·²çæ" |
| | | - button "å é¤å®æ " [ref=f3e416] [cursor=pointer] |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | - generic [active]: 工忰ååMOMç³»ç» |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | - generic [ref=f4e7]: |
| | | - complementary [ref=f4e8]: |
| | | - generic [ref=f4e9]: |
| | | - link "工忰ååMOMç³»ç» å·¥åæ°ååMOMç³»ç»" [ref=f4e15] [cursor=pointer]: |
| | | - /url: javascript:void 0 |
| | | - img "工忰ååMOMç³»ç»" [ref=f4e18] |
| | | - generic [ref=f4e19]: 工忰ååMOMç³»ç» |
| | | - menu [ref=f4e22]: |
| | | - listitem [ref=f4e23]: |
| | | - generic [ref=f4e24] [cursor=pointer]: æ¦è§ |
| | | - listitem [ref=f4e34]: |
| | | - generic [ref=f4e35] [cursor=pointer]: åºç¡æ°æ® |
| | | - listitem [ref=f4e43]: |
| | | - generic [ref=f4e44] [cursor=pointer]: éè´ç®¡ç |
| | | - listitem [ref=f4e50]: |
| | | - generic [ref=f4e51] [cursor=pointer]: è¥é管ç |
| | | - listitem [ref=f4e57]: |
| | | - generic [ref=f4e58] [cursor=pointer]: 设å¤ç®¡ç |
| | | - listitem [ref=f4e65]: |
| | | - generic [ref=f4e66] [cursor=pointer]: ä»å¨ç©æµ |
| | | - listitem [ref=f4e74]: |
| | | - generic [ref=f4e75] [cursor=pointer]: çäº§ç®¡æ§ |
| | | - listitem [ref=f4e82]: |
| | | - generic [ref=f4e83] [cursor=pointer]: è´¨é管ç |
| | | - listitem [ref=f4e89]: |
| | | - generic [ref=f4e90] [cursor=pointer]: åååå
¬ |
| | | - listitem [ref=f4e96]: |
| | | - generic [ref=f4e97] [cursor=pointer]: 人åèµæº |
| | | - listitem [ref=f4e103]: |
| | | - generic [ref=f4e104] [cursor=pointer]: åºç¡è®¾æ½ |
| | | - listitem [ref=f4e110]: |
| | | - generic [ref=f4e111] [cursor=pointer]: ç³»ç»ç®¡ç |
| | | - listitem [ref=f4e117]: |
| | | - generic [ref=f4e118] [cursor=pointer]: IM 峿¶é讯 |
| | | - generic [ref=f4e131]: |
| | | - generic [ref=f4e132]: |
| | | - banner [ref=f4e133]: |
| | | - button [ref=f4e134] [cursor=pointer] |
| | | - button [ref=f4e137] [cursor=pointer] |
| | | - navigation "breadcrumb" [ref=f4e142]: |
| | | - list [ref=f4e143]: |
| | | - listitem [ref=f4e144]: |
| | | - link [ref=f4e145] [cursor=pointer]: |
| | | - /url: javascript:void 0 |
| | | - listitem [ref=f4e152] |
| | | - listitem [ref=f4e155]: |
| | | - link "ææ è¯¦æ
" [disabled] [ref=f4e156] |
| | | - generic [ref=f4e159]: |
| | | - generic [ref=f4e161] [cursor=pointer]: |
| | | - generic [ref=f4e165]: æç´¢ |
| | | - generic [ref=f4e166]: Ctrl K |
| | | - button [ref=f4e168] [cursor=pointer] |
| | | - button "dark" [ref=f4e173] [cursor=pointer] |
| | | - button [ref=f4e182] [cursor=pointer] |
| | | - button [ref=f4e188] [cursor=pointer] |
| | | - button [ref=f4e191] [cursor=pointer] |
| | | - button [ref=f4e197] [cursor=pointer]: |
| | | - button [ref=f4e199] |
| | | - button "å·¥ä½å°" [ref=f4e203] [cursor=pointer] |
| | | - button "æºç " [ref=f4e207] [cursor=pointer] |
| | | - generic [ref=f4e214]: |
| | | - generic [ref=f4e219]: |
| | | - generic [ref=f4e220] [cursor=pointer]: åæé¡µ |
| | | - generic [ref=f4e238] [cursor=pointer]: ææ è¯¦æ
|
| | | - button [ref=f4e254] [cursor=pointer] |
| | | - main [ref=f4e272]: |
| | | - generic [ref=f4e275]: |
| | | - generic [ref=f4e276]: |
| | | - button [ref=f4e277] [cursor=pointer] |
| | | - generic [ref=f4e280]: æµè¯é¡¹ç® |
| | | - generic [ref=f4e281]: æµè¯ç¼å· |
| | | - generic [ref=f4e282]: 已宿 |
| | | - generic [ref=f4e283]: å
¬å¼ææ |
| | | - button "å·æ°" [ref=f4e284] [cursor=pointer] |
| | | - generic [ref=f4e290]: |
| | | - generic: |
| | | - generic "è稿" |
| | | - generic "åå¸" |
| | | - generic "ææ ä¸" |
| | | - generic "è¯æ ä¸" |
| | | - generic "已宿 " |
| | | - generic [ref=f4e291]: |
| | | - generic [ref=f4e292]: |
| | | - generic [ref=f4e293]: é¢ç®éé¢ |
| | | - generic [ref=f4e294]: 15,000 å
|
| | | - generic [ref=f4e295]: |
| | | - generic [ref=f4e296]: è´è´£äºº |
| | | - generic [ref=f4e297]: "-" |
| | | - generic [ref=f4e298]: |
| | | - generic [ref=f4e299]: éè´ç»ç» |
| | | - generic [ref=f4e300]: "-" |
| | | - generic [ref=f4e301]: |
| | | - generic [ref=f4e302]: 弿 æ¶é´ |
| | | - generic [ref=f4e303]: 2026-07-29 11:20:11 |
| | | - generic [ref=f4e304]: |
| | | - generic [ref=f4e305]: å¼å§æ¶é´ |
| | | - generic [ref=f4e306]: 2026-07-29 11:13:02 |
| | | - generic [ref=f4e307]: |
| | | - generic [ref=f4e308]: æªæ¢æ¶é´ |
| | | - generic [ref=f4e309]: 2026-07-29 19:13:06 |
| | | - generic [ref=f4e313]: |
| | | - tablist [ref=f4e314]: |
| | | - generic [ref=f4e316]: |
| | | - tab [ref=f4e318] [cursor=pointer] |
| | | - tab [ref=f4e323] [cursor=pointer] |
| | | - tab [ref=f4e328] [cursor=pointer] |
| | | - tab [ref=f4e333] [cursor=pointer] |
| | | - tab [ref=f4e338] [cursor=pointer] |
| | | - tab [selected] [ref=f4e343] [cursor=pointer] |
| | | - tabpanel "宿 " [active] [ref=f4e404]: |
| | | - generic [ref=f4e405]: |
| | | - generic [ref=f4e407]: |
| | | - generic [ref=f4e408]: AWARD2024070001 |
| | | - generic [ref=f4e409]: "12" |
| | | - generic [ref=f4e411]: 10,000 å
|
| | | - text: 2026-07-29 14:52:43 |
| | | - generic [ref=f4e412]: å·²çæè®¢å |
| | | - text: 18综åè¯å® |
| | | - generic [ref=f4e415]: |
| | | - generic "订åå·²çæ" |
| | | - button "å é¤å®æ " [ref=f4e416] [cursor=pointer] |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | - generic [active]: 工忰ååMOMç³»ç» |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | # æ¥çå
¨é¨å®¢æ·æé - å端èè°æ¹æ¡ |
| | | |
| | | ## æ¶åé¡µé¢ |
| | | |
| | | | é¡µé¢ | è·¯ç±è·¯å¾ | 说æ | |
| | | |------|----------|------| |
| | | | 客æ·ç®¡çå表 | `/crm/customer` | 客æ·åè¡¨é¡µï¼æ°å¢"å
¨é¨"Tab | |
| | | |
| | | --- |
| | | |
| | | ## API |
| | | |
| | | ### å·²ææ¥å£ï¼å®¢æ·å页æ¥è¯¢ï¼æ 鿰墿¥å£ï¼ |
| | | |
| | | | æ¹æ³ | è·¯å¾ | 说æ | |
| | | |------|------|------| |
| | | | GET | `/crm/customer/page` | 客æ·å页æ¥è¯¢ | |
| | | |
| | | **å·²æè¯·æ±åæ°ï¼`CrmCustomerPageReqVO`ï¼ï¼** |
| | | |
| | | | åæ° | ç±»å | å¿
å¡« | 说æ | |
| | | |------|------|------|------| |
| | | | sceneType | Integer | å¦ | åºæ¯ç±»åï¼1-æè´è´£ç / 2-æåä¸ç / 3-ä¸å±è´è´£ç / **4-å
¨é¨ï¼æ°å¢ï¼** | |
| | | | name | String | å¦ | 客æ·åç§°ï¼æ¨¡ç³ï¼ | |
| | | | mobile | String | å¦ | ææº | |
| | | | industryId | Integer | å¦ | æå±è¡ä¸ | |
| | | | level | Integer | å¦ | 客æ·ç级 | |
| | | | source | Integer | å¦ | å®¢æ·æ¥æº | |
| | | | pool | Boolean | å¦ | æ¯å¦ä¸ºå
¬æµ·æ°æ® | |
| | | | followUpStatus | Boolean | å¦ | è·è¿ç¶æ | |
| | | |
| | | **ååºæ åå**ï¼`CrmCustomerRespVO` å·²å
å«ï¼ |
| | | - `ownerUserName` â éå®äººååç§° |
| | | - `ownerUserDeptName` â éå®äººåé¨é¨åç§° |
| | | |
| | | --- |
| | | |
| | | ## ä¸å¡è§å说æ |
| | | |
| | | ### åºæ¯ç±»åæ©å± |
| | | |
| | | | sceneType å¼ | åºæ¯åç§° | æ°æ®èå´ | æéè¦æ± | |
| | | |--------------|----------|----------|----------| |
| | | | 1 | æè´è´£ç | `owner_user_id = å½åç¨æ·` | `crm:customer:query` | |
| | | | 2 | æåä¸ç | å¢éæåï¼éè´è´£äººï¼ | `crm:customer:query` | |
| | | | 3 | ä¸å±è´è´£ç | ä¸å±ä¸ºè´è´£äºº | `crm:customer:query` | |
| | | | **4ï¼æ°å¢ï¼** | **å
¨é¨** | **ææå®¢æ·ï¼æ è¿æ»¤ï¼** | **`crm:customer:view-all` æ `crm_admin` è§è²** | |
| | | |
| | | ### æéé级è§å |
| | | |
| | | å½ç¨æ·ä»¥ `sceneType=4` è¯·æ±æ°æ®æ¶ï¼ |
| | | - ç¨æ·æ¥æ `crm:customer:view-all` æé **æ** `crm_admin` è§è² â è¿åå
¨é¨å®¢æ· |
| | | - ç¨æ·**没æ**该æé â èªå¨é级为"æè´è´£ç"ï¼`sceneType=1`ï¼ï¼ä»
è¿åèªå·±çå®¢æ· |
| | | |
| | | ### æéæ è¯ |
| | | |
| | | | æéæ è¯ | 说æ | æå±èå | |
| | | |----------|------|----------| |
| | | | `crm:customer:view-all` | æ¥çå
¨é¨å®¢æ· | CRM 客æ·å
¬æµ· | |
| | | |
| | | 该æé已添å å°æ°æ®åº `system_menu` 表ï¼ä½äºã客æ·å
¬æµ·ãèåä¸ï¼id=602583ï¼ï¼è§è²åé
åå³å¯çæã |
| | | |
| | | --- |
| | | |
| | | ## å端修æ¹ç¹ |
| | | |
| | | ### 1. 客æ·å表页 Tab 忢 |
| | | |
| | | å¨ç°æçåºæ¯ç±»å Tabï¼æè´è´£ç/æåä¸ç/ä¸å±è´è´£çï¼åé¢ï¼æ°å¢"å
¨é¨"Tabï¼`sceneType=4`ï¼ã |
| | | |
| | | **å±ç¤ºè§å**ï¼ |
| | | - ä»
å½ç¨æ·æ¥æ `crm:customer:view-all` æéæ `crm_admin` è§è²æ¶ï¼ææ¾ç¤º"å
¨é¨"Tab |
| | | - 夿æ¹å¼ï¼è°ç¨æé夿æ¥å£æä»ç¨æ·æéåè¡¨ä¸æ£æ¥ |
| | | |
| | | ### 2. æé夿 |
| | | |
| | | å端éè¦å¤æå½åç¨æ·æ¯å¦æ `crm:customer:view-all` æéï¼ |
| | | - æ¹å¼ä¸ï¼éè¿ Vue æä»¤ `v-hasPermi="['crm:customer:view-all']"` æ§å¶ Tab æ¾é |
| | | - æ¹å¼äºï¼éè¿è·åç¨æ·æéåè¡¨å¤æ |
| | | |
| | | --- |
| | | |
| | | ## 注æäºé¡¹ |
| | | |
| | | - "å
¨é¨"Tab ä»
æ§å¶æ°æ®å¯è§èå´ï¼ä¸æ¹åå
¶ä»åè½æéï¼å¦ç¼è¾ãå é¤ä»éå¯¹åºæéï¼ |
| | | - å¯¼åº Excel æ¶åæ ·æ¯æ `sceneType=4`ï¼æ¥ææéçç¨æ·å¯å¯¼åºå
¨é¨å®¢æ·æ°æ® |
| | | - æéæ°æ®å·²æå
¥æ°æ®åºï¼`system_menu` id=602583ï¼ï¼æ éå端é¢å¤å¤çæé注å |
| | | - 该æéä¸ `crm_admin` è§è²çåºå«ï¼`crm_admin` æ¥æææ CRM 管çæéï¼è `view-all` ä»
æ§å¶å®¢æ·åè¡¨çæ¥çèå´ |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | # 项ç®è¯¦æ
- èµæå®¡æ ¸æ¥è¯¢ä¿®å¤ï¼å端èè°æ¹æ¡ï¼ |
| | | |
| | | ## é®é¢ |
| | | |
| | | 项ç®è¯¦æ
页"èµæå®¡æ ¸" Tab æ¥è¯¢ `/mes/pd/document-audit/page` æ¶æªä¼ å
¥ `projectId`ï¼å¯¼è´è¿åäºææé¡¹ç®çå®¡æ ¸è®°å½ï¼èéå½å项ç®çã |
| | | |
| | | ## æ¶åé¡µé¢ |
| | | |
| | | | é¡µé¢ | è·¯ç± | 说æ | |
| | | |------|------|------| |
| | | | 项ç®è¯¦æ
- èµæå®¡æ ¸ Tab | `/mes/pd/project/detail/{id}` | å¾
ä¿®å¤ | |
| | | |
| | | --- |
| | | |
| | | ## API åæ´ |
| | | |
| | | `GET /mes/pd/document-audit/page` â æ°å¢è¯·æ±åæ°ï¼ |
| | | |
| | | | åæ° | ç±»å | å¿
å¡« | 说æ | |
| | | |------|------|------|------| |
| | | | projectId | Long | å¦ | é¡¹ç® IDï¼ä¼ å
¥åä»
è¿å该项ç®ä¸èµæçå®¡æ ¸è®°å½ | |
| | | |
| | | **ååºç»æä¸åã** |
| | | |
| | | --- |
| | | |
| | | ## å端修æ¹ç¹ |
| | | |
| | | **æä»¶**: `src/views/mes/pd/project/modules/document-audit-list.vue` |
| | | |
| | | 该ç»ä»¶å·²éè¿ `props.projectId` æ¥æ¶äºé¡¹ç® IDï¼ä½æªä¼ ç»æ¥å£ãå¨ `proxyConfig.ajax.query` ä¸å ä¸å³å¯ï¼ |
| | | |
| | | ```typescript |
| | | // 第 62-67 è¡ï¼åæ¥çï¼ |
| | | query: async ({ page }, formValues) => { |
| | | return await getPdDocumentAuditPage({ |
| | | pageNo: page.currentPage, |
| | | pageSize: page.pageSize, |
| | | ...formValues, |
| | | }); |
| | | }, |
| | | |
| | | // æ¹ä¸ºï¼ |
| | | query: async ({ page }, formValues) => { |
| | | return await getPdDocumentAuditPage({ |
| | | pageNo: page.currentPage, |
| | | pageSize: page.pageSize, |
| | | projectId: props.projectId, |
| | | ...formValues, |
| | | }); |
| | | }, |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ## 注æäºé¡¹ |
| | | |
| | | - 该ç»ä»¶å¨é¡¹ç®ç¶æä¸º `PENDING_AUDIT`ï¼å¾
å®¡æ ¸ï¼æ¶å±ç¤ºï¼éè¿ props æ¥æ¶ `projectId` |
| | | - æ¹å¨ä»
éä¸è¡ï¼æ éä¿®æ¹ API å°è£
彿°æç±»åå®ä¹ |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | # 设å¤å°è´¦æ°å¢å段 - å端èè°æ¹æ¡ |
| | | |
| | | ## æ¶åé¡µé¢ |
| | | |
| | | | é¡µé¢ | è·¯ç±è·¯å¾ | 说æ | |
| | | |------|----------|------| |
| | | | 设å¤å°è´¦å表 | `/mes/dv-machinery` | å表æ°å¢ç鿡件ãè¡¨æ ¼å | |
| | | | 设å¤å°è´¦è¡¨å | `/mes/dv-machinery` (å¼¹çª) | æ°å¢/ç¼è¾è¡¨åä¸å¢å 3 ä¸ªåæ®µ | |
| | | | 设å¤å°è´¦å¯¼å
¥ | åä¸ï¼å¯¼å
¥å¼¹çªï¼ | Excel æ¨¡æ¿æ°å¢ 3 å | |
| | | |
| | | --- |
| | | |
| | | ## æ°å¢å段说æ |
| | | |
| | | | åæ®µ | ç±»å | å¿
å¡« | 说æ | |
| | | |------|------|------|------| |
| | | | `productionEfficiency` | BigDecimal | å¦ | ç产æçï¼åä½ï¼æ¯å°æ¶ç产æ°éï¼ç¨äºä¸æäº§èªå¨è®¡ç®ç产æ¶é´ | |
| | | | `conveyorBelt` | Integer | å¦ | ä¼ é履带æ°éï¼ä¾ï¼2 代表ååæç | |
| | | | `workstationId` | Long | å¦ | å·¥ä½ç«ç¼å·ï¼ç¨äºå°è®¾å¤ç»å®å°æå®å·¥ä½ç« | |
| | | |
| | | --- |
| | | |
| | | ## API |
| | | |
| | | ### å·²ææ¥å£ï¼æ éæ°å¢ï¼ |
| | | |
| | | | æ¹æ³ | è·¯å¾ | 说æ | |
| | | |------|------|------| |
| | | | POST | `/mes/dv/machinery/create` | åå»ºè®¾å¤ | |
| | | | PUT | `/mes/dv/machinery/update` | æ´æ°è®¾å¤ | |
| | | | GET | `/mes/dv/machinery/get?id={id}` | è·å详æ
| |
| | | | GET | `/mes/dv/machinery/page` | å页æ¥è¯¢ | |
| | | | GET | `/mes/dv/machinery/simple-list` | ç²¾ç®å表ï¼ä¸æéé¡¹ï¼ | |
| | | | POST | `/mes/dv/machinery/import` | 导å
¥è®¾å¤ | |
| | | | GET | `/mes/dv/machinery/get-import-template` | ä¸è½½å¯¼å
¥æ¨¡æ¿ | |
| | | |
| | | ### 请æ±åæ° - å建/æ´æ°ï¼`MesDvMachinerySaveReqVO`ï¼ |
| | | |
| | | **æ°å¢å段ï¼** |
| | | |
| | | | åæ®µ | ç±»å | å¿
å¡« | 说æ | |
| | | |------|------|------|------| |
| | | | productionEfficiency | BigDecimal | å¦ | ç产æçï¼æ¯åéï¼ | |
| | | | conveyorBelt | Integer | å¦ | ä¼ é履带æ°é | |
| | | | workstationId | Long | å¦ | å·¥ä½ç«ç¼å· | |
| | | |
| | | ### å页æ¥è¯¢åæ°ï¼`MesDvMachineryPageReqVO`ï¼ |
| | | |
| | | **æ°å¢çéåæ®µï¼** |
| | | |
| | | | åæ®µ | ç±»å | å¿
å¡« | 说æ | |
| | | |------|------|------|------| |
| | | | workstationId | Long | å¦ | æå·¥ä½ç«çé | |
| | | |
| | | ### ååºï¼`MesDvMachineryRespVO`ï¼ |
| | | |
| | | **æ°å¢å段ï¼** |
| | | |
| | | | åæ®µ | ç±»å | 说æ | |
| | | |------|------|------| |
| | | | productionEfficiency | BigDecimal | ç产æç | |
| | | | conveyorBelt | Integer | ä¼ é履带 | |
| | | | workstationId | Long | å·¥ä½ç«ç¼å· | |
| | | | workstationName | String | å·¥ä½ç«åç§° | |
| | | |
| | | **ååºç¤ºä¾ï¼** |
| | | |
| | | ```json |
| | | { |
| | | "code": 0, |
| | | "data": { |
| | | "id": 1, |
| | | "name": "CNC å å·¥ä¸å¿", |
| | | "code": "EQ-001", |
| | | "productionEfficiency": 10.5, |
| | | "conveyorBelt": 2, |
| | | "workstationId": 300, |
| | | "workstationName": "ä¸å·å·¥ä½ç«", |
| | | ... |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ## å端修æ¹ç¹ |
| | | |
| | | ### 1. å表页 - çé项 |
| | | |
| | | å¨å表æç´¢æ æ°å¢"å·¥ä½ç«"䏿çéæ¡ï¼è°ç¨ `/mes/md-workstation/simple-list` è·åé项ã |
| | | |
| | | ### 2. å表页 - è¡¨æ ¼å |
| | | |
| | | | æ°å¢å | ç»å®å段 | 说æ | |
| | | |--------|----------|------| |
| | | | ç产æç | `productionEfficiency` | æ¾ç¤ºæ°å¼ | |
| | | | ä¼ é履带 | `conveyorBelt` | æ¾ç¤ºæ°å¼ | |
| | | | å·¥ä½ç« | `workstationName` | æ¾ç¤ºå·¥ä½ç«åç§° | |
| | | |
| | | ### 3. 表å页 - æ°å¢/ç¼è¾ |
| | | |
| | | å¨è¡¨å䏿°å¢ 3 ä¸ªåæ®µï¼ |
| | | |
| | | | åæ®µ | ç»ä»¶ | 说æ | |
| | | |------|------|------| |
| | | | ç产æç | `<el-input-number>` | æ¯æå°æ°ï¼åä½æç¤º"æ¯å°æ¶" | |
| | | | ä¼ é履带 | `<el-input-number>` | æ£æ´æ°ï¼æç¤º"2=ååæç" | |
| | | | å·¥ä½ç« | `<el-select>` | 䏿鿩ï¼è°ç¨å·¥ä½ç«ç²¾ç®å表æ¥å£ | |
| | | |
| | | ### 4. 导å
¥æ¨¡æ¿ |
| | | |
| | | 导å
¥ Excel æ¨¡æ¿æ°å¢ 3 åï¼å¯éåï¼ï¼ |
| | | |
| | | | åå | 说æ | |
| | | |------|------| |
| | | | ç产æç(æ¯å°æ¶) | æ°åï¼å¯é | |
| | | | ä¼ é履带 | æ´æ°ï¼å¯é | |
| | | | å·¥ä½ç«ç¼ç | å·¥ä½ç«ç¼ç ï¼å¯éï¼å¡«äºåæ ¡éªæ¯å¦åå¨ | |
| | | |
| | | --- |
| | | |
| | | ## ä¸å¡è§å说æ |
| | | |
| | | | è§å | 说æ | |
| | | |------|------| |
| | | | ç产æçåä½ | åºå®ä¸º"æ¯å°æ¶ç产æ°é"ï¼åç«¯ç´æ¥å±ç¤º"æ¯å°æ¶" | |
| | | | ä¼ é履带å«ä¹ | æ°å¼ 2 代表ååæçï¼æäº§æ¶ `conveyorBelt à productionEfficiency` å¾å°æç»äº§è½ | |
| | | | å·¥ä½ç«ç»å® | ä¸å°è®¾å¤å¯ç»å®ä¸ä¸ªå·¥ä½ç«ï¼é强å¶ï¼ï¼ä¸ææ°æ®æºä¸º `/mes/md-workstation/simple-list` | |
| | | | 导å
¥æ¶å·¥ä½ç« | å¡«å
¥å·¥ä½ç«ç¼ç ï¼é IDï¼ï¼ç³»ç»èªå¨è½¬æ¢ï¼ç¼ç ä¸åå¨å导å
¥å¤±è´¥ | |
| | | |
| | | --- |
| | | |
| | | ## 注æäºé¡¹ |
| | | |
| | | - 3 个æ°å段å为å¯éï¼ä¸å½±åç°ææ°æ® |
| | | - ç产æçè¾å
¥å»ºè®®éå¶æå°å¼ 0ï¼ä¿ç 2 ä½å°æ° |
| | | - ä¼ é履带ä»
å
è®¸æ£æ´æ° |
| | | - å·¥ä½ç«ä¸æä½¿ç¨å·²ææ¥å£ `/mes/md-workstation/simple-list`ï¼æ éæ°å¢ |
| | | - Excel 导å
¥æ¶å·¥ä½ç«åå¡«ç¼ç èé ID |
| | | - 导å
¥æ¨¡æ¿å端æ¥å£ `/mes/dv/machinery/get-import-template` ä¹ä¼è¿åæ°å |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | # ç产æµç¨ - æ¥ç产åè®¾è®¡å½æ¡£åéä»¶ï¼å端èè°æ¹æ¡ï¼ |
| | | |
| | | ## æ¶åé¡µé¢ |
| | | |
| | | | é¡µé¢ | è·¯ç±è·¯å¾ | 说æ | |
| | | |------|----------|------| |
| | | | ç产工åå表/详æ
| `/mes/pro-workorder` | æ°å¢"æ¥ç彿¡£"æé® | |
| | | | ç产工åä¸å¿ | `/mes/workorder-center` | æ°å¢"æ¥ç彿¡£"æé® | |
| | | | ç产任å¡å表/详æ
| `/mes/pro-task` | æ°å¢"æ¥ç彿¡£"æé® | |
| | | | å¾
æ¥å·¥å°è´¦ | `/mes/pro-task` (pending-feedback) | æ°å¢"æ¥ç彿¡£"æé® | |
| | | | ç产æ¥å·¥å表/详æ
| `/mes/pro-feedback` | æ°å¢"æ¥ç彿¡£"æé® | |
| | | |
| | | --- |
| | | |
| | | ## APIï¼å·²ææ¥å£ï¼æ éæ°å¢ï¼ |
| | | |
| | | ### 彿¡£å页å表 |
| | | |
| | | | æ¹æ³ | è·¯å¾ | 说æ | |
| | | |------|------|------| |
| | | | GET | `/mes/pd/archive/page` | æäº§åç¼ç çé彿¡£å表 | |
| | | |
| | | **请æ±åæ°ï¼å
³é®ï¼ï¼** |
| | | |
| | | | åæ° | ç±»å | å¿
å¡« | 说æ | |
| | | |------|------|------|------| |
| | | | productCode | String | æ¯ | 产åç¼ç ï¼ä»å½åè®°å½ç `itemCode` æ `productCode` ä¼ å
¥ | |
| | | | pageNo | Integer | å¦ | 页ç | |
| | | | pageSize | Integer | å¦ | æ¯é¡µæ¡æ° | |
| | | |
| | | ### 彿¡£è¯¦æ
ï¼å«éä»¶ï¼ |
| | | |
| | | | æ¹æ³ | è·¯å¾ | 说æ | |
| | | |------|------|------| |
| | | | GET | `/mes/pd/archive/detail-by-product` | æäº§åç¼ç è·å彿¡£è¯¦æ
åéä»¶ | |
| | | |
| | | **请æ±åæ°ï¼** |
| | | |
| | | | åæ° | ç±»å | å¿
å¡« | 说æ | |
| | | |------|------|------|------| |
| | | | productCode | String | æ¯ | 产åç¼ç | |
| | | |
| | | **ååºç»æï¼** |
| | | |
| | | ```json |
| | | { |
| | | "code": 0, |
| | | "data": [ |
| | | { |
| | | "project": { |
| | | "id": 1, |
| | | "taskCode": "PD2024001", |
| | | "taskName": "æ°äº§å设计任å¡", |
| | | "productCode": "P001", |
| | | "productName": "注å¡äº§åA", |
| | | "version": "V1.0", |
| | | "status": 4, |
| | | "chiefDesigner": 1, |
| | | "chiefDesignerNickname": "å¼ ä¸" |
| | | }, |
| | | "archives": [ |
| | | { |
| | | "id": 1, |
| | | "archiveCode": "ARC2024001", |
| | | "archiver": 1, |
| | | "archiverNickname": "çäº", |
| | | "archiveStatus": 1, |
| | | "archiveTime": "2024-01-15T10:30:00" |
| | | } |
| | | ], |
| | | "documents": [ |
| | | { |
| | | "id": 1, |
| | | "documentType": "1", |
| | | "documentName": "产å设计å¾", |
| | | "documentVersion": "V1.0", |
| | | "fileName": "design.pdf", |
| | | "attachmentList": [ |
| | | { |
| | | "id": "blob-id-xxx", |
| | | "name": "设计å¾çº¸.pdf", |
| | | "url": "/system/storage-blob/preview/xxx" |
| | | } |
| | | ], |
| | | "uploadUserId": 1, |
| | | "uploadUserNickname": "èµµå
", |
| | | "uploadTime": "2024-01-10T09:00:00" |
| | | } |
| | | ] |
| | | } |
| | | ] |
| | | } |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ## æ°æ®ä¼ é |
| | | |
| | | ç产æµç¨åç¯èçè®°å½ä¸å·²å
å«äº§åç¼ç ï¼ç´æ¥ä¼ ç»å½æ¡£æ¥å£ï¼ |
| | | |
| | | | æ¥æºé¡µé¢ | åæ®µå | ä¼ ç»å½æ¡£æ¥å£ | |
| | | |----------|--------|-------------| |
| | | | ç产工å | `productCode` | `?productCode={productCode}` | |
| | | | çäº§ä»»å¡ | `itemCode` | `?productCode={itemCode}` | |
| | | | ç产æ¥å·¥ | `itemCode` | `?productCode={itemCode}` | |
| | | | å¾
æ¥å·¥å°è´¦ | `itemCode` | `?productCode={itemCode}` | |
| | | |
| | | --- |
| | | |
| | | ## å端修æ¹ç¹ |
| | | |
| | | ### 1. æ¥ç彿¡£æé® |
| | | |
| | | å¨ç产工åãä»»å¡ãæ¥å·¥å表çæä½åï¼ä»¥å详æ
é¡µï¼æ°å¢"è®¾è®¡å½æ¡£"æé®ã |
| | | |
| | | ç¹å»åå¼¹åºæ½å±æå¼¹çªï¼è°ç¨ `/mes/pd/archive/detail-by-product?productCode={code}` è·å彿¡£è¯¦æ
ã |
| | | |
| | | ### 2. å¼¹çªå
容å±ç¤º |
| | | |
| | | 以 Tab æååºå±ç¤ºä¸é¨åå
å®¹ï¼ |
| | | |
| | | | åºå | å
容 | æ°æ®æ¥æº | |
| | | |------|------|----------| |
| | | | 项ç®ä¿¡æ¯ | ä»»å¡ç¼ç ãä»»å¡åç§°ã产åç¼ç /åç§°ãçæ¬ã主设计å¸ãç¶æ | `response[].project` | |
| | | | 彿¡£è®°å½ | è¡¨æ ¼ï¼å½æ¡£ç¼å·ã彿¡£äººã彿¡£ç¶æã彿¡£æ¶é´ | `response[].archives` | |
| | | | è®¾è®¡èµæ | è¡¨æ ¼ï¼èµæç±»åãåç§°ãçæ¬ãæä»¶åï¼éä»¶å¯ç¹å»ä¸è½½/é¢è§ | `response[].documents` | |
| | | |
| | | ### 3. éä»¶å¤ç |
| | | |
| | | è®¾è®¡èµæä¸ç `attachmentList` 为éä»¶å表ï¼å
¶ä¸ `url` å¯ç´æ¥ç¨äºæä»¶é¢è§/ä¸è½½ã |
| | | |
| | | æä»¶é¢è§ URL æ ¼å¼ï¼ |
| | | - é¢è§ï¼`/system/storage-blob/preview/{fileName}` |
| | | - ä¸è½½ï¼`/system/storage-blob/download/{fileName}` |
| | | |
| | | --- |
| | | |
| | | ## ä¸å¡è§å说æ |
| | | |
| | | | è§å | 说æ | |
| | | |------|------| |
| | | | äº§åæªå½æ¡£ | æ¥å£è¿å空æ°ç»ï¼å¼¹çªæç¤º"è¯¥äº§åææ è®¾è®¡å½æ¡£" | |
| | | | å¤ä¸ªé¡¹ç® | åä¸äº§åå¯è½æå¤ä¸ªè®¾è®¡é¡¹ç®ï¼æé¡¹ç®åç»å±ç¤º | |
| | | | éä»¶æé | éä»¶é¢è§/ä¸è½½èµ° system 模å Storage APIï¼æ éé¢å¤é´æ | |
| | | | 空éä»¶ | `attachmentList` å¯è½ä¸ºç©ºæ°ç»ï¼åç«¯å¤æå䏿¾ç¤ºä¸è½½é¾æ¥ | |
| | | |
| | | --- |
| | | |
| | | ## 注æäºé¡¹ |
| | | |
| | | - å表页æä½å宽度æéï¼å»ºè®®æé®æåç®å为"彿¡£" |
| | | - `detail-by-product` æ¥å£è¿åæ°ç»ï¼ä¸ä¸ªäº§åå¯è½å¯¹åºå¤ä¸ªè®¾è®¡é¡¹ç® |
| | | - éä»¶é¢è§ä½¿ç¨ `window.open()` æå¼é¢è§ URL |
| | | - æ¥å£å·²åå¨ï¼åç«¯ç´æ¥è°ç¨ `src/api/mes/pd/archive/index.ts` ä¸çå°è£
æ¹æ³ |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | # çäº§ä»»å¡ - éå·¥ä½ç«èªå¨è®¡ç®ç产æ¶é¿ï¼å端èè°æ¹æ¡ï¼ |
| | | |
| | | ## æ¶åé¡µé¢ |
| | | |
| | | | é¡µé¢ | è·¯ç±è·¯å¾ | 说æ | |
| | | |------|----------|------| |
| | | | ç产任å¡è¡¨å | `/mes/pro-task` (æ°å¢/ç¼è¾å¼¹çª) | 鿩工ä½ç«åèªå¨è°ç¨æ¥å£è®¡ç®ç产æ¶é¿ | |
| | | |
| | | --- |
| | | |
| | | ## API |
| | | |
| | | ### æ°å¢æ¥å£ï¼è®¡ç®ç产æ¶é¿ |
| | | |
| | | | æ¹æ³ | è·¯å¾ | 说æ | |
| | | |------|------|------| |
| | | | GET | `/mes/pro/task/calculate-duration` | æ ¹æ®å·¥ä½ç«åæ°é计ç®ç产æ¶é¿ | |
| | | |
| | | **请æ±åæ°ï¼** |
| | | |
| | | | åæ° | ç±»å | å¿
å¡« | 说æ | |
| | | |------|------|------|------| |
| | | | workstationId | Long | æ¯ | å·¥ä½ç«ç¼å· | |
| | | | quantity | BigDecimal | æ¯ | æäº§æ°é | |
| | | |
| | | **ååºç¤ºä¾ï¼** |
| | | |
| | | ```json |
| | | { |
| | | "code": 0, |
| | | "data": { |
| | | "duration": 3 |
| | | }, |
| | | "msg": "" |
| | | } |
| | | ``` |
| | | |
| | | | åæ®µ | ç±»å | 说æ | |
| | | |------|------|------| |
| | | | duration | Integer | ç产æ¶é¿ï¼å°æ¶ï¼ï¼æ ç»å®è®¾å¤æ¶è¿å 0 | |
| | | |
| | | --- |
| | | |
| | | ## å端修æ¹ç¹ |
| | | |
| | | ### 1. è§¦åæ¶æº |
| | | |
| | | 卿°å¢/ç¼è¾ç产任å¡ç表åä¸ï¼å½ç¨æ·**鿩工ä½ç«**æ**ä¿®æ¹æäº§æ°é**åï¼èªå¨è°ç¨è®¡ç®æ¥å£ã |
| | | |
| | | ### 2. åæ®µåå¡« |
| | | |
| | | æ¥å£è¿åç `duration` å¼èªå¨å¡«å
¥è¡¨åç"ç产æ¶é¿"åæ®µï¼æ éç¨æ·æå¨è®¡ç®ã |
| | | |
| | | ### 3. è¾¹çæ
åµ |
| | | |
| | | | åºæ¯ | è¡¨ç° | |
| | | |------|------| |
| | | | æªéå·¥ä½ç« | ä¸è°ç¨æ¥å£ | |
| | | | æªå¡«æ°é | ä¸è°ç¨æ¥å£ | |
| | | | å·¥ä½ç«æªç»å®è®¾å¤ | è¿å `duration=0`ï¼åç«¯å¯æç¤º"该工ä½ç«æªç»å®è®¾å¤" | |
| | | | è®¾å¤æªé
ç½®ç产æç | è¿å `duration=0`ï¼åç«¯å¯æç¤º"ç»å®è®¾å¤æªé
ç½®ç产æç" | |
| | | |
| | | --- |
| | | |
| | | ## 计ç®é»è¾è¯´æ |
| | | |
| | | | æ¥éª¤ | 说æ | |
| | | |------|------| |
| | | | 1 | æ¥è¯¢å·¥ä½ç«ç»å®çææè®¾å¤ | |
| | | | 2 | æ»æç = Σ(æ¯å°è®¾å¤ç `productionEfficiency` à `conveyorBelt`) | |
| | | | 3 | ä¼ é履带为 0 æç©ºæ¶é»è®¤å 1 | |
| | | | 4 | ç产æ¶é¿ï¼å°æ¶ï¼= åä¸åæ´(æäº§æ°é / æ»æç) | |
| | | |
| | | --- |
| | | |
| | | ## 注æäºé¡¹ |
| | | |
| | | - è°ç¨æ¥å£åéç¡®ä¿ `workstationId` å `quantity` åæå¼ï¼é¿å
æ æè¯·æ± |
| | | - æ¥å£è¿å 0 æ¶ï¼å»ºè®®ç»åºå好æç¤ºï¼èééé» |
| | | - ç¨æ·ä»å¯æå¨ä¿®æ¹è®¡ç®åçç产æ¶é¿ |
| | | - 该æ¥å£ä»
ç¨äºå端è¾
å©è®¡ç®ï¼ä¸å½±åå端å建/æ´æ°ä»»å¡çä¸å¡é»è¾ |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | -- ============================================= |
| | | -- MES PD 产å设计模åèååå§å |
| | | -- å¨ MES ç³»ç»(5100) 䏿°å¢"产å设计"äºçº§ç®å½ |
| | | -- 设计项ç®ãè®¾è®¡å½æ¡£ä¸¤ä¸ªé¡µé¢ |
| | | -- ============================================= |
| | | |
| | | -- ä¿®æ£åæ"产å设计"(6809) å½å为"å·¥èºè®¾è®¡"ï¼é¿å
å²çªï¼å
¶å
容为工èºè®¾è®¡ï¼å·¥åºè®¾ç½®ãå·¥èºæµç¨çï¼ |
| | | UPDATE `system_menu` SET `name` = 'å·¥èºè®¾è®¡', `updater` = '1', `update_time` = NOW() WHERE `id` = 6809 AND `name` = '产å设计'; |
| | | |
| | | -- 产å设计ï¼äºçº§ç®å½ï¼æ¾å¨ MES ç³»ç»ä¸ï¼sort=25 ä½äºå·¥èºè®¾è®¡ä¹åï¼ |
| | | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (602571, '产å设计', '', 1, 25, 5100, 'pd', 'ep:design', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'); |
| | | |
| | | -- 设计项ç®ï¼ä¸çº§èåï¼ |
| | | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (602572, '设计项ç®', '', 2, 1, 602571, 'project', 'ep:document', 'mes/pd/project/index', 'MesPdProject', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'); |
| | | |
| | | -- è®¾è®¡é¡¹ç® - æé®æé |
| | | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES |
| | | (602573, 'è®¾è®¡é¡¹ç®æ¥è¯¢', 'mes:pd-project:query', 3, 1, 602572, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'), |
| | | (602574, '设计项ç®å建', 'mes:pd-project:create', 3, 2, 602572, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'), |
| | | (602575, 'è®¾è®¡é¡¹ç®æ´æ°', 'mes:pd-project:update', 3, 3, 602572, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'), |
| | | (602576, '设计项ç®å é¤', 'mes:pd-project:delete', 3, 4, 602572, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'), |
| | | (602577, '设计项ç®å¯¼åº', 'mes:pd-project:export', 3, 5, 602572, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'); |
| | | |
| | | -- è®¾è®¡å½æ¡£ï¼ä¸çº§èåï¼ |
| | | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (602578, 'è®¾è®¡å½æ¡£', '', 2, 2, 602571, 'archive', 'ep:folder', 'mes/pd/archive/index', 'MesPdArchive', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'); |
| | | |
| | | -- è®¾è®¡å½æ¡£ - æé®æé |
| | | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES |
| | | (602579, 'è®¾è®¡å½æ¡£æ¥è¯¢', 'mes:pd-archive:query', 3, 1, 602578, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'), |
| | | (602580, 'è®¾è®¡å½æ¡£æ´æ°', 'mes:pd-archive:update', 3, 2, 602578, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'), |
| | | (602581, 'è®¾è®¡å½æ¡£å é¤', 'mes:pd-archive:delete', 3, 3, 602578, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'), |
| | | (602582, 'è®¾è®¡å½æ¡£å¯¼åº', 'mes:pd-archive:export', 3, 4, 602578, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'); |
| | |
| | | default PageResult<CrmCustomerDO> selectPage(CrmCustomerPageReqVO pageReqVO, Long ownerUserId) { |
| | | MPJLambdaWrapperX<CrmCustomerDO> query = new MPJLambdaWrapperX<>(); |
| | | // æ¼æ¥æ°æ®æéçæ¥è¯¢æ¡ä»¶ |
| | | if (Boolean.TRUE.equals(pageReqVO.getPool())) { |
| | | if (CrmSceneTypeEnum.isAll(pageReqVO.getSceneType())) { |
| | | // åºæ¯åï¼å
¨é¨æ°æ®ï¼ä¸åºåå
¬æµ·/éå
¬æµ·ï¼ç± appendPermissionCondition ç»ä¸å¤ç |
| | | CrmPermissionUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_CUSTOMER.getType(), |
| | | CrmCustomerDO::getId, ownerUserId, pageReqVO.getSceneType()); |
| | | } else if (Boolean.TRUE.equals(pageReqVO.getPool())) { |
| | | query.isNull(CrmCustomerDO::getOwnerUserId); |
| | | } else { |
| | | CrmPermissionUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_CUSTOMER.getType(), |
| | |
| | | |
| | | OWNER(1, "æè´è´£ç"), |
| | | INVOLVED(2, "æåä¸ç"), |
| | | SUBORDINATE(3, "ä¸å±è´è´£ç"); |
| | | SUBORDINATE(3, "ä¸å±è´è´£ç"), |
| | | ALL(4, "å
¨é¨"); |
| | | |
| | | public static final Integer[] ARRAYS = Arrays.stream(values()).map(CrmSceneTypeEnum::getType).toArray(Integer[]::new); |
| | | |
| | |
| | | return ObjUtil.equal(SUBORDINATE.getType(), type); |
| | | } |
| | | |
| | | public static boolean isAll(Integer type) { |
| | | return ObjUtil.equal(ALL.getType(), type); |
| | | } |
| | | |
| | | @Override |
| | | public Integer[] array() { |
| | | return ARRAYS; |
| | |
| | | } |
| | | |
| | | /** |
| | | * æ ¡éªç¨æ·æ¯å¦ææ¥çå
¨é¨å®¢æ·çæé |
| | | * |
| | | * @return æ¯/å¦ |
| | | */ |
| | | private static boolean hasCustomerViewAllPermission() { |
| | | PermissionCommonApi permissionApi = SpringUtil.getBean(PermissionCommonApi.class); |
| | | return permissionApi.hasAnyPermissions(getLoginUserId(), "crm:customer:view-all"); |
| | | } |
| | | |
| | | /** |
| | | * æé CRM æ°æ®ç±»åæ°æ®ãåé¡µãæ¥è¯¢æ¡ä»¶ |
| | | * |
| | | * @param query è¿è¡¨æ¥è¯¢å¯¹è±¡ |
| | |
| | | query.in(ownerUserIdField, convertSet(subordinateUsers, AdminUserRespDTO::getId)); |
| | | } |
| | | } |
| | | // åºæ¯åï¼å
¨é¨æ°æ®ï¼éè¦æ view-all æéæ CRM 管çåï¼ |
| | | if (CrmSceneTypeEnum.isAll(sceneType)) { |
| | | if (isCrmAdmin() || hasCustomerViewAllPermission()) { |
| | | return; // è·³è¿è¿æ»¤ï¼æ¥çå
¨é¨ |
| | | } |
| | | // æ æéåé级为"æè´è´£ç" |
| | | query.eq(ownerUserIdField, userId); |
| | | } |
| | | } |
| | | |
| | | /** |
| | |
| | | private MesDvMachineryTypeService machineryTypeService; |
| | | @Resource |
| | | private MesMdWorkshopService workshopService; |
| | | @Resource |
| | | private cn.iocoder.yudao.module.mes.service.md.workstation.MesMdWorkstationService workstationService; |
| | | |
| | | @PostMapping("/create") |
| | | @Operation(summary = "å建设å¤") |
| | |
| | | if (CollUtil.isEmpty(list)) { |
| | | return Collections.emptyList(); |
| | | } |
| | | // 1. æ¹éè·å设å¤ç±»åå车é´ä¿¡æ¯ |
| | | // 1. æ¹éè·å设å¤ç±»åã车é´åå·¥ä½ç«ä¿¡æ¯ |
| | | Map<Long, MesDvMachineryTypeDO> machineryTypeMap = machineryTypeService.getMachineryTypeMap( |
| | | convertSet(list, MesDvMachineryDO::getMachineryTypeId)); |
| | | Map<Long, MesMdWorkshopDO> workshopMap = workshopService.getWorkshopMap( |
| | | convertSet(list, MesDvMachineryDO::getWorkshopId)); |
| | | Map<Long, cn.iocoder.yudao.module.mes.dal.dataobject.md.workstation.MesMdWorkstationDO> workstationMap = |
| | | workstationService.getWorkstationMap(convertSet(list, MesDvMachineryDO::getWorkstationId)); |
| | | // 2. æ¼æ¥ VO |
| | | return BeanUtils.toBean(list, MesDvMachineryRespVO.class, vo -> { |
| | | MapUtils.findAndThen(machineryTypeMap, vo.getMachineryTypeId(), |
| | | machineryType -> vo.setMachineryTypeName(machineryType.getName())); |
| | | MapUtils.findAndThen(workshopMap, vo.getWorkshopId(), |
| | | workshop -> vo.setWorkshopName(workshop.getName())); |
| | | MapUtils.findAndThen(workstationMap, vo.getWorkstationId(), |
| | | workstation -> vo.setWorkstationName(workstation.getName())); |
| | | }); |
| | | } |
| | | |
| | |
| | | @ExcelProperty("夿³¨") |
| | | private String remark; |
| | | |
| | | @ExcelProperty("ç产æç(æ¯å°æ¶)") |
| | | private java.math.BigDecimal productionEfficiency; |
| | | |
| | | @ExcelProperty("ä¼ é履带") |
| | | private Integer conveyorBelt; |
| | | |
| | | @ExcelProperty("å·¥ä½ç«ç¼ç ") |
| | | private String workstationCode; |
| | | |
| | | } |
| | |
| | | @Schema(description = "设å¤ç¶æ", example = "1") |
| | | private Integer status; |
| | | |
| | | @Schema(description = "å·¥ä½ç«ç¼å·", example = "300") |
| | | private Long workstationId; |
| | | |
| | | } |
| | |
| | | @ExcelProperty("夿³¨") |
| | | private String remark; |
| | | |
| | | @Schema(description = "ç产æçï¼æ¯å°æ¶ï¼", example = "10.5") |
| | | @ExcelProperty("ç产æç(æ¯å°æ¶)") |
| | | private java.math.BigDecimal productionEfficiency; |
| | | |
| | | @Schema(description = "ä¼ é履带ï¼2=ååæçï¼", example = "2") |
| | | @ExcelProperty("ä¼ é履带") |
| | | private Integer conveyorBelt; |
| | | |
| | | @Schema(description = "å·¥ä½ç«ç¼å·", example = "300") |
| | | private Long workstationId; |
| | | |
| | | @Schema(description = "å·¥ä½ç«åç§°", example = "ä¸å·å·¥ä½ç«") |
| | | @ExcelProperty("å·¥ä½ç«") |
| | | private String workstationName; |
| | | |
| | | @Schema(description = "å建æ¶é´", requiredMode = Schema.RequiredMode.REQUIRED) |
| | | @ExcelProperty("å建æ¶é´") |
| | | private LocalDateTime createTime; |
| | |
| | | @Schema(description = "夿³¨", example = "夿³¨") |
| | | private String remark; |
| | | |
| | | @Schema(description = "ç产æçï¼æ¯å°æ¶ï¼", example = "10.5") |
| | | private java.math.BigDecimal productionEfficiency; |
| | | |
| | | @Schema(description = "ä¼ é履带ï¼2=ååæçï¼", example = "2") |
| | | private Integer conveyorBelt; |
| | | |
| | | @Schema(description = "å·¥ä½ç«ç¼å·", example = "300") |
| | | private Long workstationId; |
| | | |
| | | } |
| | |
| | | @Schema(description = "å®¡æ ¸ç¶æ", example = "0") |
| | | private Integer auditStatus; |
| | | |
| | | @Schema(description = "项ç®ID", example = "1") |
| | | private Long projectId; |
| | | |
| | | } |
| | |
| | | import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderService; |
| | | import io.swagger.v3.oas.annotations.Operation; |
| | | import io.swagger.v3.oas.annotations.Parameter; |
| | | import io.swagger.v3.oas.annotations.Parameters; |
| | | import io.swagger.v3.oas.annotations.tags.Tag; |
| | | import jakarta.annotation.Resource; |
| | | import jakarta.servlet.http.HttpServletResponse; |
| | |
| | | return success(true); |
| | | } |
| | | |
| | | @GetMapping("/calculate-duration") |
| | | @Operation(summary = "计ç®ç产æ¶é¿", description = "æ ¹æ®å·¥ä½ç«ç»å®è®¾å¤çç产æçåä¼ é履带ï¼èªå¨è®¡ç®ç产æ¶é¿ï¼å°æ¶ï¼") |
| | | @Parameters({ |
| | | @Parameter(name = "workstationId", description = "å·¥ä½ç«ç¼å·", required = true), |
| | | @Parameter(name = "quantity", description = "æäº§æ°é", required = true) |
| | | }) |
| | | @PreAuthorize("@ss.hasPermission('mes:pro-task:query')") |
| | | public CommonResult<java.util.Map<String, Object>> calculateDuration( |
| | | @RequestParam("workstationId") Long workstationId, |
| | | @RequestParam("quantity") BigDecimal quantity) { |
| | | Integer duration = taskService.calculateDuration(workstationId, quantity); |
| | | return success(java.util.Map.of("duration", duration)); |
| | | } |
| | | |
| | | @DeleteMapping("/delete") |
| | | @Operation(summary = "å é¤ç产任å¡") |
| | | @Parameter(name = "id", description = "ç¼å·", required = true) |
| | |
| | | * 夿³¨ |
| | | */ |
| | | private String remark; |
| | | /** |
| | | * ç产æçï¼æ¯å°æ¶ï¼ |
| | | */ |
| | | private java.math.BigDecimal productionEfficiency; |
| | | /** |
| | | * ä¼ é履带ï¼2=ååæçï¼ |
| | | */ |
| | | private Integer conveyorBelt; |
| | | /** |
| | | * å·¥ä½ç«ç¼å· |
| | | * |
| | | * å
³è {@link cn.iocoder.yudao.module.mes.dal.dataobject.md.workstation.MesMdWorkstationDO#getId()} |
| | | */ |
| | | private Long workstationId; |
| | | |
| | | } |
| | |
| | | .eqIfPresent(MesDvMachineryDO::getMachineryTypeId, reqVO.getMachineryTypeId()) |
| | | .inIfPresent(MesDvMachineryDO::getMachineryTypeId, reqVO.getMachineryTypeIds()) |
| | | .eqIfPresent(MesDvMachineryDO::getWorkshopId, reqVO.getWorkshopId()) |
| | | .eqIfPresent(MesDvMachineryDO::getWorkstationId, reqVO.getWorkstationId()) |
| | | .eqIfPresent(MesDvMachineryDO::getStatus, reqVO.getStatus()) |
| | | .orderByDesc(MesDvMachineryDO::getId)); |
| | | } |
| | |
| | | .orderByDesc(MesPdDocumentAuditDO::getId)); |
| | | } |
| | | |
| | | default PageResult<MesPdDocumentAuditDO> selectPage(MesPdDocumentAuditPageReqVO reqVO, |
| | | Collection<Long> documentIds) { |
| | | return selectPage(reqVO, new LambdaQueryWrapperX<MesPdDocumentAuditDO>() |
| | | .eqIfPresent(MesPdDocumentAuditDO::getDocumentId, reqVO.getDocumentId()) |
| | | .likeIfPresent(MesPdDocumentAuditDO::getAuditNo, reqVO.getAuditNo()) |
| | | .eqIfPresent(MesPdDocumentAuditDO::getAuditStatus, reqVO.getAuditStatus()) |
| | | .inIfPresent(MesPdDocumentAuditDO::getDocumentId, documentIds) |
| | | .orderByDesc(MesPdDocumentAuditDO::getId)); |
| | | } |
| | | |
| | | default List<MesPdDocumentAuditDO> selectListByDocumentId(Long documentId) { |
| | | return selectList(MesPdDocumentAuditDO::getDocumentId, documentId); |
| | | } |
| | |
| | | ErrorCode DV_MACHINERY_HAS_CHECK_RECORD = new ErrorCode(1_040_301_004, "设å¤å·²å
³èç¹æ£è®°å½ï¼æ æ³å é¤"); |
| | | ErrorCode DV_MACHINERY_HAS_MAINTEN_RECORD = new ErrorCode(1_040_301_005, "设å¤å·²å
³èä¿å
»è®°å½ï¼æ æ³å é¤"); |
| | | ErrorCode DV_MACHINERY_HAS_REPAIR = new ErrorCode(1_040_301_006, "设å¤å·²å
³è维修工åï¼æ æ³å é¤"); |
| | | ErrorCode DV_MACHINERY_WORKSTATION_NOT_EXISTS = new ErrorCode(1_040_301_008, "å·¥ä½ç«ç¼ç ä¸åå¨"); |
| | | |
| | | // ========== MES 设å¤ç®¡ç-ç¹æ£ä¿å
»é¡¹ç®ï¼1-040-304-000ï¼ ========== |
| | | ErrorCode DV_SUBJECT_NOT_EXISTS = new ErrorCode(1_040_304_000, "ç¹æ£ä¿å
»é¡¹ç®ä¸åå¨"); |
| | |
| | | @Lazy |
| | | private MesMdWorkshopService workshopService; |
| | | @Resource |
| | | @Lazy |
| | | private cn.iocoder.yudao.module.mes.service.md.workstation.MesMdWorkstationService workstationService; |
| | | @Resource |
| | | private MesWmBarcodeService barcodeService; |
| | | @Resource |
| | | @Lazy |
| | |
| | | throw exception(DV_MACHINERY_IMPORT_LIST_IS_EMPTY); |
| | | } |
| | | |
| | | // 2. æ¹éå 载设å¤ç±»åå车é´ï¼æå»ºç¼ç å°å®ä½çæ å° |
| | | // 2. æ¹éå 载设å¤ç±»åã车é´åå·¥ä½ç«ï¼æå»ºç¼ç å°å®ä½çæ å° |
| | | List<MesDvMachineryTypeDO> allTypes = machineryTypeService.getMachineryTypeList( |
| | | new cn.iocoder.yudao.module.mes.controller.admin.dv.machinery.vo.type.MesDvMachineryTypeListReqVO()); |
| | | Map<String, MesDvMachineryTypeDO> typeCodeMap = allTypes.stream() |
| | |
| | | cn.iocoder.yudao.framework.common.enums.CommonStatusEnum.ENABLE.getStatus()); |
| | | Map<String, MesMdWorkshopDO> workshopCodeMap = allWorkshops.stream() |
| | | .collect(Collectors.toMap(MesMdWorkshopDO::getCode, w -> w, (a, b) -> a)); |
| | | List<cn.iocoder.yudao.module.mes.dal.dataobject.md.workstation.MesMdWorkstationDO> allWorkstations = |
| | | workstationService.getWorkstationListByStatus( |
| | | cn.iocoder.yudao.framework.common.enums.CommonStatusEnum.ENABLE.getStatus()); |
| | | Map<String, cn.iocoder.yudao.module.mes.dal.dataobject.md.workstation.MesMdWorkstationDO> workstationCodeMap = |
| | | allWorkstations.stream().collect(Collectors.toMap( |
| | | cn.iocoder.yudao.module.mes.dal.dataobject.md.workstation.MesMdWorkstationDO::getCode, |
| | | w -> w, (a, b) -> a)); |
| | | |
| | | // 3. éåï¼é个å建 or æ´æ° |
| | | MesDvMachineryImportRespVO respVO = MesDvMachineryImportRespVO.builder() |
| | |
| | | return; |
| | | } |
| | | |
| | | // 3.4 夿ï¼å建 or æ´æ° |
| | | // 3.4 æ ¡éªå·¥ä½ç«ç¼ç ï¼å¯éï¼ |
| | | Long workstationId = null; |
| | | if (StrUtil.isNotBlank(importItem.getWorkstationCode())) { |
| | | cn.iocoder.yudao.module.mes.dal.dataobject.md.workstation.MesMdWorkstationDO workstation = |
| | | workstationCodeMap.get(importItem.getWorkstationCode()); |
| | | if (workstation == null) { |
| | | respVO.getFailureCodes().put(key, "å·¥ä½ç«ç¼ç [" + importItem.getWorkstationCode() + "]ä¸åå¨"); |
| | | return; |
| | | } |
| | | workstationId = workstation.getId(); |
| | | } |
| | | |
| | | // 3.5 夿ï¼å建 or æ´æ° |
| | | MesDvMachineryDO existMachinery = machineryMapper.selectByCode(importItem.getCode()); |
| | | if (existMachinery == null) { |
| | | // 3.4.1 å建 |
| | | // 3.5.1 å建 |
| | | MesDvMachineryDO machinery = BeanUtils.toBean(importItem, MesDvMachineryDO.class); |
| | | machinery.setMachineryTypeId(machineryType.getId()); |
| | | machinery.setWorkshopId(workshop.getId()); |
| | | machinery.setWorkstationId(workstationId); |
| | | machineryMapper.insert(machinery); |
| | | // èªå¨çææ¡ç |
| | | barcodeService.autoGenerateBarcode(BarcodeBizTypeEnum.MACHINERY.getValue(), |
| | | machinery.getId(), machinery.getCode(), machinery.getName()); |
| | | respVO.getCreateCodes().add(importItem.getCode()); |
| | | } else if (updateSupport) { |
| | | // 3.4.2 æ´æ° |
| | | // 3.5.2 æ´æ° |
| | | MesDvMachineryDO updateObj = BeanUtils.toBean(importItem, MesDvMachineryDO.class); |
| | | updateObj.setId(existMachinery.getId()); |
| | | updateObj.setMachineryTypeId(machineryType.getId()); |
| | | updateObj.setWorkshopId(workshop.getId()); |
| | | updateObj.setWorkstationId(workstationId); |
| | | machineryMapper.updateById(updateObj); |
| | | respVO.getUpdateCodes().add(importItem.getCode()); |
| | | } else { |
| | |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.pd.documentaudit.vo.MesPdDocumentAuditPageReqVO; |
| | | import cn.hutool.core.collection.CollUtil; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.pd.documentaudit.vo.MesPdDocumentAuditSaveReqVO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.pd.document.MesPdDocumentDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.pd.documentaudit.MesPdDocumentAuditDO; |
| | | import cn.iocoder.yudao.module.mes.dal.mysql.pd.documentaudit.MesPdDocumentAuditMapper; |
| | | import cn.iocoder.yudao.module.mes.service.pd.document.MesPdDocumentService; |
| | |
| | | import org.springframework.validation.annotation.Validated; |
| | | |
| | | import java.time.LocalDateTime; |
| | | import java.util.Collections; |
| | | import java.util.List; |
| | | import java.util.stream.Collectors; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; |
| | | import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.PD_DOCUMENT_AUDIT_NOT_EXISTS; |
| | |
| | | |
| | | @Override |
| | | public PageResult<MesPdDocumentAuditDO> getDocumentAuditPage(MesPdDocumentAuditPageReqVO pageReqVO) { |
| | | // æé¡¹ç®çéï¼å
æ¥åºé¡¹ç®ä¸ææèµæï¼åæèµæ ID è¿æ»¤å®¡æ ¸è®°å½ |
| | | if (pageReqVO.getProjectId() != null) { |
| | | List<MesPdDocumentDO> documents = documentService.getDocumentListByProjectId( |
| | | pageReqVO.getProjectId()); |
| | | if (CollUtil.isEmpty(documents)) { |
| | | return PageResult.empty(); |
| | | } |
| | | List<Long> documentIds = documents.stream() |
| | | .map(MesPdDocumentDO::getId).collect(Collectors.toList()); |
| | | return documentAuditMapper.selectPage(pageReqVO, documentIds); |
| | | } |
| | | return documentAuditMapper.selectPage(pageReqVO); |
| | | } |
| | | |
| | |
| | | void cancelTaskByOrderId(Long workOrderId); |
| | | |
| | | /** |
| | | * æ ¹æ®å·¥ä½ç«ç»å®è®¾å¤çç产æçåä¼ é履带ï¼è®¡ç®ç产æ¶é¿ï¼åä½ï¼å°æ¶ï¼ |
| | | * |
| | | * @param workstationId å·¥ä½ç«ç¼å· |
| | | * @param quantity æäº§æ°é |
| | | * @return ç产æ¶é¿ï¼å°æ¶ï¼ï¼æ 设å¤åè¿å 0 |
| | | */ |
| | | Integer calculateDuration(Long workstationId, BigDecimal quantity); |
| | | |
| | | /** |
| | | * ç´¯å ä»»å¡çå·²ç产ãåæ ¼ãä¸åæ ¼æ°é |
| | | * |
| | | * @param id ä»»å¡ç¼å· |
| | |
| | | import cn.iocoder.yudao.module.mes.controller.admin.pro.task.vo.MesProTaskAutoGenerateReqVO; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.pro.task.vo.MesProTaskPageReqVO; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.pro.task.vo.MesProTaskSaveReqVO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.dv.machinery.MesDvMachineryDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.md.workstation.MesMdWorkstationMachineDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.pro.task.MesProTaskDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderDO; |
| | | import cn.iocoder.yudao.module.mes.dal.mysql.pro.task.MesProTaskMapper; |
| | | import cn.iocoder.yudao.module.mes.dal.mysql.pro.feedback.MesProFeedbackMapper; |
| | | import cn.iocoder.yudao.module.mes.enums.md.autocode.MesMdAutoCodeRuleCodeEnum; |
| | | import cn.iocoder.yudao.module.mes.enums.pro.MesProTaskStatusEnum; |
| | | import cn.iocoder.yudao.module.mes.service.dv.machinery.MesDvMachineryService; |
| | | import cn.iocoder.yudao.module.mes.service.md.autocode.MesMdAutoCodeRecordService; |
| | | import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService; |
| | | import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService; |
| | | import cn.iocoder.yudao.module.mes.service.md.workstation.MesMdWorkstationMachineService; |
| | | import cn.iocoder.yudao.module.mes.service.md.workstation.MesMdWorkstationService; |
| | | import cn.iocoder.yudao.module.mes.service.pro.process.MesProProcessService; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.pro.route.MesProRouteProcessDO; |
| | |
| | | import java.util.Collection; |
| | | import java.util.Collections; |
| | | import java.util.List; |
| | | import java.util.Set; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; |
| | | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList; |
| | | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; |
| | | import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.PRO_TASK_ALREADY_FINISHED; |
| | | import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.PRO_TASK_HAS_FEEDBACK; |
| | | import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.PRO_TASK_NOT_EXISTS; |
| | |
| | | private MesProWorkOrderProcessService workOrderProcessService; |
| | | @Resource |
| | | private MesMdAutoCodeRecordService autoCodeRecordService; |
| | | @Resource |
| | | private MesMdWorkstationMachineService workstationMachineService; |
| | | @Resource |
| | | @Lazy |
| | | private MesDvMachineryService machineryService; |
| | | |
| | | @Override |
| | | public Long createTask(MesProTaskSaveReqVO createReqVO) { |
| | |
| | | } |
| | | |
| | | @Override |
| | | public Integer calculateDuration(Long workstationId, BigDecimal quantity) { |
| | | if (quantity == null || quantity.compareTo(BigDecimal.ZERO) <= 0) { |
| | | return 0; |
| | | } |
| | | // 1. æ¥è¯¢å·¥ä½ç«ç»å®çè®¾å¤ |
| | | List<MesMdWorkstationMachineDO> machines = workstationMachineService |
| | | .getWorkstationMachineListByWorkstationId(workstationId); |
| | | if (CollUtil.isEmpty(machines)) { |
| | | return 0; |
| | | } |
| | | // 2. è·å设å¤è¯¦æ
ï¼è®¡ç®æ»æç |
| | | Set<Long> machineryIds = convertSet(machines, MesMdWorkstationMachineDO::getMachineryId); |
| | | List<MesDvMachineryDO> machineryList = machineryService.getMachineryList(machineryIds); |
| | | BigDecimal totalEfficiency = BigDecimal.ZERO; |
| | | for (MesDvMachineryDO m : machineryList) { |
| | | BigDecimal efficiency = m.getProductionEfficiency() != null ? m.getProductionEfficiency() : BigDecimal.ZERO; |
| | | Integer belt = m.getConveyorBelt() != null && m.getConveyorBelt() > 0 ? m.getConveyorBelt() : 1; |
| | | totalEfficiency = totalEfficiency.add(efficiency.multiply(BigDecimal.valueOf(belt))); |
| | | } |
| | | if (totalEfficiency.compareTo(BigDecimal.ZERO) <= 0) { |
| | | return 0; |
| | | } |
| | | // 3. ç产æ¶é¿ï¼å°æ¶ï¼ = ceil(æäº§æ°é / æ»æç)ï¼æçåä½ä¸ºæ¯å°æ¶äº§é |
| | | return quantity.divide(totalEfficiency, 0, java.math.RoundingMode.CEILING).intValue(); |
| | | } |
| | | |
| | | @Override |
| | | public MesProTaskAutoGeneratePreviewRespVO previewAutoGenerate(MesProTaskAutoGenerateReqVO reqVO) { |
| | | // 1. æ ¡éªå·¥å已确认 |
| | | MesProWorkOrderDO workOrder = workOrderService.validateWorkOrderConfirmed(reqVO.getWorkOrderId()); |
| | |
| | | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.module.srm.controller.admin.tender.vo.*; |
| | | import cn.iocoder.yudao.module.srm.dal.dataobject.SrmBidAwardDO; |
| | | import cn.iocoder.yudao.module.srm.service.tender.SrmBidAwardService; |
| | | import io.swagger.v3.oas.annotations.Operation; |
| | | import io.swagger.v3.oas.annotations.Parameter; |
| | |
| | | @Operation(summary = "æ ¹æ®ææ 项ç®IDè·å宿 详æ
") |
| | | @PreAuthorize("@ss.hasPermission('srm:bid-award:query')") |
| | | public CommonResult<SrmBidAwardRespVO> getAwardByProject(@RequestParam("tenderProjectId") Long tenderProjectId) { |
| | | return success(BeanUtils.toBean(bidAwardService.getAwardByProjectId(tenderProjectId), SrmBidAwardRespVO.class)); |
| | | SrmBidAwardDO award = bidAwardService.getAwardByProjectId(tenderProjectId); |
| | | if (award == null) { |
| | | return success((SrmBidAwardRespVO) null); |
| | | } |
| | | return success(BeanUtils.toBean(award, SrmBidAwardRespVO.class)); |
| | | } |
| | | |
| | | @DeleteMapping("/delete") |
| | | @Operation(summary = "å é¤å®æ ") |
| | | @Parameter(name = "id", description = "宿 ID", required = true) |
| | | @PreAuthorize("@ss.hasPermission('srm:bid-award:update')") |
| | | public CommonResult<Boolean> deleteAward(@RequestParam("id") Long id) { |
| | | bidAwardService.deleteAward(id); |
| | | return success(true); |
| | | } |
| | | |
| | | @PutMapping("/approve") |
| | |
| | | return success(bidEvaluationService.createEvaluation(createReqVO)); |
| | | } |
| | | |
| | | @PutMapping("/update") |
| | | @Operation(summary = "æ´æ°è¯æ è®°å½") |
| | | @PreAuthorize("@ss.hasPermission('srm:bid-evaluation:update')") |
| | | public CommonResult<Boolean> updateEvaluation(@Valid @RequestBody SrmBidEvaluationSaveReqVO updateReqVO) { |
| | | bidEvaluationService.updateEvaluation(updateReqVO); |
| | | return success(true); |
| | | } |
| | | |
| | | @GetMapping("/list-by-project") |
| | | @Operation(summary = "æææ 项ç®è·åè¯æ å表") |
| | | @PreAuthorize("@ss.hasPermission('srm:bid-evaluation:query')") |
| | |
| | | if (material != null) { |
| | | vo.setTenderMaterialCode(material.getProductCode()); |
| | | vo.setTenderMaterialName(material.getProductName()); |
| | | vo.setMaterialName(material.getProductName()); |
| | | vo.setTenderMaterialSpec(material.getProductSpec()); |
| | | vo.setTenderMaterialUnit(material.getUnit()); |
| | | } |
| | |
| | | @Schema(description = "ç©æåç§°") |
| | | private String tenderMaterialName; |
| | | |
| | | @Schema(description = "ç©æåç§°ï¼ä¸å端 materialName 对åºï¼") |
| | | private String materialName; |
| | | |
| | | @Schema(description = "ç©æè§æ ¼") |
| | | private String tenderMaterialSpec; |
| | | |
| | |
| | | .eq(SrmTenderBidDO::getSupplierId, supplierId)); |
| | | } |
| | | |
| | | default boolean existsByBidNo(String bidNo) { |
| | | return exists(new LambdaQueryWrapperX<SrmTenderBidDO>() |
| | | .eq(SrmTenderBidDO::getBidNo, bidNo)); |
| | | } |
| | | |
| | | } |
| | |
| | | ErrorCode TENDER_STATUS_ALREADY_CLOSED = new ErrorCode(1_040_500_010, "å·²å
³éç项ç®ä¸å
许æä½"); |
| | | ErrorCode BID_NOT_EXISTS = new ErrorCode(1_040_500_003, "ææ è®°å½ä¸åå¨"); |
| | | ErrorCode BID_SUPPLIER_EXISTS = new ErrorCode(1_040_500_004, "ä¾åºåå·²å䏿æ "); |
| | | ErrorCode BID_NO_EXISTS = new ErrorCode(1_040_500_016, "ææ ç¼å·å·²åå¨"); |
| | | ErrorCode BID_PAST_END_TIME = new ErrorCode(1_040_500_005, "ææ å·²æªæ¢"); |
| | | ErrorCode BID_SUPPLIER_NOT_APPROVED = new ErrorCode(1_040_500_011, "ä¾åºåæªéè¿åå
¥å®¡æ¹ï¼æ æ³å䏿æ "); |
| | | ErrorCode BID_WITHDRAWN_CANNOT_QUOTE = new ErrorCode(1_040_500_012, "ææ å·²æ¤æ ï¼ä¸å
许æ¥ä»·"); |
| | |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.validation.annotation.Validated; |
| | | |
| | | import cn.hutool.core.collection.CollUtil; |
| | | import java.util.Collection; |
| | | import java.util.Collections; |
| | | import java.util.List; |
| | | |
| | | @Service |
| | |
| | | |
| | | @Override |
| | | public List<SrmSupplierDO> getSupplierList(Collection<Long> ids) { |
| | | if (CollUtil.isEmpty(ids)) { |
| | | return Collections.emptyList(); |
| | | } |
| | | return supplierMapper.selectBatchIds(ids); |
| | | } |
| | | |
| | |
| | | SrmBidAwardDO getAwardByProjectId(Long tenderProjectId); |
| | | |
| | | /** |
| | | * å é¤å®æ |
| | | */ |
| | | void deleteAward(Long id); |
| | | |
| | | /** |
| | | * 审æ¹å®æ |
| | | */ |
| | | void approveAward(Long id); |
| | |
| | | import cn.iocoder.yudao.module.srm.enums.ErrorCodeConstants; |
| | | import cn.iocoder.yudao.module.srm.enums.TenderStatusEnum; |
| | | import jakarta.annotation.Resource; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | import org.springframework.validation.annotation.Validated; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDateTime; |
| | | import java.util.*; |
| | | import java.util.function.Function; |
| | |
| | | */ |
| | | @Service |
| | | @Validated |
| | | @Slf4j |
| | | public class SrmBidAwardServiceImpl implements SrmBidAwardService { |
| | | |
| | | @Resource |
| | |
| | | @Override |
| | | public SrmBidAwardDO getAwardByProjectId(Long tenderProjectId) { |
| | | return bidAwardMapper.selectByTenderProjectId(tenderProjectId); |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void deleteAward(Long id) { |
| | | SrmBidAwardDO award = validateAwardExists(id); |
| | | bidAwardMapper.deleteById(id); |
| | | } |
| | | |
| | | @Override |
| | |
| | | ErpPurchaseOrderCreateReqDTO createReq = new ErpPurchaseOrderCreateReqDTO(); |
| | | createReq.setSupplierId(srmSupplier.getId()); |
| | | createReq.setOrderTime(LocalDateTime.now()); |
| | | createReq.setDepositPrice(BigDecimal.ZERO); |
| | | createReq.setItems(orderItems); |
| | | createReq.setRemark("SRM 宿 èªå¨çæ, 宿 ç¼å·: " + award.getAwardNo()); |
| | | |
| | | Long purchaseOrderId = erpPurchaseOrderApi.createPurchaseOrder(createReq).getCheckedData(); |
| | | |
| | | // è·åéè´è®¢åå· |
| | | String purchaseOrderNo = null; |
| | | try { |
| | | purchaseOrderNo = erpPurchaseOrderApi.getPurchaseOrder(purchaseOrderId) |
| | | .getCheckedData().getNo(); |
| | | } catch (Exception e) { |
| | | log.warn("[generatePurchaseOrder] è·åéè´è®¢åå·å¤±è´¥ï¼purchaseOrderId={}", purchaseOrderId, e); |
| | | } |
| | | |
| | | // 8. æ´æ°å®æ è®°å½ |
| | | award.setPurchaseOrderId(purchaseOrderId); |
| | | award.setPurchaseOrderNo(purchaseOrderNo); |
| | | award.setAwardStatus(AwardStatusEnum.ORDER_GENERATED.getCode()); |
| | | bidAwardMapper.updateById(award); |
| | | |
| | | // 9. æ´æ°ææ 项ç®ç¶æ |
| | | SrmTenderProjectDO project = tenderProjectMapper.selectById(award.getTenderProjectId()); |
| | | if (project != null) { |
| | | project.setTenderStatus(TenderStatusEnum.CLOSED.getCode()); |
| | | tenderProjectMapper.updateById(project); |
| | | } |
| | | } |
| | | |
| | | private SrmBidAwardDO validateAwardExists(Long id) { |
| | |
| | | Long createEvaluation(@Valid SrmBidEvaluationSaveReqVO createReqVO); |
| | | |
| | | /** |
| | | * æ´æ°è¯æ è®°å½ |
| | | */ |
| | | void updateEvaluation(@Valid SrmBidEvaluationSaveReqVO updateReqVO); |
| | | |
| | | /** |
| | | * è·åè¯æ åè¡¨ï¼æææ é¡¹ç®ï¼ |
| | | */ |
| | | List<SrmBidEvaluationDO> getEvaluationList(Long tenderProjectId); |
| | |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public Long createEvaluation(SrmBidEvaluationSaveReqVO createReqVO) { |
| | | SrmBidEvaluationDO evaluation = BeanUtils.toBean(createReqVO, SrmBidEvaluationDO.class); |
| | | // 强å¶ç½®ç©º idï¼é¿å
åç«¯ä¼ å
¥å·²æ id 导è´ä¸»é®å²çªï¼ç±æ°æ®åºåºåèªå¨çæ |
| | | evaluation.setId(null); |
| | | // 计ç®ç»¼åè¯å: ä»·æ ¼*0.4 + ææ¯*0.3 + 交ä»*0.2 + æå¡*0.1 |
| | | BigDecimal price = nvl(evaluation.getPriceScore()); |
| | | BigDecimal tech = nvl(evaluation.getTechScore()); |
| | |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void updateEvaluation(SrmBidEvaluationSaveReqVO updateReqVO) { |
| | | SrmBidEvaluationDO existing = bidEvaluationMapper.selectById(updateReqVO.getId()); |
| | | if (existing == null) { |
| | | throw ServiceExceptionUtil.exception(ErrorCodeConstants.EVALUATION_NOT_EXISTS_TENDER); |
| | | } |
| | | SrmBidEvaluationDO evaluation = BeanUtils.toBean(updateReqVO, SrmBidEvaluationDO.class); |
| | | BigDecimal price = nvl(evaluation.getPriceScore()); |
| | | BigDecimal tech = nvl(evaluation.getTechScore()); |
| | | BigDecimal delivery = nvl(evaluation.getDeliveryScore()); |
| | | BigDecimal service = nvl(evaluation.getServiceScore()); |
| | | BigDecimal composite = price.multiply(new BigDecimal("0.4")) |
| | | .add(tech.multiply(new BigDecimal("0.3"))) |
| | | .add(delivery.multiply(new BigDecimal("0.2"))) |
| | | .add(service.multiply(new BigDecimal("0.1"))) |
| | | .setScale(2, RoundingMode.HALF_UP); |
| | | evaluation.setCompositeScore(composite); |
| | | evaluation.setEvaluationTime(LocalDateTime.now()); |
| | | bidEvaluationMapper.updateById(evaluation); |
| | | } |
| | | |
| | | @Override |
| | | public List<SrmBidEvaluationDO> getEvaluationList(Long tenderProjectId) { |
| | | return bidEvaluationMapper.selectListByTenderProjectId(tenderProjectId); |
| | | } |
| | |
| | | if (!supplierApplyMapper.existsApprovedBySupplierId(createReqVO.getSupplierId())) { |
| | | throw ServiceExceptionUtil.exception(ErrorCodeConstants.BID_SUPPLIER_NOT_APPROVED); |
| | | } |
| | | // æ ¡éªææ ç¼å·æ¯å¦éå¤ |
| | | if (tenderBidMapper.existsByBidNo(createReqVO.getBidNo())) { |
| | | throw ServiceExceptionUtil.exception(ErrorCodeConstants.BID_NO_EXISTS); |
| | | } |
| | | // æ ¡éªä¾åºåæ¯å¦å·²å䏿æ |
| | | SrmTenderBidDO existing = tenderBidMapper.selectByTenderAndSupplier(createReqVO.getTenderProjectId(), createReqVO.getSupplierId()); |
| | | if (existing != null) { |
| | |
| | | import cn.iocoder.yudao.module.srm.dal.mysql.SrmBidAwardMapper; |
| | | import cn.iocoder.yudao.module.srm.dal.mysql.SrmTenderMaterialMapper; |
| | | import cn.iocoder.yudao.module.srm.dal.mysql.SrmTenderProjectMapper; |
| | | import cn.iocoder.yudao.module.srm.enums.AwardStatusEnum; |
| | | import cn.iocoder.yudao.module.srm.enums.ErrorCodeConstants; |
| | | import cn.iocoder.yudao.module.srm.enums.TenderStatusEnum; |
| | | import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil; |
| | |
| | | |
| | | @Override |
| | | public SrmTenderProjectDO getTenderProject(Long id) { |
| | | return tenderProjectMapper.selectById(id); |
| | | SrmTenderProjectDO project = tenderProjectMapper.selectById(id); |
| | | if (project != null) { |
| | | SrmBidAwardDO award = bidAwardMapper.selectByTenderProjectId(id); |
| | | if (award != null) { |
| | | project.setAwardId(award.getId()); |
| | | project.setPurchaseOrderNo(award.getPurchaseOrderNo()); |
| | | } |
| | | } |
| | | return project; |
| | | } |
| | | |
| | | @Override |
| | |
| | | if (award != null) { |
| | | project.setAwardId(award.getId()); |
| | | project.setPurchaseOrderNo(award.getPurchaseOrderNo()); |
| | | // é²å¾¡ï¼å¦æå®æ å·²çæè®¢åä½é¡¹ç®ç¶ææªæ´æ°ï¼åæ¥ç¶æ |
| | | if (AwardStatusEnum.ORDER_GENERATED.getCode().equals(award.getAwardStatus())) { |
| | | project.setTenderStatus(TenderStatusEnum.CLOSED.getCode()); |
| | | } |
| | | } |
| | | }); |
| | | } |