feat(account): 更新往来付款回款流水表及接口
- 创建 payment_record 表存储客户/供应商/合作商往来流水
- 客户往来取 party_type=1 and direction=1 作为回款列
- 供应商往来取 party_type=2 and direction=2 作为付款列
- 合作商往来取 party_type=3 and direction=1 作为已付款列
- 添加 paymentRecord 相关增删改查接口
- 在客户往来页面显示回款金额列
- 在供应商往来页面显示付款金额列
- 实现销售台账审批流程
- 采购台账编辑时先回滚旧备件流水再重建新流水
- 删除采购台账时同步回滚备件库存和流水记录
- 储罐信息新增是否启用、用途、租客信息字段
- 出库时自动生成已发货台账记录
- 备件领用时来源单号显示设备名称而非单号
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | -- å¨ç½ä¿¡æ¯è¡¨æ°å¢âæ¯å¦å¯ç¨ââç¨éï¼ç§èµ/èªç¨ï¼â |
| | | -- æ§è¡åºï¼product-inventory-managementï¼åç§æ·åºåï¼ |
| | | -- is_enabled åéæ°æ®é»è®¤ 1ï¼å¯ç¨ï¼ï¼è¡ä¸ºä¸æ¹å¨åä¸è´ï¼usage_type ç空表示æªéæ©ï¼åéæ°æ®ï¼ |
| | | ALTER TABLE `tank_info` |
| | | ADD COLUMN `is_enabled` tinyint(1) NOT NULL DEFAULT 1 COMMENT 'æ¯å¦å¯ç¨ 1å¯ç¨ 0æªå¯ç¨' AFTER `remaining`, |
| | | ADD COLUMN `usage_type` tinyint NULL DEFAULT NULL COMMENT 'ç¨é 1ç§èµ 2èªç¨ï¼å¯ç¨åæéè¦éï¼ä¸ºç©ºè¡¨ç¤ºæªéæ©' AFTER `is_enabled`; |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | #åä½åæ¡£æ¡è¡¨ï¼å§å¤ç®¡ç - åä½åï¼ç¬ç«äºä¾åºå supplier_manageï¼ |
| | | drop table if exists outsourcing_partner; |
| | | create table outsourcing_partner |
| | | ( |
| | | id bigint auto_increment primary key, |
| | | partner_name varchar(100) not null comment 'åä½ååç§°', |
| | | taxpayer_identification_num varchar(50) null comment '纳ç¨äººè¯å«å·', |
| | | company_address varchar(255) null comment 'å
¬å¸å°å', |
| | | company_phone varchar(50) null comment 'å
¬å¸çµè¯', |
| | | bank_account_name varchar(100) null comment '弿·è¡åç§°', |
| | | bank_account_num varchar(50) null comment 'é¶è¡è´¦å·', |
| | | contact_user_name varchar(50) null comment 'è系人å§å', |
| | | contact_user_phone varchar(50) null comment 'è系人çµè¯', |
| | | maintain_user_id bigint null comment 'ç»´æ¤äººid', |
| | | maintain_time date null comment 'ç»´æ¤æ¶é´', |
| | | partner_type varchar(50) null comment 'åä½åç±»å', |
| | | is_white tinyint(1) default 1 comment 'æ¯å¦ç½åå 1æ¯ 0å¦', |
| | | remark varchar(500) null comment '夿³¨', |
| | | tenant_id bigint null comment 'ç§æ·ID', |
| | | dept_id bigint null comment 'é¨é¨ID', |
| | | create_user bigint null comment 'å建人ID', |
| | | create_time datetime null comment 'å建æ¶é´', |
| | | update_time datetime null comment 'æ´æ°æ¶é´', |
| | | index idx_partner_name (partner_name), |
| | | index idx_tenant_partner (tenant_id, partner_name) |
| | | ); |
| | | |
| | | #å§å¤è®¢å主表 |
| | | drop table if exists outsourcing_order; |
| | | create table outsourcing_order |
| | | ( |
| | | id bigint auto_increment primary key, |
| | | order_no varchar(50) not null comment 'å§å¤è®¢åå·', |
| | | partner_id bigint null comment 'åä½åid', |
| | | partner_name varchar(100) null comment 'åä½ååç§°', |
| | | apply_date date null comment 'ç³è¯·æ¥æ', |
| | | expected_delivery_date date null comment 'ææäº¤ä»æ¥æ', |
| | | project_name varchar(100) null comment '项ç®åç§°', |
| | | contract_amount decimal(18, 2) null comment 'å§å¤éé¢ï¼å«ç¨æ»ä»·ï¼', |
| | | payment_method varchar(255) null comment '仿¬¾æ¹å¼', |
| | | remarks text null comment '夿³¨', |
| | | status tinyint not null default 0 comment 'ç¶æ 0è稿 1已确认 2已宿 3å·²ä½åº', |
| | | confirm_time datetime null comment '确认æ¶é´', |
| | | cancel_reason varchar(255) null comment 'ä½åºåå ', |
| | | tenant_id bigint null comment 'ç§æ·ID', |
| | | dept_id bigint null comment 'é¨é¨ID', |
| | | create_user bigint null comment 'å建人ID', |
| | | create_time datetime null comment 'å建æ¶é´', |
| | | update_time datetime null comment 'æ´æ°æ¶é´', |
| | | index idx_order_no (order_no), |
| | | index idx_partner_id (partner_id), |
| | | index idx_status (status) |
| | | ); |
| | | |
| | | #å§å¤è®¢å产åæç»è¡¨ |
| | | drop table if exists outsourcing_order_product; |
| | | create table outsourcing_order_product |
| | | ( |
| | | id bigint auto_increment primary key, |
| | | outsourcing_order_id bigint not null comment 'å§å¤è®¢åid', |
| | | product_id bigint null comment '产åid', |
| | | product_model_id bigint null comment '产åè§æ ¼id', |
| | | product_category varchar(100) null comment '产å大类', |
| | | specification_model varchar(100) null comment 'è§æ ¼åå·', |
| | | unit varchar(20) null comment 'åä½', |
| | | quantity decimal(18, 2) not null default 0 comment 'æ°é', |
| | | tax_rate decimal(5, 0) null comment 'ç¨ç', |
| | | tax_inclusive_unit_price decimal(18, 2) null comment 'å«ç¨åä»·', |
| | | tax_inclusive_total_price decimal(18, 2) null comment 'å«ç¨æ»ä»·', |
| | | tax_exclusive_total_price decimal(18, 2) null comment 'ä¸å«ç¨æ»ä»·', |
| | | invoice_type varchar(50) null comment 'å票类å', |
| | | is_scrap tinyint(1) not null default 0 comment 'æ¯å¦æ¥åºåéæ 0å¦ 1æ¯', |
| | | stock_inventory_id bigint null comment 'éç¨çæ¥åºååæ ¼åºåidï¼stock_inventory.idï¼åªè¯»å¼ç¨ï¼ä¸åååºåï¼', |
| | | batch_no varchar(64) null comment 'æ¥åºåæ¹å·', |
| | | available_quantity decimal(18, 2) null comment 'ä¸åæ¶è¯¥æ¹æ¬¡å¯ç¨éå¿«ç
§', |
| | | remark varchar(255) null comment '夿³¨', |
| | | tenant_id bigint null comment 'ç§æ·ID', |
| | | dept_id bigint null comment 'é¨é¨ID', |
| | | create_user bigint null comment 'å建人ID', |
| | | create_time datetime null comment 'å建æ¶é´', |
| | | update_time datetime null comment 'æ´æ°æ¶é´', |
| | | index idx_outsourcing_order_id (outsourcing_order_id), |
| | | index idx_stock_inventory_id (stock_inventory_id) |
| | | ); |
| | | |
| | | # æ¥åºåéææ¹èµ°åæ ¼åºåï¼stock_inventoryï¼ï¼æç»åé乿¹åï¼å·²å»ºè¿è¡¨çç¯å¢æ§è¡ï¼2026-09-20 å·²å¨å¼ååºæ§è¡ï¼ï¼ |
| | | # ALTER TABLE outsourcing_order_product |
| | | # CHANGE COLUMN stock_uninventory_id stock_inventory_id bigint null comment 'éç¨çæ¥åºååæ ¼åºåidï¼stock_inventory.idï¼åªè¯»å¼ç¨ï¼ä¸åååºåï¼'; |
| | | # ALTER TABLE outsourcing_order_product RENAME INDEX idx_stock_uninventory_id TO idx_stock_inventory_id; |
| | | |
| | | # åä½å徿¥å payment_record(party_type=3 and direction=1) ä½ä¸ºã已仿¬¾ãå |
| | | # 已建è¿è¡¨çç¯å¢æ§è¡ï¼ |
| | | # ALTER TABLE payment_record MODIFY COLUMN party_type tinyint not null comment '徿¥æ¹ç±»å 1å®¢æ· 2ä¾åºå 3åä½å'; |
| | |
| | | # 徿¥ä»æ¬¾åæ¬¾æµæ°´è¡¨ |
| | | # 客æ·å¾æ¥å party_type=1 and direction=1 ä½ä¸ºã仿¬¾ãå |
| | | # ä¾åºå徿¥å party_type=2 and direction=2 ä½ä¸ºã忬¾ãå |
| | | # 客æ·å¾æ¥å party_type=1 and direction=1 ä½ä¸ºã忬¾ãåï¼è¿ååæ®µ receiptRecordAmountï¼ |
| | | # ä¾åºå徿¥å party_type=2 and direction=2 ä½ä¸ºã仿¬¾ãåï¼è¿ååæ®µ paymentRecordAmountï¼ |
| | | # 注æï¼direction å弿页é¢åºå®ï¼ä¸è¦æä¸é¢ §æ¹å çåé¢ï¼1仿¬¾ 2忬¾ï¼å»é |
| | | # åä½å徿¥å party_type=3 and direction=1 ä½ä¸ºã已仿¬¾ãå |
| | | drop table if exists payment_record; |
| | | create table payment_record |
| | | ( |
| | | id bigint auto_increment primary key, |
| | | party_type tinyint not null comment '徿¥æ¹ç±»å 1å®¢æ· 2ä¾åºå', |
| | | party_type tinyint not null comment '徿¥æ¹ç±»å 1å®¢æ· 2ä¾åºå 3åä½å', |
| | | party_id bigint not null comment '客æ·idæä¾åºåid', |
| | | direction tinyint not null comment 'æ¹å 1仿¬¾ 2忬¾', |
| | | amount decimal(18, 2) not null default 0 comment 'éé¢', |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | #å§å¤ç®¡ç èåèæ¬ |
| | | #å端页é¢è·¯å¾çº¦å®ï¼outsourcingManagement/{partner|order|transactions}/index |
| | | #sys_menu å±äºç§æ·å¿½ç¥è¡¨ï¼æ é tenant_id |
| | | #说æï¼æ¾å¼æå® menu_idï¼å½ååº sys_menu æå¤§ id 为 2355ï¼ï¼å¯é夿§è¡ |
| | | |
| | | #å
æ¸
çæ§æ°æ®ï¼ä¿è¯èæ¬å¯é夿§è¡ |
| | | delete from sys_menu where menu_id between 2360 and 2380; |
| | | |
| | | #1. ç®å½ï¼å§å¤ç®¡ç |
| | | insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) |
| | | values (2360, 'å§å¤ç®¡ç', 0, 6, 'outsourcingManagement', null, 1, 0, 'M', '0', '0', '', 'shopping', 'admin', sysdate(), '', null, 'å§å¤ç®¡çç®å½'); |
| | | |
| | | #2. åä½åæ¡£æ¡ |
| | | insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) |
| | | values (2361, 'åä½åæ¡£æ¡', 2360, 1, 'partner', 'outsourcingManagement/partner/index', 1, 0, 'C', '0', '0', 'outsourcing:partner:list', '#', 'admin', sysdate(), '', null, 'åä½åæ¡£æ¡èå'); |
| | | insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) |
| | | values (2362, 'åä½åæ¡£æ¡æ¥è¯¢', 2361, 1, '#', '', 1, 0, 'F', '0', '0', 'outsourcing:partner:query', '#', 'admin', sysdate(), '', null, ''); |
| | | insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) |
| | | values (2363, 'åä½åæ¡£æ¡æ°å¢', 2361, 2, '#', '', 1, 0, 'F', '0', '0', 'outsourcing:partner:add', '#', 'admin', sysdate(), '', null, ''); |
| | | insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) |
| | | values (2364, 'åä½åæ¡£æ¡ä¿®æ¹', 2361, 3, '#', '', 1, 0, 'F', '0', '0', 'outsourcing:partner:edit', '#', 'admin', sysdate(), '', null, ''); |
| | | insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) |
| | | values (2365, 'åä½åæ¡£æ¡å é¤', 2361, 4, '#', '', 1, 0, 'F', '0', '0', 'outsourcing:partner:remove', '#', 'admin', sysdate(), '', null, ''); |
| | | insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) |
| | | values (2366, 'åä½åæ¡£æ¡å¯¼åº', 2361, 5, '#', '', 1, 0, 'F', '0', '0', 'outsourcing:partner:export', '#', 'admin', sysdate(), '', null, ''); |
| | | insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) |
| | | values (2367, 'åä½åæ¡£æ¡å¯¼å
¥', 2361, 6, '#', '', 1, 0, 'F', '0', '0', 'outsourcing:partner:import', '#', 'admin', sysdate(), '', null, ''); |
| | | |
| | | #3. å§å¤è®¢å |
| | | insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) |
| | | values (2368, 'å§å¤è®¢å', 2360, 2, 'order', 'outsourcingManagement/order/index', 1, 0, 'C', '0', '0', 'outsourcing:order:list', '#', 'admin', sysdate(), '', null, 'å§å¤è®¢åèå'); |
| | | insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) |
| | | values (2369, 'å§å¤è®¢åæ¥è¯¢', 2368, 1, '#', '', 1, 0, 'F', '0', '0', 'outsourcing:order:query', '#', 'admin', sysdate(), '', null, ''); |
| | | insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) |
| | | values (2370, 'å§å¤è®¢åæ°å¢', 2368, 2, '#', '', 1, 0, 'F', '0', '0', 'outsourcing:order:add', '#', 'admin', sysdate(), '', null, ''); |
| | | insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) |
| | | values (2371, 'å§å¤è®¢åä¿®æ¹', 2368, 3, '#', '', 1, 0, 'F', '0', '0', 'outsourcing:order:edit', '#', 'admin', sysdate(), '', null, ''); |
| | | insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) |
| | | values (2372, 'å§å¤è®¢åå é¤', 2368, 4, '#', '', 1, 0, 'F', '0', '0', 'outsourcing:order:remove', '#', 'admin', sysdate(), '', null, ''); |
| | | insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) |
| | | values (2373, 'å§å¤è®¢å导åº', 2368, 5, '#', '', 1, 0, 'F', '0', '0', 'outsourcing:order:export', '#', 'admin', sysdate(), '', null, ''); |
| | | |
| | | #4. åä½å徿¥ |
| | | insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) |
| | | values (2374, 'åä½å徿¥', 2360, 3, 'transactions', 'outsourcingManagement/transactions/index', 1, 0, 'C', '0', '0', 'outsourcing:report:list', '#', 'admin', sysdate(), '', null, 'åä½å徿¥èå'); |
| | | insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) |
| | | values (2375, 'åä½å徿¥æ¥è¯¢', 2374, 1, '#', '', 1, 0, 'F', '0', '0', 'outsourcing:report:query', '#', 'admin', sysdate(), '', null, ''); |
| | | insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) |
| | | values (2376, 'åä½å徿¥ä»æ¬¾', 2374, 2, '#', '', 1, 0, 'F', '0', '0', 'outsourcing:report:pay', '#', 'admin', sysdate(), '', null, ''); |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | #ä¿¡æåºé + éå®å°è´¦ç±»ååºåï¼åæ²¹/代å¨ï¼+ éå®å°è´¦å®¡æ¹ |
| | | #对åºéæ±ï¼éæ±æ¸
å第 5 æ¡ãå®¢æ·æ¡£æ¡å ä¿¡æåºéåæ®µï¼è·ä»£å¨éé¢èå¨ï¼ãã |
| | | # 第 6 æ¡ãéå®å°è´¦åºååæ²¹/ååå¨ä½ç½®ï¼æ¥å·²æ OA å®¡æ¹æµç¨ï¼ååéé¢è¶
ä¿¡æåºéè¦æ 红æéã |
| | | #ç®æ åºï¼product-inventory-management-rbhb |
| | | #说æï¼çº¯æ°å¢åï¼ä¸æ¹å¨ä»»ä½æ¢æå |
| | | |
| | | #1. 客æ·ä¿¡æåºé |
| | | alter table customer |
| | | add column trust_fund decimal(16, 2) null comment 'ä¿¡æåºé(å
)'; |
| | | |
| | | #2. éå®å°è´¦ï¼ç±»ååºå + 代å¨çæ²¹åº/å¨ç½ + 审æ¹ç¶æ |
| | | alter table sales_ledger |
| | | add column ledger_type varchar(20) null comment 'éå®ç±»åï¼åæ²¹/代å¨' after customer_name, |
| | | add column oil_depot_id bigint null comment 'æ²¹åºidï¼oil_depot.idï¼ï¼ç±»å=代卿¶ä½¿ç¨' after ledger_type, |
| | | add column oil_depot_name varchar(100) null comment 'æ²¹åºåç§°' after oil_depot_id, |
| | | add column tank_id bigint null comment 'å¨ç½idï¼tank_info.idï¼ï¼ç±»å=代卿¶ä½¿ç¨' after oil_depot_name, |
| | | add column tank_no varchar(50) null comment 'å¨ç½å·' after tank_id, |
| | | add column approval_status varchar(20) null comment '审æ¹ç¶æï¼å¾
审æ¹/å®¡æ ¸ä¸/éè¿/æç»' after tank_no; |
| | | |
| | | #3. åéå°è´¦åå¡«ä¸ºåæ²¹ï¼åé齿¯èµ°äº§åæç»çéå®åï¼åå²åæ®ä¸è¡¥å®¡ï¼approval_status çç©ºï¼ |
| | | update sales_ledger set ledger_type = 'åæ²¹' where ledger_type is null; |
| | | |
| | | #4. éå®å°è´¦å®¡æ¹æ¨¡æ¿ï¼æå·²æ OA 审æ¹å¼æï¼business_type=19 为空é²å¼ï¼å®¡æ¹äºº éæ¹ä¿ ä¸æ¥ä»·å®¡æ¹æ¨¡æ¿ä¸è´ï¼ |
| | | insert into approval_template (template_name, enabled, description, template_type, business_type, deleted) |
| | | values ('éå®å°è´¦å®¡æ¹', 1, 'éå®å°è´¦ï¼å«ä»£å¨ï¼æäº¤åèµ° OA 审æ¹', 1, 19, 0); |
| | | |
| | | set @tid = last_insert_id(); |
| | | |
| | | insert into approval_template_node (template_id, level_no, approve_type) |
| | | values (@tid, 1, 'AND'); |
| | | |
| | | set @nid = last_insert_id(); |
| | | |
| | | insert into approval_template_node_approver (node_id, template_id, approver_id, approver_name, sort_no, deleted) |
| | | values (@nid, @tid, 323, 'éæ¹ä¿', 1, 0); |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | #车è¾ä¸»æ°æ® + åºåºæ®æ²¹ |
| | | #对åºéæ±ï¼éæ±æ¸
å第 7 æ¡ãç»è½¦è¾åå¯ä¸æ è¯â¦è®°å½æ¯æ¬¡æåéå®è´§åå©ä½çæ²¹éï¼ä¸æ¬¡åè´§ä¸ºä¸æ¬¡å©ä½é+åºåéã |
| | | #ç®æ åºï¼product-inventory-management-rbhb |
| | | #说æï¼çº¯æ°å¢ï¼ä¸æ¹å¨ä»»ä½æ¢æåï¼å¯é夿§è¡æ¶è¯·å
夿æ¯å¦åå¨ |
| | | |
| | | #1. 车è¾ä¿¡æ¯è¡¨ |
| | | create table vehicle |
| | | ( |
| | | id bigint not null auto_increment comment '车è¾id', |
| | | plate_number varchar(20) not null comment '车çå·ï¼è½¦è¾å¯ä¸æ è¯ï¼', |
| | | driver_name varchar(50) null comment 'é»è®¤å¸æº', |
| | | driver_phone varchar(20) null comment '叿ºçµè¯', |
| | | load_capacity decimal(16, 4) null comment 'æ ¸å®è½½é(å¨)', |
| | | status varchar(20) null default 'å¯ç¨' comment 'ç¶æï¼å¯ç¨/åç¨', |
| | | remark varchar(255) null comment '夿³¨', |
| | | create_time datetime null comment 'å建æ¶é´', |
| | | create_user bigint null comment 'å建人', |
| | | update_time datetime null comment 'æ´æ°æ¶é´', |
| | | update_user bigint null comment 'æ´æ°äºº', |
| | | tenant_id bigint null comment 'ç§æ·id', |
| | | dept_id bigint null comment 'é¨é¨id', |
| | | primary key (id), |
| | | unique key uk_plate_number (plate_number) |
| | | ) engine = InnoDB |
| | | default charset = utf8mb4 |
| | | row_format = DYNAMIC comment ='车è¾ä¿¡æ¯è¡¨'; |
| | | |
| | | #2. åºåºè®°å½ï¼è½¦è¾ + æ®æ²¹ + å®é
æ£åé |
| | | alter table stock_out_record |
| | | add column vehicle_id bigint null comment '车è¾IDï¼vehicle.idï¼' after truck_plate_no, |
| | | add column residual_oil decimal(16, 4) null comment 'æ¬æ¬¡éå®è´§åå©ä½æ²¹é(å¨)' after vehicle_id, |
| | | add column deduct_quantity decimal(16, 4) null comment '审æ¹éè¿æ¶å®é
ä»åºåæ£åçæ°é(=åºåºæ°é-䏿¬¡å©ä½æ²¹é)' after residual_oil; |
| | | |
| | | #3. èåï¼2026-09-20 å·²å¨å¼ååºæ§è¡ï¼menu_id=2377ï¼ |
| | | #注æï¼åç«¯é¡µé¢ src/views/basicData/vehicle/index.vue å°æªå建ï¼ç¹è¿å»ææ¶æ¯ 404ï¼é¡µé¢å好å³èªå¨å¯ç¨ |
| | | insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, remark) |
| | | values ('车è¾ä¿¡æ¯', 2000, 4, 'vehicle', 'basicData/vehicle/index', 1, 0, 'C', 0, 0, '', '#', 'admin', now(), ''); |
| | | |
| | | #3.1 èåææï¼ä¸åçº§çæ²¹åºä¿¡æ¯/å¨ç½ä¿¡æ¯ä¿æä¸è´ï¼ææç»ãææ¯è´¨éãè§è²ï¼role_id=2ï¼ |
| | | insert into sys_role_menu (role_id, menu_id) |
| | | select 2, menu_id from sys_menu where menu_name = '车è¾ä¿¡æ¯' and parent_id = 2000; |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | # ä¿¡æåºéä¸éå®å°è´¦ç±»å/代å¨/å®¡æ¹ å端èè°ææ¡£ |
| | | |
| | | æ´æ°æ¶é´ï¼2026-09-20 |
| | | éç¨çæ¬ï¼æ¬æ¬¡åç«¯åæ´å |
| | | 对åºéæ±ï¼éæ±æ¸
å第 5 æ¡ + 第 6 æ¡ |
| | | |
| | | - **第 5 æ¡ï¼å®¢æ·æ¡£æ¡ï¼**ï¼ä»£å¨åéå®åå¼ä¸¤ä¸ªé¡µé¢ï¼å ä¸ä¸ª**ä¿¡æåºé**åæ®µï¼è¦è·**代å¨éé¢**èå¨ï¼è¶
è¿ç¸åºéé¢è¦åæéï¼ã |
| | | - **第 6 æ¡ï¼é宿¥ä»·/éå®å°è´¦ï¼**ï¼ |
| | | 1. 两ç§ç±»åï¼**åæ²¹** / **ååå¨ä½ç½®**ãéå®ç±»å«åï¼å油就æ¯é以åç产å大类åè§æ ¼åå·ï¼ååå¨ä½ç½®å°±é**æ²¹åºåå¨ç½**ã |
| | | 2. **å å
¥éå®å®¡æ¹æµç¨**ï¼= æ¥ç³»ç»**å·²æ OA 审æ¹**ï¼ä¸æ¯æ°åä¸å¥ï¼ã |
| | | 3. è¦è·å®¢æ·ç**ä¿¡æåºé**åæ®µèå¨ï¼**ååéé¢è¶
è¿ä¿¡æåºéè¦åæ 红æé**ï¼ç¸åºç**å®¡æ¹æµç¨ä¹è¦ååºæéåç¼**ã |
| | | |
| | | **ä¸å¥è¯å£å¾**ï¼ |
| | | |
| | | - å°è´¦å两类 ââ **åæ²¹**ï¼èµ°äº§åæç»ï¼ååéé¢ç±æç»æ±æ»ï¼å以å䏿 ·ï¼**代å¨**ï¼ååå¨ä½ç½®ï¼**没æäº§åæç»**ï¼é**æ²¹åº + å¨ç½**å¹¶**æå·¥å¡«ååéé¢**ã |
| | | - å°è´¦**ä¿ååç«å³åèµ· OA 审æ¹**ï¼æ°å¢ãä¿®æ¹é½åï¼ï¼å®¡æ¹ç»æåªååå°è´¦ä¸ç**审æ¹ç¶æ**ã |
| | | - æ¬ç¬ååéé¢ > 该客æ·ä¿¡æåºé â å°è´¦å表è¡**æ 红**ï¼å端ç»å¸å°ï¼å端æè²ï¼+ 审æ¹**æ é¢**带æéåç¼ã |
| | | |
| | | --- |
| | | |
| | | ## 1. åæ´èå´ |
| | | |
| | | | å
容 | å½±åé¢ | |
| | | | --- | --- | |
| | | | `customer` å `trust_fund` | å®¢æ·æ¡£æ¡æ°å¢/ä¿®æ¹è¡¨åã客æ·å表ãå¯¼åº | |
| | | | å®¢æ·æ¥å£è¿å代å¨éé¢ä¸è¶
éæ è®° | å®¢æ·æ¡£æ¡å表ã客æ·è¯¦æ
| |
| | | | `sales_ledger` å 6 å + `ledgerType` å¿
å¡« | éå®å°è´¦æ°å¢/ä¿®æ¹è¡¨åï¼**ç ´åæ§ï¼è§ 3.4**ï¼ | |
| | | | å°è´¦ä¿ååèªå¨èµ° OA å®¡æ¹ | éå®å°è´¦ä¿åæé®ï¼å®¡æ¹ä¸å¿å表 | |
| | | | å°è´¦å表/详æ
/å¯¼åºæ°å¢å段 | éå®å°è´¦å表ãå¯¼åº Excel | |
| | | | `ledgerType` / `approvalStatus` æ¯æçé | åæ²¹ã代å¨**两个页é¢çæå**é å®å®ç° | |
| | | |
| | | > æ¬ä»åºæ¯**å端ä»åº**ï¼åç«¯å¨ `D:/ç马/åé/å端/product-inventory-management`ï¼æ¬ææ¡£åªæè¿°å端已就绪çè½åã |
| | | > **第 5 æ¡ã代å¨åéå®åå¼ä¸¤ä¸ªé¡µé¢ãç±å端æ**ï¼åç«¯ä¸æ°å¢å表æ¥å£ï¼é åä¸ä¸ª `/sales/ledger/listPage` ä¼ `ledgerType` åºåã |
| | | |
| | | --- |
| | | |
| | | ## 2. åç½®ï¼DDL ä¸å®¡æ¹æ¨¡æ¿å·²æ§è¡ |
| | | |
| | | æä»¶ï¼`doc/20260920_trust_fund_and_deposit_ledger.sql`ï¼**å·²äº 2026-09-20 å¨å¼ååº `product-inventory-management-rbhb` æ§è¡å®æ¯**ï¼å
¶ä»ç¯å¢ä¸çº¿æå䏿件æ§è¡å³å¯ã |
| | | |
| | | æ§è¡å
容ï¼çº¯æ°å¢åï¼ä¸æ¹å¨æ¢æåï¼ï¼ |
| | | |
| | | | 表 | åæ´ | |
| | | | --- | --- | |
| | | | `customer` | æ°å¢ `trust_fund decimal(16,2)` ââ ä¿¡æåºé(å
) | |
| | | | `sales_ledger` | æ°å¢ `ledger_type`(varchar20)ã`oil_depot_id`(bigint)ã`oil_depot_name`(varchar100)ã`tank_id`(bigint)ã`tank_no`(varchar50)ã`approval_status`(varchar20) | |
| | | | `sales_ledger` åéæ°æ® | 3 æ¡åå²å°è´¦åå¡« `ledger_type='åæ²¹'`ï¼`approval_status` ç空ï¼åå²åæ®ä¸è¡¥å®¡ï¼ | |
| | | | `approval_template` ç 3 å¼ è¡¨ | seed åº `business_type=19` çãéå®å°è´¦å®¡æ¹ã模æ¿ï¼å®¡æ¹äºº **éæ¹ä¿**ï¼ | |
| | | |
| | | **å·²æ ¸å¯¹ç»æ**ï¼æ¨¡æ¿ `id=65`ãéå®å°è´¦å®¡æ¹ã`enabled=1`ã`template_type=1`ã`business_type=19`ï¼èç¹ `id=95` `level_no=1` `approve_type=AND`ï¼å®¡æ¹äºº `323 éæ¹ä¿`ã |
| | | |
| | | > **DDL æªæ§è¡å**ï¼å°è´¦çæ°å¢/ä¿®æ¹ä¼ç´æ¥æ¥ `Unknown column 'ledger_type'`ã |
| | | |
| | | --- |
| | | |
| | | ## 3. éå®å°è´¦ï¼ç±»ååºåï¼ç¬¬ 6 æ¡ 1ï¼ |
| | | |
| | | ### 3.1 æ°å¢çåæ®µ |
| | | |
| | | | åæ®µ | ç±»å | 说æ | |
| | | | --- | --- | --- | |
| | | | `ledgerType` | String | **å¿
å¡«**ï¼åªè½æ¯ `åæ²¹` / `代å¨` | |
| | | | `oilDepotId` | Long | æ²¹åº idï¼**代å¨å¿
å¡«** | |
| | | | `oilDepotName` | String | æ²¹åºåç§°ï¼**å端æ id 忥ï¼ä¸éä¿¡åç«¯ä¼ å¼** | |
| | | | `tankId` | Long | å¨ç½ idï¼**代å¨å¿
å¡«** | |
| | | | `tankNo` | String | å¨ç½å·ï¼**åä¸ï¼åç«¯åæ¥** | |
| | | | `contractAmount` | BigDecimal | ååéé¢(å
)ã**代å¨å¿
å¡«ä¸ > 0**ï¼åæ²¹ä¸ç¨ä¼ | |
| | | | `approvalStatus` | String | 审æ¹ç¶æï¼**å端维æ¤ï¼å端ä¸è¦ä¼ ** | |
| | | |
| | | > â ï¸ **`ledgerType` æ¯æ°å段ï¼ä¸è¦å表åéå·²æç `type` æ··ç¨**ã`type` æ¯**产åæç»è¡**çç±»åï¼1éå®/2éè´/3项ç®ï¼ï¼å端表åéå·²æçé£ä¸ª `type` ä¿æåæ ·ä¼ ï¼ä¸è¦æ¹æ `ledgerType`ã |
| | | |
| | | ### 3.2 åæ²¹ï¼åæ¹é ååºæ¬ä¸è´ï¼ |
| | | |
| | | ```json |
| | | POST /sales/ledger/addOrUpdateSalesLedger |
| | | { |
| | | "ledgerType": "åæ²¹", |
| | | "customerId": 88, |
| | | "entryDate": "2026-09-20", |
| | | "type": 1, |
| | | "productData": [ |
| | | { "productId": 12, "productModelId": 407, "quantity": 10, "taxInclusiveUnitPrice": 5000, "taxInclusiveTotalPrice": 50000, "taxRate": 13, "unit": "å¨" } |
| | | ] |
| | | } |
| | | ``` |
| | | |
| | | - ååéé¢ï¼`contractAmount`ï¼**ç±äº§åæç»èªå¨æ±æ»**ï¼åç«¯ä¼ äºä¹ä¼è¢«è¦çï¼**åæ²¹è¡¨åä¸è¦æ¾ãååéé¢ãè¾å
¥æ¡** |
| | | - åç«¯ä¼ææ²¹åº/å¨ç½/审æ¹ç¶æä¹å¤ç代å¨å段æ¸
空 |
| | | |
| | | ### 3.3 代å¨ï¼ååå¨ä½ç½®ï¼ |
| | | |
| | | ```json |
| | | POST /sales/ledger/addOrUpdateSalesLedger |
| | | { |
| | | "ledgerType": "代å¨", |
| | | "customerId": 88, |
| | | "entryDate": "2026-09-20", |
| | | "oilDepotId": 1, |
| | | "tankId": 3, |
| | | "contractAmount": 100000 |
| | | } |
| | | ``` |
| | | |
| | | - **ä¸è¦ä¼ `productData`**ï¼ä»£å¨æ²¡æäº§åæç»ï¼å°±ç®ä¼ äºå端ä¹ä¼å¿½ç¥ï¼é¿å
æç»æ±æ»è¦çæå·¥å¡«çååéé¢ï¼ |
| | | - **ååéé¢å¿
é¡»å端æå·¥å¡«**ï¼å端ä¸ä¼ç® |
| | | - æ²¹åºä¸æååºç¡æ°æ®çæ²¹åºå表ï¼å¨ç½ä¸æåå¨ç½å表ï¼å¨ç½**䏿卿²¹åºä¸**ï¼ä¸¤ä¸ªä¸æäºç¸ç¬ç«ï¼ |
| | | |
| | | ### 3.4 â ï¸ è¿æ¯ç ´åæ§åæ´ï¼å端å¿
é¡»å
æ¹ |
| | | |
| | | `ledgerType` æ¯**å¿
å¡«**ã**å端没æ¹ä¹åï¼ç°æçéå®å°è´¦æ°å¢/ä¿®æ¹ä¼ç´æ¥å¤±è´¥**ï¼ |
| | | |
| | | ```json |
| | | { "code": 500, "msg": "éå®ç±»åä¸è½ä¸ºç©º", "data": null } |
| | | ``` |
| | | |
| | | æä»¥ä¸çº¿é¡ºåºï¼**å端å
å ãéå®ç±»åãåéå¹¶æäº¤ `ledgerType` â åæ¾é**ã |
| | | ï¼å端已æ**æ¨¡ææ°æ®çæ**è¿ç±»å
é¨è°ç¨ç¹è¡¥æ `åæ²¹`ï¼ä¸åå½±åãï¼ |
| | | |
| | | --- |
| | | |
| | | ## 4. ä¿¡æåºéèå¨ï¼ç¬¬ 5 æ¡ + 第 6 æ¡ 3ï¼ |
| | | |
| | | ### 4.1 å®¢æ·æ¡£æ¡ï¼åå
¥ä¿¡æåºé |
| | | |
| | | `/basic/customer/addCustomer`ã`/basic/customer/updateCustomer` æ¶çå°±æ¯å®¢æ·å¯¹è±¡ï¼**ç´æ¥å¤ä¼ ä¸ä¸ª `trustFund` å³å¯**ï¼ä¸ç¨æ°æ¥å£ï¼ |
| | | |
| | | ```json |
| | | POST /basic/customer/updateCustomer |
| | | { "id": 88, "customerName": "ææåå·¥", "trustFund": 200000 } |
| | | ``` |
| | | |
| | | - åä½ï¼å
ï¼**å¯ä»¥ä¸ºç©º**ï¼ä¸ºç©ºåä¸å任使éï¼åè½éé»å¯ç¨ï¼ |
| | | - 客æ·åè¡¨å¯¼åº Excel æ°å¢ãä¿¡æåºéãå |
| | | |
| | | ### 4.2 客æ·å表/详æ
ï¼è¿å代å¨éé¢ä¸è¶
éæ è®° |
| | | |
| | | `GET /basic/customer/list`ï¼`data.records`ï¼å `GET /basic/customer/{id}`ï¼`data`ï¼çæ¯è¡**æ°å¢ä¸¤ä¸ªåªè¯»å段**ï¼ |
| | | |
| | | | åæ®µ | 说æ | |
| | | | --- | --- | |
| | | | `depositTotalAmount` | 该客æ·**代å¨éé¢å计** = 该客æ·**ææ `ledger_type='代å¨'` å°è´¦çååéé¢ä¹å**ï¼æ è®°å½è¿å `0`ï¼ | |
| | | | `exceedsTrustFund` | `depositTotalAmount > trustFund` æ¶ä¸º `true`ï¼`trustFund` ä¸ºç©ºæ¶æä¸º `false` | |
| | | |
| | | ```json |
| | | // GET /basic/customer/88 |
| | | { "code": 200, "msg": "æä½æå", |
| | | "data": { "id": 88, "customerName": "ææåå·¥", "trustFund": 200000.00, |
| | | "depositTotalAmount": 260000.00, "exceedsTrustFund": true } } |
| | | ``` |
| | | |
| | | > **两个å£å¾ä¸è¦ææ··**ï¼ |
| | | > - å®¢æ·æ¡£æ¡ä¸ç `exceedsTrustFund` æ¯çæ¯ **代å¨éé¢å计**ï¼ææä»£å¨åå æ»ï¼â å®¢æ·æ¡£æ¡é¡µæé |
| | | > - å°è´¦å表ä¸ç `exceedsTrustFund` æ¯çæ¯ **æ¬ç¬ååéé¢**ï¼åç¬ï¼â å°è´¦åè¡¨è¡æ 红 |
| | | > |
| | | > 代å¨éé¢å计æ¯**è·¨å®¢æ·æ±æ»**ï¼å端已æ¾å¼è·³è¿æ°æ®æéï¼çå°çå§ç»æ¯**å
¨é**éé¢ï¼å¦åæ°æ®èå´åéçè´¦å·ä¼å°ç®ãæ¼æ¥è¶
éï¼ã |
| | | |
| | | ### 4.3 å°è´¦åè¡¨ï¼æ¬ç¬è¶
éæ çº¢ |
| | | |
| | | `GET /sales/ledger/listPage`ã`GET /sales/ledger/list`ãå¯¼åº Excel çæ¯è¡**æ°å¢ä¸¤ä¸ªåªè¯»å段**ï¼ |
| | | |
| | | | åæ®µ | 说æ | |
| | | | --- | --- | |
| | | | `trustFund` | 该客æ·çä¿¡æåºéï¼å®¢æ·æ²¡å¡«å为 `null`ï¼ | |
| | | | `exceedsTrustFund` | **æ¬ç¬** `contractAmount > trustFund` æ¶ä¸º `true` | |
| | | |
| | | **è§å**ï¼**åç¬è¶
å°±æ 红**ââåªè¦è¿ä¸ç¬çååéé¢è¶
è¿è¯¥å®¢æ·çä¿¡æåºéï¼è¿ä¸è¡å°±æ 红ï¼`trustFund` 为 `null` æ¶**䏿 红**ã |
| | | |
| | | å±ç¤ºå»ºè®®ï¼`exceedsTrustFund === true` æ¶æ**ååéé¢**ï¼ææ´è¡ï¼æ 红ï¼å¹¶å tooltipï¼`ååéé¢å·²è¶
åºè¯¥å®¢æ·ä¿¡æåºéï¼ä¿¡æåºéï¼200000ï¼`ã |
| | | |
| | | > ç¼è¾è¡¨åéç宿¶é¢è§ï¼éä¸å®¢æ·åè° `GET /basic/customer/{id}` æ¿ `trustFund`ï¼åè¾å
¥çååé颿¬å°æ¯è¾å³å¯ï¼ä¸éè¦æ°æ¥å£ã |
| | | |
| | | --- |
| | | |
| | | ## 5. 审æ¹ï¼æ¥å·²æ OA 审æ¹å¼æï¼ç¬¬ 6 æ¡ 2ï¼ |
| | | |
| | | ### 5.1 åèµ·æ¶æº |
| | | |
| | | **å°è´¦ä¿åæ¥å£ `POST /sales/ledger/addOrUpdateSalesLedger` å
é¨èªå¨åèµ·**ï¼å端ä¸ç¨è°å®¡æ¹æ¥å£ï¼ |
| | | |
| | | - **æ°å¢**ï¼insert å°è´¦ â ç¶æç½® `å¾
审æ¹` â å起审æ¹å®ä¾ |
| | | - **ä¿®æ¹**ï¼æè¯¥å°è´¦**æ¤åæªç»æç审æ¹å®ä¾ä½åº**ï¼ç½® `REJECTED`ï¼â ç¶æå `å¾
审æ¹` â éæ°åèµ· |
| | | - â ï¸ **注æï¼æ¹ä¸ªå¤æ³¨ä¹ä¼éæ°èµ°ä¸é审æ¹**ï¼æ²¿ç¨æ¥ä»·åçæ¢æè¡ä¸ºï¼ |
| | | |
| | | å°è´¦ä¸ç `approvalStatus` åå¼ï¼ |
| | | |
| | | | å¼ | å«ä¹ | |
| | | | --- | --- | |
| | | | `å¾
审æ¹` | åæäº¤ï¼çå¾
审æ¹äººå¤ç | |
| | | | `å®¡æ ¸ä¸` | å¤çº§æµç¨æµè½¬ä¸ï¼æ¬æ¬¡æ¨¡æ¿åªæ 1 级ï¼å®é
è§å°çä¸å¤ï¼ | |
| | | | `éè¿` | 审æ¹éè¿ | |
| | | | `æç»` | 被驳å | |
| | | | `null` | åå²åæ®ï¼æ¬æ¬¡æ¹é åç 3 æ¡ï¼ï¼ä¸è¡¥å®¡ | |
| | | |
| | | > **审æ¹éè¿åªååç¶æ**ï¼ä¸éå®åæ®ãä¸çæä¸æ¸¸åæ®ãä¸å¨åºåãéè¿åçå°è´¦**ä»ç¶å¯ä»¥ç¼è¾**ï¼ç¼è¾ä¼å次触å审æ¹ã |
| | | |
| | | ### 5.2 è¶
éæ¶çå®¡æ¹æéåç¼ |
| | | |
| | | 审æ¹å®ä¾ç**æ é¢**æ¿è½½æéï¼ |
| | | |
| | | - æªè¶
éï¼`HT20260920001审æ¹` |
| | | - å·²è¶
éï¼`HT20260920001审æ¹ï¼ååéé¢è¶
åºå®¢æ·ä¿¡æåºéï¼è¯·éç¹å®¡æ ¸ï¼` |
| | | |
| | | æä»¥å®¡æ¹ä¸å¿å表éï¼å®¡æ¹äºº**ä¸ç¼å°±è½çåºè¿åéé¢è¶
äº**ï¼å端**ä¸éè¦é¢å¤å¤ç**ï¼ç´æ¥æ `title` åæ ·å±ç¤ºå³å¯ã |
| | | |
| | | ### 5.3 审æ¹ä¸å¿ï¼å端已æé¡µé¢ï¼åªéç¥éè¿ä¸¤ç¹ï¼ |
| | | |
| | | - 审æ¹å®ä¾å表 `GET /approvalInstance/listPage` é `businessType=19` çè®°å½ï¼**æ°å¢è¿å `salesContractNo`**ï¼éå®ååå·ï¼ï¼ä¸å·²æç `quotationNo`ï¼æ¥ä»·åå·ï¼ã`purchaseContractNumber`ï¼éè´åå·ï¼ã`shippingNo`ï¼åè´§åå·ï¼å¹¶å |
| | | - 审æ¹å¨ä½èµ°å·²æç `POST /approvalInstance/approve`ï¼ |
| | | |
| | | ```json |
| | | { "id": 1234, "approveAction": "APPROVED", "approveComment": "åæ" } |
| | | ``` |
| | | |
| | | ï¼`approveAction` åªæ¯æ `APPROVED` / `REJECTED`ï¼ |
| | | |
| | | ### 5.4 å é¤å°è´¦ |
| | | |
| | | `DELETE /sales/ledger/delLedger`ï¼body 为 id æ°ç»ï¼**ä¼èªå¨æ¸
æè¯¥å°è´¦å¯¹åºç审æ¹å®ä¾**ï¼åä¸å°è´¦åå¤æäº¤å¯è½æå¤æ¡ï¼ï¼å端ä¸ç¨ç®¡ã |
| | | |
| | | --- |
| | | |
| | | ## 6. å°è´¦å表æ°å¢å段ä¸çé |
| | | |
| | | ### 6.1 è¿åç»æï¼æ³¨æä¸¤ä¸ªæ¥å£çå
è£
ä¸åï¼ |
| | | |
| | | | æ¥å£ | è¿å | |
| | | | --- | --- | |
| | | | `GET /sales/ledger/listPage` | **ç´æ¥è¿å `IPage`**ï¼`{ "records": [...], "total": 12, "size": 10, "current": 1, ... }`ï¼**没æ `code`/`msg` å¤å±** | |
| | | | `GET /sales/ledger/list` | `TableDataInfo`ï¼`{ "total": 12, "rows": [...], "code": 200, "msg": "æ¥è¯¢æå" }` | |
| | | |
| | | åé¡µåæ°æ²¿ç¨å¹³å°çº¦å®ï¼`pageNum` / `pageSize`ã |
| | | |
| | | ### 6.2 æ¯è¡æ°å¢å段 |
| | | |
| | | `ledgerType`ã`oilDepotId`ã`oilDepotName`ã`tankId`ã`tankNo`ã`approvalStatus`ã`trustFund`ã`exceedsTrustFund`ã |
| | | |
| | | å¯¼åº Excelï¼`POST /sales/ledger/export`ï¼æ°å¢åï¼**éå®ç±»åãæ²¹åºãå¨ç½å·ã审æ¹ç¶æã客æ·ä¿¡æåºé**ã |
| | | |
| | | ### 6.3 æ°å¢ä¸¤ä¸ªæ¥è¯¢æ¡ä»¶ï¼ç¬¬ 5 æ¡ãåå¼ä¸¤ä¸ªé¡µé¢ãçåç«¯æ¯æï¼ |
| | | |
| | | | åæ° | 说æ | |
| | | | --- | --- | |
| | | | `ledgerType` | `åæ²¹` / `代å¨`ï¼ç²¾ç¡®å¹é
| |
| | | | `approvalStatus` | `å¾
审æ¹` / `å®¡æ ¸ä¸` / `éè¿` / `æç»`ï¼ç²¾ç¡®å¹é
| |
| | | |
| | | **å»ºè®®åæ³**ï¼å端ææãéå®å°è´¦ãåã代å¨å°è´¦ã两个页é¢ï¼æä¸ä¸ªé¡µé¢ç两个页ç¾ï¼ï¼åèªåºå®å¸¦ `ledgerType='åæ²¹'` / `'代å¨'` è°**åä¸ä¸ª** `/sales/ledger/listPage`ï¼å端ä¸ç¨æ°å¢å表æ¥å£ã两个页é¢ç**æ°å¢è¡¨åä¹æç±»ååºå**ï¼å油页æ¾äº§åæç»è¡¨æ ¼ï¼ä»£å¨é¡µæ¾ãæ²¹åº + å¨ç½ + ååéé¢ãã |
| | | |
| | | --- |
| | | |
| | | ## 7. æ¥éææ¡ä¸ååºå½¢æ |
| | | |
| | | æ¬æ¬¡æ°å¢çæ ¡éªï¼ |
| | | |
| | | | åºæ¯ | æ¥é | |
| | | | --- | --- | |
| | | | æ²¡ä¼ éå®ç±»å | `éå®ç±»åä¸è½ä¸ºç©º` | |
| | | | éå®ç±»å䏿¯åæ²¹/ä»£å¨ | `éå®ç±»åä¸åæ³:xxx` | |
| | | | 代卿²¡éæ²¹åº | `代å¨å¿
é¡»éæ©æ²¹åº` | |
| | | | 代卿²¡éå¨ç½ | `代å¨å¿
须鿩å¨ç½` | |
| | | | 代卿²¡å¡«ååé颿 â¤0 | `代å¨å¿
须填åååéé¢` | |
| | | | æ²¹åº id æ¥ä¸å° | `æ²¹åºä¸åå¨:1` | |
| | | | å¨ç½ id æ¥ä¸å° | `å¨ç½ä¸åå¨:3` | |
| | | | æªé
ç½®å®¡æ¹æ¨¡æ¿ | `请å
é
ç½®éå®å°è´¦å®¡æ¹æ¨¡æ¿` | |
| | | | 审æ¹å¼ææ¥é | `审æ¹å¤±è´¥: <åå >` | |
| | | |
| | | **é误ååºå½¢æ**ï¼`BaseException` / `RuntimeException` 被å
¨å±å¼å¸¸å¤çå¨å
æ `{code:500,msg:...,data:null}`ï¼æ³¨æ **HTTP ç¶æç ä»ç¶æ¯ 200**ï¼ï¼ |
| | | |
| | | ```json |
| | | { "code": 500, "msg": "代å¨å¿
é¡»éæ©æ²¹åº", "data": null } |
| | | ``` |
| | | |
| | | æä»¥å端**å¤å¤±è´¥è¦ç `code`ï¼ä¸è½åªç HTTP ç¶æç **ï¼å¹¶ä¸è¦æ `msg` åæ ·éåºã |
| | | |
| | | > å°è´¦ä¿å失败æ¶**æ´ä¸ªäºå¡åæ»**ï¼å°è´¦ãæç»ã审æ¹å®ä¾é½ä¸ä¼çä¸åæªæ°æ®ï¼ã |
| | | |
| | | --- |
| | | |
| | | ## 8. å·²ç¥å½±å䏿³¨æç¹ |
| | | |
| | | 1. **`ledgerType` å¿
å¡«æ¯ç ´åæ§åæ´**ï¼å端ä¸å
æ¹å°±ä¼æ¥ `éå®ç±»åä¸è½ä¸ºç©º`ï¼è§ 3.4ï¼ãè¿æ¯æ¬æ¬¡å¯ä¸ç强å¶èè°é¡¹ã |
| | | 2. **åå² 3 æ¡å°è´¦**å·²å填为 `åæ²¹`ï¼`approvalStatus` 为空ï¼ä¸è¡¥å®¡ï¼ãå®ä»¬çååéé¢ã产åæç»é½ä¸åã |
| | | 3. **å®¢æ·æ²¡ç»´æ¤ `trustFund` 就䏿é**ï¼`trustFund=null` â 䏿 红ãå®¡æ¹æ é¢ä¸å¸¦æéåç¼ï¼åè½éé»å¯ç¨ï¼ä¸ä¼å 为åºç¡æ°æ®æ²¡ç»´æ¤å°±è¯¯æ¥ã |
| | | 4. **å®¡æ¹æ¨¡æ¿ç䏿é项æ¯å端硬ç¼ç ç**ï¼`/approvalTemplate` çæ°å»ºé¡µé `business_type` é项忻å¨åç«¯ãæ¬æ¬¡é seed è½äº `19`ï¼**模æ¿å表éè½çå°ä¹è½æ¹**ï¼å®¡æ¹äººãå èç¹ï¼ï¼ä½**å¦æè¦æ°å»ºä¸ä¸ª 19 çæ¨¡æ¿**ï¼å端éè¦å
å¨ä¸æéè¡¥ä¸ãéå®å°è´¦å®¡æ¹(19)ãè¿ä¸é¡¹ã |
| | | 5. **审æ¹éè¿ä¸åä»»ä½ä¸å¡å¯ä½ç¨**ï¼ä¸éåãä¸å¨åºåãä¸çæä¸æ¸¸åæ®ï¼ï¼éè¿åä»å¯ç¼è¾å¹¶å次触åå®¡æ¹ ââ è¿æ¯æéæ±ç¡®è®¤çå£å¾ã |
| | | 6. **代å¨ä¸å å¨ç½å®¹é**ï¼æ¬æ¹**没æ**åå¨ç½ä½éæ£åï¼éæ±æ²¡æï¼ï¼`tank_info` çå©ä½éä¸å 代å¨å°è´¦ååã |
| | | 7. **代å¨éé¢å计æ¯è·¨å®¢æ·çå
¨éæ±æ»**ï¼å·²è·³è¿æ°æ®æéï¼ï¼å°è´¦å表æ¬èº«**ä»åæ°æ®æé约æ**ï¼é管çåæé¨é¨/æ¬äººè¿æ»¤ï¼ââæä»¥ãå®¢æ·æ¡£æ¡ä¸çè¶
éãåãæä¸ªäººå¨å°è´¦å表éçå°çæ¡æ°ãå£å¾ä¸åï¼å±é¢æã |
| | | 8. **`ledgerType` ç¨ä¸æåé¢é**ï¼`åæ²¹`/`代å¨`ï¼ï¼ä¸åºåºåç `outCategory`ï¼`éå®`/`客å`/`代å¨`ï¼é£æ ¼ä¸è´ï¼**䏿¯ 1/2 æ°å**ã |
| | | |
| | | --- |
| | | |
| | | ## 9. åç«¯èªæ¥æ¸
å |
| | | |
| | | - [ ] DDL å·²æ§è¡ï¼`customer.trust_fund`ã`sales_ledger` ç 6 个æ°åé½å¨ï¼ |
| | | - [ ] å®¢æ·æ¡£æ¡è¡¨åæãä¿¡æåºéãè¾å
¥æ¡ï¼æ°å¢/ä¿®æ¹è½åä¸ãè½åæ¾ |
| | | - [ ] 客æ·å表è½çå°ãä¿¡æåºéãåï¼å¯¼åº Excel 乿 |
| | | - [ ] 客æ·å表/详æ
è½æ¿å° `depositTotalAmount`ã`exceedsTrustFund`ï¼è¶
éæ¶ææéï¼æ¯çæ¯**代å¨éé¢å计**ï¼ |
| | | - [ ] éå®å°è´¦æ°å¢/ä¿®æ¹è¡¨åå äºãéå®ç±»åãåéï¼**æäº¤æ¶å¸¦ `ledgerType`**ï¼å¦åæ¥ `éå®ç±»åä¸è½ä¸ºç©º`ï¼ |
| | | - [ ] éãåæ²¹ãâ æ¾ç¤ºäº§åæç»è¡¨æ ¼ï¼**䏿¾ç¤º**ãååéé¢ãè¾å
¥æ¡åæ²¹åº/å¨ç½ |
| | | - [ ] éã代å¨ãâ æ¾ç¤ºãæ²¹åº + å¨ç½ + ååéé¢ãï¼**䏿¾ç¤º**产åæç»ï¼ååéé¢å¿
å¡« |
| | | - [ ] ä»£å¨æäº¤æ¶ä¸å¸¦ `productData` |
| | | - [ ] å°è´¦å表ææåæ²¹/代å¨ä¸¤ä¸ªé¡µé¢ï¼æé¡µç¾ï¼ï¼åèªå¸¦ `ledgerType` è°åä¸ä¸ª `/sales/ledger/listPage` |
| | | - [ ] å°è´¦åè¡¨è¡ `exceedsTrustFund === true` æ¶æ çº¢ï¼æ¯çæ¯**æ¬ç¬ååéé¢**ï¼ |
| | | - [ ] å°è´¦å表è½çå°ã审æ¹ç¶æãåï¼å¹¶ä¸è½æ `approvalStatus` çé |
| | | - [ ] å°è´¦ä¿ååå°å®¡æ¹ä¸å¿è½çå° `businessType=19` çè®°å½ï¼æ é¢ä¸º `éå®ååå·+审æ¹` |
| | | - [ ] ååéé¢è¶
ä¿¡æåºéæ¶ï¼å®¡æ¹æ é¢å¸¦ãï¼ååéé¢è¶
åºå®¢æ·ä¿¡æåºéï¼è¯·éç¹å®¡æ ¸ï¼ã |
| | | - [ ] 审æ¹ä¸å¿åè¡¨è½æ¾ç¤ºå°è´¦ç `salesContractNo`ï¼éå®ååå·ï¼ |
| | | - [ ] ç¨å®¡æ¹äººè´¦å·æå°è´¦å®¡æ¹éè¿åï¼åå°è´¦å表ç `approvalStatus` åæ `éè¿`ï¼é©³åå `æç»` |
| | | - [ ] æ¥å£æ¥éå¤å®ç¨çæ¯ `code` è䏿¯ HTTP ç¶æç ï¼å¤±è´¥æ¶ HTTP 仿¯ 200ï¼ |
| | | - [ ] `/sales/ledger/listPage` åæ°æ®ç¨çæ¯é¡¶å± `records`ï¼æ²¡æ `code`/`msg` å¤å±ï¼ï¼`/sales/ledger/list` ç¨çæ¯ `rows` |
| | |
| | | |
| | | åç¼ `/basic/tankInfo`ï¼æ¥å£å½¢æä¸æ²¹åºå®å
¨ä¸è´ï¼`list` / `all` / `{id}` / `add` / `update` / `del`ï¼ã |
| | | |
| | | åæ®µï¼`id`ã`tankNo`ï¼**å¨ç½å·**ï¼å¦ `01#`ï¼ã`category`ï¼å¤§ç±»ï¼å¦ `æåæ²¹`ï¼ã`oilProduct`ï¼æ²¹åï¼å¦ `æ´#0`ï¼ã`capacity`ï¼ç½å®¹ï¼ã`remaining`ï¼åºåä½é m³ï¼ã`tenantInfo`ï¼ç§å®¢ä¿¡æ¯ï¼ã |
| | | åæ®µï¼`id`ã`tankNo`ï¼**å¨ç½å·**ï¼å¦ `01#`ï¼ã`category`ï¼å¤§ç±»ï¼å¦ `æåæ²¹`ï¼ã`oilProduct`ï¼æ²¹åï¼å¦ `æ´#0`ï¼ã`capacity`ï¼ç½å®¹ï¼ã`remaining`ï¼åºåä½é m³ï¼ã`isEnabled`ï¼æ¯å¦å¯ç¨ï¼ã`usageType`ï¼ç¨éï¼ã`tenantInfo`ï¼ç§å®¢ä¿¡æ¯ï¼ã |
| | | |
| | | **å端**ï¼å¨ç½ä¿¡æ¯è¡¨åçã大类ããæ²¹åã建议åæä¸æï¼å½ååºå
å¼ä¸º 大类=`æåæ²¹`ãæ²¹å=`æ´#0`/`æ´#-35`/`æ±½#92`/`æ±½#95`ï¼å¯ä¸äº§åè§æ ¼å£å¾å¯¹é½ååå®ï¼ã |
| | | |
| | | #### 2.2.1 æ¯å¦å¯ç¨ / ç¨é / ç§å®¢ä¿¡æ¯ï¼æ¬æ¬¡æ°å¢ï¼ |
| | | |
| | | DDL è§ `doc/20260920_add_usage_to_tank_info.sql`ã |
| | | |
| | | **åæ®µã表åèå¨ãå½ä¸åè§åãæ¥å£è¡ä¸ºååãæ ¡éªææ¡ã注æäºé¡¹ï¼è¯¦è§åç¬ææ¡£ï¼[`doc/20260920_å¨ç½å¯ç¨ä¸ç§èµä¿¡æ¯å端èè°ææ¡£.md`](./20260920_å¨ç½å¯ç¨ä¸ç§èµä¿¡æ¯å端èè°ææ¡£.md)ã** |
| | | |
| | | ä¸å¥è¯æè¦ï¼`isEnabled`ï¼1 å¯ç¨ / 0 æªå¯ç¨ï¼+ `usageType`ï¼1 ç§èµ / 2 èªç¨ï¼+ `tenantInfo`ï¼èªç±ææ¬ï¼ï¼æªå¯ç¨æ¶å两è
ä¸å¾æ¸
空ï¼éç§èµæ¶ `tenantInfo` å¿
å¡«ï¼éèªç¨èªå¨æ¸
空ã`/basic/tankInfo/all` **åªè¿åå·²å¯ç¨çå¨ç½**ï¼æªå¯ç¨ä¸è¿å
¥åºè¡¨å䏿ï¼ï¼`/basic/tankInfo/list` ä»è¿åå
¨é¨å¹¶æ°å¢ `isEnabled`/`usageType` è¿æ»¤åæ°ã |
| | | |
| | | --- |
| | | |
| | |
| | | |
| | | - [ ] èå 2353 æ²¹åºä¿¡æ¯ã2354 å¨ç½ä¿¡æ¯è½æå¼å¹¶å¢å æ¹æ¥ï¼æ¤åå端缺失ï¼ç¹å¼æ¥éï¼ |
| | | - [ ] å¨ç½ä¿¡æ¯è½ä¿å `tankNo`ã`category`ã`oilProduct`ã`capacity`ã`remaining` |
| | | - [ ] å¨ç½è¡¨åï¼æå¼ãæ¯å¦å¯ç¨ãæåºç°ç¨éï¼éãç§èµãæåºç°ç§å®¢ä¿¡æ¯è¾å
¥æ¡ |
| | | - [ ] éãç§èµãä½ä¸å¡«ç§å®¢ä¿¡æ¯ï¼ä¿åæ¥ãç§èµçå¨ç½å¿
须填åç§å®¢ä¿¡æ¯ã |
| | | - [ ] éãèªç¨ãä¿ååéæ°æ¥è¯¦æ
ï¼`tenantInfo` æ¯ç©ºï¼è¯´ææ¸
空çæï¼ä¸æ¯æ²¡åï¼ |
| | | - [ ] ç±ãç§èµãæ¹æãæªå¯ç¨ãä¿åï¼`usageType` å `tenantInfo` é½å空 |
| | | - [ ] æªå¯ç¨çå¨ç½**ä¸å¨** `/basic/tankInfo/all` éï¼`/basic/tankInfo/list` éä»è½çå° |
| | | - [ ] åç¨ä¸ä¸ªå¨ç½åï¼å
¥åºè¡¨åçå¨ç½ä¸æé没æå®ï¼éæ°å¯ç¨åååºç° |
| | | - [ ] åç¨å¨ç½åï¼æ¤åå·²å
¥åºè®°å½éç `tankNo` ä»å¨ï¼å岿°æ®ä¸åå½±åï¼ |
| | | - [ ] æ°å¢å
¥åºè¡¨åï¼æ²¹åº/å¨ç½åæä¸æï¼`/basic/oilDepot/all`ã`/basic/tankInfo/all`ï¼ï¼éå¨ç½å `tankNo` èªå¨å¸¦åº |
| | | - [ ] æ°å¢å
¥åºæäº¤åï¼å
¥åºç®¡çåè¡¨è¯¥è¡ `tankNo` æå¼ |
| | | - [ ] èµ°çæ¯ `addStockInRecordOnly`ï¼ç¨ `addstockInventory` æäº¤å `tankNo` 为空 ââ ç¨æ¥åå确认 3.1ï¼ |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | # å¨ç½ãæ¯å¦å¯ç¨ / ç§èµèªç¨ / ç§å®¢ä¿¡æ¯ãå端èè°ææ¡£ |
| | | |
| | | æ´æ°æ¶é´ï¼2026-09-20 |
| | | éç¨çæ¬ï¼æ¬æ¬¡åç«¯åæ´å |
| | | 对åºéæ±ï¼åºç¡æ°æ® - å¨ç½ä¿¡æ¯æ°å¢ãæ¯å¦å¯ç¨ããç¨éï¼ç§èµ/èªç¨ï¼ããç§å®¢ä¿¡æ¯ãä¸çº§èå¨ |
| | | |
| | | --- |
| | | |
| | | ## 1. åæ´èå´ |
| | | |
| | | | å
容 | å½±åé¢ | |
| | | | --- | --- | |
| | | | å¨ç½ä¿¡æ¯æ°å¢ **æ¯å¦å¯ç¨** | å¨ç½ä¿¡æ¯é¡µè¡¨åãå表 | |
| | | | å¯ç¨åå¯é **ç¨é**ï¼ç§èµ / èªç¨ï¼ | å¨ç½ä¿¡æ¯é¡µè¡¨å | |
| | | | ç¨ééãç§èµãåå¡« **ç§å®¢ä¿¡æ¯** | å¨ç½ä¿¡æ¯é¡µè¡¨å | |
| | | | **æªå¯ç¨çå¨ç½ä»ä¸æéè** | æ°å¢å
¥åºè¡¨åçå¨ç½ä¸æï¼`/basic/tankInfo/all`ï¼ | |
| | | |
| | | DDL è§ `doc/20260920_add_usage_to_tank_info.sql`ï¼**éå
å¨ç®æ åºæ§è¡**ã |
| | | |
| | | > å¨ç½ä¿¡æ¯é¡µèå id `2354`ï¼ä¸æ²¹åºä¿¡æ¯ `2353` å¹¶åï¼ãå¨ç½å·å¸¦å
¥åºåçå
¶ä½å
å®¹è§ `doc/20260920_å¨ç½å·å¸¦å
¥åºåå端èè°ææ¡£.md`ã |
| | | |
| | | --- |
| | | |
| | | ## 2. è¡¨ç»æåæ´ |
| | | |
| | | `tank_info` æ°å¢ä¸¤åï¼ |
| | | |
| | | | å | ç±»å | é»è®¤å¼ | 说æ | |
| | | | --- | --- | --- | --- | |
| | | | `is_enabled` | `tinyint(1) NOT NULL` | `1` | æ¯å¦å¯ç¨ `1` å¯ç¨ / `0` æªå¯ç¨ | |
| | | | `usage_type` | `tinyint NULL` | `NULL` | ç¨é `1` ç§èµ / `2` èªç¨ï¼å¯ç¨åæéè¦é | |
| | | |
| | | > åéæ°æ® `is_enabled` é»è®¤ `1`ã`usage_type` ä¸ºç©ºï¼æä»¥**å级åè¡ä¸ºä¸æ¹å¨åä¸è´**ï¼ä¸æä¸ä¼çªç¶å°ç½ã |
| | | |
| | | --- |
| | | |
| | | ## 3. å端表åèå¨ |
| | | |
| | | ``` |
| | | æ¯å¦å¯ç¨ï¼å¼å
³ï¼ |
| | | ââ æå¼ â ç¨éï¼ç§èµ / èªç¨ï¼ |
| | | ââ éãç§èµã â ç§å®¢ä¿¡æ¯ï¼è¾å
¥æ¡ï¼ |
| | | ``` |
| | | |
| | | **å
³éãæ¯å¦å¯ç¨ãæ¶ï¼ç¨éåç§å®¢ä¿¡æ¯ä¸¤ä¸ªæ§ä»¶åºéè**ï¼éãèªç¨ãæ¶ç§å®¢ä¿¡æ¯éèã |
| | | |
| | | ### 3.1 åæ®µ |
| | | |
| | | | åæ®µ | ç±»å | åå¼ | è¡¨åæ§ä»¶ | |
| | | | --- | --- | --- | --- | |
| | | | `isEnabled` | Integer | `1` å¯ç¨ / `0` æªå¯ç¨ | å¼å
³ï¼é»è®¤æå¼ | |
| | | | `usageType` | Integer | `1` ç§èµ / `2` èªç¨ | åé/䏿ï¼ä»
å¨å¯ç¨æ¶æ¾ç¤º | |
| | | | `tenantInfo` | String | èªç±ææ¬ï¼æé¿ 255 | **è¾å
¥æ¡**ï¼ä»
å¨ `usageType=1` æ¶æ¾ç¤º | |
| | | |
| | | > â ï¸ **ç§å®¢ä¿¡æ¯æ¯èªç±ææ¬è¾å
¥æ¡ï¼ä¸æ¯ä¸æéæ©**ãå端**没æ**ç§å®¢å表æ¥å£ï¼ä¹æ²¡æç§å®¢è¡¨ââ请ä¸è¦æã䏿éç§å®¢ãæ¥å®ç°ï¼ç´æ¥æ¾ä¸ä¸ª `input` å³å¯ã |
| | | |
| | | ### 3.2 å
¶ä½åæ®µï¼æ²¿ç¨åæï¼æªåï¼ |
| | | |
| | | `tankNo`ï¼å¨ç½å·ï¼ã`category`ï¼å¤§ç±»ï¼ã`oilProduct`ï¼æ²¹åï¼ã`capacity`ï¼ç½å®¹ï¼ã`remaining`ï¼åºåä½é m³ï¼ã |
| | | |
| | | --- |
| | | |
| | | ## 4. æ¥å£ |
| | | |
| | | åç¼ `/basic/tankInfo`ï¼ç»ä¸è¿å `{ code, msg, data }`ã |
| | | |
| | | | æ¥å£ | æ¹æ³ | 说æ | |
| | | | --- | --- | --- | |
| | | | `/basic/tankInfo/list` | GET | å页æ¥è¯¢ï¼å `data.records` | |
| | | | `/basic/tankInfo/all` | GET | 䏿ç¨ï¼**åªè¿åå·²å¯ç¨çå¨ç½** | |
| | | | `/basic/tankInfo/{id}` | GET | 详æ
| |
| | | | `/basic/tankInfo/add` | POST | æ°å¢ | |
| | | | `/basic/tankInfo/update` | POST | ä¿®æ¹ï¼å¿
须带 `id` | |
| | | | `/basic/tankInfo/del` | DELETE | æ¹éå é¤ï¼body 为 id æ°ç» | |
| | | |
| | | ### 4.1 `GET /basic/tankInfo/list`ï¼è¡ä¸ºååï¼ |
| | | |
| | | **æ°å¢å¯éè¿æ»¤åæ°**ï¼ |
| | | |
| | | | åæ° | ç±»å | 说æ | |
| | | | --- | --- | --- | |
| | | | `isEnabled` | Integer | æå¯ç¨ç¶æè¿æ»¤ï¼ä¸ä¼ 为å
¨é¨ | |
| | | | `usageType` | Integer | æç¨éè¿æ»¤ï¼ä¸ä¼ 为å
¨é¨ | |
| | | |
| | | åæ `tankNo`ã`category` ä»ä¸ºæ¨¡ç³å¹é
ï¼**æªæ¹å¨**ãå表**è¿åå
¨é¨å¨ç½ï¼å«æªå¯ç¨ï¼**ï¼å»ºè®®å端å ä¸åãæ¯å¦å¯ç¨ãå¹¶ç¨ä¸é¢çåæ°åçéã |
| | | |
| | | ``` |
| | | GET /basic/tankInfo/list?pageNum=1&pageSize=10&isEnabled=1 |
| | | ``` |
| | | |
| | | ### 4.2 `GET /basic/tankInfo/all`ï¼**è¡ä¸ºååï¼éç¹**ï¼ |
| | | |
| | | **åªè¿å `isEnabled=1` çå¨ç½ã** æªå¯ç¨çç½è¿æ²¡æç¨ï¼ä¸åºåºç°å¨å
¥åºè¡¨åçå¨ç½ä¸æéã |
| | | |
| | | - 该æ¥å£**䏿¥å** `isEnabled` åæ°ï¼æ°¸è¿åªç»å¯ç¨çï¼ |
| | | - åéæ°æ®è¿ç§»å `is_enabled` å
¨ä¸º `1`ï¼æä»¥æ¹é åå䏿å
容ä¸è´ï¼ |
| | | - åç¨ä¸ä¸ªå¨ç½ â å·æ°ä¸æå³æ¶å¤±ï¼éæ°å¯ç¨ â ååºç°ã |
| | | |
| | | ååºç¤ºä¾ï¼ |
| | | |
| | | ```json |
| | | { |
| | | "code": 200, |
| | | "msg": "æä½æå", |
| | | "data": [ |
| | | { |
| | | "id": 3, |
| | | "tankNo": "01#", |
| | | "category": "æåæ²¹", |
| | | "oilProduct": "æ´#0", |
| | | "capacity": 1000.00, |
| | | "remaining": 320.00, |
| | | "isEnabled": 1, |
| | | "usageType": 1, |
| | | "tenantInfo": "åéææè¿è¾æéå
¬å¸" |
| | | } |
| | | ] |
| | | } |
| | | ``` |
| | | |
| | | ### 4.3 `POST /basic/tankInfo/add` / `update` |
| | | |
| | | 请æ±ä½å°±æ¯å¨ç½å¯¹è±¡ï¼**æ°å¢åæ®µç´æ¥å¹³éºå¨é¡¶å±**ï¼ |
| | | |
| | | ```json |
| | | { |
| | | "id": 3, |
| | | "tankNo": "01#", |
| | | "category": "æåæ²¹", |
| | | "oilProduct": "æ´#0", |
| | | "capacity": 1000.00, |
| | | "remaining": 320.00, |
| | | "isEnabled": 1, |
| | | "usageType": 1, |
| | | "tenantInfo": "åéææè¿è¾æéå
¬å¸" |
| | | } |
| | | ``` |
| | | |
| | | `update` å¿
须带 `id`ï¼å¦åè¿åã缺å°å¨ç½idãã |
| | | |
| | | > `id` / `createTime` / `updateTime` / `createUser` / `updateUser` / `tenantId` / `deptId` ç±å端èªå¨ç»´æ¤ï¼å端**ä¸è¦ä¼ **ã |
| | | |
| | | --- |
| | | |
| | | ## 5. å端å½ä¸åè§åï¼å端ä¸ç¨èªå·±æ¸
åæ®µï¼ |
| | | |
| | | å端ä¼å¯¹è¿ä¸ä¸ªå段å䏿¬¡å½ä¸åï¼æä¸é¢çå£å¾è½åºï¼ |
| | | |
| | | | æäº¤çå¼ | å端è¡ä¸º | |
| | | | --- | --- | |
| | | | `isEnabled=0`ï¼æªå¯ç¨ï¼ | `usageType` å `tenantInfo` **ä¸å¾æ¸
空** ââ å¯ç¨ä¹åæè°ç§èµ/èªç¨ | |
| | | | `isEnabled=1` + `usageType=1`ï¼ç§èµï¼ | `tenantInfo` **å¿
å¡«**ï¼ä¸ºç©ºæ¥é | |
| | | | `isEnabled=1` + `usageType=2`ï¼èªç¨ï¼ | `tenantInfo` **èªå¨æ¸
空**ï¼åç«¯ä¼ äºä¹ä¼è¢«æ¹æ | |
| | | | `isEnabled=1` + `usageType` ä¸ä¼ / 为 `null` | è§ä¸º**æªéæ©**ï¼æ¢ä¸æ ¡éªä¹ä¸æ¸
空 | |
| | | |
| | | ### 5.1 æ ¡éªéè¯¯ææ¡ |
| | | |
| | | | åºæ¯ | `msg` | |
| | | | --- | --- | |
| | | | `usageType` ä¼ äº `1`/`2` ä¹å¤çæ´æ° | å¨ç½ç¨éåªè½æ¯ç§èµæèªç¨ | |
| | | | `usageType=1`ï¼ç§èµï¼ä½ `tenantInfo` 为空 | ç§èµçå¨ç½å¿
须填åç§å®¢ä¿¡æ¯ | |
| | | | `update` æªå¸¦ `id` | 缺å°å¨ç½id | |
| | | |
| | | é误ååºå½¢æï¼ä¸å¡å¼å¸¸ç»ä¸èµ°å
¨å±å¤çå¨ï¼ï¼ |
| | | |
| | | ```json |
| | | { "code": 500, "msg": "ç§èµçå¨ç½å¿
须填åç§å®¢ä¿¡æ¯" } |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ## 6. 注æäºé¡¹ |
| | | |
| | | **â `usageType` å¯ä»¥ä¸ºç©ºï¼è¿æ¯ææçå
¼å®¹å£å** |
| | | |
| | | å¯ç¨ç¶æä¸å
许 `usageType` 为空ï¼è¡¨ç¤º"è¿æ²¡é"ï¼ãå 为è¿ç§»ååéå¨ç½å°±æ¯ `usage_type=NULL` + `tenant_info` å¯è½æå¼ï¼å¦æå¼ºå¶è¦æ±å¿
éï¼åç§æ·åºéçèå¨ç½**ç¬¬ä¸æ¬¡ç¼è¾å°±ä¼è¢«æ¦**ï¼èä¸éãèªç¨ãè¿ä¼æåæç§å®¢ä¿¡æ¯æ¹æã |
| | | |
| | | æä»¥ï¼**å端表åå¯ä»¥å¼ºå¶è¦æ±é**ï¼æ°æ°æ®è§èï¼ï¼ä½å端ä¸ä¼æ¦ãè¥ä¸å¡è¦æ±å端ä¹å¼ºå¶ï¼éè¦å
ç»åéæ°æ®è¡¥ `usage_type`ï¼å±äºé¢å¤ä¸æ¥ã |
| | | |
| | | **â¡ åç¨å¨ç½ä¸å½±ååå²ä¸å¡æ°æ®** |
| | | |
| | | éå®å°è´¦ãåºåãåºå
¥åºè®°å½éç `tankId` / `tankNo` 齿¯**è½åºæ¶æä¸æ¥çå¿«ç
§**ï¼å¨ç½åæ¥è¢«åç¨ãæ¹ç¨éãçè³å é¤ï¼é½ä¸ä¼ååè¿äºå岿°æ®ã |
| | | |
| | | **⢠å é¤å¨ç½æ²¡æå¼ç¨æ ¡éª** |
| | | |
| | | `/basic/tankInfo/del` ç´æ¥å ï¼ä¸æ ¡éªæ¯å¦è¢«éå®å°è´¦/åºåå¼ç¨ãå 为æ â¡ çå¿«ç
§æºå¶ï¼å岿°æ®æ¾ç¤ºä¸åå½±åï¼åªæ¯ä¸æéä¼å°ä¸ä¸ªç½ãå端å é¤åå»ºè®®äºæ¬¡ç¡®è®¤ã |
| | | |
| | | **⣠å¨ç½åè¡¨åæ°æ®æéè¿æ»¤** |
| | | |
| | | `tank_info` ä¸å¨æ°æ®æé忽ç¥è¡¨ç½ååéï¼`/list` ä¼è¢«èªå¨è¿½å `create_user` / `dept_id` æ¡ä»¶ï¼**æ¢è´¦å·å¯è½çä¸å°å«äººå»ºçå¨ç½**ãè¿ä¸å
¶å®åºç¡æ°æ®é¡µç°ç¶ä¸è´ãèè°æ¶ç¨åä¸è´¦å·ï¼æç¨ `dataScope=1` çè´¦å·ï¼å¦å容æè¯¯å¤æ"ä¿å失败"ã |
| | | |
| | | --- |
| | | |
| | | ## 7. èè°èªæ¥æ¸
å |
| | | |
| | | - [ ] å¨ç½ä¿¡æ¯å表åºç°ãæ¯å¦å¯ç¨ãåï¼å¯ç¨ `isEnabled` åæ°çé |
| | | - [ ] 表åï¼æå¼ãæ¯å¦å¯ç¨ãæåºç°ç¨éï¼å
³éæ¶ç¨éä¸ç§å®¢ä¿¡æ¯é½éè |
| | | - [ ] 表åï¼ç¨ééãç§èµãæåºç°ç§å®¢ä¿¡æ¯è¾å
¥æ¡ï¼éãèªç¨ãæ¶éè |
| | | - [ ] éãç§èµãä½ä¸å¡«ç§å®¢ä¿¡æ¯ â ä¿åè¿åãç§èµçå¨ç½å¿
须填åç§å®¢ä¿¡æ¯ã |
| | | - [ ] éãèªç¨ãä¿ååéæ°æ¥è¯¦æ
ï¼`tenantInfo` 为空ï¼ç¡®è®¤æ¸
空çæï¼è䏿¯æ²¡åï¼ |
| | | - [ ] ç±ãç§èµãæ¹æãæªå¯ç¨ãä¿ååï¼`usageType` å `tenantInfo` é½å空 |
| | | - [ ] `usageType` ä¼ `9` â è¿åãå¨ç½ç¨éåªè½æ¯ç§èµæèªç¨ã |
| | | - [ ] æªå¯ç¨çå¨ç½**ä¸å¨** `/basic/tankInfo/all` éï¼`/basic/tankInfo/list` éä»è½çå° |
| | | - [ ] åç¨ä¸ä¸ªå¨ç½ â æ°å¢å
¥åºè¡¨åçå¨ç½ä¸æé没æå®ï¼éæ°å¯ç¨ â ååºç° |
| | | - [ ] åç¨å¨ç½åï¼æ¤åå·²å
¥åºè®°å½éç `tankNo` ä»å¨ï¼å岿°æ®ä¸åå½±åï¼ |
| | | - [ ] 䏿¹æ°åæ®µç´æ¥ä¿åä¸ä¸ªåéå¨ç½ï¼è½ä¿åæåä¸ `tenantInfo` åå¼ä¸ä¸¢ |
| | |
| | | | éæ± | å
容 | å½±åé¢ | |
| | | | --- | --- | --- | |
| | | | 13 | æ²¹å**éå®åºåºå³åè´§**ï¼åºåºæ¶èªå¨çæä¸å¼ ãå·²åè´§ãåè´§å°è´¦ï¼ä¸åèµ·åè´§å®¡æ¹ | åºåºè¡¨åãåºåºå°è´¦å表 | |
| | | | 11 | 客æ·/ä¾åºå徿¥å**æ°å¢ä¸ä¸ªä¸å¡å段**ï¼å®¢æ·ã仿¬¾ããä¾åºåã忬¾ãï¼å¹¶å¯æå·¥ç»´æ¤æµæ°´ | 客æ·å¾æ¥é¡µãä¾åºå徿¥é¡µ | |
| | | | 11 | 客æ·/ä¾åºå徿¥å**æ°å¢ä¸ä¸ªä¸å¡å段**ï¼å®¢æ·ã忬¾ããä¾åºåã仿¬¾ãï¼å¹¶å¯æå·¥ç»´æ¤æµæ°´ | 客æ·å¾æ¥é¡µãä¾åºå徿¥é¡µ | |
| | | | 15 | å¤ä»¶**å
³è产åè§æ ¼**ï¼éè´å
¥åºèªå¨ç´¯å å¤ä»¶åºåï¼å¹¶æ°å¢å¤ä»¶åºå
¥åºæµæ°´ | å¤ä»¶ç»´æ¤é¡µãå¤ä»¶æµæ°´é¡µ | |
| | | | 14 | æ°å¢å
¥åºééè´è®¢åå**ç²¾ç¡®åæ¾æç»**ï¼ä¿®å¤å端 SQLï¼ | æ°å¢å
¥åºé¡µ | |
| | | |
| | |
| | | |
| | | | 徿¥ | æ°å¢å段 | å弿¥æº | |
| | | | --- | --- | --- | |
| | | | 客æ·å¾æ¥ | `paymentAmount`ï¼**仿¬¾**ï¼ | `payment_record` ä¸ `party_type=1 and direction=1` çå计 | |
| | | | ä¾åºå徿¥ | `receiptAmount`ï¼**忬¾**ï¼ | `payment_record` ä¸ `party_type=2 and direction=2` çå计 | |
| | | | 客æ·å¾æ¥ | `receiptRecordAmount`ï¼**忬¾**ï¼ | `payment_record` ä¸ `party_type=1 and direction=1` çå计 | |
| | | | ä¾åºå徿¥ | `paymentRecordAmount`ï¼**仿¬¾**ï¼ | `payment_record` ä¸ `party_type=2 and direction=2` çå计 | |
| | | |
| | | > â ï¸ **å£å¾å·²ä¿®æ£ï¼2026-09-20ï¼**ï¼æåå®ç°æäºã客æ·ä»æ¬¾ãä¾åºå忬¾ãï¼ä¸ä¸å¡ä¸ç¬¦ãç°æã**å®¢æ·æ¯å款ãä¾åºåæ¯ä»æ¬¾**ãå±ç¤ºã |
| | | > |
| | | > **åªæ¢äºåçè¯ä¹ä¸å段åï¼`direction` çåå¼ä¸ä¸ªé½æ²¡å¨** ââ 客æ·ä¾§ä»æ¯ `direction=1`ï¼ä¾åºå侧仿¯ `direction=2`ãè¿ä¸¤ä¸ªå¼æ¯å岿µæ°´å·²ç»å¨ç¨çè½åºæ¹åï¼æ¹äºå°±ä¼æ¥ä¸å°å·²ææ°æ®ãæä»¥ã`direction=1` å¨å®¢æ·å¾æ¥é读ä½å款ãå¨ä¾åºå徿¥é读ä½ä»æ¬¾ãè¿ç±»**æé¡µåå¼**ç对åºå
³ç³»æ¯å»æçï¼ä¸è¦æå段åå»åæ¨ã |
| | | > |
| | | > åæ®µååæ¶æ¹æäºï¼å®¢æ·ä¾§ `paymentAmount` â `receiptRecordAmount`ï¼ä¾åºåä¾§ `receiptAmount` â `paymentRecordAmount`ã**ä¾åºåä¾§ç仿¬¾åæ æ³ç´æ¥å« `paymentAmount`** ââ 该åå已被çå®ä»æ¬¾åï¼`account_purchase_payment`ï¼çæ±æ»åå ç¨ï¼éåä¼è®©åä¸ resultMap ç两个åäºç¸è¦çã |
| | | |
| | | **åªæä¸ä¸ªæ¹åæ¯æå·¥æµæ°´**ï¼å®¢æ·ä¾§çãæ¶æ¬¾éé¢ã`receiptPaymentAmount`ãä¾åºåä¾§çã仿¬¾éé¢ã`paymentAmount` 仿¥èªåæçéåæ®è¡¨ï¼**计ç®å£å¾æªå**ï¼`receiptableAmount`ï¼åºæ¶ï¼ä¸ `payableAmount`ï¼åºä»ï¼å
¬å¼**ä¿æä¸å**ï¼æ°å段åªåå±ç¤ºï¼ä¸åä¸ä½é¢è®¡ç®ã |
| | | |
| | |
| | | |
| | | | æ¥å£ | æ°å¢è¿ååæ®µ | |
| | | | --- | --- | |
| | | | `GET /metricStatistics/customewTransactions` | `paymentAmount` | |
| | | | `GET /metricStatistics/customewTransactionsDetails` | `paymentAmount` | |
| | | | `GET /purchase/report/supplierTransactions` | `receiptAmount` | |
| | | | `GET /purchase/report/supplierTransactionsDetails` | `receiptAmount` | |
| | | | `GET /metricStatistics/customewTransactions` | `receiptRecordAmount`ï¼åæ¬¾ï¼ | |
| | | | `GET /metricStatistics/customewTransactionsDetails` | `receiptRecordAmount`ï¼åæ¬¾ï¼ | |
| | | | `GET /purchase/report/supplierTransactions` | `paymentRecordAmount`ï¼ä»æ¬¾ï¼ | |
| | | | `GET /purchase/report/supplierTransactionsDetails` | `paymentRecordAmount`ï¼ä»æ¬¾ï¼ | |
| | | |
| | | > æç»æ¥å£ç `paymentAmount` / `receiptAmount` æ¯**徿¥æ¹ç»´åº¦**çå计ï¼è¯¥å®¢æ·/ä¾åºåå
¨é¨æµæ°´å计ï¼ï¼æµæ°´æ¬èº«ä¸æå°åå¼ ååä¸ï¼å æ¤æç»åè¡è¯¥åå¼ç¸åãè¥åç«¯å¸æåªå¨å表页å±ç¤ºï¼æç»é¡µå¯éè该åã |
| | | > æç»æ¥å£ç `receiptRecordAmount` / `paymentRecordAmount` æ¯**徿¥æ¹ç»´åº¦**çå计ï¼è¯¥å®¢æ·/ä¾åºåå
¨é¨æµæ°´å计ï¼ï¼æµæ°´æ¬èº«ä¸æå°åå¼ ååä¸ï¼å æ¤æç»åè¡è¯¥åå¼ç¸åãè¥åç«¯å¸æåªå¨å表页å±ç¤ºï¼æç»é¡µå¯éè该åã |
| | | |
| | | ### 3.3 æ°å¢ï¼ä»æ¬¾åæ¬¾æµæ°´åæ¥å£ |
| | | |
| | |
| | | |
| | | `tenantId` / `deptId` / `createUser` / `createTime` / `updateUser` / `updateTime` ç±å端èªå¨å¡«å
ï¼**å端ä¸è¦ä¼ **ã |
| | | |
| | | **æ¥è¯¢åæ°ç¤ºä¾**ï¼å®¢æ·å¾æ¥é¡µãæ°å¢ä»æ¬¾ã忥çè¯¥å®¢æ·æµæ°´ï¼ï¼ |
| | | **æ¥è¯¢åæ°ç¤ºä¾**ï¼å®¢æ·å¾æ¥é¡µãæ°å¢å款ã忥çè¯¥å®¢æ·æµæ°´ï¼ï¼ |
| | | |
| | | ``` |
| | | GET /paymentRecord/listPage?pageNum=1&pageSize=10&partyType=1&partyId=449&direction=1 |
| | | ``` |
| | | |
| | | > å徿¥é¡µæ°å¢æµæ°´æ¶è¦ä¼ çå¼ï¼**æéï¼å¡å¿
ææ¤ä¼ ï¼`direction` ä¸è¦æã1仿¬¾ 2忬¾ãçåé¢å»é**ï¼ï¼ |
| | | |
| | | | é¡µé¢ | 该页çåè¯ä¹ | `partyType` | `direction` | |
| | | | --- | --- | --- | --- | |
| | | | 客æ·å¾æ¥ | 忬¾ | `1` | `1` | |
| | | | ä¾åºå徿¥ | 仿¬¾ | `2` | `2` | |
| | | | åä½å徿¥ | 已仿¬¾ | `3` | `1` | |
| | | |
| | | `listPage` è¿åç»æä¸º MyBatis-Plus å页对象ï¼å端å `data.records`ã |
| | | |
| | | ### 3.4 注æäºé¡¹ |
| | | |
| | | **â æ°å段åªåå±ç¤ºï¼ä¸åä¸ä½é¢è®¡ç®** |
| | | |
| | | `receiptRecordAmount`ï¼å®¢æ·å款ï¼ã`paymentRecordAmount`ï¼ä¾åºå仿¬¾ï¼æ¯ç¬ç«çæå·¥æµæ°´ï¼**ä¸ä¼**æ¹ååºæ¶ `receiptableAmount` / åºä» `payableAmount`ãæå
¥ä¸æ¡ `partyType=1&direction=1` ç客æ·åæ¬¾æµæ°´åï¼ã忬¾ãåä¼åï¼ãåºæ¶ãå**ä¸å**ââè¿æ¯é¢æè¡ä¸ºï¼ä¸æ¯ bugã |
| | | |
| | | **â¡ `direction` å¿
é¡»åªä¼ `1` æ `2`** |
| | | |
| | | å端对 `partyType` åäºç½ååï¼`1` å®¢æ· / `2` ä¾åºå / `3` åä½åï¼ä¼ å
¶å®å¼æ¥ã徿¥æ¹ç±»åä¸åæ³ãï¼ï¼ä½ **`direction` 没æç½åå**ï¼ä¼ `1`/`2` ä¹å¤çæ´æ°ä¹ä¼å
¥åºãåç«¯ä¸æåºå®ç» `1` 仿¬¾ã`2` 忬¾ä¸¤ä¸ªé项ï¼ä¸è¦æ¾å¼ã |
| | | |
| | | **⢠`/paymentRecord/delete` 没æå½å±æ ¡éªï¼æ¢æé£é©ï¼** |
| | | |
| | | 该æ¥å£ä¸æ ¡éªæµæ°´å½å±ï¼**ä»»ä½ç»å½ç¨æ·é½è½å ä»»æä¸æ¡æµæ°´**ï¼å
æ¬å«ç客æ·/ä¾åºåãä¹è³åä½åçãæ¬æ¬¡æªæ¹å¨å端è¡ä¸ºï¼å端请å¡å¿
ï¼ |
| | | |
| | | - å é¤åå äºæ¬¡ç¡®è®¤ï¼ |
| | | - ä¸è¦å¨é¡µé¢ä¸æ´é²ãæ¹éå
¨éå é¤ãè¿ç±»å
¥å£ï¼é¿å
误å ä¸çã |
| | | |
| | | è¥ä¸å¡è¦æ±æ¶ç´§ï¼éè¦å端补ãå½å±æ ¡éªãæãåå»ºäººæ ¡éªãï¼å±äºæ°å¢éæ±ã |
| | | |
| | | **â£ æµæ°´åè¡¨åæ°æ®æéè¿æ»¤** |
| | | |
| | | `payment_record` ä¸å¨æ°æ®æé忽ç¥è¡¨ç½ååéï¼`/paymentRecord/listPage` ä¼è¢«èªå¨è¿½å `create_user` / `dept_id` æ¡ä»¶ã**æ¢ä¸ä¸ªè´¦å·å¯è½çä¸å°å«äººå½å
¥çæµæ°´**ââè¿ä¸ä¾åºåãéè´å°è´¦å表çç°ç¶ä¸è´ï¼ä¸æ¯æ°é®é¢ãèè°æ¶è¯·ç¨ä¸å½å
¥äººåæ°æ®èå´çè´¦å·ï¼æç¨ `dataScope=1` çè´¦å·ï¼å¦å容æè¯¯å¤æãæ°å¢æ²¡çæãã |
| | | |
| | | > 徿¥æ¥è¡¨ï¼`customewTransactions` / `supplierTransactions`ï¼é¡¶å±æ¯èååæ¥è¯¢ï¼ä¸å该éå¶ï¼ä¸¤ä¾§éé¢ä»è½å¯¹ä¸ï¼ä½å ä¸ºæµæ°´åè¡¨è¢«è¿æ»¤ï¼å¯è½åºç°ãæ¥è¡¨éæµæ°´åææ°ãç¹è¿æµæ°´çä¸å°è®°å½ãçè§æå·®å¼ï¼å±åæºé®é¢ã |
| | | |
| | | **⤠å¼ååºç°ææµè¯æµæ°´é½è½ç¨** |
| | | |
| | | `payment_record` ç°å `id=2`ï¼`party_type=3, direction=1`ï¼åä½åï¼ã`id=4`ï¼`party_type=2, direction=2`ï¼ä¾åºåï¼ã`id=5`ï¼`party_type=1, direction=1`ï¼å®¢æ· 449ï¼ã`direction` å弿ªåï¼æä»¥è¿ä¸æ¡åå«å¯¹åºåä½åã已仿¬¾ããä¾åºåã仿¬¾ãã客æ·ã忬¾ãï¼å¯ç´æ¥ç¨äºèè°ï¼å®¢æ· 449 ç忬¾ååºä¸º 10.00ï¼ä¾åºå 243 ç仿¬¾å为 1.00ï¼ã |
| | | |
| | | --- |
| | | |
| | |
| | | | `productId` | Long | å
³è产å大类 id | |
| | | | `productModelId` | Long | å
³è产å**è§æ ¼åå·** id | |
| | | |
| | | **è¿æ¯æééè´çä¸å¡é©å**ï¼éè´å°è´¦æ°å¢æç»æ¶ï¼åç«¯ç¨æç»ç `productModelId` å»å¹é
`spare_parts.product_model_id`ãå¹é
ä¸åï¼ |
| | | **è¿æ¯æééè´çä¸å¡é©å**ï¼éè´å°è´¦ä¿åæç»æ¶ï¼åç«¯ç¨æç»ç `productModelId` å»å¹é
`spare_parts.product_model_id`ãå¹é
ä¸åï¼ |
| | | |
| | | 1. `spare_parts.quantity` ç´¯å 该æç»æ°éï¼ |
| | | 2. å䏿¡å¤ä»¶å
¥åºæµæ°´ï¼`direction=1`ã`sourceType=1`ã`sourceId=éè´å°è´¦id`ã`sourceNo=éè´ååå·`ï¼ã |
| | | |
| | | æªç»´æ¤ `productModelId` çå¤ä»¶**ä¸ä¼**被å¹é
ï¼éé»è·³è¿ï¼ä¸å½±åéè´å°è´¦ä¿åã |
| | | |
| | | > ä»
å¨éè´å°è´¦**æ°å¢æç»**æ¶ååï¼ç¼è¾éè´å°è´¦èµ°æ´æ°åæ¯ï¼ä¸ä¼éå¤è®¡æ°ã |
| | | > åªå¯¹**éè´æç»**ï¼`type=2`ï¼çæï¼éå®/é¡¹ç®æç»ä¸å¨å¤ä»¶ã |
| | | |
| | | **ç¼è¾å°è´¦æ¯ãå
åæ»ãåé建ã**ï¼å端å
æè¯¥å°è´¦ä¸æ¬¡äº§ççå¤ä»¶å
¥åºæµæ°´å
¨é¨ååå¹¶å é¤ï¼åæåç«¯æ¬æ¬¡æäº¤ç**宿´æç»å表**éæ°ç´¯å ãæä»¥ï¼ |
| | | |
| | | - æç»è¡è¢«**ç§»é¤** â 对åºå¤ä»¶æ°éèªå¨ååå»ï¼ä¸éè¦å端é¢å¤è°æ¥å£ï¼ï¼ |
| | | - æç»è¡**æ°é被æ¹** â ææ°æ°ééç®ï¼ä¸ä¼å å æåä»½ï¼ |
| | | - æç»è¡**æ°å¢** â æ£å¸¸ç´¯å ï¼ä¸ä¼éå¤è®¡æ°ã |
| | | |
| | | > â ï¸ å æ¤ç¼è¾å°è´¦æ¶**å¿
é¡»æäº¤å®æ´æç»å表**ï¼ä¸è½åªæäº¤æ¹å¨çé£å è¡ãåªä¼ é¨åè¡ä¼è¢«å½æãå
¶ä½è¡å·²å é¤ãèåæ»æã |
| | | |
| | | **å é¤å°è´¦ä¼è¿å¸¦åæ»å¤ä»¶**ï¼`POST` æ¹éå é¤éè´å°è´¦æ¶ï¼åç«¯ä¼æè¯¥å°è´¦ç´¯å å°å¤ä»¶ä¸çæ°éååå»ï¼å¹¶å æå¯¹åºç `spare_parts_record` å
¥åºæµæ°´ã |
| | | |
| | | - è¥å¤ä»¶**已被维修/ä¿å
»é¢ç¨**ï¼ååä¼å¯¼è´è´åºåï¼æ¤æ¶**å é¤ä¼è¢«æç»**å¹¶æç¤ºãå¤ä»¶ãxxxãå½ååºå Nï¼ä¸è¶³ä»¥åæ»æ¬æ¬¡éè´å
¥åºç Mï¼è¯·å
å¤çé¢ç¨è®°å½ããè¿æ¯ææçä¿æ¤ï¼ä¸åéé»è´åºåã |
| | | - å é¤ä¸åæ»å¨åä¸ä¸ªäºå¡å
ï¼ä»»ä¸æ¥å¤±è´¥æ´ä½åæ»ã |
| | | |
| | | ### 4.2 æ°å¢ï¼å¤ä»¶åºå
¥åºæµæ°´ |
| | | |
| | |
| | | | `quantity` | æ°é | |
| | | | `sourceType` | æ¥æºç±»åï¼è§ä¸è¡¨ | |
| | | | `sourceId` | æ¥æºåæ® id | |
| | | | `sourceNo` | æ¥æºåå· | |
| | | | `sourceNo` | æ¥æºåå·ï¼è§ä¸è¡¨ | |
| | | | `remark` | 夿³¨ | |
| | | | `createTime` | åçæ¶é´ | |
| | | |
| | | `sourceType` æä¸¾ï¼ |
| | | |
| | | | å¼ | å«ä¹ | 触åç¹ | |
| | | | --- | --- | --- | |
| | | | `1` | éè´å
¥åº | éè´å°è´¦æ°å¢å«è¯¥è§æ ¼çæç» | |
| | | | `2` | ç»´ä¿®é¢ç¨ | è®¾å¤æ¥ä¿®åæ´æ°æ¶é¢ç¨å¤ä»¶ | |
| | | | `3` | ä¿å
»é¢ç¨ | 设å¤ä¿å
»åæ´æ°æ¶é¢ç¨å¤ä»¶ | |
| | | | å¼ | å«ä¹ | 触åç¹ | `sourceNo` åå¼ | |
| | | | --- | --- | --- | --- | |
| | | | `1` | éè´å
¥åº | éè´å°è´¦ä¿åå«è¯¥è§æ ¼çéè´æç» | éè´ååå· | |
| | | | `2` | ç»´ä¿®é¢ç¨ | è®¾å¤æ¥ä¿®åæ´æ°æ¶é¢ç¨å¤ä»¶ | **设å¤åç§°** | |
| | | | `3` | ä¿å
»é¢ç¨ | 设å¤ä¿å
»åæ´æ°æ¶é¢ç¨å¤ä»¶ | **设å¤åç§°** | |
| | | |
| | | > æ¥ä¿®åãä¿å
»åæ¬èº«**没æåå·å段**ï¼æä»¥ `sourceType=2/3` ç `sourceNo` æ¾çæ¯è®¾å¤åç§°ï¼ä¾¿äºå¨æµæ°´é¡µçåºå¤ä»¶ç¨å¨åªå°è®¾å¤ä¸ï¼è¦ä¸é»å°åæ®ç¨ `sourceId`ãè¿ä¸ååç«¯ç´æ¥å±ç¤ºå³å¯ï¼ä¸è¦æãåå·ãæ ¼å¼åæ ¡éªã |
| | | |
| | | > ç»´ä¿®/ä¿å
»**é¢ç¨**仿²¿ç¨åæ `spare_parts_requisition_record`ï¼è®¾å¤ç»´åº¦ï¼å¦æé¡µé¢ï¼ï¼æ¬æ¬¡æ°å¢ç `spare_parts_record` æ¯**å¤ä»¶ç»´åº¦**çè¿åºæµæ°´ï¼ä¸¤è
å¹¶åï¼èè´£ä¸åã |
| | | |
| | |
| | | - [ ] åè´§å°è´¦ä¸è½çå°è¯¥èªå¨çæçåï¼ç¶æä¸º `å·²åè´§` |
| | | - [ ] åä¸äº§å忬¡åºåºï¼çæ**å¦ä¸å¼ **åè´§åï¼ä¸æ¯è¢«æ¦æªï¼ |
| | | - [ ] å é¤åºåºååï¼åè´§å°è´¦ãåè´§æç»ãåºåæ£åè®°å½ä¸å¹¶æ¶å¤± |
| | | - [ ] 客æ·å¾æ¥å表/æç»åºç°ã仿¬¾ãåï¼æå
¥ä¸æ¡ `direction=1` æµæ°´åæ°å¼ååï¼ä¸ãåºæ¶ãä¸å |
| | | - [ ] ä¾åºå徿¥å表/æç»åºç°ã忬¾ãåï¼é»è¾åä¸ |
| | | - [ ] 客æ·å¾æ¥å表/æç»åºç°ã忬¾æµæ°´ãåï¼`receiptRecordAmount`ï¼ï¼æå
¥ä¸æ¡ `partyType=1&direction=1` æµæ°´åæ°å¼ååï¼ä¸ãåºæ¶ãä¸å |
| | | - [ ] ä¾åºå徿¥å表/æç»åºç°ã仿¬¾æµæ°´ãåï¼`paymentRecordAmount`ï¼ï¼æå
¥ä¸æ¡ `partyType=2&direction=2` æµæ°´åæ°å¼ååï¼ä¸ãåºä»ãä¸å |
| | | - [ ] æµæ°´åæ¥å£é½éï¼`/paymentRecord/listPage`ã`add`ã`update`ã`delete`ï¼`partyType` ä¼ `9` è¿åã徿¥æ¹ç±»åä¸åæ³ã |
| | | - [ ] ç¨å¦ä¸ä¸ªæ°æ®èå´çè´¦å·è° `listPage`ï¼ç¡®è®¤ãçä¸å°å«äººå½çæµæ°´ãæ¯é¢æï¼ä¸æ¯æ°å¢å¤±è´¥ï¼ |
| | | - [ ] å¤ä»¶ç»´æ¤è½ä¿å产å大类 + è§æ ¼åå· |
| | | - [ ] æ°å¢ä¸å¼ å«è¯¥è§æ ¼çéè´å°è´¦ï¼å¤ä»¶æ°éå¢å ï¼å¤ä»¶æµæ°´åºç° `direction=1` è®°å½ |
| | | - [ ] è®¾å¤æ¥ä¿®/ä¿å
»é¢ç¨å¤ä»¶åï¼å¤ä»¶æµæ°´åºç° `direction=2` è®°å½ |
| | | - [ ] ç¼è¾è¯¥å°è´¦**å æ**飿¡æç»ï¼å¤ä»¶æ°éååå»ï¼å¯¹åºå
¥åºæµæ°´æ¶å¤± |
| | | - [ ] ç¼è¾è¯¥å°è´¦**æ¹æ°é**ï¼å¤ä»¶æ°éææ°æ°ééç®ï¼ä¸æ¯ä¸¤ä»½ç¸å ï¼ |
| | | - [ ] å é¤è¯¥éè´å°è´¦ï¼å¤ä»¶æ°éååå»ï¼å
¥åºæµæ°´æ¶å¤± |
| | | - [ ] å¤ä»¶å·²è¢«é¢ç¨ååå å°è´¦ï¼å é¤è¢«æç»å¹¶ç»åºãä¸è¶³ä»¥åæ»ãæç¤ºï¼ä¸æ¯è´åºåï¼ |
| | | - [ ] è®¾å¤æ¥ä¿®/ä¿å
»é¢ç¨å¤ä»¶åï¼å¤ä»¶æµæ°´åºç° `direction=2` è®°å½ï¼ä¸ãæ¥æºåå·ãæ¾ç¤ºè®¾å¤åç§° |
| | | - [ ] æ°å¢å
¥åºé订ååï¼æç»åªæ¾ç¤ºéè´ç±»ï¼type=2ï¼äº§å |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | # å§å¤ç®¡ç模åå端èè°ææ¡£ |
| | | |
| | | æ´æ°æ¶é´ï¼2026-09-20 |
| | | éç¨çæ¬ï¼æ¬æ¬¡åç«¯åæ´å |
| | | å端æ°å¢å
ï¼`com.ruoyi.outsourcing` |
| | | |
| | | ## 1. åæ´èå´ |
| | | |
| | | æ°å¢ä¸çº§èåã**å§å¤ç®¡ç**ãï¼ä¸å«ä¸ä¸ªé¡µé¢ï¼ |
| | | |
| | | | é¡µé¢ | è·¯å¾ï¼èåï¼ | å端ç»ä»¶è·¯å¾ | æ¥å£åç¼ | |
| | | | --- | --- | --- | --- | |
| | | | åä½åæ¡£æ¡ | `outsourcingManagement/partner` | `outsourcingManagement/partner/index` | `/outsourcing/partner` | |
| | | | å§å¤è®¢å | `outsourcingManagement/order` | `outsourcingManagement/order/index` | `/outsourcing/order` | |
| | | | åä½å徿¥ | `outsourcingManagement/transactions` | `outsourcingManagement/transactions/index` | `/outsourcing/report` | |
| | | |
| | | ### 1.1 æ°æ®åºèæ¬ï¼éå
æ§è¡ï¼ |
| | | |
| | | | èæ¬ | ä½ç¨ | |
| | | | --- | --- | |
| | | | `doc/20260920_create_outsourcing.sql` | 建 `outsourcing_partner`ã`outsourcing_order`ã`outsourcing_order_product` ä¸å¼ 表 | |
| | | | `doc/20260920_outsourcing_menu.sql` | 建èåï¼`menu_id` 2360~2376ï¼ï¼å¯é夿§è¡ | |
| | | | `doc/20260920_create_payment_record.sql` | `party_type` æ³¨éæ¹ä¸º `1å®¢æ· 2ä¾åºå 3åä½å` | |
| | | |
| | | å·²å»ºè¿ `outsourcing_order_product` çç¯å¢ï¼æ¥åºåæ¹åæ ¼åºååè¿éæ§è¡åæ¹åï¼2026-09-20 å·²å¨å¼ååºæ§è¡ï¼ï¼ |
| | | |
| | | ```sql |
| | | ALTER TABLE outsourcing_order_product |
| | | CHANGE COLUMN stock_uninventory_id stock_inventory_id bigint null comment 'éç¨çæ¥åºååæ ¼åºåidï¼stock_inventory.idï¼åªè¯»å¼ç¨ï¼ä¸åååºåï¼'; |
| | | ALTER TABLE outsourcing_order_product RENAME INDEX idx_stock_uninventory_id TO idx_stock_inventory_id; |
| | | ``` |
| | | |
| | | > 纯æ¹åï¼åéåçåå²å¼ä¸å¨ãå¼ååºè¯¥è¡¨æ æ°æ®ï¼æ é£é©ã |
| | | |
| | | > å·²å»ºè¿ `payment_record` çç¯å¢æ§è¡ï¼ |
| | | > `ALTER TABLE payment_record MODIFY COLUMN party_type tinyint not null comment '徿¥æ¹ç±»å 1å®¢æ· 2ä¾åºå 3åä½å';` |
| | | > 该æä½ä¸ºæ³¨éåæ´ï¼æ æ°æ®é£é©ã |
| | | |
| | | ### 1.2 å¯¹æ¢ææ¨¡åçæ¹å¨ |
| | | |
| | | å§å¤è®¢åæäº¤æ¶ä¼å ç¨æ¥åºååºåï¼èµ°çæ¯**ç°æåºåºå®¡æ¹æºå¶**ï¼å æ¤æ¹å°äº `stock` 模åï¼å端éä¸å¹¶ç¥æï¼ |
| | | |
| | | | æ¹å¨ | 说æ | |
| | | | --- | --- | |
| | | | æ°å¢åºåºç±»å `record_type=30` | ãå§å¤-æ¥åºååºåºãï¼**`type=0` åæ ¼åºåº**ï¼ã**åºåºç®¡ç页çç±»ååéè¦å ä¸è¿ä¸ªæ å°**ï¼å¦åæ¾ç¤ºä¸ºç©º | |
| | | | å¤ç¨ `POST /stockOutRecord/approve` | å§å¤åºåºè®°å½ç¨ç°æå®¡æ¹æ¥å£ï¼**æ²¡ææ°å¢å端æ¥å£** | |
| | | | æ°å¢å
鍿¹æ³ | `StockOutRecordService#listByRecordIds` / `releaseByRecordIds`ï¼åªç»å§å¤è®¢åå
é¨ç¨ï¼å端ä¸ç´æ¥è°ç¨ | |
| | | | æ¥åºåæ¹èµ°åæ ¼åºå | æ¥åºåéæä» `stock_uninventory` æ¹ä¸º `stock_inventory`ï¼åºåºè®°å½ `type` ç± `1` æ¹ä¸º `0`ï¼`outsourcing_order_product.stock_uninventory_id` **æ¹å为 `stock_inventory_id`**ï¼éæ§è¡ 1.1 ç ALTERï¼ | |
| | | | éææ¥å£æªä½ç½® | `GET /stockUninventory/pageScrapStock` **å·²å é¤**ï¼æ¹ä¸º `GET /stockInventory/pageScrapStock`ï¼å§å¤è®¢åç `GET /outsourcing/order/scrapStockPage` è·¯å¾ä¸åãåºååæ®µä¸å | |
| | | | åºåºç±»å `30` æªå°åæ ¼åºåºæä¸¾ | `OUTSOURCING_SCRAP_OUT("30","å§å¤-æ¥åºååºåº")` ä»**å
¥åº**æä¸¾ `StockInQualifiedRecordTypeEnum` ç§»å°**åºåº**æä¸¾ `StockOutQualifiedRecordTypeEnum`ï¼åºåºè®°å½å¯¼åº/䏿æ `type` åæä¸¾ï¼`type=0` åçå°±æ¯åè
ï¼ä¸æªä¼æ¥ç©ºæéï¼ | |
| | | | éæèå´æ¶çª | å§å¤æ¥åºåéæ**åªåäº§åæ ãå±åºå¤ç½®æ¬¡çå±åºã大类ï¼å«åèç¹ï¼**ä¸æåæ ¼åºåçæ¹æ¬¡ï¼ä¸ååå
¨åºåºå | |
| | | | åºåºå®¡æ¹é¡ºå¸¦å®æè®¢å | `POST /stockOutRecord/approve` éè¿æ¶ï¼è¥è¯¥å§å¤è®¢åçæ¥åºååºåºå·²**å
¨é¨éè¿**ï¼èªå¨æè®¢å置为ã已宿ã`2`ï¼`StockOutRecordServiceImpl#batchApprove` å
çå¯ä½ç¨ï¼ä¸æ¯æ°æ¥å£ï¼ | |
| | | |
| | | --- |
| | | |
| | | ## 2. ä¸å¡å£å¾ï¼**å¿
读**ï¼åå端å±ç¤ºå¼ºç¸å
³ï¼ |
| | | |
| | | ### 2.1 å§å¤è®¢åç¶ææµè½¬ |
| | | |
| | | | å¼ | å«ä¹ | å
许æä½ | |
| | | | --- | --- | --- | |
| | | | `0` | è稿 | ç¼è¾ãå é¤ãæäº¤ãä½åº | |
| | | | `1` | 已确认 | 宿ï¼**鿥åºååºåºå·²å®¡æ¹éè¿**ï¼ãä½åº | |
| | | | `2` | 已宿 | ä»
æ¥çï¼ç»æï¼ | |
| | | | `3` | å·²ä½åº | ä»
æ¥çï¼ç»æï¼ | |
| | | |
| | | - `0 --submit--> 1 --complete--> 2` |
| | | - `0 / 1 --cancel--> 3` |
| | | - æ°å¢çå§å¤è®¢å**强å¶ä¸ºè稿**ï¼å端ä¸éè¦ä¹ä¸å
è®¸ä¼ `status`ã |
| | | - **ä¸èµ° OA 审æ¹**ï¼å®¡æ¹æµä¸æ¶åã审æ¹ç®¡çãèåã |
| | | - æäº¤ä¼å ç¨æ¥åºååºåï¼å®æè¦æ±åºåºå·²å®¡æ¹ï¼ä½åºä¼éæ¾å ç¨ ââ è¯¦è§ 2.3ã |
| | | - â ï¸ **`1 â 2` ç°å¨å¤åæ¯èªå¨åçç**ï¼è¯¥è®¢åçæ¥åºååºåºè®°å½**å
¨é¨å®¡æ¹éè¿**æ¶ï¼å端ä¼èªå¨æè®¢åæ¨å°ã已宿ãï¼ä¸éè¦åç¹ã宿ãã`POST /outsourcing/order/complete` ä¿çï¼ä½è®¢åå·²æ¯ `2` æ¶è°ç¨ä¼è¿åãä»
å·²ç¡®è®¤ç¶æçå§å¤è®¢åå
è®¸å®æãï¼**å端建议å¨ç¶æä¸º `1` æ¶ä»æ¾ç¤ºã宿ãæé®ä½ä¸ºå
åºï¼ç¶æä¸º `2` æ¶éè**ã |
| | | |
| | | ### 2.2 åä½å徿¥åºä»å£å¾ |
| | | |
| | | ``` |
| | | åºä»ä½é¢ = å§å¤è®¢åéé¢ï¼status in (1,2)ï¼ â 已仿¬¾ï¼payment_record: party_type=3 and direction=1ï¼ |
| | | ``` |
| | | |
| | | 两个å¿
须注æçç¹ï¼ |
| | | |
| | | 1. **è稿(0) å å·²ä½åº(3) ç订åä¸è®¡å
¥åºä»**ãåªæå·²ç¡®è®¤åå·²å®æè®¡å
¥ã |
| | | 2. **æç»æ¯è¡çã已仿¬¾ãæ¯åä½å级å计ï¼ä¸æ¯è®¢å级**ã`payment_record` 表没æè®¢åç»´åº¦åæ®µï¼æä»¥åä¸åä½åå䏿ææç»è¡ç `paidAmount` æ¯åä¸ä¸ªå¼ï¼ç°æå®¢æ·å¾æ¥ãä¾åºå徿¥ä¹æ¯è¿ä¸ªå£å¾ï¼ã |
| | | â å æ¤**æç»è¡åªæã订åéé¢ãæ¯éè¡åç¡®ç**ï¼`paidAmount` / `payableAmount` 建议åªå¨æ±æ»è¡ï¼å表页ï¼å¼ºè°ï¼æç»è¡è¥è¦å±ç¤ºéå è¯´æææ¡ã |
| | | |
| | | ### 2.3 æ¥åºåéæçåºåèå¨ï¼**æäº¤å³å ç¨ãåºåºå®¡æ¹æå®æ£**ï¼ |
| | | |
| | | å§å¤è®¢åæç»å¯éãæ¥åºåãåºåæ¹æ¬¡ ââ éæå¼¹çª**åªååºç¡æ°æ®äº§åæ éãå±åºå¤ç½®æ¬¡çå±åºã大类ï¼å«å
¶ææåèç¹ï¼ä¸ãä¸æåæ ¼åºåçæ¹æ¬¡**ï¼å
¶å®äº§å大类çåºåä¸åºç°ãéæåçæ¯**åæ ¼åºå `stock_inventory`**ï¼èå¨èµ°çæ¯**ç°æåºåºå®¡æ¹é£å¥æºå¶**ï¼æ¶åºå¦ä¸ï¼ |
| | | |
| | | | ç¯è | åºåå¨ä½ | |
| | | | --- | --- | |
| | | | éæï¼å端弹çªï¼ | åªè¯»æ¥è¯¢ï¼ä¸å¨åºå | |
| | | | 建è稿 / ç¼è¾è稿 / å é¤è稿 | **ä¸å¨åºå** | |
| | | | **æäº¤**ï¼`0 â 1`ï¼ | æ¯æ¡éæè¡å䏿¡**å¾
审æ¹åºåºè®°å½**ï¼**`type=0` åæ ¼åºåº**ï¼ãè®°å½ä¸è½åºå°±éè¿ãå¾
审æ¹åºåºéãæå¯ç¨éå ä½ï¼**ä½ä¸æ¹ `qualitity`** | |
| | | | **åºåºå®¡æ¹**ï¼åºåºç®¡ç页 `/stockOutRecord/approve`ï¼ | 审æ¹**éè¿**æ¶æçæ£æ£ `stock_inventory.qualitity`ï¼æè§æ ¼+æ¹å·ï¼ | |
| | | | **宿**ï¼`1 â 2`ï¼ | **èªå¨è§¦å**ï¼è¯¥è®¢åçæ¥åºååºåºè®°å½**å
¨é¨å®¡æ¹éè¿**çé£ä¸å»ï¼å端èªå¨æè®¢åæ¨å°ã已宿ããä¹å¯ä»¥æå·¥è° `/complete`ï¼åç½®æ ¡éªåæ ·æ¯ãåºåºå
¨é¨å·²å®¡æ¹éè¿ãï¼å¦åæç» | |
| | | | **ä½åº**ï¼`1 â 3`ï¼ | éæ¾å ç¨ï¼å¾
审æ¹/驳åçè®°å½**ç´æ¥å é¤**ï¼å ç¨éä¹éæ¾ï¼ï¼å·²å®¡æ¹éè¿çè®°å½**ææ¹æ¬¡å½è¿ `stock_inventory.qualitity`**ï¼åå é¤ | |
| | | |
| | | å
³é®å£å¾ï¼ |
| | | |
| | | - **å¯ç¨é = `qualitity` â `locked_quantity` â å¾
审æ¹åºåºé**ãæäº¤æ¶å°±æ¯æè¿ä¸ªå£å¾æ ¡éªçï¼ä¸è¶³ä¼ç´æ¥æ¥éå¹¶æç¤ºå½åå¯ç¨éãå 为å¾
审æ¹è®°å½ä¹ç®å ç¨ï¼**å䏿¹æ¬¡ä¸ä¼è¢«å¤å¼ å§å¤è®¢åè¶
é**ã |
| | | - æä»¥åºåºè®°å½éæ¢æå§å¤**èªå·±**å çï¼ä¹æéè´éè´§ãéå®åè´§ãçäº§é¢æç**å
¶å®ä¸å¡**å çï¼é½æ¯åä¸å¥ç®æ³ï¼äºç¸å¯è§ã |
| | | - æç»è¡ä¸ç `availableQuantity` 仿¯**ä¸åé£ä¸å»çå¿«ç
§**ï¼ä»
ä¾åç
§ï¼çå®å¯ç¨é以æäº¤æ¶çæ ¡éªç»æä¸ºåã |
| | | - `lockedQuantity`ï¼`stock_inventory.locked_quantity`ï¼æ¯**å»ç»é**ï¼åºåºçä¸å¡å¨ç¨ï¼åå§å¤å ç¨ä¸æ¯ä¸åäºã |
| | | |
| | | ### 2.4 å§å¤åºåºè®°å½é¿ä»ä¹æ ·ãå»åªå®¡æ¹ |
| | | |
| | | - åºåºç±»ååºå®ä¸º **`30`ãå§å¤-æ¥åºååºåºã**ï¼`record_type=30`ã**`type=0` åæ ¼åºåº**ï¼ã该åå¼å·²å è¿**åæ ¼åºåºæä¸¾ `StockOutQualifiedRecordTypeEnum`**ï¼å æ¤ `/basic/enum/stockRecordType` ä¼èªå¨å¸¦ä¸å®ï¼åç«¯å¯¼åº Excel ä¹è½æ£ç¡®æ¾ç¤ºã**å端è¥ç¨çæ¯è¿ä¸ªæ¥å£åç±»å䏿/æ å°ï¼æ éæ¹å¨**ï¼åªæå½ç±»å忝å端硬ç¼ç æ å°è¡¨æ¶æéè¦è¡¥ `30`ã |
| | | - `record_id` = **å§å¤è®¢åæç»è¡ id**ï¼`outsourcing_order_product.id`ï¼ï¼ä¸æ¯è®¢å idã |
| | | - åºåºæ¹æ¬¡å·ï¼`outboundBatches`ï¼å½¢å¦ `CK20260920001`ï¼æäº¤åå¯å¨åºåºç®¡ç页æç±»å `30` è¿æ»¤ã |
| | | - 审æ¹ç¨**ç°æ**æ¥å£ `POST /stockOutRecord/approve`ï¼body `{ "ids": [åºåºè®°å½id], "approvalStatus": 1 }`ï¼`1` éè¿ / `2` 驳åï¼ã**ä¸éè¦æ°å¢å端æ¥å£**ã |
| | | - **审æ¹éè¿ä¼é¡ºå¸¦å®æå§å¤è®¢å**ï¼å¦æè¿æ¡åºåºè®°å½æ¯è¯¥è®¢åæ¥åºååºåºç**æå䏿¡å¾
审æ¹**ï¼å®¡æ¹æ¥å£è¿ååå§å¤è®¢åç¶æå°±å·²ç»æ¯ `2`ã已宿ãäºãå端审æ¹å®å·æ°å°±ä¼çå°è®¢åå已宿ï¼ä¸éè¦åè° `/complete`ã |
| | | - 䏿¬¡å®¡æ¹å¤æ¡ï¼`ids` ä¼ å¤æ¡ãåå±ä¸å订åï¼æ¶ï¼æ¯ä¸ªè®¢ååèªå¤æï¼å¤æ¡ä»¶çé½ä¼èªå¨å®æã |
| | | - **驳åï¼`approvalStatus=2`ï¼ä¸ä¼åé订åç¶æ**ï¼è®¢å仿¯ã已确认ãï¼èµ°ãå审 â éè¿ãæãä½åºã两æ¡åºè·¯ï¼è§ 2.3 çå
³é®å£å¾ï¼ã |
| | | - å·²èªå¨å®æç订åè¥ä¹å被**å审**ï¼`/stockOutRecord/reAudit`ï¼ï¼è®¢åç¶æ**ä¹ä¿æå¨ã已宿ãä¸åé**ï¼éè¦äººå·¥éæ°å®¡æ¹ååå¤çã |
| | | - â ï¸ **æ°æ®æéå½±å**ï¼`stock_out_record` ä¸å¨æ°æ®æéç½ååéï¼**åºåºç®¡çå表å审æ¹é½ä¼è¢« `create_user`/`dept_id` è¿æ»¤**ãä¹å°±æ¯è¯´åºåºå®¡æ¹å¿
é¡»ç±**ä¸æäº¤äººåæ°æ®èå´**çè´¦å·ï¼æ `dataScope=1`/admin è´¦å·æ¥åï¼å¦å伿¥ãåºåºè®°å½ä¸åå¨ããè¿æ¯æ¢æè¡ä¸ºï¼åæ ¼/ä¸åæ ¼/éå®åºåºç审æ¹é½ä¸æ ·ï¼ï¼æ¬æ¬¡æªæ¹ã |
| | | - å§å¤è®¢åèªå·±ç两个å¨ä½ï¼å®æçåºåºæ ¡éªãä½åºçå ç¨éæ¾ï¼**å·²æ¾å¼è·³è¿æ°æ®æé**ï¼ä¸ä¼å 为æ¢è´¦å·èæ¼æ ¡éªæéæ¾ä¸æã |
| | | - **åºåºè¢«é©³åæä¹å**ï¼é©³åå该记å½çå¾
审æ¹å ç¨ä¼ç«å³éæ¾ï¼ä½å§å¤è®¢å仿¯ã已确认ãï¼æ¤æ¶ `complete` ä¼è¢«æã两æ¡åºè·¯ï¼å°åºåºç®¡çç¹ãå审ã`POST /stockOutRecord/reAudit` éåå¾
审æ¹å审æ¹éè¿ï¼æç´æ¥ `/cancel` ä½åºè¯¥å§å¤è®¢åï¼é©³åçè®°å½ä¼è¢«å æï¼ã |
| | | |
| | | --- |
| | | |
| | | ## 3. å
Œ
±å段说æï¼å端èªå¨ç»´æ¤ï¼å端åªè¯»ï¼ |
| | | |
| | | | åæ®µ | 说æ | |
| | | | --- | --- | |
| | | | `orderNo` | å§å¤è®¢åå·ï¼æ°å¢æ¶å端çæï¼æ ¼å¼ `WWDD` + æ¥æ + 彿¥æµæ°´ï¼å¦ `WWDD20260920001`ã**å端ä¸è¦ä¼ **ï¼ä¼ äºä¹ä¼è¢«å¿½ç¥ã | |
| | | | `partnerName` | 便® `partnerId` 忥åå¡«ï¼å端ä¸å¿
ä¼ ï¼ä¼ äºä»¥åç«¯ç»æä¸ºåï¼ã | |
| | | | `contractAmount` | **å端ææç» `taxInclusiveTotalPrice` å计è¦çåå
¥**ï¼åç«¯ä¼ äºä¹ä¼è¢«è¦çã请ä¿è¯æç»éå«ç¨æ»ä»·æ£ç¡®ã | |
| | | | `applyDate` | ä¸ä¼ æ¶é»è®¤å½å¤©ã | |
| | | | `productCategory` / `specificationModel` | **æç»è¡**ä¸è¿ä¸¤ä¸ªå段ç±åç«¯æ ¹æ® `productId` / `productModelId` 忥åå
¥ï¼å端åªéä¼ idã | |
| | | | `status` / `confirmTime` / `cancelReason` | ç±ç¶ææµè½¬æ¥å£åå
¥ï¼å端ä¸è¦ç´æ¥æ¹ã | |
| | | | `tenantId` / `deptId` / `createUser` / `createTime` / `updateTime` | å端èªå¨å¡«å
ï¼å端ä¸è¦ä¼ ã | |
| | | |
| | | --- |
| | | |
| | | ## 4. åä½åæ¡£æ¡æ¥å£ |
| | | |
| | | ### 4.1 å页æ¥è¯¢ |
| | | |
| | | `GET /outsourcing/partner/listPage` |
| | | |
| | | **请æ±åæ°**ï¼å为å¯éï¼ |
| | | |
| | | | åæ° | ç±»å | 说æ | |
| | | | --- | --- | --- | |
| | | | `partnerName` | string | åä½ååç§°ï¼æ¨¡ç³å¹é
| |
| | | | `partnerType` | string | åä½åç±»åï¼ç²¾ç¡®å¹é
| |
| | | | `isWhite` | number | æ¯å¦ç½ååï¼`1` æ¯ / `0` å¦ | |
| | | | `pageNum` / `pageSize` | number | å页忰 | |
| | | |
| | | **è¿å**ï¼`{ total, records, size, current, ... }`ï¼**注æ**ï¼æ¤æ¥å£è¿åçæ¯ MyBatis-Plus ç `IPage` ç»æï¼åæ®µæ¯ `records`ï¼ä¸æ¯ RuoYi ç `rows`ï¼ã |
| | | |
| | | ```json |
| | | { |
| | | "code": 200, |
| | | "msg": "æä½æå", |
| | | "data": { |
| | | "records": [ |
| | | { |
| | | "id": 1, |
| | | "partnerName": "åéXXç¯ä¿ç§ææéå
¬å¸", |
| | | "taxpayerIdentificationNum": "91320600MA1XXXXXXX", |
| | | "companyAddress": "åéå¸XXåºXXè·¯1å·", |
| | | "companyPhone": "0513-88888888", |
| | | "bankAccountName": "ä¸å½é¶è¡åéåè¡", |
| | | "bankAccountNum": "5200000000000000", |
| | | "contactUserName": "æå", |
| | | "contactUserPhone": "13800000000", |
| | | "maintainUserId": 1, |
| | | "maintainUserName": "管çå", |
| | | "maintainTime": "2026-09-20", |
| | | "partnerType": "å±åºå¤ç½®", |
| | | "isWhite": 1, |
| | | "remark": "", |
| | | "createTime": "2026-09-20 10:12:33" |
| | | } |
| | | ], |
| | | "total": 1, |
| | | "size": 10, |
| | | "current": 1 |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | ### 4.2 详æ
ï¼å«éä»¶åæ¾ï¼ |
| | | |
| | | `GET /outsourcing/partner/{id}` |
| | | |
| | | **è¿å**ï¼`data` 为åä½å对象ï¼å¦å« `storageBlobVOS`ï¼éä»¶æ°ç»ï¼ã |
| | | |
| | | ```json |
| | | { |
| | | "code": 200, |
| | | "msg": "æä½æå", |
| | | "data": { |
| | | "id": 1, |
| | | "partnerName": "åéXXç¯ä¿ç§ææéå
¬å¸", |
| | | "maintainUserName": "管çå", |
| | | "storageBlobVOS": [ |
| | | { |
| | | "id": 301, |
| | | "originalFilename": "è¥ä¸æ§ç
§.pdf", |
| | | "url": "http://xxx/preview/xxx", |
| | | "downloadURL": "http://xxx/download/xxx", |
| | | "storageAttachmentId": 501 |
| | | } |
| | | ] |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | ### 4.3 æ°å¢ |
| | | |
| | | `POST /outsourcing/partner/add`ï¼`Content-Type: application/json` |
| | | |
| | | **请æ±ä½** |
| | | |
| | | ```json |
| | | { |
| | | "partnerName": "åéXXç¯ä¿ç§ææéå
¬å¸", |
| | | "taxpayerIdentificationNum": "91320600MA1XXXXXXX", |
| | | "companyAddress": "åéå¸XXåºXXè·¯1å·", |
| | | "companyPhone": "0513-88888888", |
| | | "bankAccountName": "ä¸å½é¶è¡åéåè¡", |
| | | "bankAccountNum": "5200000000000000", |
| | | "contactUserName": "æå", |
| | | "contactUserPhone": "13800000000", |
| | | "partnerType": "å±åºå¤ç½®", |
| | | "isWhite": 1, |
| | | "remark": "", |
| | | "storageBlobDTOS": [ |
| | | { "id": 301 } |
| | | ] |
| | | } |
| | | ``` |
| | | |
| | | **è¿å**ï¼`data` 为æ°å»ºåä½å idã |
| | | |
| | | ```json |
| | | { "code": 200, "msg": "æä½æå", "data": 1 } |
| | | ``` |
| | | |
| | | > éä»¶æµç¨ï¼å
è° `POST /common/upload`ï¼`multipart/form-data`ï¼å段å `files`ï¼å¯å¤æä»¶ï¼æ¿å° `List<StorageBlobVO>`ï¼ååºæ¯æ¡ç `id` ç»æ `storageBlobDTOS` ä¸èµ·æäº¤å³å¯ã**ä¸éè¦**ååç¬è° `/storageAttachment/add`ã |
| | | > æ°å¢æ¶ `storageBlobDTOS` å¯ä¸ä¼ æä¼ 空æ°ç»ã |
| | | |
| | | ### 4.4 ä¿®æ¹ |
| | | |
| | | `POST /outsourcing/partner/update`ï¼`Content-Type: application/json` |
| | | |
| | | 请æ±ä½å 4.3ï¼**å¿
须带 `id`**ã |
| | | |
| | | > **éä»¶æ¯å
¨éè¦çç**ï¼æäº¤æ¶ `storageBlobDTOS` ä¼ ä»ä¹å°±æ¯ä»ä¹ãä¼ `[]` æ `null` ä¼**æ¸
空**该åä½åå·²ç»å®çææéä»¶ãå端ç¼è¾æ¶è¯·æåæ¾ç `storageBlobVOS` è½¬æ¢æ `storageBlobDTOS` ä¸å¹¶æäº¤ã |
| | | |
| | | ### 4.5 å é¤ |
| | | |
| | | `DELETE /outsourcing/partner/del`ï¼`Content-Type: application/json` |
| | | |
| | | **请æ±ä½**ï¼id æ°ç»ï¼æ¯ææ¹éã |
| | | |
| | | ```json |
| | | [1, 2] |
| | | ``` |
| | | |
| | | > å é¤å伿 ¡éªå¼ç¨ï¼è¯¥åä½åè¥å·²åå¨**å§å¤è®¢å**æ**徿¥æ¶ä»æ¬¾è®°å½**ï¼ä¼è¢«æç»ï¼è§ 7. 常è§é误ï¼ã |
| | | |
| | | ### 4.6 å¯¼åº |
| | | |
| | | `POST /outsourcing/partner/export`ï¼åæ°å 4.1 æ¥è¯¢æ¡ä»¶ï¼form å½¢å¼ï¼ï¼è¿å Excel æä»¶æµï¼ç´æ¥ `responseType: 'blob'` ä¸è½½ã |
| | | |
| | | ### 4.7 ä¸è½½å¯¼å
¥æ¨¡æ¿ |
| | | |
| | | `POST /outsourcing/partner/downloadTemplate`ï¼æ åæ°ï¼è¿å Excel æä»¶æµã |
| | | |
| | | ### 4.8 导å
¥ |
| | | |
| | | `POST /outsourcing/partner/import`ï¼`multipart/form-data`ï¼å段å `file`ã |
| | | |
| | | ```json |
| | | { "code": 200, "msg": "导å
¥æå" } |
| | | ``` |
| | | |
| | | ### 4.9 䏿é项 |
| | | |
| | | `GET /outsourcing/partner/getOptions` |
| | | |
| | | **è¿å**ï¼`data` 为åä½åæ°ç»ï¼ä»
å« `id`ã`partnerName`ï¼æ id ååºã |
| | | |
| | | ```json |
| | | { |
| | | "code": 200, |
| | | "msg": "æä½æå", |
| | | "data": [ { "id": 1, "partnerName": "åéXXç¯ä¿ç§ææéå
¬å¸" } ] |
| | | } |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ## 5. å§å¤è®¢åæ¥å£ |
| | | |
| | | ### 5.1 å页æ¥è¯¢ |
| | | |
| | | `GET /outsourcing/order/list` |
| | | |
| | | **请æ±åæ°** |
| | | |
| | | | åæ° | ç±»å | 说æ | |
| | | | --- | --- | --- | |
| | | | `orderNo` | string | 订åå·ï¼æ¨¡ç³å¹é
| |
| | | | `partnerId` | number | åä½åidï¼ç²¾ç¡®å¹é
| |
| | | | `partnerName` | string | åä½ååç§°ï¼æ¨¡ç³å¹é
| |
| | | | `projectName` | string | 项ç®åç§°ï¼æ¨¡ç³å¹é
| |
| | | | `status` | number | ç¶æï¼è§ 2.1 | |
| | | | `startDate` | string | ç³è¯·æ¥æèµ·ï¼`yyyy-MM-dd` | |
| | | | `endDate` | string | ç³è¯·æ¥ææ¢ï¼`yyyy-MM-dd` | |
| | | | `pageNum` / `pageSize` | number | å页忰 | |
| | | |
| | | **è¿å**ï¼RuoYi æ ååé¡µç»æ `{ total, rows, code, msg }`ï¼**æ³¨ææ¤å¤æ¯ `rows`**ï¼ã |
| | | |
| | | ```json |
| | | { |
| | | "total": 1, |
| | | "rows": [ |
| | | { |
| | | "id": 7, |
| | | "orderNo": "WWDD20260920001", |
| | | "partnerId": 1, |
| | | "partnerName": "åéXXç¯ä¿ç§ææéå
¬å¸", |
| | | "applyDate": "2026-09-20", |
| | | "expectedDeliveryDate": "2026-09-30", |
| | | "projectName": "å±åºå¤ç½®", |
| | | "contractAmount": 5000.00, |
| | | "paymentMethod": "çµæ±", |
| | | "remarks": "", |
| | | "status": 1, |
| | | "confirmTime": "2026-09-20 11:00:00", |
| | | "cancelReason": null, |
| | | "createTime": "2026-09-20 10:12:33" |
| | | } |
| | | ], |
| | | "code": 200, |
| | | "msg": "æ¥è¯¢æå" |
| | | } |
| | | ``` |
| | | |
| | | > å表**ä¸è¿å** `productData` æç»ã |
| | | |
| | | ### 5.2 详æ
|
| | | |
| | | `GET /outsourcing/order/getById?id={id}` |
| | | |
| | | **è¿å**ï¼`data` 为订å对象ï¼å段å 5.1ï¼å¦å« `productData` æç»æ°ç»ï¼ã |
| | | |
| | | ```json |
| | | { |
| | | "code": 200, |
| | | "msg": "æä½æå", |
| | | "data": { |
| | | "id": 7, |
| | | "orderNo": "WWDD20260920001", |
| | | "partnerId": 1, |
| | | "partnerName": "åéXXç¯ä¿ç§ææéå
¬å¸", |
| | | "status": 1, |
| | | "contractAmount": 5000.00, |
| | | "productData": [ |
| | | { |
| | | "id": 31, |
| | | "outsourcingOrderId": 7, |
| | | "productId": 491, |
| | | "productModelId": 1001, |
| | | "productCategory": "ç²æ²¹åºç©", |
| | | "specificationModel": "HW08-1", |
| | | "unit": "å¨", |
| | | "quantity": 5, |
| | | "taxRate": 13, |
| | | "taxInclusiveUnitPrice": 1000.00, |
| | | "taxInclusiveTotalPrice": 5000.00, |
| | | "isScrap": true, |
| | | "stockInventoryId": 9001, |
| | | "batchNo": "P20260901", |
| | | "availableQuantity": 100.00, |
| | | "remark": "" |
| | | } |
| | | ] |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | ### 5.3 æ°å¢ï¼èç¨¿ï¼ |
| | | |
| | | `POST /outsourcing/order/add`ï¼`Content-Type: application/json` |
| | | |
| | | **请æ±ä½**ï¼å 5.2 ç `data` ç»æï¼`id`ã`orderNo`ã`status`ã`confirmTime` ä¸éè¦ä¼ ã |
| | | |
| | | ```json |
| | | { |
| | | "partnerId": 1, |
| | | "projectName": "å±åºå¤ç½®", |
| | | "applyDate": "2026-09-20", |
| | | "expectedDeliveryDate": "2026-09-30", |
| | | "paymentMethod": "çµæ±", |
| | | "remarks": "", |
| | | "productData": [ |
| | | { |
| | | "productId": 491, |
| | | "productModelId": 1001, |
| | | "unit": "å¨", |
| | | "quantity": 5, |
| | | "taxRate": 13, |
| | | "taxInclusiveUnitPrice": 1000.00, |
| | | "taxInclusiveTotalPrice": 5000.00, |
| | | "isScrap": true, |
| | | "stockInventoryId": 9001, |
| | | "batchNo": "P20260901", |
| | | "availableQuantity": 100.00 |
| | | } |
| | | ] |
| | | } |
| | | ``` |
| | | |
| | | **è¿å**ï¼`data` 为æ°å»ºè®¢å idã |
| | | |
| | | ### 5.4 ä¿®æ¹ |
| | | |
| | | `POST /outsourcing/order/edit`ï¼`Content-Type: application/json` |
| | | |
| | | 请æ±ä½å 5.3ï¼**å¿
须带 `id`**ï¼æç»é**å
¨éæäº¤**ï¼å端为ãå
å åæãï¼ã**ä»
èç¨¿ç¶æå
许**ã |
| | | |
| | | ### 5.5 å é¤ |
| | | |
| | | `DELETE /outsourcing/order/delete`ï¼`Content-Type: application/json` |
| | | |
| | | **请æ±ä½**ï¼id æ°ç»ã**ä»
èç¨¿ç¶æå
许**ã |
| | | |
| | | ```json |
| | | [7, 8] |
| | | ``` |
| | | |
| | | ### 5.6 æäº¤ |
| | | |
| | | `POST /outsourcing/order/submit?id={id}` |
| | | |
| | | > `id` æ¯ **query åæ°**ï¼ä¸æ¯è¯·æ±ä½ã |
| | | |
| | | è稿 â 已确认ãåç½®æ ¡éªï¼åä½ååå¨ãæç»é空ãéé¢ > 0ã**æ¥åºåéæè¡çå¯ç¨éè¶³å¤**ã |
| | | **ä¼å ç¨æ¥åºååºå**ï¼åå¾
审æ¹åºåºè®°å½ï¼ï¼è¯¦è§ 2.3ã |
| | | è¿å `{ "code": 200, "msg": "æä½æå" }`ã |
| | | |
| | | ### 5.7 宿 |
| | | |
| | | `POST /outsourcing/order/complete?id={id}` |
| | | |
| | | 已确认 â 已宿ã**åç½®æ ¡éªï¼æ¥åºåéæçåºåºè®°å½å¿
é¡»å
¨é¨å®¡æ¹éè¿**ï¼è§ 2.3 / 2.4ï¼ï¼ |
| | | æªéè¿æ¶è¿åãæ¥åºååºåºæªå®¡æ¹éè¿ï¼è¯·å
å°åºåºç®¡ç审æ¹åºåºæ¹æ¬¡ï¼CKxxxxãã |
| | | |
| | | > â ï¸ è¿ä¸æ¥**é常ä¸éè¦å端è°ç¨**äºï¼åºåºè®°å½å
¨é¨å®¡æ¹éè¿æ¶å端ä¼èªå¨å®æè®¢åï¼è§ 2.3 / 2.4ï¼ã |
| | | > æ¬æ¥å£ä¿çä½å
åºï¼è®¢åå·²æ¯ `2` æ¶è°ç¨è¿åãä»
å·²ç¡®è®¤ç¶æçå§å¤è®¢åå
è®¸å®æãã |
| | | |
| | | ### 5.8 ä½åº |
| | | |
| | | `POST /outsourcing/order/cancel?id={id}&cancelReason={åå }` |
| | | |
| | | è稿æå·²ç¡®è®¤ â å·²ä½åºã`cancelReason` å¯éã |
| | | **已确认çåä½åºä¼éæ¾æ¥åºåå ç¨**ï¼æªå®¡æ¹çåºåºè®°å½ç´æ¥å æï¼å·²å®¡æ¹éè¿çæåºåææ¹æ¬¡å½è¿ï¼è§ 2.3ï¼ã |
| | | |
| | | > â ï¸ å 为åºåºå
¨é¨éè¿ä¼èªå¨å®æè®¢åï¼ç¶æå `2`ï¼ï¼**å·²èªå¨å®æçåä¸è½åä½åº**ï¼ä¼è¿åã该å§å¤è®¢å已宿æå·²ä½åºï¼ä¸å
许éå¤ä½åºãã |
| | | > ãä½åºå½è¿å·²å®¡æ¹åºåãè¿æ¡è·¯å¾ç°å¨åªå¯¹**é¨ååºåºå·²éè¿**çåï¼ä»å¤äº `1`ï¼ææã |
| | | |
| | | ### 5.9 å¯¼åº |
| | | |
| | | `POST /outsourcing/order/export`ï¼åæ°å 5.1ï¼è¿å Excel æä»¶æµã |
| | | |
| | | ### 5.10 æ¥åºåéæå页ï¼çº¯æ¥è¯¢ï¼ä¸å åºåï¼ |
| | | |
| | | `GET /outsourcing/order/scrapStockPage` |
| | | |
| | | > **ç»æå·²æ¶çªå°ãå±åºå¤ç½®æ¬¡çå±åºã**ï¼åªè¿åäº§åæ éãå±åºå¤ç½®æ¬¡çå±åºã大类ï¼å«å
¶ææåèç¹ï¼ä¸æåæ ¼åºåçæ¹æ¬¡ãå
¶å®å¤§ç±»çåºå**ä¸ä¼åºç°**ï¼å端ä¸éè¦é¢å¤ä¼ å¤§ç±»åæ°ï¼ä¹ä¸éè¦èªå·±è¿æ»¤ã |
| | | > è¥è¯¥å¤§ç±»å¨äº§åæ éä¸åå¨ï¼æåå被æ¹è¿ï¼ï¼æ¥å£è¿å空å表 ââ è¿æ¯å¯ä¸ä¼è®©å¼¹çªç©ºæçåå ï¼ææ¥æ¶å
ç¡®è®¤äº§åæ éç大类å仿¯ãå±åºå¤ç½®æ¬¡çå±åºãã |
| | | |
| | | **请æ±åæ°** |
| | | |
| | | | åæ° | ç±»å | 说æ | |
| | | | --- | --- | --- | |
| | | | `productModelId` | number | è§æ ¼idï¼ç²¾ç¡®å¹é
ï¼ä¸ä¼ åè¿å该大类ä¸å
¨é¨æ¹æ¬¡ | |
| | | | `batchNo` | string | æ¹å·ï¼æ¨¡ç³å¹é
| |
| | | | `productName` | string | 产ååç§°ï¼æ¨¡ç³å¹é
ï¼åªå¨è¯¥å¤§ç±»çèå´å
è¿æ»¤ï¼ | |
| | | | `pageNum` / `pageSize` | number | å页忰 | |
| | | |
| | | **è¿å**ï¼`data` 为 `IPage` ç»æï¼åæ®µæ¯ `records`ï¼ã |
| | | |
| | | ```json |
| | | { |
| | | "code": 200, |
| | | "msg": "æä½æå", |
| | | "data": { |
| | | "records": [ |
| | | { |
| | | "id": 9001, |
| | | "productModelId": 1001, |
| | | "batchNo": "P20260901", |
| | | "qualitity": 100.00, |
| | | "lockedQuantity": 0, |
| | | "unLockedQuantity": 100.00, |
| | | "model": "HW08-1", |
| | | "unit": "å¨", |
| | | "productName": "ç²æ²¹åºç©", |
| | | "remark": "", |
| | | "version": 0 |
| | | } |
| | | ], |
| | | "total": 1 |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | > è¿éæ¥çæ¯**åæ ¼åºå `stock_inventory`**ï¼ä¸ `/stockInventory/pageScrapStock` åæºï¼ãåºå管ç页ç `/stockInventory/pagestockInventory` æªå任使¹å¨ï¼å®ä¸è¿å `batchNo`ï¼ï¼éæè¯·ç¨æ¬æ¥å£ã |
| | | > â ï¸ æ¬æ¥å£æ¯çº¯æ¥è¯¢ï¼**ä¸ä¼**å ç¨åºåãçæ£çå ç¨åçå¨å§å¤è®¢å**æäº¤**æ¶ï¼è§ 2.3ï¼ãå¦å¤è¿éè¿åç `unLockedQuantity` = `qualitity â lockedQuantity`ï¼**没æåå»å¾
审æ¹åºåºé**ï¼æä»¥å®æ¯ãè´¦é¢å¯ç¨éãï¼ä¸æ¯æäº¤æ¶æ ¡éªç¨ççå®å¯ç¨éã |
| | | |
| | | --- |
| | | |
| | | ## 6. åä½å徿¥æ¥å£ |
| | | |
| | | ### 6.1 徿¥æ±æ»ï¼åè¡¨ï¼ |
| | | |
| | | `GET /outsourcing/report/partnerTransactions` |
| | | |
| | | **请æ±åæ°** |
| | | |
| | | | åæ° | ç±»å | 说æ | |
| | | | --- | --- | --- | |
| | | | `partnerName` | string | åä½ååç§°ï¼æ¨¡ç³å¹é
| |
| | | | `pageNum` / `pageSize` | number | å页忰 | |
| | | |
| | | **è¿å**ï¼`data` 为 `IPage` ç»æï¼åæ®µæ¯ `records`ï¼ã |
| | | |
| | | ```json |
| | | { |
| | | "code": 200, |
| | | "msg": "æä½æå", |
| | | "data": { |
| | | "records": [ |
| | | { |
| | | "partnerId": 1, |
| | | "partnerName": "åéXXç¯ä¿ç§ææéå
¬å¸", |
| | | "contractAmounts": 5000.00, |
| | | "paidAmount": 2000.00, |
| | | "receiptAmount": 0.00, |
| | | "payableAmount": 3000.00 |
| | | } |
| | | ], |
| | | "total": 1 |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | ### 6.2 徿¥æç»ï¼é订åï¼ |
| | | |
| | | `GET /outsourcing/report/partnerTransactionsDetails?partnerId={id}` |
| | | |
| | | **è¿å**ï¼`data` 为 `IPage` ç»æï¼åæ®µæ¯ `records`ï¼ã |
| | | |
| | | ```json |
| | | { |
| | | "code": 200, |
| | | "msg": "æä½æå", |
| | | "data": { |
| | | "records": [ |
| | | { |
| | | "outsourcingOrderId": 7, |
| | | "orderNo": "WWDD20260920001", |
| | | "partnerId": 1, |
| | | "partnerName": "åéXXç¯ä¿ç§ææéå
¬å¸", |
| | | "applyDate": "2026-09-20", |
| | | "contractAmount": 5000.00, |
| | | "status": 1, |
| | | "paidAmount": 2000.00, |
| | | "payableAmount": 3000.00 |
| | | } |
| | | ], |
| | | "total": 1 |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | > â ï¸ æ¯è¡ç `paidAmount` æ¯**åä½å级å计**ï¼åä¸åä½åæææç»è¡é½ä¸æ ·ï¼ï¼è§ 2.2ã |
| | | |
| | | ### 6.3 æç»è¡ãæ°å¢ä»æ¬¾ã |
| | | |
| | | æç»**æ¯ä¸æ¡**é½å¯ä»¥å ãæ°å¢ä»æ¬¾ãæé®ï¼è°ç¨**ç°æç**徿¥æµæ°´æ¥å£ï¼æ éæ°å¢å端æ¥å£ï¼ï¼ |
| | | |
| | | `POST /paymentRecord/add`ï¼`Content-Type: application/json` |
| | | |
| | | ```json |
| | | { |
| | | "partyType": 3, |
| | | "partyId": 1, |
| | | "direction": 1, |
| | | "amount": 1000.00, |
| | | "recordDate": "2026-09-20", |
| | | "paymentMethod": "çµæ±", |
| | | "remark": "第ä¸ç¬å§å¤æ±æ¬¾" |
| | | } |
| | | ``` |
| | | |
| | | | åæ° | åå¼ | |
| | | | --- | --- | |
| | | | `partyType` | åºå® `3`ï¼åä½åï¼ | |
| | | | `partyId` | æç»è¡ç `partnerId`ï¼**䏿¯** `outsourcingOrderId`ï¼ | |
| | | | `direction` | `1` 仿¬¾ï¼åå°åºä»ï¼ / `2` 忬¾ | |
| | | | `amount` | éé¢ | |
| | | |
| | | **注æ**ï¼ |
| | | |
| | | - å端æ°å¢äº `partyType` ç½ååæ ¡éªï¼åªå
许 `1` / `2` / `3`ï¼ä¼ å
¶å®å¼è¿åã徿¥æ¹ç±»åä¸åæ³ãã |
| | | - æ°å¢å**åä½å徿¥å表ç `paidAmount` ä¼å¢å ã`payableAmount` ä¼åå°**ï¼ç±äº `payment_record` 没æè®¢åç»´åº¦ï¼æç»é**ææè¡**ç `paidAmount` é½ä¼åã |
| | | - â ï¸ ç°æ `/paymentRecord/delete` æ¥å£**没æå½å±æ ¡éª**ï¼ä»»ä½ç»å½äººé½è½å ä»»ææµæ°´ï¼å«åä½å仿¬¾ï¼ãè¿æ¯æ¢æé£é©ï¼æ¬æ¬¡æªæ¹ï¼å端å¦è¦åå 餿é®è¯·å äºæ¬¡ç¡®è®¤ã |
| | | - æ¥è¯¢/ä¿®æ¹/å 餿µæ°´æ²¿ç¨ç°ææ¥å£ï¼`GET /paymentRecord/listPage`ã`POST /paymentRecord/update`ã`DELETE /paymentRecord/delete`ã |
| | | |
| | | --- |
| | | |
| | | ## 7. 常è§é误è¿å |
| | | |
| | | ç»ä¸ä¸º `{ "code": 500, "msg": "<é误信æ¯>" }`ï¼åç«¯ç´æ¥ toast `msg`ã |
| | | |
| | | | msg | 触ååºæ¯ | |
| | | | --- | --- | |
| | | | `请填ååä½ååç§°` | æ°å¢åä½åæ¶ `partnerName` 为空 | |
| | | | `åä½åå·²åå¨` | åç§æ·ä¸ `partnerName` éå¤ï¼æ°å¢/ä¿®æ¹ï¼ | |
| | | | `åä½åidä¸è½ä¸ºç©º` | ä¿®æ¹æªä¼ `id` | |
| | | | `åä½åä¸åå¨` | 详æ
/ä¿®æ¹ä¼ å
¥ç id ä¸åå¨ | |
| | | | `åä½åä¸åå¨ï¼è¯·éæ°éæ©` | æ°å¢/ä¿®æ¹å§å¤è®¢åæ¶ `partnerId` æ¥ä¸å° | |
| | | | `åä½åå·²åå¨å§å¤è®¢åï¼ä¸å
许å é¤` | å é¤åä½åæ¶å
¶åä¸è¿æå§å¤è®¢å | |
| | | | `åä½åå·²åå¨å¾æ¥æ¶ä»æ¬¾è®°å½ï¼ä¸å
许å é¤` | å é¤åä½åæ¶å
¶åä¸è¿æä»æ¬¾æµæ°´ | |
| | | | `è¯·éæ©è³å°ä¸æ¡æ°æ®` | å é¤åä½åæ¶è¯·æ±ä½ä¸ºç©º | |
| | | | `å§å¤è®¢åä¸åå¨` | 详æ
/ç¼è¾/ç¶ææµè½¬ä¼ å
¥ç id ä¸åå¨ | |
| | | | `å§å¤è®¢åidä¸è½ä¸ºç©º` | ä¿®æ¹/ç¶ææµè½¬æªä¼ id | |
| | | | `ä»
èç¨¿ç¶æçå§å¤è®¢åå
许修æ¹` | 对éè稿åè°ç¨ç¼è¾ | |
| | | | `ä»
èç¨¿ç¶æçå§å¤è®¢åå
许å é¤ï¼<åå·>` | 对éè稿åè°ç¨å é¤ï¼ä¼åæ¾å
·ä½åå· | |
| | | | `ä»
èç¨¿ç¶æçå§å¤è®¢åå
许æäº¤` | 对éè稿åè°ç¨æäº¤ | |
| | | | `请å
éæ©ææåä½ååæäº¤` | æäº¤æ¶ `partnerId` ä¸ºç©ºææ¥ä¸å° | |
| | | | `å§å¤è®¢å没æäº§åæç»ï¼æ æ³æäº¤` | æäº¤æ¶æ æç»è¡ | |
| | | | `å§å¤è®¢åéé¢å¿
é¡»å¤§äº 0 æè½æäº¤` | æäº¤æ¶éé¢ä¸º 0 | |
| | | | `该å§å¤è®¢åå·²æäº¤ï¼è¯·å¿é夿ä½` | å¹¶å/éå¤ç¹å»æäº¤ | |
| | | | `æ¥åºåéæè¡ç¼ºå°äº§åè§æ ¼ææ¹å·ï¼æ æ³æäº¤` | éæè¡ç `productModelId` æ `batchNo` 为空 | |
| | | | `æ¥åºåéæè¡æ°éå¿
é¡»å¤§äº 0` | éæè¡æ°é为 0 æè´æ° | |
| | | | `æ¥åºåãXãæ¹å·ãYãç³è¯·æ°éè¶
è¿å¯ç¨åºåï¼å½åå¯ç¨åºå为ï¼Z` | æäº¤æ¶è¯¥æ¹æ¬¡å¯ç¨éä¸å¤ï¼å®æ¶å£å¾ï¼å«å
¶å®ä¸å¡çå¾
审æ¹å ç¨ï¼ | |
| | | | `ä»
å·²ç¡®è®¤ç¶æçå§å¤è®¢åå
è®¸å®æ` | 对é已确认åè°ç¨å®æ | |
| | | | `æ¥åºååºåºæªå®¡æ¹éè¿ï¼è¯·å
å°åºåºç®¡ç审æ¹åºåºæ¹æ¬¡ï¼CKxxxx` | å®ææ¶æ¥åºååºåºè¿æ²¡å®¡æ¹éè¿ | |
| | | | `æ¥åºåéæç¼ºå°åºåºè®°å½ï¼è¯·å
ä½åºåéæ°æäº¤` | 已确认åçåºåºè®°å½ä¸å
¨ï¼æ°æ®å¼å¸¸ï¼ | |
| | | | `该å§å¤è®¢å已宿æå·²ä½åºï¼ä¸å
许éå¤ä½åº` | å¯¹ç»æåè°ç¨ä½åº | |
| | | | `åºåè®°å½ä¸æ²¡æå¯¹åºç产å,æ æ³å½è¿,åºåºæ¹æ¬¡:CKxxxx` | ä½åºå½è¿æ¶åºåè¡å·²ä¸åå¨ï¼æ°æ®å¼å¸¸ï¼ | |
| | | | `åºåºè®°å½ç±»åå¼å¸¸ï¼æ æ³å½è¿åºå,åºåºæ¹æ¬¡:CKxxxx` | ä½åºå½è¿æ¶åºåºè®°å½ç `type` æ¢ä¸æ¯ `0` ä¹ä¸æ¯ `1`ï¼æ°æ®å¼å¸¸ï¼ | |
| | | | `徿¥æ¹ç±»åä¸åæ³` | `/paymentRecord/add`ã`/update` ç `partyType` ä¸å¨ 1/2/3 å
| |
| | | | `è¯·éæ©è¦å é¤çå§å¤è®¢å` | å 餿¥å£è¯·æ±ä½ä¸ºç©ºæ°ç» | |
| | | |
| | | --- |
| | | |
| | | ## 8. èè°æ£æ¥æ¸
å |
| | | |
| | | **ç¯å¢åæ** |
| | | |
| | | 1. ä¸ä¸ª SQL èæ¬å·²æ§è¡ï¼`payment_record` ç `party_type` 注éå·²æ¹ä¸ºä¸å¼ï¼**å¹¶å·²æ§è¡ 1.1 èç `outsourcing_order_product` åæ¹å ALTER**ãåºåè卿¬èº«å¤ç¨ç°æ `stock_out_record` / `stock_inventory`ï¼ä¸éè¦æ°å¢è¡¨ã |
| | | 2. å·²å夿¥åºååºç¡æ°æ®ï¼`product` å¨ãå±åºå¤ç½®æ¬¡çå±åºã䏿ä¸ä¸ªäº§åï¼`product_model` æå
¶è§æ ¼ï¼**`stock_inventory`ï¼åæ ¼åºåï¼æå¯¹åº `product_model_id` çæ¹æ¬¡**ã |
| | | 3. â ï¸ **æ°æ®æéæé**ï¼`outsourcing_partner`ã`outsourcing_order` æ¯å表æ¥è¯¢çé¡¶å±ä¸»è¡¨ï¼**ä¼åæ°æ®æéè¿æ»¤**ï¼`create_user` / `dept_id`ï¼ï¼å `supplier_manage`ã`purchase_ledger` ç°ç¶ä¸è´ã |
| | | â èè°ç¨ `dataScope=1` çè´¦å·æ admin éªè¯ï¼å¦å容æè¯¯å¤ãåè½åäºãï¼è¡¨ç°ä¸ºï¼å«äººå»ºçæ°æ®èªå·±çä¸å°ï¼ã |
| | | â åä½å徿¥åè¡¨ä¸æç»**两侧å£å¾å·²å¯¹é½**ï¼ä¸æ½å è¡çº§æ°æ®æéï¼ï¼ä¸ä¼åºç°ãå表æåºä»ãç¹è¿æç» 0 è¡ãã |
| | | 4. â ï¸ **åºåºå®¡æ¹çè´¦å·è¦æ±**ï¼`stock_out_record` ä»å¨æ°æ®æé管æ§å
ï¼**åºåºç®¡ç页çå表å审æ¹å¿
é¡»ç¨ä¸æäº¤äººåæ°æ®èå´çè´¦å·ï¼æ `dataScope=1`/admin**ï¼å¦åæ¥ãåºåºè®°å½ä¸åå¨ããè¯¦è§ 2.4ã |
| | | |
| | | **åè½æ£æ¥** |
| | | |
| | | 5. èååºç°ãå§å¤ç®¡ç â åä½åæ¡£æ¡ / å§å¤è®¢å / åä½å徿¥ãï¼ç¹å»æ 404ã |
| | | 6. `/outsourcing/partner/add` åªä¼ `partnerName`ï¼è½æ°å¢æåï¼è¿å idï¼`/listPage` è½çå°ã |
| | | 7. åä½åéåæ°å¢ï¼è¿åãåä½åå·²åå¨ãã |
| | | 8. éä»¶ï¼ä¸ä¼ æä»¶ â æè¿åç blob `id` æ¾è¿ `storageBlobDTOS` æäº¤ â `/outsourcing/partner/{id}` ç `storageBlobVOS` è½åæ¾ï¼åç¼è¾æäº¤ç©ºæ°ç» â é件被æ¸
空ï¼ç¬¦å 4.4 çå
¨éè¦çè¯ä¹ï¼ã |
| | | æ°æ®åºæ ¸å¯¹ï¼`select a.*, b.original_filename from storage_attachment a join storage_blob b on a.storage_blob_id = b.id where a.record_type = 'outsourcing_partner' and a.record_id = ?` |
| | | 9. åä½å导åºãä¸è½½æ¨¡æ¿ã导å
¥ä¸ä¸ªæ¥å£è½æ£å¸¸èµ°éã |
| | | 10. `/outsourcing/partner/getOptions` è¿å `id` + `partnerName`ã |
| | | 11. å é¤æè®¢åçåä½åï¼è¿åãåä½åå·²åå¨å§å¤è®¢åï¼ä¸å
许å é¤ãã |
| | | 12. `scrapStockPage?pageNum=1&pageSize=10`ï¼**åªè¿åãå±åºå¤ç½®æ¬¡çå±åºã大类ä¸çæ¹æ¬¡**ï¼å¸¦ `batchNo`ã`unLockedQuantity`ãæ ¸å¯¹ï¼ |
| | | `select si.id, si.product_model_id, si.batch_no, si.qualitity from stock_inventory si join product_model pm on si.product_model_id = pm.id` ââ è¿åçè¡æ°åºçäºã该大类åå
¶åèç¹ä¸çè§æ ¼ã对åºçåºåè¡æ°ï¼æ¯å
¨è¡¨å°ï¼å¼ååº 10 è¡åºåªå© 1 è¡ï¼ã |
| | | **åå½**ï¼`/stockInventory/pagestockInventory` è¿åå¼ä¸æ¹å¨åä¸è´ï¼ä¸å¸¦ `batchNo`ï¼ï¼`/stockUninventory/pagestockUninventory`ï¼ä¸åæ ¼åºåï¼å®å
¨ä¸åå½±åã |
| | | 13. `/outsourcing/order/add` 建è稿ï¼å«æ¥åºåéæè¡ï¼ï¼æåï¼`orderNo` å½¢å¦ `WWDD20260920001`ï¼`contractAmount` = æç»å«ç¨æ»ä»·å计ã |
| | | 14. è稿å `/edit`ï¼æç»å
¨éæ¿æ¢çæï¼æ¹æ°éãå¢å è¡é½æ£ç¡®ï¼ã |
| | | 15. è稿å `/submit`ï¼ç¶æå `1`ï¼`confirmTime` æå¼ï¼**åç¹ä¸æ¬¡**è¿åã该å§å¤è®¢åå·²æäº¤ï¼è¯·å¿é夿ä½ãã |
| | | 16. éè稿å `/edit`ã`/delete`ï¼è¢«æç»å¹¶ç»åºå¯¹åºæç¤ºã |
| | | 17. `/outsourcing/report/partnerTransactions`ï¼`contractAmounts` = 该åä½å `status in (1,2)` 订åéé¢å计ã |
| | | **éç¹**ï¼å»ºä¸å¼ è稿ãä¸å¼ ä½åºåï¼ç¡®è®¤å®ä»¬çéé¢**没æ**被ç®è¿ `contractAmounts`ã |
| | | 18. `/paymentRecord/add` æä¸¤ç¬ `{partyType:3, partyId, direction:1, amount:1000}`ï¼å¾æ¥å表 `paidAmount` å 2000ã`payableAmount` ç¸åºåå°ã |
| | | 19. `/paymentRecord/add` ä¼ `partyType=9`ï¼è¿åã徿¥æ¹ç±»åä¸åæ³ãã |
| | | 20. `/outsourcing/report/partnerTransactionsDetails?partnerId=xxx`ï¼æç»è¡æ°ä¸è®¢åæ°ä¸è´ï¼`paidAmount` æ¯è¡ç¸åï¼ç¬¦å 2.2 å£å¾ï¼ã |
| | | |
| | | **æ¥åºååºåèå¨ï¼éç¹ï¼** |
| | | |
| | | 21. **建è稿ä¸å åºå**ï¼å»ºä¸å¼ 带æ¥åºåéæè¡çèç¨¿ï¼æ¯å¯¹ `stock_inventory` ç `qualitity` **å** `stock_out_record` è®°å½æ° ââ é½ä¸åºæååã |
| | | 22. **æäº¤å³å ç¨**ï¼`/submit` ååºåºç°ä¸æ¡ `record_type='30' and type='0' and approval_status=0` çåºåºè®°å½ï¼`record_id` = è¯¥éææç»è¡ idï¼`stock_out_num` = æç»æ°éï¼`batch_no` = éä¸çæ¹å·ã |
| | | æ¤æ¶ `qualitity` **仿ªå**ï¼ä½ `scrapStockPage` è¿åçå¯ç¨éï¼`unLockedQuantity`ï¼**ä¸å
å«**å¾
审æ¹åºåºéï¼è¯·æ¹ç¨ä»¥ä¸ SQL æ ¸å¯¹çå®å¯ç¨éï¼ |
| | | `select si.qualitity - ifnull(si.locked_quantity,0) - (select ifnull(sum(sor.stock_out_num),0) from stock_out_record sor where sor.product_model_id=si.product_model_id and sor.batch_no<=>si.batch_no and sor.type='0' and sor.approval_status=0) as available from stock_inventory si where si.id=?` |
| | | 23. **é²è¶
é**ï¼å¯¹å䏿¹æ¬¡å建ä¸å¼ åãæ°éå¡«ãè¶
è¿çå®å¯ç¨éãï¼æäº¤åºè¿åãæ¥åºåãXãæ¹å·ãYãç³è¯·æ°éè¶
è¿å¯ç¨åºåï¼å½åå¯ç¨åºå为ï¼Zãã |
| | | 24. **宿åå¿
é¡»åºåºå®¡æ¹**ï¼å¯¹æªå®¡æ¹åºåºç已确认åè° `/complete`ï¼è¿åãæ¥åºååºåºæªå®¡æ¹éè¿ï¼è¯·å
å°åºåºç®¡ç审æ¹åºåºæ¹æ¬¡ï¼CKxxxxãã |
| | | 25. **åºåºå®¡æ¹æå®æ£ + èªå¨å®æ**ï¼å°åºåºç®¡ç页æç±»åãå§å¤-æ¥åºååºåºãæ¾å°è¯¥è®°å½ â `POST /stockOutRecord/approve` `{"ids":[id],"approvalStatus":1}` â æ¤æ¶ `stock_inventory.qualitity` **æåå°**ï¼åå°é = åºåºæ°éï¼ï¼ä¸**该å§å¤è®¢åç¶æåºå·²èªå¨åæ `2`ã已宿ã**ï¼æ¥ `select id, status from outsourcing_order where id=?`ï¼ã |
| | | 26. **æå·¥å®æä»å¯ç¨ï¼å
åºï¼**ï¼è®¢åå·²æ¯ `2` æ¶åè° `/complete`ï¼è¿åãä»
å·²ç¡®è®¤ç¶æçå§å¤è®¢åå
è®¸å®æãã |
| | | 27. **å¤è¡è®¢åè¦çæå䏿¡**ï¼ä¸å¼ è®¢åæ 2 æ¡æ¥åºåéæè¡ï¼åºåºè®°å½ 2 æ¡ï¼å
å®¡æ¹ 1 æ¡ â 订å仿¯ `1`ï¼å®¡æ¹ç¬¬ 2 æ¡ â 订åå `2`ã |
| | | 28. **驳åä¸åé**ï¼å¦ä¸å¼ 已确认åçåºåºè®°å½å®¡æ¹é©³åï¼`approvalStatus=2`ï¼â å§å¤è®¢åä»ä¸º `1`ï¼æ¤æ¶ `/complete` ä¼è¢«æï¼åºåºæªå
¨é¨éè¿ï¼ã |
| | | 29. **ä½åºéæ¾ï¼æªå®¡æ¹ï¼**ï¼å¦ä¸å¼ 已确认åï¼åºåºä»å¾
审æ¹ï¼è° `/cancel` â åºåºè®°å½è¢«å é¤ã`qualitity` ä¸åãå ç¨éæ¾ï¼çå®å¯ç¨éæ¢å¤ï¼ã |
| | | 30. **ä½åºå½è¿ï¼é¨å已审æ¹ï¼**ï¼è®¢åæ 2 æ¡éæè¡ï¼åºåºè®°å½å®¡æ¹éè¿å
¶ä¸ 1 æ¡ï¼æ¤æ¶è®¢åè¿æ¯ `1`ï¼å 为æªå
¨é¨éè¿ï¼â è° `/cancel` â å·²éè¿ç飿¡**ææ¹æ¬¡å½è¿ `qualitity`**ï¼åºåºè®°å½è¢«å é¤ã |
| | | 31. **å·²èªå¨å®æçåä¸è½åä½åº**ï¼åºåº**å
¨é¨**éè¿å订åå·²æ¯ `2`ï¼`/cancel` è¿åã该å§å¤è®¢å已宿æå·²ä½åºï¼ä¸å
许éå¤ä½åºããè¦æ¤éåªè½å
å°åºåºç®¡çãå审ãå¹¶éæ°å¤ç ââ **订åç¶æä¸ä¼èªå¨åéå°ã已确认ã**ãè¿æ¯èªå¨å®æå¸¦æ¥çè¡ä¸ºååï¼å端ä¸è¦ç»ç¶æ `2` çåæ¾ç¤ºãä½åºãæé®ã |
| | | 32. **åå½**ï¼`locked_quantity` å
¨ç¨ä¸åï¼`/stockInventory/pagestockInventory`ã`/stockUninventory/pagestockUninventory` è¿åå¼ä¸æ¹å¨åä¸è´ï¼ä¸åæ ¼åºå `stock_uninventory` å
¨ç¨ä¸åå§å¤å½±åï¼**å
¶å®ä¸å¡ï¼éå®åè´§ãéè´éè´§ãçäº§é¢æï¼çåºåºå®¡æ¹ä¸åå½±å**ï¼èªå¨å®æåªå¨ `record_type=30` æ¶è§¦åï¼ã |
| | | 29. **åå½**ï¼`locked_quantity` å
¨ç¨ä¸åï¼`/stockInventory/pagestockInventory`ã`/stockUninventory/pagestockUninventory` è¿åå¼ä¸æ¹å¨åä¸è´ï¼ä¸åæ ¼åºå `stock_uninventory` å
¨ç¨ä¸åå§å¤å½±åã |
| | | |
| | | --- |
| | | |
| | | ## 9. å端æ¹é 建议 |
| | | |
| | | 1. æ°å»ºä¸ä¸ªé¡µé¢ç»ä»¶ï¼è·¯å¾è§ç¬¬ 1 èè¡¨æ ¼ï¼ï¼åä½åæ¡£æ¡é¡µé¢å¯ç´æ¥åç
§ãä¾åºåæ¡£æ¡ã页é¢ç»æï¼**å¤ä¸ä¸ªéä»¶ä¸ä¼ åºå**ã |
| | | 2. å§å¤è®¢åæ°å¢/ç¼è¾è¡¨å建议åç
§ãéè´è®¢åã页é¢ï¼æç»è¡å¢å ã鿥åºåãæé®ï¼å¼¹çªè°ç¨ `scrapStockPage`ï¼éä¸åæ `stockInventoryId`ã`batchNo`ã`availableQuantity`ã`productModelId`ã`unit` åå¡«å°æç»è¡ã |
| | | 3. 注æè¿åç»æä¸ç»ä¸ï¼åä½å `listPage` / éæ / 徿¥ä¸ä¸ªæ¥å£æ¯ `data.records`ï¼å§å¤è®¢å `list` æ¯é¡¶å± `rows`ï¼RuoYi `TableDataInfo`ï¼ã |
| | | 4. ç¶æåç¨ tag åºåé¢è²ï¼`0` è稿ï¼ç°ï¼/ `1` 已确认ï¼èï¼/ `2` 已宿ï¼ç»¿ï¼/ `3` å·²ä½åºï¼çº¢ï¼ã |
| | | 5. æé®æ¾éæ 2.1 çç¶æè¡¨æ§å¶ï¼`submit` / `complete` / `cancel` 建议å äºæ¬¡ç¡®è®¤ã |
| | | â ï¸ **åºåºå®¡æ¹éè¿ä¼èªå¨æè®¢åæ¨å°ã已宿ã**ï¼æä»¥å®¡æ¹å®å·æ°å表æ¶ç¶æå¯è½å·²ç»åäºï¼ |
| | | - ã宿ãæé®ï¼åªå¨ç¶æ `1` æ¶æ¾ç¤ºï¼ä½ä¸ºå
åºï¼ï¼ç¶æ `2` æ¶éèã |
| | | - ãä½åºãæé®ï¼ç¶æ `2` æ¶ä¸è½æ¾ç¤ºï¼åç«¯ä¼æç»ï¼ã |
| | | 6. åä½å徿¥çæç»å¼¹çªéï¼æ¯è¡æ¾ãæ°å¢ä»æ¬¾ãæé®ï¼å¼¹è¡¨åæäº¤å° `/paymentRecord/add`ï¼`partyType` åºå® `3`ã`partyId` åå表è¡ç `partnerId`ï¼**䏿¯**订å idï¼ï¼æäº¤æååå·æ°å¾æ¥æ±æ»åæç»ã |
| | | 7. ç¼è¾åä½åæ¶ï¼å¡å¿
æè¯¦æ
æ¥å£è¿åç `storageBlobVOS` 转æ `{ id }` åè¿ `storageBlobDTOS` åæäº¤ï¼å¦å伿¸
空éä»¶ã |
| | | 8. **åºåºç®¡ç页çç±»åæ å°**ï¼`record_type=30`ãå§å¤-æ¥åºååºåºãå·²å è¿åç«¯åæ ¼åºåºæä¸¾ï¼`/basic/enum/stockRecordType` ä¼å¸¦åºæ¥ãè¥åºåºç®¡ç页çç±»åå/䏿æ¯**å端硬ç¼ç æ å°è¡¨**ï¼éè¦è¡¥ `30 â å§å¤-æ¥åºååºåº`ï¼å¦åå§å¤äº§ççåºåºè®°å½ä¼æ¾ç¤ºæç©ºæéå¼ã |
| | | 9. å§å¤è®¢åçãç¶æãä¸ãåºåºæ¯å¦å·²å®¡æ¹ãæ¯ä¸¤ä»¶äºï¼å·²ç¡®è®¤çåç¹ã宿ãå¯è½å 为åºåºæ²¡å®¡æ¹è被æã建议å¨è®¢å详æ
æåè¡¨ä¸æå
³èåºåºè®°å½çç¶æä¸å¹¶å±ç¤ºï¼`GET /stockOutRecord/listPage?recordType=30` å¯æç±»åè¿æ»¤ï¼ï¼å¦åç¨æ·ä¼ä»¥ä¸ºæ¯ç³»ç»æ¥éã |
| | | 10. æäº¤å§å¤è®¢åå建议å
æç¤ºãæäº¤åå°å ç¨æéæ¥åºåæ¹æ¬¡çå¯ç¨éï¼éå°åºåºç®¡ç审æ¹éè¿åæè½å®æè®¢åãï¼é¿å
ç¨æ·ä¸ç解为ä»ä¹æäº¤ååºåå¯ç¨éåäºã |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | # æ²¹ååºåºèå¨åè´§å°è´¦ å端èè°ææ¡£ |
| | | |
| | | æ´æ°æ¶é´ï¼2026-09-20 |
| | | éç¨çæ¬ï¼æ¬æ¬¡åç«¯åæ´å |
| | | éæ±æ¥æºï¼èè°åé¦ãåºåºäºä¸æ¡ï¼åºåºç±»å«=éå®ï¼ï¼ä½ `/shippingInfo/listPage` åè´§å°è´¦æ²¡ææ°æ®ã |
| | | |
| | | --- |
| | | |
| | | ## 1. èæ¯ï¼ä¸ºä»ä¹ä¹åæ¯ç©ºç |
| | | |
| | | **䏿¯æ¥å£åäºï¼æ¯ãåºåºå°è´¦ãåãåè´§å°è´¦ãæ¬æ¥æ¯ä¸¤å¥ä¸è¥¿ã** |
| | | |
| | | - åè´§å°è´¦ï¼èå 2230ï¼è¯»çæ¯ `shipping_info` 表ï¼è¯¥è¡¨å¨æ¹åæ¯ **0 è¡**ã |
| | | - `shipping_info` åªæä¸¤ä¸ªåå
¥æ¹ï¼`POST /shippingInfo/add`ï¼èµ°å货审æ¹ï¼ã以å `POST /stockmanagement/stockout` ä¸ `type=2`ï¼éå®åºåºï¼ã |
| | | - æ²¹ååºåºè¡¨åèµ°çæ¯ `POST /stockInventory/addOilOutRecordOnly`ï¼å®çè¯ä¹æ¯**åªè½ä¸æ¡ `stock_out_record`ï¼ä¸å¨åºåãä¸å»ºåè´§å**ââæä»¥åè´§å°è´¦æ°¸è¿çä¸å°å®ã |
| | | |
| | | ç»ä¸éæ±æ¹ç¡®è®¤ï¼éç¨ä¸¤ä¸ªå£å¾ï¼æ¬æ¬¡å·²å®ç°ï¼ |
| | | |
| | | | å£å¾ | å®ç° | |
| | | | --- | --- | |
| | | | åè´§å°è´¦**ç´æ¥è¯»** `stock_out_record` | `/shippingInfo/listPage` æ¹ä¸º `shipping_info UNION ALL stock_out_record` | |
| | | | éå®ç±»åºåº**è¦æ£åºå** | åºåºå®¡æ¹éè¿æ¶æã产åè§æ ¼ + æ¹æ¬¡ãæ£å `stock_inventory` | |
| | | |
| | | **æ¬æ¬¡æ²¡æä»»ä½ DDL**ï¼ç¨å°ç `stock_out_record.batch_no`ã`out_category`ã`tank_no`ã`truck_plate_no` çåé½å·²åå¨ã |
| | | |
| | | --- |
| | | |
| | | ## 2. åè´§å°è´¦å表å¥çº¦ï¼**å¿
ç `source`**ï¼ |
| | | |
| | | `GET /shippingInfo/listPage` è¿å `R.data.records`ï¼**ç°å¨å
å«ä¸¤ç±»æ¥æºçè¡**ï¼é æ°å¢å段 `source` åºåï¼ |
| | | |
| | | | `source` | æ¥æºè¡¨ | 说æ | |
| | | | --- | --- | --- | |
| | | | `shipping` | `shipping_info` | åæçåè´§åï¼éå®å°è´¦åè´§ / éè´è®°å½åºåºèªå¨çæï¼ | |
| | | | `oilOut` | `stock_out_record` | æ¬æ¬¡æ°å¢ï¼`out_category='éå®'` ä¸ `approval_status=1` çæ²¹ååºåº | |
| | | |
| | | ### 2.1 â ï¸ `id` 伿å·ï¼ç»ä¸è½æ `id` ç´æ¥æä½ |
| | | |
| | | 两类表ç `id` æ¯**åèªçåºåï¼ä¼æå·**ããåè´§ / å é¤ / 详æ
/ éè´§ãè¿äºæ¥å£èå齿¯ `shipping_info`ï¼ |
| | | |
| | | - `POST /shippingInfo/deductStock` |
| | | - `DELETE /shippingInfo/delete` |
| | | - `POST /shippingInfo/update` |
| | | - éè´§ç¸å
³æ¥å£ |
| | | |
| | | **对 `source='oilOut'` çè¡è°è¿äºæ¥å£ä¼æä½å°å¦ä¸æ¡å®å
¨æ å
³çåè´§åã** å端å¿
é¡»æ `source` åæ¯ï¼ |
| | | |
| | | - `source='shipping'` â æé®ç
§æ§ |
| | | - `source='oilOut'` â **éè**ãåè´§ / å é¤ / éè´§ãæé®ï¼è¦æä½è¯·è·³ãåºåºå°è´¦ã页ï¼ç¨æ°å¢å段 `stockOutRecordId` å®ä½ |
| | | |
| | | ### 2.2 æ²¹ååºåºè¡çåæ®µæ å° |
| | | |
| | | | åè´§å°è´¦å | `oilOut` è¡åå¼ | |
| | | | --- | --- | |
| | | | `stockOutRecordId` | `stock_out_record.id`ï¼**ç¨è¿ä¸ªï¼ä¸è¦ç¨ `id`**ï¼ | |
| | | | `shippingNo` | `outbound_batches`ï¼å³ CK åºåºåå·ï¼ | |
| | | | `status` | åºå® `å·²åè´§` | |
| | | | `shippingDate` | `out_date` | |
| | | | `shippingCarNumber` | `truck_plate_no` | |
| | | | `customerName` | `customer_name` | |
| | | | `specificationModel` / `unit` / `productName` | ç± `product_model_id` å
³è `product_model` â `product` | |
| | | | `totalQuantity` | `stock_out_num` | |
| | | | `outboundBatches` | `outbound_batches`ï¼CK åºåºåå·ï¼**䏿¯æ¹å·**ï¼ | |
| | | | `outBatchNo` | `batch_no`ï¼æ¹å·ï¼`source='shipping'` è¡æä¸º `null`ï¼ | |
| | | | `batchNoList` | ç±æ¬è¡åæ®µæ¼æçåå
ç´ æ°ç»ï¼ä¾è¯¦æ
å¼¹æ¡ãæ¹å·ãæç»è¡¨ç¨ï¼ä»
`oilOut` è¡ï¼ | |
| | | | `outCategory` / `tankNo` / `oilProduct` / `oilDepotName` / `driverName` / `contactPerson` / `contactPhone` | åååºåºä¾§åï¼æ°å¢åºåï¼å¯ç¨ä½å±ç¤ºï¼ | |
| | | | `salesContractNo` / `expressNumber` / `expressCompany` / `salesLedgerId` | **æä¸ºç©º**ï¼æ²¹ååºåºæ²¡æååå·/å¿«éåï¼ | |
| | | |
| | | ### 2.2.1 æ¹å·æä¹æ¾ç¤ºï¼è¯¦æ
å¼¹æ¡ï¼ |
| | | |
| | | æ²¹ååºåºç**æ¹å·**ï¼å½¢å¦ `20260917-CY001-001`ï¼æ¤åå端ä¸ä¸ªåæ®µé½æ²¡åï¼æ¬æ¬¡è¡¥ä¸äºï¼ |
| | | |
| | | - æ°å¢åºå `outBatchNo` = `stock_out_record.batch_no`ã**å«å `outboundBatches` ææ··**ï¼åè
æ¯ CK åºåºåå·ã |
| | | - æ°å¢åºå `batchNoList`ï¼**ä»
`source='oilOut'` è¡æå¼**ï¼ä¸æ¡åºåºå¯¹åºä¸ä¸ªæ¹å·ï¼ï¼ç»æï¼ |
| | | |
| | | ```json |
| | | "batchNoList": [ |
| | | { |
| | | "batchNo": "20260917-CY001-001", |
| | | "productName": "æ´æ²¹", |
| | | "specificationModel": "02#æ´æ²¹", |
| | | "deliveryQuantity": 9.0000 |
| | | } |
| | | ] |
| | | ``` |
| | | |
| | | å端 `deliveryLedger/index.vue` ç详æ
å¼¹æ¡ `getDeliveryProductInfoList()` æ¬æ¥å°±ä¼è¯» `row.batchNoList`ï¼å®æ¯å
åºé¾ `batchNoDetailList â batchNoList â shippingBatchList â â¦` ç第äºé¡¹ï¼ï¼**æä»¥è¯¥é¡µä¸æ¹ä»£ç ä¹è½æ¾ç¤ºåºæ¹å·**ã |
| | | |
| | | > â ï¸ **详æ
å¼¹æ¡å¦æä¸ä¸ªå¿
须修çå**ï¼`openDetail()` ä¼ç¨ `getDeliveryDetail(row.id)` åè°ä¸æ¬¡ `/shippingInfo/getDateil/{id}`ï¼è该æ¥å£æ¥çæ¯ `shipping_info` + `shipping_product_detail`ã对 `source='oilOut'` çè¡ä¼ è¿å»çæ¯**åºåºè®°å½ id**ï¼ä¸æ¦æä¸åå·ç `shipping_info`ï¼å°±ä¼**æå¦ä¸æ¡åè´§åçæç»æ¾ç¤ºåºæ¥**ââå 为 `detailProductList` çä¼å
级é«äº `row.batchNoList`ã |
| | | > **建议**ï¼`openDetail` éæ `source` 忝ï¼`oilOut` è¡**ä¸è¦**åè° `getDateil`ï¼ç´æ¥ç¨ `row.batchNoList`ã |
| | | |
| | | å¦å¤ï¼**主å表å½å没æãæ¹å·ãå**ï¼ç°æåï¼éå®è®¢å / å货订åå· / 项ç®åç§° / 客æ·åç§° / 产ååç§° / è§æ ¼åå· / åè´§æ¶é´ / åè´§æ°é / å货车çå· / å¿«éå
¬å¸ / å¿«éåå· / å®¡æ ¸ç¶æ / åºåºåå· / éè´§å / æä½ï¼ãè¥è¦å¨ä¸»å表ä¹å±ç¤ºï¼å ä¸åç»å® `outBatchNo` å³å¯ã |
| | | |
| | | ### 2.3 çéè¡ä¸º |
| | | |
| | | | æ¥è¯¢åæ° | `shipping` è¡ | `oilOut` è¡ | |
| | | | --- | --- | --- | |
| | | | `shippingNo` | `shipping_info.shipping_no` | `stock_out_record.outbound_batches` | |
| | | | `shippingCarNumber` | `shipping_info.shipping_car_number` | `stock_out_record.truck_plate_no` | |
| | | | `salesContractNo` | `sales_ledger.sales_contract_no` | **æä¸å¹é
**ï¼æååå·çéæ¶ä¸ä¼è¿åæ²¹åè¡ï¼è¿æ¯å»æçï¼ | |
| | | | `expressNumber` | `shipping_info.express_number` | **æä¸å¹é
** | |
| | | |
| | | --- |
| | | |
| | | ## 3. æ²¹ååºåºè¡¨åï¼**ãåºåºæ¹æ¬¡ãå¿
å¡«** |
| | | |
| | | æ°å¢æ ¡éªï¼`out_category='éå®'` æ¶ `batchNo` ä¸è½ä¸ºç©ºï¼å¦åæ°å¢æ¥å£ç´æ¥è¿åé误 **ãéå®ç±»åºåºå¿
须鿩åºåºæ¹æ¬¡ã**ã |
| | | |
| | | > 注æï¼è¿ä¸ªæ ¡éªå¨**æ°å¢æ¶**å°±çæï¼ä¸æ¯ç审æ¹ãå端请æãåºåºæ¹æ¬¡ãå¨åºåºç±»å«=é宿¶åæå¿
å¡«ï¼é¿å
ç¨æ·æäº¤åæåç°ã |
| | | > |
| | | > åºåºç±»å«æ¯ã代å¨ãã客åãæ¶**ä¸éè¦**æ¹æ¬¡ï¼ä¹ä¸æ£åºåã |
| | | |
| | | æ¹æ¬¡åé建议ä¸è¯¥è§æ ¼çå
¥åºæ¹æ¬¡ä¸è´ï¼`GET /stockInventory/getBatchNoQty?productModelId=xxx`ã |
| | | |
| | | --- |
| | | |
| | | ## 4. æ£åºåçæ¶æº |
| | | |
| | | | å¨ä½ | `stock_inventory` åå¨ | |
| | | | --- | --- | |
| | | | æ°å¢éå®ç±»æ²¹ååºåº | ä¸åï¼åªå¨å¾
审æ¹ï¼ | |
| | | | `POST /stockOutRecord/approve` 审æ¹**éè¿** | æã`product_model_id` + `batch_no`ãæ£å `stock_out_num` | |
| | | | 审æ¹**驳å** | ä¸åï¼æ¬æ¥å°±æ²¡æ£ï¼ | |
| | | | å é¤**å·²éè¿**çéå®ç±»åºåºè®°å½ | æåæ¹æ¬¡**å½è¿** | |
| | | | å é¤**å¾
审æ¹**çéå®ç±»åºåºè®°å½ | ä¸å | |
| | | |
| | | 失败æ
å½¢ï¼åºåä¸è¶³æ¶å®¡æ¹ä¼æ¥ **ãåºåä¸è¶³æ æ³åºåº,åºåºæ¹æ¬¡:CKâ¦ã**ï¼ä¸æ´æ¡å®¡æ¹äºå¡åæ»ï¼`approval_status` ä¸ä¼åæ 1ï¼ã |
| | | |
| | | åºåºæ°éå¿
é¡» > 0ï¼å¦åå®¡æ¹æ¥ãéå®ç±»åºåºæ°éå¿
须大äº0ãã |
| | | |
| | | --- |
| | | |
| | | ## 5. å·²ç¥å½±åï¼èè°åéç¥æ
ï¼ |
| | | |
| | | 1. **å岿°æ®ä¸ä¼è¡¥æ£**ãæ¹å飿¡ `CK20260920001`ï¼`batch_no` 为空ã已审æ¹éè¿ï¼ä»æªæ£è¿åºåï¼ç°å¨ä¹ä¸ä¼è¡¥æ£ãå®ä¼åºç°å¨åè´§å°è´¦ï¼æ¾ç¤ºãå·²åè´§ãï¼ï¼ä½**è´¦å®ä¸ç¬¦**ãè¦ä¹è®©ä¸å¡è¡¥å½æ¹æ¬¡åéå¼ä¸æ¡ï¼è¦ä¹æ¥åè¿æ¡å岿°æ®ä¸æ£ã |
| | | 2. **ä¸è¦åç»éå®ç±»æ²¹ååºåºæå·¥å»ºåè´§å**ãå¦ååè´§å°è´¦ä¼åæ¶åºç° `shipping_info` è¡å `stock_out_record` è¡ï¼å䏿¹è´§æ¾ç¤ºä¸¤æ¬¡ã |
| | | 3. **åè´§å°è´¦çãå é¤ããéè´§ã对 `oilOut` è¡ä¸å¯ç¨**ãéè´§æµç¨ï¼`ReturnManagementServiceImpl`ï¼ä¾èµ `shipping_info` + `record_type='13'`ï¼æ²¹ååºåºä¸æ»¡è¶³ãéå®ç±»åºåºçé货请走ãåºåºå°è´¦ãå é¤ï¼ä¼å½è¿åºåï¼ã |
| | | 4. **åºåºç±»å«ä¸ºã代å¨ãã客åãçåºåº**æ¢ä¸æ£åºåãä¹ä¸è¿åè´§å°è´¦ã |
| | | 5. **审æ¹éè¿ååç¨ `PUT /stockOutRecord/{id}` æ¹æ°é/æ¹æ¬¡ï¼ä¸ä¼åæ¥è°æ´åºå**ï¼æ¢æå®ç°æªè¦çï¼æ¬æ¬¡æªæ¹ï¼ãè¦æ¹æ°é请å
å é¤ï¼ä¼å½è¿ï¼åéå¼ã |
| | | 6. **æ£ååªæ ¡éª `qualitity >= åºåºæ°é`ï¼æªèè `locked_quantity`ï¼å»ç»éï¼**ãè¿ä¸ç°æãåæ ¼åºåºã忝çè¡ä¸ºä¸è´ï¼è¥ä¸å¡è¦æ±å»ç»éä¸å¯å¨ç¨ï¼éå¦è¡ç¡®è®¤ã |
| | | |
| | | --- |
| | | |
| | | ## 6. èè°èªæ¥æ¸
å |
| | | |
| | | - [ ] åè´§å°è´¦å表åºç° `CK20260920001` é£ä¸è¡ï¼`source='oilOut'`ï¼å®¢æ·å/è§æ ¼/å¨ç½å·/对æ¥äººé½æå¼ |
| | | - [ ] `CK20260920002` è¡ï¼`batch_no=20260917-CY001-001`ï¼ç `outBatchNo` = `20260917-CY001-001`ï¼ä¸ `batchNoList` æä¸ä»
æ 1 个å
ç´ |
| | | - [ ] æå¼è¯¥è¡è¯¦æ
å¼¹æ¡ï¼ãæ¹å·ãæç»è¡¨æ¾ç¤º `20260917-CY001-001` / æ´æ²¹ / 02#æ´æ²¹ / 9ï¼**䏿¯ `--`**ï¼ |
| | | - [ ] æå¼è¯¥è¡è¯¦æ
å¼¹æ¡æ¶**没æ**å `/shippingInfo/getDateil/{åºåºè®°å½id}` 请æ±ï¼å¦åå¯è½æ¾ç¤ºå«çåè´§åæç»ï¼ |
| | | - [ ] 该è¡ãåè´§ / å é¤ / éè´§ãæé®**ä¸åºç°**ï¼æç¹äºèµ°çæ¯åºåºå°è´¦ï¼ä¸æ¯ `shipping_info`ï¼ |
| | | - [ ] å页 `total` ä¸å®é
è¡æ°ä¸è´ï¼æ¬æ¬¡æ¹äº UNIONï¼éç¹åå½é¡¹ï¼ |
| | | - [ ] æãåè´§åå·ãçéï¼`shipping` å `oilOut` 两类è¡é½è½è¢«çå° |
| | | - [ ] æãéå®ååå·ãçéï¼åªå© `shipping` è¡ï¼æ²¹åè¡ä¸åºç° |
| | | - [ ] æ²¹ååºåºè¡¨åï¼åºåºç±»å«=é宿¶ä¸å¡«æ¹æ¬¡ï¼æäº¤æ¥ãéå®ç±»åºåºå¿
须鿩åºåºæ¹æ¬¡ã |
| | | - [ ] æ²¹ååºåºè¡¨åï¼åºåºç±»å«=代å¨/客忶ä¸å¡«æ¹æ¬¡è½æ£å¸¸æäº¤ |
| | | - [ ] æ°å»ºéå®ç±»åºåºï¼æ¹æ¬¡ `CG20260815005-187`ãæ°é 10ï¼â 审æ¹éè¿ â `stock_inventory.qualitity` ç± 1000 å 990 |
| | | - [ ] åå é¤è¯¥åºåºè®°å½ â åºååå° 1000 |
| | | - [ ] æ°éå¡« 99999 â å®¡æ¹æ¥ãåºåä¸è¶³æ æ³åºåºãï¼ä¸è¯¥è®°å½ `approval_status` ä»ä¸º 0 |
| | | - [ ] åæåè´§åï¼`source='shipping'`ï¼çåè´§/å é¤åè½ä¸åå½±å |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | # 车è¾ç®¡çä¸åºåºæ®æ²¹èå¨ å端èè°ææ¡£ |
| | | |
| | | æ´æ°æ¶é´ï¼2026-09-20 |
| | | éç¨çæ¬ï¼æ¬æ¬¡åç«¯åæ´å |
| | | 对åºéæ±ï¼éæ±æ¸
å第 7 æ¡ãåè´§ï¼ç»è½¦è¾åå¯ä¸æ è¯ï¼ååºåºç¼ç ï¼å ä¸ä¸ªè½¦è¾ç®¡ç页é¢ï¼è®°å½æ¯æ¬¡æåéå®è´§åå©ä½çæ²¹éï¼ä¸æ¬¡åè´§è¿æ¯è¦ç»§ç»ä½¿ç¨ï¼ä¸æ¬¡åè´§ä¸ºä¸æ¬¡å©ä½é+åºåéã |
| | | |
| | | **ä¸å¥è¯å£å¾**ï¼åºåºæ°é = **æ¬æ¬¡è£
车æ»é**ï¼è½¦ä¸å©æ²¹ + æ°è£
æ²¹ï¼ï¼çæ£ä»åºå鿣åçåªæ **åºåºæ°é â 䏿¬¡å©ä½æ²¹é**ã |
| | | |
| | | --- |
| | | |
| | | ## 1. åæ´èå´ |
| | | |
| | | | å
容 | å½±åé¢ | |
| | | | --- | --- | |
| | | | æ°å»ºè½¦è¾ä¸»æ°æ®æ¨¡å `/basic/vehicle` | 车è¾ç®¡ç页é¢ï¼å端æ°å»ºï¼å端æ¥å£å·²å°±ç»ªï¼ | |
| | | | åºåºè¡¨åã车è¾ãç±æå¡«è½¦çå·æ¹ä¸ºä¸æ | æ²¹ååºåºæ°å¢è¡¨å | |
| | | | æ°å¢å¯ç¨éæ¥è¯¢æ¥å£ | æ²¹ååºåºè¡¨åçã䏿¬¡å©ä½ / å½ååºå / å¯ç¨éãæç¤º | |
| | | | æ°å¢æ®æ²¹å½å
¥æ¥å£ | åºåºå°è´¦è¡æä½ï¼éå®è´§ååå¡«å©ä½æ²¹éï¼ | |
| | | | åºåºå°è´¦å表æ°å¢ 3 ä¸ªåæ®µ | åºåºç®¡çå表ãå¯¼åº Excel | |
| | | |
| | | > **æ¬ä»åºæ²¡æãæ²¹ååºåºã表å页**ï¼20 个åç«¯åæ¯å
¨æ¥è¿ï¼`æ²¹ååºåº`ã`客å`ã`代å¨`ã`outTonnage`ã`addOilOutRecordOnly` åé¶å½ä¸ãæä»¥æ¬æ¬¡**åªäº¤ä»å端è½å**ï¼ä¸æãæç¤ºãæ®æ²¹å½å
¥å
¥å£éè¦å端æ¥ã |
| | | > |
| | | > åç«¯å¦æä¸ä¸ªæ¬ç©ºç `inventoryManagement/vehicleManagement/index.vue`ï¼ç» `/vehicle/info/*`ï¼è½¦è¾ä¿¡æ¯+å¹´æ£+ä¿é©+è´¹ç¨+å æ²¹å¡ï¼ï¼é£**æ¯å«çç§æ·éççæ¨¡å**ï¼å端没æå¯¹åºæ¥å£ï¼ä¸æ®æ²¹æ¯«æ å
³ç³»ï¼**ä¸è¦å¤ç¨**ã |
| | | |
| | | --- |
| | | |
| | | ## 2. åç½®ï¼å
建表ãåå½è½¦è¾ |
| | | |
| | | ### 2.1 DDL å¿
é¡»å
æ§è¡ |
| | | |
| | | æä»¶ï¼`doc/20260920_vehicle_and_residual_oil.sql`ï¼çº¯æ°å¢ã䏿¹å¨ä»»ä½æ¢æåï¼ |
| | | |
| | | - æ°å»º `vehicle` 表ï¼å«å¯ä¸ç´¢å¼ `uk_plate_number`ï¼ |
| | | - `stock_out_record` å 3 åï¼`vehicle_id`ã`residual_oil`ã`deduct_quantity` |
| | | |
| | | **该 DDL å·²äº 2026-09-20 å¨å¼ååº `product-inventory-management-rbhb` æ§è¡å®æ¯**ï¼`vehicle` 表 13 å + `plate_number` å¯ä¸ç´¢å¼ã`stock_out_record` ä¸ååå·²æ ¸å¯¹ï¼ãå
¶ä»ç¯å¢ä¸çº¿æ¶æåä¸ä¸ªæä»¶æ§è¡å³å¯ã |
| | | |
| | | æä»¶ç¬¬ 3 段çèå SQLï¼`车è¾ä¿¡æ¯`ï¼`parent_id=2000`ï¼`component=basicData/vehicle/index`ï¼**å·²äº 2026-09-20 å¨å¼ååºæ§è¡**ï¼`menu_id=2377`ï¼`order_num=4`ï¼å¹¶å·²ææç»ãææ¯è´¨éãè§è² `role_id=2`ï¼ä¸åçº§çæ²¹åºä¿¡æ¯/å¨ç½ä¿¡æ¯ä¸è´ï¼ã |
| | | |
| | | > â ï¸ **èå已就ä½ï¼ä½å端页é¢è¿æ²¡å»º**ï¼èé¦åç«¯åæ¯ `dev_æ°ç_èé¦ç¯ä¿` 䏿æ¶**没æ** `src/views/basicData/vehicle/index.vue`ï¼ä¹æ²¡æ `src/api/basicData/vehicle.js`ãæä»¥ç°å¨**èåéè½çå°ã车è¾ä¿¡æ¯ãï¼ç¹è¿å»æ¯ 404**ââè¿æ¯é¢æçå ä½ç¶æï¼é¡µé¢æ `views/basicData/vehicle/index.vue` 建好åèªå¨å¯ç¨ï¼**ä¸éè¦åæ¹èå**ã |
| | | > |
| | | > 页é¢è¦è°çå端æ¥å£è§æ¬ææ¡£ç¬¬ 2.2 èï¼`/basic/vehicle/*`ï¼ãåçº§çæ²¹åºä¿¡æ¯ `basicData/oilDepot/index`ãå¨ç½ä¿¡æ¯é½å¨ `parent_id=2000` ä¸ï¼ç
§å®ä»¬çå½¢æå»ºå³å¯ã |
| | | |
| | | > **DDL æªæ§è¡å**ï¼åºåºè®°å½çæ°å¢/ä¿®æ¹ã车è¾ç®¡çæ¥å£é½ä¼ç´æ¥æ¥éï¼`Unknown column` / `Table doesn't exist`ï¼ã |
| | | |
| | | ### 2.2 车è¾ç®¡çæ¥å£ï¼åç¼ `/basic/vehicle`ï¼ç
§ `oilDepot` å½¢æï¼ |
| | | |
| | | | æ¥å£ | æ¹æ³ | 说æ | |
| | | | --- | --- | --- | |
| | | | `/basic/vehicle/list` | GET | å页æ¥è¯¢ï¼è¿å `R.data.records`ï¼æ¯æ `plateNumber`ã`driverName` æ¨¡ç³æ¥ã`status` ç²¾ç¡®æ¥ | |
| | | | `/basic/vehicle/all` | GET | **ä¾åºåºè¡¨å䏿**ï¼åªè¿åæªåç¨ç车è¾ï¼æ id ååº | |
| | | | `/basic/vehicle/{id}` | GET | 详æ
| |
| | | | `/basic/vehicle/add` | POST | æ°å¢ï¼è½¦çå·å¿
å¡«ä¸å¯ä¸ | |
| | | | `/basic/vehicle/update` | POST | ä¿®æ¹ï¼å¿
须带 `id` | |
| | | | `/basic/vehicle/del` | DELETE | æ¹éå é¤ï¼body 为 id æ°ç» | |
| | | |
| | | 车è¾åæ®µï¼ |
| | | |
| | | | åæ®µ | ç±»å | 说æ | |
| | | | --- | --- | --- | |
| | | | `id` | Long | ä¸»é® | |
| | | | `plateNumber` | String | **车çå·ï¼è½¦è¾å¯ä¸æ è¯**ï¼å¿
å¡«ãä¸å¯éå¤ | |
| | | | `driverName` | String | é»è®¤å¸æºï¼å¯ç©ºï¼åºåºæ¶å¯è¦çï¼ | |
| | | | `driverPhone` | String | 叿ºçµè¯ | |
| | | | `loadCapacity` | BigDecimal | æ ¸å®è½½é(å¨) | |
| | | | `status` | String | `å¯ç¨` / `åç¨`ï¼é»è®¤ `å¯ç¨`ï¼**åç¨åä¸ååºç°å¨ä¸æéï¼åå²è®°å½ä¸åå½±å** | |
| | | | `remark` | String | 夿³¨ | |
| | | |
| | | > è½¦è¾æ¯å
¬å¸çº§ä¸»æ°æ®ï¼`vehicle` å·²å å
¥ `IgnoreTableConfig`ï¼**ä¸åé¨é¨/åå»ºäººè¿æ»¤**ï¼åºåºè¡¨åç䏿è½çå°å
¨é¨è½¦è¾ã |
| | | > 建议ç¨ãåç¨ãè䏿¯ãå é¤ãæ¥ä¸çº¿ä¸è¾è½¦ââå é¤ä¸ä¼æ ¡éªæ¯å¦å·²è¢«åºåºè®°å½å¼ç¨ã |
| | | |
| | | è¯·æ± / ååºç¤ºä¾ï¼**注æè¿ä¸ªæ¨¡åè¿åçæ¯ `R`ï¼ä¸åºåºæ¨¡åç `AjaxResult` ç»æä¸æ ·é½æ¯ `{code, msg, data}`**ï¼ï¼ |
| | | |
| | | ```json |
| | | POST /basic/vehicle/add |
| | | { |
| | | "plateNumber": "èA12345", |
| | | "driverName": "å¼ ä¸", |
| | | "driverPhone": "13800000000", |
| | | "loadCapacity": 30, |
| | | "status": "å¯ç¨", |
| | | "remark": "" |
| | | } |
| | | ``` |
| | | |
| | | ```json |
| | | // æå |
| | | { "code": 200, "msg": "æä½æå", "data": true } |
| | | // 车çå·éå¤ |
| | | { "code": 500, "msg": "车çå·å·²åå¨:èA12345", "data": null } |
| | | // 车çå·ä¸ºç©º |
| | | { "code": 500, "msg": "车çå·ä¸è½ä¸ºç©º", "data": null } |
| | | ``` |
| | | |
| | | ```json |
| | | GET /basic/vehicle/all |
| | | { "code": 200, "msg": "æä½æå", |
| | | "data": [ { "id": 12, "plateNumber": "èA12345", "driverName": "å¼ ä¸", "status": "å¯ç¨" } ] } |
| | | ``` |
| | | |
| | | ```json |
| | | DELETE /basic/vehicle/del |
| | | [12, 13] |
| | | ``` |
| | | |
| | | `GET /basic/vehicle/list` çåé¡µç»æå¨ `data.records`ï¼MyBatis-Plus ç `IPage`ï¼ï¼å端æç°æåºç¡æ°æ®é¡µé¢åæ ·çæ¹å¼åå³å¯ã |
| | | |
| | | ### 2.3 â ï¸ è½¦è¾å¿
é¡»å
ç»è®° |
| | | |
| | | éå®ç±»åºåºä¼æè½¦çå·/车è¾id å®ä½ã䏿¬¡å©ä½æ²¹éãã**没å¨è½¦è¾ç®¡çéç»è®°è¿ç车çå·ï¼æ°å¢åºåºæ¶ä¼ç´æ¥æ¥é**ï¼ |
| | | |
| | | ``` |
| | | 车çå· èA12345 ä¸å¨è½¦è¾ç®¡çä¸ï¼è¯·å
å°è½¦è¾ç®¡çæ·»å |
| | | ``` |
| | | |
| | | æä»¥ä¸çº¿é¡ºåºæ¯ï¼**æ§è¡ DDL â å½å
¥è½¦è¾ â æè½èµ°åºåº**ã |
| | | |
| | | --- |
| | | |
| | | ## 3. æ°å¢åºåºï¼å
ææ¸
èµ°åªä¸ªæ¥å£ï¼**å¿
ç**ï¼ |
| | | |
| | | æ²¹ååºåºè¡¨åè¦è°çæ¯ `POST /stockInventory/addOilOutRecordOnly`ãå®å¨è¿ä¸å¡æ ¡éªåä¼**å¼ºå¶æ¹å 4 ä¸ªåæ®µ**ï¼åç«¯ä¼ ä»ä¹é½ä¼è¢«è¦çï¼ |
| | | |
| | | | åæ®µ | åç«¯åæ | 说æ | |
| | | | --- | --- | --- | |
| | | | `stockOutNum` | = åç«¯ä¼ ç `outTonnage` | **åç«¯å¡«çæ¯ `outTonnage`ï¼æ¬æ¬¡è£
车æ»éï¼**ï¼ä¸ç¨ä¼ `stockOutNum`ï¼å¯ç¨éæ ¡éªæ¯ç乿¯å® | |
| | | | `approvalStatus` | `0`ï¼å¾
审æ¹ï¼ | è¦çåç«¯ä¼ å¼ | |
| | | | `recordType` | `'1'`ï¼åæ ¼èªå®ä¹åºåºï¼ | è¦çåç«¯ä¼ å¼ï¼åºåºå°è´¦æ `recordType=1` çãåæ ¼èªå®ä¹åºåºã | |
| | | | `recordId` | `0` | å端ä¸ç¨ç®¡ | |
| | | |
| | | å¦å¤ä¸æ¡ï¼ |
| | | |
| | | - **ä¸å¨åºå**ï¼è¿ä¸ªæ¥å£åªå»º `stock_out_record` è®°å½ï¼åºåæ£ååçå¨**审æ¹éè¿æ¶**ï¼è§ 4.3ï¼ |
| | | - **`outCategory` å¿
é¡»æ¯ `éå®`**ï¼è½¦è¾æ ¡éªãå¯ç¨éæ ¡éªãæ®æ²¹å£å¾**å
¨é¨åªå¯¹ `outCategory = 'éå®'` çæ**ãä¼ ã客åãã代å¨ã䏿 ¡éªãå®¡æ¹æ¶ä¹ä¸æ£åºå |
| | | - åºåºç¼ç `outboundBatches`ï¼`CK` å¼å¤´ï¼ç±å端èªå¨çæï¼å端ä¸ç¨ä¼ |
| | | |
| | | 请æ±ç¤ºä¾ï¼ |
| | | |
| | | ```json |
| | | POST /stockInventory/addOilOutRecordOnly |
| | | { |
| | | "outCategory": "éå®", |
| | | "vehicleId": 12, |
| | | "truckPlateNo": "èA12345", |
| | | "productModelId": 407, |
| | | "batchNo": "20260917-CY001-001", |
| | | "outTonnage": 15, |
| | | "outDate": "2026-09-20", |
| | | "oilDepotId": 1, |
| | | "tankId": 3, |
| | | "customerId": 88, |
| | | "customerName": "ææåå·¥", |
| | | "driverName": "å¼ ä¸", |
| | | "driverPhone": "13800000000", |
| | | "remark": "" |
| | | } |
| | | ``` |
| | | |
| | | > å¦ä¸ä¸ªå
¥å£ `POST /stockOutRecord`ï¼åºåºç®¡ç-æ°å¢åºåºï¼**ä¸å** `outTonnage â stockOutNum` çæ¬è¿ï¼èµ°å®çå端è¦èªå·±ä¼ `stockOutNum`ã两个å
¥å£é½ä¼æ§è¡æ¬æ¬¡æ°å¢çè½¦è¾æ ¡éªä¸å¯ç¨éæ ¡éªã |
| | | |
| | | --- |
| | | |
| | | ## 4. åºåºè¡¨åæ¹é ï¼éå®ç±»æ²¹ååºåºï¼ |
| | | |
| | | ### 4.1 è½¦è¾æ¹ä¸æ |
| | | |
| | | - æ°æ®æºï¼`GET /basic/vehicle/all` |
| | | - æäº¤æ¶å¸¦ `vehicleId`ï¼ä¹å¯ä»¥åªå¸¦ `truckPlateNo`ï¼åç«¯ä¼æè½¦çå·åæ¥åå¡« `vehicleId`ï¼ |
| | | - 两è
é½ä¸ºç©º â æ¥é `éå®ç±»åºåºå¿
é¡»éæ©è½¦è¾` |
| | | |
| | | > å
¼å®¹é»è¾çå卿¯ä¸ºäºå端没è·ä¸æ¶ä¸è³äºç´æ¥æ¥éï¼**建议åç«¯ç´æ¥ä¼ `vehicleId`**ã |
| | | |
| | | ### 4.2 å¯ç¨éæç¤º |
| | | |
| | | ``` |
| | | GET /stockOutRecord/oilOutAvailableQty?vehicleId=&productModelId=&batchNo= |
| | | ``` |
| | | |
| | | - `vehicleId`ã`productModelId` å¿
å¡«ï¼`batchNo` å¯éï¼ä¸ä¼ ååºåæè¯¥è§æ ¼**å
¨é¨æ¹æ¬¡å计** |
| | | - è¿åï¼ |
| | | |
| | | ```json |
| | | { |
| | | "code": 200, |
| | | "data": { |
| | | "lastResidualOil": 5.0000, |
| | | "stockQuantity": 10.0000, |
| | | "availableQty": 15.0000 |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | - å±ç¤ºå»ºè®®ï¼`䏿¬¡å©ä½(å¨) 5 / å½ååºå(å¨) 10 / å¯ç¨é(å¨) 15`ï¼**å¹¶æè¿å¥å£å¾æ¾ç¤ºåºæ¥**ï¼å¯ç¨é = 䏿¬¡å©ä½ + å½ååºå |
| | | |
| | | ã䏿¬¡å©ä½æ²¹éãçåæ°è§åï¼å端ä¸ç¨ç®¡ï¼åºé®é¢æ¶æè¿ä¸ªææ¥ï¼ï¼ |
| | | `stock_out_record` ä¸å `vehicle_id` + `product_model_id`ã`residual_oil` é空ã`approval_status=1` ç**æè¿ä¸æ¡**ã**æ²¡å¡«æ®æ²¹çè®°å½ä¼è¢«è·³è¿**ï¼ç»§ç»å¾åæ¾ã |
| | | |
| | | ### 4.3 审æ¹ï¼åºåå°±æ¯å¨è¿æ£çï¼ |
| | | |
| | | ``` |
| | | POST /stockOutRecord/approve |
| | | { "ids": [255], "approvalStatus": 1 } |
| | | ``` |
| | | |
| | | - `approvalStatus`ï¼`1` = éè¿ã`2` = 驳å |
| | | - æ¹éæ¥å£ï¼**䏿¡ä¸è¿åå
¨æ¹åæ»** |
| | | - åªæ `approvalStatus = 0`ï¼å¾
审æ¹ï¼çè®°å½è½å®¡æ¹ï¼`addOilOutRecordOnly` å»ºåºæ¥çè®°å½æ£å¥½æ¯ 0 |
| | | - æ£åé `deduct_quantity` å¨éè¿è¿ä¸æ¥è½åº |
| | | |
| | | ### 4.4 æ ¡éªä¸æ¥éææ¡ |
| | | |
| | | éå®ç±»åºåºå¨**æ°å¢**å**审æ¹éè¿**两æ¥é½æ ¡éªã |
| | | |
| | | | åºæ¯ | æ¥é | |
| | | | --- | --- | |
| | | | 没é车è¾ã乿²¡å¡«è½¦çå· | `éå®ç±»åºåºå¿
é¡»éæ©è½¦è¾` | |
| | | | 车çå·ä¸å¨è½¦è¾ç®¡çé | `车çå· X ä¸å¨è½¦è¾ç®¡çä¸ï¼è¯·å
å°è½¦è¾ç®¡çæ·»å ` | |
| | | | 没éåºåºæ¹æ¬¡ | `éå®ç±»åºåºå¿
须鿩åºåºæ¹æ¬¡` | |
| | | | æ°é为空æ ⤠0 | `éå®ç±»åºåºæ°éå¿
须大äº0` | |
| | | | æ°é < 䏿¬¡å©ä½æ²¹é | `åºåºæ°éä¸è½å°äºè¯¥è½¦ä¸æ¬¡å©ä½æ²¹é5` | |
| | | | æ°é > 䏿¬¡å©ä½ + åºå | `åºåºæ°éè¶
åºå¯ç¨é(䏿¬¡å©ä½5,åºå10,å¯ç¨15)` | |
| | | | å®¡æ¹æ¶åºå被å«å¤æ£æäº | `åºåä¸è¶³æ æ³åºåº` | |
| | | |
| | | **é误ååºå½¢æ**ï¼`BaseException` 被å
¨å±å¼å¸¸å¤çå¨å
æ `AjaxResult`ï¼æ³¨æ **HTTP ç¶æç æ¯ 200**ï¼ï¼ |
| | | |
| | | ```json |
| | | { "code": 500, "msg": "éå®ç±»åºåºå¿
é¡»éæ©è½¦è¾", "data": null } |
| | | ``` |
| | | |
| | | æä»¥å端**å¤å¤±è´¥è¦ç `code`ï¼ä¸è½åªç HTTP ç¶æç **ï¼å¹¶ä¸è¦æ `msg` åæ ·éåºââè¿äºææ¡é带äºå
·ä½æ°åï¼æ¯ç°åºææ¥ç主è¦çº¿ç´¢ã |
| | | |
| | | --- |
| | | |
| | | ## 5. æ®æ²¹æä¹å½ï¼éå®è´§ååå¡«ï¼ |
| | | |
| | | ``` |
| | | PUT /stockOutRecord/{id}/residualOil |
| | | Content-Type: application/json |
| | | |
| | | { "residualOil": 4.5 } |
| | | ``` |
| | | |
| | | - `residualOil` åä½å¨ï¼**åªæ´æ°è¿ä¸å**ï¼å
¶ä»åä¸å¨ |
| | | - æ ¡éªï¼ä¸è½ä¸ºç©ºãä¸è½å°äº 0ãä¸è½å¤§äºè¯¥è®°å½çåºåºæ°é |
| | | - 建议å¨**åºåºå®¡æ¹éè¿å**å½å
¥ï¼è¿æ¶è´§å·²ç»éå°äºï¼æç¥éå©å¤å°ï¼ |
| | | |
| | | > â ï¸ **ä¸è¦ç¨ `PUT /stockOutRecord/{id}` æ¥å½æ®æ²¹**ãé£ä¸ªæ¥å£èµ° `BeanUtils.copyProperties`ï¼ä¼ææ²¡ä¼ çåæ®µ**å
¨é¨ç½®ç©º**ââåªä¼ `{id, residualOil}` ä¼æè¿æ¡åºåºè®°å½ç客æ·ãæ¹æ¬¡ãæ°éçå
¨é¨æ¸
æãæä»¥æ¬æ¬¡ä¸é¨å¼äº `/residualOil` è¿ä¸ªååæ®µæ¥å£ã |
| | | |
| | | --- |
| | | |
| | | ## 6. æ£åºåçå®é
å£å¾ï¼æå
³é®ç䏿¡ï¼ |
| | | |
| | | 审æ¹éè¿æ¶ï¼ |
| | | |
| | | ``` |
| | | deduct_quantityï¼çæ£æ£åºåçéï¼ = åºåºæ°é â 䏿¬¡å©ä½æ²¹é |
| | | ``` |
| | | |
| | | - 䏿¬¡å©ä½ 5ãæ¬æ¬¡è£
车 15ï¼è½¦ä¸ 5 + æ°è£
10ï¼â åªä»åºåæ£ **10**ï¼`deduct_quantity` è½åºä¸º 10 |
| | | - 车ä¸ç婿²¹å好å¤ï¼åºåºæ°é = 䏿¬¡å©ä½ï¼â **ä¸ç¢°åºå**ï¼`deduct_quantity` = 0 |
| | | - åºåºæ°é < 䏿¬¡å©ä½æ²¹é â æ¥éï¼æ²¹ä¸å¯è½å空åå¤ï¼ |
| | | - `deduct_quantity` è½åºçä½ç¨ï¼**å é¤è¿æ¡åºåºè®°å½æ¶æå®å½è¿åºå**ï¼æä»¥åªè½å½è¿å½åçæ£æ£æçé |
| | | |
| | | --- |
| | | |
| | | ## 7. åºåºå°è´¦å表æ°å¢å段 |
| | | |
| | | `GET /stockOutRecord/listPage`ï¼ä»¥åå¯¼åº Excelãå表详æ
ï¼æ°å¢è¿åï¼ |
| | | |
| | | | åæ®µ | 说æ | |
| | | | --- | --- | |
| | | | `vehicleId` | 车è¾idï¼è½¦è¾ä¸»æ°æ®ï¼ | |
| | | | `residualOil` | æ¬æ¬¡éå®è´§åå©ä½æ²¹é(å¨) | |
| | | | `deductQuantity` | 审æ¹éè¿æ¶å®é
ä»åºåæ£åçæ°é | |
| | | |
| | | å表 XML ç¨çæ¯ `select sor.*`ï¼æä»¥è¿ä¸ä¸ªå段æ¯èªå¨å¸¦åºçï¼æ éé¢å¤å¤çã |
| | | |
| | | --- |
| | | |
| | | ## 8. å·²ç¥å½±å䏿³¨æç¹ |
| | | |
| | | 1. **éå®ç±»åºåºå¤äºä¸¤ä¸ªåç½®æ¡ä»¶**ï¼å¿
é¡»æè½¦è¾ãå¿
é¡»éæ¹æ¬¡ãå岿°æ®ä¸åå½±åââ`vehicleId` 为空çèè®°å½ï¼å
¶ã䏿¬¡å©ä½æ²¹éãæ 0 å¤çï¼æ£åééå为ãåºåºæ°éãï¼ä¸æ¹é åè¡ä¸ºä¸è´ã |
| | | 2. **åå²å·²å®¡æ¹è®°å½ä¸è¡¥ç®**ï¼ä¾å¦ `CK20260920002`ï¼å·²å®¡æ¹ãå½åæ£äºå
¨é¢ï¼`deduct_quantity` 为 nullï¼å 餿¶æå
¨é¢å½è¿ï¼ä¸å®å½åçæ£åä¸è´ï¼å®æ²¡æè½¦è¾ï¼ä¸å䏿®æ²¹é¾ã |
| | | 3. **ä¸è¾è½¦çæ®æ²¹ææ²¹åè§æ ¼åå¼ç®**ï¼åä¸è¾è½¦æä¸åæ²¹åäºä¸å¹²æ°ã |
| | | 4. **审æ¹éè¿ååæ¹ `residualOil` ä¸ä¼éç® `deduct_quantity`**ï¼ä¸å¹³å°æ¢æçãæ¹æ°éä¸åæ¥åºåãæ¯åä¸ç±»é®é¢ï¼æ¬æ¬¡ä¸åæ¥ï¼ã |
| | | 5. **åºåå®å«åªç `qualitity`ï¼ä¸èè `locked_quantity`ï¼å»ç»éï¼**ï¼ä¸æ¢æ `type='0'/'1'` 忝è¡ä¸ºä¸è´ã |
| | | 6. **å¯ç¨éæ¥è¯¢çåºåå计ä¼åæ°æ®æéå½±å**ï¼`stock_inventory` æªå å
¥å¿½ç¥è¡¨ï¼é管çå䏿°æ®èå´ä¸ºãæ¬é¨é¨/æ¬é¨é¨å以ä¸/ä»
æ¬äººãçè´¦å·ï¼æ¥è¯¢ä¼è¢«è¿½å `dept_id`/`create_user` æ¡ä»¶ï¼**ç®åºæ¥çãå½ååºåãå¯è½åªè¦çèªå·±é¨é¨çé£é¨å**ï¼ä»èåå°è误æ¥ãè¶
åºå¯ç¨éããè¿æ¯å¹³å°æ¢æè¡ä¸ºï¼`type='0'/'1'` åæ¯åæ ·åå½±åï¼ãè¥å®é
使ç¨ä¸éå°è¯¯æ¥ï¼éè¦åç¬ç¡®è®¤ `stock_inventory` æ¯å¦åºå å
¥å¿½ç¥è¡¨ã |
| | | |
| | | --- |
| | | |
| | | ## 9. åç«¯èªæ¥æ¸
å |
| | | |
| | | - [ ] DDL å·²æ§è¡ï¼`vehicle` 表åå¨ã`stock_out_record` æ `vehicle_id`/`residual_oil`/`deduct_quantity` ä¸åï¼ |
| | | - [ ] 车è¾ç®¡ç页é¢å·²å»ºå¥½ï¼`src/views/basicData/vehicle/index.vue`ï¼ââ**èåå·²é
好ï¼é¡µé¢æ¯å¯ä¸ç¼ºçé¨åï¼å»ºå¥½åèåç¹è¿å»å°±ä¸å 404** |
| | | - [ ] 车è¾ç®¡çè½æ°å¢ï¼éå¤è½¦çå·ä¼æ¥ `车çå·å·²åå¨:X` |
| | | - [ ] è³å°å½å
¥äºä¸è¾æµè¯è½¦ |
| | | - [ ] åºåºè¡¨åçã车è¾ãæ¯ä¸æï¼æ°æ®æ¥èª `/basic/vehicle/all`ï¼æäº¤å¸¦ `vehicleId` |
| | | - [ ] åºåºè¡¨åæäº¤çæ¯ `outTonnage`ï¼è£
车æ»éï¼ï¼ä¸ `outCategory` ä¼ çæ¯ `éå®` |
| | | - [ ] éå® è½¦è¾ + è§æ ¼ + æ¹æ¬¡ åè° `/stockOutRecord/oilOutAvailableQty`ï¼å±ç¤ºã䏿¬¡å©ä½ / å½ååºå / å¯ç¨éã |
| | | - [ ] éåºåºæ°éè¶
åºå¯ç¨éæ¶ï¼é¡µé¢è½æ¾ç¤ºå端è¿åç `åºåºæ°éè¶
åºå¯ç¨é(...)` ææ¡ |
| | | - [ ] æ¥å£æ¥éå¤å®ç¨çæ¯ `code` è䏿¯ HTTP ç¶æç ï¼å¤±è´¥æ¶ HTTP 仿¯ 200ï¼ |
| | | - [ ] 审æ¹èµ° `POST /stockOutRecord/approve`ï¼`approvalStatus` 1/2ï¼ï¼å®¡æ¹åææ£åºå |
| | | - [ ] éå®è´§åæå°æ¹å½æ®æ²¹ï¼èµ°çæ¯ `PUT /stockOutRecord/{id}/residualOil`ï¼ä¸æ¯ `PUT /stockOutRecord/{id}`ï¼ |
| | | - [ ] åºåºå°è´¦å表è½çå° `residualOil` / `deductQuantity` |
| | |
| | | |
| | | import com.baomidou.mybatisplus.core.metadata.IPage; |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import com.ruoyi.account.enums.PartyTypeEnum; |
| | | import com.ruoyi.account.pojo.PaymentRecord; |
| | | import com.ruoyi.account.service.PaymentRecordService; |
| | | import com.ruoyi.framework.aspectj.lang.annotation.Log; |
| | |
| | | if (paymentRecord.getPartyType() == null || paymentRecord.getPartyId() == null) { |
| | | throw new RuntimeException("è¯·éæ©å¾æ¥æ¹"); |
| | | } |
| | | if (PartyTypeEnum.getByCode(paymentRecord.getPartyType()) == null) { |
| | | throw new RuntimeException("徿¥æ¹ç±»åä¸åæ³"); |
| | | } |
| | | if (paymentRecord.getDirection() == null) { |
| | | throw new RuntimeException("è¯·éæ©æ¹åï¼ä»æ¬¾/忬¾ï¼"); |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.account.enums; |
| | | |
| | | import com.ruoyi.common.enums.BaseEnum; |
| | | import lombok.AllArgsConstructor; |
| | | import lombok.Getter; |
| | | |
| | | /** |
| | | * 徿¥æ¹ç±»åæä¸¾ï¼å¯¹åº payment_record.party_type |
| | | */ |
| | | @Getter |
| | | @AllArgsConstructor |
| | | public enum PartyTypeEnum implements BaseEnum<Integer> { |
| | | |
| | | CUSTOMER(1, "客æ·"), |
| | | SUPPLIER(2, "ä¾åºå"), |
| | | OUTSOURCING_PARTNER(3, "åä½å"); |
| | | |
| | | private final Integer value; |
| | | private final String label; |
| | | |
| | | @Override |
| | | public Integer getCode() { |
| | | return value; |
| | | } |
| | | |
| | | @Override |
| | | public String getValue() { |
| | | return label; |
| | | } |
| | | |
| | | public static PartyTypeEnum getByCode(Integer code) { |
| | | if (code == null) { |
| | | return null; |
| | | } |
| | | for (PartyTypeEnum partyType : values()) { |
| | | if (partyType.getCode().equals(code)) { |
| | | return partyType; |
| | | } |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | public static String getLabelByCode(Integer code) { |
| | | PartyTypeEnum partyType = getByCode(code); |
| | | return partyType == null ? "æªç¥ç±»å" : partyType.getValue(); |
| | | } |
| | | } |
| | |
| | | @Schema(description = "主é®id") |
| | | private Long id; |
| | | |
| | | @Schema(description = "徿¥æ¹ç±»å 1å®¢æ· 2ä¾åºå") |
| | | @Schema(description = "徿¥æ¹ç±»å 1å®¢æ· 2ä¾åºå 3åä½å") |
| | | private Integer partyType; |
| | | |
| | | @Schema(description = "客æ·idæä¾åºåid") |
| | | @Schema(description = "客æ·idæä¾åºåidæåä½åid") |
| | | private Long partyId; |
| | | |
| | | @Schema(description = "æ¹å 1仿¬¾ 2忬¾") |
| | |
| | | @Schema(description = "åè´§åå·") |
| | | private String shippingNo; |
| | | |
| | | @Schema(description = "éå®ååå·") |
| | | private String salesContractNo; |
| | | |
| | | private List<StorageBlobVO> storageBlobVOList; |
| | | } |
| | |
| | | import com.ruoyi.purchase.mapper.PurchaseLedgerMapper; |
| | | import com.ruoyi.purchase.pojo.PurchaseLedger; |
| | | import com.ruoyi.quality.utils.QualityInspectHelper; |
| | | import com.ruoyi.sales.mapper.SalesLedgerMapper; |
| | | import com.ruoyi.sales.mapper.SalesLedgerProductMapper; |
| | | import com.ruoyi.sales.mapper.SalesQuotationMapper; |
| | | import com.ruoyi.sales.mapper.ShippingInfoMapper; |
| | | import com.ruoyi.sales.pojo.SalesLedger; |
| | | import com.ruoyi.sales.pojo.SalesLedgerProduct; |
| | | import com.ruoyi.sales.pojo.SalesQuotation; |
| | | import com.ruoyi.sales.pojo.ShippingInfo; |
| | |
| | | private final SalesLedgerProductMapper salesLedgerProductMapper; |
| | | private final StockUtils stockUtils; |
| | | private final SalesQuotationMapper salesQuotationMapper; |
| | | private final SalesLedgerMapper salesLedgerMapper; |
| | | private final ShippingInfoMapper shippingInfoMapper; |
| | | private final QualityInspectHelper qualityInspectHelper; |
| | | private final EnterpriseNewsScopeUserMapper enterpriseNewsScopeUserMapper; |
| | |
| | | ShippingInfo shippingInfo = shippingInfoMapper.selectById(vo.getBusinessId()); |
| | | if (shippingInfo != null) { |
| | | vo.setShippingNo(shippingInfo.getShippingNo()); |
| | | } |
| | | } else if (TypeEnums.SALES_LEDGER_APPROVAL.getCode().equals(vo.getBusinessType())) { |
| | | // éå®å°è´¦å®¡æ¹ - æ¥è¯¢éå®ååå· |
| | | SalesLedger salesLedger = salesLedgerMapper.selectById(vo.getBusinessId()); |
| | | if (salesLedger != null) { |
| | | vo.setSalesContractNo(salesLedger.getSalesContractNo()); |
| | | } |
| | | } |
| | | } |
| | |
| | | handleShippingApprovalFinished(instance, status); |
| | | return; |
| | | } |
| | | if (TypeEnums.SALES_LEDGER_APPROVAL.getCode().equals(businessType)) { |
| | | handleSalesLedgerApprovalFinished(instance, status); |
| | | return; |
| | | } |
| | | if (TypeEnums.TRAVEL_REIMBURSEMENT_APPROVAL.getCode().equals(businessType) |
| | | || TypeEnums.EXPENSE_APPROVAL.getCode().equals(businessType)) { |
| | | handleReimbursementApprovalFinished(instance, status); |
| | |
| | | salesQuotationMapper.updateById(salesQuote); |
| | | } |
| | | |
| | | /** |
| | | * éå®å°è´¦å®¡æ¹ç»æï¼åªååå°è´¦ç审æ¹ç¶æï¼ä¸éå®åæ®ãä¸èªå¨çæä¸æ¸¸åæ® |
| | | */ |
| | | private void handleSalesLedgerApprovalFinished(ApprovalInstance instance, String status) { |
| | | SalesLedger salesLedger = salesLedgerMapper.selectById(instance.getBusinessId()); |
| | | if (salesLedger == null) { |
| | | return; |
| | | } |
| | | |
| | | if ("APPROVED".equals(status)) { |
| | | salesLedger.setApprovalStatus(SalesQuotationStatusEnum.APPROVED.getCode()); |
| | | } else if ("REJECTED".equals(status)) { |
| | | salesLedger.setApprovalStatus(SalesQuotationStatusEnum.REJECTED.getCode()); |
| | | } else if ("PENDING".equals(status)) { |
| | | salesLedger.setApprovalStatus(SalesQuotationStatusEnum.IN_PROGRESS.getCode()); |
| | | } |
| | | salesLedgerMapper.updateById(salesLedger); |
| | | } |
| | | |
| | | private void handleShippingApprovalFinished(ApprovalInstance instance, String status) { |
| | | ShippingInfo shippingInfo = shippingInfoMapper.selectOne( |
| | | new LambdaQueryWrapper<ShippingInfo>() |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.basic.controller; |
| | | |
| | | import com.baomidou.mybatisplus.core.metadata.IPage; |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import com.ruoyi.basic.pojo.Vehicle; |
| | | import com.ruoyi.basic.service.IVehicleService; |
| | | import com.ruoyi.framework.aspectj.lang.annotation.Log; |
| | | import com.ruoyi.framework.aspectj.lang.enums.BusinessType; |
| | | import com.ruoyi.framework.web.domain.R; |
| | | import lombok.AllArgsConstructor; |
| | | import org.springframework.web.bind.annotation.DeleteMapping; |
| | | import org.springframework.web.bind.annotation.GetMapping; |
| | | import org.springframework.web.bind.annotation.PathVariable; |
| | | import org.springframework.web.bind.annotation.PostMapping; |
| | | import org.springframework.web.bind.annotation.RequestBody; |
| | | import org.springframework.web.bind.annotation.RequestMapping; |
| | | import org.springframework.web.bind.annotation.RestController; |
| | | |
| | | /** |
| | | * 车è¾ä¿¡æ¯Controller |
| | | * |
| | | * @author ruoyi |
| | | * @date 2026-09-20 |
| | | */ |
| | | @RestController |
| | | @RequestMapping("/basic/vehicle") |
| | | @AllArgsConstructor |
| | | public class VehicleController { |
| | | private IVehicleService vehicleService; |
| | | |
| | | /** |
| | | * å页æ¥è¯¢è½¦è¾ä¿¡æ¯å表 |
| | | */ |
| | | @GetMapping("/list") |
| | | public R list(Page<Vehicle> page, Vehicle vehicle) { |
| | | IPage<Vehicle> result = vehicleService.selectVehicleList(page, vehicle); |
| | | return R.ok(result); |
| | | } |
| | | |
| | | /** |
| | | * æ¥è¯¢å
¨é¨å¯ç¨ä¸ç车è¾ï¼ä¾åºåºè¡¨åä¸æéæ©ï¼ |
| | | */ |
| | | @GetMapping("/all") |
| | | public R all() { |
| | | return R.ok(vehicleService.selectAll()); |
| | | } |
| | | |
| | | /** |
| | | * è·å车è¾ä¿¡æ¯è¯¦ç»ä¿¡æ¯ |
| | | */ |
| | | @GetMapping(value = "/{id}") |
| | | public R getInfo(@PathVariable("id") Long id) { |
| | | return R.ok(vehicleService.selectVehicleById(id)); |
| | | } |
| | | |
| | | /** |
| | | * æ°å¢è½¦è¾ä¿¡æ¯ |
| | | */ |
| | | @Log(title = "车è¾ä¿¡æ¯", businessType = BusinessType.INSERT) |
| | | @PostMapping("/add") |
| | | public R add(@RequestBody Vehicle vehicle) { |
| | | return R.ok(vehicleService.insertVehicle(vehicle)); |
| | | } |
| | | |
| | | /** |
| | | * ä¿®æ¹è½¦è¾ä¿¡æ¯ |
| | | */ |
| | | @Log(title = "车è¾ä¿¡æ¯", businessType = BusinessType.UPDATE) |
| | | @PostMapping("/update") |
| | | public R edit(@RequestBody Vehicle vehicle) { |
| | | return R.ok(vehicleService.updateVehicle(vehicle)); |
| | | } |
| | | |
| | | /** |
| | | * å é¤è½¦è¾ä¿¡æ¯ |
| | | */ |
| | | @Log(title = "车è¾ä¿¡æ¯", businessType = BusinessType.DELETE) |
| | | @DeleteMapping("/del") |
| | | public R remove(@RequestBody Long[] ids) { |
| | | if (ids == null || ids.length == 0) { |
| | | return R.fail("è¯·ä¼ å
¥è¦å é¤çID"); |
| | | } |
| | | return R.ok(vehicleService.deleteVehicleByIds(ids)); |
| | | } |
| | | } |
| | |
| | | APPROVAL_INSTANCE("approval_instance"), |
| | | ACCOUNT_INVOICE_APPLICATION("account_invoice_application"), |
| | | ACCOUNT_PURCHASE_INVOICE("account_purchase_invoice"), |
| | | APPROVAL_TEMPLATE("approval_template"); |
| | | APPROVAL_TEMPLATE("approval_template"), |
| | | // Outsourcing |
| | | OUTSOURCING_PARTNER("outsourcing_partner"); |
| | | |
| | | private final String type; |
| | | RecordTypeEnum(String type) { this.type = type; } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.basic.enums; |
| | | |
| | | import com.ruoyi.common.enums.BaseEnum; |
| | | import lombok.AllArgsConstructor; |
| | | import lombok.Getter; |
| | | |
| | | /** |
| | | * å¨ç½ç¨éæä¸¾ï¼å¯¹åº tank_info.usage_type |
| | | */ |
| | | @Getter |
| | | @AllArgsConstructor |
| | | public enum TankUsageTypeEnum implements BaseEnum<Integer> { |
| | | |
| | | LEASE(1, "ç§èµ"), |
| | | SELF_USE(2, "èªç¨"); |
| | | |
| | | private final Integer value; |
| | | private final String label; |
| | | |
| | | @Override |
| | | public Integer getCode() { |
| | | return value; |
| | | } |
| | | |
| | | @Override |
| | | public String getValue() { |
| | | return label; |
| | | } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.basic.mapper; |
| | | |
| | | import com.baomidou.mybatisplus.core.mapper.BaseMapper; |
| | | import com.ruoyi.basic.pojo.Vehicle; |
| | | import org.apache.ibatis.annotations.Mapper; |
| | | |
| | | /** |
| | | * 车è¾ä¿¡æ¯Mapperæ¥å£ |
| | | * |
| | | * @author ruoyi |
| | | * @date 2026-09-20 |
| | | */ |
| | | @Mapper |
| | | public interface VehicleMapper extends BaseMapper<Vehicle> { |
| | | } |
| | |
| | | package com.ruoyi.basic.pojo; |
| | | |
| | | import java.io.Serializable; |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDate; |
| | | import java.time.LocalDateTime; |
| | | import java.util.Date; |
| | |
| | | |
| | | @Schema(description = "æ¯å¦è¢«åé
ï¼0-æªåé
ï¼1-å·²åé
") |
| | | private Integer isAssigned; |
| | | |
| | | @Schema(description = "ä¿¡æåºé(å
)") |
| | | @Excel(name = "ä¿¡æåºé") |
| | | private BigDecimal trustFund; |
| | | } |
| | |
| | | private BigDecimal remaining; |
| | | |
| | | /** |
| | | * ç§å®¢ä¿¡æ¯ |
| | | * æ¯å¦å¯ç¨ 1å¯ç¨ 0æªå¯ç¨ |
| | | */ |
| | | private Integer isEnabled; |
| | | |
| | | /** |
| | | * ç¨é 1ç§èµ 2èªç¨ï¼å¯ç¨åæéè¦é |
| | | */ |
| | | private Integer usageType; |
| | | |
| | | /** |
| | | * ç§å®¢ä¿¡æ¯ï¼ä»
ç¨é=ç§èµæ¶å¡«å |
| | | */ |
| | | private String tenantInfo; |
| | | |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.basic.pojo; |
| | | |
| | | import com.baomidou.mybatisplus.annotation.FieldFill; |
| | | import com.baomidou.mybatisplus.annotation.IdType; |
| | | import com.baomidou.mybatisplus.annotation.TableField; |
| | | import com.baomidou.mybatisplus.annotation.TableId; |
| | | import com.baomidou.mybatisplus.annotation.TableName; |
| | | import lombok.Data; |
| | | |
| | | import java.io.Serializable; |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDateTime; |
| | | |
| | | /** |
| | | * 车è¾ä¿¡æ¯å¯¹è±¡ vehicle |
| | | * |
| | | * @author ruoyi |
| | | * @date 2026-09-20 |
| | | */ |
| | | @TableName(value = "vehicle") |
| | | @Data |
| | | public class Vehicle implements Serializable { |
| | | private static final long serialVersionUID = 1L; |
| | | |
| | | /** |
| | | * 车è¾id |
| | | */ |
| | | @TableId(type = IdType.AUTO) |
| | | private Long id; |
| | | |
| | | /** |
| | | * 车çå·ï¼è½¦è¾å¯ä¸æ è¯ï¼ |
| | | */ |
| | | private String plateNumber; |
| | | |
| | | /** |
| | | * é»è®¤å¸æº |
| | | */ |
| | | private String driverName; |
| | | |
| | | /** |
| | | * 叿ºçµè¯ |
| | | */ |
| | | private String driverPhone; |
| | | |
| | | /** |
| | | * æ ¸å®è½½é(å¨) |
| | | */ |
| | | private BigDecimal loadCapacity; |
| | | |
| | | /** |
| | | * ç¶æï¼å¯ç¨/åç¨ |
| | | */ |
| | | private String status; |
| | | |
| | | /** |
| | | * 夿³¨ |
| | | */ |
| | | private String remark; |
| | | |
| | | /** |
| | | * å建æ¶é´ |
| | | */ |
| | | @TableField(fill = FieldFill.INSERT) |
| | | private LocalDateTime createTime; |
| | | |
| | | /** |
| | | * å建人 |
| | | */ |
| | | @TableField(fill = FieldFill.INSERT) |
| | | private Long createUser; |
| | | |
| | | /** |
| | | * æ´æ°æ¶é´ |
| | | */ |
| | | @TableField(fill = FieldFill.INSERT_UPDATE) |
| | | private LocalDateTime updateTime; |
| | | |
| | | /** |
| | | * æ´æ°äºº |
| | | */ |
| | | @TableField(fill = FieldFill.INSERT_UPDATE) |
| | | private Long updateUser; |
| | | |
| | | /** |
| | | * ç§æ·id |
| | | */ |
| | | @TableField(fill = FieldFill.INSERT) |
| | | private Long tenantId; |
| | | |
| | | /** |
| | | * é¨é¨id |
| | | */ |
| | | @TableField(fill = FieldFill.INSERT) |
| | | private Long deptId; |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.basic.service; |
| | | |
| | | import com.baomidou.mybatisplus.core.metadata.IPage; |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import com.baomidou.mybatisplus.extension.service.IService; |
| | | import com.ruoyi.basic.pojo.Vehicle; |
| | | |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * 车è¾ä¿¡æ¯Serviceæ¥å£ |
| | | * |
| | | * @author ruoyi |
| | | * @date 2026-09-20 |
| | | */ |
| | | public interface IVehicleService extends IService<Vehicle> { |
| | | |
| | | /** |
| | | * å页æ¥è¯¢è½¦è¾ä¿¡æ¯å表 |
| | | * |
| | | * @param page å页忰 |
| | | * @param vehicle æ¥è¯¢æ¡ä»¶ |
| | | * @return 车è¾ä¿¡æ¯éå |
| | | */ |
| | | IPage<Vehicle> selectVehicleList(Page<Vehicle> page, Vehicle vehicle); |
| | | |
| | | /** |
| | | * æ¥è¯¢å
¨é¨å¯ç¨ä¸ç车è¾ï¼ä¾åºåºè¡¨åä¸æéæ©ï¼ |
| | | * |
| | | * @return 车è¾ä¿¡æ¯éå |
| | | */ |
| | | List<Vehicle> selectAll(); |
| | | |
| | | /** |
| | | * æ¥è¯¢è½¦è¾ä¿¡æ¯ |
| | | * |
| | | * @param id 车è¾ä¿¡æ¯ä¸»é® |
| | | * @return 车è¾ä¿¡æ¯ |
| | | */ |
| | | Vehicle selectVehicleById(Long id); |
| | | |
| | | /** |
| | | * æ°å¢è½¦è¾ä¿¡æ¯ |
| | | * |
| | | * @param vehicle 车è¾ä¿¡æ¯ |
| | | * @return ç»æ |
| | | */ |
| | | boolean insertVehicle(Vehicle vehicle); |
| | | |
| | | /** |
| | | * ä¿®æ¹è½¦è¾ä¿¡æ¯ |
| | | * |
| | | * @param vehicle 车è¾ä¿¡æ¯ |
| | | * @return ç»æ |
| | | */ |
| | | boolean updateVehicle(Vehicle vehicle); |
| | | |
| | | /** |
| | | * æ¹éå é¤è½¦è¾ä¿¡æ¯ |
| | | * |
| | | * @param ids éè¦å é¤ç车è¾ä¿¡æ¯ä¸»é®éå |
| | | * @return ç»æ |
| | | */ |
| | | boolean deleteVehicleByIds(Long[] ids); |
| | | } |
| | |
| | | import com.ruoyi.framework.web.domain.R; |
| | | import com.ruoyi.procurementrecord.mapper.ReturnManagementMapper; |
| | | import com.ruoyi.procurementrecord.pojo.ReturnManagement; |
| | | import com.ruoyi.sales.dto.CustomerDepositAmountDto; |
| | | import com.ruoyi.sales.mapper.SalesLedgerMapper; |
| | | import com.ruoyi.sales.mapper.SalesQuotationMapper; |
| | | import com.ruoyi.sales.pojo.SalesLedger; |
| | |
| | | import org.springframework.util.CollectionUtils; |
| | | import org.springframework.web.multipart.MultipartFile; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.time.ZoneId; |
| | | import java.util.*; |
| | | import java.util.stream.Collectors; |
| | |
| | | customerVo.setFollowUpList(followUpDtoList); |
| | | } |
| | | |
| | | fillDepositAmount(Collections.singletonList(customerVo)); |
| | | |
| | | return customerVo; |
| | | } |
| | | |
| | | /** |
| | | * 填代å¨éé¢ï¼è¯¥å®¢æ·å
¨é¨ãç±»å=代å¨ãçéå®å°è´¦ååéé¢ç´¯è®¡ï¼å¹¶å¤ææ¯å¦å·²è¶
ä¿¡æåºé |
| | | */ |
| | | private void fillDepositAmount(List<CustomerVo> records) { |
| | | if (CollectionUtils.isEmpty(records)) { |
| | | return; |
| | | } |
| | | List<Long> customerIds = records.stream() |
| | | .map(CustomerVo::getId) |
| | | .filter(Objects::nonNull) |
| | | .collect(Collectors.toList()); |
| | | Map<Long, BigDecimal> depositAmountMap = customerIds.isEmpty() |
| | | ? Collections.emptyMap() |
| | | : salesLedgerMapper.selectDepositAmountByCustomerIds(customerIds).stream() |
| | | .filter(item -> item.getCustomerId() != null) |
| | | .collect(Collectors.toMap( |
| | | CustomerDepositAmountDto::getCustomerId, |
| | | item -> item.getDepositTotalAmount() == null ? BigDecimal.ZERO : item.getDepositTotalAmount(), |
| | | (existing, replacement) -> existing)); |
| | | |
| | | records.forEach(customer -> { |
| | | BigDecimal depositTotalAmount = depositAmountMap.getOrDefault(customer.getId(), BigDecimal.ZERO); |
| | | customer.setDepositTotalAmount(depositTotalAmount); |
| | | customer.setExceedsTrustFund(customer.getTrustFund() != null |
| | | && depositTotalAmount.compareTo(customer.getTrustFund()) > 0); |
| | | }); |
| | | } |
| | | |
| | | /** |
| | |
| | | c.setUserIds(userIds); |
| | | } |
| | | }); |
| | | |
| | | fillDepositAmount(records); |
| | | } |
| | | |
| | | return customerPage; |
| | |
| | | |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import com.baomidou.mybatisplus.core.metadata.IPage; |
| | | import com.baomidou.mybatisplus.core.toolkit.Wrappers; |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
| | | import com.ruoyi.basic.enums.TankUsageTypeEnum; |
| | | import com.ruoyi.basic.mapper.TankInfoMapper; |
| | | import com.ruoyi.basic.pojo.TankInfo; |
| | | import com.ruoyi.basic.service.ITankInfoService; |
| | | import com.ruoyi.common.exception.ServiceException; |
| | | import com.ruoyi.common.utils.StringUtils; |
| | | import org.springframework.stereotype.Service; |
| | | |
| | |
| | | @Service |
| | | public class TankInfoServiceImpl extends ServiceImpl<TankInfoMapper, TankInfo> implements ITankInfoService { |
| | | |
| | | /** |
| | | * æ¯å¦å¯ç¨ï¼å¯ç¨ãä¸ tank_info.is_enabled çé»è®¤å¼ä¸è´ |
| | | */ |
| | | private static final Integer TANK_ENABLED = 1; |
| | | |
| | | @Override |
| | | public IPage<TankInfo> selectTankInfoList(Page<TankInfo> page, TankInfo tankInfo) { |
| | | LambdaQueryWrapper<TankInfo> queryWrapper = new LambdaQueryWrapper<>(); |
| | | queryWrapper.like(StringUtils.isNotBlank(tankInfo.getTankNo()), TankInfo::getTankNo, tankInfo.getTankNo()) |
| | | .like(StringUtils.isNotBlank(tankInfo.getCategory()), TankInfo::getCategory, tankInfo.getCategory()) |
| | | .eq(tankInfo.getIsEnabled() != null, TankInfo::getIsEnabled, tankInfo.getIsEnabled()) |
| | | .eq(tankInfo.getUsageType() != null, TankInfo::getUsageType, tankInfo.getUsageType()) |
| | | .orderByAsc(TankInfo::getId); |
| | | return this.page(page, queryWrapper); |
| | | } |
| | | |
| | | /** |
| | | * 䏿ç¨ï¼åªè¿åå·²å¯ç¨çå¨ç½ãæªå¯ç¨è¡¨ç¤ºè¿æ²¡æç¨ï¼ä¸åºè¢«å
¥åºçä¸å¡éä¸ |
| | | */ |
| | | @Override |
| | | public List<TankInfo> selectAll() { |
| | | LambdaQueryWrapper<TankInfo> queryWrapper = new LambdaQueryWrapper<>(); |
| | | queryWrapper.orderByAsc(TankInfo::getId); |
| | | queryWrapper.eq(TankInfo::getIsEnabled, TANK_ENABLED) |
| | | .orderByAsc(TankInfo::getId); |
| | | return this.list(queryWrapper); |
| | | } |
| | | |
| | |
| | | |
| | | @Override |
| | | public boolean insertTankInfo(TankInfo tankInfo) { |
| | | normalizeUsage(tankInfo); |
| | | return this.save(tankInfo); |
| | | } |
| | | |
| | | @Override |
| | | public boolean updateTankInfo(TankInfo tankInfo) { |
| | | return this.updateById(tankInfo); |
| | | if (tankInfo.getId() == null) { |
| | | throw new ServiceException("缺å°å¨ç½id"); |
| | | } |
| | | normalizeUsage(tankInfo); |
| | | boolean updated = this.updateById(tankInfo); |
| | | if (updated) { |
| | | // usageType / tenantInfo æ¯å
许被æ¸
空çï¼è updateById é»è®¤è·³è¿ null åæ®µï¼FieldStrategy.NOT_NULLï¼ï¼ |
| | | // æ¸
空å¨ä½æ ¹æ¬åä¸è¿åºï¼æä»¥è¿ä¸¤ååç¬è¡¥ä¸æ¡æ´æ° |
| | | updated = this.update(Wrappers.<TankInfo>lambdaUpdate() |
| | | .eq(TankInfo::getId, tankInfo.getId()) |
| | | .set(TankInfo::getUsageType, tankInfo.getUsageType()) |
| | | .set(TankInfo::getTenantInfo, tankInfo.getTenantInfo())); |
| | | } |
| | | return updated; |
| | | } |
| | | |
| | | /** |
| | | * å½ä¸åãæ¯å¦å¯ç¨ / ç¨é / ç§å®¢ä¿¡æ¯ãä¸è
çå
³ç³»ï¼ |
| | | * <ul> |
| | | * <li>æªå¯ç¨ï¼ç¨éä¸ç§å®¢ä¿¡æ¯ä¸å¾æ¸
空 ââ å¯ç¨ä¹åæè°ç§èµ/èªç¨</li> |
| | | * <li>å¯ç¨ + ç§èµï¼ç§å®¢ä¿¡æ¯å¿
å¡«</li> |
| | | * <li>å¯ç¨ + èªç¨ï¼ç§å®¢ä¿¡æ¯æ¸
空</li> |
| | | * <li>å¯ç¨ + ç¨é为空ï¼è§ä¸ºæªéæ©ï¼æ¢ä¸æ ¡éªä¹ä¸æ¸
空ãè¿ç§»åçåéå¨ç½å°±æ¯è¿ä¸ªç¶æï¼ |
| | | * è¿æ ·èåç«¯ä¸æ¹ä¹ä¸ä¼è¢«æ¦ï¼æ´ä¸ä¼æå·²æçç§å®¢ä¿¡æ¯æ¹æ</li> |
| | | * </ul> |
| | | */ |
| | | private void normalizeUsage(TankInfo tankInfo) { |
| | | if (tankInfo.getIsEnabled() == null) { |
| | | tankInfo.setIsEnabled(TANK_ENABLED); |
| | | } |
| | | if (!TANK_ENABLED.equals(tankInfo.getIsEnabled())) { |
| | | tankInfo.setUsageType(null); |
| | | tankInfo.setTenantInfo(null); |
| | | return; |
| | | } |
| | | Integer usageType = tankInfo.getUsageType(); |
| | | if (usageType == null) { |
| | | return; |
| | | } |
| | | if (TankUsageTypeEnum.LEASE.getCode().equals(usageType)) { |
| | | if (StringUtils.isBlank(tankInfo.getTenantInfo())) { |
| | | throw new ServiceException("ç§èµçå¨ç½å¿
须填åç§å®¢ä¿¡æ¯"); |
| | | } |
| | | return; |
| | | } |
| | | if (TankUsageTypeEnum.SELF_USE.getCode().equals(usageType)) { |
| | | tankInfo.setTenantInfo(null); |
| | | return; |
| | | } |
| | | throw new ServiceException("å¨ç½ç¨éåªè½æ¯ç§èµæèªç¨"); |
| | | } |
| | | |
| | | @Override |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.basic.service.impl; |
| | | |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import com.baomidou.mybatisplus.core.metadata.IPage; |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
| | | import com.ruoyi.basic.mapper.VehicleMapper; |
| | | import com.ruoyi.basic.pojo.Vehicle; |
| | | import com.ruoyi.basic.service.IVehicleService; |
| | | import com.ruoyi.common.exception.base.BaseException; |
| | | import com.ruoyi.common.utils.StringUtils; |
| | | import org.springframework.stereotype.Service; |
| | | |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * 车è¾ä¿¡æ¯Serviceä¸å¡å±å¤ç |
| | | * |
| | | * @author ruoyi |
| | | * @date 2026-09-20 |
| | | */ |
| | | @Service |
| | | public class VehicleServiceImpl extends ServiceImpl<VehicleMapper, Vehicle> implements IVehicleService { |
| | | |
| | | /** |
| | | * 车è¾ç¶æï¼åç¨ãåç¨ç车è¾ä¸ååºç°å¨åºåºè¡¨åç䏿é |
| | | */ |
| | | private static final String STATUS_DISABLED = "åç¨"; |
| | | |
| | | @Override |
| | | public IPage<Vehicle> selectVehicleList(Page<Vehicle> page, Vehicle vehicle) { |
| | | LambdaQueryWrapper<Vehicle> queryWrapper = new LambdaQueryWrapper<>(); |
| | | queryWrapper.like(StringUtils.isNotBlank(vehicle.getPlateNumber()), Vehicle::getPlateNumber, vehicle.getPlateNumber()) |
| | | .like(StringUtils.isNotBlank(vehicle.getDriverName()), Vehicle::getDriverName, vehicle.getDriverName()) |
| | | .eq(StringUtils.isNotBlank(vehicle.getStatus()), Vehicle::getStatus, vehicle.getStatus()) |
| | | .orderByAsc(Vehicle::getId); |
| | | return this.page(page, queryWrapper); |
| | | } |
| | | |
| | | @Override |
| | | public List<Vehicle> selectAll() { |
| | | LambdaQueryWrapper<Vehicle> queryWrapper = new LambdaQueryWrapper<>(); |
| | | // status å
许为空ï¼è§ä¸ºå¯ç¨ |
| | | queryWrapper.and(w -> w.isNull(Vehicle::getStatus).or().ne(Vehicle::getStatus, STATUS_DISABLED)) |
| | | .orderByAsc(Vehicle::getId); |
| | | return this.list(queryWrapper); |
| | | } |
| | | |
| | | @Override |
| | | public Vehicle selectVehicleById(Long id) { |
| | | return this.getById(id); |
| | | } |
| | | |
| | | @Override |
| | | public boolean insertVehicle(Vehicle vehicle) { |
| | | if (StringUtils.isBlank(vehicle.getPlateNumber())) { |
| | | throw new BaseException("车çå·ä¸è½ä¸ºç©º"); |
| | | } |
| | | checkPlateNumberUnique(vehicle); |
| | | return this.save(vehicle); |
| | | } |
| | | |
| | | @Override |
| | | public boolean updateVehicle(Vehicle vehicle) { |
| | | if (StringUtils.isNotBlank(vehicle.getPlateNumber())) { |
| | | checkPlateNumberUnique(vehicle); |
| | | } |
| | | return this.updateById(vehicle); |
| | | } |
| | | |
| | | @Override |
| | | public boolean deleteVehicleByIds(Long[] ids) { |
| | | return this.removeByIds(List.of(ids)); |
| | | } |
| | | |
| | | /** |
| | | * 车çå·æ¯è½¦è¾çå¯ä¸æ è¯ï¼ä¸è½éå¤ |
| | | */ |
| | | private void checkPlateNumberUnique(Vehicle vehicle) { |
| | | LambdaQueryWrapper<Vehicle> queryWrapper = new LambdaQueryWrapper<Vehicle>() |
| | | .eq(Vehicle::getPlateNumber, vehicle.getPlateNumber()); |
| | | if (vehicle.getId() != null) { |
| | | queryWrapper.ne(Vehicle::getId, vehicle.getId()); |
| | | } |
| | | if (this.count(queryWrapper) > 0) { |
| | | throw new BaseException("车çå·å·²åå¨:" + vehicle.getPlateNumber()); |
| | | } |
| | | } |
| | | } |
| | |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.util.List; |
| | | |
| | | @Data |
| | |
| | | * æ¯å¦è¢«é宿¨¡åå¼ç¨ï¼0-å¦ï¼1-æ¯ |
| | | */ |
| | | private Integer salesReferenceFlag; |
| | | |
| | | @ApiModelProperty(value = "该客æ·ä»£å¨éé¢åè®¡ï¼ææç±»å=代å¨çéå®å°è´¦ååéé¢ç´¯è®¡ï¼") |
| | | private BigDecimal depositTotalAmount; |
| | | |
| | | @ApiModelProperty(value = "代å¨é颿¯å¦å·²è¶
åºä¿¡æåºé") |
| | | private Boolean exceedsTrustFund; |
| | | } |
| | |
| | | IGNORE_TABLES.add("product_model"); |
| | | IGNORE_TABLES.add("ai_chat_session"); |
| | | IGNORE_TABLES.add("product"); |
| | | // è½¦è¾æ¯å
¬å¸çº§ä¸»æ°æ®ï¼åºåºè¡¨åç䏿å¿
é¡»è½çå°å
¨é¨è½¦è¾ï¼ä¸åé¨é¨/åå»ºäººè¿æ»¤ |
| | | IGNORE_TABLES.add("vehicle"); |
| | | |
| | | } |
| | | } |
| | |
| | | CUSTOMIZATION_UNSTOCK_OUT("10", "ä¸åæ ¼èªå®ä¹åºåº"), |
| | | SALE_SHIP_STOCK_OUT("13", "éå®-åè´§åºåº"), |
| | | PICK_STOCK_OUT("14", "çäº§é¢æåºåº"), |
| | | FEED_STOCK_OUT("15", "ç产补æåºåº"); |
| | | FEED_STOCK_OUT("15", "ç产补æåºåº"), |
| | | OUTSOURCING_SCRAP_OUT("30", "å§å¤-æ¥åºååºåº"); |
| | | |
| | | private final String code; |
| | | private final String value; |
| | |
| | | OVERTIME_APPROVAL(15L, "å ç审æ¹"), |
| | | TRAVEL_REIMBURSEMENT_APPROVAL(16L, "åºå·®æ¥é审æ¹"), |
| | | EXPENSE_APPROVAL(17L, "è´¹ç¨å®¡æ¹"), |
| | | ENTERPRISE_NEWS_APPROVAL(18L, "ä¼ä¸æ°é»å®¡æ¹"); |
| | | ENTERPRISE_NEWS_APPROVAL(18L, "ä¼ä¸æ°é»å®¡æ¹"), |
| | | SALES_LEDGER_APPROVAL(19L, "éå®å°è´¦å®¡æ¹"); |
| | | |
| | | |
| | | |
| | |
| | | outRecord.setQuantity(new BigDecimal(sparePartUse.getQuantity())); |
| | | outRecord.setSourceType(3); |
| | | outRecord.setSourceId(deviceMaintenance.getId()); |
| | | // ä¿å
»å没æåå·ï¼æ¥æºåå·ç¨è®¾å¤åç§°ï¼æµæ°´é¡µæçå¾åºå¤ä»¶ç¨å¨åªå°è®¾å¤ä¸ |
| | | outRecord.setSourceNo(oldDeviceMaintenance.getDeviceName()); |
| | | sparePartsRecordService.save(outRecord); |
| | | } else { |
| | | return AjaxResult.error("å¤ä»¶ " + spareParts.getName() + " æ°éä¸è¶³"); |
| | |
| | | outRecord.setQuantity(new BigDecimal(sparePartUse.getQuantity())); |
| | | outRecord.setSourceType(2); |
| | | outRecord.setSourceId(deviceRepairDto.getId()); |
| | | // æ¥ä¿®å没æåå·ï¼æ¥æºåå·ç¨è®¾å¤åç§°ï¼æµæ°´é¡µæçå¾åºå¤ä»¶ç¨å¨åªå°è®¾å¤ä¸ |
| | | outRecord.setSourceNo(oldDeviceRepair.getDeviceName()); |
| | | sparePartsRecordService.save(outRecord); |
| | | } else { |
| | | return AjaxResult.error("å¤ä»¶ " + spareParts.getName() + " æ°éä¸è¶³"); |
| | |
| | | dto.setSalesman(item.getString("salesman")); |
| | | dto.setPaymentMethod(item.getString("paymentMethod")); |
| | | dto.setType(item.getInteger("type")); |
| | | // æ¨¡ææ°æ®çæçå°è´¦é½å¸¦äº§åæç»ï¼æåæ²¹å¤çï¼å°è´¦æ°å¢å·²è¦æ±å¿
å¡«éå®ç±»åï¼ |
| | | dto.setLedgerType("åæ²¹"); |
| | | |
| | | // å½å
¥äººï¼ä¼å
ç¨AIè¿åçï¼å¦åä»"éå®"è§è²/é¨é¨éæºé |
| | | String entryPerson = item.getString("entryPerson"); |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.outsourcing.controller; |
| | | |
| | | import com.baomidou.mybatisplus.core.metadata.IPage; |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import com.ruoyi.framework.aspectj.lang.annotation.Log; |
| | | import com.ruoyi.framework.aspectj.lang.enums.BusinessType; |
| | | import com.ruoyi.framework.web.controller.BaseController; |
| | | import com.ruoyi.framework.web.domain.AjaxResult; |
| | | import com.ruoyi.framework.web.page.TableDataInfo; |
| | | import com.ruoyi.outsourcing.dto.OutsourcingOrderDto; |
| | | import com.ruoyi.outsourcing.pojo.OutsourcingOrder; |
| | | import com.ruoyi.outsourcing.service.IOutsourcingOrderService; |
| | | import com.ruoyi.stock.dto.StockInventoryDto; |
| | | import com.ruoyi.stock.service.StockInventoryService; |
| | | import io.swagger.v3.oas.annotations.Operation; |
| | | import io.swagger.v3.oas.annotations.tags.Tag; |
| | | import jakarta.servlet.http.HttpServletResponse; |
| | | import lombok.AllArgsConstructor; |
| | | import org.springframework.web.bind.annotation.DeleteMapping; |
| | | import org.springframework.web.bind.annotation.GetMapping; |
| | | import org.springframework.web.bind.annotation.PostMapping; |
| | | import org.springframework.web.bind.annotation.RequestBody; |
| | | import org.springframework.web.bind.annotation.RequestMapping; |
| | | import org.springframework.web.bind.annotation.RequestParam; |
| | | import org.springframework.web.bind.annotation.RestController; |
| | | |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * å§å¤è®¢å Controller |
| | | */ |
| | | @RestController |
| | | @RequestMapping("/outsourcing/order") |
| | | @AllArgsConstructor |
| | | @Tag(name = "å§å¤è®¢å") |
| | | public class OutsourcingOrderController extends BaseController { |
| | | |
| | | private final IOutsourcingOrderService outsourcingOrderService; |
| | | private final StockInventoryService stockInventoryService; |
| | | |
| | | /** |
| | | * å§å¤è®¢åå表 |
| | | */ |
| | | @Operation(summary = "å§å¤è®¢åå表") |
| | | @GetMapping("/list") |
| | | public TableDataInfo list(OutsourcingOrderDto dto) { |
| | | startPage(); |
| | | List<OutsourcingOrder> list = outsourcingOrderService.selectOrderList(dto); |
| | | return getDataTable(list); |
| | | } |
| | | |
| | | /** |
| | | * å§å¤è®¢å详æ
ï¼å«äº§åæç»ï¼ |
| | | */ |
| | | @Operation(summary = "å§å¤è®¢å详æ
") |
| | | @GetMapping("/getById") |
| | | public AjaxResult getById(@RequestParam Long id) { |
| | | return AjaxResult.success(outsourcingOrderService.getDetail(id)); |
| | | } |
| | | |
| | | /** |
| | | * æ°å¢å§å¤è®¢åï¼èç¨¿ï¼ |
| | | */ |
| | | @Operation(summary = "æ°å¢å§å¤è®¢å") |
| | | @Log(title = "å§å¤è®¢å", businessType = BusinessType.INSERT) |
| | | @PostMapping("/add") |
| | | public AjaxResult add(@RequestBody OutsourcingOrderDto dto) { |
| | | return AjaxResult.success(outsourcingOrderService.saveOrder(dto)); |
| | | } |
| | | |
| | | /** |
| | | * ä¿®æ¹å§å¤è®¢åï¼ä»
èç¨¿ç¶æå
许 |
| | | */ |
| | | @Operation(summary = "ä¿®æ¹å§å¤è®¢å") |
| | | @Log(title = "å§å¤è®¢å", businessType = BusinessType.UPDATE) |
| | | @PostMapping("/edit") |
| | | public AjaxResult edit(@RequestBody OutsourcingOrderDto dto) { |
| | | return toAjax(outsourcingOrderService.updateOrder(dto)); |
| | | } |
| | | |
| | | /** |
| | | * å é¤å§å¤è®¢åï¼ä»
èç¨¿ç¶æå
许 |
| | | */ |
| | | @Operation(summary = "å é¤å§å¤è®¢å") |
| | | @Log(title = "å§å¤è®¢å", businessType = BusinessType.DELETE) |
| | | @DeleteMapping("/delete") |
| | | public AjaxResult delete(@RequestBody Long[] ids) { |
| | | return toAjax(outsourcingOrderService.deleteOrders(ids == null ? List.of() : List.of(ids))); |
| | | } |
| | | |
| | | /** |
| | | * æäº¤å§å¤è®¢åï¼è稿 -> 已确认 |
| | | */ |
| | | @Operation(summary = "æäº¤å§å¤è®¢å") |
| | | @Log(title = "å§å¤è®¢åæäº¤", businessType = BusinessType.OTHER) |
| | | @PostMapping("/submit") |
| | | public AjaxResult submit(@RequestParam Long id) { |
| | | return toAjax(outsourcingOrderService.submit(id)); |
| | | } |
| | | |
| | | /** |
| | | * 宿å§å¤è®¢åï¼å·²ç¡®è®¤ -> 已宿 |
| | | */ |
| | | @Operation(summary = "宿å§å¤è®¢å") |
| | | @Log(title = "å§å¤è®¢å宿", businessType = BusinessType.OTHER) |
| | | @PostMapping("/complete") |
| | | public AjaxResult complete(@RequestParam Long id) { |
| | | return toAjax(outsourcingOrderService.complete(id)); |
| | | } |
| | | |
| | | /** |
| | | * ä½åºå§å¤è®¢åï¼è稿/已确认 -> å·²ä½åº |
| | | */ |
| | | @Operation(summary = "ä½åºå§å¤è®¢å") |
| | | @Log(title = "å§å¤è®¢åä½åº", businessType = BusinessType.OTHER) |
| | | @PostMapping("/cancel") |
| | | public AjaxResult cancel(@RequestParam Long id, |
| | | @RequestParam(required = false) String cancelReason) { |
| | | return toAjax(outsourcingOrderService.cancel(id, cancelReason)); |
| | | } |
| | | |
| | | /** |
| | | * å§å¤è®¢åå¯¼åº |
| | | */ |
| | | @Operation(summary = "å§å¤è®¢å导åº") |
| | | @Log(title = "å§å¤è®¢å", businessType = BusinessType.EXPORT) |
| | | @PostMapping("/export") |
| | | public void export(HttpServletResponse response, OutsourcingOrderDto dto) { |
| | | outsourcingOrderService.exportOrders(response, dto); |
| | | } |
| | | |
| | | /** |
| | | * æ¥åºåéæå页ï¼åæ ¼åºåï¼åªè¯»ï¼ä¸å ç¨ãä¸åååºåï¼ |
| | | */ |
| | | @Operation(summary = "æ¥åºåéæå页") |
| | | @GetMapping("/scrapStockPage") |
| | | public AjaxResult scrapStockPage(Page page, StockInventoryDto dto) { |
| | | IPage<StockInventoryDto> result = stockInventoryService.pageScrapStock(page, dto); |
| | | return AjaxResult.success(result); |
| | | } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.outsourcing.controller; |
| | | |
| | | import com.baomidou.mybatisplus.core.metadata.IPage; |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import com.ruoyi.framework.aspectj.lang.annotation.Log; |
| | | import com.ruoyi.framework.aspectj.lang.enums.BusinessType; |
| | | import com.ruoyi.framework.web.controller.BaseController; |
| | | import com.ruoyi.common.utils.poi.ExcelUtil; |
| | | import com.ruoyi.framework.web.domain.AjaxResult; |
| | | import com.ruoyi.outsourcing.dto.OutsourcingPartnerDto; |
| | | import com.ruoyi.outsourcing.excel.OutsourcingPartnerExcelDto; |
| | | import com.ruoyi.outsourcing.service.IOutsourcingPartnerService; |
| | | import io.swagger.v3.oas.annotations.Operation; |
| | | import io.swagger.v3.oas.annotations.tags.Tag; |
| | | import jakarta.servlet.http.HttpServletResponse; |
| | | import lombok.AllArgsConstructor; |
| | | import org.springframework.util.CollectionUtils; |
| | | import org.springframework.web.bind.annotation.DeleteMapping; |
| | | import org.springframework.web.bind.annotation.GetMapping; |
| | | import org.springframework.web.bind.annotation.PathVariable; |
| | | import org.springframework.web.bind.annotation.PostMapping; |
| | | import org.springframework.web.bind.annotation.RequestBody; |
| | | import org.springframework.web.bind.annotation.RequestMapping; |
| | | import org.springframework.web.bind.annotation.RestController; |
| | | import org.springframework.web.multipart.MultipartFile; |
| | | |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * å§å¤åä½åæ¡£æ¡ Controller |
| | | */ |
| | | @RestController |
| | | @RequestMapping("/outsourcing/partner") |
| | | @AllArgsConstructor |
| | | @Tag(name = "å§å¤åä½åæ¡£æ¡") |
| | | public class OutsourcingPartnerController extends BaseController { |
| | | |
| | | private final IOutsourcingPartnerService outsourcingPartnerService; |
| | | |
| | | /** |
| | | * æ°å¢åä½åï¼å«éä»¶ï¼ |
| | | */ |
| | | @Operation(summary = "æ°å¢åä½å") |
| | | @Log(title = "åä½åæ¡£æ¡", businessType = BusinessType.INSERT) |
| | | @PostMapping("/add") |
| | | public AjaxResult add(@RequestBody OutsourcingPartnerDto dto) { |
| | | return AjaxResult.success(outsourcingPartnerService.savePartner(dto)); |
| | | } |
| | | |
| | | /** |
| | | * ä¿®æ¹åä½åï¼å«éä»¶ï¼ |
| | | */ |
| | | @Operation(summary = "ä¿®æ¹åä½å") |
| | | @Log(title = "åä½åæ¡£æ¡", businessType = BusinessType.UPDATE) |
| | | @PostMapping("/update") |
| | | public AjaxResult update(@RequestBody OutsourcingPartnerDto dto) { |
| | | return toAjax(outsourcingPartnerService.updatePartner(dto)); |
| | | } |
| | | |
| | | /** |
| | | * å é¤åä½å |
| | | */ |
| | | @Operation(summary = "å é¤åä½å") |
| | | @Log(title = "åä½åæ¡£æ¡", businessType = BusinessType.DELETE) |
| | | @DeleteMapping("/del") |
| | | public AjaxResult del(@RequestBody List<Long> ids) { |
| | | if (CollectionUtils.isEmpty(ids)) { |
| | | return AjaxResult.error("è¯·éæ©è³å°ä¸æ¡æ°æ®"); |
| | | } |
| | | return toAjax(outsourcingPartnerService.delPartner(ids)); |
| | | } |
| | | |
| | | /** |
| | | * åä½å详æ
ï¼å«éä»¶åæ¾ï¼ |
| | | */ |
| | | @Operation(summary = "åä½å详æ
") |
| | | @GetMapping("/{id}") |
| | | public AjaxResult detail(@PathVariable("id") Long id) { |
| | | return AjaxResult.success(outsourcingPartnerService.partnerDetail(id)); |
| | | } |
| | | |
| | | /** |
| | | * åä½åå页æ¥è¯¢ |
| | | */ |
| | | @Operation(summary = "åä½åå页æ¥è¯¢") |
| | | @GetMapping("/listPage") |
| | | public AjaxResult listPage(Page page, OutsourcingPartnerDto dto) { |
| | | IPage<OutsourcingPartnerDto> result = outsourcingPartnerService.partnerListPage(page, dto); |
| | | return AjaxResult.success(result); |
| | | } |
| | | |
| | | /** |
| | | * åä½åå¯¼åº |
| | | */ |
| | | @Operation(summary = "åä½å导åº") |
| | | @Log(title = "åä½åæ¡£æ¡", businessType = BusinessType.EXPORT) |
| | | @PostMapping("/export") |
| | | public void export(HttpServletResponse response, OutsourcingPartnerDto dto) { |
| | | outsourcingPartnerService.partnerExport(response, dto); |
| | | } |
| | | |
| | | /** |
| | | * ä¸è½½å¯¼å
¥æ¨¡æ¿ |
| | | */ |
| | | @Operation(summary = "ä¸è½½åä½å导å
¥æ¨¡æ¿") |
| | | @Log(title = "åä½åæ¡£æ¡-ä¸è½½æ¨¡æ¿", businessType = BusinessType.EXPORT) |
| | | @PostMapping("/downloadTemplate") |
| | | public void downloadTemplate(HttpServletResponse response) { |
| | | ExcelUtil<OutsourcingPartnerExcelDto> util = new ExcelUtil<>(OutsourcingPartnerExcelDto.class); |
| | | util.importTemplateExcel(response, "åä½åæ¡£æ¡æ¨¡æ¿"); |
| | | } |
| | | |
| | | /** |
| | | * åä½å导å
¥ |
| | | */ |
| | | @Operation(summary = "åä½å导å
¥") |
| | | @Log(title = "åä½åæ¡£æ¡å¯¼å
¥", businessType = BusinessType.IMPORT) |
| | | @PostMapping("/import") |
| | | public AjaxResult importData(MultipartFile file) { |
| | | return outsourcingPartnerService.importData(file) |
| | | ? AjaxResult.success("导å
¥æå") |
| | | : AjaxResult.error("导å
¥å¤±è´¥"); |
| | | } |
| | | |
| | | /** |
| | | * åä½å䏿é项 |
| | | */ |
| | | @Operation(summary = "åä½å䏿é项") |
| | | @GetMapping("/getOptions") |
| | | public AjaxResult getOptions() { |
| | | return AjaxResult.success(outsourcingPartnerService.options()); |
| | | } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.outsourcing.controller; |
| | | |
| | | import com.baomidou.mybatisplus.core.metadata.IPage; |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import com.ruoyi.framework.web.domain.AjaxResult; |
| | | import com.ruoyi.outsourcing.service.IOutsourcingPartnerService; |
| | | import com.ruoyi.outsourcing.vo.OutsourcingPartnerTransactionsDetailsVo; |
| | | import com.ruoyi.outsourcing.vo.OutsourcingPartnerTransactionsVo; |
| | | import io.swagger.v3.oas.annotations.Operation; |
| | | import io.swagger.v3.oas.annotations.tags.Tag; |
| | | import lombok.AllArgsConstructor; |
| | | import org.springframework.web.bind.annotation.GetMapping; |
| | | import org.springframework.web.bind.annotation.RequestMapping; |
| | | import org.springframework.web.bind.annotation.RequestParam; |
| | | import org.springframework.web.bind.annotation.RestController; |
| | | |
| | | /** |
| | | * åä½å徿¥æ¥è¡¨ Controller |
| | | * |
| | | * <p>åºä»å£å¾ï¼å§å¤è®¢åéé¢ï¼status in (1,2)ï¼â 已仿¬¾ï¼payment_record party_type=3 and direction=1ï¼ã |
| | | * è稿ä¸å·²ä½åºè®¢åä¸è®¡å
¥åºä»ã</p> |
| | | */ |
| | | @RestController |
| | | @RequestMapping("/outsourcing/report") |
| | | @AllArgsConstructor |
| | | @Tag(name = "åä½å徿¥") |
| | | public class OutsourcingPartnerReportController { |
| | | |
| | | private final IOutsourcingPartnerService outsourcingPartnerService; |
| | | |
| | | /** |
| | | * åä½å徿¥æ±æ»å表 |
| | | */ |
| | | @Operation(summary = "åä½å徿¥æ±æ»") |
| | | @GetMapping("/partnerTransactions") |
| | | public AjaxResult partnerTransactions(Page page, |
| | | @RequestParam(required = false) String partnerName) { |
| | | IPage<OutsourcingPartnerTransactionsVo> result = |
| | | outsourcingPartnerService.partnerTransactions(page, partnerName); |
| | | return AjaxResult.success(result); |
| | | } |
| | | |
| | | /** |
| | | * åä½å徿¥æç»ï¼éå§å¤è®¢åï¼ |
| | | */ |
| | | @Operation(summary = "åä½å徿¥æç»") |
| | | @GetMapping("/partnerTransactionsDetails") |
| | | public AjaxResult partnerTransactionsDetails(Page page, @RequestParam Long partnerId) { |
| | | IPage<OutsourcingPartnerTransactionsDetailsVo> result = |
| | | outsourcingPartnerService.partnerTransactionsDetails(page, partnerId); |
| | | return AjaxResult.success(result); |
| | | } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.outsourcing.dto; |
| | | |
| | | import com.fasterxml.jackson.annotation.JsonFormat; |
| | | import com.ruoyi.outsourcing.pojo.OutsourcingOrderProduct; |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | import org.springframework.format.annotation.DateTimeFormat; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDate; |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * å§å¤è®¢å DTO |
| | | */ |
| | | @Data |
| | | public class OutsourcingOrderDto { |
| | | |
| | | @Schema(description = "订å主é®") |
| | | private Long id; |
| | | |
| | | @Schema(description = "å§å¤è®¢åå·") |
| | | private String orderNo; |
| | | |
| | | @Schema(description = "åä½åid") |
| | | private Long partnerId; |
| | | |
| | | @Schema(description = "åä½ååç§°") |
| | | private String partnerName; |
| | | |
| | | @Schema(description = "ç³è¯·æ¥æ") |
| | | @JsonFormat(pattern = "yyyy-MM-dd") |
| | | @DateTimeFormat(pattern = "yyyy-MM-dd") |
| | | private LocalDate applyDate; |
| | | |
| | | @Schema(description = "ææäº¤ä»æ¥æ") |
| | | @JsonFormat(pattern = "yyyy-MM-dd") |
| | | @DateTimeFormat(pattern = "yyyy-MM-dd") |
| | | private LocalDate expectedDeliveryDate; |
| | | |
| | | @Schema(description = "项ç®åç§°") |
| | | private String projectName; |
| | | |
| | | @Schema(description = "å§å¤éé¢ï¼å«ç¨æ»ä»·ï¼") |
| | | private BigDecimal contractAmount; |
| | | |
| | | @Schema(description = "仿¬¾æ¹å¼") |
| | | private String paymentMethod; |
| | | |
| | | @Schema(description = "夿³¨") |
| | | private String remarks; |
| | | |
| | | @Schema(description = "ç¶æ 0è稿 1已确认 2已宿 3å·²ä½åº") |
| | | private Integer status; |
| | | |
| | | @Schema(description = "ä½åºåå ") |
| | | private String cancelReason; |
| | | |
| | | @Schema(description = "ç³è¯·æ¥ææ¥è¯¢å¼å§ï¼yyyy-MM-ddï¼") |
| | | private String startDate; |
| | | |
| | | @Schema(description = "ç³è¯·æ¥ææ¥è¯¢ç»æï¼yyyy-MM-ddï¼") |
| | | private String endDate; |
| | | |
| | | @Schema(description = "å§å¤äº§åæç»") |
| | | private List<OutsourcingOrderProduct> productData; |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.outsourcing.dto; |
| | | |
| | | import com.baomidou.mybatisplus.annotation.TableField; |
| | | import com.ruoyi.basic.dto.StorageBlobDTO; |
| | | import com.ruoyi.outsourcing.pojo.OutsourcingPartner; |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * å§å¤åä½åæ¡£æ¡ DTOï¼æ¥è¯¢æ¡ä»¶ + æ°å¢/ä¿®æ¹å
¥åï¼ |
| | | */ |
| | | @Data |
| | | public class OutsourcingPartnerDto extends OutsourcingPartner { |
| | | |
| | | @Schema(description = "ç»´æ¤äººååç§°") |
| | | private String maintainUserName; |
| | | |
| | | @TableField(exist = false) |
| | | @Schema(description = "éä»¶å表") |
| | | private List<StorageBlobDTO> storageBlobDTOS; |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.outsourcing.enums; |
| | | |
| | | import com.ruoyi.common.enums.BaseEnum; |
| | | import lombok.AllArgsConstructor; |
| | | import lombok.Getter; |
| | | |
| | | /** |
| | | * å§å¤è®¢åç¶ææä¸¾ |
| | | */ |
| | | @Getter |
| | | @AllArgsConstructor |
| | | public enum OutsourcingOrderStatusEnum implements BaseEnum<Integer> { |
| | | |
| | | DRAFT(0, "è稿"), |
| | | CONFIRMED(1, "已确认"), |
| | | COMPLETED(2, "已宿"), |
| | | CANCELLED(3, "å·²ä½åº"); |
| | | |
| | | private final Integer value; |
| | | private final String label; |
| | | |
| | | @Override |
| | | public Integer getCode() { |
| | | return value; |
| | | } |
| | | |
| | | @Override |
| | | public String getValue() { |
| | | return label; |
| | | } |
| | | |
| | | public static String getLabelByValue(Integer value) { |
| | | if (value == null) { |
| | | return "æªç¥ç¶æ"; |
| | | } |
| | | for (OutsourcingOrderStatusEnum status : values()) { |
| | | if (status.getCode().equals(value)) { |
| | | return status.getValue(); |
| | | } |
| | | } |
| | | return "æªç¥ç¶æ"; |
| | | } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.outsourcing.excel; |
| | | |
| | | import com.fasterxml.jackson.annotation.JsonFormat; |
| | | import com.ruoyi.framework.aspectj.lang.annotation.Excel; |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDate; |
| | | |
| | | /** |
| | | * å§å¤è®¢å导åºå¯¹è±¡ |
| | | */ |
| | | @Data |
| | | public class OutsourcingOrderExcelDto { |
| | | |
| | | @Excel(name = "å§å¤è®¢åå·") |
| | | private String orderNo; |
| | | |
| | | @Excel(name = "åä½ååç§°") |
| | | private String partnerName; |
| | | |
| | | @Excel(name = "ç³è¯·æ¥æ", dateFormat = "yyyy-MM-dd") |
| | | @JsonFormat(pattern = "yyyy-MM-dd") |
| | | private LocalDate applyDate; |
| | | |
| | | @Excel(name = "ææäº¤ä»æ¥æ", dateFormat = "yyyy-MM-dd") |
| | | @JsonFormat(pattern = "yyyy-MM-dd") |
| | | private LocalDate expectedDeliveryDate; |
| | | |
| | | @Excel(name = "项ç®åç§°") |
| | | private String projectName; |
| | | |
| | | @Excel(name = "å§å¤éé¢") |
| | | private BigDecimal contractAmount; |
| | | |
| | | @Excel(name = "仿¬¾æ¹å¼") |
| | | private String paymentMethod; |
| | | |
| | | @Excel(name = "ç¶æ") |
| | | private String statusLabel; |
| | | |
| | | @Excel(name = "夿³¨") |
| | | private String remarks; |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.outsourcing.excel; |
| | | |
| | | import com.ruoyi.framework.aspectj.lang.annotation.Excel; |
| | | import lombok.Data; |
| | | |
| | | /** |
| | | * å§å¤åä½åæ¡£æ¡å¯¼å
¥å¯¼åºå¯¹è±¡ |
| | | */ |
| | | @Data |
| | | public class OutsourcingPartnerExcelDto { |
| | | |
| | | @Excel(name = "åä½ååç§°") |
| | | private String partnerName; |
| | | |
| | | @Excel(name = "纳ç¨äººè¯å«å·") |
| | | private String taxpayerIdentificationNum; |
| | | |
| | | @Excel(name = "å
¬å¸å°å") |
| | | private String companyAddress; |
| | | |
| | | @Excel(name = "å
¬å¸çµè¯") |
| | | private String companyPhone; |
| | | |
| | | @Excel(name = "弿·è¡") |
| | | private String bankAccountName; |
| | | |
| | | @Excel(name = "è´¦å·") |
| | | private String bankAccountNum; |
| | | |
| | | @Excel(name = "è系人") |
| | | private String contactUserName; |
| | | |
| | | @Excel(name = "èç³»çµè¯") |
| | | private String contactUserPhone; |
| | | |
| | | @Excel(name = "åä½åç±»å") |
| | | private String partnerType; |
| | | |
| | | @Excel(name = "ç»´æ¤äºº") |
| | | private String maintainUserName; |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.outsourcing.mapper; |
| | | |
| | | import com.baomidou.mybatisplus.core.mapper.BaseMapper; |
| | | import com.ruoyi.outsourcing.pojo.OutsourcingOrder; |
| | | import org.apache.ibatis.annotations.Mapper; |
| | | |
| | | /** |
| | | * å§å¤è®¢å Mapper |
| | | */ |
| | | @Mapper |
| | | public interface OutsourcingOrderMapper extends BaseMapper<OutsourcingOrder> { |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.outsourcing.mapper; |
| | | |
| | | import com.baomidou.mybatisplus.core.mapper.BaseMapper; |
| | | import com.ruoyi.outsourcing.pojo.OutsourcingOrderProduct; |
| | | import org.apache.ibatis.annotations.Mapper; |
| | | |
| | | /** |
| | | * å§å¤è®¢å产åæç» Mapper |
| | | */ |
| | | @Mapper |
| | | public interface OutsourcingOrderProductMapper extends BaseMapper<OutsourcingOrderProduct> { |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.outsourcing.mapper; |
| | | |
| | | import com.baomidou.mybatisplus.core.mapper.BaseMapper; |
| | | import com.baomidou.mybatisplus.core.metadata.IPage; |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import com.ruoyi.outsourcing.dto.OutsourcingPartnerDto; |
| | | import com.ruoyi.outsourcing.excel.OutsourcingPartnerExcelDto; |
| | | import com.ruoyi.outsourcing.pojo.OutsourcingPartner; |
| | | import com.ruoyi.outsourcing.vo.OutsourcingPartnerTransactionsDetailsVo; |
| | | import com.ruoyi.outsourcing.vo.OutsourcingPartnerTransactionsVo; |
| | | import org.apache.ibatis.annotations.Mapper; |
| | | import org.apache.ibatis.annotations.Param; |
| | | |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * å§å¤åä½åæ¡£æ¡ Mapper |
| | | */ |
| | | @Mapper |
| | | public interface OutsourcingPartnerMapper extends BaseMapper<OutsourcingPartner> { |
| | | |
| | | IPage<OutsourcingPartnerDto> partnerListPage(Page page, @Param("dto") OutsourcingPartnerDto dto); |
| | | |
| | | List<OutsourcingPartnerExcelDto> partnerExportList(@Param("dto") OutsourcingPartnerDto dto); |
| | | |
| | | IPage<OutsourcingPartnerTransactionsVo> partnerTransactions(Page page, @Param("partnerName") String partnerName); |
| | | |
| | | IPage<OutsourcingPartnerTransactionsDetailsVo> partnerTransactionsDetails(Page page, @Param("partnerId") Long partnerId); |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.outsourcing.pojo; |
| | | |
| | | import com.baomidou.mybatisplus.annotation.FieldFill; |
| | | import com.baomidou.mybatisplus.annotation.IdType; |
| | | import com.baomidou.mybatisplus.annotation.TableField; |
| | | import com.baomidou.mybatisplus.annotation.TableId; |
| | | import com.baomidou.mybatisplus.annotation.TableName; |
| | | import com.fasterxml.jackson.annotation.JsonFormat; |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Getter; |
| | | import lombok.Setter; |
| | | import org.springframework.format.annotation.DateTimeFormat; |
| | | |
| | | import java.io.Serializable; |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDate; |
| | | import java.time.LocalDateTime; |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * å§å¤è®¢å对象 outsourcing_order |
| | | */ |
| | | @Getter |
| | | @Setter |
| | | @TableName("outsourcing_order") |
| | | @Schema(name = "OutsourcingOrder", description = "å§å¤è®¢å") |
| | | public class OutsourcingOrder implements Serializable { |
| | | |
| | | private static final long serialVersionUID = 1L; |
| | | |
| | | @TableId(value = "id", type = IdType.AUTO) |
| | | @Schema(description = "主é®id") |
| | | private Long id; |
| | | |
| | | @Schema(description = "å§å¤è®¢åå·") |
| | | private String orderNo; |
| | | |
| | | @Schema(description = "åä½åid") |
| | | private Long partnerId; |
| | | |
| | | @Schema(description = "åä½ååç§°") |
| | | private String partnerName; |
| | | |
| | | @Schema(description = "ç³è¯·æ¥æ") |
| | | @JsonFormat(pattern = "yyyy-MM-dd") |
| | | @DateTimeFormat(pattern = "yyyy-MM-dd") |
| | | private LocalDate applyDate; |
| | | |
| | | @Schema(description = "ææäº¤ä»æ¥æ") |
| | | @JsonFormat(pattern = "yyyy-MM-dd") |
| | | @DateTimeFormat(pattern = "yyyy-MM-dd") |
| | | private LocalDate expectedDeliveryDate; |
| | | |
| | | @Schema(description = "项ç®åç§°") |
| | | private String projectName; |
| | | |
| | | @Schema(description = "å§å¤éé¢ï¼å«ç¨æ»ä»·ï¼") |
| | | private BigDecimal contractAmount; |
| | | |
| | | @Schema(description = "仿¬¾æ¹å¼") |
| | | private String paymentMethod; |
| | | |
| | | @Schema(description = "夿³¨") |
| | | private String remarks; |
| | | |
| | | @Schema(description = "ç¶æ 0è稿 1已确认 2已宿 3å·²ä½åº") |
| | | private Integer status; |
| | | |
| | | @Schema(description = "确认æ¶é´") |
| | | @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") |
| | | private LocalDateTime confirmTime; |
| | | |
| | | @Schema(description = "ä½åºåå ") |
| | | private String cancelReason; |
| | | |
| | | @TableField(fill = FieldFill.INSERT) |
| | | private Long tenantId; |
| | | |
| | | @TableField(fill = FieldFill.INSERT) |
| | | private Long deptId; |
| | | |
| | | @TableField(fill = FieldFill.INSERT) |
| | | private Integer createUser; |
| | | |
| | | @TableField(fill = FieldFill.INSERT) |
| | | @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") |
| | | private LocalDateTime createTime; |
| | | |
| | | @TableField(fill = FieldFill.INSERT_UPDATE) |
| | | @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") |
| | | private LocalDateTime updateTime; |
| | | |
| | | @TableField(exist = false) |
| | | @Schema(description = "å§å¤äº§åæç»") |
| | | private List<OutsourcingOrderProduct> productData; |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.outsourcing.pojo; |
| | | |
| | | import com.baomidou.mybatisplus.annotation.FieldFill; |
| | | import com.baomidou.mybatisplus.annotation.IdType; |
| | | import com.baomidou.mybatisplus.annotation.TableField; |
| | | import com.baomidou.mybatisplus.annotation.TableId; |
| | | import com.baomidou.mybatisplus.annotation.TableName; |
| | | import com.fasterxml.jackson.annotation.JsonFormat; |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Getter; |
| | | import lombok.Setter; |
| | | |
| | | import java.io.Serializable; |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDateTime; |
| | | |
| | | /** |
| | | * å§å¤è®¢å产åæç»å¯¹è±¡ outsourcing_order_product |
| | | */ |
| | | @Getter |
| | | @Setter |
| | | @TableName("outsourcing_order_product") |
| | | @Schema(name = "OutsourcingOrderProduct", description = "å§å¤è®¢å产åæç»") |
| | | public class OutsourcingOrderProduct implements Serializable { |
| | | |
| | | private static final long serialVersionUID = 1L; |
| | | |
| | | @TableId(value = "id", type = IdType.AUTO) |
| | | @Schema(description = "主é®id") |
| | | private Long id; |
| | | |
| | | @Schema(description = "å§å¤è®¢åid") |
| | | private Long outsourcingOrderId; |
| | | |
| | | @Schema(description = "产åid") |
| | | private Long productId; |
| | | |
| | | @Schema(description = "产åè§æ ¼id") |
| | | private Long productModelId; |
| | | |
| | | @Schema(description = "产å大类") |
| | | private String productCategory; |
| | | |
| | | @Schema(description = "è§æ ¼åå·") |
| | | private String specificationModel; |
| | | |
| | | @Schema(description = "åä½") |
| | | private String unit; |
| | | |
| | | @Schema(description = "æ°é") |
| | | private BigDecimal quantity; |
| | | |
| | | @Schema(description = "ç¨ç") |
| | | private BigDecimal taxRate; |
| | | |
| | | @Schema(description = "å«ç¨åä»·") |
| | | private BigDecimal taxInclusiveUnitPrice; |
| | | |
| | | @Schema(description = "å«ç¨æ»ä»·") |
| | | private BigDecimal taxInclusiveTotalPrice; |
| | | |
| | | @Schema(description = "ä¸å«ç¨æ»ä»·") |
| | | private BigDecimal taxExclusiveTotalPrice; |
| | | |
| | | @Schema(description = "å票类å") |
| | | private String invoiceType; |
| | | |
| | | @Schema(description = "æ¯å¦æ¥åºåéæ 0å¦ 1æ¯") |
| | | private Boolean isScrap; |
| | | |
| | | @Schema(description = "éç¨çæ¥åºååæ ¼åºåidï¼stock_inventory.idï¼åªè¯»å¼ç¨ï¼ä¸åååºåï¼") |
| | | private Long stockInventoryId; |
| | | |
| | | @Schema(description = "æ¥åºåæ¹å·") |
| | | private String batchNo; |
| | | |
| | | @Schema(description = "ä¸åæ¶è¯¥æ¹æ¬¡å¯ç¨éå¿«ç
§") |
| | | private BigDecimal availableQuantity; |
| | | |
| | | @Schema(description = "夿³¨") |
| | | private String remark; |
| | | |
| | | @TableField(fill = FieldFill.INSERT) |
| | | private Long tenantId; |
| | | |
| | | @TableField(fill = FieldFill.INSERT) |
| | | private Long deptId; |
| | | |
| | | @TableField(fill = FieldFill.INSERT) |
| | | private Integer createUser; |
| | | |
| | | @TableField(fill = FieldFill.INSERT) |
| | | @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") |
| | | private LocalDateTime createTime; |
| | | |
| | | @TableField(fill = FieldFill.INSERT_UPDATE) |
| | | @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") |
| | | private LocalDateTime updateTime; |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.outsourcing.pojo; |
| | | |
| | | import com.baomidou.mybatisplus.annotation.FieldFill; |
| | | import com.baomidou.mybatisplus.annotation.IdType; |
| | | import com.baomidou.mybatisplus.annotation.TableField; |
| | | import com.baomidou.mybatisplus.annotation.TableId; |
| | | import com.baomidou.mybatisplus.annotation.TableName; |
| | | import com.fasterxml.jackson.annotation.JsonFormat; |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | |
| | | import java.io.Serializable; |
| | | import java.time.LocalDate; |
| | | import java.time.LocalDateTime; |
| | | |
| | | /** |
| | | * å§å¤åä½åæ¡£æ¡å¯¹è±¡ outsourcing_partner |
| | | */ |
| | | @Data |
| | | @TableName("outsourcing_partner") |
| | | @Schema(name = "OutsourcingPartner", description = "å§å¤åä½åæ¡£æ¡") |
| | | public class OutsourcingPartner implements Serializable { |
| | | |
| | | private static final long serialVersionUID = 1L; |
| | | |
| | | @TableId(value = "id", type = IdType.AUTO) |
| | | @Schema(description = "主é®id") |
| | | private Long id; |
| | | |
| | | @Schema(description = "åä½ååç§°") |
| | | private String partnerName; |
| | | |
| | | @Schema(description = "纳ç¨äººè¯å«å·") |
| | | private String taxpayerIdentificationNum; |
| | | |
| | | @Schema(description = "å
¬å¸å°å") |
| | | private String companyAddress; |
| | | |
| | | @Schema(description = "å
¬å¸çµè¯") |
| | | private String companyPhone; |
| | | |
| | | @Schema(description = "弿·è¡åç§°") |
| | | private String bankAccountName; |
| | | |
| | | @Schema(description = "é¶è¡è´¦å·") |
| | | private String bankAccountNum; |
| | | |
| | | @Schema(description = "è系人å§å") |
| | | private String contactUserName; |
| | | |
| | | @Schema(description = "è系人çµè¯") |
| | | private String contactUserPhone; |
| | | |
| | | @Schema(description = "ç»´æ¤äººid") |
| | | private Long maintainUserId; |
| | | |
| | | @Schema(description = "ç»´æ¤æ¶é´") |
| | | @JsonFormat(pattern = "yyyy-MM-dd") |
| | | private LocalDate maintainTime; |
| | | |
| | | @Schema(description = "åä½åç±»å") |
| | | private String partnerType; |
| | | |
| | | @Schema(description = "æ¯å¦ç½åå 1æ¯ 0å¦") |
| | | private Integer isWhite; |
| | | |
| | | @Schema(description = "夿³¨") |
| | | private String remark; |
| | | |
| | | @TableField(fill = FieldFill.INSERT) |
| | | private Long tenantId; |
| | | |
| | | @TableField(fill = FieldFill.INSERT) |
| | | private Long deptId; |
| | | |
| | | @TableField(fill = FieldFill.INSERT) |
| | | private Integer createUser; |
| | | |
| | | @TableField(fill = FieldFill.INSERT) |
| | | @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") |
| | | private LocalDateTime createTime; |
| | | |
| | | @TableField(fill = FieldFill.INSERT_UPDATE) |
| | | @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") |
| | | private LocalDateTime updateTime; |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.outsourcing.service; |
| | | |
| | | import com.baomidou.mybatisplus.extension.service.IService; |
| | | import com.ruoyi.outsourcing.dto.OutsourcingOrderDto; |
| | | import com.ruoyi.outsourcing.pojo.OutsourcingOrder; |
| | | import jakarta.servlet.http.HttpServletResponse; |
| | | |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * å§å¤è®¢å Service |
| | | */ |
| | | public interface IOutsourcingOrderService extends IService<OutsourcingOrder> { |
| | | |
| | | /** |
| | | * å§å¤è®¢åå表ï¼é
å startPage åé¡µï¼ |
| | | */ |
| | | List<OutsourcingOrder> selectOrderList(OutsourcingOrderDto dto); |
| | | |
| | | /** |
| | | * å§å¤è®¢å详æ
ï¼å«äº§åæç»ï¼ |
| | | */ |
| | | OutsourcingOrderDto getDetail(Long id); |
| | | |
| | | /** |
| | | * æ°å¢å§å¤è®¢åï¼èç¨¿ï¼ |
| | | */ |
| | | Long saveOrder(OutsourcingOrderDto dto); |
| | | |
| | | /** |
| | | * ä¿®æ¹å§å¤è®¢åï¼ä»
èç¨¿ç¶æå
许 |
| | | */ |
| | | boolean updateOrder(OutsourcingOrderDto dto); |
| | | |
| | | /** |
| | | * å é¤å§å¤è®¢åï¼ä»
èç¨¿ç¶æå
许 |
| | | */ |
| | | boolean deleteOrders(List<Long> ids); |
| | | |
| | | /** |
| | | * æäº¤ï¼è稿 -> 已确认 |
| | | */ |
| | | boolean submit(Long id); |
| | | |
| | | /** |
| | | * 宿ï¼å·²ç¡®è®¤ -> 已宿 |
| | | */ |
| | | boolean complete(Long id); |
| | | |
| | | /** |
| | | * ä½åºï¼è稿/已确认 -> å·²ä½åº |
| | | */ |
| | | boolean cancel(Long id, String cancelReason); |
| | | |
| | | /** |
| | | * å§å¤è®¢åå¯¼åº |
| | | */ |
| | | void exportOrders(HttpServletResponse response, OutsourcingOrderDto dto); |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.outsourcing.service; |
| | | |
| | | import com.baomidou.mybatisplus.core.metadata.IPage; |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import com.baomidou.mybatisplus.extension.service.IService; |
| | | import com.ruoyi.outsourcing.dto.OutsourcingPartnerDto; |
| | | import com.ruoyi.outsourcing.pojo.OutsourcingPartner; |
| | | import com.ruoyi.outsourcing.vo.OutsourcingPartnerTransactionsDetailsVo; |
| | | import com.ruoyi.outsourcing.vo.OutsourcingPartnerTransactionsVo; |
| | | import com.ruoyi.outsourcing.vo.OutsourcingPartnerVo; |
| | | import jakarta.servlet.http.HttpServletResponse; |
| | | import org.springframework.web.multipart.MultipartFile; |
| | | |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * å§å¤åä½åæ¡£æ¡ Service |
| | | */ |
| | | public interface IOutsourcingPartnerService extends IService<OutsourcingPartner> { |
| | | |
| | | /** |
| | | * æ°å¢åä½åï¼å«éä»¶ç»å®ï¼ |
| | | */ |
| | | Long savePartner(OutsourcingPartnerDto dto); |
| | | |
| | | /** |
| | | * ä¿®æ¹åä½åï¼å«éä»¶ç»å®ï¼ |
| | | */ |
| | | boolean updatePartner(OutsourcingPartnerDto dto); |
| | | |
| | | /** |
| | | * å é¤åä½åï¼å
æ ¡éªå¼ç¨ï¼åæ¸
çéä»¶ï¼ |
| | | */ |
| | | boolean delPartner(List<Long> ids); |
| | | |
| | | /** |
| | | * åä½å详æ
ï¼å«éä»¶åæ¾ï¼ |
| | | */ |
| | | OutsourcingPartnerVo partnerDetail(Long id); |
| | | |
| | | /** |
| | | * åä½åå页æ¥è¯¢ |
| | | */ |
| | | IPage<OutsourcingPartnerDto> partnerListPage(Page page, OutsourcingPartnerDto dto); |
| | | |
| | | /** |
| | | * åä½åå¯¼åº |
| | | */ |
| | | void partnerExport(HttpServletResponse response, OutsourcingPartnerDto dto); |
| | | |
| | | /** |
| | | * åä½å导å
¥ |
| | | */ |
| | | Boolean importData(MultipartFile file); |
| | | |
| | | /** |
| | | * åä½å䏿é项 |
| | | */ |
| | | List<OutsourcingPartner> options(); |
| | | |
| | | /** |
| | | * åä½å徿¥æ±æ» |
| | | */ |
| | | IPage<OutsourcingPartnerTransactionsVo> partnerTransactions(Page page, String partnerName); |
| | | |
| | | /** |
| | | * åä½å徿¥æç» |
| | | */ |
| | | IPage<OutsourcingPartnerTransactionsDetailsVo> partnerTransactionsDetails(Page page, Long partnerId); |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.outsourcing.service.impl; |
| | | |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import com.baomidou.mybatisplus.core.toolkit.Wrappers; |
| | | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
| | | import com.ruoyi.basic.mapper.ProductMapper; |
| | | import com.ruoyi.basic.mapper.ProductModelMapper; |
| | | import com.ruoyi.basic.pojo.Product; |
| | | import com.ruoyi.basic.pojo.ProductModel; |
| | | import com.ruoyi.common.enums.ReviewStatusEnum; |
| | | import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum; |
| | | import com.ruoyi.common.exception.ServiceException; |
| | | import com.ruoyi.common.utils.OrderUtils; |
| | | import com.ruoyi.common.utils.StringUtils; |
| | | import com.ruoyi.common.utils.poi.ExcelUtil; |
| | | import com.ruoyi.outsourcing.dto.OutsourcingOrderDto; |
| | | import com.ruoyi.outsourcing.enums.OutsourcingOrderStatusEnum; |
| | | import com.ruoyi.outsourcing.excel.OutsourcingOrderExcelDto; |
| | | import com.ruoyi.outsourcing.mapper.OutsourcingOrderMapper; |
| | | import com.ruoyi.outsourcing.mapper.OutsourcingOrderProductMapper; |
| | | import com.ruoyi.outsourcing.mapper.OutsourcingPartnerMapper; |
| | | import com.ruoyi.outsourcing.pojo.OutsourcingOrder; |
| | | import com.ruoyi.outsourcing.pojo.OutsourcingOrderProduct; |
| | | import com.ruoyi.outsourcing.pojo.OutsourcingPartner; |
| | | import com.ruoyi.outsourcing.service.IOutsourcingOrderService; |
| | | import com.ruoyi.stock.dto.StockInventoryDto; |
| | | import com.ruoyi.stock.pojo.StockOutRecord; |
| | | import com.ruoyi.stock.service.StockInventoryService; |
| | | import com.ruoyi.stock.service.StockOutRecordService; |
| | | import jakarta.servlet.http.HttpServletResponse; |
| | | import lombok.RequiredArgsConstructor; |
| | | import org.springframework.beans.BeanUtils; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDate; |
| | | import java.time.LocalDateTime; |
| | | import java.util.HashMap; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | import java.util.Objects; |
| | | import java.util.Set; |
| | | import java.util.stream.Collectors; |
| | | |
| | | /** |
| | | * å§å¤è®¢å Service å®ç° |
| | | */ |
| | | @Service |
| | | @RequiredArgsConstructor |
| | | public class OutsourcingOrderServiceImpl extends ServiceImpl<OutsourcingOrderMapper, OutsourcingOrder> |
| | | implements IOutsourcingOrderService { |
| | | |
| | | private static final String ORDER_NO_PREFIX = "WWDD"; |
| | | |
| | | private final OutsourcingOrderMapper outsourcingOrderMapper; |
| | | private final OutsourcingOrderProductMapper outsourcingOrderProductMapper; |
| | | private final OutsourcingPartnerMapper outsourcingPartnerMapper; |
| | | private final ProductMapper productMapper; |
| | | private final ProductModelMapper productModelMapper; |
| | | private final StockInventoryService stockInventoryService; |
| | | private final StockOutRecordService stockOutRecordService; |
| | | |
| | | @Override |
| | | public List<OutsourcingOrder> selectOrderList(OutsourcingOrderDto dto) { |
| | | LambdaQueryWrapper<OutsourcingOrder> wrapper = new LambdaQueryWrapper<>(); |
| | | wrapper.like(StringUtils.isNotBlank(dto.getOrderNo()), OutsourcingOrder::getOrderNo, dto.getOrderNo()) |
| | | .eq(dto.getPartnerId() != null, OutsourcingOrder::getPartnerId, dto.getPartnerId()) |
| | | .like(StringUtils.isNotBlank(dto.getPartnerName()), OutsourcingOrder::getPartnerName, dto.getPartnerName()) |
| | | .eq(dto.getStatus() != null, OutsourcingOrder::getStatus, dto.getStatus()) |
| | | .like(StringUtils.isNotBlank(dto.getProjectName()), OutsourcingOrder::getProjectName, dto.getProjectName()) |
| | | .ge(StringUtils.isNotBlank(dto.getStartDate()), OutsourcingOrder::getApplyDate, dto.getStartDate()) |
| | | .le(StringUtils.isNotBlank(dto.getEndDate()), OutsourcingOrder::getApplyDate, dto.getEndDate()) |
| | | .orderByDesc(OutsourcingOrder::getId); |
| | | return this.list(wrapper); |
| | | } |
| | | |
| | | @Override |
| | | public OutsourcingOrderDto getDetail(Long id) { |
| | | OutsourcingOrder order = outsourcingOrderMapper.selectById(id); |
| | | if (order == null) { |
| | | throw new ServiceException("å§å¤è®¢åä¸åå¨"); |
| | | } |
| | | OutsourcingOrderDto dto = new OutsourcingOrderDto(); |
| | | BeanUtils.copyProperties(order, dto); |
| | | dto.setProductData(listProducts(id)); |
| | | return dto; |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public Long saveOrder(OutsourcingOrderDto dto) { |
| | | OutsourcingOrder order = new OutsourcingOrder(); |
| | | BeanUtils.copyProperties(dto, order); |
| | | order.setId(null); |
| | | order.setStatus(OutsourcingOrderStatusEnum.DRAFT.getCode()); |
| | | order.setOrderNo(OrderUtils.countTodayByCreateTime( |
| | | outsourcingOrderMapper, ORDER_NO_PREFIX, "order_no", LocalDateTime.now())); |
| | | order.setConfirmTime(null); |
| | | order.setCancelReason(null); |
| | | fillPartnerName(order); |
| | | if (order.getApplyDate() == null) { |
| | | order.setApplyDate(LocalDate.now()); |
| | | } |
| | | order.setContractAmount(sumProducts(dto.getProductData())); |
| | | this.save(order); |
| | | |
| | | saveProducts(order.getId(), dto.getProductData()); |
| | | return order.getId(); |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public boolean updateOrder(OutsourcingOrderDto dto) { |
| | | if (dto.getId() == null) { |
| | | throw new ServiceException("å§å¤è®¢åidä¸è½ä¸ºç©º"); |
| | | } |
| | | OutsourcingOrder existing = outsourcingOrderMapper.selectById(dto.getId()); |
| | | if (existing == null) { |
| | | throw new ServiceException("å§å¤è®¢åä¸åå¨"); |
| | | } |
| | | if (!OutsourcingOrderStatusEnum.DRAFT.getCode().equals(existing.getStatus())) { |
| | | throw new ServiceException("ä»
èç¨¿ç¶æçå§å¤è®¢åå
许修æ¹"); |
| | | } |
| | | |
| | | OutsourcingOrder order = new OutsourcingOrder(); |
| | | BeanUtils.copyProperties(dto, order); |
| | | // åå·ãç¶æã确认信æ¯ç±ç³»ç»ç»´æ¤ï¼ç½®ç©ºå MyBatis-Plus ä¸ä¼æ´æ°è¿äºå |
| | | order.setOrderNo(null); |
| | | order.setStatus(null); |
| | | order.setConfirmTime(null); |
| | | order.setCancelReason(null); |
| | | order.setTenantId(null); |
| | | order.setDeptId(null); |
| | | order.setCreateUser(null); |
| | | order.setCreateTime(null); |
| | | order.setUpdateTime(null); |
| | | fillPartnerName(order); |
| | | order.setContractAmount(sumProducts(dto.getProductData())); |
| | | boolean updated = this.updateById(order); |
| | | |
| | | if (updated) { |
| | | outsourcingOrderProductMapper.delete(Wrappers.<OutsourcingOrderProduct>lambdaQuery() |
| | | .eq(OutsourcingOrderProduct::getOutsourcingOrderId, dto.getId())); |
| | | saveProducts(dto.getId(), dto.getProductData()); |
| | | } |
| | | return updated; |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public boolean deleteOrders(List<Long> ids) { |
| | | if (ids == null || ids.isEmpty()) { |
| | | throw new ServiceException("è¯·éæ©è¦å é¤çå§å¤è®¢å"); |
| | | } |
| | | List<String> notDraftNos = this.listByIds(ids).stream() |
| | | .filter(order -> !OutsourcingOrderStatusEnum.DRAFT.getCode().equals(order.getStatus())) |
| | | .map(OutsourcingOrder::getOrderNo) |
| | | .filter(Objects::nonNull) |
| | | .collect(Collectors.toList()); |
| | | if (!notDraftNos.isEmpty()) { |
| | | throw new ServiceException("ä»
èç¨¿ç¶æçå§å¤è®¢åå
许å é¤ï¼" + String.join("ã", notDraftNos)); |
| | | } |
| | | |
| | | outsourcingOrderProductMapper.delete(Wrappers.<OutsourcingOrderProduct>lambdaQuery() |
| | | .in(OutsourcingOrderProduct::getOutsourcingOrderId, ids)); |
| | | return this.removeByIds(ids); |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public boolean submit(Long id) { |
| | | OutsourcingOrder order = requireOrder(id); |
| | | if (!OutsourcingOrderStatusEnum.DRAFT.getCode().equals(order.getStatus())) { |
| | | throw new ServiceException("ä»
èç¨¿ç¶æçå§å¤è®¢åå
许æäº¤"); |
| | | } |
| | | if (order.getPartnerId() == null |
| | | || outsourcingPartnerMapper.selectById(order.getPartnerId()) == null) { |
| | | throw new ServiceException("请å
éæ©ææåä½ååæäº¤"); |
| | | } |
| | | List<OutsourcingOrderProduct> products = listProducts(id); |
| | | if (products.isEmpty()) { |
| | | throw new ServiceException("å§å¤è®¢å没æäº§åæç»ï¼æ æ³æäº¤"); |
| | | } |
| | | if (order.getContractAmount() == null |
| | | || order.getContractAmount().compareTo(BigDecimal.ZERO) <= 0) { |
| | | throw new ServiceException("å§å¤è®¢åéé¢å¿
é¡»å¤§äº 0 æè½æäº¤"); |
| | | } |
| | | |
| | | // æ¡ä»¶æ´æ°æ¢å èç¨¿ç¶æï¼é¿å
å¹¶åä¸éå¤æäº¤ |
| | | boolean submitted = this.update(Wrappers.<OutsourcingOrder>lambdaUpdate() |
| | | .eq(OutsourcingOrder::getId, id) |
| | | .eq(OutsourcingOrder::getStatus, OutsourcingOrderStatusEnum.DRAFT.getCode()) |
| | | .set(OutsourcingOrder::getStatus, OutsourcingOrderStatusEnum.CONFIRMED.getCode()) |
| | | .set(OutsourcingOrder::getConfirmTime, LocalDateTime.now())); |
| | | if (!submitted) { |
| | | throw new ServiceException("该å§å¤è®¢åå·²æäº¤ï¼è¯·å¿é夿ä½"); |
| | | } |
| | | occupyScrapStock(products); |
| | | return true; |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public boolean complete(Long id) { |
| | | OutsourcingOrder order = requireOrder(id); |
| | | if (!OutsourcingOrderStatusEnum.CONFIRMED.getCode().equals(order.getStatus())) { |
| | | throw new ServiceException("ä»
å·²ç¡®è®¤ç¶æçå§å¤è®¢åå
è®¸å®æ"); |
| | | } |
| | | requireScrapStockOutApproved(order.getId()); |
| | | boolean completed = this.update(Wrappers.<OutsourcingOrder>lambdaUpdate() |
| | | .eq(OutsourcingOrder::getId, id) |
| | | .eq(OutsourcingOrder::getStatus, OutsourcingOrderStatusEnum.CONFIRMED.getCode()) |
| | | .set(OutsourcingOrder::getStatus, OutsourcingOrderStatusEnum.COMPLETED.getCode())); |
| | | if (!completed) { |
| | | throw new ServiceException("ä»
å·²ç¡®è®¤ç¶æçå§å¤è®¢åå
è®¸å®æ"); |
| | | } |
| | | return true; |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public boolean cancel(Long id, String cancelReason) { |
| | | OutsourcingOrder order = requireOrder(id); |
| | | Integer status = order.getStatus(); |
| | | if (!OutsourcingOrderStatusEnum.DRAFT.getCode().equals(status) |
| | | && !OutsourcingOrderStatusEnum.CONFIRMED.getCode().equals(status)) { |
| | | throw new ServiceException("该å§å¤è®¢å已宿æå·²ä½åºï¼ä¸å
许éå¤ä½åº"); |
| | | } |
| | | boolean cancelled = this.update(Wrappers.<OutsourcingOrder>lambdaUpdate() |
| | | .eq(OutsourcingOrder::getId, id) |
| | | .in(OutsourcingOrder::getStatus, OutsourcingOrderStatusEnum.DRAFT.getCode(), |
| | | OutsourcingOrderStatusEnum.CONFIRMED.getCode()) |
| | | .set(OutsourcingOrder::getStatus, OutsourcingOrderStatusEnum.CANCELLED.getCode()) |
| | | .set(OutsourcingOrder::getCancelReason, cancelReason)); |
| | | if (!cancelled) { |
| | | throw new ServiceException("该å§å¤è®¢å已宿æå·²ä½åºï¼ä¸å
许éå¤ä½åº"); |
| | | } |
| | | if (OutsourcingOrderStatusEnum.CONFIRMED.getCode().equals(status)) { |
| | | // æäº¤æ¶å ç¨çæ¥åºååºåè¦éæ¾ï¼æªå®¡æ¹çè®°å½å æå³éæ¾ï¼å·²å®¡æ¹éè¿çææ¹æ¬¡å½è¿åºå |
| | | stockOutRecordService.releaseByRecordIds(scrapLineIds(id), |
| | | StockOutQualifiedRecordTypeEnum.OUTSOURCING_SCRAP_OUT.getCode()); |
| | | } |
| | | return true; |
| | | } |
| | | |
| | | @Override |
| | | public void exportOrders(HttpServletResponse response, OutsourcingOrderDto dto) { |
| | | List<OutsourcingOrder> orders = selectOrderList(dto); |
| | | List<OutsourcingOrderExcelDto> excelList = orders.stream().map(order -> { |
| | | OutsourcingOrderExcelDto excel = new OutsourcingOrderExcelDto(); |
| | | BeanUtils.copyProperties(order, excel); |
| | | excel.setStatusLabel(OutsourcingOrderStatusEnum.getLabelByValue(order.getStatus())); |
| | | return excel; |
| | | }).collect(Collectors.toList()); |
| | | ExcelUtil<OutsourcingOrderExcelDto> util = new ExcelUtil<>(OutsourcingOrderExcelDto.class); |
| | | util.exportExcel(response, excelList, "å§å¤è®¢å"); |
| | | } |
| | | |
| | | private OutsourcingOrder requireOrder(Long id) { |
| | | if (id == null) { |
| | | throw new ServiceException("å§å¤è®¢åidä¸è½ä¸ºç©º"); |
| | | } |
| | | OutsourcingOrder order = outsourcingOrderMapper.selectById(id); |
| | | if (order == null) { |
| | | throw new ServiceException("å§å¤è®¢åä¸åå¨"); |
| | | } |
| | | return order; |
| | | } |
| | | |
| | | /** |
| | | * æ¥åºåéæè¡ç idï¼ä½ä¸ºåºåºè®°å½ç record_idã |
| | | * åºåºè®°å½ä¸æ¡å¯¹åºä¸è¡æç»ï¼ä¸ä¸ªè§æ ¼+æ¹å·ï¼ï¼ä¸éè´éè´§åºåºçè®°æ³ä¸è´ |
| | | */ |
| | | private List<Long> scrapLineIds(Long orderId) { |
| | | return listProducts(orderId).stream() |
| | | .filter(product -> Boolean.TRUE.equals(product.getIsScrap())) |
| | | .map(OutsourcingOrderProduct::getId) |
| | | .collect(Collectors.toList()); |
| | | } |
| | | |
| | | /** |
| | | * æ¥åºåéæå ç¨åºåï¼æ¯æ¡éæè¡å䏿¡å¾
审æ¹åºåºè®°å½ã |
| | | * |
| | | * <p>æ¥åºååçæ¯<b>åæ ¼åºå</b>ï¼stock_inventoryï¼åºåºè®°å½ type=0ï¼ã |
| | | * è®°å½ä¸è½åºå°±éè¿ stock_out_record çå¾
审æ¹éæå¯ç¨éå ä½ |
| | | * ï¼å¯ç¨é = qualitity â locked_quantity â å¾
审æ¹åºåºéï¼ï¼å æ¤å䏿¹æ¬¡ä¸ä¼è¢«å¤å¼ å§å¤è®¢åè¶
éï¼ |
| | | * ä½ qualitity æ¬èº«è¦çåºåºç®¡ç审æ¹éè¿æçæ£æ£å ââ ä¹å°±æ¯ãæäº¤å³å ç¨ãå®¡æ¹æå®æ£ãã</p> |
| | | */ |
| | | private void occupyScrapStock(List<OutsourcingOrderProduct> products) { |
| | | for (OutsourcingOrderProduct product : products) { |
| | | if (!Boolean.TRUE.equals(product.getIsScrap())) { |
| | | continue; |
| | | } |
| | | if (product.getProductModelId() == null || StringUtils.isEmpty(product.getBatchNo())) { |
| | | throw new ServiceException("æ¥åºåéæè¡ç¼ºå°äº§åè§æ ¼ææ¹å·ï¼æ æ³æäº¤"); |
| | | } |
| | | BigDecimal quantity = product.getQuantity(); |
| | | if (quantity == null || quantity.compareTo(BigDecimal.ZERO) <= 0) { |
| | | throw new ServiceException("æ¥åºåéæè¡æ°éå¿
é¡»å¤§äº 0"); |
| | | } |
| | | StockInventoryDto stockInventoryDto = new StockInventoryDto(); |
| | | stockInventoryDto.setRecordId(product.getId()); |
| | | stockInventoryDto.setRecordType(StockOutQualifiedRecordTypeEnum.OUTSOURCING_SCRAP_OUT.getCode()); |
| | | stockInventoryDto.setProductModelId(product.getProductModelId()); |
| | | stockInventoryDto.setBatchNo(product.getBatchNo()); |
| | | stockInventoryDto.setQualitity(quantity); |
| | | try { |
| | | stockInventoryService.addStockOutRecordOnly(stockInventoryDto); |
| | | } catch (RuntimeException e) { |
| | | // åæ ¼åºåä¸è¶³æçæ¯ ServiceExceptionï¼ä¸åæ ¼é£ç§ BaseException ä¹ä¸å¹¶å
ä½ |
| | | throw new ServiceException("æ¥åºåã" + product.getSpecificationModel() + "ãæ¹å·ã" |
| | | + product.getBatchNo() + "ã" + e.getMessage()); |
| | | } |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * æ¥åºåéæçåºåºè®°å½å¿
é¡»å
¨é¨å®¡æ¹éè¿æå
è®¸å®æè®¢åï¼ |
| | | * å¦åä¼åºç°ãå§å¤å·²å®æãåºå没æ£ãçè´¦å®ä¸ç¬¦ |
| | | */ |
| | | private void requireScrapStockOutApproved(Long orderId) { |
| | | List<Long> lineIds = scrapLineIds(orderId); |
| | | if (lineIds.isEmpty()) { |
| | | return; |
| | | } |
| | | List<StockOutRecord> records = stockOutRecordService.listByRecordIds( |
| | | lineIds, StockOutQualifiedRecordTypeEnum.OUTSOURCING_SCRAP_OUT.getCode()); |
| | | if (records.size() < lineIds.size()) { |
| | | throw new ServiceException("æ¥åºåéæç¼ºå°åºåºè®°å½ï¼è¯·å
ä½åºåéæ°æäº¤"); |
| | | } |
| | | List<String> pendingBatches = records.stream() |
| | | .filter(record -> !ReviewStatusEnum.APPROVED.getCode().equals(record.getApprovalStatus())) |
| | | .map(StockOutRecord::getOutboundBatches) |
| | | .filter(Objects::nonNull) |
| | | .collect(Collectors.toList()); |
| | | if (!pendingBatches.isEmpty()) { |
| | | throw new ServiceException("æ¥åºååºåºæªå®¡æ¹éè¿ï¼è¯·å
å°åºåºç®¡ç审æ¹åºåºæ¹æ¬¡ï¼" |
| | | + String.join("ã", pendingBatches)); |
| | | } |
| | | } |
| | | |
| | | private List<OutsourcingOrderProduct> listProducts(Long orderId) { |
| | | return outsourcingOrderProductMapper.selectList(Wrappers.<OutsourcingOrderProduct>lambdaQuery() |
| | | .eq(OutsourcingOrderProduct::getOutsourcingOrderId, orderId) |
| | | .orderByAsc(OutsourcingOrderProduct::getId)); |
| | | } |
| | | |
| | | private void saveProducts(Long orderId, List<OutsourcingOrderProduct> products) { |
| | | if (products == null || products.isEmpty()) { |
| | | return; |
| | | } |
| | | fillProductNames(products); |
| | | for (OutsourcingOrderProduct product : products) { |
| | | product.setId(null); |
| | | product.setOutsourcingOrderId(orderId); |
| | | product.setTenantId(null); |
| | | product.setDeptId(null); |
| | | product.setCreateUser(null); |
| | | product.setCreateTime(null); |
| | | product.setUpdateTime(null); |
| | | outsourcingOrderProductMapper.insert(product); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * å§å¤éé¢ä»¥æç»å«ç¨æ»ä»·å计为åï¼é¿å
åç«¯ä¼ å
¥éé¢ä¸æç»å¯¹ä¸ä¸å¯¼è´å¾æ¥åºä»éä¹± |
| | | */ |
| | | private BigDecimal sumProducts(List<OutsourcingOrderProduct> products) { |
| | | if (products == null || products.isEmpty()) { |
| | | return BigDecimal.ZERO; |
| | | } |
| | | return products.stream() |
| | | .map(OutsourcingOrderProduct::getTaxInclusiveTotalPrice) |
| | | .filter(Objects::nonNull) |
| | | .reduce(BigDecimal.ZERO, BigDecimal::add); |
| | | } |
| | | |
| | | /** |
| | | * è¡¥å
¨äº§å大类ä¸è§æ ¼åå·ï¼ä¾¿äºè®¢åç´æ¥å±ç¤ºäº§ååç§° |
| | | */ |
| | | private void fillProductNames(List<OutsourcingOrderProduct> products) { |
| | | Set<Long> productIds = products.stream() |
| | | .map(OutsourcingOrderProduct::getProductId) |
| | | .filter(Objects::nonNull) |
| | | .collect(Collectors.toSet()); |
| | | Set<Long> modelIds = products.stream() |
| | | .map(OutsourcingOrderProduct::getProductModelId) |
| | | .filter(Objects::nonNull) |
| | | .collect(Collectors.toSet()); |
| | | |
| | | Map<Long, String> productMap = new HashMap<>(); |
| | | if (!productIds.isEmpty()) { |
| | | for (Product product : productMapper.selectBatchIds(productIds)) { |
| | | productMap.put(product.getId(), product.getProductName()); |
| | | } |
| | | } |
| | | Map<Long, String> modelMap = new HashMap<>(); |
| | | if (!modelIds.isEmpty()) { |
| | | for (ProductModel model : productModelMapper.selectBatchIds(modelIds)) { |
| | | modelMap.put(model.getId(), model.getModel()); |
| | | } |
| | | } |
| | | |
| | | for (OutsourcingOrderProduct product : products) { |
| | | String productName = productMap.get(product.getProductId()); |
| | | if (productName != null) { |
| | | product.setProductCategory(productName); |
| | | } |
| | | String model = modelMap.get(product.getProductModelId()); |
| | | if (model != null) { |
| | | product.setSpecificationModel(model); |
| | | } |
| | | } |
| | | } |
| | | |
| | | private void fillPartnerName(OutsourcingOrder order) { |
| | | if (order.getPartnerId() == null) { |
| | | return; |
| | | } |
| | | OutsourcingPartner partner = outsourcingPartnerMapper.selectById(order.getPartnerId()); |
| | | if (partner == null) { |
| | | throw new ServiceException("åä½åä¸åå¨ï¼è¯·éæ°éæ©"); |
| | | } |
| | | order.setPartnerName(partner.getPartnerName()); |
| | | } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.outsourcing.service.impl; |
| | | |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import com.baomidou.mybatisplus.core.metadata.IPage; |
| | | import com.baomidou.mybatisplus.core.toolkit.Wrappers; |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
| | | import com.ruoyi.account.mapper.PaymentRecordMapper; |
| | | import com.ruoyi.account.pojo.PaymentRecord; |
| | | import com.ruoyi.basic.enums.ApplicationTypeEnum; |
| | | import com.ruoyi.basic.enums.RecordTypeEnum; |
| | | import com.ruoyi.basic.utils.FileUtil; |
| | | import com.ruoyi.common.exception.ServiceException; |
| | | import com.ruoyi.common.utils.SecurityUtils; |
| | | import com.ruoyi.common.utils.poi.ExcelUtil; |
| | | import com.ruoyi.outsourcing.dto.OutsourcingPartnerDto; |
| | | import com.ruoyi.outsourcing.excel.OutsourcingPartnerExcelDto; |
| | | import com.ruoyi.outsourcing.mapper.OutsourcingPartnerMapper; |
| | | import com.ruoyi.outsourcing.mapper.OutsourcingOrderMapper; |
| | | import com.ruoyi.outsourcing.pojo.OutsourcingOrder; |
| | | import com.ruoyi.outsourcing.pojo.OutsourcingPartner; |
| | | import com.ruoyi.outsourcing.service.IOutsourcingPartnerService; |
| | | import com.ruoyi.outsourcing.vo.OutsourcingPartnerTransactionsDetailsVo; |
| | | import com.ruoyi.outsourcing.vo.OutsourcingPartnerTransactionsVo; |
| | | import com.ruoyi.outsourcing.vo.OutsourcingPartnerVo; |
| | | import jakarta.servlet.http.HttpServletResponse; |
| | | import lombok.RequiredArgsConstructor; |
| | | import org.springframework.beans.BeanUtils; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | import org.springframework.util.CollectionUtils; |
| | | import org.springframework.web.multipart.MultipartFile; |
| | | |
| | | import java.time.LocalDate; |
| | | import java.util.List; |
| | | import java.util.stream.Collectors; |
| | | |
| | | /** |
| | | * å§å¤åä½åæ¡£æ¡ Service å®ç° |
| | | */ |
| | | @Service |
| | | @RequiredArgsConstructor |
| | | public class OutsourcingPartnerServiceImpl extends ServiceImpl<OutsourcingPartnerMapper, OutsourcingPartner> |
| | | implements IOutsourcingPartnerService { |
| | | |
| | | private final OutsourcingPartnerMapper partnerMapper; |
| | | private final OutsourcingOrderMapper outsourcingOrderMapper; |
| | | private final PaymentRecordMapper paymentRecordMapper; |
| | | private final FileUtil fileUtil; |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public Long savePartner(OutsourcingPartnerDto dto) { |
| | | if (dto.getPartnerName() == null || dto.getPartnerName().trim().isEmpty()) { |
| | | throw new ServiceException("请填ååä½ååç§°"); |
| | | } |
| | | checkPartnerNameDuplicate(dto.getPartnerName(), null); |
| | | |
| | | OutsourcingPartner partner = new OutsourcingPartner(); |
| | | BeanUtils.copyProperties(dto, partner); |
| | | partner.setId(null); |
| | | partner.setTenantId(null); |
| | | partner.setDeptId(null); |
| | | partner.setCreateUser(null); |
| | | partner.setCreateTime(null); |
| | | partner.setUpdateTime(null); |
| | | if (partner.getMaintainTime() == null) { |
| | | partner.setMaintainTime(LocalDate.now()); |
| | | } |
| | | if (partner.getMaintainUserId() == null) { |
| | | partner.setMaintainUserId(SecurityUtils.getUserId()); |
| | | } |
| | | partnerMapper.insert(partner); |
| | | |
| | | fileUtil.saveStorageAttachment(ApplicationTypeEnum.FILE, RecordTypeEnum.OUTSOURCING_PARTNER, |
| | | partner.getId(), dto.getStorageBlobDTOS()); |
| | | return partner.getId(); |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public boolean updatePartner(OutsourcingPartnerDto dto) { |
| | | if (dto.getId() == null) { |
| | | throw new ServiceException("åä½åidä¸è½ä¸ºç©º"); |
| | | } |
| | | if (partnerMapper.selectById(dto.getId()) == null) { |
| | | throw new ServiceException("åä½åä¸åå¨"); |
| | | } |
| | | checkPartnerNameDuplicate(dto.getPartnerName(), dto.getId()); |
| | | |
| | | OutsourcingPartner partner = new OutsourcingPartner(); |
| | | BeanUtils.copyProperties(dto, partner); |
| | | // ç§æ·ãå建信æ¯ç±ç³»ç»ç»´æ¤ï¼ç½®ç©ºå MyBatis-Plus ä¸ä¼æ´æ°è¿äºå |
| | | partner.setTenantId(null); |
| | | partner.setDeptId(null); |
| | | partner.setCreateUser(null); |
| | | partner.setCreateTime(null); |
| | | partner.setUpdateTime(null); |
| | | boolean updated = partnerMapper.updateById(partner) > 0; |
| | | |
| | | if (updated) { |
| | | fileUtil.saveStorageAttachment(ApplicationTypeEnum.FILE, RecordTypeEnum.OUTSOURCING_PARTNER, |
| | | dto.getId(), dto.getStorageBlobDTOS()); |
| | | } |
| | | return updated; |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public boolean delPartner(List<Long> ids) { |
| | | if (CollectionUtils.isEmpty(ids)) { |
| | | throw new ServiceException("è¯·éæ©è³å°ä¸æ¡æ°æ®"); |
| | | } |
| | | Long orderCount = outsourcingOrderMapper.selectCount(Wrappers.<OutsourcingOrder>lambdaQuery() |
| | | .in(OutsourcingOrder::getPartnerId, ids)); |
| | | if (orderCount != null && orderCount > 0) { |
| | | throw new ServiceException("åä½åå·²åå¨å§å¤è®¢åï¼ä¸å
许å é¤"); |
| | | } |
| | | Long paymentCount = paymentRecordMapper.selectCount(Wrappers.<PaymentRecord>lambdaQuery() |
| | | .eq(PaymentRecord::getPartyType, 3) |
| | | .in(PaymentRecord::getPartyId, ids)); |
| | | if (paymentCount != null && paymentCount > 0) { |
| | | throw new ServiceException("åä½åå·²åå¨å¾æ¥æ¶ä»æ¬¾è®°å½ï¼ä¸å
许å é¤"); |
| | | } |
| | | |
| | | fileUtil.deleteStorageAttachmentsByApplicationAndRecordTypeAndRecordIds( |
| | | ApplicationTypeEnum.FILE, RecordTypeEnum.OUTSOURCING_PARTNER, ids); |
| | | return this.removeByIds(ids); |
| | | } |
| | | |
| | | @Override |
| | | public OutsourcingPartnerVo partnerDetail(Long id) { |
| | | OutsourcingPartner partner = partnerMapper.selectById(id); |
| | | if (partner == null) { |
| | | throw new ServiceException("åä½åä¸åå¨"); |
| | | } |
| | | OutsourcingPartnerVo vo = new OutsourcingPartnerVo(); |
| | | BeanUtils.copyProperties(partner, vo); |
| | | vo.setStorageBlobVOS(fileUtil.getStorageBlobVOsByApplicationAndRecordTypeAndRecordId( |
| | | ApplicationTypeEnum.FILE, RecordTypeEnum.OUTSOURCING_PARTNER, id)); |
| | | return vo; |
| | | } |
| | | |
| | | @Override |
| | | public IPage<OutsourcingPartnerDto> partnerListPage(Page page, OutsourcingPartnerDto dto) { |
| | | return partnerMapper.partnerListPage(page, dto); |
| | | } |
| | | |
| | | @Override |
| | | public void partnerExport(HttpServletResponse response, OutsourcingPartnerDto dto) { |
| | | List<OutsourcingPartnerExcelDto> list = partnerMapper.partnerExportList(dto); |
| | | ExcelUtil<OutsourcingPartnerExcelDto> util = new ExcelUtil<>(OutsourcingPartnerExcelDto.class); |
| | | util.exportExcel(response, list, "åä½åæ¡£æ¡"); |
| | | } |
| | | |
| | | @Override |
| | | public Boolean importData(MultipartFile file) { |
| | | try { |
| | | ExcelUtil<OutsourcingPartnerExcelDto> util = new ExcelUtil<>(OutsourcingPartnerExcelDto.class); |
| | | List<OutsourcingPartnerExcelDto> list = util.importExcel(file.getInputStream()); |
| | | if (CollectionUtils.isEmpty(list)) { |
| | | return false; |
| | | } |
| | | List<OutsourcingPartner> partners = list.stream().map(excel -> { |
| | | OutsourcingPartner partner = new OutsourcingPartner(); |
| | | BeanUtils.copyProperties(excel, partner); |
| | | partner.setMaintainUserId(SecurityUtils.getUserId()); |
| | | partner.setMaintainTime(LocalDate.now()); |
| | | return partner; |
| | | }).collect(Collectors.toList()); |
| | | return this.saveOrUpdateBatch(partners); |
| | | } catch (Exception e) { |
| | | throw new ServiceException("åä½å导å
¥å¤±è´¥ï¼" + e.getMessage()); |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | public List<OutsourcingPartner> options() { |
| | | return partnerMapper.selectList(new LambdaQueryWrapper<OutsourcingPartner>() |
| | | .select(OutsourcingPartner::getId, OutsourcingPartner::getPartnerName) |
| | | .orderByDesc(OutsourcingPartner::getId)); |
| | | } |
| | | |
| | | @Override |
| | | public IPage<OutsourcingPartnerTransactionsVo> partnerTransactions(Page page, String partnerName) { |
| | | return partnerMapper.partnerTransactions(page, partnerName); |
| | | } |
| | | |
| | | @Override |
| | | public IPage<OutsourcingPartnerTransactionsDetailsVo> partnerTransactionsDetails(Page page, Long partnerId) { |
| | | return partnerMapper.partnerTransactionsDetails(page, partnerId); |
| | | } |
| | | |
| | | /** |
| | | * åä½ååç§°å¨ç§æ·å
å¯ä¸ |
| | | */ |
| | | private void checkPartnerNameDuplicate(String partnerName, Long excludeId) { |
| | | if (partnerName == null || partnerName.trim().isEmpty()) { |
| | | return; |
| | | } |
| | | Long tenantId = SecurityUtils.getLoginUser().getTenantId(); |
| | | LambdaQueryWrapper<OutsourcingPartner> wrapper = Wrappers.<OutsourcingPartner>lambdaQuery() |
| | | .eq(tenantId != null, OutsourcingPartner::getTenantId, tenantId) |
| | | .isNull(tenantId == null, OutsourcingPartner::getTenantId) |
| | | .eq(OutsourcingPartner::getPartnerName, partnerName) |
| | | .ne(excludeId != null, OutsourcingPartner::getId, excludeId); |
| | | if (partnerMapper.selectCount(wrapper) > 0) { |
| | | throw new ServiceException("åä½åå·²åå¨"); |
| | | } |
| | | } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.outsourcing.vo; |
| | | |
| | | import com.fasterxml.jackson.annotation.JsonFormat; |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDate; |
| | | |
| | | /** |
| | | * åä½å徿¥æç»ï¼æå§å¤è®¢åéè¡ï¼ |
| | | */ |
| | | @Data |
| | | @Schema(name = "OutsourcingPartnerTransactionsDetailsVo", description = "åä½å徿¥æç»") |
| | | public class OutsourcingPartnerTransactionsDetailsVo { |
| | | |
| | | @Schema(description = "å§å¤è®¢åid") |
| | | private Long outsourcingOrderId; |
| | | |
| | | @Schema(description = "å§å¤è®¢åå·") |
| | | private String orderNo; |
| | | |
| | | @Schema(description = "åä½åid") |
| | | private Long partnerId; |
| | | |
| | | @Schema(description = "åä½ååç§°") |
| | | private String partnerName; |
| | | |
| | | @Schema(description = "ç³è¯·æ¥æ") |
| | | @JsonFormat(pattern = "yyyy-MM-dd") |
| | | private LocalDate applyDate; |
| | | |
| | | @Schema(description = "订åéé¢ï¼å«ç¨æ»ä»·ï¼") |
| | | private BigDecimal contractAmount; |
| | | |
| | | @Schema(description = "订åç¶æ 0è稿 1已确认 2已宿 3å·²ä½åº") |
| | | private Integer status; |
| | | |
| | | @Schema(description = "已仿¬¾å计ï¼åä½å级å计ï¼é订å级ï¼") |
| | | private BigDecimal paidAmount; |
| | | |
| | | @Schema(description = "åºä»ä½é¢ = 订åéé¢ - 已仿¬¾") |
| | | private BigDecimal payableAmount; |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.outsourcing.vo; |
| | | |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | |
| | | /** |
| | | * åä½å徿¥åè¡¨ï¼æåä½åæ±æ»ï¼ |
| | | */ |
| | | @Data |
| | | @Schema(name = "OutsourcingPartnerTransactionsVo", description = "åä½å徿¥æ±æ»") |
| | | public class OutsourcingPartnerTransactionsVo { |
| | | |
| | | @Schema(description = "åä½åid") |
| | | private Long partnerId; |
| | | |
| | | @Schema(description = "åä½ååç§°") |
| | | private String partnerName; |
| | | |
| | | @Schema(description = "å§å¤éé¢å计ï¼å·²ç¡®è®¤+已宿ï¼") |
| | | private BigDecimal contractAmounts; |
| | | |
| | | @Schema(description = "已仿¬¾å计") |
| | | private BigDecimal paidAmount; |
| | | |
| | | @Schema(description = "忬¾å计") |
| | | private BigDecimal receiptAmount; |
| | | |
| | | @Schema(description = "åºä»ä½é¢ = å§å¤éé¢ - 已仿¬¾") |
| | | private BigDecimal payableAmount; |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.outsourcing.vo; |
| | | |
| | | import com.baomidou.mybatisplus.annotation.TableField; |
| | | import com.ruoyi.basic.dto.StorageBlobVO; |
| | | import com.ruoyi.outsourcing.pojo.OutsourcingPartner; |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * å§å¤åä½åæ¡£æ¡åºå |
| | | */ |
| | | @Data |
| | | public class OutsourcingPartnerVo extends OutsourcingPartner { |
| | | |
| | | @Schema(description = "ç»´æ¤äººååç§°") |
| | | private String maintainUserName; |
| | | |
| | | @TableField(exist = false) |
| | | @Schema(description = "éä»¶å表") |
| | | private List<StorageBlobVO> storageBlobVOS; |
| | | } |
| | |
| | | */ |
| | | private static final Integer LEDGER_TYPE_PURCHASE = 2; |
| | | |
| | | /** |
| | | * å¤ä»¶æµæ°´æ¥æºï¼éè´å
¥åºãè§ spare_parts_record.source_type |
| | | */ |
| | | private static final Integer SPARE_PARTS_SOURCE_PURCHASE = 1; |
| | | |
| | | private final PurchaseLedgerMapper purchaseLedgerMapper; |
| | | private final SalesLedgerMapper salesLedgerMapper; |
| | | private final SalesLedgerProductMapper salesLedgerProductMapper; |
| | |
| | | salesLedgerProduct.setRegisterDate(localDateTime); |
| | | salesLedgerProductMapper.insert(salesLedgerProduct); |
| | | } |
| | | // ä»
æ°å¢æç»ååå¤ä»¶ï¼ç¼è¾èµ° update 忝天ç¶ä¸éå¤è®¡æ° |
| | | if (LEDGER_TYPE_PURCHASE.equals(ledgerType)) { |
| | | recordSparePartsInbound(insertList, purchaseLedger); |
| | | } |
| | | } |
| | | // éè´æç»ååå¤ä»¶ï¼å
æå°è´¦åæ»ä¸ä¸æ¬¡çæµæ°´ï¼åæå½åæç»æ´ä½é建ã |
| | | // ç¼è¾æ¶æç»è¡å¯è½è¢«ç§»é¤ï¼åªè®¤æ°å¢è¡ä¼æ¼æç§»é¤çé£äºï¼æ´ä½é建天ç¶ä¸å½åæç»å¯¹é½ã |
| | | // 注æè¿æ®µå¿
é¡»å¨ insertList ä¹å¤ï¼å¦åãåªå æç»ã䏿°å¢ãçç¼è¾ä¸ä¼è§¦ååæ» |
| | | if (LEDGER_TYPE_PURCHASE.equals(ledgerType)) { |
| | | rollbackSparePartsInbound(salesLedgerId); |
| | | recordSparePartsInbound(products, purchaseLedger); |
| | | } |
| | | |
| | | // è®¡ç®æ»å«ç¨éé¢ |
| | |
| | | } |
| | | |
| | | /** |
| | | * éè´å°è´¦æ°å¢æç»æè§æ ¼å¹é
å¤ä»¶ï¼ç´¯å å¤ä»¶åºåå¹¶è®°ä¸æ¡å
¥åºæµæ°´ã |
| | | * æªç»´æ¤è§æ ¼çå¤ä»¶ä¸åä¸ï¼éé»è·³è¿ã |
| | | * æéè´å°è´¦åæ»å¤ä»¶ï¼æè¯¥å°è´¦äº§ççå
¥åºæµæ°´éå¤ä»¶åååºåï¼ç¶åå é¤è¿äºæµæ°´ã |
| | | * |
| | | * <p>å¤ä»¶å
ç±éè´å
¥è´¦ãåç»è¢«ç»´ä¿®/ä¿å
»é¢ç¨åºè´¦ï¼è¥å
¥è´¦éå·²ç»è¢«é¢ç¨æï¼ååä¼åºç°è´åºåï¼ |
| | | * æ¤æ¶ç´æ¥æ¦ä½ä¸è®©å ï¼é¿å
æå¤ä»¶è´¦åè±ãå é¤å°è´¦ä¸ç¼è¾é建é½èµ°è¿éï¼å£å¾ç»ä¸ã</p> |
| | | */ |
| | | private void recordSparePartsInbound(List<SalesLedgerProduct> insertList, PurchaseLedger purchaseLedger) { |
| | | List<Long> modelIds = insertList.stream() |
| | | private void rollbackSparePartsInbound(Long ledgerId) { |
| | | List<SparePartsRecord> records = sparePartsRecordService.list(new LambdaQueryWrapper<SparePartsRecord>() |
| | | .eq(SparePartsRecord::getSourceType, SPARE_PARTS_SOURCE_PURCHASE) |
| | | .eq(SparePartsRecord::getSourceId, ledgerId)); |
| | | if (CollectionUtils.isEmpty(records)) { |
| | | return; |
| | | } |
| | | Map<Long, BigDecimal> rollbackBySparePartsId = new HashMap<>(); |
| | | for (SparePartsRecord record : records) { |
| | | BigDecimal quantity = record.getQuantity() == null ? BigDecimal.ZERO : record.getQuantity(); |
| | | rollbackBySparePartsId.merge(record.getSparePartsId(), quantity, BigDecimal::add); |
| | | } |
| | | for (Map.Entry<Long, BigDecimal> entry : rollbackBySparePartsId.entrySet()) { |
| | | if (entry.getKey() == null) { |
| | | continue; |
| | | } |
| | | SpareParts spareParts = sparePartsMapper.selectById(entry.getKey()); |
| | | if (spareParts == null) { |
| | | continue; |
| | | } |
| | | BigDecimal current = spareParts.getQuantity() == null ? BigDecimal.ZERO : spareParts.getQuantity(); |
| | | if (current.compareTo(entry.getValue()) < 0) { |
| | | throw new BaseException("å¤ä»¶ã" + spareParts.getName() + "ãå½ååºå " + current |
| | | + "ï¼ä¸è¶³ä»¥åæ»æ¬æ¬¡éè´å
¥åºç " + entry.getValue() + "ï¼è¯·å
å¤çé¢ç¨è®°å½"); |
| | | } |
| | | spareParts.setQuantity(current.subtract(entry.getValue())); |
| | | sparePartsMapper.updateById(spareParts); |
| | | } |
| | | sparePartsRecordService.removeByIds(records.stream() |
| | | .map(SparePartsRecord::getId) |
| | | .filter(Objects::nonNull) |
| | | .collect(Collectors.toList())); |
| | | } |
| | | |
| | | /** |
| | | * éè´å°è´¦æç»æè§æ ¼å¹é
å¤ä»¶ï¼ç´¯å å¤ä»¶åºåå¹¶è®°ä¸æ¡å
¥åºæµæ°´ã |
| | | * æªç»´æ¤è§æ ¼çå¤ä»¶ä¸åä¸ï¼éé»è·³è¿ã |
| | | * |
| | | * <p>è°ç¨åå¿
é¡»å
{@link #rollbackSparePartsInbound(Long)}ï¼ä¸¤è
æå¯¹åºç°ï¼ |
| | | * åæ»æ§æµæ°´ + æå½åæç»éå»ºï¼æè½ä¿è¯ç¼è¾å°è´¦åå¤ä»¶æ°é䏿ç»ä¸è´ã</p> |
| | | */ |
| | | private void recordSparePartsInbound(List<SalesLedgerProduct> products, PurchaseLedger purchaseLedger) { |
| | | List<Long> modelIds = products.stream() |
| | | .map(SalesLedgerProduct::getProductModelId) |
| | | .filter(Objects::nonNull) |
| | | .distinct() |
| | |
| | | } |
| | | Map<Long, SpareParts> sparePartsByModelId = sparePartsList.stream() |
| | | .collect(Collectors.toMap(SpareParts::getProductModelId, s -> s, (a, b) -> a)); |
| | | for (SalesLedgerProduct product : insertList) { |
| | | for (SalesLedgerProduct product : products) { |
| | | SpareParts spareParts = sparePartsByModelId.get(product.getProductModelId()); |
| | | if (spareParts == null || product.getQuantity() == null |
| | | || product.getQuantity().compareTo(BigDecimal.ZERO) <= 0) { |
| | |
| | | if (purchaseLedger.getApprovalStatus().equals(3)) { |
| | | throw new BaseException(purchaseLedger.getPurchaseContractNumber()+"å·²ç»å®¡æ¹éè¿ï¼ä¸å
许å é¤"); |
| | | } |
| | | // å°è´¦å é¤è¦æè¯¥å°è´¦éè´å
¥åºæ¶ç´¯å å°å¤ä»¶ä¸çæ°éååå»ï¼å¹¶å æå¯¹åºæµæ°´ï¼ |
| | | // å¦åå¤ä»¶åºåèé«ãæµæ°´æ®çãå¤ä»¶å·²é¢ç¨å¯¼è´ååä¸ºè´æ¶ä¼å¨è¿éæ¦ä½ |
| | | rollbackSparePartsInbound(id); |
| | | } |
| | | // æ¹éå é¤å
³èçéè´å
¥åºè®°å½ |
| | | LambdaQueryWrapper<SalesLedgerProduct> salesLedgerProductQueryWrapper = new LambdaQueryWrapper<>(); |
| | |
| | | @Schema(description = "仿¬¾éé¢") |
| | | private BigDecimal paymentAmount; |
| | | |
| | | @Schema(description = "忬¾éé¢") |
| | | private BigDecimal receiptAmount; |
| | | @Schema(description = "仿¬¾éé¢ï¼å¾æ¥æµæ°´ï¼") |
| | | private BigDecimal paymentRecordAmount; |
| | | |
| | | @Schema(description = "åºä»éé¢") |
| | | private BigDecimal payableAmount; |
| | |
| | | //该ä¾åºåéè´ä»æ¬¾ç´¯è®¡éé¢ |
| | | private BigDecimal paymentAmount; |
| | | |
| | | @Schema(description = "忬¾éé¢") |
| | | //该ä¾åºå徿¥å款累计éé¢ï¼payment_record æå·¥æµæ°´ï¼ |
| | | private BigDecimal receiptAmount; |
| | | @Schema(description = "仿¬¾éé¢ï¼å¾æ¥æµæ°´ï¼") |
| | | //该ä¾åºå徿¥ä»æ¬¾ç´¯è®¡éé¢ï¼payment_record æå·¥æµæ°´ï¼party_type=2 direction=2ï¼ |
| | | private BigDecimal paymentRecordAmount; |
| | | |
| | | @Schema(description = "åºä»éé¢") |
| | | //该ä¾åºåéè´åºä»ç´¯è®¡éé¢=åå§éé¢-仿¬¾-鿬¾ |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.sales.dto; |
| | | |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | |
| | | /** |
| | | * 客æ·ä»£å¨é颿±æ»ï¼ç¨äºå®¢æ·æ¡£æ¡çä¿¡æåºéè卿éï¼ |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | @Data |
| | | public class CustomerDepositAmountDto { |
| | | |
| | | @Schema(description = "客æ·id") |
| | | private Long customerId; |
| | | |
| | | @Schema(description = "代å¨éé¢å计ï¼è¯¥å®¢æ·å
¨é¨ç±»å=代å¨çéå®å°è´¦ååéé¢ä¹åï¼") |
| | | private BigDecimal depositTotalAmount; |
| | | } |
| | |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDate; |
| | | import java.util.Date; |
| | | import java.util.List; |
| | |
| | | |
| | | private List<StorageBlobDTO> storageBlobDTOs; |
| | | private List<StorageBlobVO> StorageBlobVOs; |
| | | |
| | | /** |
| | | * éå®ç±»åï¼åæ²¹ / ä»£å¨ |
| | | * 注æï¼ä¸è¦å¤ç¨ä¸é¢ç typeï¼é£ä¸ªæ¯å表è¡ç SaleEnum(éå®/éè´/项ç®)ï¼è½ sales_ledger_product.type |
| | | */ |
| | | @Schema(description = "éå®ç±»åï¼åæ²¹/代å¨") |
| | | private String ledgerType; |
| | | |
| | | @Schema(description = "æ²¹åºidï¼ç±»å=代卿¶ä½¿ç¨ï¼") |
| | | private Long oilDepotId; |
| | | |
| | | @Schema(description = "æ²¹åºåç§°") |
| | | private String oilDepotName; |
| | | |
| | | @Schema(description = "å¨ç½idï¼ç±»å=代卿¶ä½¿ç¨ï¼") |
| | | private Long tankId; |
| | | |
| | | @Schema(description = "å¨ç½å·") |
| | | private String tankNo; |
| | | |
| | | @Schema(description = "审æ¹ç¶æï¼å¾
审æ¹/å®¡æ ¸ä¸/éè¿/æç»") |
| | | private String approvalStatus; |
| | | |
| | | /** |
| | | * ååéé¢ãåæ²¹çéé¢ç±äº§åæç»æ±æ»äº§çï¼ä»£å¨æ²¡ææç»ï¼ç±å端æå·¥å¡«å |
| | | */ |
| | | @Schema(description = "ååéé¢") |
| | | private BigDecimal contractAmount; |
| | | } |
| | |
| | | |
| | | private String templateName; |
| | | |
| | | /** |
| | | * è¡æ¥æºï¼shipping=åè´§åï¼oilOut=éå®ç±»æ²¹ååºåºã |
| | | * å端å¿
é¡»ææ¤åæ®µå¤å«ï¼oilOut è¡ç id ä¸ shipping_info.id åå伿å·ï¼ä¸å¯ç¨äºåè´§/å é¤/éè´§æ¥å£ |
| | | */ |
| | | private String source; |
| | | |
| | | /** |
| | | * æ²¹ååºåºè®°å½idï¼ä»
source=oilOut æå¼ï¼ |
| | | */ |
| | | private Long stockOutRecordId; |
| | | |
| | | /** |
| | | * åºåºä¾§å±ç¤ºå段ï¼ä»
source=oilOut æå¼ï¼ |
| | | */ |
| | | private String outCategory; |
| | | private String tankNo; |
| | | private String oilProduct; |
| | | private String oilDepotName; |
| | | private String driverName; |
| | | private String contactPerson; |
| | | private String contactPhone; |
| | | |
| | | /** |
| | | * æ²¹ååºåºçæ¹å·ï¼ä»
source=oilOut æå¼ï¼åèª stock_out_record.batch_noï¼ã |
| | | * 注æä¸ outboundBatches åºåï¼åè
æ¯ CK åºåºåå·ï¼æ¤åæ®µæ¯æ¹æ¬¡å· |
| | | */ |
| | | private String outBatchNo; |
| | | |
| | | /** |
| | | * æ¹å·æç»ï¼ä»
source=oilOut æå¼ï¼ï¼ä¸æ¡æ²¹ååºåºå¯¹åºä¸ä¸ªæ¹å·ï¼ |
| | | * ä¾åè´§å°è´¦è¯¦æ
å¼¹æ¡çãæ¹å·ãæç»è¡¨å±ç¤º |
| | | */ |
| | | private List<ShippingProductDetailDto> batchNoList; |
| | | |
| | | } |
| | |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import com.ruoyi.home.dto.IncomeExpenseAnalysisDto; |
| | | import com.ruoyi.purchase.vo.PurchaseReportVo; |
| | | import com.ruoyi.sales.dto.CustomerDepositAmountDto; |
| | | import com.ruoyi.sales.dto.SalesLedgerDto; |
| | | import com.ruoyi.sales.dto.SalesTrendDto; |
| | | import com.ruoyi.sales.dto.StatisticsTableDto; |
| | |
| | | |
| | | IPage<PurchaseReportVo> selectPurchaseReportVoPage(Page page, @Param("customerName") String customerName); |
| | | |
| | | /** |
| | | * æå®¢æ·æ¹éæ±æ»ä»£å¨éé¢ï¼è¯¥å®¢æ·å
¨é¨ãç±»å=代å¨ãçéå®å°è´¦ååéé¢ä¹åï¼ |
| | | * |
| | | * @param customerIds 客æ·idéå |
| | | * @return 客æ·id + 代å¨éé¢åè®¡ï¼æ 代å¨è®°å½ç客æ·ä¸ä¼åºç°å¨ç»æé |
| | | */ |
| | | List<CustomerDepositAmountDto> selectDepositAmountByCustomerIds(@Param("customerIds") List<Long> customerIds); |
| | | |
| | | } |
| | |
| | | @TableField(exist = false) |
| | | private Boolean hasProductionRecord; |
| | | |
| | | /** |
| | | * éå®ç±»åï¼åæ²¹ / 代å¨ï¼ååå¨ä½ç½®ï¼ |
| | | * 注æï¼ä¸è¦ä¸å表è¡ç SaleEnum(type) æ··ç¨ï¼é£æ¯éå®/éè´/é¡¹ç® |
| | | */ |
| | | @Schema(description = "éå®ç±»åï¼åæ²¹/代å¨") |
| | | @Excel(name = "éå®ç±»å") |
| | | private String ledgerType; |
| | | |
| | | @Schema(description = "æ²¹åºidï¼ç±»å=代卿¶ä½¿ç¨ï¼") |
| | | private Long oilDepotId; |
| | | |
| | | @Schema(description = "æ²¹åºåç§°") |
| | | @Excel(name = "æ²¹åº") |
| | | private String oilDepotName; |
| | | |
| | | @Schema(description = "å¨ç½idï¼ç±»å=代卿¶ä½¿ç¨ï¼") |
| | | private Long tankId; |
| | | |
| | | @Schema(description = "å¨ç½å·") |
| | | @Excel(name = "å¨ç½å·") |
| | | private String tankNo; |
| | | |
| | | @Schema(description = "审æ¹ç¶æï¼å¾
审æ¹/å®¡æ ¸ä¸/éè¿/æç»") |
| | | @Excel(name = "审æ¹ç¶æ") |
| | | private String approvalStatus; |
| | | |
| | | /** |
| | | * 客æ·ä¿¡æåºéï¼æ¥è¯¢æ¶ç±æå¡å±æ customerId åå¡«ï¼ä¸æ¯æ¬è¡¨åæ®µï¼ |
| | | */ |
| | | @Schema(description = "客æ·ä¿¡æåºé") |
| | | @TableField(exist = false) |
| | | @Excel(name = "客æ·ä¿¡æåºé") |
| | | private BigDecimal trustFund; |
| | | |
| | | /** |
| | | * æ¬ç¬ååé颿¯å¦è¶
åºå®¢æ·ä¿¡æåºéï¼è¶
åºåå端æ 红ï¼ä¸æ¯æ¬è¡¨åæ®µï¼ |
| | | */ |
| | | @Schema(description = "æ¬ç¬ååé颿¯å¦è¶
åºå®¢æ·ä¿¡æåºé") |
| | | @TableField(exist = false) |
| | | private Boolean exceedsTrustFund; |
| | | |
| | | } |
| | | |
| | |
| | | |
| | | @TableField(fill = FieldFill.INSERT) |
| | | private Long deptId; |
| | | |
| | | /** |
| | | * æ°æ®æé-é¨é¨éåï¼ç± DataScopeAop 注å
¥ï¼ä»
ä¾ listPage çæ¥è¯¢æ¡ä»¶ä½¿ç¨ |
| | | */ |
| | | @TableField(exist = false) |
| | | private Long[] deptIds; |
| | | } |
| | |
| | | import com.ruoyi.account.mapper.sales.AccountSalesCollectionMapper; |
| | | import com.ruoyi.account.pojo.sales.AccountInvoiceApplication; |
| | | import com.ruoyi.account.pojo.sales.AccountSalesCollection; |
| | | import com.ruoyi.approve.bean.dto.ApprovalInstanceDto; |
| | | import com.ruoyi.approve.mapper.ApprovalTemplateMapper; |
| | | import com.ruoyi.approve.pojo.ApprovalInstance; |
| | | import com.ruoyi.approve.pojo.ApprovalTemplate; |
| | | import com.ruoyi.approve.service.ApprovalInstanceService; |
| | | import com.ruoyi.basic.enums.ApplicationTypeEnum; |
| | | import com.ruoyi.basic.enums.RecordTypeEnum; |
| | | import com.ruoyi.basic.mapper.CustomerMapper; |
| | | import com.ruoyi.basic.mapper.ProductMapper; |
| | | import com.ruoyi.basic.mapper.ProductModelMapper; |
| | | import com.ruoyi.basic.mapper.OilDepotMapper; |
| | | import com.ruoyi.basic.mapper.TankInfoMapper; |
| | | import com.ruoyi.basic.pojo.Customer; |
| | | import com.ruoyi.basic.pojo.OilDepot; |
| | | import com.ruoyi.basic.pojo.TankInfo; |
| | | import com.ruoyi.basic.utils.FileUtil; |
| | | import com.ruoyi.common.enums.FileNameType; |
| | | import com.ruoyi.common.enums.SaleEnum; |
| | | import com.ruoyi.common.enums.SalesQuotationStatusEnum; |
| | | import com.ruoyi.common.enums.TypeEnums; |
| | | import com.ruoyi.common.exception.base.BaseException; |
| | | import com.ruoyi.common.utils.DateUtils; |
| | | import com.ruoyi.common.utils.EnumUtil; |
| | |
| | | private static final String LOCK_PREFIX = "contract_no_lock:"; |
| | | private static final long LOCK_WAIT_TIMEOUT = 10; // éçå¾
è¶
æ¶æ¶é´ï¼ç§ï¼ |
| | | private static final long LOCK_EXPIRE_TIME = 30; // éèªå¨è¿ææ¶é´ï¼ç§ï¼ |
| | | /** éå®ç±»åï¼åæ²¹ï¼èµ°äº§åæç»ï¼ */ |
| | | private static final String LEDGER_TYPE_OIL = "åæ²¹"; |
| | | /** éå®ç±»åï¼ä»£å¨ï¼ååå¨ä½ç½®ï¼èµ°æ²¹åº+å¨ç½+æå·¥ååéé¢ï¼ */ |
| | | private static final String LEDGER_TYPE_DEPOSIT = "代å¨"; |
| | | private final SalesLedgerMapper salesLedgerMapper; |
| | | private final CustomerMapper customerMapper; |
| | | private final SalesLedgerProductMapper salesLedgerProductMapper; |
| | |
| | | private final FileUtil fileUtil; |
| | | private final AccountInvoiceApplicationMapper accountInvoiceApplicationMapper; |
| | | private final AccountSalesCollectionMapper accountSalesCollectionMapper; |
| | | private final ApprovalTemplateMapper approvalTemplateMapper; |
| | | private final ApprovalInstanceService approvalInstanceService; |
| | | private final OilDepotMapper oilDepotMapper; |
| | | private final TankInfoMapper tankInfoMapper; |
| | | |
| | | @Autowired |
| | | private SysDeptMapper sysDeptMapper; |
| | |
| | | |
| | | @Override |
| | | public List<SalesLedger> selectSalesLedgerList(SalesLedgerDto salesLedgerDto) { |
| | | return salesLedgerMapper.selectSalesLedgerList(salesLedgerDto); |
| | | List<SalesLedger> list = salesLedgerMapper.selectSalesLedgerList(salesLedgerDto); |
| | | fillTrustFund(list); |
| | | return list; |
| | | } |
| | | |
| | | public List<SalesLedgerProduct> getSalesLedgerProductListByRelateId(Long relateId, SaleEnum type) { |
| | |
| | | |
| | | @Override |
| | | public IPage<SalesLedgerVo> selectSalesLedgerListPage(Page page, SalesLedgerDto salesLedgerDto) { |
| | | return salesLedgerMapper.selectSalesLedgerListPage(page, salesLedgerDto); |
| | | IPage<SalesLedgerVo> result = salesLedgerMapper.selectSalesLedgerListPage(page, salesLedgerDto); |
| | | fillTrustFund(result.getRecords()); |
| | | return result; |
| | | } |
| | | |
| | | /** |
| | | * å填客æ·çä¿¡æåºéï¼å¹¶å¤ææ¬ç¬ååé颿¯å¦å·²è¶
åºã |
| | | * è¶
åºä¸å¦ç±å端ç®å¥½è¿åï¼å端åªè´è´£æ 红 |
| | | */ |
| | | private void fillTrustFund(List<? extends SalesLedger> records) { |
| | | if (CollectionUtils.isEmpty(records)) { |
| | | return; |
| | | } |
| | | List<Long> customerIds = records.stream() |
| | | .map(SalesLedger::getCustomerId) |
| | | .filter(Objects::nonNull) |
| | | .distinct() |
| | | .collect(Collectors.toList()); |
| | | if (customerIds.isEmpty()) { |
| | | return; |
| | | } |
| | | Map<Long, BigDecimal> trustFundMap = customerMapper.selectBatchIds(customerIds).stream() |
| | | .filter(item -> item.getTrustFund() != null) |
| | | .collect(Collectors.toMap(Customer::getId, Customer::getTrustFund, (existing, replacement) -> existing)); |
| | | |
| | | records.forEach(ledger -> { |
| | | BigDecimal trustFund = trustFundMap.get(ledger.getCustomerId()); |
| | | ledger.setTrustFund(trustFund); |
| | | ledger.setExceedsTrustFund(trustFund != null && ledger.getContractAmount() != null |
| | | && ledger.getContractAmount().compareTo(trustFund) > 0); |
| | | }); |
| | | } |
| | | |
| | | @Override |
| | |
| | | // å é¤é件表 |
| | | commonFileService.deleteByBusinessIds(idList, FileNameType.SALE.getValue()); |
| | | |
| | | // å é¤å°è´¦å¯¹åºç审æ¹å®ä¾ï¼åä¸å°è´¦å¯è½åå¤æäº¤/é审ï¼ä¼æå¤æ¡ï¼ |
| | | List<ApprovalInstance> approvalInstances = approvalInstanceService.list( |
| | | new LambdaQueryWrapper<ApprovalInstance>() |
| | | .in(ApprovalInstance::getBusinessId, idList) |
| | | .eq(ApprovalInstance::getBusinessType, TypeEnums.SALES_LEDGER_APPROVAL.getCode()) |
| | | .eq(ApprovalInstance::getDeleted, 0)); |
| | | if (CollectionUtils.isNotEmpty(approvalInstances)) { |
| | | approvalInstanceService.delete(approvalInstances.stream() |
| | | .map(ApprovalInstance::getId) |
| | | .filter(Objects::nonNull) |
| | | .collect(Collectors.toList())); |
| | | } |
| | | |
| | | // å é¤çäº§ç®¡æ§æ°æ® |
| | | //æ¥è¯¢ç产æ¥å·¥id |
| | | ArrayList<Long> mainIdList = productionProductMainService.listMain(idList); |
| | |
| | | SalesLedger salesLedger = convertToEntity(salesLedgerDto); |
| | | salesLedger.setCustomerName(customer.getCustomerName()); |
| | | salesLedger.setTenantId(customer.getTenantId()); |
| | | applyLedgerType(salesLedger, salesLedgerDto); |
| | | // å½å
¥äººï¼å¦ææªä¼ å使ç¨å½åç»å½ç¨æ· |
| | | if (StringUtils.isEmpty(salesLedger.getEntryPerson())) { |
| | | salesLedger.setEntryPerson(String.valueOf(SecurityUtils.getUserId())); |
| | | } |
| | | // æ°å¢åä¿®æ¹é½è¦éæ°èµ°å®¡æ¹ |
| | | salesLedger.setApprovalStatus(SalesQuotationStatusEnum.PENDING.getCode()); |
| | | // 3. æ°å¢ææ´æ°ä¸»è¡¨ |
| | | if (salesLedger.getId() == null) { |
| | | String contractNo = salesLedger.getSalesContractNo(); |
| | |
| | | salesLedger.setSalesContractNo(contractNo); |
| | | salesLedgerMapper.insert(salesLedger); |
| | | } else { |
| | | // æ¹åä¼éæ°èµ°ä¸é审æ¹ï¼å
ä½åºæ¤åæªç»æç审æ¹å®ä¾ï¼äºå¡æäº¤åè¿ä¼éæ°åèµ· |
| | | approvalInstanceService.lambdaUpdate() |
| | | .set(ApprovalInstance::getStatus, "REJECTED") |
| | | .eq(ApprovalInstance::getBusinessId, salesLedger.getId()) |
| | | .eq(ApprovalInstance::getBusinessType, TypeEnums.SALES_LEDGER_APPROVAL.getCode()) |
| | | .update(); |
| | | salesLedgerMapper.updateById(salesLedger); |
| | | } |
| | | |
| | | |
| | | // 4. å¤çåè¡¨æ°æ® |
| | | List<SalesLedgerProduct> productList = salesLedgerDto.getProductData(); |
| | | // 4. å¤çåè¡¨æ°æ®ã代卿²¡æäº§åæç»ï¼ååéé¢ä»¥æå·¥å¡«åç为åï¼ä¸è½è¢«åè¡¨æ±æ»è¦ç |
| | | List<SalesLedgerProduct> productList = LEDGER_TYPE_OIL.equals(salesLedger.getLedgerType()) |
| | | ? salesLedgerDto.getProductData() : null; |
| | | if (productList != null && !productList.isEmpty()) { |
| | | handleSalesLedgerProducts(salesLedger.getId(), productList, EnumUtil.fromCode(SaleEnum.class, salesLedgerDto.getType())); |
| | | updateMainContractAmount( |
| | |
| | | // 6. ä¿åéå®å°è´¦éä»¶ |
| | | fileUtil.saveStorageAttachment(ApplicationTypeEnum.FILE, RecordTypeEnum.SALES_LEDGER, salesLedger.getId(), salesLedgerDto.getStorageBlobDTOs()); |
| | | |
| | | // 7. å起审æ¹ãååéé¢è¦åè½åºåçå¼ï¼åæ²¹çéé¢ç±ç¬¬ 4 æ¥ç产åæç»æ±æ»ååï¼ |
| | | SalesLedger savedLedger = salesLedgerMapper.selectById(salesLedger.getId()); |
| | | startSalesLedgerApproval(savedLedger, customer.getTrustFund()); |
| | | |
| | | return 1; |
| | | } |
| | | |
| | | /** |
| | | * æ ¡éªéå®ç±»åå¹¶è¡¥é½ä»£å¨çæ²¹åº/å¨ç½ä¿¡æ¯ã |
| | | * åæ²¹ï¼ååéé¢åªè½ç±äº§åæç»æ±æ»äº§çï¼ä»£å¨ï¼æ²¡ææç»ï¼å¿
须鿲¹åºãå¨ç½å¹¶æå·¥å¡«ååéé¢ |
| | | */ |
| | | private void applyLedgerType(SalesLedger salesLedger, SalesLedgerDto salesLedgerDto) { |
| | | String ledgerType = salesLedgerDto.getLedgerType(); |
| | | if (StringUtils.isEmpty(ledgerType)) { |
| | | throw new BaseException("éå®ç±»åä¸è½ä¸ºç©º"); |
| | | } |
| | | if (LEDGER_TYPE_OIL.equals(ledgerType)) { |
| | | salesLedger.setOilDepotId(null); |
| | | salesLedger.setOilDepotName(null); |
| | | salesLedger.setTankId(null); |
| | | salesLedger.setTankNo(null); |
| | | // updateById ä¼è·³è¿ nullï¼å¯¹ä¿®æ¹æ¯ç©ºæä½ï¼æ°å¢æ¶ä¸æ¹é åä¸è´ï¼æ¬å°±ä¸º nullï¼ |
| | | salesLedger.setContractAmount(null); |
| | | return; |
| | | } |
| | | if (!LEDGER_TYPE_DEPOSIT.equals(ledgerType)) { |
| | | throw new BaseException("éå®ç±»åä¸åæ³:" + ledgerType); |
| | | } |
| | | if (salesLedgerDto.getOilDepotId() == null) { |
| | | throw new BaseException("代å¨å¿
é¡»éæ©æ²¹åº"); |
| | | } |
| | | if (salesLedgerDto.getTankId() == null) { |
| | | throw new BaseException("代å¨å¿
须鿩å¨ç½"); |
| | | } |
| | | if (salesLedgerDto.getContractAmount() == null |
| | | || salesLedgerDto.getContractAmount().compareTo(BigDecimal.ZERO) <= 0) { |
| | | throw new BaseException("代å¨å¿
须填åååéé¢"); |
| | | } |
| | | OilDepot oilDepot = oilDepotMapper.selectById(salesLedgerDto.getOilDepotId()); |
| | | if (oilDepot == null) { |
| | | throw new BaseException("æ²¹åºä¸åå¨:" + salesLedgerDto.getOilDepotId()); |
| | | } |
| | | TankInfo tankInfo = tankInfoMapper.selectById(salesLedgerDto.getTankId()); |
| | | if (tankInfo == null) { |
| | | throw new BaseException("å¨ç½ä¸åå¨:" + salesLedgerDto.getTankId()); |
| | | } |
| | | // å称以åºç¡æ°æ®ä¸ºåï¼ä¸éä¿¡åç«¯ä¼ å¼ |
| | | salesLedger.setOilDepotName(oilDepot.getDepotName()); |
| | | salesLedger.setTankNo(tankInfo.getTankNo()); |
| | | } |
| | | |
| | | /** |
| | | * åèµ·éå®å°è´¦å®¡æ¹ï¼èµ°ç³»ç»å·²æç OA å®¡æ¹æµç¨ã |
| | | * ååéé¢è¶
åºå®¢æ·ä¿¡æåºéæ¶ï¼å®¡æ¹æ é¢å¸¦ä¸æéåç¼ |
| | | */ |
| | | private void startSalesLedgerApproval(SalesLedger ledger, BigDecimal trustFund) { |
| | | if (ledger == null) { |
| | | return; |
| | | } |
| | | ApprovalTemplate approvalTemplate = approvalTemplateMapper.selectOne( |
| | | new LambdaQueryWrapper<ApprovalTemplate>() |
| | | .eq(ApprovalTemplate::getBusinessType, TypeEnums.SALES_LEDGER_APPROVAL.getCode()) |
| | | .eq(ApprovalTemplate::getDeleted, 0) |
| | | .orderByDesc(ApprovalTemplate::getId) |
| | | .last("LIMIT 1") |
| | | ); |
| | | if (approvalTemplate == null) { |
| | | throw new RuntimeException("请å
é
ç½®éå®å°è´¦å®¡æ¹æ¨¡æ¿"); |
| | | } |
| | | boolean exceedsTrustFund = trustFund != null && ledger.getContractAmount() != null |
| | | && ledger.getContractAmount().compareTo(trustFund) > 0; |
| | | String title = ledger.getSalesContractNo() + "审æ¹"; |
| | | if (exceedsTrustFund) { |
| | | title += "ï¼ååéé¢è¶
åºå®¢æ·ä¿¡æåºéï¼è¯·éç¹å®¡æ ¸ï¼"; |
| | | } |
| | | LoginUser loginUser = SecurityUtils.getLoginUser(); |
| | | ApprovalInstanceDto approvalInstance = new ApprovalInstanceDto(); |
| | | approvalInstance.setTemplateId(approvalTemplate.getId()); |
| | | approvalInstance.setTemplateName(approvalTemplate.getTemplateName()); |
| | | approvalInstance.setBusinessId(ledger.getId()); |
| | | approvalInstance.setBusinessType(TypeEnums.SALES_LEDGER_APPROVAL.getCode()); |
| | | approvalInstance.setCurrentLevel(1); |
| | | approvalInstance.setTitle(title); |
| | | approvalInstance.setApplicantId(loginUser.getUserId()); |
| | | approvalInstance.setApplicantName(loginUser.getNickName()); |
| | | approvalInstance.setApplyTime(LocalDateTime.now()); |
| | | try { |
| | | approvalInstanceService.add(approvalInstance); |
| | | } catch (Exception e) { |
| | | log.error("SalesLedgerServiceImpl approve error for salesContractNo: {}", ledger.getSalesContractNo(), e); |
| | | throw new RuntimeException("审æ¹å¤±è´¥: " + e.getMessage(), e); |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | public void handleSalesLedgerProducts(Long salesLedgerId, List<SalesLedgerProduct> products, SaleEnum type) { |
| | | // æIDåç»ï¼åºåæ°å¢åæ´æ°çè®°å½ |
| | |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | |
| | | import java.time.LocalDateTime; |
| | | import java.util.Collections; |
| | | import java.util.Date; |
| | | import java.util.List; |
| | | |
| | |
| | | @RequiredArgsConstructor |
| | | public class ShippingInfoServiceImpl extends ServiceImpl<ShippingInfoMapper, ShippingInfo> implements ShippingInfoService { |
| | | |
| | | /** |
| | | * listPage çè¡æ¥æºæ è®°ï¼shipping=åè´§åï¼oilOut=éå®ç±»æ²¹ååºåº |
| | | */ |
| | | private static final String SOURCE_OIL_OUT = "oilOut"; |
| | | |
| | | private final ShippingInfoMapper shippingInfoMapper; |
| | | |
| | |
| | | IPage<ShippingInfoDto> listPage = shippingInfoMapper.listPage(page, req); |
| | | listPage.getRecords().forEach(item -> { |
| | | item.setStorageBlobVOs(fileUtil.getStorageBlobVOsByApplicationAndRecordTypeAndRecordId(ApplicationTypeEnum.IMAGE, RecordTypeEnum.SHIPPING_INFO, item.getId())); |
| | | // æ²¹ååºåºè¡æ²¡æ shipping_product_detailï¼æ¹å·æç»åªè½ç±åºåºè®°å½èªèº«å段æé |
| | | if (SOURCE_OIL_OUT.equals(item.getSource())) { |
| | | item.setBatchNoList(buildOilOutBatchNoList(item)); |
| | | } |
| | | }); |
| | | return listPage; |
| | | } |
| | | |
| | | /** |
| | | * æ²¹ååºåºè¡çæ¹å·æç»ï¼ä¾åè´§å°è´¦è¯¦æ
å¼¹æ¡çãæ¹å·ãæç»è¡¨å±ç¤º |
| | | */ |
| | | private List<ShippingProductDetailDto> buildOilOutBatchNoList(ShippingInfoDto item) { |
| | | ShippingProductDetailDto detail = new ShippingProductDetailDto(); |
| | | detail.setBatchNo(item.getOutBatchNo()); |
| | | detail.setProductName(item.getProductName()); |
| | | detail.setSpecificationModel(item.getSpecificationModel()); |
| | | detail.setDeliveryQuantity(item.getTotalQuantity()); |
| | | return Collections.singletonList(detail); |
| | | } |
| | | |
| | | @Override |
| | | public boolean deductStock(ShippingInfoDto req) { |
| | | ShippingInfo byId = this.getById(req.getId()); |
| | |
| | | @Schema(description = "æ¶æ¬¾éé¢") |
| | | private BigDecimal receiptPaymentAmount; |
| | | |
| | | @Schema(description = "仿¬¾éé¢") |
| | | private BigDecimal paymentAmount; |
| | | @Schema(description = "忬¾éé¢ï¼å¾æ¥æµæ°´ï¼") |
| | | private BigDecimal receiptRecordAmount; |
| | | |
| | | @Schema(description = "åºæ¶éé¢") |
| | | private BigDecimal receiptableAmount; |
| | |
| | | //该客æ·é宿¶æ¬¾ç´¯è®¡éé¢ |
| | | private BigDecimal receiptPaymentAmount; |
| | | |
| | | @Schema(description = "仿¬¾éé¢") |
| | | //该客æ·å¾æ¥ä»æ¬¾ç´¯è®¡éé¢ï¼payment_record æå·¥æµæ°´ï¼ |
| | | private BigDecimal paymentAmount; |
| | | @Schema(description = "忬¾éé¢ï¼å¾æ¥æµæ°´ï¼") |
| | | //该客æ·å¾æ¥å款累计éé¢ï¼payment_record æå·¥æµæ°´ï¼party_type=1 direction=1ï¼ |
| | | private BigDecimal receiptRecordAmount; |
| | | |
| | | @Schema(description = "åºæ¶éé¢") |
| | | //该客æ·éå®åºæ¶ç´¯è®¡éé¢=åå§éé¢-忬¾-鿬¾ |
| | |
| | | return R.ok(stockInventoryDtoIPage); |
| | | } |
| | | |
| | | @GetMapping("/pageScrapStock") |
| | | @Operation(summary = "æ¥åºåéæå页ï¼åªè¯»ï¼å¸¦æ¹å·ï¼") |
| | | public R pageScrapStock(Page page, StockInventoryDto stockInventoryDto) { |
| | | IPage<StockInventoryDto> result = stockInventoryService.pageScrapStock(page, stockInventoryDto); |
| | | return R.ok(result); |
| | | } |
| | | |
| | | @GetMapping("/pageListCombinedStockInventory") |
| | | @Operation(summary = "å页æ¥è¯¢èååºåå表") |
| | | public R pageListCombinedStockInventory(Page page, StockInventoryDto stockInventoryDto) { |
| | |
| | | return AjaxResult.success(); |
| | | } |
| | | |
| | | @GetMapping("/oilOutAvailableQty") |
| | | @Operation(summary = "æ²¹ååºåºå¯ç¨éï¼ä¸æ¬¡å©ä½æ²¹é+å½ååºåï¼") |
| | | public AjaxResult oilOutAvailableQty(StockOutRecordDto stockOutRecordDto) { |
| | | return AjaxResult.success(stockOutRecordService.getOilOutAvailableQty(stockOutRecordDto)); |
| | | } |
| | | |
| | | @PutMapping("/{id}/residualOil") |
| | | @Log(title = "åºåºç®¡ç-å½å
¥å©ä½æ²¹é", businessType = BusinessType.UPDATE) |
| | | @Operation(summary = "å½å
¥æ¬æ¬¡éå®è´§åçå©ä½æ²¹éï¼åªæ´æ°è¯¥å段ï¼") |
| | | public AjaxResult updateResidualOil(@PathVariable("id") Long id, @RequestBody StockOutRecordDto stockOutRecordDto) { |
| | | return AjaxResult.success(stockOutRecordService.updateResidualOil(id, stockOutRecordDto.getResidualOil())); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.stock.dto; |
| | | |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | |
| | | /** |
| | | * æ²¹ååºåºå¯ç¨éï¼ä¸æ¬¡åè´§ = 䏿¬¡å©ä½æ²¹é + åºåé |
| | | * |
| | | * @author è¯å¯¼è½¯ä»¶ï¼æ±èï¼æéå
¬å¸ |
| | | * @since 2026-09-20 |
| | | */ |
| | | @Data |
| | | public class OilOutAvailableDto { |
| | | |
| | | @Schema(description = "è¯¥è½¦è¯¥è§æ ¼ä¸æ¬¡éå®è´§åå©ä½æ²¹é(å¨)") |
| | | private BigDecimal lastResidualOil; |
| | | |
| | | @Schema(description = "å½ååºåé(å¨)") |
| | | private BigDecimal stockQuantity; |
| | | |
| | | @Schema(description = "å¯ç¨é(å¨) = 䏿¬¡å©ä½æ²¹é + å½ååºåé") |
| | | private BigDecimal availableQty; |
| | | } |
| | |
| | | |
| | | IPage<StockInventoryDto> pagestockInventory(Page page, @Param("ew") StockInventoryDto stockInventoryDto); |
| | | |
| | | /** |
| | | * æ¥åºåéæå页ï¼åªè¯»ï¼å¸¦æ¹å·ï¼ä¸ pagestockInventory ç¸äºç¬ç«ï¼ |
| | | */ |
| | | IPage<StockInventoryDto> selectScrapStockPage(Page page, @Param("ew") StockInventoryDto stockInventoryDto); |
| | | |
| | | IPage<StockInventoryDto> pageListCombinedStockInventory(Page page, @Param("ew") StockInventoryDto stockInventoryDto); |
| | | |
| | | int updateAddStockInventory(@Param("ew") StockInventoryDto stockInventoryDto); |
| | |
| | | List<StockOutRecordExportData> listStockOutRecordExportData(@Param("params") StockOutRecordDto stockOutRecordDto); |
| | | |
| | | IPage<SalesOutboundVo> listPageAccountSales(Page page, @Param("req") SalesOutboundDto salesOutboundDto); |
| | | |
| | | /** |
| | | * ææ¥æºæç»idæ¹éæ¥è¯¢åºåºè®°å½ã |
| | | * |
| | | * <p>stock_out_record ä¸å¨ {@code IgnoreTableConfig.IGNORE_TABLES} ç½ååéï¼æ®éæ¥è¯¢ä¼è¢« |
| | | * DataScopeSqlInterceptor 追å create_user/dept_id æ¡ä»¶ãå§å¤è®¢åè¦é è¿æ¹è®°å½åã宿åçåºåºå®¡æ¹æ ¡éªã |
| | | * åãä½åºæ¶çå ç¨éæ¾ãï¼æ¢ä¸ªè´¦å·æ¥ä¸å°å°±ä¼é黿¼æ ¡éªãå ç¨éæ¾ä¸æï¼æä»¥è¿éæ¾å¼è·³è¿æ°æ®æéã</p> |
| | | */ |
| | | List<StockOutRecord> selectByRecordIds(@Param("recordIds") List<Long> recordIds, |
| | | @Param("recordType") String recordType); |
| | | } |
| | |
| | | @Schema(description = "车æçå·") |
| | | private String trailerPlateNo; |
| | | |
| | | @Schema(description = "车è¾idï¼è½¦è¾ä¸»æ°æ®ï¼") |
| | | private Long vehicleId; |
| | | |
| | | @Schema(description = "æ¬æ¬¡éå®è´§åå©ä½æ²¹é(å¨)") |
| | | private BigDecimal residualOil; |
| | | |
| | | @Schema(description = "审æ¹éè¿æ¶å®é
ä»åºåæ£åçæ°éï¼åºåºæ°é-䏿¬¡å©ä½æ²¹éï¼") |
| | | private BigDecimal deductQuantity; |
| | | |
| | | @Schema(description = "产åè§æ ¼id") |
| | | private Long productModelId; |
| | | |
| | |
| | | |
| | | IPage<StockInventoryDto> pagestockInventory(Page page, StockInventoryDto stockInventoryDto); |
| | | |
| | | /** |
| | | * æ¥åºåéæå页ï¼åªè¯»ï¼å¸¦æ¹å·ï¼ |
| | | */ |
| | | IPage<StockInventoryDto> pageScrapStock(Page page, StockInventoryDto stockInventoryDto); |
| | | |
| | | IPage<StockInventoryDto> pageListCombinedStockInventory(Page page, StockInventoryDto stockInventoryDto); |
| | | |
| | | Boolean addstockInventory(StockInventoryDto stockInventoryDto); |
| | |
| | | import com.baomidou.mybatisplus.core.metadata.IPage; |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import com.baomidou.mybatisplus.extension.service.IService; |
| | | import com.ruoyi.stock.dto.OilOutAvailableDto; |
| | | import com.ruoyi.stock.dto.StockOutRecordDto; |
| | | import com.ruoyi.stock.pojo.StockOutRecord; |
| | | |
| | | import jakarta.servlet.http.HttpServletResponse; |
| | | import java.math.BigDecimal; |
| | | import java.util.List; |
| | | |
| | | /** |
| | |
| | | int batchApprove(List<Long> ids, Integer approvalStatus); |
| | | |
| | | int batchReAudit(List<Long> ids); |
| | | |
| | | /** |
| | | * å½å
¥ãæ¬æ¬¡éå®è´§åå©ä½æ²¹éãã |
| | | * åªæ´æ° residual_oilï¼ä¸å¨å
¶ä»åï¼èµ° {@link #update} 伿æªä¼ çåæ®µå
¨é¨ç½®ç©ºï¼æ
åç¬å¼ä¸ä¸ªæ¥å£ |
| | | * |
| | | * @param id åºåºè®°å½id |
| | | * @param residualOil å©ä½æ²¹é(å¨)ï¼ä¸è½ä¸ºç©ºãä¸è½å°äº0ãä¸è½å¤§äºåºåºæ°é |
| | | */ |
| | | int updateResidualOil(Long id, BigDecimal residualOil); |
| | | |
| | | /** |
| | | * æ²¹ååºåºå¯ç¨éï¼ä¸æ¬¡åè´§ = 䏿¬¡å©ä½æ²¹é + å½ååºåé |
| | | * |
| | | * @param query é带 vehicleIdãproductModelIdï¼batchNo å¯é |
| | | * @return 䏿¬¡å©ä½æ²¹é / å½ååºå / å¯ç¨é |
| | | */ |
| | | OilOutAvailableDto getOilOutAvailableQty(StockOutRecordDto query); |
| | | |
| | | /** |
| | | * ææ¥æºæç»idæ¹éæ¥è¯¢åºåºè®°å½ï¼ä¸åæ°æ®æé约æã |
| | | * ä¾ä¸å¡åæ®åãåºåºæ¯å¦å·²å®¡æ¹ãè¿ç±»èªèº«ç¶ææºæ ¡éªï¼æ¢è´¦å·æ§è¡ä¹å¿
é¡»çå°å䏿¹è®°å½ |
| | | * |
| | | * @param recordIds æ¥æºæç»idï¼ä¸ºç©ºè¿å空éå |
| | | * @param recordType åºåºç±»åï¼è§ StockInQualifiedRecordTypeEnum |
| | | */ |
| | | List<StockOutRecord> listByRecordIds(List<Long> recordIds, String recordType); |
| | | |
| | | /** |
| | | * éæ¾æ¥æºæç»å
³èçåºåºè®°å½ï¼å®¡æ¹éè¿è¿çææ¹æ¬¡å½è¿åºåéï¼ç¶åå é¤è®°å½ã |
| | | * å¾
审æ¹/驳åçè®°å½æ²¡æ£è¿åºåï¼å æå³éæ¾å ç¨ |
| | | * |
| | | * @return å é¤çè®°å½æ° |
| | | */ |
| | | int releaseByRecordIds(List<Long> recordIds, String recordType); |
| | | } |
| | |
| | | } |
| | | |
| | | @Override |
| | | public IPage<StockInventoryDto> pageScrapStock(Page page, StockInventoryDto stockInventoryDto) { |
| | | return stockInventoryMapper.selectScrapStockPage(page, stockInventoryDto); |
| | | } |
| | | |
| | | @Override |
| | | public IPage<StockInventoryDto> pageListCombinedStockInventory(Page page, StockInventoryDto stockInventoryDto) { |
| | | return stockInventoryMapper.pageListCombinedStockInventory(page, stockInventoryDto); |
| | | } |
| | |
| | | |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import com.baomidou.mybatisplus.core.metadata.IPage; |
| | | import com.baomidou.mybatisplus.core.toolkit.Wrappers; |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
| | | import com.ruoyi.account.mapper.sales.AccountInvoiceApplicationMapper; |
| | | import com.ruoyi.account.mapper.sales.AccountSalesCollectionMapper; |
| | | import com.ruoyi.basic.pojo.Vehicle; |
| | | import com.ruoyi.basic.service.IVehicleService; |
| | | import com.ruoyi.common.enums.ReviewStatusEnum; |
| | | import com.ruoyi.common.enums.StockInQualifiedRecordTypeEnum; |
| | | import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum; |
| | |
| | | import com.ruoyi.common.utils.StringUtils; |
| | | import com.ruoyi.common.utils.bean.BeanUtils; |
| | | import com.ruoyi.common.utils.poi.ExcelUtil; |
| | | import com.ruoyi.outsourcing.enums.OutsourcingOrderStatusEnum; |
| | | import com.ruoyi.outsourcing.mapper.OutsourcingOrderMapper; |
| | | import com.ruoyi.outsourcing.mapper.OutsourcingOrderProductMapper; |
| | | import com.ruoyi.outsourcing.pojo.OutsourcingOrder; |
| | | import com.ruoyi.outsourcing.pojo.OutsourcingOrderProduct; |
| | | |
| | | import java.time.LocalDateTime; |
| | | import com.ruoyi.stock.dto.OilOutAvailableDto; |
| | | import com.ruoyi.stock.dto.StockInventoryDto; |
| | | import com.ruoyi.stock.dto.StockOutRecordDto; |
| | | import com.ruoyi.stock.dto.StockUninventoryDto; |
| | |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | import org.springframework.util.CollectionUtils; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.util.Collections; |
| | | import java.util.List; |
| | | import java.util.Objects; |
| | | |
| | | /** |
| | | * <p> |
| | |
| | | @Service |
| | | @RequiredArgsConstructor |
| | | public class StockOutRecordServiceImpl extends ServiceImpl<StockOutRecordMapper, StockOutRecord> implements StockOutRecordService { |
| | | /** |
| | | * åºåºç±»å«ï¼éå®ãéå®ç±»æ²¹ååºåºå¨å®¡æ¹éè¿æ¶ææ¹æ¬¡æ£ååºå |
| | | */ |
| | | private static final String OUT_CATEGORY_SALE = "éå®"; |
| | | |
| | | private final StockOutRecordMapper stockOutRecordMapper; |
| | | private final IVehicleService vehicleService; |
| | | private final StockInventoryMapper stockInventoryMapper; |
| | | private final StockUninventoryMapper stockUninventoryMapper; |
| | | private final AccountSalesCollectionMapper accountSalesCollectionMapper; |
| | | private final AccountInvoiceApplicationMapper accountInvoiceApplicationMapper; |
| | | private final OutsourcingOrderProductMapper outsourcingOrderProductMapper; |
| | | private final OutsourcingOrderMapper outsourcingOrderMapper; |
| | | |
| | | @Override |
| | | public IPage<StockOutRecordDto> listPage(Page page, StockOutRecordDto stockOutRecordDto) { |
| | |
| | | |
| | | @Override |
| | | public int add(StockOutRecordDto stockOutRecordDto) { |
| | | if (OUT_CATEGORY_SALE.equals(stockOutRecordDto.getOutCategory())) { |
| | | // éå®ç±»æ²¹ååºåºå®¡æ¹éè¿æ¶è¦ææ¹æ¬¡æ£ååºåï¼æ¹æ¬¡ä¸è½ä¸ºç©º |
| | | if (StringUtils.isEmpty(stockOutRecordDto.getBatchNo())) { |
| | | throw new BaseException("éå®ç±»åºåºå¿
须鿩åºåºæ¹æ¬¡"); |
| | | } |
| | | resolveVehicle(stockOutRecordDto); |
| | | checkSaleOutAvailable(stockOutRecordDto); |
| | | } |
| | | LocalDateTime createTime = stockOutRecordDto.getCreateTime(); |
| | | if (createTime == null) { |
| | | createTime = LocalDateTime.now(); |
| | |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public int batchDelete(List<Long> ids) { |
| | | //todo 妿åºåºä¸å¼ç¥¨æ¶æ¬¾æå
³èåæ æ³å é¤ |
| | | if (accountSalesCollectionMapper.existsByStockOutRecordId(ids) || |
| | |
| | | stockUninventoryMapper.updateAddStockUnInventory(stockUninventoryDto); |
| | | } |
| | | } |
| | | else if (OUT_CATEGORY_SALE.equals(stockOutRecord.getOutCategory())) { |
| | | // éå®ç±»æ²¹ååºåºåªæå®¡æ¹éè¿æ¶ææ£è¿åºåï¼å é¤å·²éè¿çè®°å½éæåæ¹æ¬¡å½è¿ |
| | | returnSaleOilOutStock(stockOutRecord); |
| | | } |
| | | } |
| | | return stockOutRecordMapper.deleteBatchIds(ids); |
| | | } |
| | | |
| | | /** |
| | | * éå®ç±»æ²¹ååºåºå½è¿åºåï¼ä»
对审æ¹éè¿ï¼å³æ£è¿åºåï¼çè®°å½çæã |
| | | * å½è¿éå deduct_quantityï¼å®é
æ£åéï¼ï¼æ¹é å审æ¹éè¿çè®°å½æ²¡æè¯¥å¼ï¼æå
¨é¢å½è¿ |
| | | */ |
| | | private void returnSaleOilOutStock(StockOutRecord stockOutRecord) { |
| | | if (!ReviewStatusEnum.APPROVED.getCode().equals(stockOutRecord.getApprovalStatus()) |
| | | || StringUtils.isEmpty(stockOutRecord.getBatchNo()) |
| | | || stockOutRecord.getStockOutNum() == null) { |
| | | return; |
| | | } |
| | | BigDecimal returnQuantity = stockOutRecord.getDeductQuantity() != null |
| | | ? stockOutRecord.getDeductQuantity() |
| | | : stockOutRecord.getStockOutNum(); |
| | | if (returnQuantity.compareTo(BigDecimal.ZERO) <= 0) { |
| | | return; |
| | | } |
| | | StockInventoryDto stockInventoryDto = new StockInventoryDto(); |
| | | stockInventoryDto.setProductModelId(stockOutRecord.getProductModelId()); |
| | | stockInventoryDto.setBatchNo(stockOutRecord.getBatchNo()); |
| | | stockInventoryDto.setQualitity(returnQuantity); |
| | | stockInventoryMapper.updateAddStockInventory(stockInventoryDto); |
| | | } |
| | | |
| | | @Override |
| | |
| | | if (stockOutRecord.getApprovalStatus() != null && !ReviewStatusEnum.PENDING_REVIEW.getCode().equals(stockOutRecord.getApprovalStatus())) { |
| | | throw new BaseException("åªæå¾
审æ¹ç¶æçè®°å½æè½å®¡æ¹,åºåºæ¹æ¬¡:" + stockOutRecord.getOutboundBatches()); |
| | | } |
| | | stockOutRecord.setApprovalStatus(approvalStatus); |
| | | stockOutRecordMapper.updateById(stockOutRecord); |
| | | // 审æ¹éè¿æ¶ï¼æ£ååºå |
| | | // 审æ¹éè¿æ¶å
æ£ååºåï¼æ£åéï¼deduct_quantityï¼è¦é审æ¹ç¶æä¸èµ·è½åºï¼æä»¥æ¾å¨æ´æ°ä¹å |
| | | if (ReviewStatusEnum.APPROVED.getCode().equals(approvalStatus)) { |
| | | if ("0".equals(stockOutRecord.getType())) { |
| | | // åæ ¼åºåº -> å
æ¥åºåæ¯å¦åå¨ï¼å卿æ£å |
| | |
| | | stockUninventoryDto.setBatchNo(stockOutRecord.getBatchNo()); |
| | | stockUninventoryDto.setQualitity(stockOutRecord.getStockOutNum()); |
| | | stockUninventoryMapper.updateSubtractStockUnInventory(stockUninventoryDto); |
| | | } else if (OUT_CATEGORY_SALE.equals(stockOutRecord.getOutCategory())) { |
| | | // éå®ç±»æ²¹ååºåºï¼type 为空ï¼å®¡æ¹éè¿æ¶ææ¹æ¬¡æ£ååºå |
| | | deductSaleOilOutStock(stockOutRecord); |
| | | } |
| | | } |
| | | stockOutRecord.setApprovalStatus(approvalStatus); |
| | | stockOutRecordMapper.updateById(stockOutRecord); |
| | | if (ReviewStatusEnum.APPROVED.getCode().equals(approvalStatus) |
| | | && StockOutQualifiedRecordTypeEnum.OUTSOURCING_SCRAP_OUT.getCode() |
| | | .equals(stockOutRecord.getRecordType())) { |
| | | tryCompleteOutsourcingOrder(stockOutRecord); |
| | | } |
| | | } |
| | | return ids.size(); |
| | | } |
| | | |
| | | /** |
| | | * å§å¤æ¥åºååºåºå®¡æ¹éè¿åï¼è¥è¯¥å§å¤è®¢åçæ¥åºåéæè¡å·²<b>å
¨é¨</b>åºåºå®¡æ¹éè¿ï¼ |
| | | * èªå¨æè®¢åä»ãå·²ç¡®è®¤ãæ¨å°ã已宿ãï¼çæäººå·¥åç¹ä¸æ¬¡å®æã |
| | | * |
| | | * <p>ç´æ¥ç¨ mapper è䏿¯ {@code IOutsourcingOrderService#complete}ï¼åè
ä¾èµæ¬æå¡ï¼ |
| | | * 两边é½èµ°æé 卿³¨å
¥ä¼å½¢æå¾ªç¯ä¾èµã驳å/å审ä¸åé订åç¶æï¼å¤çé误审æ¹èµ°äººå·¥éæ°å®¡æ¹ï¼ã</p> |
| | | */ |
| | | private void tryCompleteOutsourcingOrder(StockOutRecord record) { |
| | | if (record.getRecordId() == null) { |
| | | return; |
| | | } |
| | | OutsourcingOrderProduct line = outsourcingOrderProductMapper.selectById(record.getRecordId()); |
| | | if (line == null || line.getOutsourcingOrderId() == null) { |
| | | return; |
| | | } |
| | | Long orderId = line.getOutsourcingOrderId(); |
| | | // isScrap å¨ Java ä¾§è¿æ»¤ï¼ä¸å§å¤æ¨¡åèªå·±ç scrapLineIds ä¸è´ï¼ä¸ä¾èµ Boolean åæ®µçå忍æ |
| | | List<Long> lineIds = outsourcingOrderProductMapper.selectList( |
| | | Wrappers.<OutsourcingOrderProduct>lambdaQuery() |
| | | .eq(OutsourcingOrderProduct::getOutsourcingOrderId, orderId)) |
| | | .stream() |
| | | .filter(item -> Boolean.TRUE.equals(item.getIsScrap())) |
| | | .map(OutsourcingOrderProduct::getId) |
| | | .toList(); |
| | | if (lineIds.isEmpty()) { |
| | | return; |
| | | } |
| | | // åºåºè®°å½ä¸æ¡å¯¹åºä¸è¡æç»ï¼ç¼ºè®°å½ï¼è¢«å审å é¤çï¼å°±ä¸å®æï¼ä¸äººå·¥å®æçæ ¡éªå£å¾ä¸è´ |
| | | long approvedCount = listByRecordIds(lineIds, record.getRecordType()).stream() |
| | | .filter(item -> ReviewStatusEnum.APPROVED.getCode().equals(item.getApprovalStatus())) |
| | | .count(); |
| | | if (approvedCount < lineIds.size()) { |
| | | return; |
| | | } |
| | | // æ¡ä»¶æ´æ°ï¼åªæã已确认ãè½æ¨è¿ï¼å·²ä½åº/已宿ç订åä¸å¨ |
| | | outsourcingOrderMapper.update(null, Wrappers.<OutsourcingOrder>lambdaUpdate() |
| | | .eq(OutsourcingOrder::getId, orderId) |
| | | .eq(OutsourcingOrder::getStatus, OutsourcingOrderStatusEnum.CONFIRMED.getCode()) |
| | | .set(OutsourcingOrder::getStatus, OutsourcingOrderStatusEnum.COMPLETED.getCode())); |
| | | } |
| | | |
| | | /** |
| | | * éå®ç±»æ²¹ååºåºæ£ååºåãåºåºæ°éæ¯æ¬æ¬¡è£
车æ»éï¼è½¦ä¸ä¸æ¬¡å©çæ²¹æ¬æ¬¡ç»§ç»ç¨ï¼ |
| | | * æä»¥åªä»åºå补足ãåºåºæ°é â 䏿¬¡å©ä½æ²¹éãçå·®é¢ã |
| | | * updateSubtractStockInventory èªå¸¦ qualitity >= æ°é çå®å«ï¼å½±åè¡æ°ä¸º 0 å³åºåä¸è¶³ï¼ |
| | | * æéç±å¤å±äºå¡åæ» |
| | | */ |
| | | private void deductSaleOilOutStock(StockOutRecord stockOutRecord) { |
| | | String suffix = ",åºåºæ¹æ¬¡:" + stockOutRecord.getOutboundBatches(); |
| | | if (StringUtils.isEmpty(stockOutRecord.getBatchNo())) { |
| | | throw new BaseException("éå®ç±»åºåºå¿
须鿩åºåºæ¹æ¬¡" + suffix); |
| | | } |
| | | BigDecimal quantity = stockOutRecord.getStockOutNum(); |
| | | if (quantity == null || quantity.compareTo(BigDecimal.ZERO) <= 0) { |
| | | throw new BaseException("éå®ç±»åºåºæ°éå¿
须大äº0" + suffix); |
| | | } |
| | | BigDecimal lastResidual = getLastResidualOil(stockOutRecord.getVehicleId(), stockOutRecord.getProductModelId(), stockOutRecord.getId()); |
| | | if (lastResidual.compareTo(quantity) > 0) { |
| | | throw new BaseException("åºåºæ°éä¸è½å°äºè¯¥è½¦ä¸æ¬¡å©ä½æ²¹é" + toPlain(lastResidual) + suffix); |
| | | } |
| | | BigDecimal deduct = quantity.subtract(lastResidual); |
| | | if (deduct.compareTo(BigDecimal.ZERO) > 0) { |
| | | StockInventoryDto stockInventoryDto = new StockInventoryDto(); |
| | | stockInventoryDto.setProductModelId(stockOutRecord.getProductModelId()); |
| | | stockInventoryDto.setBatchNo(stockOutRecord.getBatchNo()); |
| | | stockInventoryDto.setQualitity(deduct); |
| | | if (stockInventoryMapper.updateSubtractStockInventory(stockInventoryDto) == 0) { |
| | | throw new BaseException("åºåä¸è¶³æ æ³åºåº" + suffix); |
| | | } |
| | | } |
| | | // 车ä¸å©æ²¹å好å¤ï¼deduct=0ï¼æ¶ä¸æ¶ååºåæ´æ°ï¼åæ ·è½åºä¾¿äºå 餿¶æå®é
æ£åéå½è¿ |
| | | stockOutRecord.setDeductQuantity(deduct); |
| | | } |
| | | |
| | | @Override |
| | |
| | | return ids.size(); |
| | | } |
| | | |
| | | @Override |
| | | public int updateResidualOil(Long id, BigDecimal residualOil) { |
| | | StockOutRecord stockOutRecord = stockOutRecordMapper.selectById(id); |
| | | if (stockOutRecord == null) { |
| | | throw new BaseException("该åºåºè®°å½ä¸åå¨,æ æ³æ´æ°!!!"); |
| | | } |
| | | if (residualOil == null || residualOil.compareTo(BigDecimal.ZERO) < 0) { |
| | | throw new BaseException("å©ä½æ²¹éä¸è½ä¸ºç©ºä¸ä¸è½å°äº0"); |
| | | } |
| | | if (stockOutRecord.getStockOutNum() != null && residualOil.compareTo(stockOutRecord.getStockOutNum()) > 0) { |
| | | throw new BaseException("å©ä½æ²¹éä¸è½å¤§äºåºåºæ°é" + toPlain(stockOutRecord.getStockOutNum())); |
| | | } |
| | | StockOutRecord update = new StockOutRecord(); |
| | | update.setId(id); |
| | | update.setResidualOil(residualOil); |
| | | return stockOutRecordMapper.updateById(update); |
| | | } |
| | | |
| | | private StockInventory getStockInventory(Long productModelId, String batchNo) { |
| | | LambdaQueryWrapper<StockInventory> eq = new LambdaQueryWrapper<>(); |
| | | eq.eq(StockInventory::getProductModelId, productModelId); |
| | |
| | | } |
| | | return stockUninventoryMapper.selectOne(eq); |
| | | } |
| | | |
| | | /** |
| | | * 车è¾åå¡«ï¼å端å¯ä»¥ç´æ¥ä¼ vehicleIdï¼ä¹å¯ä»¥åªä¼ 车çå·ï¼ |
| | | * åè
æè½¦è¾ä¸»æ°æ®åæ¥åå¡«ã两è
齿¿ä¸å°å°±æ æ³å®ä½ã䏿¬¡å©ä½æ²¹éãï¼ç´æ¥æ¥é |
| | | */ |
| | | private void resolveVehicle(StockOutRecordDto stockOutRecordDto) { |
| | | if (stockOutRecordDto.getVehicleId() != null) { |
| | | return; |
| | | } |
| | | if (StringUtils.isEmpty(stockOutRecordDto.getTruckPlateNo())) { |
| | | throw new BaseException("éå®ç±»åºåºå¿
é¡»éæ©è½¦è¾"); |
| | | } |
| | | LambdaQueryWrapper<Vehicle> wrapper = new LambdaQueryWrapper<Vehicle>() |
| | | .eq(Vehicle::getPlateNumber, stockOutRecordDto.getTruckPlateNo()); |
| | | Vehicle vehicle = vehicleService.getOne(wrapper, false); |
| | | if (vehicle == null) { |
| | | throw new BaseException("车çå· " + stockOutRecordDto.getTruckPlateNo() + " ä¸å¨è½¦è¾ç®¡çä¸ï¼è¯·å
å°è½¦è¾ç®¡çæ·»å "); |
| | | } |
| | | stockOutRecordDto.setVehicleId(vehicle.getId()); |
| | | } |
| | | |
| | | /** |
| | | * åºåºæ°éæ¯æ¬æ¬¡è£
车æ»éï¼å¿
é¡»è½å¨ã䏿¬¡å©ä½æ²¹é ~ 䏿¬¡å©ä½æ²¹é + åºåãåºé´å
|
| | | */ |
| | | private void checkSaleOutAvailable(StockOutRecordDto stockOutRecordDto) { |
| | | String suffix = ",åºåºæ¹æ¬¡:" + stockOutRecordDto.getOutboundBatches(); |
| | | BigDecimal quantity = stockOutRecordDto.getStockOutNum(); |
| | | if (quantity == null || quantity.compareTo(BigDecimal.ZERO) <= 0) { |
| | | throw new BaseException("éå®ç±»åºåºæ°éå¿
须大äº0" + suffix); |
| | | } |
| | | BigDecimal lastResidual = getLastResidualOil(stockOutRecordDto.getVehicleId(), stockOutRecordDto.getProductModelId(), null); |
| | | if (lastResidual.compareTo(quantity) > 0) { |
| | | throw new BaseException("åºåºæ°éä¸è½å°äºè¯¥è½¦ä¸æ¬¡å©ä½æ²¹é" + toPlain(lastResidual) + suffix); |
| | | } |
| | | BigDecimal stockQuantity = getStockQuantity(stockOutRecordDto.getProductModelId(), stockOutRecordDto.getBatchNo()); |
| | | BigDecimal availableQty = lastResidual.add(stockQuantity); |
| | | if (quantity.compareTo(availableQty) > 0) { |
| | | throw new BaseException("åºåºæ°éè¶
åºå¯ç¨é(䏿¬¡å©ä½" + toPlain(lastResidual) |
| | | + ",åºå" + toPlain(stockQuantity) + ",å¯ç¨" + toPlain(availableQty) + ")" + suffix); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * è¯¥è½¦è¯¥è§æ ¼ä¸æ¬¡éå®è´§åå©ä½çæ²¹éï¼åæè¿ä¸æ¡å¡«è¿æ®æ²¹ä¸å·²å®¡æ¹çè®°å½ã |
| | | * excludeId ç¨äºæé¤ãæ¬æ¬¡è¦å®¡æ¹çè¿æ¡èªå·±ãââå®èªå·±ç residual_oil æ¯éå®ä¹åçå¼ï¼ä¸è½ç¨æ¥ç®æ¬æ¬¡æ£å |
| | | */ |
| | | private BigDecimal getLastResidualOil(Long vehicleId, Long productModelId, Long excludeId) { |
| | | if (vehicleId == null || productModelId == null) { |
| | | return BigDecimal.ZERO; |
| | | } |
| | | LambdaQueryWrapper<StockOutRecord> wrapper = new LambdaQueryWrapper<StockOutRecord>() |
| | | .eq(StockOutRecord::getVehicleId, vehicleId) |
| | | .eq(StockOutRecord::getProductModelId, productModelId) |
| | | .isNotNull(StockOutRecord::getResidualOil) |
| | | .eq(StockOutRecord::getApprovalStatus, ReviewStatusEnum.APPROVED.getCode()); |
| | | if (excludeId != null) { |
| | | wrapper.lt(StockOutRecord::getId, excludeId); |
| | | } |
| | | wrapper.orderByDesc(StockOutRecord::getId).last("limit 1"); |
| | | StockOutRecord last = stockOutRecordMapper.selectOne(wrapper); |
| | | return last == null || last.getResidualOil() == null ? BigDecimal.ZERO : last.getResidualOil(); |
| | | } |
| | | |
| | | /** |
| | | * å½ååºåéï¼æè§æ ¼å计ï¼ä¼ äºæ¹æ¬¡å·åå å æ¹æ¬¡æ¡ä»¶ |
| | | */ |
| | | private BigDecimal getStockQuantity(Long productModelId, String batchNo) { |
| | | if (productModelId == null) { |
| | | return BigDecimal.ZERO; |
| | | } |
| | | LambdaQueryWrapper<StockInventory> wrapper = new LambdaQueryWrapper<StockInventory>() |
| | | .eq(StockInventory::getProductModelId, productModelId); |
| | | if (!StringUtils.isEmpty(batchNo)) { |
| | | wrapper.eq(StockInventory::getBatchNo, batchNo); |
| | | } |
| | | return stockInventoryMapper.selectList(wrapper).stream() |
| | | .map(StockInventory::getQualitity) |
| | | .filter(Objects::nonNull) |
| | | .reduce(BigDecimal.ZERO, BigDecimal::add); |
| | | } |
| | | |
| | | @Override |
| | | public OilOutAvailableDto getOilOutAvailableQty(StockOutRecordDto query) { |
| | | if (query == null || query.getVehicleId() == null || query.getProductModelId() == null) { |
| | | throw new BaseException("请å
éæ©è½¦è¾å产åè§æ ¼"); |
| | | } |
| | | BigDecimal lastResidualOil = getLastResidualOil(query.getVehicleId(), query.getProductModelId(), query.getId()); |
| | | BigDecimal stockQuantity = getStockQuantity(query.getProductModelId(), query.getBatchNo()); |
| | | OilOutAvailableDto result = new OilOutAvailableDto(); |
| | | result.setLastResidualOil(lastResidualOil); |
| | | result.setStockQuantity(stockQuantity); |
| | | result.setAvailableQty(lastResidualOil.add(stockQuantity)); |
| | | return result; |
| | | } |
| | | |
| | | private String toPlain(BigDecimal value) { |
| | | return value == null ? "0" : value.stripTrailingZeros().toPlainString(); |
| | | } |
| | | |
| | | @Override |
| | | public List<StockOutRecord> listByRecordIds(List<Long> recordIds, String recordType) { |
| | | if (CollectionUtils.isEmpty(recordIds) || StringUtils.isEmpty(recordType)) { |
| | | return Collections.emptyList(); |
| | | } |
| | | return stockOutRecordMapper.selectByRecordIds(recordIds, recordType); |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public int releaseByRecordIds(List<Long> recordIds, String recordType) { |
| | | List<StockOutRecord> records = listByRecordIds(recordIds, recordType); |
| | | if (records.isEmpty()) { |
| | | return 0; |
| | | } |
| | | for (StockOutRecord record : records) { |
| | | if (!ReviewStatusEnum.APPROVED.getCode().equals(record.getApprovalStatus())) { |
| | | continue; |
| | | } |
| | | // type=0 å½è¿åæ ¼åºåï¼stock_inventoryï¼ï¼type=1 å½è¿ä¸åæ ¼åºåï¼stock_uninventoryï¼ |
| | | if ("0".equals(record.getType())) { |
| | | StockInventoryDto stockInventoryDto = new StockInventoryDto(); |
| | | stockInventoryDto.setProductModelId(record.getProductModelId()); |
| | | stockInventoryDto.setBatchNo(record.getBatchNo()); |
| | | stockInventoryDto.setQualitity(record.getStockOutNum()); |
| | | if (stockInventoryMapper.updateAddStockInventory(stockInventoryDto) == 0) { |
| | | throw new BaseException("åºåè®°å½ä¸æ²¡æå¯¹åºç产å,æ æ³å½è¿,åºåºæ¹æ¬¡:" + record.getOutboundBatches()); |
| | | } |
| | | } else if ("1".equals(record.getType())) { |
| | | StockUninventoryDto stockUninventoryDto = new StockUninventoryDto(); |
| | | stockUninventoryDto.setProductModelId(record.getProductModelId()); |
| | | stockUninventoryDto.setBatchNo(record.getBatchNo()); |
| | | stockUninventoryDto.setQualitity(record.getStockOutNum()); |
| | | if (stockUninventoryMapper.updateAddStockUnInventory(stockUninventoryDto) == 0) { |
| | | throw new BaseException("åºåè®°å½ä¸æ²¡æå¯¹åºç产å,æ æ³å½è¿,åºåºæ¹æ¬¡:" + record.getOutboundBatches()); |
| | | } |
| | | } else { |
| | | throw new BaseException("åºåºè®°å½ç±»åå¼å¸¸ï¼æ æ³å½è¿åºå,åºåºæ¹æ¬¡:" + record.getOutboundBatches()); |
| | | } |
| | | } |
| | | return stockOutRecordMapper.deleteBatchIds(records.stream().map(StockOutRecord::getId).toList()); |
| | | } |
| | | } |
| | |
| | | c.customer_name, |
| | | T1.contractAmounts AS contractAmounts, |
| | | IFNULL(T2.receiptPaymentAmount, 0) AS receiptPaymentAmount, |
| | | IFNULL(T5.paymentAmount, 0) AS paymentAmount, |
| | | IFNULL(T5.receiptRecordAmount, 0) AS receiptRecordAmount, |
| | | T1.contractAmounts - IFNULL(T2.receiptPaymentAmount, 0) - IFNULL(T4.returnAmount, 0) AS receiptableAmount, |
| | | IFNULL(T4.returnAmount, 0) AS returnAmount |
| | | from (select customer_id, sum(contract_amount) as contractAmounts from sales_ledger group by customer_id) T1 |
| | | left join (select customer_id, sum(collection_amount) as receiptPaymentAmount from account_sales_collection group by customer_id) T2 on T1.customer_id = T2.customer_id |
| | | left join (select party_id, sum(amount) as paymentAmount from payment_record where party_type = 1 and direction = 1 group by party_id) T5 on T5.party_id = T1.customer_id |
| | | left join (select party_id, sum(amount) as receiptRecordAmount from payment_record where party_type = 1 and direction = 1 group by party_id) T5 on T5.party_id = T1.customer_id |
| | | left join ( |
| | | select |
| | | sl.customer_id, |
| | |
| | | sl.execution_date, |
| | | sl.contract_amount AS contract_amount, |
| | | IFNULL(T1.receiptPaymentAmount, 0) AS receiptPaymentAmount, |
| | | IFNULL(T5.paymentAmount, 0) AS paymentAmount, |
| | | IFNULL(T5.receiptRecordAmount, 0) AS receiptRecordAmount, |
| | | sl.contract_amount - IFNULL(T1.receiptPaymentAmount, 0) - IFNULL(T3.returnAmount, 0) AS receiptableAmount, |
| | | IFNULL(T3.returnAmount, 0) AS returnAmount |
| | | from sales_ledger sl |
| | |
| | | group by sl.id |
| | | )T3 on T3.id = sl.id |
| | | left join ( |
| | | select party_id, sum(amount) as paymentAmount |
| | | select party_id, sum(amount) as receiptRecordAmount |
| | | from payment_record |
| | | where party_type = 1 and direction = 1 |
| | | group by party_id |
| | |
| | | sm.supplier_name, |
| | | T1.contractAmounts, |
| | | IFNULL(T2.paymentAmount, 0) AS paymentAmount, |
| | | IFNULL(T5.receiptAmount, 0) AS receiptAmount, |
| | | IFNULL(T5.paymentRecordAmount, 0) AS paymentRecordAmount, |
| | | T1.contractAmounts - IFNULL(T2.paymentAmount, 0) - IFNULL(T4.returnAmount, 0) AS payableAmount, |
| | | IFNULL(T4.returnAmount, 0) AS returnAmount |
| | | from (select supplier_id, sum(contract_amount) as contractAmounts from purchase_ledger group by supplier_id) T1 |
| | | left join (select supplier_id, sum(payment_amount) as paymentAmount from account_purchase_payment group by supplier_id) T2 on T1.supplier_id = T2.supplier_id |
| | | left join (select party_id, sum(amount) as receiptAmount from payment_record where party_type = 2 and direction = 2 group by party_id) T5 on T5.party_id = T1.supplier_id |
| | | left join (select party_id, sum(amount) as paymentRecordAmount from payment_record where party_type = 2 and direction = 2 group by party_id) T5 on T5.party_id = T1.supplier_id |
| | | left join ( |
| | | select |
| | | supplier_id, |
| | |
| | | pl.execution_date, |
| | | pl.contract_amount AS contract_amount, |
| | | IFNULL(T1.paymentAmount, 0) AS paymentAmount, |
| | | IFNULL(T5.receiptAmount, 0) AS receiptAmount, |
| | | IFNULL(T5.paymentRecordAmount, 0) AS paymentRecordAmount, |
| | | pl.contract_amount - IFNULL(T1.paymentAmount, 0) - IFNULL(T3.returnAmount, 0) AS payableAmount, |
| | | IFNULL(T3.returnAmount, 0) AS returnAmount |
| | | from purchase_ledger pl |
| | |
| | | group by pl.id |
| | | )T3 on T3.id = pl.id |
| | | left join ( |
| | | select party_id, sum(amount) as receiptAmount |
| | | select party_id, sum(amount) as paymentRecordAmount |
| | | from payment_record |
| | | where party_type = 2 and direction = 2 |
| | | group by party_id |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <?xml version="1.0" encoding="UTF-8" ?> |
| | | <!DOCTYPE mapper |
| | | PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" |
| | | "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> |
| | | <mapper namespace="com.ruoyi.outsourcing.mapper.OutsourcingPartnerMapper"> |
| | | |
| | | <select id="partnerListPage" resultType="com.ruoyi.outsourcing.dto.OutsourcingPartnerDto"> |
| | | SELECT |
| | | T1.id, |
| | | T1.partner_name, |
| | | T1.taxpayer_identification_num, |
| | | T1.company_address, |
| | | T1.company_phone, |
| | | T1.bank_account_name, |
| | | T1.bank_account_num, |
| | | T1.contact_user_name, |
| | | T1.contact_user_phone, |
| | | T1.maintain_user_id, |
| | | T1.maintain_time, |
| | | T1.partner_type, |
| | | T1.is_white, |
| | | T1.remark, |
| | | T1.create_time, |
| | | T1.create_user, |
| | | T1.update_time, |
| | | T1.tenant_id, |
| | | T2.nick_name AS maintainUserName |
| | | FROM outsourcing_partner T1 |
| | | LEFT JOIN sys_user T2 ON T1.maintain_user_id = T2.user_id |
| | | <where> |
| | | <if test="dto.partnerName != null and dto.partnerName != ''"> |
| | | AND T1.partner_name LIKE CONCAT('%',#{dto.partnerName},'%') |
| | | </if> |
| | | <if test="dto.partnerType != null and dto.partnerType != ''"> |
| | | AND T1.partner_type = #{dto.partnerType} |
| | | </if> |
| | | <if test="dto.isWhite != null"> |
| | | AND T1.is_white = #{dto.isWhite} |
| | | </if> |
| | | </where> |
| | | order by T1.id desc |
| | | </select> |
| | | |
| | | <select id="partnerExportList" resultType="com.ruoyi.outsourcing.excel.OutsourcingPartnerExcelDto"> |
| | | SELECT |
| | | T1.partner_name, |
| | | T1.taxpayer_identification_num, |
| | | T1.company_address, |
| | | T1.company_phone, |
| | | T1.bank_account_name, |
| | | T1.bank_account_num, |
| | | T1.contact_user_name, |
| | | T1.contact_user_phone, |
| | | T1.partner_type, |
| | | T2.nick_name AS maintainUserName |
| | | FROM outsourcing_partner T1 |
| | | LEFT JOIN sys_user T2 ON T1.maintain_user_id = T2.user_id |
| | | <where> |
| | | <if test="dto.partnerName != null and dto.partnerName != ''"> |
| | | AND T1.partner_name LIKE CONCAT('%',#{dto.partnerName},'%') |
| | | </if> |
| | | <if test="dto.partnerType != null and dto.partnerType != ''"> |
| | | AND T1.partner_type = #{dto.partnerType} |
| | | </if> |
| | | <if test="dto.isWhite != null"> |
| | | AND T1.is_white = #{dto.isWhite} |
| | | </if> |
| | | </where> |
| | | order by T1.id desc |
| | | </select> |
| | | |
| | | <!-- 徿¥å表ï¼é¡¶å± from æ¯åæ¥è¯¢ï¼æ°æ®æéæ¦æªå¨å¤©ç¶è·³è¿ï¼ä¸¤ä¾§å£å¾å¿
é¡»ä¸è´ï¼æç»ä¾§æ¾å¼æ è®°è·³è¿ --> |
| | | <select id="partnerTransactions" resultType="com.ruoyi.outsourcing.vo.OutsourcingPartnerTransactionsVo"> |
| | | select T1.partner_id, |
| | | op.partner_name, |
| | | T1.contractAmounts, |
| | | IFNULL(T2.paidAmount, 0) AS paidAmount, |
| | | IFNULL(T3.receiptAmount, 0) AS receiptAmount, |
| | | T1.contractAmounts - IFNULL(T2.paidAmount, 0) AS payableAmount |
| | | from (select partner_id, sum(contract_amount) as contractAmounts |
| | | from outsourcing_order |
| | | where status in (1, 2) |
| | | group by partner_id) T1 |
| | | left join (select party_id, sum(amount) as paidAmount |
| | | from payment_record |
| | | where party_type = 3 and direction = 1 |
| | | group by party_id) T2 on T2.party_id = T1.partner_id |
| | | left join (select party_id, sum(amount) as receiptAmount |
| | | from payment_record |
| | | where party_type = 3 and direction = 2 |
| | | group by party_id) T3 on T3.party_id = T1.partner_id |
| | | inner join outsourcing_partner op on T1.partner_id = op.id |
| | | <where> |
| | | <if test="partnerName != null and partnerName != ''"> |
| | | AND op.partner_name LIKE CONCAT('%',#{partnerName},'%') |
| | | </if> |
| | | </where> |
| | | order by T1.partner_id desc |
| | | </select> |
| | | |
| | | <!-- 徿¥æç»ï¼é¡¶å± from æ¯ outsourcing_orderï¼ä¼è¢«æ¦æªå¨è¿½å create_user/dept_id æ¡ä»¶ï¼ |
| | | ä¸å表å£å¾ä¸ä¸è´ä¼å¯¼è´ãå表æåºä»ãæç» 0 è¡ãï¼æ
ç¨ /*data_scope*/ æ¾å¼è·³è¿ --> |
| | | <select id="partnerTransactionsDetails" |
| | | resultType="com.ruoyi.outsourcing.vo.OutsourcingPartnerTransactionsDetailsVo"> |
| | | select /*data_scope*/ oo.id as outsourcingOrderId, |
| | | oo.order_no, |
| | | oo.partner_id, |
| | | oo.partner_name, |
| | | oo.apply_date, |
| | | oo.contract_amount, |
| | | oo.status, |
| | | IFNULL(T1.paidAmount, 0) AS paidAmount, |
| | | oo.contract_amount - IFNULL(T1.paidAmount, 0) AS payableAmount |
| | | from outsourcing_order oo |
| | | left join (select party_id, sum(amount) as paidAmount |
| | | from payment_record |
| | | where party_type = 3 and direction = 1 |
| | | group by party_id) T1 on T1.party_id = oo.partner_id |
| | | where oo.partner_id = #{partnerId} |
| | | and oo.status in (1, 2) |
| | | order by oo.id desc |
| | | </select> |
| | | |
| | | </mapper> |
| | |
| | | |
| | | </select> |
| | | |
| | | <!-- 代å¨éé¢ï¼è¯¥å®¢æ·å
¨é¨ãç±»å=代å¨ãå°è´¦ååéé¢å计ãè·¨å®¢æ·æ±æ»ï¼å /*data_scope*/ è·³è¿æ°æ®æéï¼ |
| | | å¦åé管çåçå°çæ¯è¢« dept_id è¿æ»¤è¿çé¨åéé¢ï¼ä¼æãå·²è¶
ä¿¡æåºéãè¯¯å¤ææªè¶
--> |
| | | <select id="selectDepositAmountByCustomerIds" resultType="com.ruoyi.sales.dto.CustomerDepositAmountDto"> |
| | | select /*data_scope*/ customer_id as customerId, |
| | | IFNULL(sum(contract_amount), 0) as depositTotalAmount |
| | | from sales_ledger |
| | | where ledger_type = '代å¨' |
| | | <if test="customerIds != null and customerIds.size() > 0"> |
| | | and customer_id in |
| | | <foreach collection="customerIds" item="cid" open="(" separator="," close=")"> |
| | | #{cid} |
| | | </foreach> |
| | | </if> |
| | | group by customer_id |
| | | </select> |
| | | |
| | | <select id="selectSalesLedgerList" resultType="com.ruoyi.sales.pojo.SalesLedger"> |
| | | SELECT |
| | | T1.id, |
| | |
| | | T1.salesman, |
| | | T1.customer_id, |
| | | T1.customer_name, |
| | | T1.ledger_type, |
| | | T1.oil_depot_id, |
| | | T1.oil_depot_name, |
| | | T1.tank_id, |
| | | T1.tank_no, |
| | | T1.approval_status, |
| | | T1.entry_person, |
| | | T1.remarks, |
| | | T1.attachment_materials, |
| | |
| | | <if test="salesLedgerDto.customerName != null and salesLedgerDto.customerName != '' "> |
| | | T1.customer_name LIKE CONCAT('%',#{salesLedgerDto.customerName},'%') |
| | | </if> |
| | | <if test="salesLedgerDto.ledgerType != null and salesLedgerDto.ledgerType != '' "> |
| | | AND T1.ledger_type = #{salesLedgerDto.ledgerType} |
| | | </if> |
| | | <if test="salesLedgerDto.approvalStatus != null and salesLedgerDto.approvalStatus != '' "> |
| | | AND T1.approval_status = #{salesLedgerDto.approvalStatus} |
| | | </if> |
| | | </where> |
| | | </select> |
| | | |
| | |
| | | T1.salesman, |
| | | T1.customer_id, |
| | | T1.customer_name, |
| | | T1.ledger_type, |
| | | T1.oil_depot_id, |
| | | T1.oil_depot_name, |
| | | T1.tank_id, |
| | | T1.tank_no, |
| | | T1.approval_status, |
| | | T1.entry_person, |
| | | T1.remarks, |
| | | T1.attachment_materials, |
| | |
| | | <if test="salesLedgerDto.entryDateEnd != null and salesLedgerDto.entryDateEnd != '' "> |
| | | AND T1.entry_date <= DATE_FORMAT(#{salesLedgerDto.entryDateEnd},'%Y-%m-%d') |
| | | </if> |
| | | <if test="salesLedgerDto.ledgerType != null and salesLedgerDto.ledgerType != '' "> |
| | | AND T1.ledger_type = #{salesLedgerDto.ledgerType} |
| | | </if> |
| | | <if test="salesLedgerDto.approvalStatus != null and salesLedgerDto.approvalStatus != '' "> |
| | | AND T1.approval_status = #{salesLedgerDto.approvalStatus} |
| | | </if> |
| | | </where> |
| | | order by T1.entry_date desc |
| | | </select> |
| | |
| | | "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> |
| | | <mapper namespace="com.ruoyi.sales.mapper.ShippingInfoMapper"> |
| | | |
| | | <!-- |
| | | åè´§å°è´¦å表 = åè´§å(shipping_info) UNION ALL éå®ç±»æ²¹ååºåº(stock_out_record)ã |
| | | 䏤忝å顺åºå¿
é¡»ä¸¥æ ¼ä¸è´ï¼å
± 31 åï¼ï¼åå以忝 A 为åã |
| | | 注æï¼æ°æ®æéæ¦æªå¨åªç»ç¬¬ä¸ä¸ª from çè¡¨å æ¡ä»¶ï¼åæ¯ B é卿¬ XML éèªè¡è¡¥åçè¿æ»¤ã |
| | | --> |
| | | <select id="listPage" resultType="com.ruoyi.sales.dto.ShippingInfoDto"> |
| | | SELECT |
| | | s.id, |
| | |
| | | p.product_name, |
| | | sl.customer_name, |
| | | spd.totalQuantity, |
| | | sor.outboundBatches |
| | | sor.outboundBatches, |
| | | 'shipping' as source, |
| | | NULL as stockOutRecordId, |
| | | NULL as outCategory, |
| | | NULL as tankNo, |
| | | NULL as oilProduct, |
| | | NULL as oilDepotName, |
| | | NULL as driverName, |
| | | NULL as contactPerson, |
| | | NULL as contactPhone, |
| | | NULL as outBatchNo |
| | | FROM shipping_info s |
| | | LEFT JOIN (select shipping_info_id,sum(quantity) totalQuantity from shipping_product_detail GROUP BY shipping_info_id) spd ON spd.shipping_info_id = s.id |
| | | LEFT JOIN sales_ledger sl ON s.sales_ledger_id = sl.id |
| | |
| | | <if test="req.expressNumber != null and req.expressNumber != ''"> |
| | | AND s.express_number LIKE CONCAT('%',#{req.expressNumber},'%') |
| | | </if> |
| | | UNION ALL |
| | | SELECT |
| | | o.id, |
| | | NULL as sales_ledger_id, |
| | | o.out_date as shipping_date, |
| | | o.truck_plate_no as shipping_car_number, |
| | | NULL as express_number, |
| | | NULL as express_company, |
| | | o.outbound_batches as shipping_no, |
| | | NULL as type, |
| | | 'å·²åè´§' as status, |
| | | o.create_time, |
| | | o.update_time, |
| | | o.create_user, |
| | | o.update_user, |
| | | NULL as tenant_id, |
| | | NULL as sales_contract_no, |
| | | pm2.model as specification_model, |
| | | pm2.unit, |
| | | p2.product_name, |
| | | o.customer_name, |
| | | o.stock_out_num as totalQuantity, |
| | | o.outbound_batches as outboundBatches, |
| | | 'oilOut' as source, |
| | | o.id as stockOutRecordId, |
| | | o.out_category as outCategory, |
| | | o.tank_no as tankNo, |
| | | o.oil_product as oilProduct, |
| | | o.oil_depot_name as oilDepotName, |
| | | o.driver_name as driverName, |
| | | o.contact_person as contactPerson, |
| | | o.contact_phone as contactPhone, |
| | | o.batch_no as outBatchNo |
| | | FROM stock_out_record o |
| | | left join product_model pm2 on pm2.id = o.product_model_id |
| | | left join product p2 on p2.id = pm2.product_id |
| | | WHERE o.out_category = 'éå®' AND o.approval_status = 1 |
| | | <!-- æ²¹ååºåºæ²¡æååå·/å¿«éåï¼æè¿ä¸¤é¡¹çéæ¶ä¸åºè¿å任使²¹åè¡ --> |
| | | <if test="req.salesContractNo != null and req.salesContractNo != ''"> |
| | | AND 1=0 |
| | | </if> |
| | | <if test="req.expressNumber != null and req.expressNumber != ''"> |
| | | AND 1=0 |
| | | </if> |
| | | <if test="req.shippingCarNumber != null and req.shippingCarNumber != ''"> |
| | | AND o.truck_plate_no LIKE CONCAT('%',#{req.shippingCarNumber},'%') |
| | | </if> |
| | | <if test="req.shippingNo != null and req.shippingNo != ''"> |
| | | AND o.outbound_batches LIKE CONCAT('%',#{req.shippingNo},'%') |
| | | </if> |
| | | <if test="req.createUser != null"> |
| | | AND o.create_user = #{req.createUser} |
| | | </if> |
| | | <if test="req.deptId != null"> |
| | | AND o.dept_id = #{req.deptId} |
| | | </if> |
| | | <if test="req.deptIds != null and req.deptIds.length > 0"> |
| | | AND o.dept_id IN |
| | | <foreach collection="req.deptIds" item="deptId" open="(" separator="," close=")"> |
| | | #{deptId} |
| | | </foreach> |
| | | </if> |
| | | order by create_time DESC |
| | | </select> |
| | | <select id="listAll" resultType="com.ruoyi.sales.pojo.ShippingInfo"> |
| | |
| | | </if> |
| | | </select> |
| | | |
| | | <!-- æ¥åºåéæï¼åªæ¥äº§åæ ãå±åºå¤ç½®æ¬¡çå±åºã大类ï¼å«å
¶ææåèç¹ï¼ä¸çåæ ¼åºåï¼å¸¦æ¹å·ã |
| | | 大类åæä¸å¡å£å¾åæ»å¨è¿éï¼æ¹å£å¾åªéæ¹è¿ä¸å¤ã |
| | | 该æ¥è¯¢ä»¥ WITH å¼å¤´ï¼èæ°æ®æéæ¦æªå¨åªå¤ç select å¼å¤´ç SQLï¼å æ¤ä¸ä¼è¿½å dept_id/create_user, |
| | | ä¸ãåºåæ¯å
±ç¨åºç¡æ°æ®ãéæä¸åºå建å人éå¶ãçå£å¾ä¸è´ï¼ä¿ç /*data_scope*/ æ 记让è¿ä¸ªæå¾æ¾å¼å¯è¯»ã |
| | | ä¸å½±åå pagestockInventory --> |
| | | <select id="selectScrapStockPage" resultType="com.ruoyi.stock.dto.StockInventoryDto"> |
| | | WITH RECURSIVE scrap_product_tree AS ( |
| | | SELECT id |
| | | FROM product |
| | | WHERE product_name = 'å±åºå¤ç½®æ¬¡çå±åº' |
| | | UNION ALL |
| | | SELECT p.id |
| | | FROM product p |
| | | INNER JOIN scrap_product_tree t ON p.parent_id = t.id |
| | | ) |
| | | select /*data_scope*/ si.id, |
| | | si.product_model_id, |
| | | si.batch_no, |
| | | si.qualitity, |
| | | COALESCE(si.locked_quantity, 0) as locked_quantity, |
| | | (si.qualitity - COALESCE(si.locked_quantity, 0)) as un_locked_quantity, |
| | | si.remark, |
| | | si.version, |
| | | pm.model, |
| | | pm.unit, |
| | | p.product_name |
| | | from stock_inventory si |
| | | left join product_model pm on si.product_model_id = pm.id |
| | | left join product p on pm.product_id = p.id |
| | | where pm.product_id in (select id from scrap_product_tree) |
| | | <if test="ew.productModelId != null"> |
| | | and si.product_model_id = #{ew.productModelId} |
| | | </if> |
| | | <if test="ew.batchNo != null and ew.batchNo != ''"> |
| | | and si.batch_no like concat('%',#{ew.batchNo},'%') |
| | | </if> |
| | | <if test="ew.productName != null and ew.productName != ''"> |
| | | and p.product_name like concat('%',#{ew.productName},'%') |
| | | </if> |
| | | order by si.update_time desc |
| | | </select> |
| | | |
| | | <select id="pageListCombinedStockInventory" resultType="com.ruoyi.stock.dto.StockInventoryDto"> |
| | | WITH RECURSIVE product_tree AS ( |
| | | SELECT id |
| | |
| | | </where> |
| | | order by sor.id desc |
| | | </select> |
| | | <!-- ææ¥æºæç»æ¥åºåºè®°å½ï¼å /*data_scope*/ è·³è¿æ°æ®æéï¼å¦åæ¢è´¦å·ä¼æ¥ä¸å°è®°å½ï¼ |
| | | 导è´å§å¤çãå®ææ ¡éªã被éé»ç»è¿ããä½åºéæ¾å ç¨ã失æ --> |
| | | <select id="selectByRecordIds" resultType="com.ruoyi.stock.pojo.StockOutRecord"> |
| | | select /*data_scope*/ * |
| | | from stock_out_record |
| | | where record_type = #{recordType} |
| | | and record_id in |
| | | <foreach collection="recordIds" item="recordId" open="(" separator="," close=")"> |
| | | #{recordId} |
| | | </foreach> |
| | | </select> |
| | | |
| | | <select id="listStockOutRecordExportData" resultType="com.ruoyi.stock.execl.StockOutRecordExportData"> |
| | | SELECT |
| | | sor.*, |