feat(stock): 优化出入库管理功能

- 在出库单页面添加仓库编码和仓库名称显示列
- 在入库单页面添加仓库选择功能和备注显示列
- 添加单据来源字段用于区分ERP/MES系统来源
- 优化物料管理页面的字段显示和表单布局
- 添加MES系统接口服务支持物料和单据传输
- 修复物料编码重复校验逻辑
- 优化入库单保存时的用户信息获取机制
- 添加安全配置支持MES/ERP接口访问权限
- 重构API控制器支持POST请求方式数据传输
- 优化库存物资视图显示仓库名称信息
This commit is contained in:
liuhanqing
2026-01-04 17:32:39 +08:00
parent cbefbf6129
commit a060574363
20 changed files with 453 additions and 226 deletions

View File

@@ -1,21 +1,17 @@
package com.ruoyi.api.controller; package com.ruoyi.api.controller;
import cn.hutool.json.JSONUtil;
import com.ruoyi.api.domain.ReMaterialParam;
import com.ruoyi.api.domain.RequestEnter;
import com.ruoyi.api.domain.WmsJobRequest;
import com.ruoyi.api.service.IToErpService; import com.ruoyi.api.service.IToErpService;
import com.ruoyi.api.service.IToWmsService;
import com.ruoyi.bas.BasCustomer.domain.BasCustomer; import com.ruoyi.bas.BasCustomer.domain.BasCustomer;
import com.ruoyi.bas.BasProduct.domain.BasProduct; import com.ruoyi.bas.BasProduct.domain.BasProduct;
import com.ruoyi.bas.BasSupplier.domain.BasSupplier; import com.ruoyi.bas.BasSupplier.domain.BasSupplier;
import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.log.domain.RequestLog; import com.ruoyi.in.stockin.domain.vo.InstockInVo;
import com.ruoyi.log.service.IRequestLogService; import com.ruoyi.out.outStockout.domain.OutStockoutVo;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import java.util.Map; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/** /**
* 作业统计 Controller * 作业统计 Controller
@@ -30,14 +26,14 @@ public class ToErpApiController {
/** /**
* 接收物料信息 * 接收物料信息
*/ */
@GetMapping("/receiveMaterial") @PostMapping("/receiveMaterial")
public AjaxResult receiveMaterial(@RequestBody BasProduct basProduct) { public AjaxResult receiveMaterial(@RequestBody BasProduct basProduct) {
return toErpService.receiveMaterial(basProduct); return toErpService.receiveMaterial(basProduct);
} }
/** /**
* 接收客户信息 * 接收客户信息
*/ */
@GetMapping("/receiveCustomer") @PostMapping("/receiveCustomer")
public AjaxResult receiveCustomer(@RequestBody BasCustomer basProduct) { public AjaxResult receiveCustomer(@RequestBody BasCustomer basProduct) {
return toErpService.receiveCustomer(basProduct); return toErpService.receiveCustomer(basProduct);
} }
@@ -45,8 +41,31 @@ public class ToErpApiController {
/** /**
* 接收供应商信息 * 接收供应商信息
*/ */
@GetMapping("/receiveSupplier") @PostMapping("/receiveSupplier")
public AjaxResult receiveSupplier(@RequestBody BasSupplier basSupplier) { public AjaxResult receiveSupplier(@RequestBody BasSupplier basSupplier) {
return toErpService.receiveSupplier(basSupplier); return toErpService.receiveSupplier(basSupplier);
} }
/**
* 获取入库单据信息
*/
@PostMapping("/receiveInBill")
public AjaxResult receiveInBill(@RequestBody InstockInVo inStockinVo) {
return toErpService.receiveInBill(inStockinVo);
}
/**
* 获取出库单据信息
*/
@PostMapping("/receiveOutBill")
public AjaxResult receiveOutBill(@RequestBody OutStockoutVo outStockoutVo) {
return toErpService.receiveOutBill(outStockoutVo);
}
/**
* 单据信息回传
*/
@PostMapping("/callBackInAndOutBill")
public AjaxResult callBackInAndOutBill() {
return toErpService.callBackInAndOutBill();
}
} }

View File

@@ -0,0 +1,50 @@
package com.ruoyi.api.controller;
import com.ruoyi.api.service.IToErpService;
import com.ruoyi.api.service.IToMesService;
import com.ruoyi.bas.BasCustomer.domain.BasCustomer;
import com.ruoyi.bas.BasProduct.domain.BasProduct;
import com.ruoyi.bas.BasSupplier.domain.BasSupplier;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.in.stockin.domain.vo.InstockInVo;
import com.ruoyi.out.outStockout.domain.OutStockoutVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
/**
* 作业统计 Controller
*/
@RestController
@RequestMapping("/api2mes")
public class ToMesApiController {
@Autowired
private IToMesService toMesService;
/**
* 接收物料信息
*/
@PostMapping("/receiveMaterial")
public AjaxResult receiveMaterial(@RequestBody BasProduct basProduct) {
return toMesService.receiveMaterial(basProduct);
}
/**
* 获取入库单据信息
*/
@PostMapping("/receiveInBill")
public AjaxResult receiveInBill(@RequestBody InstockInVo inStockinVo) {
return toMesService.receiveInBill(inStockinVo);
}
/**
* 获取出库单据信息
*/
@PostMapping("/receiveOutBill")
public AjaxResult receiveOutBill(@RequestBody OutStockoutVo outStockoutVo) {
return toMesService.receiveOutBill(outStockoutVo);
}
/**
* 单据信息回传
*/
}

View File

@@ -103,13 +103,4 @@ public class ToWmsApiController {
return ajaxResult; return ajaxResult;
} }
/**
* 接收入库单据
*/
/**
* 接收出库单据
*/
} }

View File

@@ -4,6 +4,8 @@ import com.ruoyi.bas.BasCustomer.domain.BasCustomer;
import com.ruoyi.bas.BasProduct.domain.BasProduct; import com.ruoyi.bas.BasProduct.domain.BasProduct;
import com.ruoyi.bas.BasSupplier.domain.BasSupplier; import com.ruoyi.bas.BasSupplier.domain.BasSupplier;
import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.in.stockin.domain.vo.InstockInVo;
import com.ruoyi.out.outStockout.domain.OutStockoutVo;
import java.util.Map; import java.util.Map;
@@ -22,4 +24,10 @@ public interface IToErpService {
AjaxResult receiveCustomer(BasCustomer basProduct); AjaxResult receiveCustomer(BasCustomer basProduct);
AjaxResult receiveSupplier(BasSupplier basSupplier); AjaxResult receiveSupplier(BasSupplier basSupplier);
AjaxResult receiveInBill(InstockInVo inStockinVo);
AjaxResult receiveOutBill(OutStockoutVo outStockoutVo);
AjaxResult callBackInAndOutBill();
} }

View File

@@ -0,0 +1,33 @@
package com.ruoyi.api.service;
import com.ruoyi.bas.BasCustomer.domain.BasCustomer;
import com.ruoyi.bas.BasProduct.domain.BasProduct;
import com.ruoyi.bas.BasSupplier.domain.BasSupplier;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.in.stockin.domain.vo.InstockInVo;
import com.ruoyi.out.outStockout.domain.OutStockoutVo;
import java.util.Map;
/**
* 作业统计 Service 接口
*/
public interface IToMesService {
Map<String,String> saveTransferBill();
Map<String,String> billCompletedCallBack();
AjaxResult receiveMaterial(BasProduct basProduct);
AjaxResult receiveCustomer(BasCustomer basProduct);
AjaxResult receiveSupplier(BasSupplier basSupplier);
AjaxResult receiveInBill(InstockInVo inStockinVo);
AjaxResult receiveOutBill(OutStockoutVo outStockoutVo);
AjaxResult callBackInAndOutBill();
}

View File

@@ -1,9 +1,6 @@
package com.ruoyi.api.service.impl; package com.ruoyi.api.service.impl;
import cn.hutool.core.util.ObjUtil; import cn.hutool.core.util.ObjUtil;
import cn.hutool.http.HttpUtil;
import com.ruoyi.api.mapper.JobStatisticsMapper;
import com.ruoyi.api.service.IJobStatisticsService;
import com.ruoyi.api.service.IToErpService; import com.ruoyi.api.service.IToErpService;
import com.ruoyi.bas.BasCustomer.domain.BasCustomer; import com.ruoyi.bas.BasCustomer.domain.BasCustomer;
import com.ruoyi.bas.BasCustomer.service.IBasCustomerService; import com.ruoyi.bas.BasCustomer.service.IBasCustomerService;
@@ -11,17 +8,15 @@ import com.ruoyi.bas.BasProduct.domain.BasProduct;
import com.ruoyi.bas.BasProduct.service.IBasProductService; import com.ruoyi.bas.BasProduct.service.IBasProductService;
import com.ruoyi.bas.BasSupplier.domain.BasSupplier; import com.ruoyi.bas.BasSupplier.domain.BasSupplier;
import com.ruoyi.bas.BasSupplier.service.IBasSupplierService; import com.ruoyi.bas.BasSupplier.service.IBasSupplierService;
import com.ruoyi.bas.cargoSpace.mapper.BasCargoSpaceMapper;
import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.utils.DateUtils; import com.ruoyi.in.stockin.domain.vo.InstockInVo;
import com.ruoyi.job.mydojob.domain.MydoJob; import com.ruoyi.in.stockin.service.IInStockinService;
import com.ruoyi.job.mydojob.mapper.MydoJobMapper; import com.ruoyi.out.outStockout.domain.OutStockoutVo;
import com.ruoyi.out.outStockout.service.IOutStockoutService;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List;
import java.util.Map; import java.util.Map;
/** /**
@@ -39,6 +34,12 @@ public class ToErpServiceImpl implements IToErpService {
@Autowired @Autowired
private IBasCustomerService basCustomerService; private IBasCustomerService basCustomerService;
@Autowired
private IInStockinService inStockinService;
@Autowired
private IOutStockoutService outStockoutService;
@Override @Override
public Map<String, String> saveTransferBill() { public Map<String, String> saveTransferBill() {
@@ -58,6 +59,7 @@ public class ToErpServiceImpl implements IToErpService {
public AjaxResult receiveMaterial(BasProduct basProduct) { public AjaxResult receiveMaterial(BasProduct basProduct) {
String productId = basProduct.getProductId(); String productId = basProduct.getProductId();
BasProduct oldProduct = basProductService.selectBasProductByProductId(productId); BasProduct oldProduct = basProductService.selectBasProductByProductId(productId);
basProduct.setSpare1("erp");
if (ObjUtil.isNotNull(oldProduct)){ if (ObjUtil.isNotNull(oldProduct)){
basProductService.updateBasProduct(basProduct); basProductService.updateBasProduct(basProduct);
}else { }else {
@@ -89,4 +91,19 @@ public class ToErpServiceImpl implements IToErpService {
} }
return AjaxResult.success(); return AjaxResult.success();
} }
@Override
public AjaxResult receiveInBill(InstockInVo inStockinVo) {
return inStockinService.insertInStockin(inStockinVo);
}
@Override
public AjaxResult receiveOutBill(OutStockoutVo outStockoutVo) {
return AjaxResult.success("操作成功",outStockoutService.saveBill(outStockoutVo));
}
@Override
public AjaxResult callBackInAndOutBill() {
return null;
}
} }

View File

@@ -0,0 +1,109 @@
package com.ruoyi.api.service.impl;
import cn.hutool.core.util.ObjUtil;
import com.ruoyi.api.service.IToMesService;
import com.ruoyi.bas.BasCustomer.domain.BasCustomer;
import com.ruoyi.bas.BasCustomer.service.IBasCustomerService;
import com.ruoyi.bas.BasProduct.domain.BasProduct;
import com.ruoyi.bas.BasProduct.service.IBasProductService;
import com.ruoyi.bas.BasSupplier.domain.BasSupplier;
import com.ruoyi.bas.BasSupplier.service.IBasSupplierService;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.in.stockin.domain.vo.InstockInVo;
import com.ruoyi.in.stockin.service.IInStockinService;
import com.ruoyi.out.outStockout.domain.OutStockoutVo;
import com.ruoyi.out.outStockout.service.IOutStockoutService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.Map;
/**
* 作业统计 Service 实现
*/
@Service
public class ToMesServiceImpl implements IToMesService {
@Autowired
private IBasProductService basProductService;
@Autowired
private IBasSupplierService basSupplierService;
@Autowired
private IBasCustomerService basCustomerService;
@Autowired
private IInStockinService inStockinService;
@Autowired
private IOutStockoutService outStockoutService;
@Override
public Map<String, String> saveTransferBill() {
HashMap<String, String> map = new HashMap<>();
map.put("code","200");
return map;
}
@Override
public Map<String, String> billCompletedCallBack() {
HashMap<String, String> map = new HashMap<>();
map.put("code","200");
return map;
}
@Override
public AjaxResult receiveMaterial(BasProduct basProduct) {
String productId = basProduct.getProductId();
BasProduct oldProduct = basProductService.selectBasProductByProductId(productId);
basProduct.setSpare1("mes");
if (ObjUtil.isNotNull(oldProduct)){
basProductService.updateBasProduct(basProduct);
}else {
basProductService.insertBasProduct(basProduct);
}
return AjaxResult.success();
}
@Override
public AjaxResult receiveCustomer(BasCustomer basCustomer) {
String customerNo = basCustomer.getId();
BasCustomer oldCustomer = basCustomerService.selectBasCustomerById(customerNo);
if (ObjUtil.isNotNull(oldCustomer)){
basCustomerService.updateBasCustomer(basCustomer);
}else {
basCustomerService.insertBasCustomer(basCustomer);
}
return AjaxResult.success();
}
@Override
public AjaxResult receiveSupplier(BasSupplier basSupplier) {
String supplierNo = basSupplier.getId();
BasSupplier oldSupplier = basSupplierService.selectBasSupplierById(supplierNo);
if (ObjUtil.isNotNull(oldSupplier)){
basSupplierService.updateBasSupplier(basSupplier);
}else {
basSupplierService.insertBasSupplier(basSupplier);
}
return AjaxResult.success();
}
@Override
public AjaxResult receiveInBill(InstockInVo inStockinVo) {
return inStockinService.insertInStockin(inStockinVo);
}
@Override
public AjaxResult receiveOutBill(OutStockoutVo outStockoutVo) {
return AjaxResult.success("操作成功",outStockoutService.saveBill(outStockoutVo));
}
@Override
public AjaxResult callBackInAndOutBill() {
return null;
}
}

View File

@@ -6,6 +6,7 @@ import java.util.List;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.DateUtil;
import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.SecurityUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.math3.stat.descriptive.summary.Product; import org.apache.commons.math3.stat.descriptive.summary.Product;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@@ -20,8 +21,8 @@ import com.ruoyi.bas.BasProduct.service.IBasProductService;
* @date 2025-09-17 * @date 2025-09-17
*/ */
@Service @Service
public class BasProductServiceImpl implements IBasProductService @Slf4j
{ public class BasProductServiceImpl implements IBasProductService {
@Autowired @Autowired
private BasProductMapper basProductMapper; private BasProductMapper basProductMapper;
@@ -32,20 +33,17 @@ public class BasProductServiceImpl implements IBasProductService
* @return 物料管理 * @return 物料管理
*/ */
@Override @Override
public BasProduct selectBasProductByProductGuid(String productGuid) public BasProduct selectBasProductByProductGuid(String productGuid) {
{
return basProductMapper.selectBasProductByProductGuid(productGuid); return basProductMapper.selectBasProductByProductGuid(productGuid);
} }
@Override @Override
public BasProduct selectBasProductByProductId(String productId) public BasProduct selectBasProductByProductId(String productId) {
{
return basProductMapper.selectBasProductByProductId(productId); return basProductMapper.selectBasProductByProductId(productId);
} }
@Override @Override
public List<BasProduct> selectBasProductListByProductIds(List<String> productIds) public List<BasProduct> selectBasProductListByProductIds(List<String> productIds) {
{
return null; return null;
} }
@@ -56,8 +54,7 @@ public class BasProductServiceImpl implements IBasProductService
* @return 物料管理 * @return 物料管理
*/ */
@Override @Override
public List<BasProduct> selectBasProductList(BasProduct basProduct) public List<BasProduct> selectBasProductList(BasProduct basProduct) {
{
return basProductMapper.selectBasProductList(basProduct); return basProductMapper.selectBasProductList(basProduct);
} }
@@ -68,19 +65,23 @@ public class BasProductServiceImpl implements IBasProductService
* @return 结果 * @return 结果
*/ */
@Override @Override
public int insertBasProduct(BasProduct basProduct) public int insertBasProduct(BasProduct basProduct) {
{
BasProduct basProduct1 = basProductMapper.selectBasProductByProductId(basProduct.getProductId()); BasProduct basProduct1 = basProductMapper.selectBasProductByProductId(basProduct.getProductId());
if(basProduct1 != null){ if (basProduct1 != null) {
throw new RuntimeException("物料编号已存在"); throw new RuntimeException("物料编号已存在");
} }
basProduct.setProductGuid(basProduct.getProductId()); basProduct.setProductGuid(basProduct.getProductId());
basProduct.setSpare3(DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss")); basProduct.setSpare3(DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss"));
//获取当前系统登录用户名 try {
String username = SecurityUtils.getUsername(); //获取当前系统登录用户名
basProduct.setSpare4(username); String username = SecurityUtils.getUsername();
basProduct.setSpare1(username);
} catch (Exception e) {
log.error("获取当前系统登录用户名异常", e);
}
return basProductMapper.insertBasProduct(basProduct); return basProductMapper.insertBasProduct(basProduct);
} }
@@ -91,13 +92,12 @@ public class BasProductServiceImpl implements IBasProductService
* @return 结果 * @return 结果
*/ */
@Override @Override
public int updateBasProduct(BasProduct basProduct) public int updateBasProduct(BasProduct basProduct) {
{
BasProduct basProduct1 = new BasProduct(); BasProduct basProduct1 = new BasProduct();
basProduct1.setProductId(basProduct.getProductId()); basProduct1.setProductId(basProduct.getProductId());
basProduct1.setUpdateId(basProduct.getProductGuid()); basProduct1.setUpdateId(basProduct.getProductGuid());
List<BasProduct> basProducts = basProductMapper.selectBasProductList(basProduct1); List<BasProduct> basProducts = basProductMapper.selectBasProductList(basProduct1);
if (CollUtil.isNotEmpty(basProducts)){ if (CollUtil.isNotEmpty(basProducts)) {
throw new RuntimeException("物料编号已存在"); throw new RuntimeException("物料编号已存在");
} }
return basProductMapper.updateBasProduct(basProduct); return basProductMapper.updateBasProduct(basProduct);
@@ -110,8 +110,7 @@ public class BasProductServiceImpl implements IBasProductService
* @return 结果 * @return 结果
*/ */
@Override @Override
public int deleteBasProductByProductGuids(String[] productGuids) public int deleteBasProductByProductGuids(String[] productGuids) {
{
return basProductMapper.deleteBasProductByProductGuids(productGuids); return basProductMapper.deleteBasProductByProductGuids(productGuids);
} }
@@ -122,8 +121,7 @@ public class BasProductServiceImpl implements IBasProductService
* @return 结果 * @return 结果
*/ */
@Override @Override
public int deleteBasProductByProductGuid(String productGuid) public int deleteBasProductByProductGuid(String productGuid) {
{
return basProductMapper.deleteBasProductByProductGuid(productGuid); return basProductMapper.deleteBasProductByProductGuid(productGuid);
} }
} }

View File

@@ -32,6 +32,8 @@ public class InstockInVo {
private String remark; private String remark;
private String stockSource;
private List<BasProduct> productVoList; private List<BasProduct> productVoList;

View File

@@ -16,6 +16,7 @@ import com.ruoyi.in.stockin.mapper.InStockinMapper;
import com.ruoyi.in.stockin.service.IInStockinService; import com.ruoyi.in.stockin.service.IInStockinService;
import com.ruoyi.in.stockindetail.domain.InStockinDetail; import com.ruoyi.in.stockindetail.domain.InStockinDetail;
import com.ruoyi.in.stockindetail.service.IInStockinDetailService; import com.ruoyi.in.stockindetail.service.IInStockinDetailService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
@@ -29,6 +30,7 @@ import java.util.List;
* @date 2025-05-20 * @date 2025-05-20
*/ */
@Service @Service
@Slf4j
public class InStockinServiceImpl implements IInStockinService public class InStockinServiceImpl implements IInStockinService
{ {
@Autowired @Autowired
@@ -100,14 +102,26 @@ public class InStockinServiceImpl implements IInStockinService
inStockin.setStockinGuid(rkdId); inStockin.setStockinGuid(rkdId);
inStockin.setStockinId(rkdId); inStockin.setStockinId(rkdId);
inStockin.setCreateDate(DateUtil.formatDateTime(DateUtil.date())); inStockin.setCreateDate(DateUtil.formatDateTime(DateUtil.date()));
inStockin.setCreateManId(Convert.toStr(SecurityUtils.getUserId())); try {
inStockin.setDepartmentNo(Convert.toStr(SecurityUtils.getDeptId())); if ("1".equals(inStockinVo.getStockSource())){
//inStockin.setSupplierNo(inStockinVo.getSupplierId()); inStockin.setCreateManId(Convert.toStr(SecurityUtils.getUserId()));
inStockin.setDepartmentNo(Convert.toStr(SecurityUtils.getDeptId()));
}else if ("2".equals(inStockinVo.getStockSource())){
inStockin.setCreateManId("1");
inStockin.setDepartmentNo("103");
}else if ("3".equals(inStockinVo.getStockSource())){
inStockin.setCreateManId("1");
inStockin.setDepartmentNo("104");
}
}catch (Exception e){
log.error("入库单保存异常,无用户信息");
}
inStockin.setErpBill(inStockinVo.getErpBill()); inStockin.setErpBill(inStockinVo.getErpBill());
inStockin.setInType(inStockinVo.getInType()); inStockin.setInType(inStockinVo.getInType());
inStockin.setWarehouseId(inStockinVo.getWarehouseId()); inStockin.setWarehouseId(inStockinVo.getWarehouseId());
inStockin.setStatus("1"); inStockin.setStatus("1");
inStockin.setStockSource("1"); inStockin.setStockSource(inStockinVo.getStockSource());
inStockin.setSpare1(inStockinVo.getProductType()); inStockin.setSpare1(inStockinVo.getProductType());
inStockin.setSpare5(inStockinVo.getRemark()); inStockin.setSpare5(inStockinVo.getRemark());
inStockinMapper.insertInStockin(inStockin); inStockinMapper.insertInStockin(inStockin);
@@ -122,7 +136,7 @@ public class InStockinServiceImpl implements IInStockinService
iInStockinDetailService.insertInStockinDetail(inStockinDetail); iInStockinDetailService.insertInStockinDetail(inStockinDetail);
} }
return AjaxResult.success(); return AjaxResult.success("操作成功",rkdId);
} }
/** /**

View File

@@ -130,7 +130,7 @@ public class OutStockoutServiceImpl implements IOutStockoutService
String username = SecurityContextHolder.getContext().getAuthentication().getName(); String username = SecurityContextHolder.getContext().getAuthentication().getName();
outStockout.setCreateManId(username); outStockout.setCreateManId(username);
outStockout.setStatus("1"); outStockout.setStatus("1");
outStockout.setStockoutSource("0"); outStockout.setStockoutSource(outStockoutVo.getOutStockout().getStockoutSource());
// outStockout.setWarehouseId("01"); // outStockout.setWarehouseId("01");
for (int i = 0; i < detailList.size(); i++) { for (int i = 0; i < detailList.size(); i++) {
OutStockoutDetail outStockoutDetail = detailList.get(i); OutStockoutDetail outStockoutDetail = detailList.get(i);

View File

@@ -120,6 +120,16 @@ public class ViewProductAndStock
@Excel(name = "单位") @Excel(name = "单位")
private String unit; private String unit;
@Excel(name = "仓库")
private String warehouseName;
public String getWarehouseName() {
return warehouseName;
}
public void setWarehouseName(String warehouseName) {
this.warehouseName = warehouseName;
}
public String getSupplierName() { public String getSupplierName() {
return supplierName; return supplierName;

View File

@@ -32,10 +32,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<result property="spec" column="spec" /> <result property="spec" column="spec" />
<result property="unit" column="unit" /> <result property="unit" column="unit" />
<result property="supplierName" column="supplier_name" /> <result property="supplierName" column="supplier_name" />
<result property="warehouseName" column="warehouse_name" />
</resultMap> </resultMap>
<sql id="selectViewProductAndStockVo"> <sql id="selectViewProductAndStockVo">
select only_identity, product_id, lot_no, product_name, quantity, warehouse_id, spare1, spare3, spare4, spare5, spare6, voltage, power, phase, distribution, order_id, spare8, price, cargo_no, product_status, parent_id, spare7, create_time, create_sys, spec, unit,supplier_name from view_product_and_stock select only_identity, product_id, lot_no, product_name, quantity, warehouse_id, spare1, spare3, spare4, spare5, spare6, voltage, power, phase, distribution, order_id, spare8, price, cargo_no, product_status, parent_id, spare7, create_time, create_sys, spec, unit,supplier_name,warehouse_name from view_product_and_stock
</sql> </sql>
<select id="selectViewProductAndStockList" parameterType="ViewProductAndStock" resultMap="ViewProductAndStockResult"> <select id="selectViewProductAndStockList" parameterType="ViewProductAndStock" resultMap="ViewProductAndStockResult">

View File

@@ -95,6 +95,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
bs.out_quantity, bs.out_quantity,
bs.spare4, --来源 bs.spare4, --来源
bs.spare1, --用途 bs.spare1, --用途
bs.distribution, --用途
bs.net_weight --重量 bs.net_weight --重量
from bas_stock bs from bas_stock bs
left join bas_product bp on bs.product_id = bp.product_id left join bas_product bp on bs.product_id = bp.product_id

View File

@@ -104,7 +104,7 @@ public class SecurityConfig
// 静态资源,可匿名访问 // 静态资源,可匿名访问
.requestMatchers(HttpMethod.GET, "/", "/*.html", "/**.html", "/**.css", "/**.js", "/profile/**").permitAll() .requestMatchers(HttpMethod.GET, "/", "/*.html", "/**.html", "/**.css", "/**.js", "/profile/**").permitAll()
.requestMatchers("/swagger-ui.html", "/v3/api-docs/**", "/swagger-ui/**", "/druid/**").permitAll() .requestMatchers("/swagger-ui.html", "/v3/api-docs/**", "/swagger-ui/**", "/druid/**").permitAll()
.requestMatchers("/api/**","/api2wms/**").permitAll() .requestMatchers("/api/**","/api2wms/**","/api2erp/**","/api2mes/**").permitAll()
// 除上面外的所有请求全部需要鉴权认证 // 除上面外的所有请求全部需要鉴权认证
.anyRequest().authenticated(); .anyRequest().authenticated();
}) })

View File

@@ -33,7 +33,7 @@
<!-- @keyup.enter.native="handleQuery"--> <!-- @keyup.enter.native="handleQuery"-->
<!-- />--> <!-- />-->
<!-- </el-form-item>--> <!-- </el-form-item>-->
<el-form-item label="图号" prop="cargoNo"> <!-- <el-form-item label="图号" prop="cargoNo">
<el-input <el-input
v-model="queryParams.cargoNo" v-model="queryParams.cargoNo"
placeholder="请输入图号" placeholder="请输入图号"
@@ -48,7 +48,7 @@
clearable clearable
@keyup.enter.native="handleQuery" @keyup.enter.native="handleQuery"
/> />
</el-form-item> </el-form-item>-->
<el-form-item label="规格" prop="spec"> <el-form-item label="规格" prop="spec">
<el-input <el-input
v-model="queryParams.spec" v-model="queryParams.spec"
@@ -177,33 +177,16 @@
<el-table v-loading="loading" :data="BasProductList" @selection-change="handleSelectionChange"> <el-table v-loading="loading" :data="BasProductList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" /> <el-table-column type="selection" width="55" align="center" />
<!-- <el-table-column label="主键" align="center" prop="productGuid" />--> <el-table-column label="合同号" align="center" prop="parentId" />
<el-table-column label="产品号" align="center" prop="cargoNo" />
<el-table-column label="代号" align="center" prop="unit" />
<el-table-column label="物料编码" align="center" prop="productId" /> <el-table-column label="物料编码" align="center" prop="productId" />
<el-table-column label="物料名称" align="center" prop="productName" /> <el-table-column label="物料名称" align="center" prop="productName" />
<el-table-column label="规格型号" align="center" prop="spec" /> <el-table-column label="规格型号" align="center" prop="spec" />
<el-table-column label="图号" align="center" prop="cargoNo" /> <el-table-column label="创建用户" align="center" prop="spare1" />
<el-table-column label="常用编码" align="center" prop="parentId" />
<el-table-column label="物料状态" align="center" prop="spare1" >
<template slot-scope="scope">
<dict-tag :options="dict.type.product_type" :value="scope.row.spare1"/>
</template>
</el-table-column>
<el-table-column label="单位" align="center" prop="unit" />
<el-table-column label="启用标识" align="center" prop="spare7" >
<template slot-scope="scope">
<dict-tag :options="dict.type.sys_yes_no" :value="scope.row.spare7"/>
</template>
</el-table-column>
<el-table-column label="是否系统项" align="center" prop="spare2" >
<template slot-scope="scope">
<dict-tag :options="dict.type.sys_yes_no" :value="scope.row.spare2"/>
</template>
</el-table-column>
<el-table-column label="创建时间" align="center" prop="spare3" /> <el-table-column label="创建时间" align="center" prop="spare3" />
<el-table-column label="创建用户" align="center" prop="spare4" /> <el-table-column label="库存下限" align="center" prop="spare5" />
<el-table-column label="库存上限" align="center" prop="spare5" /> <el-table-column label="库存上限" align="center" prop="spare6" />
<el-table-column label="库存下限" align="center" prop="spare6" />
<el-table-column label="单价" align="center" prop="price" />
<el-table-column label="备注" align="center" prop="remark" /> <el-table-column label="备注" align="center" prop="remark" />
<el-table-column label="操作" align="center" class-name="small-padding fixed-width"> <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template slot-scope="scope"> <template slot-scope="scope">
@@ -236,81 +219,52 @@
<!-- 添加或修改物料管理对话框 --> <!-- 添加或修改物料管理对话框 -->
<el-dialog :title="title" :visible.sync="open" width="500px" append-to-body> <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="80px"> <el-form ref="form" :model="form" :rules="rules" label-width="80px">
<el-form-item label="合同号" prop="parentId">
<el-input v-model="form.parentId" placeholder="请输入合同号" />
</el-form-item>
<el-form-item label="产品号" prop="cargoNo">
<el-input v-model="form.cargoNo" placeholder="请输入产品号" />
</el-form-item>
<el-form-item label="代号" prop="unit">
<el-input v-model="form.unit" placeholder="请输入代号" />
</el-form-item>
<el-form-item label="物料编码" prop="productId"> <el-form-item label="物料编码" prop="productId">
<el-input v-model="form.productId" placeholder="请输入物料编码" /> <el-input v-model="form.productId" placeholder="请输入物料编码" />
</el-form-item> </el-form-item>
<el-form-item label="物料名称" prop="productName"> <el-form-item label="物料名称" prop="productName">
<el-input v-model="form.productName" placeholder="请输入物料名称" /> <el-input v-model="form.productName" placeholder="请输入物料名称" />
</el-form-item> </el-form-item>
<el-form-item label="常用编码" prop="parentId">
<el-input v-model="form.parentId" placeholder="请输入常用编码" />
</el-form-item>
<el-form-item label="单价" prop="price">
<el-input v-model="form.price" placeholder="请输入单价" />
</el-form-item>
<el-form-item label="图号" prop="cargoNo">
<el-input v-model="form.cargoNo" placeholder="请输入图号" />
</el-form-item>
<el-form-item label="单位" prop="unit">
<el-input v-model="form.unit" placeholder="请输入单位" />
</el-form-item>
<el-form-item label="规格型号" prop="spec"> <el-form-item label="规格型号" prop="spec">
<el-input v-model="form.spec" placeholder="请输入规格型号" /> <el-input v-model="form.spec" placeholder="请输入规格型号" />
</el-form-item> </el-form-item>
<!-- <el-form-item label="创建用户" prop="spare1">-->
<!-- <el-input v-model="form.spare1" placeholder="请输入创建用户" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="创建时间" prop="spare3">-->
<!-- <el-date-picker-->
<!-- v-model="form.spare3"-->
<!-- type="datetime"-->
<!-- placeholder="请选择创建时间"-->
<!-- value-format="yyyy-MM-dd HH:mm:ss">-->
<!-- </el-date-picker>-->
<!-- </el-form-item>-->
<el-form-item label="库存下限" prop="spare5">
<el-input v-model="form.spare5" placeholder="请输入库存下限" />
</el-form-item>
<el-form-item label="库存上限" prop="spare6">
<el-input v-model="form.spare6" placeholder="请输入库存上限" />
</el-form-item>
<el-form-item label="备注" prop="remark"> <el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" placeholder="请输入备注" /> <el-input v-model="form.remark" placeholder="请输入备注" />
</el-form-item> </el-form-item>
<el-form-item label="物料状态" prop="spare1">
<el-select v-model="form.spare1" placeholder="请选择物料状态">
<el-option
v-for="dict in dict.type.product_type"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="是否系统项" prop="spare2">
<el-select v-model="form.spare2" placeholder="请选择是否系统项">
<el-option
v-for="dict in dict.type.sys_yes_no"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<!-- <el-form-item label="创建时间" prop="spare3">-->
<!-- <el-input v-model="form.spare3" placeholder="请输入颜色" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="创建用户" prop="spare4">-->
<!-- <el-input v-model="form.spare4" placeholder="请输入创建用户" />-->
<!-- </el-form-item>-->
<el-form-item label="库存上限" prop="spare5">
<el-input v-model="form.spare5" placeholder="请输入库存上限" />
</el-form-item>
<el-form-item label="库存下限" prop="spare6">
<el-input v-model="form.spare6" placeholder="请输入库存下限" />
</el-form-item>
<el-form-item label="启用标识" prop="spare7">
<el-select v-model="form.spare7" placeholder="请选择启用标识">
<el-option
v-for="dict in dict.type.sys_yes_no"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
</el-form> </el-form>
<div slot="footer" class="dialog-footer"> <div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm">确 定</el-button> <el-button type="primary" @click="submitForm">确 定</el-button>
<el-button @click="cancel">取 消</el-button> <el-button @click="cancel">取 消</el-button>
</div> </div>
</el-dialog> </el-dialog>
</div> </div>
</template> </template>

View File

@@ -6,6 +6,23 @@
</div> </div>
<el-form ref="form" :model="form" :rules="rules" label-width="100px"> <el-form ref="form" :model="form" :rules="rules" label-width="100px">
<el-row> <el-row>
<el-col :span="4">
<el-form-item label="仓库" prop="warehouseId">
<el-select
v-model="form.warehouseId"
placeholder="请选择仓库"
clearable
>
<el-option
v-for="item in warehouseOptions"
:key="item.warehouseId"
:label="item.warehouseName"
:value="item.warehouseId"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="4"> <el-col :span="4">
<el-form-item label="订单号" prop="erpBill"> <el-form-item label="订单号" prop="erpBill">
<el-input v-model="form.erpBill" placeholder="请输入订单号"/> <el-input v-model="form.erpBill" placeholder="请输入订单号"/>
@@ -28,9 +45,6 @@
<el-input v-model="form.remark" placeholder="请输入备注"/> <el-input v-model="form.remark" placeholder="请输入备注"/>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="4">
<!-- 供应商选择已移至表格中 -->
</el-col>
</el-row> </el-row>
</el-form> </el-form>
</div> </div>
@@ -440,7 +454,8 @@ export default {
//仓库查询参数 //仓库查询参数
queryWarehouseParams: { queryWarehouseParams: {
pageNum: 1, pageNum: 1,
pageSize: 99 pageSize: 99,
warehouseType:1
}, },
//物料遮盖 //物料遮盖
productLoading: true, productLoading: true,
@@ -630,11 +645,12 @@ export default {
// 构建请求数据 // 构建请求数据
const data = { const data = {
warehouseId: "01", warehouseId: this.form.warehouseId,
supplierId: this.form.supplierId, supplierId: this.form.supplierId,
remark: this.form.remark, remark: this.form.remark,
inType:this.form.inType, inType:this.form.inType,
erpBill:this.form.erpBill, erpBill:this.form.erpBill,
stockSource: "1",
productType:this.form.productType, productType:this.form.productType,
productVoList: this.productList.map(item => ({ productVoList: this.productList.map(item => ({
productId: item.productId, productId: item.productId,

View File

@@ -166,6 +166,7 @@
<el-table-column label="部门" align="left" prop="departmentName"/><!--部门--> <el-table-column label="部门" align="left" prop="departmentName"/><!--部门-->
<el-table-column label="建立时间" align="left" prop="createDate"/><!--建立时间--> <el-table-column label="建立时间" align="left" prop="createDate"/><!--建立时间-->
<el-table-column label="完成日期" align="left" prop="finishDate"/><!--完成日期--> <el-table-column label="完成日期" align="left" prop="finishDate"/><!--完成日期-->
<el-table-column label="备注" align="left" prop="spare5"/><!--备注-->
</el-table> </el-table>
<pagination <pagination

View File

@@ -43,11 +43,8 @@
<!-- 物资明细表格 --> <!-- 物资明细表格 -->
<el-table v-loading="loading" :data="materialList"> <el-table v-loading="loading" :data="materialList">
<el-table-column label="仓库" align="center" prop="warehouseId" > <el-table-column label="仓库编码" align="center" prop="warehouseId" />
<template slot-scope="scope"> <el-table-column label="仓库" align="center" prop="warehouseName" />
<dict-tag :options="dict.type.warehouse" :value="scope.row.warehouseId"/>
</template>
</el-table-column>
<el-table-column label="合同号" align="center" prop="cargoNo" /> <el-table-column label="合同号" align="center" prop="cargoNo" />
<el-table-column label="产品号" align="center" prop="phase" /> <el-table-column label="产品号" align="center" prop="phase" />
<el-table-column label="代号" align="center" prop="fid" /> <el-table-column label="代号" align="center" prop="fid" />
@@ -189,11 +186,8 @@
<el-table v-loading="materialLoading" :data="materialOptions" @selection-change="handleSelectionChange"> <el-table v-loading="materialLoading" :data="materialOptions" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" /> <el-table-column type="selection" width="55" align="center" />
<el-table-column label="序号" align="center" prop="onlyIdentity" /> <el-table-column label="序号" align="center" prop="onlyIdentity" />
<el-table-column label="仓库" align="center" prop="warehouseId" > <el-table-column label="仓库编码" align="center" prop="warehouseId" />
<template slot-scope="scope"> <el-table-column label="仓库" align="center" prop="warehouseName" />
<dict-tag :options="dict.type.warehouse" :value="scope.row.warehouseId"/>
</template>
</el-table-column>
<el-table-column label="合同号" align="center" prop="orderId" /> <el-table-column label="合同号" align="center" prop="orderId" />
<el-table-column label="代号" align="center" prop="distribution" /> <el-table-column label="代号" align="center" prop="distribution" />
<el-table-column label="产品号" align="center" prop="power" /> <el-table-column label="产品号" align="center" prop="power" />
@@ -407,7 +401,8 @@ export default {
customerNo: null, customerNo: null,
customerName: null, // 添加客户名称字段,用于显示 customerName: null, // 添加客户名称字段,用于显示
outType: null, outType: null,
remark:null remark:null,
stockoutSource:"1",
}, },
// 仓库选项 // 仓库选项
warehouseOptions: [], warehouseOptions: [],
@@ -655,6 +650,7 @@ export default {
price:item.spare6, price:item.spare6,
power:item.spare5, power:item.spare5,
warehouseId: item.warehouseId, warehouseId: item.warehouseId,
warehouseName: item.warehouseName,
lotNo: item.lotNo, lotNo: item.lotNo,
voltage:item.spare8, voltage:item.spare8,
onlyIdentity: item.onlyIdentity, onlyIdentity: item.onlyIdentity,

View File

@@ -154,7 +154,7 @@
<el-table v-loading="loading" :data="outStockoutList" @selection-change="handleSelectionChange" @row-click="handleRowClick" max-height="400"> <el-table v-loading="loading" :data="outStockoutList" @selection-change="handleSelectionChange" @row-click="handleRowClick" max-height="400">
<el-table-column type="selection" width="55" align="center" /> <el-table-column type="selection" width="55" align="center" />
<el-table-column label="出库单编号" align="left" prop="stockoutId" /> <!-- 出库单编号 --> <el-table-column label="出库单编号" align="left" prop="stockoutId" /> <!-- 出库单编号 -->
<el-table-column label="仓库" align="left" prop="warehouseName" /><!-- 仓库名称 --> <!-- <el-table-column label="仓库" align="left" prop="warehouseName" />&lt;!&ndash; 仓库名称 &ndash;&gt;-->
<el-table-column label="出库类型" align="left" prop="outType"> <!-- 出库类型 --> <el-table-column label="出库类型" align="left" prop="outType"> <!-- 出库类型 -->
<template slot-scope="scope"> <template slot-scope="scope">
<dict-tag :options="dict.type.out_bill_type" :value="scope.row.outType"/> <dict-tag :options="dict.type.out_bill_type" :value="scope.row.outType"/>
@@ -165,14 +165,21 @@
<dict-tag :options="dict.type.out_bill_status" :value="scope.row.status"/> <dict-tag :options="dict.type.out_bill_status" :value="scope.row.status"/>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="单据来源" align="left" prop="stockoutSource"><!--单据来源-->
<template slot-scope="scope">
<dict-tag :options="dict.type.bill_resource" :value="scope.row.stockoutSource"/>
</template>
</el-table-column>
<el-table-column label="上位单号" align="left" prop="erpStockoutId" width="150"/><!--入库订单-->
<!-- <el-table-column :label="'出口'" align="left" prop="exitId" />--> <!-- <el-table-column :label="'出口'" align="left" prop="exitId" />-->
<!-- <el-table-column :label="'客户编码'" align="left" prop="customerNo" />&lt;!&ndash; 客户编码 &ndash;&gt;--> <!-- <el-table-column :label="'客户编码'" align="left" prop="customerNo" />&lt;!&ndash; 客户编码 &ndash;&gt;-->
<el-table-column label="客户名称" align="left" prop="customerName" /> <!-- <el-table-column label="客户名称" align="left" prop="customerName" />-->
<el-table-column label="建单人" align="left" prop="createManId" /> <!-- 建单人 --> <el-table-column label="建单人" align="left" prop="createManId" /> <!-- 建单人 -->
<el-table-column label="备注" align="center" prop="remark" /> <!-- 备注 -->
<el-table-column label="创建时间" align="left" prop="createDate" /><!-- 创建时间 --> <el-table-column label="创建时间" align="left" prop="createDate" /><!-- 创建时间 -->
<el-table-column label="开始时间" align="left" prop="startDate" /><!-- 开始时间 --> <el-table-column label="开始时间" align="left" prop="startDate" /><!-- 开始时间 -->
<el-table-column label="确认时间" align="left" prop="finishDate" /> <!-- 确认时间 --> <el-table-column label="确认时间" align="left" prop="finishDate" /> <!-- 确认时间 -->
<el-table-column label="备注" align="center" prop="remark" /> <!-- 备注 -->
</el-table> </el-table>
<pagination <pagination
@@ -407,7 +414,7 @@ import {listWarehouse} from "@/api/bas/warehouse";
export default { export default {
name: "OutStockWithDetail", name: "OutStockWithDetail",
dicts: ['out_bill_type', 'out_bill_status', 'product_type', 'quality_type', 'turnover_type', 'sys_yes_no','account_type','origin_type','purpose_type','warehouse'], dicts: ['bill_resource','out_bill_type', 'out_bill_status', 'product_type', 'quality_type', 'turnover_type', 'sys_yes_no','account_type','origin_type','purpose_type','warehouse'],
data() { data() {
return { return {
// 遮罩层 // 遮罩层