Browse Source

[feat]采购管理

采购入库前端页面新增purchaseOrderId作为隐藏字段;新增submitHandler方法:实现被选择的物料才可以入库,如果入库物料中同时包含仓库入库和采购入库,提示需要分开入库;采购入库单子表新增 purchaseOrderChildId、materialPhotourl、warehouseDept、设置通知到货数如果暂收数等于实际采购数或者实际采购数等于通知已到货数显示不可编辑,否则可编辑;并且通知到货数不能为空、只能为数、不能为小数、不能小于0
采购订单实体类 warehouseStorageStatus和仓库保持一致;新增notifyHasArrivedSum,mapper.xml所有方法加上notifyHasArrivedSum字段
采购订单Controller新增 新增采购入库通知单后端接口
采购订单impl层新增: 创建采购入库单方法、新增 生成采购入库单子表方法、新增 生成采购入库单主表方法、新增 生成仓库入库单方法、新增 生成仓库入库单子表方法、新增 更新采购订单子表方法;如果通知已到货数等于实际采购总数,则设置采购订单为全部入库,否则为部分入库,只有不为全部入库之前可以一直发起入库
采购入库单子表新增 批量新增采购入库单子表方法
仓库入库单实体类所有状态类型加上字典属性
仓库入库单详情加上物料型号字段,mapper.xml所有方法加上物料型号字段
仓库入库单详情新增 批量插入仓库入库详情数据方法
按照prd调整,新增仓库入库单前端列表页面
dev
liuxiaoxu 5 days ago
parent
commit
7b000a54bf
  1. 12
      ruoyi-admin/src/main/java/com/ruoyi/purchase/controller/PurchaseOrderController.java
  2. 18
      ruoyi-admin/src/main/java/com/ruoyi/purchase/domain/PurchaseOrder.java
  3. 5
      ruoyi-admin/src/main/java/com/ruoyi/purchase/mapper/PurchaseStorageChildMapper.java
  4. 5
      ruoyi-admin/src/main/java/com/ruoyi/purchase/service/IPurchaseOrderService.java
  5. 253
      ruoyi-admin/src/main/java/com/ruoyi/purchase/service/impl/PurchaseOrderServiceImpl.java
  6. 23
      ruoyi-admin/src/main/java/com/ruoyi/warehouse/domain/WarehouseStorageOrder.java
  7. 16
      ruoyi-admin/src/main/java/com/ruoyi/warehouse/domain/WarehouseStorageOrderDetail.java
  8. 5
      ruoyi-admin/src/main/java/com/ruoyi/warehouse/mapper/WarehouseStorageOrderDetailMapper.java
  9. 7
      ruoyi-admin/src/main/resources/mapper/purchase/PurchaseOrderMapper.xml
  10. 86
      ruoyi-admin/src/main/resources/mapper/purchase/PurchaseStorageChildMapper.xml
  11. 133
      ruoyi-admin/src/main/resources/mapper/warehouse/WarehouseStorageOrderDetailMapper.xml
  12. 132
      ruoyi-admin/src/main/resources/templates/purchase/purchaseOrder/addPurchaseStorage.html
  13. 13
      ruoyi-admin/src/main/resources/templates/purchase/purchaseOrder/purchaseOrder.html
  14. 446
      ruoyi-admin/src/main/resources/templates/purchase/purchaseStorage/purchaseStorage.html

12
ruoyi-admin/src/main/java/com/ruoyi/purchase/controller/PurchaseOrderController.java

@ -214,15 +214,13 @@ public class PurchaseOrderController extends BaseController
/** /**
* 新增采购入库通知单 * 新增采购入库通知单
*/ */
@RequiresPermissions("purchase:purchaseOrder:addPurchaseOrderStorage") @RequiresPermissions("purchase:purchaseOrder:addPurchaseStorage")
@Log(title = "采购订单", businessType = BusinessType.INSERT) @Log(title = "采购订单", businessType = BusinessType.INSERT)
@PostMapping("/addPurchaseOrderStorageSave") @PostMapping("/addPurchaseStorage")
@ResponseBody @ResponseBody
public AjaxResult addPurchaseOrderStorageSave(@RequestBody WarehouseStorageOrder warehouseStorageOrder) { public AjaxResult addPurchaseStorageSave(@RequestBody PurchaseOrder purchaseOrder) {
// 数据校验,确保前端传入数据格式正确
// 生成采购订单编号 return toAjax(purchaseOrderService.addPurchaseStorageSave(purchaseOrder));
// 执行主表插入操作
return toAjax(purchaseOrderService.addPurchaseOrderStorage(warehouseStorageOrder)); // 假设toAjax方法处理成功逻辑
} }

18
ruoyi-admin/src/main/java/com/ruoyi/purchase/domain/PurchaseOrder.java

@ -31,8 +31,8 @@ public class PurchaseOrder extends BaseEntity
@Excel(name = "采购计划单号") @Excel(name = "采购计划单号")
private String purchasePlanCode; private String purchasePlanCode;
/** 采购入库状态(0待采购、1采购中、2待暂收、3部分暂收、4全部暂收、5已暂收、6待入库、7部分入库、8全部入库、9已入库) */ /** 入库状态(0待暂收、1已暂收、2待入库、3部分入库、4全部入库) */
@Excel(name = "采购入库状态",dictType = "eceiptStatus") @Excel(name = "采购入库状态",dictType = "warehouse_storage_status")
private String warehouseStorageStatus; private String warehouseStorageStatus;
/** 打款结案状态(0待打款、1部分打款、2全部打款、3部分结案、4已结案) */ /** 打款结案状态(0待打款、1部分打款、2全部打款、3部分结案、4已结案) */
@ -67,6 +67,11 @@ public class PurchaseOrder extends BaseEntity
@Excel(name = "入库数") @Excel(name = "入库数")
private Integer storageSum; private Integer storageSum;
/** 通知已到货总数 */
@Excel(name = "通知已到货总数")
private Integer notifyHasArrivedSum;
/** 不含税总价(RMB) */ /** 不含税总价(RMB) */
@Excel(name = "不含税总价(RMB)") @Excel(name = "不含税总价(RMB)")
private BigDecimal noRmbSum; private BigDecimal noRmbSum;
@ -249,6 +254,14 @@ public class PurchaseOrder extends BaseEntity
return noRmbSum; return noRmbSum;
} }
public Integer getNotifyHasArrivedSum() {
return notifyHasArrivedSum;
}
public void setNotifyHasArrivedSum(Integer notifyHasArrivedSum) {
this.notifyHasArrivedSum = notifyHasArrivedSum;
}
public void setNoRmbSum(BigDecimal noRmbSum) { public void setNoRmbSum(BigDecimal noRmbSum) {
this.noRmbSum = noRmbSum; this.noRmbSum = noRmbSum;
} }
@ -457,6 +470,7 @@ public class PurchaseOrder extends BaseEntity
.append("sharedInventoryOccupancySum", getSharedInventoryOccupancySum()) .append("sharedInventoryOccupancySum", getSharedInventoryOccupancySum())
.append("refundsExchangesSum", getRefundsExchangesSum()) .append("refundsExchangesSum", getRefundsExchangesSum())
.append("storageSum", getStorageSum()) .append("storageSum", getStorageSum())
.append("notifyHasArrivedSum", getNotifyHasArrivedSum())
.append("noRmbSum", getNoRmbSum()) .append("noRmbSum", getNoRmbSum())
.append("rmbSum", getRmbSum()) .append("rmbSum", getRmbSum())
.append("eceiptType", getEceiptType()) .append("eceiptType", getEceiptType())

5
ruoyi-admin/src/main/java/com/ruoyi/purchase/mapper/PurchaseStorageChildMapper.java

@ -74,4 +74,9 @@ public interface PurchaseStorageChildMapper
* @return 结果 * @return 结果
*/ */
public int restorePurchaseStorageChildById(Long purchaseStorageChildId); public int restorePurchaseStorageChildById(Long purchaseStorageChildId);
/**
* 批量新增采购入库单子表
* */
int insertBatchPurchaseStorageChild(List<PurchaseStorageChild> purchaseStorageChildren);
} }

5
ruoyi-admin/src/main/java/com/ruoyi/purchase/service/IPurchaseOrderService.java

@ -122,4 +122,9 @@ public interface IPurchaseOrderService
AjaxResult uploadSingleFile(MultipartFile file,String purchaseOrderCode); AjaxResult uploadSingleFile(MultipartFile file,String purchaseOrderCode);
/**
* 创建采购入库单
* */
int addPurchaseStorageSave(PurchaseOrder purchaseOrder);
} }

253
ruoyi-admin/src/main/java/com/ruoyi/purchase/service/impl/PurchaseOrderServiceImpl.java

@ -31,10 +31,7 @@ import com.ruoyi.process.general.service.IProcessService;
import com.ruoyi.process.todoitem.mapper.BizTodoItemMapper; import com.ruoyi.process.todoitem.mapper.BizTodoItemMapper;
import com.ruoyi.purchase.domain.*; import com.ruoyi.purchase.domain.*;
import com.ruoyi.purchase.domain.Vo.*; import com.ruoyi.purchase.domain.Vo.*;
import com.ruoyi.purchase.mapper.PurchaseOrderChildMapper; import com.ruoyi.purchase.mapper.*;
import com.ruoyi.purchase.mapper.PurchaseOrderMapper;
import com.ruoyi.purchase.mapper.PurchasePlanChildMapper;
import com.ruoyi.purchase.mapper.PurchasePlanMapper;
import com.ruoyi.purchase.service.IPurchaseOrderService; import com.ruoyi.purchase.service.IPurchaseOrderService;
import com.ruoyi.system.domain.SysAttachFile; import com.ruoyi.system.domain.SysAttachFile;
import com.ruoyi.system.domain.SysCompanyInformation; import com.ruoyi.system.domain.SysCompanyInformation;
@ -97,12 +94,23 @@ public class PurchaseOrderServiceImpl implements IPurchaseOrderService
@Autowired @Autowired
private PurchasePlanMapper purchasePlanMapper; private PurchasePlanMapper purchasePlanMapper;
@Autowired
private PurchaseStorageMapper purchaseStorageMapper;
@Autowired
private PurchaseStorageChildMapper purchaseStorageChildMapper;
@Autowired @Autowired
private RedisCache redisCache; private RedisCache redisCache;
@Autowired @Autowired
private WarehouseStorageOrderMapper warehouseStorageOrderMapper; private WarehouseStorageOrderMapper warehouseStorageOrderMapper;
@Autowired
private WarehouseStorageOrderDetailMapper warehouseStorageOrderDetailMapper;
@Autowired @Autowired
private WarehouseStorageOrderDetailMapper storageOrderDetailMapper; private WarehouseStorageOrderDetailMapper storageOrderDetailMapper;
@ -1156,6 +1164,243 @@ public class PurchaseOrderServiceImpl implements IPurchaseOrderService
} }
/**
* 创建采购入库单
* */
@Transactional(rollbackFor = Exception.class)
@Override
public int addPurchaseStorageSave(PurchaseOrder purchaseOrder) {
Long purchaseOrderId = purchaseOrder.getPurchaseOrderId();
List<PurchaseOrderChild> purchaseOrderChildList = purchaseOrder.getPurchaseOrderChildList();
//过滤掉通知已到货数为空的数据
purchaseOrderChildList = purchaseOrderChildList.stream().filter(item -> item.getNotifyArriveNum() != null).collect(Collectors.toList());
boolean allNotifyArriveNum = purchaseOrderChildList.stream().allMatch(item -> item.getNotifyArriveNum() == 0);
if (allNotifyArriveNum){
throw new BusinessException("通知到货数不能都为0");
}
//过滤掉通知到货数为0的数据
List<PurchaseOrderChild> filterPurchaseOrderChildList = purchaseOrderChildList.stream().filter(item -> item.getNotifyArriveNum() != 0).collect(Collectors.toList());
purchaseOrder = purchaseOrderMapper.selectPurchaseOrderById(purchaseOrderId);
String warehouseStorageCode = redisCache.generateBillNo("RK");
//生成采购入库单子表
buildPurchaseStorageChild(purchaseOrder, warehouseStorageCode,filterPurchaseOrderChildList);
//生成采购入库单主表
buildPurchaseStorage(purchaseOrder, filterPurchaseOrderChildList, warehouseStorageCode);
//生成仓库入库单
buildWarehouseStorage(purchaseOrder, warehouseStorageCode,filterPurchaseOrderChildList);
//生成仓库入库单子表
buildWarehouseChild(purchaseOrder, warehouseStorageCode,filterPurchaseOrderChildList);
//更新采购订单子表
updatePurchaseOrderChildData(purchaseOrder, filterPurchaseOrderChildList);
int allNotifyArrivedNum = filterPurchaseOrderChildList.stream().mapToInt(PurchaseOrderChild::getNotifyArriveNum).sum();
int allNotifyHasArrivedNum = filterPurchaseOrderChildList.stream().mapToInt(PurchaseOrderChild::getNotifyHasArrivedNum).sum();
if (allNotifyHasArrivedNum == 0){
purchaseOrder.setNotifyHasArrivedSum(allNotifyArrivedNum);
}else {
purchaseOrder.setNotifyHasArrivedSum(allNotifyHasArrivedNum + allNotifyArrivedNum);
}
if (purchaseOrder.getNotifyHasArrivedSum().equals(purchaseOrder.getActualPurchaseSum())){
purchaseOrder.setWarehouseStorageStatus("4");
}if (purchaseOrder.getNotifyHasArrivedSum() < purchaseOrder.getActualPurchaseSum()){
purchaseOrder.setWarehouseStorageStatus("3");
}
return purchaseOrderMapper.updatePurchaseOrder(purchaseOrder);
}
//采购入库更新采购订单子表的数据
private void updatePurchaseOrderChildData(PurchaseOrder purchaseOrder, List<PurchaseOrderChild> filterPurchaseOrderChildList) {
for (PurchaseOrderChild purchaseOrderChild : filterPurchaseOrderChildList) {
if (purchaseOrderChild.getNotifyHasArrivedNum() == 0 || purchaseOrderChild.getNotifyHasArrivedNum() == null){
purchaseOrderChild.setNotifyHasArrivedNum(purchaseOrderChild.getNotifyArriveNum());
}else {
purchaseOrderChild.setNotifyHasArrivedNum(purchaseOrderChild.getNotifyHasArrivedNum() + purchaseOrderChild.getNotifyArriveNum());
}
int updatePurchaseOrderChild = purchaseOrderChildMapper.updatePurchaseOrderChild(purchaseOrderChild);
if (updatePurchaseOrderChild <= 0){
throw new BusinessException("更新采购订单子表数据失败");
}
}
}
//采购入库生成采购入库单主表
private void buildPurchaseStorage(PurchaseOrder purchaseOrder, List<PurchaseOrderChild> filterPurchaseOrderChildList, String warehouseStorageCode) {
PurchaseStorage purchaseStorage = new PurchaseStorage();
PurchaseOrderChild purchaseOrderChild = filterPurchaseOrderChildList.get(0);
purchaseStorage.setWarehouseStorageStatus("0");
purchaseStorage.setWarehouseStorageType("5");
purchaseStorage.setWarehouseDeptType(purchaseOrderChild.getWarehouseDept());
purchaseStorage.setWarehouseQualityStatus("0");
purchaseStorage.setWarehouseOrderType("0");
purchaseStorage.setArrivedTime(purchaseOrder.getArrivedTime());
purchaseStorage.setRelatedOrderCode(purchaseOrder.getPurchaseOrderCode());
purchaseStorage.setSupplierCode(purchaseOrder.getSupplierCode());
purchaseStorage.setSupplierName(purchaseOrder.getSupplierName());
purchaseStorage.setWarehouseStorageCode(warehouseStorageCode);
int allNotifyArrivedNum = filterPurchaseOrderChildList.stream().mapToInt(PurchaseOrderChild::getNotifyArriveNum).sum();
int allNotifyHasArrivedNum = filterPurchaseOrderChildList.stream().mapToInt(PurchaseOrderChild::getNotifyHasArrivedNum).sum();
if (allNotifyHasArrivedNum == 0){
purchaseStorage.setNotifyArrivedSum(allNotifyArrivedNum);
}else {
purchaseStorage.setNotifyArrivedSum(allNotifyHasArrivedNum + allNotifyArrivedNum);
}
purchaseStorage.setActualArrivedSum(allNotifyArrivedNum);
int insertResult = purchaseStorageMapper.insertPurchaseStorage(purchaseStorage);
if (insertResult <= 0){
throw new BusinessException("生成采购入库单数据失败");
}
}
//采购入库生成仓库入库主表数据
private void buildWarehouseStorage(PurchaseOrder purchaseOrder, String warehouseStorageCode, List<PurchaseOrderChild> filterPurchaseOrderChildList) {
PurchaseOrderChild purchaseOrderChild = filterPurchaseOrderChildList.get(0);
WarehouseStorageOrder warehouseStorageOrder = new WarehouseStorageOrder();
warehouseStorageOrder.setWarehouseStorageCode(warehouseStorageCode);
warehouseStorageOrder.setWarehouseStorageStatus("0");
warehouseStorageOrder.setWarehouseStorageType("5");
warehouseStorageOrder.setWarehouseDeptType(purchaseOrderChild.getWarehouseDept());
warehouseStorageOrder.setWarehouseQualityStatus("0");
warehouseStorageOrder.setWarehouseOrderType("0");
int allNotifyArrivedNum = filterPurchaseOrderChildList.stream().mapToInt(PurchaseOrderChild::getNotifyArriveNum).sum();
int allNotifyHasArrivedNum = filterPurchaseOrderChildList.stream().mapToInt(PurchaseOrderChild::getNotifyHasArrivedNum).sum();
if (allNotifyHasArrivedNum == 0){
warehouseStorageOrder.setNotifyArrivedNum(allNotifyArrivedNum);
}else {
warehouseStorageOrder.setNotifyArrivedNum(allNotifyHasArrivedNum + allNotifyArrivedNum);
}
warehouseStorageOrder.setActualArrivedNum(allNotifyArrivedNum);
warehouseStorageOrder.setArrivedTime(purchaseOrder.getArrivedTime());
warehouseStorageOrder.setRelatedOrderCode(purchaseOrder.getPurchaseOrderCode());
warehouseStorageOrder.setCreateTime(new Date());
warehouseStorageOrder.setCreateBy(ShiroUtils.getLoginName());
int insertResult = warehouseStorageOrderMapper.insertWarehouseStorageOrder(warehouseStorageOrder);
if (insertResult <= 0){
throw new BusinessException("生成仓库入库单数据失败");
}
}
//采购入库生成仓库入库子表数据
private void buildWarehouseChild(PurchaseOrder purchaseOrder, String warehouseStorageCode, List<PurchaseOrderChild> filterPurchaseOrderChildList) {
String purchaseOrderCode = purchaseOrder.getPurchaseOrderCode();
List<WarehouseStorageOrderDetail> warehouseStorageOrderDetailChildren = new ArrayList<>();
for (PurchaseOrderChild purchaseOrderChild : filterPurchaseOrderChildList) {
WarehouseStorageOrderDetail warehouseStorageOrderDetail = new WarehouseStorageOrderDetail();
warehouseStorageOrderDetail.setWarehouseStorageCode(warehouseStorageCode);
warehouseStorageOrderDetail.setRelatedOrderCode(purchaseOrderCode);
warehouseStorageOrderDetail.setMaterialNo(purchaseOrderChild.getMaterialNo());
warehouseStorageOrderDetail.setMaterialName(purchaseOrderChild.getMaterialName());
warehouseStorageOrderDetail.setMaterialPhotourl(purchaseOrderChild.getMaterialPhotourl());
warehouseStorageOrderDetail.setMaterialBrand(purchaseOrderChild.getMaterialBrand());
warehouseStorageOrderDetail.setMaterialDescribe(purchaseOrderChild.getMaterialDescribe());
warehouseStorageOrderDetail.setMaterialModel(purchaseOrderChild.getMaterialModel());
warehouseStorageOrderDetail.setMaterialProcessMethod(purchaseOrderChild.getMaterialProcessMethod());
warehouseStorageOrderDetail.setMaterialUnit(purchaseOrderChild.getMaterialUnit());
warehouseStorageOrderDetail.setMaterialPhotourl(purchaseOrderChild.getMaterialPhotourl());
warehouseStorageOrderDetail.setMaterialType(purchaseOrderChild.getMaterialType());
warehouseStorageOrderDetail.setMaterialDeptType(purchaseOrderChild.getWarehouseDept());
warehouseStorageOrderDetail.setArrivedTime(purchaseOrderChild.getPlanDeliveryTime());
warehouseStorageOrderDetail.setCreateTime(new Date());
warehouseStorageOrderDetail.setCreateBy(ShiroUtils.getLoginName());
Integer notifyArriveNum = purchaseOrderChild.getNotifyArriveNum();
Integer notifyHasArrivedNum = purchaseOrderChild.getNotifyHasArrivedNum();
//通知到货数<= 实际采购数
if (notifyArriveNum > purchaseOrderChild.getActualPurchaseNum()){
throw new BusinessException("通知到货数不能大于实际采购数");
}
if (notifyHasArrivedNum == null){
warehouseStorageOrderDetail.setNotifyHasArrivedNum(notifyArriveNum);
}else {
warehouseStorageOrderDetail.setNotifyHasArrivedNum(notifyHasArrivedNum + notifyArriveNum);
}
warehouseStorageOrderDetail.setActualArriveNum(notifyArriveNum);
warehouseStorageOrderDetailChildren.add(warehouseStorageOrderDetail);
}
int result = warehouseStorageOrderDetailMapper.insertBatchWarehouseStorageOrderDetail(warehouseStorageOrderDetailChildren);
if (result <= 0){
throw new RuntimeException("生成仓库入库子表数据失败");
}
}
//采购入库生成采购入库子表数据
private void buildPurchaseStorageChild(PurchaseOrder purchaseOrder, String warehouseStorageCode, List<PurchaseOrderChild> purchaseOrderChildList) {
String purchaseOrderCode = purchaseOrder.getPurchaseOrderCode();
List<PurchaseStorageChild> purchaseStorageChildren = new ArrayList<>();
for (PurchaseOrderChild purchaseOrderChild : purchaseOrderChildList) {
PurchaseStorageChild purchaseStorageChild = new PurchaseStorageChild();
purchaseStorageChild.setWarehouseStorageCode(warehouseStorageCode);
purchaseStorageChild.setRelatedOrderCode(purchaseOrderCode);
purchaseStorageChild.setMaterialNo(purchaseOrderChild.getMaterialNo());
purchaseStorageChild.setMaterialName(purchaseOrderChild.getMaterialName());
purchaseStorageChild.setMaterialBrand(purchaseOrderChild.getMaterialBrand());
purchaseStorageChild.setMaterialDescribe(purchaseOrderChild.getMaterialDescribe());
purchaseStorageChild.setMaterialPhotourl(purchaseOrderChild.getMaterialPhotourl());
purchaseStorageChild.setMaterialModel(purchaseOrderChild.getMaterialModel());
purchaseStorageChild.setMaterialProcessMethod(purchaseOrderChild.getMaterialProcessMethod());
purchaseStorageChild.setMaterialUnit(purchaseOrderChild.getMaterialUnit());
purchaseStorageChild.setMaterialPhotourl(purchaseOrderChild.getMaterialPhotourl());
purchaseStorageChild.setMaterialType(purchaseOrderChild.getMaterialType());
purchaseStorageChild.setMaterialDeptType(purchaseOrderChild.getWarehouseDept());
purchaseStorageChild.setArrivedTime(purchaseOrderChild.getPlanDeliveryTime());
purchaseStorageChild.setCreateTime(new Date());
purchaseStorageChild.setCreateBy(ShiroUtils.getLoginName());
Integer notifyArriveNum = purchaseOrderChild.getNotifyArriveNum();
Integer notifyHasArrivedNum = purchaseOrderChild.getNotifyHasArrivedNum();
//通知到货数<= 实际采购数
if (notifyArriveNum > purchaseOrderChild.getActualPurchaseNum()){
throw new BusinessException("通知到货数不能大于实际采购数");
}
if (notifyHasArrivedNum == null){
purchaseStorageChild.setNotifyHasArrivedNum(notifyArriveNum);
}else {
purchaseStorageChild.setNotifyHasArrivedNum(notifyHasArrivedNum + notifyArriveNum);
}
purchaseStorageChild.setActualArriveNum(notifyArriveNum);
purchaseStorageChildren.add(purchaseStorageChild);
}
int result = purchaseStorageChildMapper.insertBatchPurchaseStorageChild(purchaseStorageChildren);
if (result <= 0){
throw new RuntimeException("生成采购入库子表数据失败");
}
}
/** /**
* 启动流程实例 * 启动流程实例
* */ * */

23
ruoyi-admin/src/main/java/com/ruoyi/warehouse/domain/WarehouseStorageOrder.java

@ -28,27 +28,28 @@ public class WarehouseStorageOrder extends BaseEntity
private String warehouseStorageCode; private String warehouseStorageCode;
/** 关联订单号(多种订单类型) */ /** 关联订单号(多种订单类型) */
@Excel(name = "关联订单号", readConverterExp = "多=种订单类型") @Excel(name = "关联订单号")
private String relatedOrderCode; private String relatedOrderCode;
/** 仓库入库状态 */ /** 仓库入库状态(0待暂收、1已暂收、2待入库、3部分入库、4全部入库) */
@Excel(name = "仓库入库状态") @Excel(name = "仓库入库状态",dictType = "warehouse_storage_status")
private String warehouseStorageStatus; private String warehouseStorageStatus;
/** 仓库品质状态 */ /** 品质状态(0待品质、1部分品质、2全部品质) */
@Excel(name = "仓库品质状态") @Excel(name = "品质状态",dictType = "warehouse_quality_status")
private String warehouseQualityStatus; private String warehouseQualityStatus;
/** 仓库入库类型 */
@Excel(name = "仓库入库类型") /** 入库类型(0采购入库、1供应商补货、2委内入库、3公司退货、4委外入库、5生产入库) */
@Excel(name = "入库类型",dictType ="warehouse_storage_type" )
private String warehouseStorageType; private String warehouseStorageType;
/** 仓库订单类型 */ /** 订单类型(0采购订单、1生产订单、2退换货订单、3委外订单) */
@Excel(name = "仓库订单类型") @Excel(name = "订单类型",dictType = "storage_order_type")
private String warehouseOrderType; private String warehouseOrderType;
/** 仓库入库部门类型 */ /** 入库部门类型(0仓库,1采购 ) */
@Excel(name = "仓库入库部门类型") @Excel(name = "入库部门类型",dictType = "warehouse_dept_type")
private String warehouseDeptType; private String warehouseDeptType;
/** 通知已到货数量 */ /** 通知已到货数量 */

16
ruoyi-admin/src/main/java/com/ruoyi/warehouse/domain/WarehouseStorageOrderDetail.java

@ -105,6 +105,10 @@ public class WarehouseStorageOrderDetail extends BaseEntity
@Excel(name = "物料图片地址") @Excel(name = "物料图片地址")
private String materialPhotourl; private String materialPhotourl;
/** 物料型号*/
@Excel(name = "物料型号")
private String materialModel;
/** 物料品牌 */ /** 物料品牌 */
@Excel(name = "物料品牌") @Excel(name = "物料品牌")
private String materialBrand; private String materialBrand;
@ -445,7 +449,16 @@ public class WarehouseStorageOrderDetail extends BaseEntity
{ {
return materialBrand; return materialBrand;
} }
public void setMaterialUnit(String materialUnit)
public String getMaterialModel() {
return materialModel;
}
public void setMaterialModel(String materialModel) {
this.materialModel = materialModel;
}
public void setMaterialUnit(String materialUnit)
{ {
this.materialUnit = materialUnit; this.materialUnit = materialUnit;
} }
@ -745,6 +758,7 @@ public class WarehouseStorageOrderDetail extends BaseEntity
.append("materialType", getMaterialType()) .append("materialType", getMaterialType())
.append("materialPhotourl", getMaterialPhotourl()) .append("materialPhotourl", getMaterialPhotourl())
.append("materialBrand", getMaterialBrand()) .append("materialBrand", getMaterialBrand())
.append("materialModel", getMaterialModel())
.append("materialUnit", getMaterialUnit()) .append("materialUnit", getMaterialUnit())
.append("materialDescribe", getMaterialDescribe()) .append("materialDescribe", getMaterialDescribe())
.append("materialProcessMethod", getMaterialProcessMethod()) .append("materialProcessMethod", getMaterialProcessMethod())

5
ruoyi-admin/src/main/java/com/ruoyi/warehouse/mapper/WarehouseStorageOrderDetailMapper.java

@ -114,4 +114,9 @@ public interface WarehouseStorageOrderDetailMapper
* */ * */
int updateWarehouseStorageOrderDetailByCode(WarehouseStorageOrderDetail storageOrderDetail); int updateWarehouseStorageOrderDetailByCode(WarehouseStorageOrderDetail storageOrderDetail);
/**
* 批量插入仓库入库详情数据
* */
int insertBatchWarehouseStorageOrderDetail(List<WarehouseStorageOrderDetail> warehouseStorageOrderDetailChildren);
} }

7
ruoyi-admin/src/main/resources/mapper/purchase/PurchaseOrderMapper.xml

@ -17,6 +17,7 @@
<result property="sharedInventoryOccupancySum" column="shared_inventory_occupancy_sum" /> <result property="sharedInventoryOccupancySum" column="shared_inventory_occupancy_sum" />
<result property="refundsExchangesSum" column="refunds_exchanges_sum" /> <result property="refundsExchangesSum" column="refunds_exchanges_sum" />
<result property="storageSum" column="storage_sum" /> <result property="storageSum" column="storage_sum" />
<result property="notifyHasArrivedSum" column="notify_has_arrived_sum" />
<result property="noRmbSum" column="noRmb_sum" /> <result property="noRmbSum" column="noRmb_sum" />
<result property="rmbSum" column="rmb_sum" /> <result property="rmbSum" column="rmb_sum" />
<result property="eceiptType" column="eceipt_type" /> <result property="eceiptType" column="eceipt_type" />
@ -45,7 +46,7 @@
</resultMap> </resultMap>
<sql id="selectPurchaseOrderVo"> <sql id="selectPurchaseOrderVo">
select purchase_order_id, purchase_order_code, purchase_plan_code, warehouse_storage_status, payment_status, supplier_code, supplier_name, material_sum, actual_purchase_sum, shared_inventory_occupancy_sum, refunds_exchanges_sum, storage_sum, noRmb_sum, rmb_sum, eceipt_type, arrived_time, stock_no, stock_name, receive_person, receive_person_phone, receive_address, purchase_buyer, use_status, audit_status, create_by, create_time, update_by, update_time, del_flag, instance_id, instance_type, submit_instance_id, cancel_instance_id, restore_instance_id, apply_title, apply_user, apply_time from purchase_order select purchase_order_id, purchase_order_code, purchase_plan_code, warehouse_storage_status, payment_status, supplier_code, supplier_name, material_sum, actual_purchase_sum, shared_inventory_occupancy_sum, refunds_exchanges_sum, storage_sum, notify_has_arrived_sum,noRmb_sum, rmb_sum, eceipt_type, arrived_time, stock_no, stock_name, receive_person, receive_person_phone, receive_address, purchase_buyer, use_status, audit_status, create_by, create_time, update_by, update_time, del_flag, instance_id, instance_type, submit_instance_id, cancel_instance_id, restore_instance_id, apply_title, apply_user, apply_time from purchase_order
</sql> </sql>
<select id="selectPurchaseOrderList" parameterType="PurchaseOrder" resultMap="PurchaseOrderResult"> <select id="selectPurchaseOrderList" parameterType="PurchaseOrder" resultMap="PurchaseOrderResult">
@ -95,6 +96,7 @@
<if test="sharedInventoryOccupancySum != null">shared_inventory_occupancy_sum,</if> <if test="sharedInventoryOccupancySum != null">shared_inventory_occupancy_sum,</if>
<if test="refundsExchangesSum != null">refunds_exchanges_sum,</if> <if test="refundsExchangesSum != null">refunds_exchanges_sum,</if>
<if test="storageSum != null">storage_sum,</if> <if test="storageSum != null">storage_sum,</if>
<if test="notifyHasArrivedSum != null">notify_has_arrived_sum,</if>
<if test="noRmbSum != null">noRmb_sum,</if> <if test="noRmbSum != null">noRmb_sum,</if>
<if test="rmbSum != null">rmb_sum,</if> <if test="rmbSum != null">rmb_sum,</if>
<if test="eceiptType != null">eceipt_type,</if> <if test="eceiptType != null">eceipt_type,</if>
@ -133,6 +135,7 @@
<if test="sharedInventoryOccupancySum != null">#{sharedInventoryOccupancySum},</if> <if test="sharedInventoryOccupancySum != null">#{sharedInventoryOccupancySum},</if>
<if test="refundsExchangesSum != null">#{refundsExchangesSum},</if> <if test="refundsExchangesSum != null">#{refundsExchangesSum},</if>
<if test="storageSum != null">#{storageSum},</if> <if test="storageSum != null">#{storageSum},</if>
<if test="notifyHasArrivedSum != null">#{notifyHasArrivedSum},</if>
<if test="noRmbSum != null">#{noRmbSum},</if> <if test="noRmbSum != null">#{noRmbSum},</if>
<if test="rmbSum != null">#{rmbSum},</if> <if test="rmbSum != null">#{rmbSum},</if>
<if test="eceiptType != null">#{eceiptType},</if> <if test="eceiptType != null">#{eceiptType},</if>
@ -175,6 +178,7 @@
<if test="sharedInventoryOccupancySum != null">shared_inventory_occupancy_sum = #{sharedInventoryOccupancySum},</if> <if test="sharedInventoryOccupancySum != null">shared_inventory_occupancy_sum = #{sharedInventoryOccupancySum},</if>
<if test="refundsExchangesSum != null">refunds_exchanges_sum = #{refundsExchangesSum},</if> <if test="refundsExchangesSum != null">refunds_exchanges_sum = #{refundsExchangesSum},</if>
<if test="storageSum != null">storage_sum = #{storageSum},</if> <if test="storageSum != null">storage_sum = #{storageSum},</if>
<if test="notifyHasArrivedSum != null">notify_has_arrived_sum = #{notifyHasArrivedSum},</if>
<if test="noRmbSum != null">noRmb_sum = #{noRmbSum},</if> <if test="noRmbSum != null">noRmb_sum = #{noRmbSum},</if>
<if test="rmbSum != null">rmb_sum = #{rmbSum},</if> <if test="rmbSum != null">rmb_sum = #{rmbSum},</if>
<if test="eceiptType != null">eceipt_type = #{eceiptType},</if> <if test="eceiptType != null">eceipt_type = #{eceiptType},</if>
@ -219,6 +223,7 @@
<if test="sharedInventoryOccupancySum != null">shared_inventory_occupancy_sum = #{sharedInventoryOccupancySum},</if> <if test="sharedInventoryOccupancySum != null">shared_inventory_occupancy_sum = #{sharedInventoryOccupancySum},</if>
<if test="refundsExchangesSum != null">refunds_exchanges_sum = #{refundsExchangesSum},</if> <if test="refundsExchangesSum != null">refunds_exchanges_sum = #{refundsExchangesSum},</if>
<if test="storageSum != null">storage_sum = #{storageSum},</if> <if test="storageSum != null">storage_sum = #{storageSum},</if>
<if test="notifyHasArrivedSum != null">notify_has_arrived_sum = #{notifyHasArrivedSum},</if>
<if test="noRmbSum != null">noRmb_sum = #{noRmbSum},</if> <if test="noRmbSum != null">noRmb_sum = #{noRmbSum},</if>
<if test="rmbSum != null">rmb_sum = #{rmbSum},</if> <if test="rmbSum != null">rmb_sum = #{rmbSum},</if>
<if test="eceiptType != null">eceipt_type = #{eceiptType},</if> <if test="eceiptType != null">eceipt_type = #{eceiptType},</if>

86
ruoyi-admin/src/main/resources/mapper/purchase/PurchaseStorageChildMapper.xml

@ -142,6 +142,92 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</trim> </trim>
</insert> </insert>
<insert id="insertBatchPurchaseStorageChild" parameterType="java.util.List" useGeneratedKeys="true" keyProperty="purchaseStorageChildId">
insert into purchase_storage_child (
warehouse_storage_code,
related_order_code,
supplier_code,
supplier_name,
material_no,
material_name,
material_type,
material_photoUrl,
material_model,
material_brand,
material_unit,
material_describe,
material_process_method,
material_dept_type,
make_total,
notify_has_arrived_num,
notify_arrive_num,
actual_has_arrived_num,
actual_arrive_num,
temporary_has_qualified_num,
temporary_qualified_num,
has_storage_num,
storage_num,
make_storage_num,
quality_has_qualified_num,
quality_qualified_num,
refunds_exchanges_num,
make_in_unit_price,
arrived_time,
temporary_time,
delivery_inspection_time,
quality_time,
storage_time,
create_time,
create_by
) values
<foreach collection="list" item="item" index="index" separator="),(">
(
#{item.warehouseStorageCode},
#{item.relatedOrderCode},
#{item.supplierCode},
#{item.supplierName},
#{item.materialNo},
#{item.materialName},
#{item.materialType},
#{item.materialPhotourl},
#{item.materialModel},
#{item.materialBrand},
#{item.materialUnit},
#{item.materialDescribe},
#{item.materialProcessMethod},
#{item.materialDeptType},
#{item.makeTotal},
#{item.notifyHasArrivedNum},
#{item.notifyArriveNum},
#{item.actualHasArrivedNum},
#{item.actualArriveNum},
#{item.temporaryHasQualifiedNum},
#{item.temporaryQualifiedNum},
#{item.hasStorageNum},
#{item.storageNum},
#{item.makeStorageNum},
#{item.qualityHasQualifiedNum},
#{item.qualityQualifiedNum},
#{item.refundsExchangesNum},
#{item.makeInUnitPrice},
#{item.arrivedTime},
#{item.temporaryTime},
#{item.deliveryInspectionTime},
#{item.qualityTime},
#{item.storageTime},
#{item.createTime},
#{item.createBy}
)
</foreach>
</insert>
<update id="updatePurchaseStorageChild" parameterType="PurchaseStorageChild"> <update id="updatePurchaseStorageChild" parameterType="PurchaseStorageChild">
update purchase_storage_child update purchase_storage_child
<trim prefix="SET" suffixOverrides=","> <trim prefix="SET" suffixOverrides=",">

133
ruoyi-admin/src/main/resources/mapper/warehouse/WarehouseStorageOrderDetailMapper.xml

@ -28,6 +28,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<result property="materialType" column="material_type" /> <result property="materialType" column="material_type" />
<result property="materialPhotourl" column="material_photoUrl" /> <result property="materialPhotourl" column="material_photoUrl" />
<result property="materialBrand" column="material_brand" /> <result property="materialBrand" column="material_brand" />
<result property="materialModel" column="material_model" />
<result property="materialUnit" column="material_unit" /> <result property="materialUnit" column="material_unit" />
<result property="materialDescribe" column="material_describe" /> <result property="materialDescribe" column="material_describe" />
<result property="materialProcessMethod" column="material_process_method" /> <result property="materialProcessMethod" column="material_process_method" />
@ -94,6 +95,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
material_type, material_type,
material_photoUrl, material_photoUrl,
material_brand, material_brand,
material_model,
material_unit, material_unit,
material_describe, material_describe,
material_process_method, material_process_method,
@ -188,6 +190,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="materialType != null">material_type,</if> <if test="materialType != null">material_type,</if>
<if test="materialPhotourl != null">material_photoUrl,</if> <if test="materialPhotourl != null">material_photoUrl,</if>
<if test="materialBrand != null">material_brand,</if> <if test="materialBrand != null">material_brand,</if>
<if test="materialModel != null">material_model,</if>
<if test="materialUnit != null">material_unit,</if> <if test="materialUnit != null">material_unit,</if>
<if test="materialDescribe != null">material_describe,</if> <if test="materialDescribe != null">material_describe,</if>
<if test="materialProcessMethod != null">material_process_method,</if> <if test="materialProcessMethod != null">material_process_method,</if>
@ -247,6 +250,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="materialType != null">#{materialType},</if> <if test="materialType != null">#{materialType},</if>
<if test="materialPhotourl != null">#{materialPhotourl},</if> <if test="materialPhotourl != null">#{materialPhotourl},</if>
<if test="materialBrand != null">#{materialBrand},</if> <if test="materialBrand != null">#{materialBrand},</if>
<if test="materialModel != null">#{materialModel},</if>
<if test="materialUnit != null">#{materialUnit},</if> <if test="materialUnit != null">#{materialUnit},</if>
<if test="materialDescribe != null">#{materialDescribe},</if> <if test="materialDescribe != null">#{materialDescribe},</if>
<if test="materialProcessMethod != null">#{materialProcessMethod},</if> <if test="materialProcessMethod != null">#{materialProcessMethod},</if>
@ -280,6 +284,133 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</trim> </trim>
</insert> </insert>
<insert id="insertBatchWarehouseStorageOrderDetail" parameterType="java.util.List" useGeneratedKeys="true" keyProperty="warehouseStorageDetailId">
insert into warehouse_storage_order_detail (
warehouse_storage_code,
related_order_code,
warehouse_storage_status,
warehouse_quality_status,
warehouse_storage_type,
warehouse_storage_class,
warehouse_order_type,
warehouse_dept_type,
warehouse_employee,
warehouse_code,
warehouse_name,
warehouse_detail_address,
supplier_code,
supplier_name,
customer_contact,
contact_number,
supplier_address,
customer_id,
customer_name,
customer_contact_people,
customer_contact_number,
customer_company_address,
material_no,
material_name,
material_type,
material_photoUrl,
material_brand,
material_model,
material_unit,
material_describe,
material_process_method,
material_dept_type,
make_total,
notify_has_arrived_num,
notify_arrive_num,
actual_has_arrived_num,
actual_arrive_num,
temporary_has_qualified_num,
temporary_qualified_num,
has_storage_num,
storage_num,
make_in_unit_price,
make_storage_num,
quality_has_qualified_num,
quality_qualified_num,
refunds_exchanges_num,
arrived_time,
temporary_time,
delivery_inspection_time,
quality_time,
storage_time,
temporary_remark,
temporary_report_url,
storage_location,
create_time,
create_by
) values
<foreach collection="list" item="item" separator=",">
(
#{item.warehouseStorageCode},
#{item.relatedOrderCode},
#{item.warehouseStorageStatus},
#{item.warehouseQualityStatus},
#{item.warehouseStorageType},
#{item.warehouseStorageClass},
#{item.warehouseOrderType},
#{item.warehouseDeptType},
#{item.warehouseEmployee},
#{item.warehouseCode},
#{item.warehouseName},
#{item.warehouseDetailAddress},
#{item.supplierCode},
#{item.supplierName},
#{item.customerContact},
#{item.contactNumber},
#{item.supplierAddress},
#{item.customerId},
#{item.customerName},
#{item.customerContactPeople},
#{item.customerContactNumber},
#{item.customerCompanyAddress},
#{item.materialNo},
#{item.materialName},
#{item.materialType},
#{item.materialPhotourl},
#{item.materialBrand},
#{item.materialModel},
#{item.materialUnit},
#{item.materialDescribe},
#{item.materialProcessMethod},
#{item.materialDeptType},
#{item.makeTotal},
#{item.notifyHasArrivedNum},
#{item.notifyArriveNum},
#{item.actualHasArrivedNum},
#{item.actualArriveNum},
#{item.temporaryHasQualifiedNum},
#{item.temporaryQualifiedNum},
#{item.hasStorageNum},
#{item.storageNum},
#{item.makeInUnitPrice},
#{item.makeStorageNum},
#{item.qualityHasQualifiedNum},
#{item.qualityQualifiedNum},
#{item.refundsExchangesNum},
#{item.arrivedTime},
#{item.temporaryTime},
#{item.deliveryInspectionTime},
#{item.qualityTime},
#{item.storageTime},
#{item.temporaryRemark},
#{item.temporaryReportUrl},
#{item.storageLocation},
#{item.createTime},
#{item.createBy}
)
</foreach>
</insert>
<update id="updateWarehouseStorageOrderDetail" parameterType="WarehouseStorageOrderDetail"> <update id="updateWarehouseStorageOrderDetail" parameterType="WarehouseStorageOrderDetail">
update warehouse_storage_order_detail update warehouse_storage_order_detail
<trim prefix="SET" suffixOverrides=","> <trim prefix="SET" suffixOverrides=",">
@ -310,6 +441,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="materialType != null">material_type = #{materialType},</if> <if test="materialType != null">material_type = #{materialType},</if>
<if test="materialPhotourl != null">material_photoUrl = #{materialPhotourl},</if> <if test="materialPhotourl != null">material_photoUrl = #{materialPhotourl},</if>
<if test="materialBrand != null">material_brand = #{materialBrand},</if> <if test="materialBrand != null">material_brand = #{materialBrand},</if>
<if test="materialModel != null">material_model = #{materialModel},</if>
<if test="materialUnit != null">material_unit = #{materialUnit},</if> <if test="materialUnit != null">material_unit = #{materialUnit},</if>
<if test="materialDescribe != null">material_describe = #{materialDescribe},</if> <if test="materialDescribe != null">material_describe = #{materialDescribe},</if>
<if test="materialProcessMethod != null">material_process_method = #{materialProcessMethod},</if> <if test="materialProcessMethod != null">material_process_method = #{materialProcessMethod},</if>
@ -376,6 +508,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="materialType != null">material_type = #{materialType},</if> <if test="materialType != null">material_type = #{materialType},</if>
<if test="materialPhotourl != null">material_photoUrl = #{materialPhotourl},</if> <if test="materialPhotourl != null">material_photoUrl = #{materialPhotourl},</if>
<if test="materialBrand != null">material_brand = #{materialBrand},</if> <if test="materialBrand != null">material_brand = #{materialBrand},</if>
<if test="materialModel != null">material_model = #{materialModel},</if>
<if test="materialUnit != null">material_unit = #{materialUnit},</if> <if test="materialUnit != null">material_unit = #{materialUnit},</if>
<if test="materialDescribe != null">material_describe = #{materialDescribe},</if> <if test="materialDescribe != null">material_describe = #{materialDescribe},</if>
<if test="materialProcessMethod != null">material_process_method = #{materialProcessMethod},</if> <if test="materialProcessMethod != null">material_process_method = #{materialProcessMethod},</if>

132
ruoyi-admin/src/main/resources/templates/purchase/purchaseOrder/addPurchaseStorage.html

@ -3,11 +3,12 @@
<head> <head>
<th:block th:include="include :: header('采购入库通知')" /> <th:block th:include="include :: header('采购入库通知')" />
<th:block th:include="include :: datetimepicker-css" /> <th:block th:include="include :: datetimepicker-css" />
<th:block th:include="include :: bootstrap-editable-css"/>
</head> </head>
<body class="white-bg"> <body class="white-bg">
<div class="wrapper wrapper-content animated fadeInRight ibox-content"> <div class="wrapper wrapper-content animated fadeInRight ibox-content">
<form class="form-horizontal m" id="form-addPurchaseStorage-edit" th:object="${purchaseOrder}"> <form class="form-horizontal m" id="form-addPurchaseStorage-edit" th:object="${purchaseOrder}">
<input type="hidden" name="warehouseCode" th:field="*{stockNo}"/> <input type="hidden" name="purchaseOrderId" th:field="*{purchaseOrderId}"/>
<div class="form-group"> <div class="form-group">
<label class="col-sm-3 control-label">采购单号:</label> <label class="col-sm-3 control-label">采购单号:</label>
<div class="col-sm-8"> <div class="col-sm-8">
@ -69,6 +70,76 @@
$("#form-addPurchaseStorage-edit").validate({ focusCleanup: true}); $("#form-addPurchaseStorage-edit").validate({ focusCleanup: true});
function submitHandler() {
// 获取表单数据
const purchaseStorageData = $("#form-addPurchaseStorage-edit").serializeArray().reduce((obj, item) => {
obj[item.name] = item.value;
return obj;
}, {});
var table = $('#bootstrap-table').bootstrapTable("getSelections");
if (table.length === 0){
$.modal.alertWarning("请至少选择一条要入库的物料");
return;
}
// 检查是否有同时存在 warehouseDept 为 1 和 0 的记录
var hasWarehouseDept1 = false;
var hasWarehouseDept0 = false;
for (var i = 0; i < table.length; i++) {
var warehouseDept = table[i].warehouseDept;
if (warehouseDept === "1") {
hasWarehouseDept1 = true;
} else if (warehouseDept === "0") {
hasWarehouseDept0 = true;
}
}
if (hasWarehouseDept1 && hasWarehouseDept0) {
$.modal.alertWarning("入库物料中同时包含仓库入库和采购入库,需要分开入库");
return;
}
var materialDataList = table.map(function(item) {
// 根据实际字段名调整
return {
"purchaseOrderChildId":item.purchaseOrderChildId,
"materialNo": item.materialNo,
"materialName": item.materialName,
"materialPhotourl" : item.materialPhotourl,
"materialType": item.materialType,
"materialDescribe": item.materialDescribe,
"materialBrand": item.materialBrand,
"materialUnit": item.materialUnit,
"materialProcessMethod": item.materialProcessMethod,
"warehouseDept": item.warehouseDept,
"planPurchaseNum": item.planPurchaseNum,
"actualPurchaseNum": item.actualPurchaseNum,
"planDeliveryTime": item.planDeliveryTime,
"notifyHasArrivedNum": item.notifyHasArrivedNum,
"temporaryNum": item.temporaryNum,
"hasStorageNum": item.hasStorageNum,
"notifyArriveNum": item.notifyArriveNum,
};
});
const combinedData = Object.assign({}, purchaseStorageData, {
purchaseOrderChildList: materialDataList,
});
// 合并表单数据和表格数据
console.log(combinedData)
// 使用 JSON.stringify() 序列化数据
const jsonData = JSON.stringify(combinedData);
// 发送 AJAX 请求到后端接口
$.operate.saveJson(prefix + "/addPurchaseStorage", jsonData);
}
//物料信息展示列表 //物料信息展示列表
$(function() { $(function() {
var options = { var options = {
@ -83,7 +154,11 @@
columns: [{ columns: [{
checkbox: true checkbox: true
}, },
{
field: 'purchaseOrderChildId',
title: '主键',
visible: false
},
{ {
title: '料号', title: '料号',
field: 'materialNo', field: 'materialNo',
@ -92,6 +167,11 @@
title: '物料名称', title: '物料名称',
field: 'materialName', field: 'materialName',
}, },
{
title: '图片',
field: 'materialPhotourl',
visible: false
},
{ {
title: '物料类型', title: '物料类型',
field: 'materialType', field: 'materialType',
@ -127,7 +207,7 @@
}, },
{ {
title: '物料入库部门', title: '物料入库部门',
field: 'materialDeptType', field: 'warehouseDept',
formatter:function (value) { formatter:function (value) {
return $.table.selectDictLabel(warehouseDeptDatas, value); return $.table.selectDictLabel(warehouseDeptDatas, value);
} }
@ -141,7 +221,51 @@
{title: '已入库数',field: 'hasStorageNum', {title: '已入库数',field: 'hasStorageNum',
}, },
{title: '通知到货数',field: 'notifyArriveNum' {title: '通知到货数',field: 'notifyArriveNum',
editable: {
//动态禁用行内编辑
noEditFormatter: function(value, row, index){
if (row.temporaryNum === row.actualPurchaseNum || row.actualPurchaseNum === row.notifyHasArrivedNum){
return "不可入库";
}else {
return false;
}
},
validate: function(value) {
if ($.trim(value) === '') {
return '通知到货数不能为空';
}
if (isNaN(value)) {
return '请输入有效的数字';
}
if (value < 0) {
return '通知到货数不能小于0';
}
//不能为小数
if (value % 1 !== 0) {
return '本次验收数不能为小数';
}
},
},
formatter: function (value, row) {
// 检查 row 是否存在
if (!row) {
return "";
}
// 检查 notifyArriveNum 是否存在
if (row.notifyArriveNum === undefined || row.notifyArriveNum === null) {
return "";
}
// 根据 notifyArriveNum 的值决定返回值
if (row.notifyArriveNum) {
return row.notifyArriveNum;
} else {
return value;
}
}
} }
] ]
}; };

13
ruoyi-admin/src/main/resources/templates/purchase/purchaseOrder/purchaseOrder.html

@ -20,7 +20,7 @@
</li> </li>
<li> <li>
<label>采购入库状态:</label> <label>采购入库状态:</label>
<select name="warehouseStorageStatus" th:with="type=${@dict.getType('eceiptStatus')}"> <select name="warehouseStorageStatus" th:with="type=${@dict.getType('warehouse_storage_status')}">
<option value="">所有</option> <option value="">所有</option>
<option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}"></option> <option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}"></option>
</select> </select>
@ -75,7 +75,7 @@
var addPurchaseStorageFlag = [[${@permission.hasPermi('purchase:purchaseOrder:addPurchaseStorage')}]]; var addPurchaseStorageFlag = [[${@permission.hasPermi('purchase:purchaseOrder:addPurchaseStorage')}]];
var warehouseStorageStatusDatas = [[${@dict.getType('eceiptStatus')}]]; var warehouseStorageStatusDatas = [[${@dict.getType('warehouse_storage_status')}]];
var paymentStatusDatas = [[${@dict.getType('sys_pay_close')}]]; var paymentStatusDatas = [[${@dict.getType('sys_pay_close')}]];
var useStatusDatas = [[${@dict.getType('useStatus')}]]; var useStatusDatas = [[${@dict.getType('useStatus')}]];
var auditStatusDatas = [[${@dict.getType('auditStatus')}]]; var auditStatusDatas = [[${@dict.getType('auditStatus')}]];
@ -239,8 +239,12 @@
if(row.auditStatus=="1" && row.useStatus=="1" && !row.cancelInstanceId) { if(row.auditStatus=="1" && row.useStatus=="1" && !row.cancelInstanceId) {
// 作废 // 作废
actions.push('<a class=" ' + cancelFlag + ' " href="javascript:void(0)" onclick="cancel(\'' + row.purchaseOrderId + '\')"><i class="fa fa-remove"></i> 作废</a>'); actions.push('<a class=" ' + cancelFlag + ' " href="javascript:void(0)" onclick="cancel(\'' + row.purchaseOrderId + '\')"><i class="fa fa-remove"></i> 作废</a>');
//入库通知
actions.push('<a class=" ' + addPurchaseStorageFlag + ' " href="javascript:void(0)" onclick="addPurchaseStorage(\'' + row.purchaseOrderId + '\')"><i class="fa fa-edit"></i> 入库通知</a>'); //入库状态(0待暂收、1已暂收、2待入库、3部分入库、4全部入库)
if(row.warehouseStorageStatus=="2" || row.warehouseStorageStatus=="3"){
//入库通知
actions.push('<a class=" ' + addPurchaseStorageFlag + ' " href="javascript:void(0)" onclick="addPurchaseStorage(\'' + row.purchaseOrderId + '\')"><i class="fa fa-edit"></i> 入库通知</a>');
}
// 已作废 // 已作废
} }
@ -344,6 +348,7 @@
//入库通知 //入库通知
function addPurchaseStorage(purchaseOrderId) { function addPurchaseStorage(purchaseOrderId) {
//入库状态(0待暂收、1已暂收、2待入库、3部分入库、4全部入库)
var url = prefix + "/addPurchaseStorage/" + purchaseOrderId; var url = prefix + "/addPurchaseStorage/" + purchaseOrderId;
$.modal.open("入库通知", url); $.modal.open("入库通知", url);
} }

446
ruoyi-admin/src/main/resources/templates/purchase/purchaseStorage/purchaseStorage.html

@ -1,196 +1,276 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="zh" xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro"> <html lang="zh" xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
<head> <head>
<th:block th:include="include :: header('采购入库通知单列表')" /> <th:block th:include="include :: header('采购入库单列表')" />
</head> </head>
<body class="gray-bg"> <body class="gray-bg">
<div class="container-div"> <div class="container-div">
<div class="row"> <div class="row">
<div class="col-sm-12 search-collapse"> <div class="col-sm-12 search-collapse">
<form id="formId"> <form id="formId">
<div class="select-list"> <div class="select-list">
<ul> <ul>
<li> <li>
<label>入库单号:</label> <label>入库单号:</label>
<input type="text" name="warehouseStorageCode"/> <input type="text" name="warehouseStorageCode"/>
</li> </li>
<li> <li>
<label>入库状态:</label> <label>关联订单号:</label>
<select name="warehouseStorageStatus" th:with="type=${@dict.getType('warehouse_storage_status')}"> <input type="text" name="relatedOrderCode"/>
<option value="">所有</option> </li>
<option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}"></option> <li>
</select> <label>入库状态:</label>
</li> <select name="warehouseStorageStatus" th:with="type=${@dict.getType('warehouse_storage_status')}">
<li> <option value="">所有</option>
<label>品质状态:</label> <option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}"></option>
<select name="warehouseQualityStatus" th:with="type=${@dict.getType('warehouse_quality_status')}"> </select>
<option value="">所有</option> </li>
<option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}"></option> <li>
</select> <label>品质状态:</label>
</li> <select name="warehouseQualityStatus" th:with="type=${@dict.getType('warehouse_quality_status')}">
<li> <option value="">所有</option>
<label>关联订单号:</label> <option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}"></option>
<input type="text" name="relatedOrderCode"/> </select>
</li> </li>
<li>
<li> <label>入库类型:</label>
<label>仓库员:</label> <select name="warehouseStorageType" th:with="type=${@dict.getType('warehouse_storage_type')}">
<input type="text" name="warehouseEmployee"/> <option value="">所有</option>
</li> <option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}"></option>
<li> </select>
<label>入库部门:</label> </li>
<select name="warehouseDeptType" th:with="type=${@dict.getType('warehouse_dept_type')}"> <li>
<option value="">所有</option> <label>订单类型:</label>
<option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}"></option> <select name="warehouseOrderType" th:with="type=${@dict.getType('storage_order_type')}">
</select> <option value="">所有</option>
</li> <option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}"></option>
<li class="select-time"> </select>
<label>录入时间:</label> </li>
<input type="text" class="time-input" id="startTime" placeholder="开始时间" name="params[beginCreateTime]"/> <li>
<span>-</span> <label>入库部门类型:</label>
<input type="text" class="time-input" id="endTime" placeholder="结束时间" name="params[endCreateTime]"/> <select name="warehouseDeptType" th:with="type=${@dict.getType('warehouse_dept_type')}">
</li> <option value="">所有</option>
<li> <option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}"></option>
<a class="btn btn-primary btn-rounded btn-sm" onclick="$.table.search()"><i class="fa fa-search"></i>&nbsp;搜索</a> </select>
<a class="btn btn-warning btn-rounded btn-sm" onclick="$.form.reset()"><i class="fa fa-refresh"></i>&nbsp;重置</a> </li>
</li> <li>
</ul> <label>供应商ID:</label>
</div> <input type="text" name="supplierCode"/>
</form> </li>
</div> <li>
<label>供应商名称:</label>
<input type="text" name="supplierName"/>
</li>
<li class="select-time">
<label>录入时间:</label>
<input type="text" class="time-input" id="startTime" placeholder="开始时间" name="params[beginCreateTime]"/>
<span>-</span>
<input type="text" class="time-input" id="endTime" placeholder="结束时间" name="params[endCreateTime]"/>
</li>
<li>
<a class="btn btn-primary btn-rounded btn-sm" onclick="$.table.search()"><i class="fa fa-search"></i>&nbsp;搜索</a>
<a class="btn btn-warning btn-rounded btn-sm" onclick="$.form.reset()"><i class="fa fa-refresh"></i>&nbsp;重置</a>
</li>
</ul>
</div>
</form>
</div>
<div class="btn-group-sm" id="toolbar" role="group"> <div class="btn-group-sm" id="toolbar" role="group">
<a class="btn btn-warning" onclick="$.table.exportExcel()" shiro:hasPermission="purchase:purchaseStorage:export"> <a class="btn btn-success" onclick="$.operate.add()" shiro:hasPermission="purchase:purchaseStorage:add">
<i class="fa fa-download"></i> 导出 <i class="fa fa-plus"></i> 添加
</a> </a>
</div> <a class="btn btn-primary single disabled" onclick="$.operate.edit()" shiro:hasPermission="purchase:purchaseStorage:edit">
<div class="col-sm-12 select-table table-striped"> <i class="fa fa-edit"></i> 修改
<table id="bootstrap-table"></table> </a>
</div> <a class="btn btn-danger multiple disabled" onclick="$.operate.removeAll()" shiro:hasPermission="purchase:purchaseStorage:remove">
<i class="fa fa-remove"></i> 删除
</a>
<a class="btn btn-warning" onclick="$.table.exportExcel()" shiro:hasPermission="purchase:purchaseStorage:export">
<i class="fa fa-download"></i> 导出
</a>
</div>
<div class="col-sm-12 select-table table-striped">
<table id="bootstrap-table"></table>
</div> </div>
</div> </div>
<th:block th:include="include :: footer" /> </div>
<script th:inline="javascript"> <th:block th:include="include :: footer" />
var editFlag = [[${@permission.hasPermi('purchase:purchaseStorage:edit')}]]; <script th:inline="javascript">
var detailFlag = [[${@permission.hasPermi('purchase:purchaseStorage:detail')}]]; var editFlag = [[${@permission.hasPermi('purchase:purchaseStorage:edit')}]];
var removeFlag = [[${@permission.hasPermi('purchase:purchaseStorage:remove')}]];
var cancelFlag = [[${@permission.hasPermi('purchase:purchaseStorage:cancel')}]];
var restoreFlag = [[${@permission.hasPermi('purchase:purchaseStorage:restore')}]];
var warehouseStorageStatusDatas = [[${@dict.getType('warehouse_storage_status')}]];
var warehouseQualityStatusDatas = [[${@dict.getType('warehouse_quality_status')}]];
var warehouseStorageTypeDatas = [[${@dict.getType('warehouse_storage_type')}]];
var warehouseOrderTypeDatas = [[${@dict.getType('storage_order_type')}]];
var warehouseDeptTypeDatas = [[${@dict.getType('warehouse_dept_type')}]];
var prefix = ctx + "purchase/purchaseStorage";
$(function() {
// var storageStatusDatas = [[${@dict.getType('eceiptStatus')}]]; var options = {
// var qualityStatusDatas = [[${@dict.getType('qualityStatus')}]]; url: prefix + "/list",
// var purchaseStorageTypeDatas = [[${@dict.getType('purchase_storage_type')}]]; createUrl: prefix + "/add",
// var purchaseOrderTypeDatas = [[${@dict.getType('sys_order_type')}]]; updateUrl: prefix + "/edit/{id}",
// var purchaseDeptTypeDatas = [[${@dict.getType('warehouseDept')}]]; removeUrl: prefix + "/remove",
var warehouseStorageStatusDatas = [[${@dict.getType('warehouse_storage_status')}]]; cancelUrl: prefix + "/cancel/{id}",
var warehouseQualityStatusDatas = [[${@dict.getType('warehouse_quality_status')}]]; restoreUrl: prefix + "/restore/{id}",
var warehouseStorageTypeDatas = [[${@dict.getType('warehouse_storage_type')}]]; exportUrl: prefix + "/export",
var warehouseOrderTypeDatas = [[${@dict.getType('storage_order_type')}]]; modalName: "采购入库单",
var warehouseDeptTypeDatas = [[${@dict.getType('warehouse_dept_type')}]]; fixedColumns: true, // 启用冻结列
var prefix = ctx + "purchase/purchaseStorage"; fixedRightNumber: 1, // 冻结右列个数
$(function() { sortable: true, // 是否启用排序
var options = { sortStable: true,
url: prefix + "/list", columns: [{
createUrl: prefix + "/add", checkbox: true
updateUrl: prefix + "/edit/{id}", },
removeUrl: prefix + "/remove", {
cancelUrl: prefix + "/cancel/{id}", title: '采购入库单id',
restoreUrl: prefix + "/restore/{id}", field: 'purchaseStorageId',
exportUrl: prefix + "/export", visible: false
modalName: "采购入库通知单", },
fixedColumns: true, // 启用冻结列 {
fixedRightNumber: 1, // 冻结右列个数 title: '入库单号',
columns: [ field: 'warehouseStorageCode',
{checkbox: true}, },
{title: '入库单id',field: 'warehouseStorageId',visible: false}, {
{title: '入库单号',field: 'warehouseStorageCode',}, title: '关联订单号',
{title: '关联订单号',field: 'relatedOrderCode',}, field: 'relatedOrderCode',
{ },
title: '入库状态', {
field: 'warehouseStorageStatus', title: '入库状态',
formatter: function(value, row, index) { field: 'warehouseStorageStatus',
return $.table.selectDictLabel(warehouseStorageStatusDatas, value); formatter: function(value, row, index) {
} return $.table.selectDictLabel(warehouseStorageStatusDatas, value);
},
{
title: '品质状态',
field: 'warehouseQualityStatus',
formatter: function(value, row, index) {
return $.table.selectDictLabel(warehouseQualityStatusDatas, value);
}
},
{
title: '入库类型',
field: 'warehouseStorageType',
formatter: function(value, row, index) {
return $.table.selectDictLabel(warehouseStorageTypeDatas, value);
}
},
{
title: '订单类型',
field: 'warehouseOrderType',
formatter: function(value, row, index) {
return $.table.selectDictLabel(warehouseOrderTypeDatas, value);
}
},
{
title: '入库部门',
field: 'warehouseDeptType',
formatter: function(value, row, index) {
return $.table.selectDictLabel(warehouseDeptTypeDatas, value);
}
},
{
title: '通知已到货数',
field: 'notifyHasArrivedNum',
},
{
title: '通知到货数',
field: 'notifyArriveNum',
},
{title: '实际已到货数量',field: 'actualArrivedNum',},
{title: '暂收合格数量',field: 'temporaryQualifiedNum',},
{title: '暂收不合格数量',field: 'temporaryUnqualifiedNum',},
{title: '品质合格数量',field: 'qualityQualifiedNum',},
{title: '入库数量',field: 'storageNum',},
{title: '到货时间',field: 'arrivedTime',},
{title: '暂收时间',field: 'temporaryTime',},
{title: '交检时间',field: 'deliveryInspectionTime',},
{title: '品质时间',field: 'qualityTime',},
{title: '入库时间',field: 'storageTime',},
{
title: '仓库员',
field: 'warehouseEmployee',
},
{
title: '仓库ID',
field: 'warehouseCode',
},
{
title: '仓库名称',
field: 'warehouseName',
},
{title: '录入时间',field: 'createTime',},
{title: '录入人',field: 'createBy',},
{title: '更新人',field: 'updateBy', },
{title: '上次更新时间',field: 'updateTime', },
{title: '操作',align: 'center',
formatter: function(value, row, index) {
var actions = [];
actions.push('<a class="btn btn-success btn-xs ' + detailFlag + '" href="javascript:void(0)" onclick="detail(\'' + row.warehouseStorageId + '\')"><i class="fa fa-edit"></i>详情</a> ');
return actions.join('');
}
} }
] },
}; {
$.table.init(options); title: '品质状态',
}); field: 'warehouseQualityStatus',
formatter: function(value, row, index) {
/*详情*/ return $.table.selectDictLabel(warehouseQualityStatusDatas, value);
function detail(warehouseStorageId){ }
var url = ctx + 'purchase/purchaseStorage/detail/' + warehouseStorageId; },
$.modal.open("详情",url); {
title: '入库类型',
field: 'warehouseStorageType',
formatter: function(value, row, index) {
return $.table.selectDictLabel(warehouseStorageTypeDatas, value);
}
},
{
title: '订单类型',
field: 'warehouseOrderType',
formatter: function(value, row, index) {
return $.table.selectDictLabel(warehouseOrderTypeDatas, value);
}
},
{
title: '入库部门类型',
field: 'warehouseDeptType',
formatter: function(value, row, index) {
return $.table.selectDictLabel(warehouseDeptTypeDatas, value);
}
},
{
title: '供应商ID',
field: 'supplierCode',
},
{
title: '供应商名称',
field: 'supplierName',
},
{
title: '通知已到货数量',
field: 'notifyArrivedSum',
},
{
title: '实际已到货数量',
field: 'actualArrivedSum',
},
{
title: '暂收合格数量',
field: 'temporaryQualifiedSum',
},
{
title: '暂收不合格数量',
field: 'temporaryUnqualifiedSum',
},
{
title: '品质合格数量',
field: 'qualityQualifiedSum',
},
{
title: '退换货数',
field: 'refundsExchangesSum',
},
{
title: '入库数量',
field: 'storageSum',
},
{
title: '到货时间',
field: 'arrivedTime',
},
{
title: '暂收时间',
field: 'temporaryTime',
},
{
title: '交付质检时间',
field: 'deliveryInspectionTime',
},
{
title: '品质时间',
field: 'qualityTime',
},
{
title: '入库时间',
field: 'storageTime',
},
{
title: '仓库员工',
field: 'warehouseEmployee',
},
{
title: '仓库ID',
field: 'warehouseCode',
},
{
title: '仓库名称',
field: 'warehouseName',
},
{
title: '录入时间',
field: 'createTime',
sortable: true
},
{
title: '录入人',
field: 'createBy',
},
{
title: '更新人',
field: 'updateBy',
},
{
title: '上次更新时间',
field: 'updateTime',
},
{
title: '操作',
align: 'center',
formatter: function(value, row, index) {
var actions = [];
actions.push('<a class="btn btn-success btn-xs ' + editFlag + '" href="javascript:void(0)" onclick="$.operate.edit(\'' + row.purchaseStorageId + '\')"><i class="fa fa-edit"></i>编辑</a> ');
var actionLinks = actions.join('');
return $.table.dropdownToggle(actionLinks);
}
}]
}; };
$.table.init(options);
</script> });
</script>
</body> </body>
</html> </html>
Loading…
Cancel
Save