Browse Source

出入库基础信息修改

klzhangweiya 1 month ago
parent
commit
c754b39e40
68 changed files with 5140 additions and 94 deletions
  1. 35 0
      SERVER/ChickenFarmV3/.script/sql/new/data.sql
  2. 30 0
      SERVER/ChickenFarmV3/.script/sql/new/sysmenu.sql
  3. 10 5
      SERVER/ChickenFarmV3/vb-modules/vb-erp/src/main/java/cn/vber/erp/controller/ItemInfoController.java
  4. 11 6
      SERVER/ChickenFarmV3/vb-modules/vb-erp/src/main/java/cn/vber/erp/controller/ProjectController.java
  5. 21 5
      SERVER/ChickenFarmV3/vb-modules/vb-erp/src/main/java/cn/vber/erp/controller/StoreHouseController.java
  6. 127 0
      SERVER/ChickenFarmV3/vb-modules/vb-erp/src/main/java/cn/vber/erp/controller/StoreInController.java
  7. 103 0
      SERVER/ChickenFarmV3/vb-modules/vb-erp/src/main/java/cn/vber/erp/controller/StoreInItemController.java
  8. 127 0
      SERVER/ChickenFarmV3/vb-modules/vb-erp/src/main/java/cn/vber/erp/controller/StoreOutController.java
  9. 103 0
      SERVER/ChickenFarmV3/vb-modules/vb-erp/src/main/java/cn/vber/erp/controller/StoreOutItemController.java
  10. 11 6
      SERVER/ChickenFarmV3/vb-modules/vb-erp/src/main/java/cn/vber/erp/controller/StoreUserController.java
  11. 10 5
      SERVER/ChickenFarmV3/vb-modules/vb-erp/src/main/java/cn/vber/erp/controller/SupplierController.java
  12. 1 1
      SERVER/ChickenFarmV3/vb-modules/vb-erp/src/main/java/cn/vber/erp/domain/ItemInfo.java
  13. 1 1
      SERVER/ChickenFarmV3/vb-modules/vb-erp/src/main/java/cn/vber/erp/domain/StoreHouse.java
  14. 99 0
      SERVER/ChickenFarmV3/vb-modules/vb-erp/src/main/java/cn/vber/erp/domain/StoreIn.java
  15. 89 0
      SERVER/ChickenFarmV3/vb-modules/vb-erp/src/main/java/cn/vber/erp/domain/StoreInItem.java
  16. 104 0
      SERVER/ChickenFarmV3/vb-modules/vb-erp/src/main/java/cn/vber/erp/domain/StoreOut.java
  17. 89 0
      SERVER/ChickenFarmV3/vb-modules/vb-erp/src/main/java/cn/vber/erp/domain/StoreOutItem.java
  18. 2 2
      SERVER/ChickenFarmV3/vb-modules/vb-erp/src/main/java/cn/vber/erp/domain/bo/ItemInfoBo.java
  19. 1 1
      SERVER/ChickenFarmV3/vb-modules/vb-erp/src/main/java/cn/vber/erp/domain/bo/StoreHouseBo.java
  20. 107 0
      SERVER/ChickenFarmV3/vb-modules/vb-erp/src/main/java/cn/vber/erp/domain/bo/StoreInBo.java
  21. 89 0
      SERVER/ChickenFarmV3/vb-modules/vb-erp/src/main/java/cn/vber/erp/domain/bo/StoreInItemBo.java
  22. 112 0
      SERVER/ChickenFarmV3/vb-modules/vb-erp/src/main/java/cn/vber/erp/domain/bo/StoreOutBo.java
  23. 89 0
      SERVER/ChickenFarmV3/vb-modules/vb-erp/src/main/java/cn/vber/erp/domain/bo/StoreOutItemBo.java
  24. 16 12
      SERVER/ChickenFarmV3/vb-modules/vb-erp/src/main/java/cn/vber/erp/domain/vo/ItemInfoVo.java
  25. 6 1
      SERVER/ChickenFarmV3/vb-modules/vb-erp/src/main/java/cn/vber/erp/domain/vo/StoreHouseVo.java
  26. 113 0
      SERVER/ChickenFarmV3/vb-modules/vb-erp/src/main/java/cn/vber/erp/domain/vo/StoreInItemVo.java
  27. 131 0
      SERVER/ChickenFarmV3/vb-modules/vb-erp/src/main/java/cn/vber/erp/domain/vo/StoreInVo.java
  28. 113 0
      SERVER/ChickenFarmV3/vb-modules/vb-erp/src/main/java/cn/vber/erp/domain/vo/StoreOutItemVo.java
  29. 135 0
      SERVER/ChickenFarmV3/vb-modules/vb-erp/src/main/java/cn/vber/erp/domain/vo/StoreOutVo.java
  30. 22 0
      SERVER/ChickenFarmV3/vb-modules/vb-erp/src/main/java/cn/vber/erp/mapper/StoreHouseMapper.java
  31. 28 0
      SERVER/ChickenFarmV3/vb-modules/vb-erp/src/main/java/cn/vber/erp/mapper/StoreInItemMapper.java
  32. 17 0
      SERVER/ChickenFarmV3/vb-modules/vb-erp/src/main/java/cn/vber/erp/mapper/StoreInMapper.java
  33. 19 0
      SERVER/ChickenFarmV3/vb-modules/vb-erp/src/main/java/cn/vber/erp/mapper/StoreOutItemMapper.java
  34. 17 0
      SERVER/ChickenFarmV3/vb-modules/vb-erp/src/main/java/cn/vber/erp/mapper/StoreOutMapper.java
  35. 2 0
      SERVER/ChickenFarmV3/vb-modules/vb-erp/src/main/java/cn/vber/erp/service/IItemInfoService.java
  36. 6 0
      SERVER/ChickenFarmV3/vb-modules/vb-erp/src/main/java/cn/vber/erp/service/IStoreHouseService.java
  37. 51 0
      SERVER/ChickenFarmV3/vb-modules/vb-erp/src/main/java/cn/vber/erp/service/IStoreInItemService.java
  38. 57 0
      SERVER/ChickenFarmV3/vb-modules/vb-erp/src/main/java/cn/vber/erp/service/IStoreInService.java
  39. 49 0
      SERVER/ChickenFarmV3/vb-modules/vb-erp/src/main/java/cn/vber/erp/service/IStoreOutItemService.java
  40. 57 0
      SERVER/ChickenFarmV3/vb-modules/vb-erp/src/main/java/cn/vber/erp/service/IStoreOutService.java
  41. 90 5
      SERVER/ChickenFarmV3/vb-modules/vb-erp/src/main/java/cn/vber/erp/service/impl/ItemInfoServiceImpl.java
  42. 37 5
      SERVER/ChickenFarmV3/vb-modules/vb-erp/src/main/java/cn/vber/erp/service/impl/StoreHouseServiceImpl.java
  43. 118 0
      SERVER/ChickenFarmV3/vb-modules/vb-erp/src/main/java/cn/vber/erp/service/impl/StoreInItemServiceImpl.java
  44. 218 0
      SERVER/ChickenFarmV3/vb-modules/vb-erp/src/main/java/cn/vber/erp/service/impl/StoreInServiceImpl.java
  45. 118 0
      SERVER/ChickenFarmV3/vb-modules/vb-erp/src/main/java/cn/vber/erp/service/impl/StoreOutItemServiceImpl.java
  46. 213 0
      SERVER/ChickenFarmV3/vb-modules/vb-erp/src/main/java/cn/vber/erp/service/impl/StoreOutServiceImpl.java
  47. 7 0
      SERVER/ChickenFarmV3/vb-modules/vb-erp/src/main/resources/mapper/erp/StoreInItemMapper.xml
  48. 7 0
      SERVER/ChickenFarmV3/vb-modules/vb-erp/src/main/resources/mapper/erp/StoreInMapper.xml
  49. 7 0
      SERVER/ChickenFarmV3/vb-modules/vb-erp/src/main/resources/mapper/erp/StoreOutItemMapper.xml
  50. 7 0
      SERVER/ChickenFarmV3/vb-modules/vb-erp/src/main/resources/mapper/erp/StoreOutMapper.xml
  51. 74 0
      UI/VB.VUE/src/api/base/_unitInfo.ts
  52. 4 1
      UI/VB.VUE/src/api/base/index.ts
  53. 7 0
      UI/VB.VUE/src/api/erp/_itemInfo.ts
  54. 16 0
      UI/VB.VUE/src/api/erp/_storeHouse.ts
  55. 85 0
      UI/VB.VUE/src/api/erp/_storeIn.ts
  56. 67 0
      UI/VB.VUE/src/api/erp/_storeInItem.ts
  57. 84 0
      UI/VB.VUE/src/api/erp/_storeOut.ts
  58. 67 0
      UI/VB.VUE/src/api/erp/_storeOutItem.ts
  59. 8 0
      UI/VB.VUE/src/api/erp/_supplier.ts
  60. 13 1
      UI/VB.VUE/src/api/erp/index.ts
  61. 65 0
      UI/VB.VUE/src/views/erp/store/inOutStore/_common.ts
  62. 1209 0
      UI/VB.VUE/src/views/erp/store/inOutStore/_storeIn.vue
  63. 7 0
      UI/VB.VUE/src/views/erp/store/inOutStore/storeIn.vue
  64. 47 29
      UI/VB.VUE/src/views/erp/store/itemInfo/index.vue
  65. 2 2
      UI/VB.VUE/src/views/erp/store/project/index.vue
  66. 31 4
      UI/VB.VUE/src/views/erp/store/storeHouse/index.vue
  67. 2 2
      UI/VB.VUE/src/views/erp/store/storeUser/index.vue
  68. 320 0
      UI/VB.VUE/src/views/erp/store/unitInfo/index.vue

+ 35 - 0
SERVER/ChickenFarmV3/.script/sql/new/data.sql

@@ -24,6 +24,9 @@ INSERT INTO `sys_config` VALUES (1, '000000', '用户管理-账号初始密码',
 INSERT INTO `sys_config` VALUES (2, '000000', '账号自助-是否开启用户注册功能', 'sys.account.registerUser', 'false', 'Y', 100, 1, '2025-07-10 14:59:14', NULL, NULL, '是否开启注册用户功能(true开启,false关闭)');
 INSERT INTO `sys_config` VALUES (3, '000000', 'OSS预览列表资源开关', 'sys.oss.previewListResource', 'true', 'Y', 100, 1, '2025-07-10 14:59:14', NULL, NULL, 'true:开启, false:关闭');
 
+INSERT INTO `sys_config` VALUES (12, '000000', '可入孵出库的蛋类型', 'breeding:eggStore:incubation:eggType', '1,2,3', 'Y', 100, 1, '2025-10-15 12:00:00', NULL, NULL, '维修人员ID');
+INSERT INTO `sys_config` VALUES (13, '000000', '仓库管理人员Ids', 'erp:Store:userIds', '1,2,3', 'Y', 100, 1, '2025-10-15 12:00:00', NULL, NULL, '维修人员ID');
+
 
 -- ----------------------------
 -- Records of sys_dict_data
@@ -195,6 +198,38 @@ INSERT INTO `sys_dict_data` VALUES (531, '000000', 1, '实体物品', '1', 'item
 INSERT INTO `sys_dict_data` VALUES (532, '000000', 2, '虚拟物品', '2', 'item_type', NULL, 'info', 'Y', 100, 1, '2025-07-21 09:53:31', 1, '2025-07-21 09:53:31', NULL);
 INSERT INTO `sys_dict_data` VALUES (533, '000000', 9, '其它', '3', 'item_type', NULL, 'primary', 'Y', 100, 1, '2025-07-21 09:53:31', 1, '2025-07-21 09:53:31', NULL);
 
+INSERT INTO `sys_dict_type` VALUES (540, '000000', '单位类型', 'unit_type', 100, 1, '2025-07-21 09:53:04', 1, '2025-07-21 09:53:04', '供应商等级分类(1:一级, 2:二级, 3:三级)');
+INSERT INTO `sys_dict_data` VALUES (541, '000000', 1, '长度', '1', 'unit_type', NULL, 'warning', 'Y', 100, 1, '2025-07-21 09:53:31', 1, '2025-07-21 09:53:31', NULL);
+INSERT INTO `sys_dict_data` VALUES (542, '000000', 2, '重量', '2', 'unit_type', NULL, 'info', 'Y', 100, 1, '2025-07-21 09:53:31', 1, '2025-07-21 09:53:31', NULL);
+INSERT INTO `sys_dict_data` VALUES (543, '000000', 3, '体积', '3', 'unit_type', NULL, 'primary', 'Y', 100, 1, '2025-07-21 09:53:31', 1, '2025-07-21 09:53:31', NULL);
+INSERT INTO `sys_dict_data` VALUES (544, '000000', 4, '通用数量', '4', 'unit_type', NULL, 'primary', 'Y', 100, 1, '2025-07-21 09:53:31', 1, '2025-07-21 09:53:31', NULL);
+
+
+INSERT INTO `sys_dict_type` VALUES (550, '000000', '入库业务类型', 'in_business_type', 100, 1, '2025-07-21 09:53:04', 1, '2025-07-21 09:53:04', '入库业务类型 普通采购、定期采购等');
+INSERT INTO `sys_dict_data` VALUES (551, '000000', 1, '普通采购', '1', 'in_business_type', NULL, 'warning', 'Y', 100, 1, '2025-07-21 09:53:31', 1, '2025-07-21 09:53:31', NULL);
+INSERT INTO `sys_dict_data` VALUES (552, '000000', 2, '定期采购', '2', 'in_business_type', NULL, 'info', 'Y', 100, 1, '2025-07-21 09:53:31', 1, '2025-07-21 09:53:31', NULL);
+
+
+INSERT INTO `sys_dict_type` VALUES (560, '000000', '入库种类', 'in_store_type', 100, 1, '2025-07-21 09:53:04', 1, '2025-07-21 09:53:04', '入库种类:(采购等)');
+INSERT INTO `sys_dict_data` VALUES (561, '000000', 1, '采购', '1', 'in_store_type', NULL, 'warning', 'Y', 100, 1, '2025-07-21 09:53:31', 1, '2025-07-21 09:53:31', NULL);
+INSERT INTO `sys_dict_data` VALUES (562, '000000', 2, '加工', '2', 'in_store_type', NULL, 'info', 'Y', 100, 1, '2025-07-21 09:53:31', 1, '2025-07-21 09:53:31', NULL);
+
+
+INSERT INTO `sys_dict_type` VALUES (570, '000000', '出库业务类型', 'out_business_type', 100, 1, '2025-07-21 09:53:04', 1, '2025-07-21 09:53:04', '出库业务类型 直接领料,生产补料等');
+INSERT INTO `sys_dict_data` VALUES (571, '000000', 1, '直接领料', '1', 'out_business_type', NULL, 'warning', 'Y', 100, 1, '2025-07-21 09:53:31', 1, '2025-07-21 09:53:31', NULL);
+INSERT INTO `sys_dict_data` VALUES (572, '000000', 2, '生产补料', '2', 'out_business_type', NULL, 'info', 'Y', 100, 1, '2025-07-21 09:53:31', 1, '2025-07-21 09:53:31', NULL);
+
+
+INSERT INTO `sys_dict_type` VALUES (580, '000000', '出库种类', 'out_store_type', 100, 1, '2025-07-21 09:53:04', 1, '2025-07-21 09:53:04', '入库类别:(材料出库等)');
+INSERT INTO `sys_dict_data` VALUES (581, '000000', 1, '材料出库', '1', 'out_store_type', NULL, 'warning', 'Y', 100, 1, '2025-07-21 09:53:31', 1, '2025-07-21 09:53:31', NULL);
+
+INSERT INTO `sys_dict_type` VALUES (590, '000000', '仓库出入库状态', 'store_in_out_status', 100, 1, '2025-07-21 09:53:04', 1, '2025-07-21 09:53:04', '出入库状态:(0:待审核 1:通过 2:未通过)');
+INSERT INTO `sys_dict_data` VALUES (591, '000000', 1, '待审核', '1', 'store_in_out_status', NULL, 'primary', 'Y', 100, 1, '2025-07-21 09:53:31', 1, '2025-07-21 09:53:31', NULL);
+INSERT INTO `sys_dict_data` VALUES (592, '000000', 2, '通过', '2', 'store_in_out_status', NULL, 'success', 'Y', 100, 1, '2025-07-21 09:53:31', 1, '2025-07-21 09:53:31', NULL);
+INSERT INTO `sys_dict_data` VALUES (593, '000000', 3, '未通过', '3', 'store_in_out_status', NULL, 'warning', 'Y', 100, 1, '2025-07-21 09:53:31', 1, '2025-07-21 09:53:31', NULL);
+INSERT INTO `sys_dict_data` VALUES (594, '000000', 4, '作废', '4', 'store_in_out_status', NULL, 'info', 'Y', 100, 1, '2025-07-21 09:53:31', 1, '2025-07-21 09:53:31', NULL);
+
+
 
 -- ----------------------------
 -- Records of sys_client

+ 30 - 0
SERVER/ChickenFarmV3/.script/sql/new/sysmenu.sql

@@ -417,4 +417,34 @@ INSERT INTO `sys_menu` VALUES (2342, '新增物品', 605, 1, '#', NULL, '', 1, 0
 INSERT INTO `sys_menu` VALUES (2343, '修改物品', 605, 2, '#', NULL, '', 1, 0, 'F', '0', '0', 'erp:itemInfo:edit', 'pencil-square', 'btn btn-light-success', 'handleUpdate@1', 100, 1, '2025-10-15 15:02:26', NULL, '2025-10-15 15:02:26', '');
 INSERT INTO `sys_menu` VALUES (2344, '删除物品', 605, 3, '#', NULL, '', 1, 0, 'F', '0', '0', 'erp:itemInfo:remove', 'dash-square', 'btn btn-light-danger', 'handleDelete@0', 100, 1, '2025-10-15 15:02:26', NULL, '2025-10-15 15:02:26', '');
 
+INSERT INTO `sys_menu` VALUES (606, '计量单位管理', 41, 5, 'unitInfo', 'erp/store/unitInfo/index', '', 1, 0, 'C', '0', '0', 'erp:unitInfo', '#', NULL, NULL, 100, 1, '2025-10-15 15:02:26', NULL, '2025-10-15 15:02:26', '');
+INSERT INTO `sys_menu` VALUES (2351, '查询单位', 606, 0, '#', NULL, '', 1, 0, 'F', '0', '0', 'erp:unitInfo:query', 'eye', '', '', 100, 1, '2025-10-15 15:02:26', NULL, '2025-10-15 15:02:26', '');
+INSERT INTO `sys_menu` VALUES (2352, '新增单位', 606, 1, '#', NULL, '', 1, 0, 'F', '0', '0', 'erp:unitInfo:add', 'plus-square', 'btn btn-light-primary', 'handleCreate', 100, 1, '2025-10-15 15:02:26', NULL, '2025-10-15 15:02:26', '');
+INSERT INTO `sys_menu` VALUES (2353, '修改单位', 606, 2, '#', NULL, '', 1, 0, 'F', '0', '0', 'erp:unitInfo:edit', 'pencil-square', 'btn btn-light-success', 'handleUpdate@1', 100, 1, '2025-10-15 15:02:26', NULL, '2025-10-15 15:02:26', '');
+INSERT INTO `sys_menu` VALUES (2354, '删除单位', 606, 3, '#', NULL, '', 1, 0, 'F', '0', '0', 'erp:unitInfo:remove', 'dash-square', 'btn btn-light-danger', 'handleDelete@0', 100, 1, '2025-10-15 15:02:26', NULL, '2025-10-15 15:02:26', '');
+
+INSERT INTO `sys_menu` VALUES (607, '入库管理', 41, 6, 'inStore', 'erp/store/inOutStore/storeIn', '', 1, 0, 'C', '0', '0', 'erp:storeIn', '#', NULL, NULL, 100, 1, '2025-10-15 15:02:26', NULL, '2025-10-15 15:02:26', '');
+INSERT INTO `sys_menu` VALUES (2361, '查询入库', 607, 0, '#', NULL, '', 1, 0, 'F', '0', '0', 'erp:storeIn:query', 'eye', '', '', 100, 1, '2025-10-15 15:02:26', NULL, '2025-10-15 15:02:26', '');
+INSERT INTO `sys_menu` VALUES (2362, '新增入库', 607, 1, '#', NULL, '', 1, 0, 'F', '0', '0', 'erp:storeIn:add', 'plus-square', 'btn btn-light-primary', 'handleCreate', 100, 1, '2025-10-15 15:02:26', NULL, '2025-10-15 15:02:26', '');
+INSERT INTO `sys_menu` VALUES (2363, '修改入库', 607, 2, '#', NULL, '', 1, 0, 'F', '0', '0', 'erp:storeIn:edit', 'pencil-square', 'btn btn-light-success', 'handleUpdate@1', 100, 1, '2025-10-15 15:02:26', NULL, '2025-10-15 15:02:26', '');
+INSERT INTO `sys_menu` VALUES (2364, '删除入库', 607, 3, '#', NULL, '', 1, 0, 'F', '0', '0', 'erp:storeIn:remove', 'dash-square', 'btn btn-light-danger', 'handleDelete@0', 100, 1, '2025-10-15 15:02:26', NULL, '2025-10-15 15:02:26', '');
+
+INSERT INTO `sys_menu` VALUES (608, '入库审核管理', 41, 7, 'inStoreAudit', 'erp/store/inOutStore/storeInAudit', '', 1, 0, 'C', '0', '0', 'erp:storeIn', '#', NULL, NULL, 100, 1, '2025-10-15 15:02:26', NULL, '2025-10-15 15:02:26', '');
+INSERT INTO `sys_menu` VALUES (2371, '查询入库', 608, 0, '#', NULL, '', 1, 0, 'F', '0', '0', 'erp:storeIn:query', 'eye', '', '', 100, 1, '2025-10-15 15:02:26', NULL, '2025-10-15 15:02:26', '');
+INSERT INTO `sys_menu` VALUES (2372, '入库审核', 608, 1, '#', NULL, '', 1, 0, 'F', '0', '0', 'erp:storeIn:audit', 'pencil-square', 'btn btn-light-success', 'handleUpdate@1', 100, 1, '2025-10-15 15:02:26', NULL, '2025-10-15 15:02:26', '');
+INSERT INTO `sys_menu` VALUES (2373, '拒绝入库', 608, 2, '#', NULL, '', 1, 0, 'F', '0', '0', 'erp:storeIn:reject', 'dash-square', 'btn btn-light-danger', 'handleDelete@0', 100, 1, '2025-10-15 15:02:26', NULL, '2025-10-15 15:02:26', '');
+INSERT INTO `sys_menu` VALUES (2374, '作废入库', 608, 2, '#', NULL, '', 1, 0, 'F', '0', '0', 'erp:storeIn:revoke', 'dash-square', 'btn btn-light-danger', 'handleDelete@0', 100, 1, '2025-10-15 15:02:26', NULL, '2025-10-15 15:02:26', '');
+
+INSERT INTO `sys_menu` VALUES (609, '出库管理', 41, 6, 'outStore', 'erp/store/inOutStore/storeIn', '', 1, 0, 'C', '0', '0', 'erp:storeOut', '#', NULL, NULL, 100, 1, '2025-10-15 15:02:26', NULL, '2025-10-15 15:02:26', '');
+INSERT INTO `sys_menu` VALUES (2381, '查询出库', 609, 0, '#', NULL, '', 1, 0, 'F', '0', '0', 'erp:storeOut:query', 'eye', '', '', 100, 1, '2025-10-15 15:02:26', NULL, '2025-10-15 15:02:26', '');
+INSERT INTO `sys_menu` VALUES (2382, '新增出库', 609, 1, '#', NULL, '', 1, 0, 'F', '0', '0', 'erp:storeOut:add', 'plus-square', 'btn btn-light-primary', 'handleCreate', 100, 1, '2025-10-15 15:02:26', NULL, '2025-10-15 15:02:26', '');
+INSERT INTO `sys_menu` VALUES (2383, '修改出库', 609, 2, '#', NULL, '', 1, 0, 'F', '0', '0', 'erp:storeOut:edit', 'pencil-square', 'btn btn-light-success', 'handleUpdate@1', 100, 1, '2025-10-15 15:02:26', NULL, '2025-10-15 15:02:26', '');
+INSERT INTO `sys_menu` VALUES (2384, '删除出库', 609, 3, '#', NULL, '', 1, 0, 'F', '0', '0', 'erp:storeOut:remove', 'dash-square', 'btn btn-light-danger', 'handleDelete@0', 100, 1, '2025-10-15 15:02:26', NULL, '2025-10-15 15:02:26', '');
+
+INSERT INTO `sys_menu` VALUES (610, '出库审核管理', 41, 7, 'outStoreAudit', 'erp/store/inOutStore/storeInAudit', '', 1, 0, 'C', '0', '0', 'erp:storeOut', '#', NULL, NULL, 100, 1, '2025-10-15 15:02:26', NULL, '2025-10-15 15:02:26', '');
+INSERT INTO `sys_menu` VALUES (2391, '查询出库', 610, 0, '#', NULL, '', 1, 0, 'F', '0', '0', 'erp:storeOut:query', 'eye', '', '', 100, 1, '2025-10-15 15:02:26', NULL, '2025-10-15 15:02:26', '');
+INSERT INTO `sys_menu` VALUES (2392, '出库审核', 610, 1, '#', NULL, '', 1, 0, 'F', '0', '0', 'erp:storeOut:audit', 'pencil-square', 'btn btn-light-success', 'handleUpdate@1', 100, 1, '2025-10-15 15:02:26', NULL, '2025-10-15 15:02:26', '');
+INSERT INTO `sys_menu` VALUES (2393, '拒绝出库', 610, 2, '#', NULL, '', 1, 0, 'F', '0', '0', 'erp:storeOut:reject', 'dash-square', 'btn btn-light-danger', 'handleDelete@0', 100, 1, '2025-10-15 15:02:26', NULL, '2025-10-15 15:02:26', '');
+INSERT INTO `sys_menu` VALUES (2394, '作废出库', 610, 2, '#', NULL, '', 1, 0, 'F', '0', '0', 'erp:storeOut:revoke', 'dash-square', 'btn btn-light-danger', 'handleDelete@0', 100, 1, '2025-10-15 15:02:26', NULL, '2025-10-15 15:02:26', '');
+
 

+ 10 - 5
SERVER/ChickenFarmV3/vb-modules/vb-erp/src/main/java/cn/vber/erp/controller/ItemInfoController.java

@@ -36,15 +36,20 @@ public class ItemInfoController extends BaseController {
 
     private final IItemInfoService itemInfoService;
 
-/**
- * 查询ERP物品主数据(管理各类物品基础信息)列表
- */
-@SaCheckPermission("erp:itemInfo")
-@GetMapping("/list")
+    /**
+     * 查询ERP物品主数据(管理各类物品基础信息)列表
+     */
+    @SaCheckPermission("erp:itemInfo")
+    @GetMapping("/list")
     public TableDataInfo<ItemInfoVo> list(ItemInfoBo bo, PageQuery pageQuery) {
         return itemInfoService.queryPageList(bo, pageQuery);
     }
 
+    @GetMapping("/listByKey/{key}")
+    public R<List<ItemInfoVo>> listByKey(@NotBlank(message = "关键字不能为空") @PathVariable String key){
+       return R.ok(itemInfoService.listByKey(key));
+    }
+
     /**
      * 导出ERP物品主数据(管理各类物品基础信息)列表
      */

+ 11 - 6
SERVER/ChickenFarmV3/vb-modules/vb-erp/src/main/java/cn/vber/erp/controller/ProjectController.java

@@ -2,6 +2,8 @@ package cn.vber.erp.controller;
 
 import java.util.List;
 
+import cn.vber.erp.domain.bo.StoreHouseBo;
+import cn.vber.erp.domain.vo.StoreHouseVo;
 import lombok.RequiredArgsConstructor;
 import jakarta.servlet.http.HttpServletResponse;
 import jakarta.validation.constraints.*;
@@ -36,15 +38,18 @@ public class ProjectController extends BaseController {
 
     private final IProjectService projectService;
 
-/**
- * 查询特殊统计项目(如XX型新品种研发)列表
- */
-@SaCheckPermission("erp:project")
-@GetMapping("/list")
+    /**
+     * 查询特殊统计项目(如XX型新品种研发)列表
+     */
+    @SaCheckPermission("erp:project")
+    @GetMapping("/list")
     public TableDataInfo<ProjectVo> list(ProjectBo bo, PageQuery pageQuery) {
         return projectService.queryPageList(bo, pageQuery);
     }
-
+    @GetMapping("/options")
+    public R<List<ProjectVo>> options(ProjectBo bo) {
+        return R.ok(projectService.queryList(bo));
+    }
     /**
      * 导出特殊统计项目(如XX型新品种研发)列表
      */

+ 21 - 5
SERVER/ChickenFarmV3/vb-modules/vb-erp/src/main/java/cn/vber/erp/controller/StoreHouseController.java

@@ -2,6 +2,9 @@ package cn.vber.erp.controller;
 
 import java.util.List;
 
+import cn.vber.common.core.domain.dto.UserDTO;
+import cn.vber.erp.domain.bo.SupplierBo;
+import cn.vber.erp.domain.vo.SupplierVo;
 import lombok.RequiredArgsConstructor;
 import jakarta.servlet.http.HttpServletResponse;
 import jakarta.validation.constraints.*;
@@ -36,15 +39,28 @@ public class StoreHouseController extends BaseController {
 
     private final IStoreHouseService storeHouseService;
 
-/**
- * 查询仓库信息列表
- */
-@SaCheckPermission("erp:storeHouse")
-@GetMapping("/list")
+    /**
+     * 查询仓库信息列表
+     */
+    @SaCheckPermission("erp:storeHouse")
+    @GetMapping("/list")
     public TableDataInfo<StoreHouseVo> list(StoreHouseBo bo, PageQuery pageQuery) {
         return storeHouseService.queryPageList(bo, pageQuery);
     }
 
+
+    @GetMapping("/options")
+    public R<List<StoreHouseVo>> options(StoreHouseBo bo) {
+        return R.ok(storeHouseService.queryList(bo));
+    }
+
+
+    @SaCheckPermission("erp:storeHouse:query")
+    @GetMapping("/managerOptions")
+    public List<UserDTO> getStoreManager() {
+        return storeHouseService.getStoreManager();
+    }
+
     /**
      * 导出仓库信息列表
      */

+ 127 - 0
SERVER/ChickenFarmV3/vb-modules/vb-erp/src/main/java/cn/vber/erp/controller/StoreInController.java

@@ -0,0 +1,127 @@
+package cn.vber.erp.controller;
+
+import java.util.List;
+
+import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import cn.vber.common.idempotent.annotation.RepeatSubmit;
+import cn.vber.common.log.annotation.Log;
+import cn.vber.common.web.core.BaseController;
+import cn.vber.common.mybatis.core.page.PageQuery;
+import cn.vber.common.core.domain.R;
+import cn.vber.common.core.validate.AddGroup;
+import cn.vber.common.core.validate.EditGroup;
+import cn.vber.common.log.enums.BusinessType;
+import cn.vber.common.excel.utils.ExcelUtil;
+import cn.vber.erp.domain.vo.StoreInVo;
+import cn.vber.erp.domain.bo.StoreInBo;
+import cn.vber.erp.service.IStoreInService;
+import cn.vber.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 入库信息管理
+ *
+ * @author IwbY
+ * @date 2025-10-23
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/erp/storeIn")
+public class StoreInController extends BaseController {
+
+    private final IStoreInService storeInService;
+
+/**
+ * 查询入库信息管理列表
+ */
+@SaCheckPermission("erp:storeIn")
+@GetMapping("/list")
+    public TableDataInfo<StoreInVo> list(StoreInBo bo, PageQuery pageQuery) {
+        return storeInService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 导出入库信息管理列表
+     */
+    @SaCheckPermission("erp:storeIn:export")
+    @Log(title = "入库信息管理", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(StoreInBo bo, HttpServletResponse response) {
+        List<StoreInVo> list = storeInService.queryList(bo);
+        ExcelUtil.exportExcel(list, "入库信息管理", StoreInVo.class, response);
+    }
+
+    /**
+     * 获取入库信息管理详细信息
+     *
+     * @param id 主键
+     */
+    @SaCheckPermission("erp:storeIn:query")
+    @GetMapping("/{id}")
+    public R<StoreInVo> getInfo(@NotNull(message = "主键不能为空") @PathVariable Long id) {
+        return R.ok(storeInService.queryById(id));
+    }
+
+    /**
+     * 新增入库信息管理
+     */
+    @SaCheckPermission("erp:storeIn:add")
+    @Log(title = "入库信息管理", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody StoreInBo bo) {
+        return toAjax(storeInService.insertByBo(bo));
+    }
+
+    /**
+     * 修改入库信息管理
+     */
+    @SaCheckPermission("erp:storeIn:edit")
+    @Log(title = "入库信息管理", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody StoreInBo bo) {
+        return toAjax(storeInService.updateByBo(bo));
+    }
+
+    /**
+     * 删除入库信息管理
+     *
+     * @param ids 主键串
+     */
+    @SaCheckPermission("erp:storeIn:remove")
+    @Log(title = "入库信息管理", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@NotEmpty(message = "主键不能为空") @PathVariable Long[] ids) {
+        return toAjax(storeInService.deleteWithValidByIds(List.of(ids), true));
+    }
+
+    @SaCheckPermission("erp:storeIn:audit")
+    @Log(title = "入库信息管理", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping("/audit/{id}")
+    public R<Void> audit(@NotNull(message = "主键不能为空") @PathVariable Long id) {
+        return toAjax(storeInService.audit(id));
+    }
+
+    @SaCheckPermission("erp:storeIn:reject")
+    @Log(title = "入库信息管理", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping("/reject/{id}")
+    public R<Void> reject(@NotNull(message = "主键不能为空") @PathVariable Long id) {
+        return toAjax(storeInService.reject(id));
+    }
+
+    @SaCheckPermission("erp:storeIn:revoke")
+    @Log(title = "入库信息管理", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping("/revoke/{id}")
+    public R<Void> revoke(@NotNull(message = "主键不能为空") @PathVariable Long id) {
+        return toAjax(storeInService.revoke(id));
+    }
+}

+ 103 - 0
SERVER/ChickenFarmV3/vb-modules/vb-erp/src/main/java/cn/vber/erp/controller/StoreInItemController.java

@@ -0,0 +1,103 @@
+package cn.vber.erp.controller;
+
+import java.util.List;
+
+import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import cn.vber.common.idempotent.annotation.RepeatSubmit;
+import cn.vber.common.log.annotation.Log;
+import cn.vber.common.web.core.BaseController;
+import cn.vber.common.mybatis.core.page.PageQuery;
+import cn.vber.common.core.domain.R;
+import cn.vber.common.core.validate.AddGroup;
+import cn.vber.common.core.validate.EditGroup;
+import cn.vber.common.log.enums.BusinessType;
+import cn.vber.common.excel.utils.ExcelUtil;
+import cn.vber.erp.domain.vo.StoreInItemVo;
+import cn.vber.erp.domain.bo.StoreInItemBo;
+import cn.vber.erp.service.IStoreInItemService;
+import cn.vber.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 入库明细
+ *
+ * @author IwbY
+ * @date 2025-10-23
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/erp/storeInItem")
+public class StoreInItemController extends BaseController {
+
+    private final IStoreInItemService storeInItemService;
+
+/**
+ * 查询入库明细列表
+ */
+@SaCheckPermission("erp:storeInItem")
+@GetMapping("/list")
+    public TableDataInfo<StoreInItemVo> list(StoreInItemBo bo, PageQuery pageQuery) {
+        return storeInItemService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 导出入库明细列表
+     */
+    @SaCheckPermission("erp:storeInItem:export")
+    @Log(title = "入库明细", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(StoreInItemBo bo, HttpServletResponse response) {
+        List<StoreInItemVo> list = storeInItemService.queryList(bo);
+        ExcelUtil.exportExcel(list, "入库明细", StoreInItemVo.class, response);
+    }
+
+    /**
+     * 获取入库明细详细信息
+     *
+     * @param id 主键
+     */
+    @SaCheckPermission("erp:storeInItem:query")
+    @GetMapping("/{id}")
+    public R<StoreInItemVo> getInfo(@NotNull(message = "主键不能为空") @PathVariable Long id) {
+        return R.ok(storeInItemService.queryById(id));
+    }
+
+    /**
+     * 新增入库明细
+     */
+    @SaCheckPermission("erp:storeInItem:add")
+    @Log(title = "入库明细", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody StoreInItemBo bo) {
+        return toAjax(storeInItemService.insertByBo(bo));
+    }
+
+    /**
+     * 修改入库明细
+     */
+    @SaCheckPermission("erp:storeInItem:edit")
+    @Log(title = "入库明细", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody StoreInItemBo bo) {
+        return toAjax(storeInItemService.updateByBo(bo));
+    }
+
+    /**
+     * 删除入库明细
+     *
+     * @param ids 主键串
+     */
+    @SaCheckPermission("erp:storeInItem:remove")
+    @Log(title = "入库明细", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@NotEmpty(message = "主键不能为空") @PathVariable Long[] ids) {
+        return toAjax(storeInItemService.deleteWithValidByIds(List.of(ids), true));
+    }
+}

+ 127 - 0
SERVER/ChickenFarmV3/vb-modules/vb-erp/src/main/java/cn/vber/erp/controller/StoreOutController.java

@@ -0,0 +1,127 @@
+package cn.vber.erp.controller;
+
+import java.util.List;
+
+import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import cn.vber.common.idempotent.annotation.RepeatSubmit;
+import cn.vber.common.log.annotation.Log;
+import cn.vber.common.web.core.BaseController;
+import cn.vber.common.mybatis.core.page.PageQuery;
+import cn.vber.common.core.domain.R;
+import cn.vber.common.core.validate.AddGroup;
+import cn.vber.common.core.validate.EditGroup;
+import cn.vber.common.log.enums.BusinessType;
+import cn.vber.common.excel.utils.ExcelUtil;
+import cn.vber.erp.domain.vo.StoreOutVo;
+import cn.vber.erp.domain.bo.StoreOutBo;
+import cn.vber.erp.service.IStoreOutService;
+import cn.vber.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 出库信息管理
+ *
+ * @author IwbY
+ * @date 2025-10-23
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/erp/storeOut")
+public class StoreOutController extends BaseController {
+
+    private final IStoreOutService storeOutService;
+
+/**
+ * 查询出库信息管理列表
+ */
+@SaCheckPermission("erp:storeOut")
+@GetMapping("/list")
+    public TableDataInfo<StoreOutVo> list(StoreOutBo bo, PageQuery pageQuery) {
+        return storeOutService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 导出出库信息管理列表
+     */
+    @SaCheckPermission("erp:storeOut:export")
+    @Log(title = "出库信息管理", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(StoreOutBo bo, HttpServletResponse response) {
+        List<StoreOutVo> list = storeOutService.queryList(bo);
+        ExcelUtil.exportExcel(list, "出库信息管理", StoreOutVo.class, response);
+    }
+
+    /**
+     * 获取出库信息管理详细信息
+     *
+     * @param id 主键
+     */
+    @SaCheckPermission("erp:storeOut:query")
+    @GetMapping("/{id}")
+    public R<StoreOutVo> getInfo(@NotNull(message = "主键不能为空") @PathVariable Long id) {
+        return R.ok(storeOutService.queryById(id));
+    }
+
+    /**
+     * 新增出库信息管理
+     */
+    @SaCheckPermission("erp:storeOut:add")
+    @Log(title = "出库信息管理", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody StoreOutBo bo) {
+        return toAjax(storeOutService.insertByBo(bo));
+    }
+
+    /**
+     * 修改出库信息管理
+     */
+    @SaCheckPermission("erp:storeOut:edit")
+    @Log(title = "出库信息管理", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody StoreOutBo bo) {
+        return toAjax(storeOutService.updateByBo(bo));
+    }
+
+    /**
+     * 删除出库信息管理
+     *
+     * @param ids 主键串
+     */
+    @SaCheckPermission("erp:storeOut:remove")
+    @Log(title = "出库信息管理", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@NotEmpty(message = "主键不能为空") @PathVariable Long[] ids) {
+        return toAjax(storeOutService.deleteWithValidByIds(List.of(ids), true));
+    }
+
+    @SaCheckPermission("erp:storeOut:audit")
+    @Log(title = "入库信息管理", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping("/audit/{id}")
+    public R<Void> audit(@NotNull(message = "主键不能为空") @PathVariable Long id) {
+        return toAjax(storeOutService.audit(id));
+    }
+
+    @SaCheckPermission("erp:storeOut:reject")
+    @Log(title = "入库信息管理", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping("/reject/{id}")
+    public R<Void> reject(@NotNull(message = "主键不能为空") @PathVariable Long id) {
+        return toAjax(storeOutService.reject(id));
+    }
+
+    @SaCheckPermission("erp:storeOut:revoke")
+    @Log(title = "入库信息管理", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping("/revoke/{id}")
+    public R<Void> revoke(@NotNull(message = "主键不能为空") @PathVariable Long id) {
+        return toAjax(storeOutService.revoke(id));
+    }
+}

+ 103 - 0
SERVER/ChickenFarmV3/vb-modules/vb-erp/src/main/java/cn/vber/erp/controller/StoreOutItemController.java

@@ -0,0 +1,103 @@
+package cn.vber.erp.controller;
+
+import java.util.List;
+
+import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import cn.vber.common.idempotent.annotation.RepeatSubmit;
+import cn.vber.common.log.annotation.Log;
+import cn.vber.common.web.core.BaseController;
+import cn.vber.common.mybatis.core.page.PageQuery;
+import cn.vber.common.core.domain.R;
+import cn.vber.common.core.validate.AddGroup;
+import cn.vber.common.core.validate.EditGroup;
+import cn.vber.common.log.enums.BusinessType;
+import cn.vber.common.excel.utils.ExcelUtil;
+import cn.vber.erp.domain.vo.StoreOutItemVo;
+import cn.vber.erp.domain.bo.StoreOutItemBo;
+import cn.vber.erp.service.IStoreOutItemService;
+import cn.vber.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 出库明细
+ *
+ * @author IwbY
+ * @date 2025-10-23
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/erp/storeOutItem")
+public class StoreOutItemController extends BaseController {
+
+    private final IStoreOutItemService storeOutItemService;
+
+/**
+ * 查询出库明细列表
+ */
+@SaCheckPermission("erp:storeOutItem")
+@GetMapping("/list")
+    public TableDataInfo<StoreOutItemVo> list(StoreOutItemBo bo, PageQuery pageQuery) {
+        return storeOutItemService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 导出出库明细列表
+     */
+    @SaCheckPermission("erp:storeOutItem:export")
+    @Log(title = "出库明细", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(StoreOutItemBo bo, HttpServletResponse response) {
+        List<StoreOutItemVo> list = storeOutItemService.queryList(bo);
+        ExcelUtil.exportExcel(list, "出库明细", StoreOutItemVo.class, response);
+    }
+
+    /**
+     * 获取出库明细详细信息
+     *
+     * @param id 主键
+     */
+    @SaCheckPermission("erp:storeOutItem:query")
+    @GetMapping("/{id}")
+    public R<StoreOutItemVo> getInfo(@NotNull(message = "主键不能为空") @PathVariable Long id) {
+        return R.ok(storeOutItemService.queryById(id));
+    }
+
+    /**
+     * 新增出库明细
+     */
+    @SaCheckPermission("erp:storeOutItem:add")
+    @Log(title = "出库明细", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody StoreOutItemBo bo) {
+        return toAjax(storeOutItemService.insertByBo(bo));
+    }
+
+    /**
+     * 修改出库明细
+     */
+    @SaCheckPermission("erp:storeOutItem:edit")
+    @Log(title = "出库明细", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody StoreOutItemBo bo) {
+        return toAjax(storeOutItemService.updateByBo(bo));
+    }
+
+    /**
+     * 删除出库明细
+     *
+     * @param ids 主键串
+     */
+    @SaCheckPermission("erp:storeOutItem:remove")
+    @Log(title = "出库明细", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@NotEmpty(message = "主键不能为空") @PathVariable Long[] ids) {
+        return toAjax(storeOutItemService.deleteWithValidByIds(List.of(ids), true));
+    }
+}

+ 11 - 6
SERVER/ChickenFarmV3/vb-modules/vb-erp/src/main/java/cn/vber/erp/controller/StoreUserController.java

@@ -2,6 +2,8 @@ package cn.vber.erp.controller;
 
 import java.util.List;
 
+import cn.vber.erp.domain.bo.ProjectBo;
+import cn.vber.erp.domain.vo.ProjectVo;
 import lombok.RequiredArgsConstructor;
 import jakarta.servlet.http.HttpServletResponse;
 import jakarta.validation.constraints.*;
@@ -36,15 +38,18 @@ public class StoreUserController extends BaseController {
 
     private final IStoreUserService storeUserService;
 
-/**
- * 查询用户管理列表
- */
-@SaCheckPermission("erp:storeUser")
-@GetMapping("/list")
+    /**
+     * 查询用户管理列表
+     */
+    @SaCheckPermission("erp:storeUser")
+    @GetMapping("/list")
     public TableDataInfo<StoreUserVo> list(StoreUserBo bo, PageQuery pageQuery) {
         return storeUserService.queryPageList(bo, pageQuery);
     }
-
+    @GetMapping("/options")
+    public R<List<StoreUserVo>> options(StoreUserBo bo) {
+        return R.ok(storeUserService.queryList(bo));
+    }
     /**
      * 导出用户管理列表
      */

+ 10 - 5
SERVER/ChickenFarmV3/vb-modules/vb-erp/src/main/java/cn/vber/erp/controller/SupplierController.java

@@ -36,15 +36,20 @@ public class SupplierController extends BaseController {
 
     private final ISupplierService erpSupplierService;
 
-/**
- * 查询供应商管理列表
- */
-@SaCheckPermission("erp:supplier")
-@GetMapping("/list")
+    /**
+     * 查询供应商管理列表
+     */
+    @SaCheckPermission("erp:supplier")
+    @GetMapping("/list")
     public TableDataInfo<SupplierVo> list(SupplierBo bo, PageQuery pageQuery) {
         return erpSupplierService.queryPageList(bo, pageQuery);
     }
 
+    @GetMapping("/options")
+    public R<List<SupplierVo>> options(SupplierBo bo) {
+        return R.ok(erpSupplierService.queryList(bo));
+    }
+
     /**
      * 导出供应商管理列表
      */

+ 1 - 1
SERVER/ChickenFarmV3/vb-modules/vb-erp/src/main/java/cn/vber/erp/domain/ItemInfo.java

@@ -40,7 +40,7 @@ import java.io.Serial;
         /**
          * 计量单位
          */
-        private String unit;
+        private Long unitId;
 
         /**
          * 易记编码

+ 1 - 1
SERVER/ChickenFarmV3/vb-modules/vb-erp/src/main/java/cn/vber/erp/domain/StoreHouse.java

@@ -45,7 +45,7 @@ import java.io.Serial;
                 /**
                  * 负责人
                  */
-        private String manger;
+        private Long manger;
 
                 /**
                  * 备注

+ 99 - 0
SERVER/ChickenFarmV3/vb-modules/vb-erp/src/main/java/cn/vber/erp/domain/StoreIn.java

@@ -0,0 +1,99 @@
+package cn.vber.erp.domain;
+
+    import cn.vber.common.mybatis.core.domain.BaseEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+    import java.util.Date;
+    import com.fasterxml.jackson.annotation.JsonFormat;
+
+import java.io.Serial;
+
+/**
+ * 入库信息管理对象 erp_store_in
+ *
+ * @author IwbY
+ * @date 2025-10-23
+ */
+        @Data
+        @EqualsAndHashCode(callSuper = true)
+        @TableName("erp_store_in")
+        public class StoreIn extends BaseEntity {
+
+        @Serial
+        private static final long serialVersionUID = 1L;
+
+                /**
+                 * 
+                 */
+            @TableId(value = "id")
+        private Long id;
+
+                /**
+                 * 单据编号
+                 */
+        private String receiptNum;
+
+                /**
+                 * 单据日期
+                 */
+        private Date receiptDate;
+
+                /**
+                 * 业务类型:(直接领料,生产补料等,允许用户自定义字典)
+                 */
+        private Long businessType;
+
+                /**
+                 * 
+                 */
+        private Long storeHouseId;
+
+                /**
+                 * 采购等,允许用户自定义字典
+                 */
+        private Long storeType;
+
+                /**
+                 * 供应商
+                 */
+        private Long supplierId;
+
+                /**
+                 * 部门
+                 */
+        private String dept;
+
+                /**
+                 * 制单人
+                 */
+        private Long preparedUser;
+
+                /**
+                 * 审核人
+                 */
+        private Long auditUser;
+
+                /**
+                 * 审核日期
+                 */
+        private Date auditDate;
+
+                /**
+                 * 0:待审核 1:通过 2:未通过
+                 */
+        private Integer status;
+
+                /**
+                 * 备注
+                 */
+        private String remark;
+
+                /**
+                 * 删除标志(0:未删除, 1:已删除)
+                 */
+            @TableLogic
+        private String delFlag;
+
+
+        }

+ 89 - 0
SERVER/ChickenFarmV3/vb-modules/vb-erp/src/main/java/cn/vber/erp/domain/StoreInItem.java

@@ -0,0 +1,89 @@
+package cn.vber.erp.domain;
+
+    import cn.vber.common.mybatis.core.domain.BaseEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+    import java.util.Date;
+    import com.fasterxml.jackson.annotation.JsonFormat;
+
+import java.io.Serial;
+
+/**
+ * 入库明细对象 erp_store_in_item
+ *
+ * @author IwbY
+ * @date 2025-10-23
+ */
+        @Data
+        @EqualsAndHashCode(callSuper = true)
+        @TableName("erp_store_in_item")
+        public class StoreInItem extends BaseEntity {
+
+        @Serial
+        private static final long serialVersionUID = 1L;
+
+                /**
+                 * 
+                 */
+            @TableId(value = "id")
+        private Long id;
+
+                /**
+                 * 入库头表ID
+                 */
+        private Long inId;
+
+                /**
+                 * 物品ID
+                 */
+        private Long itemId;
+
+                /**
+                 * 仓库id
+                 */
+        private Long storeHouseId;
+
+                /**
+                 * 数量
+                 */
+        private Long quantity;
+
+                /**
+                 * 税率
+                 */
+        private Long taxRate;
+
+                /**
+                 * 含税单价
+                 */
+        private Long taxInclusivePrice;
+
+                /**
+                 * 含税金额
+                 */
+        private Long taxInclusiveAmount;
+
+                /**
+                 * 
+                 */
+        private Integer status;
+
+                /**
+                 * 审核时间
+                 */
+        private Date auditDate;
+
+                /**
+                 * 备注
+                 */
+        private String remark;
+
+                /**
+                 * 删除标志(0:未删除, 1:已删除)
+                 */
+            @TableLogic
+        private String delFlag;
+
+
+        }

+ 104 - 0
SERVER/ChickenFarmV3/vb-modules/vb-erp/src/main/java/cn/vber/erp/domain/StoreOut.java

@@ -0,0 +1,104 @@
+package cn.vber.erp.domain;
+
+    import cn.vber.common.mybatis.core.domain.BaseEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+    import java.util.Date;
+    import com.fasterxml.jackson.annotation.JsonFormat;
+
+import java.io.Serial;
+
+/**
+ * 出库信息管理对象 erp_store_out
+ *
+ * @author IwbY
+ * @date 2025-10-23
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("erp_store_out")
+public class StoreOut extends BaseEntity {
+
+        @Serial
+        private static final long serialVersionUID = 1L;
+
+        /**
+         *
+         */
+        @TableId(value = "id")
+        private Long id;
+
+        /**
+         * 单据编号
+         */
+        private String receiptNum;
+
+        /**
+         * 单据日期
+         */
+        private Date receiptDate;
+
+        /**
+         * 业务类型:(直接领料,生产补料等,允许用户自定义字典)
+         */
+        private Long businessType;
+
+        /**
+         *
+         */
+        private Long storeHouseId;
+
+        /**
+         * 出库类别,采购等,允许用户自定义字典
+         */
+        private Long storeType;
+
+        /**
+         * 项目ID
+         */
+        private Long projectId;
+
+        /**
+         * 出库对象 关联到storeUser表
+         */
+        private Long storeUserId;
+
+        /**
+         * 部门
+         */
+        private String dept;
+
+        /**
+         * 制单人
+         */
+        private Long preparedUser;
+
+        /**
+         * 审核人
+         */
+        private Long auditUser;
+
+        /**
+         * 审核日期
+         */
+        private Date auditDate;
+
+        /**
+         * 0:待审核 1:通过 2:未通过
+         */
+        private Integer status;
+
+        /**
+         * 备注
+         */
+        private String remark;
+
+        /**
+         * 删除标志(0:未删除, 1:已删除)
+         */
+        @TableLogic
+        private String delFlag;
+
+
+}

+ 89 - 0
SERVER/ChickenFarmV3/vb-modules/vb-erp/src/main/java/cn/vber/erp/domain/StoreOutItem.java

@@ -0,0 +1,89 @@
+package cn.vber.erp.domain;
+
+    import cn.vber.common.mybatis.core.domain.BaseEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+    import java.util.Date;
+    import com.fasterxml.jackson.annotation.JsonFormat;
+
+import java.io.Serial;
+
+/**
+ * 出库明细对象 erp_store_out_item
+ *
+ * @author IwbY
+ * @date 2025-10-23
+ */
+        @Data
+        @EqualsAndHashCode(callSuper = true)
+        @TableName("erp_store_out_item")
+        public class StoreOutItem extends BaseEntity {
+
+        @Serial
+        private static final long serialVersionUID = 1L;
+
+                /**
+                 * 
+                 */
+            @TableId(value = "id")
+        private Long id;
+
+                /**
+                 * 出库头表ID
+                 */
+        private Long outId;
+
+                /**
+                 * 物品ID
+                 */
+        private Long itemId;
+
+                /**
+                 * 仓库id
+                 */
+        private Long storeHouseId;
+
+                /**
+                 * 出库数量
+                 */
+        private Long quantity;
+
+                /**
+                 * 税率
+                 */
+        private Long taxRate;
+
+                /**
+                 * 含税单价
+                 */
+        private Long taxInclusivePrice;
+
+                /**
+                 * 含税金额
+                 */
+        private Long taxInclusiveAmount;
+
+                /**
+                 * 
+                 */
+        private Integer status;
+
+                /**
+                 * 审核时间
+                 */
+        private Date auditDate;
+
+                /**
+                 * 备注
+                 */
+        private String remark;
+
+                /**
+                 * 删除标志(0:未删除, 1:已删除)
+                 */
+            @TableLogic
+        private String delFlag;
+
+
+        }

+ 2 - 2
SERVER/ChickenFarmV3/vb-modules/vb-erp/src/main/java/cn/vber/erp/domain/bo/ItemInfoBo.java

@@ -41,8 +41,8 @@ public class ItemInfoBo extends BaseEntity {
             /**
              * 计量单位
              */
-                @NotBlank(message = "计量单位不能为空", groups = { AddGroup.class, EditGroup.class })
-        private String unit;
+//                @NotBlank(message = "计量单位不能为空", groups = { AddGroup.class, EditGroup.class })
+        private  Long unitId;
 
             /**
              * 易记编码

+ 1 - 1
SERVER/ChickenFarmV3/vb-modules/vb-erp/src/main/java/cn/vber/erp/domain/bo/StoreHouseBo.java

@@ -48,7 +48,7 @@ public class StoreHouseBo extends BaseEntity {
             /**
              * 负责人
              */
-        private String manger;
+        private Long manger;
 
             /**
              * 备注

+ 107 - 0
SERVER/ChickenFarmV3/vb-modules/vb-erp/src/main/java/cn/vber/erp/domain/bo/StoreInBo.java

@@ -0,0 +1,107 @@
+package cn.vber.erp.domain.bo;
+
+import cn.vber.erp.domain.StoreIn;
+import cn.vber.common.mybatis.core.domain.BaseEntity;
+import cn.vber.common.core.validate.AddGroup;
+import cn.vber.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+import java.util.Date;
+import java.util.List;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+/**
+ * 入库信息管理业务对象 erp_store_in
+ *
+ * @author IwbY
+ * @date 2025-10-23
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = StoreIn.class,reverseConvertGenerate =false)
+
+public class StoreInBo extends BaseEntity {
+
+            /**
+             * 
+             */
+                @NotNull(message = "不能为空", groups = { EditGroup.class })
+        private Long id;
+
+            /**
+             * 单据编号
+             */
+                @NotBlank(message = "单据编号不能为空", groups = { AddGroup.class, EditGroup.class })
+        private String receiptNum;
+
+            /**
+             * 单据日期
+             */
+                @NotNull(message = "单据日期不能为空", groups = { AddGroup.class, EditGroup.class })
+            @JsonFormat(pattern = "yyyy-MM-dd")
+        private Date receiptDate;
+
+            /**
+             * 业务类型:(直接领料,生产补料等,允许用户自定义字典)
+             */
+                @NotNull(message = "业务类型:(直接领料,生产补料等,允许用户自定义字典)不能为空", groups = { AddGroup.class, EditGroup.class })
+        private Long businessType;
+
+            /**
+             * 
+             */
+                @NotNull(message = "不能为空", groups = { AddGroup.class, EditGroup.class })
+        private Long storeHouseId;
+
+            /**
+             * 采购等,允许用户自定义字典
+             */
+                @NotNull(message = "采购等,允许用户自定义字典不能为空", groups = { AddGroup.class, EditGroup.class })
+        private Long storeType;
+
+            /**
+             * 供应商
+             */
+                @NotNull(message = "供应商不能为空", groups = { AddGroup.class, EditGroup.class })
+        private Long supplierId;
+
+            /**
+             * 部门
+             */
+        private String dept;
+
+            /**
+             * 制单人
+             */
+        private Long preparedUser;
+
+            /**
+             * 审核人
+             */
+        private Long auditUser;
+
+            /**
+             * 审核日期
+             */
+            @JsonFormat(pattern = "yyyy-MM-dd")
+        private Date auditDate;
+
+            /**
+             * 0:待审核 1:通过 2:未通过
+             */
+                @NotNull(message = "0:待审核 1:通过 2:未通过不能为空", groups = { AddGroup.class, EditGroup.class })
+        private Long status;
+
+            /**
+             * 备注
+             */
+        private String remark;
+
+
+        private List<StoreInItemBo> itemInfo;
+
+
+}

+ 89 - 0
SERVER/ChickenFarmV3/vb-modules/vb-erp/src/main/java/cn/vber/erp/domain/bo/StoreInItemBo.java

@@ -0,0 +1,89 @@
+package cn.vber.erp.domain.bo;
+
+import cn.vber.erp.domain.StoreInItem;
+import cn.vber.common.mybatis.core.domain.BaseEntity;
+import cn.vber.common.core.validate.AddGroup;
+import cn.vber.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+/**
+ * 入库明细业务对象 erp_store_in_item
+ *
+ * @author IwbY
+ * @date 2025-10-23
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = StoreInItem.class,reverseConvertGenerate =false)
+
+public class StoreInItemBo extends BaseEntity {
+
+            /**
+             * 
+             */
+                @NotNull(message = "不能为空", groups = { EditGroup.class })
+        private Long id;
+
+            /**
+             * 入库头表ID
+             */
+                @NotNull(message = "入库头表ID不能为空", groups = { AddGroup.class, EditGroup.class })
+        private Long inId;
+
+            /**
+             * 物品ID
+             */
+                @NotNull(message = "物品ID不能为空", groups = { AddGroup.class, EditGroup.class })
+        private Long itemId;
+
+            /**
+             * 仓库id
+             */
+                @NotNull(message = "仓库id不能为空", groups = { AddGroup.class, EditGroup.class })
+        private Long storeHouseId;
+
+            /**
+             * 数量
+             */
+                @NotNull(message = "数量不能为空", groups = { AddGroup.class, EditGroup.class })
+        private Long quantity;
+
+            /**
+             * 税率
+             */
+        private Long taxRate;
+
+            /**
+             * 含税单价
+             */
+        private Long taxInclusivePrice;
+
+            /**
+             * 含税金额
+             */
+        private Long taxInclusiveAmount;
+
+            /**
+             * 
+             */
+                @NotNull(message = "不能为空", groups = { AddGroup.class, EditGroup.class })
+        private Integer status;
+
+            /**
+             * 审核时间
+             */
+            @JsonFormat(pattern = "yyyy-MM-dd")
+        private Date auditDate;
+
+            /**
+             * 备注
+             */
+        private String remark;
+
+
+}

+ 112 - 0
SERVER/ChickenFarmV3/vb-modules/vb-erp/src/main/java/cn/vber/erp/domain/bo/StoreOutBo.java

@@ -0,0 +1,112 @@
+package cn.vber.erp.domain.bo;
+
+import cn.vber.erp.domain.StoreOut;
+import cn.vber.common.mybatis.core.domain.BaseEntity;
+import cn.vber.common.core.validate.AddGroup;
+import cn.vber.common.core.validate.EditGroup;
+import cn.vber.erp.domain.StoreOutItem;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+import java.util.Date;
+import java.util.List;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+/**
+ * 出库信息管理业务对象 erp_store_out
+ *
+ * @author IwbY
+ * @date 2025-10-23
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = StoreOut.class,reverseConvertGenerate =false)
+
+public class StoreOutBo extends BaseEntity {
+
+    /**
+     *
+     */
+    @NotNull(message = "不能为空", groups = {EditGroup.class})
+    private Long id;
+
+    /**
+     * 单据编号
+     */
+    @NotBlank(message = "单据编号不能为空", groups = {AddGroup.class, EditGroup.class})
+    private String receiptNum;
+
+    /**
+     * 单据日期
+     */
+    @NotBlank(message = "单据日期不能为空", groups = {AddGroup.class, EditGroup.class})
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date receiptDate;
+
+    /**
+     * 业务类型:(直接领料,生产补料等,允许用户自定义字典)
+     */
+    @NotNull(message = "业务类型:(直接领料,生产补料等,允许用户自定义字典)不能为空", groups = {AddGroup.class, EditGroup.class})
+    private Long businessType;
+
+    /**
+     *
+     */
+    @NotNull(message = "不能为空", groups = {AddGroup.class, EditGroup.class})
+    private Long storeHouseId;
+
+    /**
+     * 出库类别,采购等,允许用户自定义字典
+     */
+    @NotNull(message = "出库类别,采购等,允许用户自定义字典不能为空", groups = {AddGroup.class, EditGroup.class})
+    private Long storeType;
+
+    /**
+     * 出库对象 关联到storeUser表
+     */
+    private Long storeUserId;
+
+    /**
+     * 项目ID
+     */
+    @NotNull(message = "项目ID不能为空", groups = {AddGroup.class, EditGroup.class})
+    private Long projectId;
+
+    /**
+     * 部门
+     */
+    private String dept;
+
+    /**
+     * 制单人
+     */
+    private Long preparedUser;
+
+    /**
+     * 审核人
+     */
+    private Long auditUser;
+
+    /**
+     * 审核日期
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date auditDate;
+
+    /**
+     * 0:待审核 1:通过 2:未通过
+     */
+    @NotNull(message = "0:待审核 1:通过 2:未通过不能为空", groups = {AddGroup.class, EditGroup.class})
+    private Integer status;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    private List<StoreOutItemBo> itemInfo;
+
+
+}

+ 89 - 0
SERVER/ChickenFarmV3/vb-modules/vb-erp/src/main/java/cn/vber/erp/domain/bo/StoreOutItemBo.java

@@ -0,0 +1,89 @@
+package cn.vber.erp.domain.bo;
+
+import cn.vber.erp.domain.StoreOutItem;
+import cn.vber.common.mybatis.core.domain.BaseEntity;
+import cn.vber.common.core.validate.AddGroup;
+import cn.vber.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+/**
+ * 出库明细业务对象 erp_store_out_item
+ *
+ * @author IwbY
+ * @date 2025-10-23
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = StoreOutItem.class,reverseConvertGenerate =false)
+
+public class StoreOutItemBo extends BaseEntity {
+
+            /**
+             * 
+             */
+                @NotNull(message = "不能为空", groups = { EditGroup.class })
+        private Long id;
+
+            /**
+             * 出库头表ID
+             */
+                @NotNull(message = "出库头表ID不能为空", groups = { AddGroup.class, EditGroup.class })
+        private Long outId;
+
+            /**
+             * 物品ID
+             */
+                @NotNull(message = "物品ID不能为空", groups = { AddGroup.class, EditGroup.class })
+        private Long itemId;
+
+            /**
+             * 仓库id
+             */
+                @NotNull(message = "仓库id不能为空", groups = { AddGroup.class, EditGroup.class })
+        private Long storeHouseId;
+
+            /**
+             * 出库数量
+             */
+                @NotNull(message = "出库数量不能为空", groups = { AddGroup.class, EditGroup.class })
+        private Long quantity;
+
+            /**
+             * 税率
+             */
+        private Long taxRate;
+
+            /**
+             * 含税单价
+             */
+        private Long taxInclusivePrice;
+
+            /**
+             * 含税金额
+             */
+        private Long taxInclusiveAmount;
+
+            /**
+             * 
+             */
+                @NotNull(message = "不能为空", groups = { AddGroup.class, EditGroup.class })
+        private Integer status;
+
+            /**
+             * 审核时间
+             */
+            @JsonFormat(pattern = "yyyy-MM-dd")
+        private Date auditDate;
+
+            /**
+             * 备注
+             */
+        private String remark;
+
+
+}

+ 16 - 12
SERVER/ChickenFarmV3/vb-modules/vb-erp/src/main/java/cn/vber/erp/domain/vo/ItemInfoVo.java

@@ -1,5 +1,7 @@
 package cn.vber.erp.domain.vo;
 
+import cn.vber.common.translation.annotation.Translation;
+import cn.vber.common.translation.constant.TransConstant;
 import cn.vber.erp.domain.ItemInfo;
 import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
 import cn.idev.excel.annotation.ExcelProperty;
@@ -31,48 +33,50 @@ public class ItemInfoVo implements Serializable {
             /**
              * 物品ID(主键)
              */
-            @ExcelProperty(value = "物品ID", converter = ExcelDictConvert.class)
-            @ExcelDictFormat(readConverterExp = "主=键")
+        @ExcelProperty(value = "物品ID", converter = ExcelDictConvert.class)
+        @ExcelDictFormat(readConverterExp = "主=键")
         private Long id;
 
             /**
              * 名称
              */
-            @ExcelProperty(value = "名称")
+        @ExcelProperty(value = "名称")
         private String itemName;
 
             /**
              * 规格型号
              */
-            @ExcelProperty(value = "规格型号")
+        @ExcelProperty(value = "规格型号")
         private String specModel;
 
             /**
              * 计量单位
              */
-            @ExcelProperty(value = "计量单位")
-        private String unit;
+        @ExcelProperty(value = "计量单位")
+        private Long unitId;
+
+        @Translation(type = TransConstant.UNIT_ID_TO_NAME,mapper = "unitId",other = "")
+        private String unitName;
 
             /**
              * 易记编码
              */
-            @ExcelProperty(value = "易记编码")
+        @ExcelProperty(value = "易记编码")
         private String easyCode;
 
             /**
              * 物品类型
              */
-            @ExcelProperty(value = "物品类型", converter = ExcelDictConvert.class)
-            @ExcelDictFormat(dictType = "item_type")
+        @ExcelProperty(value = "物品类型", converter = ExcelDictConvert.class)
+        @ExcelDictFormat(dictType = "item_type")
         private Integer itemType;
 
             /**
              * 备注
              */
-            @ExcelProperty(value = "备注")
+        @ExcelProperty(value = "备注")
         private String remark;
 
-            private String pic;
-
+        private String pic;
 
 }

+ 6 - 1
SERVER/ChickenFarmV3/vb-modules/vb-erp/src/main/java/cn/vber/erp/domain/vo/StoreHouseVo.java

@@ -1,5 +1,7 @@
 package cn.vber.erp.domain.vo;
 
+import cn.vber.common.translation.annotation.Translation;
+import cn.vber.common.translation.constant.TransConstant;
 import cn.vber.erp.domain.StoreHouse;
 import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
 import cn.idev.excel.annotation.ExcelProperty;
@@ -57,7 +59,10 @@ public class StoreHouseVo implements Serializable {
              * 负责人
              */
             @ExcelProperty(value = "负责人")
-        private String manger;
+            private Long manger;
+
+            @Translation(type = TransConstant.USER_ID_TO_NICKNAME, mapper = "manger", other = "username")
+            private String mangerName;
 
             /**
              * 备注

+ 113 - 0
SERVER/ChickenFarmV3/vb-modules/vb-erp/src/main/java/cn/vber/erp/domain/vo/StoreInItemVo.java

@@ -0,0 +1,113 @@
+package cn.vber.erp.domain.vo;
+
+    import java.util.Date;
+
+    import cn.vber.common.translation.annotation.Translation;
+    import cn.vber.common.translation.constant.TransConstant;
+    import com.fasterxml.jackson.annotation.JsonFormat;
+import cn.vber.erp.domain.StoreInItem;
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import cn.vber.common.excel.annotation.ExcelDictFormat;
+import cn.vber.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+/**
+ * 入库明细视图对象 erp_store_in_item
+ *
+ * @author IwbY
+ * @date 2025-10-23
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = StoreInItem.class)
+
+public class StoreInItemVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+            /**
+             * 
+             */
+            @ExcelProperty(value = "")
+        private Long id;
+
+            /**
+             * 入库头表ID
+             */
+            @ExcelProperty(value = "入库头表ID")
+        private Long inId;
+
+            /**
+             * 物品ID
+             */
+            @ExcelProperty(value = "物品ID")
+        private Long itemId;
+
+            @Translation(type = TransConstant.ITEMS_ID_TO_INFO,mapper = "itemId", other = "name")
+            private String itemName;
+            @Translation(type = TransConstant.ITEMS_ID_TO_INFO,mapper = "itemId", other = "unitId")
+            private String unitId;
+            @Translation(type = TransConstant.ITEMS_ID_TO_INFO,mapper = "itemId", other = "unitName")
+            private String unitName;
+            @Translation(type = TransConstant.ITEMS_ID_TO_INFO,mapper = "itemId", other = "spec")
+            private String specModel;
+
+            /**
+             * 仓库id
+             */
+            @ExcelProperty(value = "仓库id")
+        private Long storeHouseId;
+
+            /**
+             * 数量
+             */
+            @ExcelProperty(value = "数量")
+        private Long quantity;
+
+            /**
+             * 税率
+             */
+            @ExcelProperty(value = "税率")
+        private Long taxRate;
+
+            /**
+             * 含税单价
+             */
+            @ExcelProperty(value = "含税单价")
+        private Long taxInclusivePrice;
+
+            /**
+             * 含税金额
+             */
+            @ExcelProperty(value = "含税金额")
+        private Long taxInclusiveAmount;
+
+            /**
+             * 
+             */
+            @ExcelProperty(value = "", converter = ExcelDictConvert.class)
+            @ExcelDictFormat(dictType = "store_in_out_status")
+        private Integer status;
+
+            /**
+             * 审核时间
+             */
+            @ExcelProperty(value = "审核时间")
+        private Date auditDate;
+
+            /**
+             * 备注
+             */
+            @ExcelProperty(value = "备注")
+        private String remark;
+
+
+}

+ 131 - 0
SERVER/ChickenFarmV3/vb-modules/vb-erp/src/main/java/cn/vber/erp/domain/vo/StoreInVo.java

@@ -0,0 +1,131 @@
+package cn.vber.erp.domain.vo;
+
+    import java.util.Date;
+
+    import cn.vber.common.translation.annotation.Translation;
+    import cn.vber.common.translation.constant.TransConstant;
+    import com.fasterxml.jackson.annotation.JsonFormat;
+import cn.vber.erp.domain.StoreIn;
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import cn.vber.common.excel.annotation.ExcelDictFormat;
+import cn.vber.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+    import java.util.List;
+
+
+/**
+ * 入库信息管理视图对象 erp_store_in
+ *
+ * @author IwbY
+ * @date 2025-10-23
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = StoreIn.class)
+
+public class StoreInVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+            /**
+             * 
+             */
+            @ExcelProperty(value = "")
+        private Long id;
+
+            /**
+             * 单据编号
+             */
+            @ExcelProperty(value = "单据编号")
+        private String receiptNum;
+
+            /**
+             * 单据日期
+             */
+            @ExcelProperty(value = "单据日期")
+        private Date receiptDate;
+
+            /**
+             * 业务类型:(直接领料,生产补料等,允许用户自定义字典)
+             */
+            @ExcelProperty(value = "业务类型:", converter = ExcelDictConvert.class)
+            @ExcelDictFormat(dictType = "in_business_type")
+        private Long businessType;
+
+            /**
+             * 
+             */
+            @ExcelProperty(value = "")
+        private Long storeHouseId;
+
+            /**
+             * 仓库名称
+             */
+            @Translation(type = TransConstant.STORE_HOUSE_ID_TO_INFO,mapper = "storeHouseId",other="storeHouseName")
+            private String storeHouseName;
+
+            /**
+             * 采购等,允许用户自定义字典
+             */
+            @ExcelProperty(value = "采购等,允许用户自定义字典", converter = ExcelDictConvert.class)
+            @ExcelDictFormat(dictType = "in_store_type")
+        private Long storeType;
+
+            /**
+             * 供应商
+             */
+            @ExcelProperty(value = "供应商")
+        private Long supplierId;
+            @Translation(type = TransConstant.SUPPLIER_ID_TO_INFO,mapper = "supplierId",other="name")
+            private String supplierName;
+
+            /**
+             * 部门
+             */
+            @ExcelProperty(value = "部门")
+        private String dept;
+
+            /**
+             * 制单人
+             */
+            @ExcelProperty(value = "制单人")
+        private Long preparedUser;
+            @Translation(type = TransConstant.USER_ID_TO_NICKNAME,mapper = "preparedUser",other="username")
+            private String preparedUserName;
+
+            /**
+             * 审核人
+             */
+            @ExcelProperty(value = "审核人")
+        private Long auditUser;
+            @Translation(type = TransConstant.USER_ID_TO_NICKNAME,mapper = "auditUser",other="username")
+            private String auditUserName;
+
+            /**
+             * 审核日期
+             */
+            @ExcelProperty(value = "审核日期")
+        private Date auditDate;
+
+            /**
+             * 0:待审核 1:通过 2:未通过
+             */
+            @ExcelProperty(value = "0:待审核 1:通过 2:未通过", converter = ExcelDictConvert.class)
+            @ExcelDictFormat(dictType = "store_in_out_status")
+        private Long status;
+
+            /**
+             * 备注
+             */
+            @ExcelProperty(value = "备注")
+        private String remark;
+
+    private List<StoreInItemVo> itemInfo;
+}

+ 113 - 0
SERVER/ChickenFarmV3/vb-modules/vb-erp/src/main/java/cn/vber/erp/domain/vo/StoreOutItemVo.java

@@ -0,0 +1,113 @@
+package cn.vber.erp.domain.vo;
+
+    import java.util.Date;
+
+    import cn.vber.common.translation.annotation.Translation;
+    import cn.vber.common.translation.constant.TransConstant;
+    import com.fasterxml.jackson.annotation.JsonFormat;
+import cn.vber.erp.domain.StoreOutItem;
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import cn.vber.common.excel.annotation.ExcelDictFormat;
+import cn.vber.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+/**
+ * 出库明细视图对象 erp_store_out_item
+ *
+ * @author IwbY
+ * @date 2025-10-23
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = StoreOutItem.class)
+
+public class StoreOutItemVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+            /**
+             * 
+             */
+            @ExcelProperty(value = "")
+        private Long id;
+
+            /**
+             * 出库头表ID
+             */
+            @ExcelProperty(value = "出库头表ID")
+        private Long outId;
+
+            /**
+             * 物品ID
+             */
+            @ExcelProperty(value = "物品ID")
+        private Long itemId;
+
+    @Translation(type = TransConstant.ITEMS_ID_TO_INFO,mapper = "itemId", other = "name")
+    private String itemName;
+    @Translation(type = TransConstant.ITEMS_ID_TO_INFO,mapper = "itemId", other = "unitId")
+    private String unitId;
+    @Translation(type = TransConstant.ITEMS_ID_TO_INFO,mapper = "itemId", other = "unitName")
+    private String unitName;
+    @Translation(type = TransConstant.ITEMS_ID_TO_INFO,mapper = "itemId", other = "spec")
+    private String specModel;
+
+            /**
+             * 仓库id
+             */
+            @ExcelProperty(value = "仓库id")
+        private Long storeHouseId;
+
+            /**
+             * 出库数量
+             */
+            @ExcelProperty(value = "出库数量")
+        private Long quantity;
+
+            /**
+             * 税率
+             */
+            @ExcelProperty(value = "税率")
+        private Long taxRate;
+
+            /**
+             * 含税单价
+             */
+            @ExcelProperty(value = "含税单价")
+        private Long taxInclusivePrice;
+
+            /**
+             * 含税金额
+             */
+            @ExcelProperty(value = "含税金额")
+        private Long taxInclusiveAmount;
+
+            /**
+             * 
+             */
+            @ExcelProperty(value = "", converter = ExcelDictConvert.class)
+            @ExcelDictFormat(dictType = "store_in_out_status")
+        private Integer status;
+
+            /**
+             * 审核时间
+             */
+            @ExcelProperty(value = "审核时间")
+        private Date auditDate;
+
+            /**
+             * 备注
+             */
+            @ExcelProperty(value = "备注")
+        private String remark;
+
+
+}

+ 135 - 0
SERVER/ChickenFarmV3/vb-modules/vb-erp/src/main/java/cn/vber/erp/domain/vo/StoreOutVo.java

@@ -0,0 +1,135 @@
+package cn.vber.erp.domain.vo;
+
+    import java.util.Date;
+
+    import cn.vber.common.translation.annotation.Translation;
+    import cn.vber.common.translation.constant.TransConstant;
+    import com.fasterxml.jackson.annotation.JsonFormat;
+import cn.vber.erp.domain.StoreOut;
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import cn.vber.common.excel.annotation.ExcelDictFormat;
+import cn.vber.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+/**
+ * 出库信息管理视图对象 erp_store_out
+ *
+ * @author IwbY
+ * @date 2025-10-23
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = StoreOut.class)
+
+public class StoreOutVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     *
+     */
+    @ExcelProperty(value = "")
+    private Long id;
+
+    /**
+     * 单据编号
+     */
+    @ExcelProperty(value = "单据编号")
+    private String receiptNum;
+
+    /**
+     * 单据日期
+     */
+    @ExcelProperty(value = "单据日期")
+    private Date receiptDate;
+
+    /**
+     * 业务类型:(直接领料,生产补料等,允许用户自定义字典)
+     */
+    @ExcelProperty(value = "业务类型:", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(dictType = "out_business_type")
+    private Long businessType;
+
+    /**
+     *
+     */
+    @ExcelProperty(value = "")
+    private Long storeHouseId;
+
+    /**
+     * 出库类别,采购等,允许用户自定义字典
+     */
+    @ExcelProperty(value = "出库类别,采购等,允许用户自定义字典", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(dictType = "out_store_type")
+    private Long storeType;
+
+    /**
+     * 项目ID
+     */
+    @ExcelProperty(value = "项目ID")
+    private Long projectId;
+    /**
+     * 项目名称
+     */
+    @Translation(type = TransConstant.PROJECT_ID_TO_INFO,mapper = "projectId",other="name")
+    private String projectName;
+    /**
+     * 出库对象 关联到storeUser表
+     */
+    private Long storeUserId;
+    /**
+     * 出库对象名称
+     */
+    @Translation(type = TransConstant.STORE_USER_ID_TO_INFO,mapper = "storeUserId",other="name")
+    private String storeUserName;
+    /**
+     * 部门
+     */
+    @ExcelProperty(value = "部门")
+    private String dept;
+
+    /**
+     * 制单人
+     */
+    @ExcelProperty(value = "制单人")
+    private Long preparedUser;
+    @Translation(type = TransConstant.USER_ID_TO_NICKNAME,mapper = "preparedUser",other="nickName")
+    private String preparedUserName;
+
+    /**
+     * 审核人
+     */
+    @ExcelProperty(value = "审核人")
+    private Long auditUser;
+    @Translation(type = TransConstant.USER_ID_TO_NICKNAME,mapper = "auditUser",other="nickName")
+    private String auditUserName;
+
+    /**
+     * 审核日期
+     */
+    @ExcelProperty(value = "审核日期")
+    private Date auditDate;
+
+    /**
+     * 0:待审核 1:通过 2:未通过
+     */
+    @ExcelProperty(value = "0:待审核 1:通过 2:未通过", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(dictType = "store_in_out_status")
+    private Integer status;
+
+    /**
+     * 备注
+     */
+    @ExcelProperty(value = "备注")
+    private String remark;
+
+
+}

+ 22 - 0
SERVER/ChickenFarmV3/vb-modules/vb-erp/src/main/java/cn/vber/erp/mapper/StoreHouseMapper.java

@@ -1,10 +1,16 @@
 package cn.vber.erp.mapper;
 
+import cn.vber.common.mybatis.annotation.DataColumn;
+import cn.vber.common.mybatis.annotation.DataPermission;
 import cn.vber.common.mybatis.core.mapper.BaseMapperPlus;
 import cn.vber.erp.domain.StoreHouse;
 import cn.vber.erp.domain.vo.StoreHouseVo;
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import org.springframework.stereotype.Repository;
 
+import java.util.List;
+
 /**
  * 仓库信息Mapper接口
  *
@@ -14,4 +20,20 @@ import org.springframework.stereotype.Repository;
 @Repository
 public interface StoreHouseMapper extends BaseMapperPlus<StoreHouse, StoreHouseVo> {
 
+
+//    @DataPermission({
+//            @DataColumn(key = "orgName", value = "create_org"),
+//            @DataColumn(key = "userName", value = "manager")
+//    })
+    default Page<StoreHouseVo> selectPageList(Page<StoreHouse> page, Wrapper<StoreHouse> queryWrapper) {
+        return this.selectVoPage(page, queryWrapper);
+    }
+
+//    @DataPermission({
+//            @DataColumn(key = "orgName", value = "create_org"),
+//            @DataColumn(key = "userName", value = "manager")
+//    })
+    default List<StoreHouseVo> selectListVo(Wrapper<StoreHouse> queryWrapper) {
+        return this.selectVoList(queryWrapper);
+    }
 }

+ 28 - 0
SERVER/ChickenFarmV3/vb-modules/vb-erp/src/main/java/cn/vber/erp/mapper/StoreInItemMapper.java

@@ -0,0 +1,28 @@
+package cn.vber.erp.mapper;
+
+import cn.vber.common.mybatis.annotation.DataColumn;
+import cn.vber.common.mybatis.annotation.DataPermission;
+import cn.vber.common.mybatis.core.mapper.BaseMapperPlus;
+import cn.vber.erp.domain.StoreInItem;
+import cn.vber.erp.domain.vo.StoreInItemVo;
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.apache.ibatis.annotations.Delete;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+/**
+ * 入库明细Mapper接口
+ *
+ * @author IwbY
+ * @date 2025-10-23
+ */
+@Repository
+public interface StoreInItemMapper extends BaseMapperPlus<StoreInItem, StoreInItemVo> {
+
+    @Delete("DELETE FROM erp_store_in_item WHERE in_id = #{id}")
+    int hardDeleteByHeadId(Long id);
+
+
+}

+ 17 - 0
SERVER/ChickenFarmV3/vb-modules/vb-erp/src/main/java/cn/vber/erp/mapper/StoreInMapper.java

@@ -0,0 +1,17 @@
+package cn.vber.erp.mapper;
+
+import cn.vber.common.mybatis.core.mapper.BaseMapperPlus;
+import cn.vber.erp.domain.StoreIn;
+import cn.vber.erp.domain.vo.StoreInVo;
+import org.springframework.stereotype.Repository;
+
+/**
+ * 入库信息管理Mapper接口
+ *
+ * @author IwbY
+ * @date 2025-10-23
+ */
+@Repository
+public interface StoreInMapper extends BaseMapperPlus<StoreIn, StoreInVo> {
+
+}

+ 19 - 0
SERVER/ChickenFarmV3/vb-modules/vb-erp/src/main/java/cn/vber/erp/mapper/StoreOutItemMapper.java

@@ -0,0 +1,19 @@
+package cn.vber.erp.mapper;
+
+import cn.vber.common.mybatis.core.mapper.BaseMapperPlus;
+import cn.vber.erp.domain.StoreOutItem;
+import cn.vber.erp.domain.vo.StoreOutItemVo;
+import org.apache.ibatis.annotations.Delete;
+import org.springframework.stereotype.Repository;
+
+/**
+ * 出库明细Mapper接口
+ *
+ * @author IwbY
+ * @date 2025-10-23
+ */
+@Repository
+public interface StoreOutItemMapper extends BaseMapperPlus<StoreOutItem, StoreOutItemVo> {
+    @Delete("DELETE FROM erp_store_out_item WHERE out_id = #{id}")
+    void hardDeleteByHeadId(Long id);
+}

+ 17 - 0
SERVER/ChickenFarmV3/vb-modules/vb-erp/src/main/java/cn/vber/erp/mapper/StoreOutMapper.java

@@ -0,0 +1,17 @@
+package cn.vber.erp.mapper;
+
+import cn.vber.common.mybatis.core.mapper.BaseMapperPlus;
+import cn.vber.erp.domain.StoreOut;
+import cn.vber.erp.domain.vo.StoreOutVo;
+import org.springframework.stereotype.Repository;
+
+/**
+ * 出库信息管理Mapper接口
+ *
+ * @author IwbY
+ * @date 2025-10-23
+ */
+@Repository
+public interface StoreOutMapper extends BaseMapperPlus<StoreOut, StoreOutVo> {
+
+}

+ 2 - 0
SERVER/ChickenFarmV3/vb-modules/vb-erp/src/main/java/cn/vber/erp/service/IItemInfoService.java

@@ -46,4 +46,6 @@ public interface IItemInfoService {
      * 校验并批量删除ERP物品主数据(管理各类物品基础信息)信息
      */
     Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+
+    List<ItemInfoVo> listByKey(String key);
 }

+ 6 - 0
SERVER/ChickenFarmV3/vb-modules/vb-erp/src/main/java/cn/vber/erp/service/IStoreHouseService.java

@@ -1,5 +1,6 @@
 package cn.vber.erp.service;
 
+import cn.vber.common.core.domain.dto.UserDTO;
 import cn.vber.erp.domain.StoreHouse;
 import cn.vber.erp.domain.vo.StoreHouseVo;
 import cn.vber.erp.domain.bo.StoreHouseBo;
@@ -46,4 +47,9 @@ public interface IStoreHouseService {
      * 校验并批量删除仓库信息信息
      */
     Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+
+    /**
+     * 导出仓库信息
+     */
+    List<UserDTO> getStoreManager();
 }

+ 51 - 0
SERVER/ChickenFarmV3/vb-modules/vb-erp/src/main/java/cn/vber/erp/service/IStoreInItemService.java

@@ -0,0 +1,51 @@
+package cn.vber.erp.service;
+
+import cn.vber.erp.domain.StoreInItem;
+import cn.vber.erp.domain.vo.StoreInItemVo;
+import cn.vber.erp.domain.bo.StoreInItemBo;
+    import cn.vber.common.mybatis.core.page.TableDataInfo;
+    import cn.vber.common.mybatis.core.page.PageQuery;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 入库明细Service接口
+ *
+ * @author IwbY
+ * @date 2025-10-23
+ */
+public interface IStoreInItemService {
+
+    /**
+     * 查询入库明细
+     */
+        StoreInItemVo queryById(Long id);
+
+        /**
+         * 查询入库明细列表
+         */
+        TableDataInfo<StoreInItemVo> queryPageList(StoreInItemBo bo, PageQuery pageQuery);
+
+    /**
+     * 查询入库明细列表
+     */
+    List<StoreInItemVo> queryList(StoreInItemBo bo);
+
+    /**
+     * 新增入库明细
+     */
+    Boolean insertByBo(StoreInItemBo bo);
+
+    /**
+     * 修改入库明细
+     */
+    Boolean updateByBo(StoreInItemBo bo);
+
+    /**
+     * 校验并批量删除入库明细信息
+     */
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+
+
+}

+ 57 - 0
SERVER/ChickenFarmV3/vb-modules/vb-erp/src/main/java/cn/vber/erp/service/IStoreInService.java

@@ -0,0 +1,57 @@
+package cn.vber.erp.service;
+
+import cn.vber.erp.domain.StoreIn;
+import cn.vber.erp.domain.vo.StoreInVo;
+import cn.vber.erp.domain.bo.StoreInBo;
+    import cn.vber.common.mybatis.core.page.TableDataInfo;
+    import cn.vber.common.mybatis.core.page.PageQuery;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 入库信息管理Service接口
+ *
+ * @author IwbY
+ * @date 2025-10-23
+ */
+public interface IStoreInService {
+
+    /**
+     * 查询入库信息管理
+     */
+        StoreInVo queryById(Long id);
+
+        /**
+         * 查询入库信息管理列表
+         */
+        TableDataInfo<StoreInVo> queryPageList(StoreInBo bo, PageQuery pageQuery);
+
+    /**
+     * 查询入库信息管理列表
+     */
+    List<StoreInVo> queryList(StoreInBo bo);
+
+    /**
+     * 新增入库信息管理
+     */
+    Boolean insertByBo(StoreInBo bo);
+
+    /**
+     * 修改入库信息管理
+     */
+    Boolean updateByBo(StoreInBo bo);
+
+    /**
+     * 校验并批量删除入库信息管理信息
+     */
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+
+    //审核
+    Boolean audit(Long id);
+
+    //审核未通过
+    Boolean reject(Long id);
+    //撤销作废
+    Boolean revoke(Long id);
+}

+ 49 - 0
SERVER/ChickenFarmV3/vb-modules/vb-erp/src/main/java/cn/vber/erp/service/IStoreOutItemService.java

@@ -0,0 +1,49 @@
+package cn.vber.erp.service;
+
+import cn.vber.erp.domain.StoreOutItem;
+import cn.vber.erp.domain.vo.StoreOutItemVo;
+import cn.vber.erp.domain.bo.StoreOutItemBo;
+    import cn.vber.common.mybatis.core.page.TableDataInfo;
+    import cn.vber.common.mybatis.core.page.PageQuery;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 出库明细Service接口
+ *
+ * @author IwbY
+ * @date 2025-10-23
+ */
+public interface IStoreOutItemService {
+
+    /**
+     * 查询出库明细
+     */
+        StoreOutItemVo queryById(Long id);
+
+        /**
+         * 查询出库明细列表
+         */
+        TableDataInfo<StoreOutItemVo> queryPageList(StoreOutItemBo bo, PageQuery pageQuery);
+
+    /**
+     * 查询出库明细列表
+     */
+    List<StoreOutItemVo> queryList(StoreOutItemBo bo);
+
+    /**
+     * 新增出库明细
+     */
+    Boolean insertByBo(StoreOutItemBo bo);
+
+    /**
+     * 修改出库明细
+     */
+    Boolean updateByBo(StoreOutItemBo bo);
+
+    /**
+     * 校验并批量删除出库明细信息
+     */
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+}

+ 57 - 0
SERVER/ChickenFarmV3/vb-modules/vb-erp/src/main/java/cn/vber/erp/service/IStoreOutService.java

@@ -0,0 +1,57 @@
+package cn.vber.erp.service;
+
+import cn.vber.erp.domain.StoreOut;
+import cn.vber.erp.domain.vo.StoreOutVo;
+import cn.vber.erp.domain.bo.StoreOutBo;
+    import cn.vber.common.mybatis.core.page.TableDataInfo;
+    import cn.vber.common.mybatis.core.page.PageQuery;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 出库信息管理Service接口
+ *
+ * @author IwbY
+ * @date 2025-10-23
+ */
+public interface IStoreOutService {
+
+    /**
+     * 查询出库信息管理
+     */
+        StoreOutVo queryById(Long id);
+
+        /**
+         * 查询出库信息管理列表
+         */
+        TableDataInfo<StoreOutVo> queryPageList(StoreOutBo bo, PageQuery pageQuery);
+
+    /**
+     * 查询出库信息管理列表
+     */
+    List<StoreOutVo> queryList(StoreOutBo bo);
+
+    /**
+     * 新增出库信息管理
+     */
+    Boolean insertByBo(StoreOutBo bo);
+
+    /**
+     * 修改出库信息管理
+     */
+    Boolean updateByBo(StoreOutBo bo);
+
+    /**
+     * 校验并批量删除出库信息管理信息
+     */
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+
+    @Transactional(rollbackFor = Exception.class)
+    Boolean audit(Long id);
+
+    Boolean reject(Long id);
+
+    Boolean revoke(Long id);
+}

+ 90 - 5
SERVER/ChickenFarmV3/vb-modules/vb-erp/src/main/java/cn/vber/erp/service/impl/ItemInfoServiceImpl.java

@@ -1,7 +1,11 @@
 package cn.vber.erp.service.impl;
 
+import cn.vber.common.core.constant.CacheNames;
 import cn.vber.common.core.exception.ServiceException;
+import cn.vber.common.core.service.ItemsService;
+import cn.vber.common.core.service.UnitService;
 import cn.vber.common.core.utils.MapstructUtils;
+import cn.vber.common.core.utils.SpringUtils;
 import cn.vber.common.core.utils.StringUtils;
     import cn.vber.common.mybatis.core.page.TableDataInfo;
     import cn.vber.common.mybatis.core.page.PageQuery;
@@ -10,6 +14,10 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import lombok.RequiredArgsConstructor;
+import org.springframework.cache.Cache;
+import org.springframework.cache.CacheManager;
+import org.springframework.cache.annotation.CacheEvict;
+import org.springframework.cache.annotation.Cacheable;
 import org.springframework.stereotype.Service;
 import cn.vber.erp.domain.bo.ItemInfoBo;
 import cn.vber.erp.domain.vo.ItemInfoVo;
@@ -29,10 +37,11 @@ import java.util.Collection;
  */
 @RequiredArgsConstructor
 @Service
-public class ItemInfoServiceImpl implements IItemInfoService {
+public class ItemInfoServiceImpl implements IItemInfoService, ItemsService {
 
     private final ItemInfoMapper baseMapper;
-
+    // 添加缓存管理器,用于手动清除缓存
+    private final CacheManager cacheManager;
     /**
      * 查询ERP物品主数据(管理各类物品基础信息)
      */
@@ -65,7 +74,7 @@ public class ItemInfoServiceImpl implements IItemInfoService {
         LambdaQueryWrapper<ItemInfo> lqw = Wrappers.lambdaQuery();
                     lqw.like(StringUtils.isNotBlank(bo.getItemName()), ItemInfo::getItemName, bo.getItemName());
                     lqw.eq(StringUtils.isNotBlank(bo.getSpecModel()), ItemInfo::getSpecModel, bo.getSpecModel());
-                    lqw.eq(StringUtils.isNotBlank(bo.getUnit()), ItemInfo::getUnit, bo.getUnit());
+                    //lqw.eq(StringUtils.isNotBlank(bo.getUnit()), ItemInfo::getUnit, bo.getUnit());
                     lqw.eq(StringUtils.isNotBlank(bo.getEasyCode()), ItemInfo::getEasyCode, bo.getEasyCode());
                     lqw.eq(bo.getItemType() != null, ItemInfo::getItemType, bo.getItemType());
         return lqw;
@@ -89,6 +98,7 @@ public class ItemInfoServiceImpl implements IItemInfoService {
      * 修改ERP物品主数据(管理各类物品基础信息)
      */
     @Override
+    @CacheEvict(cacheNames = {CacheNames.ITEMS_ID_TO_NAME,CacheNames.ITEMS_ID_TO_SPEC,CacheNames.ITEMS_ID_TO_UNIT_ID}, key = "#bo.id")
     public Boolean updateByBo(ItemInfoBo bo) {
         ItemInfo update = MapstructUtils.convert(bo, ItemInfo. class);
         validEntityBeforeSave(update);
@@ -101,14 +111,14 @@ public class ItemInfoServiceImpl implements IItemInfoService {
     private void validEntityBeforeSave(ItemInfo entity) {
         //TODO 做一些数据校验,如唯一约束
         Long id = entity.getId();
-        LambdaQueryWrapper<ItemInfo> lqw = new LambdaQueryWrapper<ItemInfo>().eq(ItemInfo::getItemName, entity.getItemName());
+        LambdaQueryWrapper<ItemInfo> lqw = new LambdaQueryWrapper<ItemInfo>().eq(ItemInfo::getItemName, entity.getItemName()).eq(ItemInfo::getSpecModel, entity.getSpecModel());
 
         if(id != null){
             lqw.ne(ItemInfo::getId, id);
         }
         ItemInfo s = baseMapper.selectOne(lqw);
         if(s != null){
-            throw new ServiceException("物品名称已存在!");
+            throw new ServiceException("相同的物品名称和规格已存在!");
         }
     }
 
@@ -122,4 +132,79 @@ public class ItemInfoServiceImpl implements IItemInfoService {
         }
         return baseMapper.deleteByIds(ids) > 0;
     }
+
+    @Override
+    public List<ItemInfoVo> listByKey(String key) {
+        if (StringUtils.isBlank(key)) {
+            return List.of();
+        }
+        LambdaQueryWrapper<ItemInfo> lqw = new LambdaQueryWrapper<ItemInfo>().like(ItemInfo::getItemName, key)
+                .or(w -> w.like(ItemInfo::getEasyCode, key));
+        return baseMapper.selectVoList(lqw);
+    }
+
+    @Override
+    @Cacheable(cacheNames = CacheNames.ITEMS_ID_TO_NAME, key = "#id")
+    public String getItemNameByItemInfoId(Long id) {
+        ItemInfo itemInfo = baseMapper.selectById(id);
+
+        return itemInfo.getItemName();
+
+    }
+    @Override
+    @Cacheable(cacheNames = CacheNames.ITEMS_ID_TO_SPEC, key = "#id")
+    public String getSpecByItemInfoId(Long id) {
+        ItemInfo itemInfo = baseMapper.selectById(id);
+
+        return itemInfo.getSpecModel();
+
+    }
+    @Override
+    @Cacheable(cacheNames = CacheNames.ITEMS_ID_TO_UNIT_ID, key = "#id")
+    public String getUnitIdByItemInfoId(Long id) {
+        ItemInfo itemInfo = baseMapper.selectById(id);
+        return itemInfo.getUnitId().toString();
+    }
+
+    /**
+     * 根据id获取物品单位名称 翻译转换
+     * @param id
+     * @return
+     */
+    @Override
+    public String getUnitNameById(Long id) {
+        Cache cache = cacheManager.getCache(CacheNames.ITEMS_ID_TO_UNIT_ID);
+        UnitService bean = SpringUtils.getBean(UnitService.class);
+        if (cache != null) {
+            Cache.ValueWrapper valueWrapper = cache.get(id);
+            if (valueWrapper != null){
+                Object cachedValue = valueWrapper.get();
+                Long unitId = convertToLong(cachedValue);
+                if (unitId != null) {
+                    return bean.getUnitNameById(unitId);
+                }
+            }
+        }else{
+            ItemInfo itemInfo = baseMapper.selectById(id);
+            return itemInfo.getUnitId() == null ? "" : bean.getUnitNameById(itemInfo.getUnitId());
+        }
+        return "";
+    }
+    private Long convertToLong(Object value) {
+        if (value == null) {
+            return null;
+        }
+        if (value instanceof Long) {
+            return (Long) value;
+        } else if (value instanceof Integer) {
+            return ((Integer) value).longValue();
+        } else if (value instanceof String) {
+            try {
+                return Long.parseLong((String) value);
+            } catch (NumberFormatException e) {
+                return null;
+            }
+        }
+        return null;
+    }
 }

+ 37 - 5
SERVER/ChickenFarmV3/vb-modules/vb-erp/src/main/java/cn/vber/erp/service/impl/StoreHouseServiceImpl.java

@@ -1,15 +1,22 @@
 package cn.vber.erp.service.impl;
 
+import cn.vber.common.core.constant.CacheNames;
+import cn.vber.common.core.domain.dto.UserDTO;
 import cn.vber.common.core.exception.ServiceException;
+import cn.vber.common.core.service.ConfigService;
+import cn.vber.common.core.service.StoreHouseService;
+import cn.vber.common.core.service.UserService;
 import cn.vber.common.core.utils.MapstructUtils;
+import cn.vber.common.core.utils.SpringUtils;
 import cn.vber.common.core.utils.StringUtils;
     import cn.vber.common.mybatis.core.page.TableDataInfo;
     import cn.vber.common.mybatis.core.page.PageQuery;
-import cn.vber.erp.domain.Supplier;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import lombok.RequiredArgsConstructor;
+import org.springframework.cache.annotation.CacheEvict;
+import org.springframework.cache.annotation.Cacheable;
 import org.springframework.stereotype.Service;
 import cn.vber.erp.domain.bo.StoreHouseBo;
 import cn.vber.erp.domain.vo.StoreHouseVo;
@@ -17,6 +24,7 @@ import cn.vber.erp.domain.StoreHouse;
 import cn.vber.erp.mapper.StoreHouseMapper;
 import cn.vber.erp.service.IStoreHouseService;
 
+import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
 import java.util.Collection;
@@ -29,7 +37,7 @@ import java.util.Collection;
  */
 @RequiredArgsConstructor
 @Service
-public class StoreHouseServiceImpl implements IStoreHouseService {
+public class StoreHouseServiceImpl implements IStoreHouseService, StoreHouseService {
 
     private final StoreHouseMapper baseMapper;
 
@@ -47,7 +55,7 @@ public class StoreHouseServiceImpl implements IStoreHouseService {
         @Override
         public TableDataInfo<StoreHouseVo> queryPageList(StoreHouseBo bo, PageQuery pageQuery) {
             LambdaQueryWrapper<StoreHouse> lqw = buildQueryWrapper(bo);
-            Page<StoreHouseVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+            Page<StoreHouseVo> result = baseMapper.selectPageList(pageQuery.build(), lqw);
             return TableDataInfo.build(result);
         }
 
@@ -57,7 +65,7 @@ public class StoreHouseServiceImpl implements IStoreHouseService {
     @Override
     public List<StoreHouseVo> queryList(StoreHouseBo bo) {
         LambdaQueryWrapper<StoreHouse> lqw = buildQueryWrapper(bo);
-        return baseMapper.selectVoList(lqw);
+        return baseMapper.selectListVo(lqw);
     }
 
     private LambdaQueryWrapper<StoreHouse> buildQueryWrapper(StoreHouseBo bo) {
@@ -66,7 +74,7 @@ public class StoreHouseServiceImpl implements IStoreHouseService {
                     lqw.eq(StringUtils.isNotBlank(bo.getStoreHouseNum()), StoreHouse::getStoreHouseNum, bo.getStoreHouseNum());
                     lqw.eq(bo.getStoreHouseType() != null, StoreHouse::getStoreHouseType, bo.getStoreHouseType());
                     lqw.like(StringUtils.isNotBlank(bo.getStoreHouseName()), StoreHouse::getStoreHouseName, bo.getStoreHouseName());
-                    lqw.eq(StringUtils.isNotBlank(bo.getManger()), StoreHouse::getManger, bo.getManger());
+                    lqw.eq(bo.getManger()!=null, StoreHouse::getManger, bo.getManger());
         return lqw;
     }
 
@@ -88,6 +96,7 @@ public class StoreHouseServiceImpl implements IStoreHouseService {
      * 修改仓库信息
      */
     @Override
+    @CacheEvict(value = {CacheNames.STORE_HOUSE_ID_TO_NAME, CacheNames.STORE_HOUSE_ID_TO_NUM}, key = "#bo.id")
     public Boolean updateByBo(StoreHouseBo bo) {
         StoreHouse update = MapstructUtils.convert(bo, StoreHouse. class);
         validEntityBeforeSave(update);
@@ -121,4 +130,27 @@ public class StoreHouseServiceImpl implements IStoreHouseService {
         }
         return baseMapper.deleteByIds(ids) > 0;
     }
+
+    @Override
+    public List<UserDTO> getStoreManager() {
+        String userIdsStr = SpringUtils.getBean(ConfigService.class).getConfigValue("erp:Store:userIds");
+        UserService userService = SpringUtils.getBean(UserService.class);
+        List<Long> userIds = Arrays.stream(userIdsStr.split(",")).map(Long::parseLong).toList();
+        return userService.selectListByIds(userIds);
+    }
+
+    @Override
+    @Cacheable(cacheNames = CacheNames.STORE_HOUSE_ID_TO_NAME, key = "#id")
+    public String getStoreNameById(Long id) {
+        StoreHouse storeHouse = baseMapper.selectById(id);
+        return storeHouse.getStoreHouseName();
+    }
+    @Override
+    @Cacheable(cacheNames = CacheNames.STORE_HOUSE_ID_TO_NUM, key = "#id")
+    public String getStoreNumById(Long id) {
+        StoreHouse storeHouse = baseMapper.selectById(id);
+        return storeHouse.getStoreHouseNum();
+    }
+
+
 }

+ 118 - 0
SERVER/ChickenFarmV3/vb-modules/vb-erp/src/main/java/cn/vber/erp/service/impl/StoreInItemServiceImpl.java

@@ -0,0 +1,118 @@
+package cn.vber.erp.service.impl;
+
+import cn.vber.common.core.utils.MapstructUtils;
+import cn.vber.common.core.utils.StringUtils;
+    import cn.vber.common.mybatis.core.page.TableDataInfo;
+    import cn.vber.common.mybatis.core.page.PageQuery;
+    import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+import cn.vber.erp.domain.bo.StoreInItemBo;
+import cn.vber.erp.domain.vo.StoreInItemVo;
+import cn.vber.erp.domain.StoreInItem;
+import cn.vber.erp.mapper.StoreInItemMapper;
+import cn.vber.erp.service.IStoreInItemService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 入库明细Service业务层处理
+ *
+ * @author IwbY
+ * @date 2025-10-23
+ */
+@RequiredArgsConstructor
+@Service
+public class StoreInItemServiceImpl implements IStoreInItemService {
+
+    private final StoreInItemMapper baseMapper;
+
+    /**
+     * 查询入库明细
+     */
+    @Override
+    public StoreInItemVo queryById(Long id) {
+        return baseMapper.selectVoById(id);
+    }
+
+        /**
+         * 查询入库明细列表
+         */
+        @Override
+        public TableDataInfo<StoreInItemVo> queryPageList(StoreInItemBo bo, PageQuery pageQuery) {
+            LambdaQueryWrapper<StoreInItem> lqw = buildQueryWrapper(bo);
+            Page<StoreInItemVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+            return TableDataInfo.build(result);
+        }
+
+    /**
+     * 查询入库明细列表
+     */
+    @Override
+    public List<StoreInItemVo> queryList(StoreInItemBo bo) {
+        LambdaQueryWrapper<StoreInItem> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    private LambdaQueryWrapper<StoreInItem> buildQueryWrapper(StoreInItemBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<StoreInItem> lqw = Wrappers.lambdaQuery();
+                    lqw.eq(bo.getInId() != null, StoreInItem::getInId, bo.getInId());
+                    lqw.eq(bo.getItemId() != null, StoreInItem::getItemId, bo.getItemId());
+                    lqw.eq(bo.getStoreHouseId() != null, StoreInItem::getStoreHouseId, bo.getStoreHouseId());
+                    lqw.eq(bo.getQuantity() != null, StoreInItem::getQuantity, bo.getQuantity());
+                    lqw.eq(bo.getTaxRate() != null, StoreInItem::getTaxRate, bo.getTaxRate());
+                    lqw.eq(bo.getTaxInclusivePrice() != null, StoreInItem::getTaxInclusivePrice, bo.getTaxInclusivePrice());
+                    lqw.eq(bo.getTaxInclusiveAmount() != null, StoreInItem::getTaxInclusiveAmount, bo.getTaxInclusiveAmount());
+                    lqw.eq(bo.getStatus() != null, StoreInItem::getStatus, bo.getStatus());
+                    lqw.between(StringUtils.isNotEmpty(params.get("beginAuditDate")) && StringUtils.isNotEmpty(params.get("endAuditDate")),
+                        StoreInItem::getAuditDate , params.get("beginAuditDate"), params.get("endAuditDate"));
+        return lqw;
+    }
+
+    /**
+     * 新增入库明细
+     */
+    @Override
+    public Boolean insertByBo(StoreInItemBo bo) {
+        StoreInItem add = MapstructUtils.convert(bo, StoreInItem. class);
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setId(add.getId());
+        }
+        return flag;
+    }
+
+    /**
+     * 修改入库明细
+     */
+    @Override
+    public Boolean updateByBo(StoreInItemBo bo) {
+        StoreInItem update = MapstructUtils.convert(bo, StoreInItem. class);
+        validEntityBeforeSave(update);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    /**
+     * 保存前的数据校验
+     */
+    private void validEntityBeforeSave(StoreInItem entity) {
+        //TODO 做一些数据校验,如唯一约束
+    }
+
+    /**
+     * 批量删除入库明细
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if (isValid) {
+            //TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return baseMapper.deleteByIds(ids) > 0;
+    }
+}

+ 218 - 0
SERVER/ChickenFarmV3/vb-modules/vb-erp/src/main/java/cn/vber/erp/service/impl/StoreInServiceImpl.java

@@ -0,0 +1,218 @@
+package cn.vber.erp.service.impl;
+
+import cn.vber.base.enums.StoreInOutStatusEnum;
+import cn.vber.common.core.exception.ServiceException;
+import cn.vber.common.core.utils.DateUtils;
+import cn.vber.common.core.utils.MapstructUtils;
+import cn.vber.common.core.utils.StringUtils;
+    import cn.vber.common.mybatis.core.page.TableDataInfo;
+    import cn.vber.common.mybatis.core.page.PageQuery;
+import cn.vber.common.satoken.utils.LoginHelper;
+import cn.vber.erp.domain.StoreHouse;
+import cn.vber.erp.domain.StoreInItem;
+import cn.vber.erp.domain.bo.StoreInItemBo;
+import cn.vber.erp.domain.vo.StoreInItemVo;
+import cn.vber.erp.mapper.StoreInItemMapper;
+import cn.vber.erp.service.IStoreInItemService;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+import cn.vber.erp.domain.bo.StoreInBo;
+import cn.vber.erp.domain.vo.StoreInVo;
+import cn.vber.erp.domain.StoreIn;
+import cn.vber.erp.mapper.StoreInMapper;
+import cn.vber.erp.service.IStoreInService;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 入库信息管理Service业务层处理
+ *
+ * @author IwbY
+ * @date 2025-10-23
+ */
+@RequiredArgsConstructor
+@Service
+public class StoreInServiceImpl implements IStoreInService {
+
+    private final StoreInMapper baseMapper;
+    private final IStoreInItemService storeInItemService;
+    private final StoreInItemMapper storeInItemMapper;
+
+    /**
+     * 查询入库信息管理
+     */
+    @Override
+    public StoreInVo queryById(Long id) {
+        StoreInVo storeInVo = baseMapper.selectVoById(id);
+        List<StoreInItemVo> storeInItemVos = storeInItemMapper.selectVoList(new LambdaQueryWrapper<>(StoreInItem.class).eq(StoreInItem::getInId, id));
+        storeInVo.setItemInfo(storeInItemVos);
+        return storeInVo;
+    }
+
+        /**
+         * 查询入库信息管理列表
+         */
+        @Override
+        public TableDataInfo<StoreInVo> queryPageList(StoreInBo bo, PageQuery pageQuery) {
+            LambdaQueryWrapper<StoreIn> lqw = buildQueryWrapper(bo);
+            Page<StoreInVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+            return TableDataInfo.build(result);
+        }
+
+    /**
+     * 查询入库信息管理列表
+     */
+    @Override
+    public List<StoreInVo> queryList(StoreInBo bo) {
+        LambdaQueryWrapper<StoreIn> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    private LambdaQueryWrapper<StoreIn> buildQueryWrapper(StoreInBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<StoreIn> lqw = Wrappers.lambdaQuery();
+                    lqw.eq(StringUtils.isNotBlank(bo.getReceiptNum()), StoreIn::getReceiptNum, bo.getReceiptNum());
+                    lqw.between(StringUtils.isNotEmpty(params.get("beginReceiptDate")) && StringUtils.isNotEmpty(params.get("endReceiptDate")),
+                       StoreIn::getReceiptDate , params.get("beginReceiptDate"), params.get("endReceiptDate"));
+                    lqw.eq(bo.getBusinessType() != null, StoreIn::getBusinessType, bo.getBusinessType());
+                    lqw.eq(bo.getStoreHouseId() != null, StoreIn::getStoreHouseId, bo.getStoreHouseId());
+                    lqw.eq(bo.getStoreType() != null, StoreIn::getStoreType, bo.getStoreType());
+                    lqw.eq(bo.getSupplierId() != null, StoreIn::getSupplierId, bo.getSupplierId());
+                    lqw.eq(StringUtils.isNotBlank(bo.getDept()), StoreIn::getDept, bo.getDept());
+                    lqw.eq(bo.getPreparedUser() != null, StoreIn::getPreparedUser, bo.getPreparedUser());
+                    lqw.eq(bo.getAuditUser() != null, StoreIn::getAuditUser, bo.getAuditUser());
+                    lqw.between(StringUtils.isNotEmpty(params.get("beginAuditDate")) && StringUtils.isNotEmpty(params.get("endAuditDate")),
+                        StoreIn::getAuditDate , params.get("beginAuditDate"), params.get("endAuditDate"));
+                    lqw.eq(bo.getStatus() != null, StoreIn::getStatus, bo.getStatus());
+
+        return lqw;
+    }
+
+    /**
+     * 新增入库信息管理
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean insertByBo(StoreInBo bo) {
+        StoreIn add = MapstructUtils.convert(bo, StoreIn. class);
+        validEntityBeforeSave(add);
+        Long userId = LoginHelper.getUserId();
+        add.setPreparedUser(userId);
+        add.setStatus(StoreInOutStatusEnum.WAIT_AUDIT.getCode());
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setId(add.getId());
+        }
+        List<StoreInItemBo> itemInfo = bo.getItemInfo();
+        for (StoreInItemBo item : itemInfo) {
+            item.setInId(add.getId());
+            //todo 获取仓库id,默认使用头表的仓库ID,后续逻辑变更再修改
+            item.setStoreHouseId(add.getStoreHouseId());
+            item.setStatus(StoreInOutStatusEnum.WAIT_AUDIT.getCode());
+            storeInItemService.insertByBo(item);
+        }
+        return flag;
+    }
+
+    /**
+     * 修改入库信息管理
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean updateByBo(StoreInBo bo) {
+        StoreIn update = MapstructUtils.convert(bo, StoreIn. class);
+        validEntityBeforeSave(update);
+        List<StoreInItemBo> itemInfo = bo.getItemInfo();
+        if(!itemInfo.isEmpty()){
+            storeInItemMapper.hardDeleteByHeadId(update.getId());
+            for (StoreInItemBo item : itemInfo) {
+                item.setInId(update.getId());
+                //todo 获取仓库id,默认使用头表的仓库ID,后续逻辑变更再修改
+                item.setStoreHouseId(update.getStoreHouseId());
+                item.setStatus(update.getStatus());
+                storeInItemService.insertByBo(item);
+            }
+        }
+        return baseMapper.updateById(update) > 0;
+    }
+
+    /**
+     * 保存前的数据校验
+     */
+    private void validEntityBeforeSave(StoreIn entity) {
+        //TODO 做一些数据校验,如唯一约束
+        Long id = entity.getId();
+        LambdaQueryWrapper<StoreIn> lqw = new LambdaQueryWrapper<StoreIn>().eq(StoreIn::getReceiptNum, entity.getReceiptNum());
+
+        if(id != null){
+            lqw.ne(StoreIn::getId, id);
+        }
+        StoreIn s = baseMapper.selectOne(lqw);
+        if(s != null){
+            throw new ServiceException("单据编号已存在!");
+        }
+    }
+
+    /**
+     * 批量删除入库信息管理
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if (isValid) {
+            //TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return baseMapper.deleteByIds(ids) > 0;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean audit(Long id) {
+        StoreIn storeIn = baseMapper.selectById(id);
+        if(storeIn != null){
+            storeIn.setStatus(StoreInOutStatusEnum.PASSED.getCode());
+            storeIn.setAuditDate(DateUtils.getNowDate());
+            storeIn.setAuditUser(LoginHelper.getUserId());
+//同时更新入库单明细状态
+            storeInItemMapper.update(new LambdaUpdateWrapper<StoreInItem>().eq(StoreInItem::getInId, id).set(StoreInItem::getStatus, StoreInOutStatusEnum.PASSED.getCode()));
+            return baseMapper.updateById(storeIn) > 0;
+        }
+        return false;
+    }
+     /**
+     * 拒绝入库单
+     */
+    @Override
+    public Boolean reject(Long id) {
+        StoreIn storeIn = baseMapper.selectById(id);
+        if(storeIn != null){
+            storeIn.setStatus(StoreInOutStatusEnum.UNPASSED.getCode());
+            storeIn.setAuditDate(DateUtils.getNowDate());
+            storeIn.setAuditUser(LoginHelper.getUserId());
+            //同时更新入库单明细状态
+            storeInItemMapper.update(new LambdaUpdateWrapper<StoreInItem>().eq(StoreInItem::getInId, id).set(StoreInItem::getStatus, StoreInOutStatusEnum.UNPASSED.getCode()));
+            return baseMapper.updateById(storeIn) > 0;
+        }
+        return false;
+    }
+    /**
+     * 作废入库单
+     */
+    @Override
+    public Boolean revoke(Long id) {
+        StoreIn storeIn = baseMapper.selectById(id);
+        if(storeIn != null){
+            storeIn.setStatus(StoreInOutStatusEnum.REVOKE.getCode());
+            //同时更新入库单明细状态
+            storeInItemMapper.update(new LambdaUpdateWrapper<StoreInItem>().eq(StoreInItem::getInId, id).set(StoreInItem::getStatus, StoreInOutStatusEnum.REVOKE.getCode()));
+            return baseMapper.updateById(storeIn) > 0;
+        }
+        return false;
+    }
+}

+ 118 - 0
SERVER/ChickenFarmV3/vb-modules/vb-erp/src/main/java/cn/vber/erp/service/impl/StoreOutItemServiceImpl.java

@@ -0,0 +1,118 @@
+package cn.vber.erp.service.impl;
+
+import cn.vber.common.core.utils.MapstructUtils;
+import cn.vber.common.core.utils.StringUtils;
+    import cn.vber.common.mybatis.core.page.TableDataInfo;
+    import cn.vber.common.mybatis.core.page.PageQuery;
+    import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+import cn.vber.erp.domain.bo.StoreOutItemBo;
+import cn.vber.erp.domain.vo.StoreOutItemVo;
+import cn.vber.erp.domain.StoreOutItem;
+import cn.vber.erp.mapper.StoreOutItemMapper;
+import cn.vber.erp.service.IStoreOutItemService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 出库明细Service业务层处理
+ *
+ * @author IwbY
+ * @date 2025-10-23
+ */
+@RequiredArgsConstructor
+@Service
+public class StoreOutItemServiceImpl implements IStoreOutItemService {
+
+    private final StoreOutItemMapper baseMapper;
+
+    /**
+     * 查询出库明细
+     */
+    @Override
+    public StoreOutItemVo queryById(Long id) {
+        return baseMapper.selectVoById(id);
+    }
+
+        /**
+         * 查询出库明细列表
+         */
+        @Override
+        public TableDataInfo<StoreOutItemVo> queryPageList(StoreOutItemBo bo, PageQuery pageQuery) {
+            LambdaQueryWrapper<StoreOutItem> lqw = buildQueryWrapper(bo);
+            Page<StoreOutItemVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+            return TableDataInfo.build(result);
+        }
+
+    /**
+     * 查询出库明细列表
+     */
+    @Override
+    public List<StoreOutItemVo> queryList(StoreOutItemBo bo) {
+        LambdaQueryWrapper<StoreOutItem> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    private LambdaQueryWrapper<StoreOutItem> buildQueryWrapper(StoreOutItemBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<StoreOutItem> lqw = Wrappers.lambdaQuery();
+                    lqw.eq(bo.getOutId() != null, StoreOutItem::getOutId, bo.getOutId());
+                    lqw.eq(bo.getItemId() != null, StoreOutItem::getItemId, bo.getItemId());
+                    lqw.eq(bo.getStoreHouseId() != null, StoreOutItem::getStoreHouseId, bo.getStoreHouseId());
+                    lqw.eq(bo.getQuantity() != null, StoreOutItem::getQuantity, bo.getQuantity());
+                    lqw.eq(bo.getTaxRate() != null, StoreOutItem::getTaxRate, bo.getTaxRate());
+                    lqw.eq(bo.getTaxInclusivePrice() != null, StoreOutItem::getTaxInclusivePrice, bo.getTaxInclusivePrice());
+                    lqw.eq(bo.getTaxInclusiveAmount() != null, StoreOutItem::getTaxInclusiveAmount, bo.getTaxInclusiveAmount());
+                    lqw.eq(bo.getStatus() != null, StoreOutItem::getStatus, bo.getStatus());
+                    lqw.between(StringUtils.isNotEmpty(params.get("beginAuditDate")) && StringUtils.isNotEmpty(params.get("endAuditDate")),
+                        StoreOutItem::getAuditDate , params.get("beginAuditDate"), params.get("endAuditDate"));
+        return lqw;
+    }
+
+    /**
+     * 新增出库明细
+     */
+    @Override
+    public Boolean insertByBo(StoreOutItemBo bo) {
+        StoreOutItem add = MapstructUtils.convert(bo, StoreOutItem. class);
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setId(add.getId());
+        }
+        return flag;
+    }
+
+    /**
+     * 修改出库明细
+     */
+    @Override
+    public Boolean updateByBo(StoreOutItemBo bo) {
+        StoreOutItem update = MapstructUtils.convert(bo, StoreOutItem. class);
+        validEntityBeforeSave(update);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    /**
+     * 保存前的数据校验
+     */
+    private void validEntityBeforeSave(StoreOutItem entity) {
+        //TODO 做一些数据校验,如唯一约束
+    }
+
+    /**
+     * 批量删除出库明细
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if (isValid) {
+            //TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return baseMapper.deleteByIds(ids) > 0;
+    }
+}

+ 213 - 0
SERVER/ChickenFarmV3/vb-modules/vb-erp/src/main/java/cn/vber/erp/service/impl/StoreOutServiceImpl.java

@@ -0,0 +1,213 @@
+package cn.vber.erp.service.impl;
+
+import cn.vber.base.enums.StoreInOutStatusEnum;
+import cn.vber.common.core.exception.ServiceException;
+import cn.vber.common.core.utils.DateUtils;
+import cn.vber.common.core.utils.MapstructUtils;
+import cn.vber.common.core.utils.StringUtils;
+    import cn.vber.common.mybatis.core.page.TableDataInfo;
+    import cn.vber.common.mybatis.core.page.PageQuery;
+import cn.vber.common.satoken.utils.LoginHelper;
+import cn.vber.erp.domain.StoreIn;
+import cn.vber.erp.domain.StoreOutItem;
+import cn.vber.erp.domain.bo.StoreInItemBo;
+import cn.vber.erp.domain.bo.StoreOutItemBo;
+import cn.vber.erp.mapper.StoreOutItemMapper;
+import cn.vber.erp.service.IStoreInItemService;
+import cn.vber.erp.service.IStoreOutItemService;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+import cn.vber.erp.domain.bo.StoreOutBo;
+import cn.vber.erp.domain.vo.StoreOutVo;
+import cn.vber.erp.domain.StoreOut;
+import cn.vber.erp.mapper.StoreOutMapper;
+import cn.vber.erp.service.IStoreOutService;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 出库信息管理Service业务层处理
+ *
+ * @author IwbY
+ * @date 2025-10-23
+ */
+@RequiredArgsConstructor
+@Service
+public class StoreOutServiceImpl implements IStoreOutService {
+
+    private final StoreOutMapper baseMapper;
+    private final IStoreOutItemService storeOutItemService;
+    private final StoreOutItemMapper storeOutItemMapper;
+
+    /**
+     * 查询出库信息管理
+     */
+    @Override
+    public StoreOutVo queryById(Long id) {
+        return baseMapper.selectVoById(id);
+    }
+
+        /**
+         * 查询出库信息管理列表
+         */
+        @Override
+        public TableDataInfo<StoreOutVo> queryPageList(StoreOutBo bo, PageQuery pageQuery) {
+            LambdaQueryWrapper<StoreOut> lqw = buildQueryWrapper(bo);
+            Page<StoreOutVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+            return TableDataInfo.build(result);
+        }
+
+    /**
+     * 查询出库信息管理列表
+     */
+    @Override
+    public List<StoreOutVo> queryList(StoreOutBo bo) {
+        LambdaQueryWrapper<StoreOut> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    private LambdaQueryWrapper<StoreOut> buildQueryWrapper(StoreOutBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<StoreOut> lqw = Wrappers.lambdaQuery();
+                    lqw.eq(StringUtils.isNotBlank(bo.getReceiptNum()), StoreOut::getReceiptNum, bo.getReceiptNum());
+                    lqw.between(StringUtils.isNotEmpty(params.get("beginReceiptDate")) && StringUtils.isNotEmpty(params.get("endReceiptDate")),
+                        StoreOut::getReceiptDate , params.get("beginReceiptDate"), params.get("endReceiptDate"));
+                    lqw.eq(bo.getBusinessType() != null, StoreOut::getBusinessType, bo.getBusinessType());
+                    lqw.eq(bo.getStoreHouseId() != null, StoreOut::getStoreHouseId, bo.getStoreHouseId());
+                    lqw.eq(bo.getStoreType() != null, StoreOut::getStoreType, bo.getStoreType());
+                    lqw.eq(bo.getProjectId() != null, StoreOut::getProjectId, bo.getProjectId());
+                    lqw.eq(StringUtils.isNotBlank(bo.getDept()), StoreOut::getDept, bo.getDept());
+                    lqw.eq(bo.getPreparedUser() != null, StoreOut::getPreparedUser, bo.getPreparedUser());
+                    lqw.eq(bo.getAuditUser() != null, StoreOut::getAuditUser, bo.getAuditUser());
+                    lqw.between(StringUtils.isNotEmpty(params.get("beginAuditDate")) && StringUtils.isNotEmpty(params.get("endAuditDate")),
+                        StoreOut::getAuditDate , params.get("beginAuditDate"), params.get("endAuditDate"));
+                    lqw.eq(bo.getStatus() != null, StoreOut::getStatus, bo.getStatus());
+        return lqw;
+    }
+
+    /**
+     * 新增出库信息管理
+     */
+    @Override
+    public Boolean insertByBo(StoreOutBo bo) {
+        StoreOut add = MapstructUtils.convert(bo, StoreOut. class);
+        validEntityBeforeSave(add);
+        Long userId = LoginHelper.getUserId();
+        add.setPreparedUser(userId);
+        add.setStatus(StoreInOutStatusEnum.WAIT_AUDIT.getCode());
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setId(add.getId());
+        }
+        List<StoreOutItemBo> itemInfo = bo.getItemInfo();
+        for (StoreOutItemBo item : itemInfo) {
+            item.setOutId(add.getId());
+            //todo 获取仓库id,默认使用头表的仓库ID,后续逻辑变更再修改
+            item.setStoreHouseId(add.getStoreHouseId());
+            item.setStatus(StoreInOutStatusEnum.WAIT_AUDIT.getCode());
+            storeOutItemService.insertByBo(item);
+        }
+        return flag;
+    }
+
+    /**
+     * 修改出库信息管理
+     */
+    @Override
+    public Boolean updateByBo(StoreOutBo bo) {
+        StoreOut update = MapstructUtils.convert(bo, StoreOut. class);
+        validEntityBeforeSave(update);
+        List<StoreOutItemBo> itemInfo = bo.getItemInfo();
+        if(!itemInfo.isEmpty()){
+            storeOutItemMapper.hardDeleteByHeadId(update.getId());
+            for (StoreOutItemBo item : itemInfo) {
+                item.setOutId(update.getId());
+                //todo 获取仓库id,默认使用头表的仓库ID,后续逻辑变更再修改
+                item.setStoreHouseId(update.getStoreHouseId());
+                item.setStatus(update.getStatus());
+                storeOutItemService.insertByBo(item);
+            }
+        }
+        return baseMapper.updateById(update) > 0;
+    }
+
+    /**
+     * 保存前的数据校验
+     */
+    private void validEntityBeforeSave(StoreOut entity) {
+        //TODO 做一些数据校验,如唯一约束
+        Long id = entity.getId();
+        LambdaQueryWrapper<StoreOut> lqw = new LambdaQueryWrapper<StoreOut>().eq(StoreOut::getReceiptNum, entity.getReceiptNum());
+
+        if(id != null){
+            lqw.ne(StoreOut::getId, id);
+        }
+        StoreOut s = baseMapper.selectOne(lqw);
+        if(s != null){
+            throw new ServiceException("单据编号已存在!");
+        }
+    }
+
+    /**
+     * 批量删除出库信息管理
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if (isValid) {
+            //TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return baseMapper.deleteByIds(ids) > 0;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean audit(Long id) {
+        StoreOut storeOut = baseMapper.selectById(id);
+        if(storeOut != null){
+            storeOut.setStatus(StoreInOutStatusEnum.PASSED.getCode());
+            storeOut.setAuditDate(DateUtils.getNowDate());
+            storeOut.setAuditUser(LoginHelper.getUserId());
+//同时更新入库单明细状态
+            storeOutItemMapper.update(new LambdaUpdateWrapper<StoreOutItem>().eq(StoreOutItem::getOutId, id).set(StoreOutItem::getStatus, StoreInOutStatusEnum.PASSED.getCode()));
+            return baseMapper.updateById(storeOut) > 0;
+        }
+        return false;
+    }
+    /**
+     * 拒绝入库单
+     */
+    @Override
+    public Boolean reject(Long id) {
+        StoreOut storeOut = baseMapper.selectById(id);
+        if(storeOut != null){
+            storeOut.setStatus(StoreInOutStatusEnum.UNPASSED.getCode());
+            storeOut.setAuditDate(DateUtils.getNowDate());
+            storeOut.setAuditUser(LoginHelper.getUserId());
+            //同时更新入库单明细状态
+            storeOutItemMapper.update(new LambdaUpdateWrapper<StoreOutItem>().eq(StoreOutItem::getOutId, id).set(StoreOutItem::getStatus, StoreInOutStatusEnum.UNPASSED.getCode()));
+            return baseMapper.updateById(storeOut) > 0;
+        }
+        return false;
+    }
+    /**
+     * 作废入库单
+     */
+    @Override
+    public Boolean revoke(Long id) {
+        StoreOut storeOut = baseMapper.selectById(id);
+        if(storeOut != null){
+            storeOut.setStatus(StoreInOutStatusEnum.REVOKE.getCode());
+            //同时更新入库单明细状态
+            storeOutItemMapper.update(new LambdaUpdateWrapper<StoreOutItem>().eq(StoreOutItem::getOutId, id).set(StoreOutItem::getStatus, StoreInOutStatusEnum.REVOKE.getCode()));
+            return baseMapper.updateById(storeOut) > 0;
+        }
+        return false;
+    }
+}

+ 7 - 0
SERVER/ChickenFarmV3/vb-modules/vb-erp/src/main/resources/mapper/erp/StoreInItemMapper.xml

@@ -0,0 +1,7 @@
+<?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="cn.vber.erp.mapper.StoreInItemMapper">
+
+</mapper>

+ 7 - 0
SERVER/ChickenFarmV3/vb-modules/vb-erp/src/main/resources/mapper/erp/StoreInMapper.xml

@@ -0,0 +1,7 @@
+<?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="cn.vber.erp.mapper.StoreInMapper">
+
+</mapper>

+ 7 - 0
SERVER/ChickenFarmV3/vb-modules/vb-erp/src/main/resources/mapper/erp/StoreOutItemMapper.xml

@@ -0,0 +1,7 @@
+<?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="cn.vber.erp.mapper.StoreOutItemMapper">
+
+</mapper>

+ 7 - 0
SERVER/ChickenFarmV3/vb-modules/vb-erp/src/main/resources/mapper/erp/StoreOutMapper.xml

@@ -0,0 +1,7 @@
+<?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="cn.vber.erp.mapper.StoreOutMapper">
+
+</mapper>

+ 74 - 0
UI/VB.VUE/src/api/base/_unitInfo.ts

@@ -0,0 +1,74 @@
+import Rs from "@/core/services/RequestService"
+
+class unitInfoApi {
+	tableUrl = "/base/unitInfo/list"
+	exportUrl = "/base/unitInfo/export"
+
+	// 查询计量单位管理列表
+	list = (query: any) => {
+		return Rs.get({
+			url: "/base/unitInfo/list",
+			params: query,
+			loading: false
+		})
+	}
+
+	listOptions = () => {
+		return Rs.get({
+			url: "/base/unitInfo/options",
+			loading: false
+		})
+	}
+
+	// 查询计量单位管理详细
+	get = (id: string) => {
+		return Rs.get({
+			url: "/base/unitInfo/" + id,
+			loading: false
+		})
+	}
+
+	// 新增或修改计量单位管理
+	addOrUpdate = (data: any) => {
+		return new Promise((resolve) => {
+			if (data.id) {
+				this.update(data).then((res: any) => {
+					message.msgSuccess("修改成功")
+					resolve(res)
+				})
+			} else {
+				this.add(data).then((res: any) => {
+					message.msgSuccess("新增成功")
+					resolve(res)
+				})
+			}
+		})
+	}
+
+	// 新增计量单位管理
+	add = (data: any) => {
+		return Rs.post({
+			url: "/erp/unitInfo",
+			data: data,
+			successAlert: false
+		})
+	}
+
+	// 修改计量单位管理
+	update = (data: any) => {
+		return Rs.put({
+			url: "/erp/unitInfo",
+			data: data,
+			successAlert: false
+		})
+	}
+
+	// 删除计量单位管理
+	del = (id: string | string[]) => {
+		return Rs.del({
+			url: "/erp/unitInfo/" + id
+		})
+	}
+}
+
+export default unitInfoApi

+ 4 - 1
UI/VB.VUE/src/api/base/index.ts

@@ -8,6 +8,7 @@ import VaccineSopDetail from "./_vaccineSopDetail"
 import DrugSop from "./_drugSop"
 import DrugSopDetail from "./_drugSopDetail"
 import VaccineDrugConflict from "./_vaccineDrugConflict"
+import UnitInfo from "./_unitInfo"
 
 export interface IBaseApi {
 	feedApi: Feed
@@ -20,6 +21,7 @@ export interface IBaseApi {
 	drugSopApi: DrugSop
 	drugSopDetailApi: DrugSopDetail
 	vaccineDrugConflictApi: VaccineDrugConflict
+	unitInfoApi: UnitInfo
 }
 
 export const apis: IBaseApi = {
@@ -32,7 +34,8 @@ export const apis: IBaseApi = {
 	vaccineSopDetailApi: new VaccineSopDetail(),
 	drugSopApi: new DrugSop(),
 	drugSopDetailApi: new DrugSopDetail(),
-	vaccineDrugConflictApi: new VaccineDrugConflict()
+	vaccineDrugConflictApi: new VaccineDrugConflict(),
+	unitInfoApi: new UnitInfo()
 }
 
 export default apis

+ 7 - 0
UI/VB.VUE/src/api/erp/_itemInfo.ts

@@ -13,6 +13,13 @@ class itemInfoApi {
 		})
 	}
 
+	autoComplete = (key: string) => {
+		return Rs.get({
+			url: "/erp/itemInfo/listByKey/" + key,
+			loading: false
+		})
+	}
+
 	// 查询ERP物品主数据(管理各类物品基础信息)详细
 	get = (id: string) => {
 		return Rs.get({

+ 16 - 0
UI/VB.VUE/src/api/erp/_storeHouse.ts

@@ -13,6 +13,22 @@ class storeHouseApi {
 		})
 	}
 
+	listOptions = (query: any) => {
+		return Rs.get({
+			url: "/erp/storeHouse/options",
+			params: query,
+			loading: false
+		})
+	}
+
+	// 查询负责人列表
+	listStoreManagerOptions = () => {
+		return Rs.get({
+			url: "/erp/storeHouse/managerOptions",
+			loading: false
+		})
+	}
+
 	// 查询仓库信息详细
 	get = (id: string) => {
 		return Rs.get({

+ 85 - 0
UI/VB.VUE/src/api/erp/_storeIn.ts

@@ -0,0 +1,85 @@
+import Rs from "@/core/services/RequestService"
+
+class storeInApi {
+	tableUrl = "/erp/storeIn/list"
+	exportUrl = "/erp/storeIn/export"
+
+	// 查询入库信息管理列表
+	list = (query: any) => {
+		return Rs.get({
+			url: "/erp/storeIn/list",
+			params: query,
+			loading: false
+		})
+	}
+
+	// 查询入库信息管理详细
+	get = (id: string) => {
+		return Rs.get({
+			url: "/erp/storeIn/" + id,
+			loading: false
+		})
+	}
+
+	// 新增或修改入库信息管理
+	addOrUpdate = (data: any) => {
+		return new Promise((resolve) => {
+			if (data.id) {
+				this.update(data).then((res: any) => {
+					message.msgSuccess("修改成功")
+					resolve(res)
+				})
+			} else {
+				this.add(data).then((res: any) => {
+					message.msgSuccess("新增成功")
+					resolve(res)
+				})
+			}
+		})
+	}
+
+	// 新增入库信息管理
+	add = (data: any) => {
+		return Rs.post({
+			url: "/erp/storeIn",
+			data: data,
+			successAlert: false
+		})
+	}
+
+	// 修改入库信息管理
+	update = (data: any) => {
+		return Rs.put({
+			url: "/erp/storeIn",
+			data: data,
+			successAlert: false
+		})
+	}
+
+	// 删除入库信息管理
+	del = (id: string | string[]) => {
+		return Rs.del({
+			url: "/erp/storeIn/" + id
+		})
+	}
+
+	audit = (id: string | string[]) => {
+		return Rs.put({
+			url: "/erp/storeIn/audit/" + id
+		})
+	}
+
+	reject = (id: string | string[]) => {
+		return Rs.put({
+			url: "/erp/storeIn/reject/" + id
+		})
+	}
+
+	revoke = (id: string | string[]) => {
+		return Rs.put({
+			url: "/erp/storeIn/revoke/" + id
+		})
+	}
+}
+
+export default storeInApi

+ 67 - 0
UI/VB.VUE/src/api/erp/_storeInItem.ts

@@ -0,0 +1,67 @@
+import Rs from "@/core/services/RequestService"
+
+class storeInItemApi {
+	tableUrl = "/erp/storeInItem/list"
+	exportUrl = "/erp/storeInItem/export"
+
+	// 查询入库明细列表
+	list = (query: any) => {
+		return Rs.get({
+			url: "/erp/storeInItem/list",
+			params: query,
+			loading: false
+		})
+	}
+
+	// 查询入库明细详细
+	get = (id: string) => {
+		return Rs.get({
+			url: "/erp/storeInItem/" + id,
+			loading: false
+		})
+	}
+
+	// 新增或修改入库明细
+	addOrUpdate = (data: any) => {
+		return new Promise((resolve) => {
+			if (data.id) {
+				this.update(data).then((res: any) => {
+					message.msgSuccess("修改成功")
+					resolve(res)
+				})
+			} else {
+				this.add(data).then((res: any) => {
+					message.msgSuccess("新增成功")
+					resolve(res)
+				})
+			}
+		})
+	}
+
+	// 新增入库明细
+	add = (data: any) => {
+		return Rs.post({
+			url: "/erp/storeInItem",
+			data: data,
+			successAlert: false
+		})
+	}
+
+	// 修改入库明细
+	update = (data: any) => {
+		return Rs.put({
+			url: "/erp/storeInItem",
+			data: data,
+			successAlert: false
+		})
+	}
+
+	// 删除入库明细
+	del = (id: string | string[]) => {
+		return Rs.del({
+			url: "/erp/storeInItem/" + id
+		})
+	}
+}
+
+export default storeInItemApi

+ 84 - 0
UI/VB.VUE/src/api/erp/_storeOut.ts

@@ -0,0 +1,84 @@
+import Rs from "@/core/services/RequestService"
+
+class storeOutApi {
+	tableUrl = "/erp/storeOut/list"
+	exportUrl = "/erp/storeOut/export"
+
+	// 查询出库信息管理列表
+	list = (query: any) => {
+		return Rs.get({
+			url: "/erp/storeOut/list",
+			params: query,
+			loading: false
+		})
+	}
+
+	// 查询出库信息管理详细
+	get = (id: string) => {
+		return Rs.get({
+			url: "/erp/storeOut/" + id,
+			loading: false
+		})
+	}
+
+	// 新增或修改出库信息管理
+	addOrUpdate = (data: any) => {
+		return new Promise((resolve) => {
+			if (data.id) {
+				this.update(data).then((res: any) => {
+					message.msgSuccess("修改成功")
+					resolve(res)
+				})
+			} else {
+				this.add(data).then((res: any) => {
+					message.msgSuccess("新增成功")
+					resolve(res)
+				})
+			}
+		})
+	}
+
+	// 新增出库信息管理
+	add = (data: any) => {
+		return Rs.post({
+			url: "/erp/storeOut",
+			data: data,
+			successAlert: false
+		})
+	}
+
+	// 修改出库信息管理
+	update = (data: any) => {
+		return Rs.put({
+			url: "/erp/storeOut",
+			data: data,
+			successAlert: false
+		})
+	}
+
+	// 删除出库信息管理
+	del = (id: string | string[]) => {
+		return Rs.del({
+			url: "/erp/storeOut/" + id
+		})
+	}
+	audit = (id: string | string[]) => {
+		return Rs.put({
+			url: "/erp/storeOut/audit/" + id
+		})
+	}
+
+	reject = (id: string | string[]) => {
+		return Rs.put({
+			url: "/erp/storeOut/reject/" + id
+		})
+	}
+
+	revoke = (id: string | string[]) => {
+		return Rs.put({
+			url: "/erp/storeOut/revoke/" + id
+		})
+	}
+}
+
+export default storeOutApi

+ 67 - 0
UI/VB.VUE/src/api/erp/_storeOutItem.ts

@@ -0,0 +1,67 @@
+import Rs from "@/core/services/RequestService"
+
+class storeOutItemApi {
+	tableUrl = "/erp/storeOutItem/list"
+	exportUrl = "/erp/storeOutItem/export"
+
+	// 查询出库明细列表
+	list = (query: any) => {
+		return Rs.get({
+			url: "/erp/storeOutItem/list",
+			params: query,
+			loading: false
+		})
+	}
+
+	// 查询出库明细详细
+	get = (id: string) => {
+		return Rs.get({
+			url: "/erp/storeOutItem/" + id,
+			loading: false
+		})
+	}
+
+	// 新增或修改出库明细
+	addOrUpdate = (data: any) => {
+		return new Promise((resolve) => {
+			if (data.id) {
+				this.update(data).then((res: any) => {
+					message.msgSuccess("修改成功")
+					resolve(res)
+				})
+			} else {
+				this.add(data).then((res: any) => {
+					message.msgSuccess("新增成功")
+					resolve(res)
+				})
+			}
+		})
+	}
+
+	// 新增出库明细
+	add = (data: any) => {
+		return Rs.post({
+			url: "/erp/storeOutItem",
+			data: data,
+			successAlert: false
+		})
+	}
+
+	// 修改出库明细
+	update = (data: any) => {
+		return Rs.put({
+			url: "/erp/storeOutItem",
+			data: data,
+			successAlert: false
+		})
+	}
+
+	// 删除出库明细
+	del = (id: string | string[]) => {
+		return Rs.del({
+			url: "/erp/storeOutItem/" + id
+		})
+	}
+}
+
+export default storeOutItemApi

+ 8 - 0
UI/VB.VUE/src/api/erp/_supplier.ts

@@ -13,6 +13,14 @@ class supplierApi {
 		})
 	}
 
+	listOptions = (query: any) => {
+		return Rs.get({
+			url: "/erp/supplier/options",
+			params: query,
+			loading: false
+		})
+	}
+
 	// 查询供应商管理详细
 	get = (id: string) => {
 		return Rs.get({

+ 13 - 1
UI/VB.VUE/src/api/erp/index.ts

@@ -3,6 +3,10 @@ import StoreHouse from "./_storeHouse"
 import StoreUser from "./_storeUser"
 import Project from "./_project"
 import ItemInfo from "./_itemInfo"
+import StoreInItem from "./_storeInItem"
+import StoreOutItem from "./_storeOutItem"
+import StoreOut from "./_storeOut"
+import StoreIn from "./_storeIn"
 
 export interface IErpApi {
 	supplierApi: Supplier
@@ -10,6 +14,10 @@ export interface IErpApi {
 	storeUserApi: StoreUser
 	projectApi: Project
 	itemInfoApi: ItemInfo
+	storeInItemApi: StoreInItem
+	storeOutItemApi: StoreOutItem
+	storeOutApi: StoreOut
+	storeInApi: StoreIn
 }
 
 export const apis: IErpApi = {
@@ -17,7 +25,11 @@ export const apis: IErpApi = {
 	storeHouseApi: new StoreHouse(),
 	storeUserApi: new StoreUser(),
 	projectApi: new Project(),
-	itemInfoApi: new ItemInfo()
+	itemInfoApi: new ItemInfo(),
+	storeInItemApi: new StoreInItem(),
+	storeOutItemApi: new StoreOutItem(),
+	storeOutApi: new StoreOut(),
+	storeInApi: new StoreIn()
 }
 
 export default apis

+ 65 - 0
UI/VB.VUE/src/views/erp/store/inOutStore/_common.ts

@@ -0,0 +1,65 @@
+import apis from "@a"
+const storeHouseOptions = await apis.erp.storeHouseApi.listOptions({}).then((res: any) => {
+	return res.data.map((item: any) => {
+		return {
+			label: item.storeHouseName,
+			value: item.id
+		}
+	})
+})
+
+const supplierOptions = await apis.erp.supplierApi.listOptions({}).then((res: any) => {
+	return res.data.map((item: any) => {
+		return {
+			label: item.supplierName,
+			value: item.id
+		}
+	})
+})
+
+const unitInfoOptions = await apis.base.unitInfoApi.listOptions().then((res: any) => {
+	return res.map((item: any) => {
+		return {
+			label: item.name,
+			value: item.id
+		}
+	})
+})
+
+const storeMangageListOptions = await apis.erp.storeHouseApi
+	.listStoreManagerOptions()
+	.then((res: any) => {
+		return res.map((item: any) => {
+			return {
+				label: item.nickName || item.userName,
+				value: item.userId
+			}
+		})
+	})
+
+const projectOptions = await apis.erp.projectApi.listOptions({}).then((res: any) => {
+	return res.data.map((item: any) => {
+		return {
+			label: item.projectName || item.projectCode,
+			value: item.id
+		}
+	})
+})
+
+const storeUserOptions = await apis.erp.storeUserApi.listOptions({}).then((res: any) => {
+	return res.data.map((item: any) => {
+		return {
+			label: item.storeUserName || item.storeUserNum,
+			value: item.id
+		}
+	})
+})
+
+export default {
+	storeHouseOptions,
+	supplierOptions,
+	unitInfoOptions,
+	storeMangageListOptions,
+	projectOptions,
+	storeUserOptions
+}

+ 1209 - 0
UI/VB.VUE/src/views/erp/store/inOutStore/_storeIn.vue

@@ -0,0 +1,1209 @@
+<script setup lang="ts" name="StoreIn">
+import apis from "@a"
+import dayjs from "dayjs"
+import common from "./_common"
+import type { ToolBtn } from "@@@/table/models"
+import { Plus } from "@element-plus/icons-vue"
+import StoreInOutHeaderSelect from "@/components/modal-select/StoreInOutHeaderSelect.vue"
+
+const props = withDefaults(
+	defineProps<{
+		isAudit: boolean
+		actions: ("update" | "revoke" | "audit" | "reject" | "detail" | "reSubmit")[]
+		customBtns?: ToolBtn[]
+	}>(),
+	{
+		isAudit: false,
+		customBtns: () => {
+			return []
+		}
+	}
+)
+const tableRef = ref()
+const modalRef = ref()
+const detailModalRef = ref()
+const storeInOutHeaderSelectRef = ref()
+const isEdit = ref(false)
+const isReSubmit = ref(false)
+const detailForm = ref<any>({})
+const opts = reactive({
+	columns: [
+		{ field: "id", name: "", width: 100, isSort: true, visible: false, tooltip: true },
+		{
+			field: "receiptNum",
+			name: "单据编号",
+			visible: true,
+			isSort: false,
+			width: "auto",
+			tooltip: true
+		},
+		{ field: "receiptDate", name: "单据日期", visible: true, isSort: false, width: 185 },
+		{ field: "businessType", name: "业务类型", visible: true, isSort: false, width: 100 },
+		{
+			field: "storeHouseName",
+			name: "仓库",
+			visible: true,
+			isSort: false,
+			width: "auto",
+			tooltip: true
+		},
+		{
+			field: "storeType",
+			name: "入库种类",
+			visible: true,
+			isSort: false,
+			width: 100
+		},
+		{
+			field: "supplierName",
+			name: "供应商",
+			visible: true,
+			isSort: false,
+			width: "auto",
+			tooltip: true
+		},
+		//{ field: "dept", name: "部门", visible: true, isSort: false, width: "auto", tooltip: true },
+		{
+			field: "preparedUserName",
+			name: "制单人",
+			visible: true,
+			isSort: false,
+			width: "auto",
+			tooltip: true
+		},
+		{
+			field: "auditUserName",
+			name: "审核人",
+			visible: true,
+			isSort: false,
+			width: "auto",
+			tooltip: true
+		},
+		{ field: "auditDate", name: "审核日期", visible: true, isSort: false, width: 185 },
+		{
+			field: "status",
+			name: "状态",
+			visible: true,
+			isSort: false,
+			width: 100
+		},
+		//{ field: "remark", name: "备注", visible: true, isSort: false, tooltip: true },
+		{ field: "actions", name: `操作`, width: 150 }
+	] as any[],
+	queryParams: {
+		receiptNum: undefined,
+		dateRangeReceiptDate: undefined,
+		inBusinessType: undefined,
+		storeHouseId: undefined,
+		inStoreType: undefined,
+		supplierId: undefined,
+		dept: undefined,
+		preparedUser: undefined,
+		auditUser: undefined,
+		dateRangeAuditDate: undefined,
+		status: props.isAudit ? 1 : undefined
+	},
+	searchFormItems: [
+		{
+			field: "receiptNum",
+			label: "单据编号",
+			class: "w-100",
+			required: false,
+			placeholder: "请输入单据编号",
+			component: "I",
+			listeners: {
+				keyup: (e: KeyboardEvent) => {
+					if (e.code == "Enter") {
+						handleQuery()
+					}
+				}
+			}
+		},
+		{
+			field: "dateRangeReceiptDate",
+			label: "单据日期",
+			class: "w-100",
+			required: false,
+			component: "D",
+			placeholder: "请选择单据日期",
+			props: {
+				type: "daterange",
+				valueFormat: "YYYY-MM-DD",
+				rangeSeparator: "-",
+				startPlaceholder: "开始日期",
+				endPlaceholder: "结束日期"
+			},
+			listeners: {
+				change: (v: any) => {
+					queryParams.value.dateRangeReceiptDate = v
+					handleQuery()
+				}
+			},
+			span: 5
+		},
+		{
+			field: "inBusinessType",
+			label: "业务类型",
+			class: "w-100",
+			required: false,
+			component: "Dict",
+			props: {
+				placeholder: "请选择业务类型",
+				dictType: "in_business_type",
+				valueIsNumber: 1,
+				type: "select"
+			},
+			listeners: {
+				change: () => {
+					handleQuery()
+				}
+			}
+		},
+		{
+			field: "storeHouseId",
+			label: "仓库",
+			class: "w-100",
+			required: false,
+			placeholder: "请输入",
+			component: "VS",
+			props: {
+				data: () => common.storeHouseOptions,
+				type: "select",
+				valueIsNumber: 1
+			},
+			listeners: {
+				keyup: (e: KeyboardEvent) => {
+					if (e.code == "Enter") {
+						handleQuery()
+					}
+				}
+			}
+		},
+		{
+			field: "inStoreType",
+			label: "入库种类",
+			class: "w-100",
+			required: false,
+			component: "Dict",
+			props: {
+				placeholder: "请选择入库种类",
+				dictType: "in_store_type",
+				valueIsNumber: 1,
+				type: "select"
+			},
+			listeners: {
+				change: () => {
+					handleQuery()
+				}
+			}
+		},
+		{
+			field: "supplierId",
+			label: "供应商",
+			class: "w-100",
+			required: false,
+			placeholder: "请输入供应商",
+			component: "VS",
+			props: {
+				data: () => common.supplierOptions,
+				type: "select",
+				valueIsNumber: 1
+			},
+			listeners: {
+				keyup: (e: KeyboardEvent) => {
+					if (e.code == "Enter") {
+						handleQuery()
+					}
+				}
+			}
+		},
+		{
+			field: "status",
+			label: "状态",
+			class: "w-100",
+			required: false,
+			component: "Dict",
+			props: {
+				placeholder: "请选择状态",
+				dictType: "store_in_out_status",
+				valueIsNumber: 1,
+				type: "select"
+			},
+			listeners: {
+				change: () => {
+					handleQuery()
+				}
+			}
+		}
+	] as any,
+	permission: "erp:storeIn",
+	handleBtns: [],
+	handleFuns: {
+		handleCreate,
+		handleUpdate: () => {
+			const row = tableRef.value.getSelected()
+			handleUpdate(row)
+		},
+		handleDelete: () => {
+			const rows = tableRef.value.getSelecteds()
+			handleDelete(rows)
+		}
+	},
+	customBtns: [],
+	tableListFun: apis.erp.storeInApi.list,
+	getEntityFun: apis.erp.storeInApi.get,
+	deleteEntityFun: apis.erp.storeInApi.del,
+	exportUrl: apis.erp.storeInApi.exportUrl,
+	exportName: "StoreIn",
+	modalTitle: "入库信息管理",
+	formItems: [
+		{
+			field: "receiptNum",
+			label: "单据编号",
+			class: "w-100",
+			span: 8,
+			required: true,
+			placeholder: "请输入单据编号",
+			component: "I"
+		},
+		{
+			field: "receiptDate",
+			label: "单据日期",
+			class: "w-100",
+			span: 8,
+			required: true,
+			component: "D",
+			props: {
+				placeholder: "请选择单据日期",
+				type: "date",
+				valueFormat: "YYYY-MM-DD"
+			}
+		},
+		{
+			field: "businessType",
+			label: "业务类型",
+			span: 8,
+			class: "w-100",
+			required: true,
+			component: "Dict",
+			props: {
+				placeholder: "请选择入库业务类型",
+				dictType: "in_business_type",
+				type: "select",
+				valueIsNumber: 1
+			}
+		},
+		{
+			field: "storeHouseId",
+			label: "仓库",
+			span: 8,
+			class: "w-100",
+			required: true,
+			placeholder: "请输入",
+			component: "VS",
+			props: {
+				data: () => common.storeHouseOptions,
+				type: "select",
+				valueIsNumber: 1
+			}
+		},
+		{
+			field: "storeType",
+			label: "入库种类",
+			class: "w-100",
+			span: 8,
+			required: true,
+			component: "Dict",
+			props: {
+				placeholder: "请选择入库种类",
+				dictType: "in_store_type",
+				type: "select",
+				valueIsNumber: 1
+			}
+		},
+		{
+			field: "supplierId",
+			label: "供应商",
+			class: "w-100",
+			span: 8,
+			required: true,
+			placeholder: "请输入供应商",
+			component: "VS",
+			props: {
+				data: () => common.supplierOptions,
+				type: "select",
+				valueIsNumber: 1
+			}
+		},
+		// {
+		// 	field: "dept",
+		// 	label: "部门",
+		// 	span: 12,
+		// 	class: "w-100",
+		// 	required: false,
+		// 	placeholder: "请输入部门",
+		// 	component: "I"
+		// },
+		// {
+		// 	field: "preparedUser",
+		// 	label: "制单人",
+		// 	class: "w-100",
+		// 	required: false,
+		// 	placeholder: "请输入制单人",
+		// 	component: "VS",
+		// 	props: {
+		// 		data: () => common.storeMangageListOptions,
+		// 		type: "select",
+		// 		valueIsNumber: 1
+		// 	}
+		// },
+		// {
+		// 	field: "auditUser",
+		// 	label: "审核人",
+		// 	class: "w-100",
+		// 	required: false,
+		// 	placeholder: "请输入审核人",
+		// 	component: "VS",
+		// 	props: {
+		// 		data: () => common.storeMangageListOptions,
+		// 		type: "select",
+		// 		valueIsNumber: 1
+		// 	}
+		// },
+		// {
+		// 	field: "auditDate",
+		// 	label: "审核日期",
+		// 	class: "w-100",
+		// 	required: false,
+		// 	component: "D",
+		// 	props: {
+		// 		placeholder: "请选择审核日期",
+		// 		type: "date",
+		// 		valueFormat: "YYYY-MM-DD"
+		// 	}
+		// },
+		// {
+		// 	field: "status",
+		// 	label: "状态",
+		// 	class: "w-100",
+		// 	required: true,
+		// 	component: "Dict",
+		// 	props: {
+		// 		dictType: "store_in_out_status",
+		// 		type: "radio",
+		// 		valueIsNumber: 1
+		// 	}
+		// },
+		{
+			field: "itemInfo",
+			label: "入库详情",
+			class: "w-100",
+			required: true,
+			placeholder: "请输入入库详情",
+			component: "slot",
+			rules: [
+				{
+					validator: (rule: any, value: any, callback: any) => {
+						if (!value || value.length === 0) {
+							callback(new Error("请至少添加一条入库明细"))
+						} else {
+							const valid = value.every(
+								(item: any) =>
+									item.itemName && item.unitId && item.quantity && item.taxInclusivePrice
+							)
+							if (!valid) {
+								callback(new Error("请完善所有入库明细项"))
+							} else {
+								callback()
+							}
+						}
+					},
+					trigger: "blur"
+				}
+			]
+		}
+	] as any,
+	resetForm: () => {
+		form.value = emptyFormData.value
+	},
+	labelWidth: "80px",
+	emptyFormData: {
+		id: undefined,
+		receiptNum: undefined,
+		receiptDate: undefined,
+		businessType: undefined,
+		storeHouseId: undefined,
+		storeType: undefined,
+		supplierId: undefined,
+		dept: undefined,
+		preparedUser: undefined,
+		auditUser: undefined,
+		auditDate: undefined,
+		status: 0,
+		remark: undefined,
+		itemInfo: [] as any[]
+	}
+})
+const { queryParams, emptyFormData } = toRefs(opts)
+const form = ref<any>(emptyFormData.value)
+if (props.isAudit) {
+	opts.customBtns = [
+		{
+			name: "审核",
+			permission: "erp:storeIn:audit",
+			clickFun: () => {
+				const rows = tableRef.value.getSelecteds()
+				if (rows.length !== 1) {
+					message.msgWarning("请选择一条数据进行审核")
+					return
+				}
+				handleAudit(rows[0])
+			},
+			icon: "bi bi-check-circle"
+		},
+		{
+			name: "拒绝入库",
+			permission: "erp:storeIn:reject",
+			clickFun: () => {
+				const rows = tableRef.value.getSelecteds()
+				if (rows.length !== 1) {
+					message.msgWarning("请选择一条数据进行拒绝")
+					return
+				}
+				handleReject(rows[0])
+			},
+			icon: "bi bi-x-circle"
+		}
+	]
+} else {
+	opts.customBtns = [
+		{
+			name: "新增入库",
+			permission: "erp:storeIn:add",
+			clickFun: () => {
+				handleCreate()
+			},
+			icon: "bi bi-plus-square",
+			btnClass: "btn btn-light-info",
+			disabledFun: (c) => {
+				return false // 非审核页面不禁用
+			}
+		},
+		{
+			name: "修改入库",
+			permission: "erp:storeIn:update",
+			clickFun: () => {
+				const row = tableRef.value.getSelected()
+				handleUpdate(row)
+			},
+			icon: "bi bi-arrow-bar-up",
+			btnClass: "btn btn-light-success",
+			disabledFun: (c) => {
+				return c !== 1
+			}
+		}
+		// {
+		// 	name: "撤销",
+		// 	permission: "erp:storeIn:revoke",
+		// 	clickFun: () => {
+		// 		const rows = tableRef.value.getSelecteds()
+		// 		if (rows.length !== 1) {
+		// 			message.msgWarning("请选择一条数据进行撤销")
+		// 			return
+		// 		}
+		// 		handleRevoke(rows[0])
+		// 	},
+		// 	icon: "bi bi-trash",
+		// 	btnClass: "btn btn-light-danger",
+		// 	disabledFun: (c) => {
+		// 		return c !== 1
+		// 	}
+		// }
+	]
+}
+
+// 入库物品明细相关变量和方法
+const itemLoading = ref(false) // 物品搜索加载状态
+
+// 查询物品列表用于autocomplete
+const queryItems = (queryString: string, cb: (results: any[]) => void) => {
+	if (!queryString) {
+		cb([])
+		return
+	}
+
+	itemLoading.value = true
+	apis.erp.itemInfoApi
+		.autoComplete(queryString)
+		.then((res: any) => {
+			itemLoading.value = false
+			const results = res.data.map((item: any) => {
+				return {
+					value: item.itemName,
+					...item
+				}
+			})
+			cb(results)
+		})
+		.catch(() => {
+			itemLoading.value = false
+			cb([])
+		})
+}
+
+// 添加一行明细
+const addItemInfo = () => {
+	if (!form.value.itemInfo) {
+		form.value.itemInfo = []
+	}
+	form.value.itemInfo.push({
+		itemId: undefined,
+		itemName: "",
+		specModel: "",
+		unitId: undefined,
+		unitName: "",
+		quantity: undefined,
+		taxRate: undefined,
+		taxInclusivePrice: undefined,
+		taxInclusiveAmount: undefined
+	})
+}
+
+// 删除一行明细
+const removeItemInfo = (index: number) => {
+	if (form.value.itemInfo && form.value.itemInfo.length > index) {
+		form.value.itemInfo.splice(index, 1)
+	}
+}
+
+// 当选择物品时更新相关信息
+const handleItemSelect = (item: any, index: number) => {
+	if (form.value.itemInfo && form.value.itemInfo[index]) {
+		form.value.itemInfo[index].itemId = item.id
+		form.value.itemInfo[index].itemName = item.itemName
+		form.value.itemInfo[index].specModel = item.specModel
+		form.value.itemInfo[index].unitId = item.unitId
+		// 查找单位名称
+		const unit = common.unitInfoOptions.find((u: any) => u.value === item.unitId)
+		if (unit) {
+			form.value.itemInfo[index].unitName = unit.label
+		}
+	}
+}
+
+// 计算含税金额
+const calculateTaxInclusiveAmount = (index: number) => {
+	if (form.value.itemInfo && form.value.itemInfo[index]) {
+		const item = form.value.itemInfo[index]
+		if (item.quantity && item.taxInclusivePrice) {
+			item.taxInclusiveAmount = item.quantity * item.taxInclusivePrice
+		} else {
+			item.taxInclusiveAmount = undefined
+		}
+	}
+}
+
+/** 再次编辑提交按钮操作 */
+function handleResubmit(row: any) {
+	isEdit.value = true
+	isReSubmit.value = true
+
+	tableRef.value.defaultHandleFuns.handleUpdate("", row)
+}
+
+/** 搜索按钮操作 */
+function handleQuery(query?: any) {
+	query = query || tableRef.value?.getQueryParams() || queryParams.value
+	addDateRange(query, query.dateRangeAuditDate, "AuditDate")
+	addDateRange(query, query.dateRangeCreateTime)
+	addDateRange(query, query.dateRangeUpdateTime, "UpdateTime")
+	tableRef.value?.query(query)
+}
+
+/** 重置按钮操作 */
+function resetQuery(query?: any) {
+	query = query || tableRef.value?.getQueryParams() || queryParams.value
+	query.dateRangeAuditDate = [] as any
+	addDateRange(query, query.dateRangeAuditDate, "AuditDate")
+	query.dateRangeCreateTime = [] as any
+	addDateRange(query, query.dateRangeCreateTime)
+	query.dateRangeUpdateTime = [] as any
+	addDateRange(query, query.dateRangeUpdateTime, "UpdateTime")
+	//
+}
+function handleCreate() {
+	isEdit.value = false
+	tableRef.value.defaultHandleFuns.handleCreate()
+}
+/** 修改按钮操作 */
+function handleUpdate(row: any) {
+	isEdit.value = true
+	isReSubmit.value = false
+	if (row.status === 2 || row.status === 4) {
+		message.msgWarning("已审核通过或者作废的入库单不能修改")
+		return
+	}
+	tableRef.value.defaultHandleFuns.handleUpdate("", row)
+}
+
+/** 删除按钮操作 */
+function handleDelete(rows: any[]) {
+	tableRef.value.defaultHandleFuns.handleDelete("", rows)
+}
+
+/** 审核按钮操作 */
+function handleAudit(row: any) {
+	// 实现审核逻辑
+	console.log("审核入库单", row)
+	if (row.status !== 1) {
+		message.msgWarning("只有待审核的入库单才能审核!")
+		return
+	}
+	// 这里应该调用审核API
+	message
+		.confirm("是否确认审核当前单据?", "确认审核", {
+			confirmButtonText: "确定",
+			cancelButtonText: "取消",
+			type: "warning"
+		})
+		.then(() => {
+			apis.erp.storeInApi.audit(row.id).then(() => {
+				handleQuery()
+			})
+		})
+}
+
+/** 拒绝入库按钮操作 */
+function handleReject(row: any) {
+	// 实现拒绝逻辑
+	if (row.status !== 1) {
+		message.msgWarning("只有待审核的入库单才能拒绝!")
+		return
+	}
+	message
+		.confirm("是否确认拒绝当前单据?", "确认拒绝", {
+			confirmButtonText: "确定",
+			cancelButtonText: "取消",
+			type: "warning"
+		})
+		.then(() => {
+			apis.erp.storeInApi.reject(row.id).then(() => {
+				message.msgSuccess("拒绝成功")
+				handleQuery()
+			})
+		})
+}
+
+function handleRevoke(row: any) {
+	// 实现撤销逻辑
+	console.log("撤销入库单", row)
+	// 这里应该调用撤销API
+	message
+		.confirm("是否确认撤销当前单据?", "确认撤销", {
+			confirmButtonText: "确定",
+			cancelButtonText: "取消",
+			type: "warning"
+		})
+		.then(() => {
+			apis.erp.storeInApi.revoke(row.id).then(() => {
+				handleQuery()
+			})
+		})
+}
+
+/** 提交按钮 */
+function submitForm() {
+	console.log("提交入库单", form.value)
+	if (isReSubmit.value) {
+		// 设置状态为1(待审核)
+		form.value.status = 1
+	}
+	apis.erp.storeInApi.addOrUpdate(form.value).then(() => {
+		handleQuery()
+	})
+}
+function handleStoreInOutHeaderSelect() {
+	storeInOutHeaderSelectRef.value.open()
+}
+function handleStoreInOutHeaderSelectConfirm(ids: any[]) {
+	console.log("选择入库单", ids)
+	//form.value.receiptNum = ids[0].receiptNum
+	if (ids[0] && ids[0].id) {
+		apis.erp.storeInApi.get(ids[0].id).then((res: any) => {
+			form.value = res.data
+			form.value.id = undefined
+			form.value.itemInfo.forEach((item: any) => {
+				item.id = undefined
+			})
+		})
+	}
+}
+
+/** 查看详情按钮操作 */
+function handleDetail(row: any) {
+	// 获取完整的入库单详情数据
+	apis.erp.storeInApi.get(row.id).then((res: any) => {
+		detailForm.value = res.data
+		// 打开详情模态框
+		detailModalRef.value.show()
+	})
+}
+</script>
+<template>
+	<div class="app-container">
+		<VbDataTable
+			ref="tableRef"
+			keyField="id"
+			:columns="opts.columns"
+			:handle-perm="opts.permission"
+			:handle-btns="opts.handleBtns"
+			:handle-funs="opts.handleFuns"
+			:search-form-items="opts.searchFormItems"
+			:custom-btns="opts.customBtns"
+			:remote-fun="opts.tableListFun"
+			:get-entity-fun="opts.getEntityFun"
+			:delete-entity-fun="opts.deleteEntityFun"
+			:export-url="opts.exportUrl"
+			:export-name="opts.exportName"
+			:modal="modalRef"
+			:reset-form-fun="opts.resetForm"
+			v-model:form-data="form"
+			v-model:query-params="queryParams"
+			:check-multiple="true"
+			:reset-search-form-fun="resetQuery"
+			:custom-search-fun="handleQuery">
+			<template #receiptDate="{ row }">
+				{{ dayjs(row.receiptDate).format("YYYY-MM-DD") }}
+			</template>
+			<template #businessType="{ row }">
+				<DictTag type="in_business_type" :value-is-number="1" :value="row.businessType"></DictTag>
+			</template>
+			<template #storeType="{ row }">
+				<DictTag type="in_store_type" :value-is-number="1" :value="row.storeType"></DictTag>
+			</template>
+			<template #auditDate="{ row }">
+				{{ dayjs(row.auditDate).isValid() ? dayjs(row.auditDate).format("YYYY-MM-DD") : "-" }}
+			</template>
+			<template #status="{ row }">
+				<DictTag type="store_in_out_status" :value-is-number="1" :value="row.status"></DictTag>
+			</template>
+			<template #actions="{ row }">
+				<!-- 非审核页面显示修改和删除按钮 -->
+				<template v-if="!isAudit">
+					<vb-tooltip
+						content="修改"
+						placement="top"
+						v-if="actions.includes('update') && row.status !== 2 && row.status !== 4">
+						<el-button
+							link
+							type="primary"
+							@click="handleUpdate(row)"
+							v-hasPermission="'erp:storeIn:edit'">
+							<template #icon>
+								<VbIcon icon-name="notepad-edit" icon-type="duotone" class="fs-3"></VbIcon>
+							</template>
+						</el-button>
+					</vb-tooltip>
+					<vb-tooltip
+						content="作废"
+						placement="top"
+						v-if="actions.includes('revoke') && (row.status === 1 || row.status === 3)">
+						<el-button
+							link
+							type="primary"
+							@click="handleRevoke(row)"
+							v-hasPermission="'erp:storeIn:revoke'">
+							<template #icon>
+								<VbIcon
+									icon-name="trash-square"
+									icon-type="duotone"
+									class="fs-3 text-danger"></VbIcon>
+							</template>
+						</el-button>
+					</vb-tooltip>
+					<vb-tooltip
+						content="重新提交审核"
+						placement="top"
+						v-if="actions.includes('reSubmit') && row.status === 3">
+						<el-button
+							link
+							type="primary"
+							@click="handleResubmit(row)"
+							v-hasPermission="'erp:storeIn:edit'">
+							<template #icon>
+								<VbIcon icon-name="abstract-37" icon-type="solid" class="text-success"></VbIcon>
+							</template>
+						</el-button>
+					</vb-tooltip>
+					<vb-tooltip content="查看详情" placement="top" v-if="actions.includes('detail')">
+						<el-button
+							link
+							type="info"
+							@click="handleDetail(row)"
+							v-hasPermission="'erp:storeIn:detail'">
+							<template #icon>
+								<VbIcon icon-name="eye" icon-type="duotone" class="fs-3"></VbIcon>
+							</template>
+						</el-button>
+					</vb-tooltip>
+				</template>
+
+				<!-- 审核页面显示审核和拒绝入库按钮 -->
+				<template v-else>
+					<vb-tooltip
+						content="审核"
+						placement="top"
+						v-if="actions.includes('audit') && row.status !== 2">
+						<el-button
+							link
+							type="primary"
+							@click="handleAudit(row)"
+							v-hasPermission="'erp:storeIn:audit'">
+							<template #icon>
+								<VbIcon icon-name="check-circle" icon-type="duotone" class="fs-3"></VbIcon>
+							</template>
+						</el-button>
+					</vb-tooltip>
+					<vb-tooltip
+						content="拒绝入库"
+						placement="top"
+						v-if="actions.includes('reject') && row.status !== 2">
+						<el-button
+							link
+							type="danger"
+							@click="handleReject(row)"
+							v-hasPermission="'erp:storeIn:reject'">
+							<template #icon>
+								<VbIcon icon-name="abstract-11" icon-type="solid" class="text-danger"></VbIcon>
+							</template>
+						</el-button>
+					</vb-tooltip>
+					<vb-tooltip content="查看详情" placement="top" v-if="actions.includes('detail')">
+						<el-button
+							link
+							type="info"
+							@click="handleDetail(row)"
+							v-hasPermission="'erp:storeIn:query'">
+							<template #icon>
+								<VbIcon icon-name="eye" icon-type="duotone" class="fs-3"></VbIcon>
+							</template>
+						</el-button>
+					</vb-tooltip>
+				</template>
+			</template>
+		</VbDataTable>
+		<VbModal
+			v-model:modal="modalRef"
+			:title="opts.modalTitle"
+			:form-data="form"
+			modalDialogStyle="max-width:1200px;"
+			:form-items="opts.formItems"
+			:label-width="opts.labelWidth"
+			:confirm-btn-text="isReSubmit ? '重新提交审核' : '提交'"
+			append-to-body
+			@confirm="submitForm">
+			<template #title>
+				<div class="modal-title-container">
+					<span class="modal-title-text">{{ isEdit ? "修改" : "新增" }}</span>
+					<el-button
+						v-if="!isEdit"
+						type="primary"
+						size="small"
+						@click="handleStoreInOutHeaderSelect"
+						class="p-5 template-btn">
+						<VbIcon icon-name="plus-circle" icon-type="solid" class="fs-3"></VbIcon>
+						选择入库单模板
+					</el-button>
+				</div>
+			</template>
+			<template #itemInfo_form>
+				<div class="item-info-table">
+					<el-button type="primary" size="small" @click="addItemInfo" class="mb-2">
+						<el-icon><Plus /></el-icon>
+						添加物品
+					</el-button>
+
+					<el-table :data="form.itemInfo" border style="width: 100%">
+						<el-table-column type="index" label="#" width="50"></el-table-column>
+
+						<el-table-column label="物品名称" width="200">
+							<template #default="{ row, $index }">
+								<el-autocomplete
+									v-model="row.itemName"
+									:fetch-suggestions="queryItems"
+									:loading="itemLoading"
+									placeholder="请输入物品名称"
+									@select="(item) => handleItemSelect(item, $index)"
+									clearable
+									style="width: 100%"
+									:rules="[{ required: true, message: '物品名称不能为空', trigger: 'blur' }]">
+									<template #default="{ item }">
+										<div>{{ item.itemName }}</div>
+										<div class="text-muted">{{ item.specModel }}</div>
+									</template>
+								</el-autocomplete>
+							</template>
+						</el-table-column>
+
+						<el-table-column prop="specModel" label="规格型号" width="150"></el-table-column>
+
+						<el-table-column label="计量单位" width="120">
+							<template #default="{ row }">
+								<!-- <el-select
+									v-model="row.unitId"
+									placeholder="请选择单位"
+									disabled
+									:rules="[{ required: true, message: '计量单位不能为空', trigger: 'blur' }]">
+									<el-option
+										v-for="item in common.unitInfoOptions"
+										:key="item.value"
+										:label="item.label"
+										:value="item.value"></el-option>
+								</el-select> -->
+
+								<!-- <vb-select
+									v-if="row.isAdd"
+									v-model="row.unitId"
+									:data="common.unitInfoOptions"
+									:value-is-number="false"
+									placeholder="请选择单位"></vb-select> -->
+								<span>{{ row.unitName }}</span>
+							</template>
+						</el-table-column>
+
+						<el-table-column label="实收数量" width="120">
+							<template #default="{ row, $index }">
+								<el-input-number
+									v-model="row.quantity"
+									@change="calculateTaxInclusiveAmount($index)"
+									:min="0"
+									controls-position="right"
+									style="width: 100%"
+									:rules="[
+										{ required: true, message: '实收数量不能为空', trigger: 'blur' },
+										{ type: 'number', min: 0.01, message: '实收数量必须大于0', trigger: 'blur' }
+									]"></el-input-number>
+							</template>
+						</el-table-column>
+
+						<el-table-column label="税率%" width="100">
+							<template #default="{ row, $index }">
+								<el-input-number
+									v-model="row.taxRate"
+									@change="calculateTaxInclusiveAmount($index)"
+									:min="0"
+									:max="100"
+									:step="0.1"
+									controls-position="right"
+									style="width: 100%"></el-input-number>
+							</template>
+						</el-table-column>
+
+						<el-table-column label="含税单价" width="120">
+							<template #default="{ row, $index }">
+								<el-input-number
+									v-model="row.taxInclusivePrice"
+									@change="calculateTaxInclusiveAmount($index)"
+									:min="0"
+									:step="0.01"
+									controls-position="right"
+									style="width: 100%"
+									:rules="[
+										{ required: true, message: '含税单价不能为空', trigger: 'blur' },
+										{ type: 'number', min: 0.01, message: '含税单价必须大于0', trigger: 'blur' }
+									]"></el-input-number>
+							</template>
+						</el-table-column>
+
+						<el-table-column
+							label="含税金额"
+							prop="taxInclusiveAmount"
+							width="120"></el-table-column>
+
+						<el-table-column label="操作" width="80">
+							<template #default="{ $index }">
+								<el-button type="danger" size="small" @click="removeItemInfo($index)">
+									删除
+								</el-button>
+							</template>
+						</el-table-column>
+					</el-table>
+				</div>
+			</template>
+		</VbModal>
+
+		<!-- 详情查看模态框 -->
+		<VbModal
+			v-model:modal="detailModalRef"
+			title="入库单详情"
+			modalDialogStyle="max-width:1200px;"
+			:label-width="opts.labelWidth"
+			append-to-body
+			:show-confirm-btn="false">
+			<template #title>
+				<div class="modal-title-container">
+					<span class="modal-title-text">入库单详情</span>
+				</div>
+			</template>
+			<template #body>
+				<div class="header-info">
+					<div class="header-item">
+						<span class="header-label">单据编号:</span>
+						<span class="header-value">{{ detailForm.receiptNum }}</span>
+					</div>
+					<div class="header-item">
+						<span class="header-label">单据日期:</span>
+						<span class="header-value">
+							{{ dayjs(detailForm.receiptDate).format("YYYY-MM-DD") }}
+						</span>
+					</div>
+					<div class="header-item">
+						<span class="header-label">业务类型:</span>
+						<span class="header-value">
+							<DictTag
+								type="in_business_type"
+								:value-is-number="1"
+								:value="detailForm.businessType"></DictTag>
+						</span>
+					</div>
+					<div class="header-item">
+						<span class="header-label">入库种类:</span>
+						<span class="header-value">
+							<DictTag
+								type="in_store_type"
+								:value-is-number="1"
+								:value="detailForm.storeType"></DictTag>
+						</span>
+					</div>
+					<div class="header-item">
+						<span class="header-label">入库单状态:</span>
+						<span class="header-value">
+							<DictTag
+								type="store_in_out_status"
+								:value-is-number="1"
+								:value="detailForm.status"></DictTag>
+						</span>
+					</div>
+					<div class="header-item">
+						<span class="header-label">供应商:</span>
+						<span class="header-value">{{ detailForm.supplierName }}</span>
+					</div>
+					<div class="header-item">
+						<span class="header-label">仓库:</span>
+						<span class="header-value">{{ detailForm.storeHouseName }}</span>
+					</div>
+				</div>
+				<div class="item-info-table">
+					<el-table :data="detailForm.itemInfo" border style="width: 100%">
+						<el-table-column type="index" label="#" width="50"></el-table-column>
+						<el-table-column prop="itemName" label="物品名称" width="200"></el-table-column>
+						<el-table-column prop="specModel" label="规格型号" width="250"></el-table-column>
+						<el-table-column prop="unitName" label="计量单位" width="150"></el-table-column>
+						<el-table-column prop="quantity" label="实收数量" width="150"></el-table-column>
+						<el-table-column prop="taxRate" label="税率%" width="120"></el-table-column>
+						<el-table-column
+							prop="taxInclusivePrice"
+							label="含税单价"
+							width="120"></el-table-column>
+						<el-table-column
+							prop="taxInclusiveAmount"
+							label="含税金额"
+							width="120"></el-table-column>
+					</el-table>
+				</div>
+			</template>
+		</VbModal>
+
+		<StoreInOutHeaderSelect
+			ref="storeInOutHeaderSelectRef"
+			:multiple="false"
+			:in-out-store="0"
+			:show-tag="false"
+			@confirm="handleStoreInOutHeaderSelectConfirm"></StoreInOutHeaderSelect>
+	</div>
+</template>
+
+<style scoped>
+.modal-title-container {
+	display: flex;
+	align-items: center;
+}
+
+.modal-title-text {
+	font-size: 18px;
+	font-weight: bold;
+	margin-right: 15px;
+}
+
+.header-info {
+	display: grid;
+	grid-template-columns: repeat(4, 1fr);
+	gap: 16px;
+	padding: 20px;
+	background-color: #f5f7fa;
+	border-radius: 8px;
+	margin-bottom: 20px;
+}
+
+.item-info-table {
+	padding: 0;
+}
+
+.header-item {
+	display: flex;
+	align-items: center;
+	padding: 4px 0;
+}
+
+.header-label {
+	font-weight: bold;
+	color: #606266;
+	width: 90px;
+	flex-shrink: 0;
+	font-size: 14px;
+}
+
+.header-value {
+	color: #303133;
+	flex: 1;
+	font-size: 14px;
+}
+
+/* 响应式布局 */
+@media (max-width: 1200px) {
+	.header-info {
+		grid-template-columns: repeat(3, 1fr);
+	}
+}
+
+@media (max-width: 992px) {
+	.header-info {
+		grid-template-columns: repeat(2, 1fr);
+	}
+}
+
+@media (max-width: 768px) {
+	.header-info {
+		grid-template-columns: 1fr;
+	}
+}
+
+.template-btn {
+	background: linear-gradient(135deg, #409eff, #1a73e8);
+	border: none;
+	border-radius: 6px;
+	box-shadow: 0 2px 4px rgba(64, 158, 255, 0.3);
+	transition: all 0.3s ease;
+	padding: 8px 16px;
+}
+
+.template-btn:hover {
+	background: linear-gradient(135deg, #1a73e8, #0d5bb8);
+	box-shadow: 0 4px 8px rgba(64, 158, 255, 0.4);
+	transform: translateY(-1px);
+}
+
+.template-btn:active {
+	transform: translateY(1px);
+}
+</style>

+ 7 - 0
UI/VB.VUE/src/views/erp/store/inOutStore/storeIn.vue

@@ -0,0 +1,7 @@
+<script setup lang="ts">
+import StoreIn from "./_storeIn.vue"
+const actions = ["update", "revoke", "detail", "reSubmit"]
+</script>
+<template>
+	<StoreIn :isAudit="false" :actions="actions as any"></StoreIn>
+</template>

+ 47 - 29
UI/VB.VUE/src/views/erp/store/itemInfo/index.vue

@@ -4,6 +4,16 @@ import dayjs from "dayjs"
 
 const tableRef = ref()
 const modalRef = ref()
+const isEdit = ref(false)
+const unitOptions = ref([])
+apis.base.unitInfoApi.listOptions().then((res: any) => {
+	unitOptions.value = res.map((item) => {
+		return {
+			label: item.name,
+			value: item.id
+		}
+	})
+})
 const opts = reactive({
 	columns: [
 		{ field: "id", name: "物品ID", width: 100, isSort: true, visible: false, tooltip: true },
@@ -16,7 +26,14 @@ const opts = reactive({
 			width: "auto",
 			tooltip: true
 		},
-		{ field: "unit", name: "计量单位", visible: true, isSort: false, width: "auto", tooltip: true },
+		{
+			field: "unitName",
+			name: "计量单位",
+			visible: true,
+			isSort: false,
+			width: "auto",
+			tooltip: true
+		},
 		{
 			field: "easyCode",
 			name: "易记编码",
@@ -26,13 +43,13 @@ const opts = reactive({
 			tooltip: true
 		},
 		{ field: "itemType", name: "物品类型", visible: true, isSort: false, width: 100 },
-		{ field: "remark", name: "备注", visible: true, isSort: false, tooltip: true },
+		{ field: "pic", name: "实例图片", visible: true, isSort: false, tooltip: true },
 		{ field: "actions", name: `操作`, width: 150 }
 	] as any[],
 	queryParams: {
 		itemName: undefined,
 		specModel: undefined,
-		unit: undefined,
+		unitId: undefined,
 		easyCode: undefined,
 		itemType: undefined
 	},
@@ -67,21 +84,7 @@ const opts = reactive({
 				}
 			}
 		},
-		{
-			field: "unit",
-			label: "计量单位",
-			class: "w-100",
-			required: false,
-			placeholder: "请输入计量单位",
-			component: "I",
-			listeners: {
-				keyup: (e: KeyboardEvent) => {
-					if (e.code == "Enter") {
-						handleQuery()
-					}
-				}
-			}
-		},
+
 		{
 			field: "easyCode",
 			label: "易记编码",
@@ -135,13 +138,14 @@ const opts = reactive({
 	deleteEntityFun: apis.erp.itemInfoApi.del,
 	exportUrl: apis.erp.itemInfoApi.exportUrl,
 	exportName: "ItemInfo",
-	modalTitle: "ERP物品主数据(管理各类物品基础信息)",
+	modalTitle: "ERP物品",
 	formItems: [
 		{
 			field: "itemName",
 			label: "名称",
 			class: "w-100",
 			required: true,
+			disabled: () => isEdit.value,
 			placeholder: "请输入名称",
 			component: "I"
 		},
@@ -154,12 +158,17 @@ const opts = reactive({
 			component: "I"
 		},
 		{
-			field: "unit",
+			field: "unitId",
 			label: "计量单位",
 			class: "w-100",
 			required: true,
 			placeholder: "请输入计量单位",
-			component: "I"
+			component: "vs",
+			props: {
+				data: () => unitOptions.value,
+				valueIsNumber: 1,
+				type: "select"
+			}
 		},
 		{
 			field: "easyCode",
@@ -183,15 +192,14 @@ const opts = reactive({
 			}
 		},
 		{
-			field: "remark",
-			label: "备注",
+			field: "pic",
+			label: "实例图片",
 			class: "w-100",
 			required: false,
-			placeholder: "请输入备注",
-			component: "I",
+			placeholder: "请上传实例图片",
+			component: "VbUpload",
 			props: {
-				type: "textarea",
-				rows: 5
+				uploadUrl: "resource/oss/upload/erp"
 			}
 		}
 	] as any,
@@ -203,10 +211,11 @@ const opts = reactive({
 		id: undefined,
 		itemName: undefined,
 		specModel: undefined,
-		unit: undefined,
+		unitId: undefined,
 		easyCode: undefined,
 		itemType: undefined,
-		remark: undefined
+		remark: undefined,
+		pic: undefined
 	}
 })
 const { queryParams, emptyFormData } = toRefs(opts)
@@ -230,10 +239,12 @@ function resetQuery(query?: any) {
 	//
 }
 function handleCreate() {
+	isEdit.value = false
 	tableRef.value.defaultHandleFuns.handleCreate()
 }
 /** 修改按钮操作 */
 function handleUpdate(row: any) {
+	isEdit.value = true
 	tableRef.value.defaultHandleFuns.handleUpdate("", row)
 }
 
@@ -275,6 +286,13 @@ function submitForm() {
 			<template #itemType="{ row }">
 				<DictTag type="item_type" :value-is-number="1" :value="row.itemType"></DictTag>
 			</template>
+			<template #pic="{ row }">
+				<VbImagePreview
+					v-if="row.pic"
+					:src="row.pic"
+					:image-style="{ margin: `6px 5px -10px 5px`, padding: 0 }"></VbImagePreview>
+				<span v-else>-</span>
+			</template>
 			<template #actions="{ row }">
 				<vb-tooltip content="修改" placement="top">
 					<el-button

+ 2 - 2
UI/VB.VUE/src/views/erp/store/project/index.vue

@@ -126,7 +126,7 @@ const opts = reactive({
 	deleteEntityFun: apis.erp.projectApi.del,
 	exportUrl: apis.erp.projectApi.exportUrl,
 	exportName: "Project",
-	modalTitle: "特殊统计项目(如XX型新品种研发)",
+	modalTitle: "项目",
 	formItems: [
 		{
 			field: "projectCode",
@@ -192,7 +192,7 @@ const opts = reactive({
 		projectName: undefined,
 		projectCode: undefined,
 		registrationDate: undefined,
-		status: undefined,
+		status: 0,
 		remark: undefined
 	}
 })

+ 31 - 4
UI/VB.VUE/src/views/erp/store/storeHouse/index.vue

@@ -5,6 +5,16 @@ import dayjs from "dayjs"
 const tableRef = ref()
 const modalRef = ref()
 const isEdit = ref(false)
+
+const userOptions = ref([])
+apis.erp.storeHouseApi.listStoreManagerOptions().then((res: any) => {
+	userOptions.value = res.map((item) => {
+		return {
+			label: item.nickName || item.userName,
+			value: item.userId
+		}
+	})
+})
 const opts = reactive({
 	columns: [
 		{ field: "id", name: "", width: 100, isSort: true, visible: false, tooltip: true },
@@ -25,7 +35,14 @@ const opts = reactive({
 			width: "auto",
 			tooltip: true
 		},
-		{ field: "manger", name: "负责人", visible: true, isSort: false, width: "auto", tooltip: true },
+		{
+			field: "mangerName",
+			name: "负责人",
+			visible: true,
+			isSort: false,
+			width: "auto",
+			tooltip: true
+		},
 		{ field: "remark", name: "备注", visible: true, isSort: false, tooltip: true },
 		{ field: "actions", name: `操作`, width: 150 }
 	] as any[],
@@ -90,7 +107,12 @@ const opts = reactive({
 			class: "w-100",
 			required: false,
 			placeholder: "请输入负责人",
-			component: "I",
+			component: "vs",
+			props: {
+				valueIsNumber: 1,
+				data: () => userOptions.value,
+				type: "select"
+			},
 			listeners: {
 				keyup: (e: KeyboardEvent) => {
 					if (e.code == "Enter") {
@@ -156,8 +178,13 @@ const opts = reactive({
 			label: "负责人",
 			class: "w-100",
 			required: false,
-			placeholder: "请输入负责人",
-			component: "I"
+			placeholder: "请选择负责人",
+			component: "vs",
+			props: {
+				valueIsNumber: 1,
+				data: () => userOptions.value,
+				type: "select"
+			}
 		},
 		{
 			field: "remark",

+ 2 - 2
UI/VB.VUE/src/views/erp/store/storeUser/index.vue

@@ -165,7 +165,7 @@ const opts = reactive({
 		},
 		{
 			field: "status",
-			label: "是否停用(0:未停用1:停用)",
+			label: "是否停用",
 			class: "w-100",
 			required: true,
 			component: "Dict",
@@ -197,7 +197,7 @@ const opts = reactive({
 		storeUserNum: undefined,
 		storeUserName: undefined,
 		registrationDate: undefined,
-		status: undefined,
+		status: 0,
 		remark: undefined
 	}
 })

+ 320 - 0
UI/VB.VUE/src/views/erp/store/unitInfo/index.vue

@@ -0,0 +1,320 @@
+<script setup lang="ts" name="UnitInfo">
+import apis from "@a"
+import dayjs from "dayjs"
+
+const tableRef = ref()
+const modalRef = ref()
+const isEdit = ref(false)
+const opts = reactive({
+	columns: [
+		{ field: "id", name: "", width: 100, isSort: true, visible: false, tooltip: true },
+		{ field: "name", name: "单位名称", visible: true, isSort: false, width: "auto", tooltip: true },
+		{
+			field: "unitSymbol",
+			name: "符号",
+			visible: true,
+			isSort: false,
+			width: "auto",
+			tooltip: true
+		},
+		// { field: "golbalFlag", name: "是否国际标准", visible: true, isSort: false, width: 100 },
+		// {
+		// 	field: "conversionRatio",
+		// 	name: "与国际标准的转换率",
+		// 	visible: true,
+		// 	isSort: false,
+		// 	width: "auto",
+		// 	tooltip: true
+		// },
+		{ field: "unitType", name: "单位类型", visible: true, isSort: false, width: 100 },
+		{ field: "remark", name: "备注", visible: true, isSort: false, tooltip: true },
+		{ field: "actions", name: `操作`, width: 150 }
+	] as any[],
+	queryParams: {
+		name: undefined,
+		unitSymbol: undefined,
+		golbalFlag: undefined,
+		conversionRatio: undefined,
+		unitType: undefined
+	},
+	searchFormItems: [
+		{
+			field: "name",
+			label: "单位名称",
+			class: "w-100",
+			required: false,
+			placeholder: "请输入单位名称",
+			component: "I",
+			listeners: {
+				keyup: (e: KeyboardEvent) => {
+					if (e.code == "Enter") {
+						handleQuery()
+					}
+				}
+			}
+		},
+		{
+			field: "unitSymbol",
+			label: "符号",
+			class: "w-100",
+			required: false,
+			placeholder: "请输入符号",
+			component: "I",
+			listeners: {
+				keyup: (e: KeyboardEvent) => {
+					if (e.code == "Enter") {
+						handleQuery()
+					}
+				}
+			}
+		},
+		// {
+		// 	field: "golbalFlag",
+		// 	label: "是否国际标准",
+		// 	class: "w-100",
+		// 	required: false,
+		// 	placeholder: "请输入是否国际标准",
+		// 	component: "I",
+		// 	listeners: {
+		// 		keyup: (e: KeyboardEvent) => {
+		// 			if (e.code == "Enter") {
+		// 				handleQuery()
+		// 			}
+		// 		}
+		// 	}
+		// },
+		// {
+		// 	field: "conversionRatio",
+		// 	label: "与国际标准的转换率",
+		// 	class: "w-100",
+		// 	required: false,
+		// 	placeholder: "请输入与国际标准的转换率",
+		// 	component: "I",
+		// 	listeners: {
+		// 		keyup: (e: KeyboardEvent) => {
+		// 			if (e.code == "Enter") {
+		// 				handleQuery()
+		// 			}
+		// 		}
+		// 	}
+		// },
+		{
+			field: "unitType",
+			label: "单位类型",
+			class: "w-100",
+			required: false,
+			component: "Dict",
+			props: {
+				placeholder: "请选择单位类型",
+				dictType: "unit_type",
+				valueIsNumber: 1,
+				type: "select"
+			},
+			listeners: {
+				change: () => {
+					handleQuery()
+				}
+			}
+		}
+	] as any,
+	permission: "base:unitInfo",
+	handleBtns: [],
+	handleFuns: {
+		handleCreate,
+		handleUpdate: () => {
+			const row = tableRef.value.getSelected()
+			handleUpdate(row)
+		},
+		handleDelete: () => {
+			const rows = tableRef.value.getSelecteds()
+			handleDelete(rows)
+		}
+	},
+	customBtns: [],
+	tableListFun: apis.base.unitInfoApi.list,
+	getEntityFun: apis.base.unitInfoApi.get,
+	deleteEntityFun: apis.base.unitInfoApi.del,
+	exportUrl: apis.base.unitInfoApi.exportUrl,
+	exportName: "UnitInfo",
+	modalTitle: "计量单位管理",
+	formItems: [
+		{
+			field: "name",
+			label: "单位名称",
+			class: "w-100",
+			required: true,
+			disabled: () => isEdit.value,
+			placeholder: "请输入单位名称",
+			component: "I"
+		},
+		{
+			field: "unitSymbol",
+			label: "符号",
+			class: "w-100",
+			required: true,
+			placeholder: "请输入符号",
+			component: "I"
+		},
+		// {
+		// 	field: "golbalFlag",
+		// 	label: "是否国际标准",
+		// 	class: "w-100",
+		// 	required: true,
+		// 	placeholder: "请输入是否国际标准",
+		// 	component: "I"
+		// },
+		// {
+		// 	field: "conversionRatio",
+		// 	label: "与国际标准的转换率",
+		// 	class: "w-100",
+		// 	required: false,
+		// 	placeholder: "请输入与国际标准的转换率",
+		// 	component: "I"
+		// },
+		{
+			field: "unitType",
+			label: "单位类型",
+			class: "w-100",
+			required: true,
+			disabled: () => isEdit.value,
+			component: "Dict",
+			props: {
+				placeholder: "请选择单位类型",
+				dictType: "unit_type",
+				type: "select",
+				valueIsNumber: 1
+			}
+		},
+		{
+			field: "remark",
+			label: "备注",
+			class: "w-100",
+			required: false,
+			placeholder: "请输入备注",
+			component: "I",
+			props: {
+				type: "textarea",
+				rows: 5
+			}
+		}
+	] as any,
+	resetForm: () => {
+		form.value = emptyFormData.value
+	},
+	labelWidth: "80px",
+	emptyFormData: {
+		id: undefined,
+		name: undefined,
+		unitSymbol: undefined,
+		golbalFlag: 0,
+		conversionRatio: 0,
+		unitType: undefined,
+		remark: undefined
+	}
+})
+const { queryParams, emptyFormData } = toRefs(opts)
+const form = ref<any>(emptyFormData.value)
+
+/** 搜索按钮操作 */
+function handleQuery(query?: any) {
+	query = query || tableRef.value?.getQueryParams() || queryParams.value
+	addDateRange(query, query.dateRangeCreateTime)
+	addDateRange(query, query.dateRangeUpdateTime, "UpdateTime")
+	tableRef.value?.query(query)
+}
+
+/** 重置按钮操作 */
+function resetQuery(query?: any) {
+	query = query || tableRef.value?.getQueryParams() || queryParams.value
+	query.dateRangeCreateTime = [] as any
+	addDateRange(query, query.dateRangeCreateTime)
+	query.dateRangeUpdateTime = [] as any
+	addDateRange(query, query.dateRangeUpdateTime, "UpdateTime")
+	//
+}
+function handleCreate() {
+	isEdit.value = false
+	tableRef.value.defaultHandleFuns.handleCreate()
+}
+/** 修改按钮操作 */
+function handleUpdate(row: any) {
+	isEdit.value = true
+	tableRef.value.defaultHandleFuns.handleUpdate("", row)
+}
+
+/** 删除按钮操作 */
+function handleDelete(rows: any[]) {
+	tableRef.value.defaultHandleFuns.handleDelete("", rows)
+}
+
+/** 提交按钮 */
+function submitForm() {
+	apis.base.unitInfoApi.addOrUpdate(form.value).then(() => {
+		handleQuery()
+	})
+}
+</script>
+<template>
+	<div class="app-container">
+		<VbDataTable
+			ref="tableRef"
+			keyField="id"
+			:columns="opts.columns"
+			:handle-perm="opts.permission"
+			:handle-btns="opts.handleBtns"
+			:handle-funs="opts.handleFuns"
+			:search-form-items="opts.searchFormItems"
+			:custom-btns="opts.customBtns"
+			:remote-fun="opts.tableListFun"
+			:get-entity-fun="opts.getEntityFun"
+			:delete-entity-fun="opts.deleteEntityFun"
+			:export-url="opts.exportUrl"
+			:export-name="opts.exportName"
+			:modal="modalRef"
+			:reset-form-fun="opts.resetForm"
+			v-model:form-data="form"
+			v-model:query-params="queryParams"
+			:check-multiple="true"
+			:reset-search-form-fun="resetQuery"
+			:custom-search-fun="handleQuery">
+			<template #golbalFlag="{ row }">
+				<DictTag type="sys_yes_no" :value-is-number="1" :value="row.golbalFlag"></DictTag>
+			</template>
+			<template #unitType="{ row }">
+				<DictTag type="unit_type" :value-is-number="1" :value="row.unitType"></DictTag>
+			</template>
+			<template #actions="{ row }">
+				<vb-tooltip content="修改" placement="top">
+					<el-button
+						link
+						type="primary"
+						@click="handleUpdate(row)"
+						v-hasPermission="'erp:unitInfo:edit'">
+						<template #icon>
+							<VbIcon icon-name="notepad-edit" icon-type="duotone" class="fs-3"></VbIcon>
+						</template>
+					</el-button>
+				</vb-tooltip>
+				<vb-tooltip content="删除" placement="top">
+					<el-button
+						link
+						type="primary"
+						@click="handleDelete([row])"
+						v-hasPermission="'erp:unitInfo:remove'">
+						<template #icon>
+							<VbIcon icon-name="trash-square" icon-type="duotone" class="fs-3"></VbIcon>
+						</template>
+					</el-button>
+				</vb-tooltip>
+			</template>
+		</VbDataTable>
+		<VbModal
+			v-model:modal="modalRef"
+			:title="opts.modalTitle"
+			:form-data="form"
+			:form-items="opts.formItems"
+			:label-width="opts.labelWidth"
+			append-to-body
+			@confirm="submitForm"></VbModal>
+	</div>
+</template>