diff --git a/oms_web/oms_vue/src/api/base/vendor.js b/oms_web/oms_vue/src/api/base/vendor.js index 9b5973c3..f21eb478 100644 --- a/oms_web/oms_vue/src/api/base/vendor.js +++ b/oms_web/oms_vue/src/api/base/vendor.js @@ -52,10 +52,10 @@ export function exportVendor(query) { }) } -// 获取仓库列表 -export function listAllWarehouse() { +// 获取所有制造商列表 +export function listAllVendor() { return request({ - url: '/warehouse/info/vue/listAll', + url: '/system/vendor/vue/listAll', method: 'get' }) } diff --git a/oms_web/oms_vue/src/api/system/product.js b/oms_web/oms_vue/src/api/system/product.js index 1ef215ca..27fa2850 100644 --- a/oms_web/oms_vue/src/api/system/product.js +++ b/oms_web/oms_vue/src/api/system/product.js @@ -52,10 +52,10 @@ export function exportProduct(query) { }) } -// 获取制造商列表 -export function listAllVendor() { - return request({ - url: '/system/vendor/vue/listAll', - method: 'get' - }) +// a new function that queries a product by its code +export function getProductByCode(code) { + return request({ + url: '/system/product/vue/query/' + code, + method: 'get' + }) } diff --git a/oms_web/oms_vue/src/views/inventory/inner/index.vue b/oms_web/oms_vue/src/views/inventory/inner/index.vue new file mode 100644 index 00000000..eb9ae6ed --- /dev/null +++ b/oms_web/oms_vue/src/views/inventory/inner/index.vue @@ -0,0 +1,631 @@ + + + diff --git a/oms_web/oms_vue/src/views/inventory/outer/components/GenerateDeliveryForm.vue b/oms_web/oms_vue/src/views/inventory/outer/components/GenerateDeliveryForm.vue new file mode 100644 index 00000000..697f1cc1 --- /dev/null +++ b/oms_web/oms_vue/src/views/inventory/outer/components/GenerateDeliveryForm.vue @@ -0,0 +1,254 @@ + + + + + \ No newline at end of file diff --git a/oms_web/oms_vue/src/views/inventory/outer/components/OuterDetails.vue b/oms_web/oms_vue/src/views/inventory/outer/components/OuterDetails.vue new file mode 100644 index 00000000..99f68d68 --- /dev/null +++ b/oms_web/oms_vue/src/views/inventory/outer/components/OuterDetails.vue @@ -0,0 +1,69 @@ + + + diff --git a/oms_web/oms_vue/src/views/inventory/outer/components/OuterForm.vue b/oms_web/oms_vue/src/views/inventory/outer/components/OuterForm.vue new file mode 100644 index 00000000..32e3e1cb --- /dev/null +++ b/oms_web/oms_vue/src/views/inventory/outer/components/OuterForm.vue @@ -0,0 +1,197 @@ + + + + + diff --git a/oms_web/oms_vue/src/views/inventory/outer/index.vue b/oms_web/oms_vue/src/views/inventory/outer/index.vue new file mode 100644 index 00000000..06828a50 --- /dev/null +++ b/oms_web/oms_vue/src/views/inventory/outer/index.vue @@ -0,0 +1,157 @@ + + + diff --git a/ruoyi-sip/src/main/java/com/ruoyi/sip/controller/vue/VueInventoryExecutionController.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/controller/vue/VueInventoryExecutionController.java new file mode 100644 index 00000000..f7708e71 --- /dev/null +++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/controller/vue/VueInventoryExecutionController.java @@ -0,0 +1,105 @@ +package com.ruoyi.sip.controller.vue; + +import cn.hutool.core.collection.CollUtil; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.sip.domain.ProjectOrderInfo; +import com.ruoyi.sip.dto.inventory.CheckOutDto; +import com.ruoyi.sip.dto.inventory.ProductWarehouseInfo; +import com.ruoyi.sip.service.IExecutionTrackService; +import com.ruoyi.sip.service.IInventoryAuthService; +import com.ruoyi.sip.service.IInventoryOuterService; +import com.ruoyi.sip.service.IProjectOrderInfoService; +import com.ruoyi.sip.vo.ExecutionOrderVo; +import org.springframework.beans.factory.annotation.Autowired; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.web.bind.annotation.*; + +import java.util.Collections; +import java.util.HashMap; +import java.util.List; + +/** + * 订单执行跟踪Controller (Vue) + * + * @author ruoyi + * @date 2025-11-17 + */ +@RestController +@RequestMapping("/inventory/execution/vue") +public class VueInventoryExecutionController extends BaseController +{ + @Autowired + private IExecutionTrackService inventoryExecutionService; + + @Autowired + private IInventoryOuterService inventoryOuterService; + @Autowired + private IInventoryAuthService inventoryAuthService; + @Autowired + private IProjectOrderInfoService projectOrderInfoService; + + /** + * 查询订单执行跟踪列表 + */ + @RequiresPermissions("inventory:execution:list") + @GetMapping("/list") + public TableDataInfo list(ProjectOrderInfo projectOrderInfo) + { + projectOrderInfo.setOrderStatus(ProjectOrderInfo.OrderStatus.APPROVE_COMPLETE.getCode()); + if (!inventoryAuthService.authAll()) { + List productCodeList = inventoryAuthService.authProductCode(); + + if (CollUtil.isEmpty(productCodeList)) { + return getDataTable(Collections.emptyList()); + } + projectOrderInfo.setProductCodeList(productCodeList); + } + startPage(); + List list = projectOrderInfoService.selectProjectOrderInfoList(projectOrderInfo); + return getDataTable(list); + } + + /** + * 获取订单执行跟踪详细信息 + */ + @RequiresPermissions("inventory:execution:query") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) + { + HashMap result = new HashMap<>(); + ExecutionOrderVo vo = inventoryExecutionService.selectInfo(id); + result.put("projectOrderInfo", vo.getProjectOrderInfo()); + result.put("productDetailList", vo.getProductDetailList()); + result.put("inventoryOuterList", vo.getInventoryOuterList()); + return success(result); + } + + + + /** + * 撤单 + */ + @RequiresPermissions("inventory:execution:recall") + @PostMapping("/recall") + @Log(title = "执行单撤单", businessType = BusinessType.DELETE) + public AjaxResult recall(@RequestBody Long id) + { + inventoryExecutionService.recall(id); + return AjaxResult.success(); + } + + /** + * 出库预览 + */ + @RequiresPermissions("inventory:execution:edit") + @PostMapping("/checkOut/preview") + public AjaxResult checkOutPreview(@RequestBody CheckOutDto dto) + { + List list = inventoryExecutionService.checkOutPreview(dto.getProductCode(),dto.getQuantity()); + return success(list); + } +} diff --git a/ruoyi-sip/src/main/java/com/ruoyi/sip/controller/vue/VueInventoryOuterController.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/controller/vue/VueInventoryOuterController.java new file mode 100644 index 00000000..7a4bc52c --- /dev/null +++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/controller/vue/VueInventoryOuterController.java @@ -0,0 +1,88 @@ +package com.ruoyi.sip.controller.vue; + +import cn.hutool.core.collection.CollUtil; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.sip.domain.InventoryOuter; +import com.ruoyi.sip.service.IInventoryAuthService; +import com.ruoyi.sip.service.IInventoryOuterService; +import org.springframework.beans.factory.annotation.Autowired; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.web.bind.annotation.*; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +/** + * 出库单Controller (Vue) + * + * @author ruoyi + * @date 2025-11-17 + */ +@RestController +@RequestMapping("/inventory/outer/vue") +public class VueInventoryOuterController extends BaseController +{ + @Autowired + private IInventoryOuterService inventoryOuterService; + @Autowired + private IInventoryAuthService inventoryAuthService; + @GetMapping() + @ResponseBody + public TableDataInfo list(InventoryOuter inventoryOuter) + { + + inventoryOuter.setOuterStatusList(Arrays.asList(InventoryOuter.OuterStatusEnum.WAIT_RECEIVE.getCode(), InventoryOuter.OuterStatusEnum.RECEIVED.getCode())); + if (!inventoryAuthService.authAll()){ + List productCodeList = inventoryAuthService.authProductCode(); + if (CollUtil.isEmpty(productCodeList)){ + return getDataTable(Collections.emptyList()); + } + inventoryOuter.setProductCodeList(productCodeList); + } + startPage(); + List list = inventoryOuterService.selectInventoryOuterList(inventoryOuter); + return getDataTable(list); + } + /** + * 新增出库单 + */ + @RequiresPermissions("inventory:outer:add") + @PostMapping + public AjaxResult add(@RequestBody InventoryOuter inventoryOuter) + { + return toAjax(inventoryOuterService.insertInventoryOuter(inventoryOuter)); + } + + /** + * 删除出库单 + */ + @RequiresPermissions("inventory:outer:remove") + @DeleteMapping("/{id}") + public AjaxResult remove(@PathVariable Long id) + { + return toAjax(inventoryOuterService.deleteInventoryOuterById(id)); + } + + /** + * 修改出库单状态 (确认出库) + */ + @RequiresPermissions("inventory:outer:edit") + @PostMapping("/status") + public AjaxResult updateStatus(@RequestBody InventoryOuter inventoryOuter) + { + return toAjax(inventoryOuterService.updateInventoryOuter(inventoryOuter)); + } + + /** + * 获取出库单详细信息 + */ + @RequiresPermissions("@inventory:outer:query") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) + { + return success(inventoryOuterService.selectInventoryOuterById(id)); + } +} diff --git a/ruoyi-sip/src/main/java/com/ruoyi/sip/controller/vue/VueOmsInventoryInnerController.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/controller/vue/VueOmsInventoryInnerController.java new file mode 100644 index 00000000..2a3dcd2c --- /dev/null +++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/controller/vue/VueOmsInventoryInnerController.java @@ -0,0 +1,122 @@ +package com.ruoyi.sip.controller.vue; + +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.exception.ServiceException; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.sip.domain.OmsInventoryInner; +import com.ruoyi.sip.dto.warehouse.WarehouseInnerExcelDto; +import com.ruoyi.sip.service.IInventoryInfoService; +import com.ruoyi.sip.service.IOmsInventoryInnerService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.util.Collections; +import java.util.List; + +/** + * 入库单信息(Vue) Controller + * + * @author ruoyi + * @date 2025-08-06 + */ +@RestController +@RequestMapping("/inventory/inner/vue") +public class VueOmsInventoryInnerController extends BaseController { + + @Autowired + private IOmsInventoryInnerService omsInventoryInnerService; + + @Autowired + private IInventoryInfoService inventoryInfoService; + + /** + * 查询入库单信息列表 + */ + @GetMapping("/list") + public TableDataInfo list(OmsInventoryInner omsInventoryInner) { + startPage(); + List list = omsInventoryInnerService.selectOmsInventoryInnerList(omsInventoryInner); + return getDataTable(list); + } + + /** + * 获取入库单详细信息 + */ + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) { + return success(omsInventoryInnerService.selectOmsInventoryInnerById(id)); + } + + /** + * 新增入库单信息 + */ + @Log(title = "入库单信息", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody OmsInventoryInner omsInventoryInner) { + return toAjax(omsInventoryInnerService.insertOmsInventoryInner(omsInventoryInner)); + } + + /** + * 修改入库单信息 + */ + @Log(title = "入库单信息", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody OmsInventoryInner omsInventoryInner) { + return toAjax(omsInventoryInnerService.updateOmsInventoryInner(omsInventoryInner)); + } + + /** + * 删除入库单信息 + */ + @Log(title = "入库单信息", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable String ids) { + return toAjax(omsInventoryInnerService.deleteOmsInventoryInnerByIds(ids)); + } + + /** + * 导出入库单信息列表 + */ + @Log(title = "入库单信息", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public AjaxResult export(@RequestBody OmsInventoryInner omsInventoryInner) { + List list = omsInventoryInnerService.selectOmsInventoryInnerList(omsInventoryInner); + ExcelUtil util = new ExcelUtil<>(OmsInventoryInner.class); + return util.exportExcel(list, "入库单信息数据"); + } + + /** + * 导出Excel模板 + */ + @PostMapping("/export/template") + public AjaxResult exportTemplate() { + ExcelUtil util = new ExcelUtil<>(WarehouseInnerExcelDto.class); + return util.exportExcel(Collections.emptyList(), "入库数据模板"); + } + + /** + * 导入产品数据 + */ + @PostMapping("/importData") + public AjaxResult importData(MultipartFile file) throws IOException { + if (file == null || file.isEmpty()) { + return AjaxResult.error("上传文件不能为空"); + } + ExcelUtil util = new ExcelUtil<>(WarehouseInnerExcelDto.class); + try { + List excelList = util.importExcel(file.getInputStream()); + return AjaxResult.success(inventoryInfoService.fillBaseInfo(excelList)); + } catch (ServiceException e) { + return AjaxResult.error(e.getMessage()); + } catch (Exception e) { + logger.error("导入产品数据失败", e); + return AjaxResult.error("导入失败,请检查文件格式或联系管理员"); + } + } +} diff --git a/ruoyi-sip/src/main/java/com/ruoyi/sip/controller/vue/VueProductInfoController.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/controller/vue/VueProductInfoController.java index be4196ae..8f80e7ff 100644 --- a/ruoyi-sip/src/main/java/com/ruoyi/sip/controller/vue/VueProductInfoController.java +++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/controller/vue/VueProductInfoController.java @@ -7,11 +7,13 @@ import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.sip.domain.ProductInfo; +import com.ruoyi.sip.service.IInventoryAuthService; import com.ruoyi.sip.service.IProductInfoService; import org.apache.shiro.authz.annotation.RequiresPermissions; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; +import java.util.Collections; import java.util.List; /** @@ -26,7 +28,8 @@ public class VueProductInfoController extends BaseController { @Autowired private IProductInfoService productInfoService; - + @Autowired + private IInventoryAuthService inventoryAuthService; /** * 查询产品管理列表 */ @@ -77,6 +80,25 @@ public class VueProductInfoController extends BaseController { return toAjax(productInfoService.deleteProductInfoByIds(ids)); } + + /** + * 根据产品编码查询产品信息 + */ + @GetMapping("/query/{productCode}") + public AjaxResult queryByCode(@PathVariable("productCode") String productCode) { + if (!inventoryAuthService.authAll()) { + List authProductCode = inventoryAuthService.authProductCode(); + if (!authProductCode.contains(productCode)) { + return AjaxResult.error("无产品权限"); + } + } + List list = productInfoService.selectProductInfoByCodeList(Collections.singletonList(productCode)); + if (list == null || list.isEmpty()) { + return AjaxResult.error("未找到该产品"); + } + return AjaxResult.success(list.get(0)); + } + /** * 导出产品管理列表 */ diff --git a/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/OmsInventoryInnerServiceImpl.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/OmsInventoryInnerServiceImpl.java index d47caeb0..7678d9e7 100644 --- a/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/OmsInventoryInnerServiceImpl.java +++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/OmsInventoryInnerServiceImpl.java @@ -52,7 +52,14 @@ public class OmsInventoryInnerServiceImpl implements IOmsInventoryInnerService { */ @Override public OmsInventoryInner selectOmsInventoryInnerById(Long id) { - return omsInventoryInnerMapper.selectOmsInventoryInnerById(id); + OmsInventoryInner omsInventoryInner = omsInventoryInnerMapper.selectOmsInventoryInnerById(id); + if (omsInventoryInner != null && StringUtils.isNotEmpty(omsInventoryInner.getInnerCode())) { + InventoryInfo queryParams = new InventoryInfo(); + queryParams.setInnerCode(omsInventoryInner.getInnerCode()); + List inventoryInfos = inventoryInfoService.selectInventoryInfoList(queryParams); + omsInventoryInner.setInventoryInfoList(inventoryInfos); + } + return omsInventoryInner; } /**