自动备货计划

This commit is contained in:
liuhanqing
2026-03-28 10:02:58 +08:00
parent c43b79d9e6
commit 826b8e5a10
10 changed files with 261 additions and 46 deletions

View File

@@ -6,6 +6,7 @@ import java.util.UUID;
import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.project.bas.product.domain.BasProduct; import com.ruoyi.project.bas.product.domain.BasProduct;
import com.ruoyi.project.middle.mesOutorder.domain.MesOutorderMiddleAutoVo;
import com.ruoyi.project.middle.mesOutorder.domain.MesOutorderMiddleVo; import com.ruoyi.project.middle.mesOutorder.domain.MesOutorderMiddleVo;
import com.ruoyi.project.out.outStock.domain.OutStockoutVo; import com.ruoyi.project.out.outStock.domain.OutStockoutVo;
import com.ruoyi.web.controller.common.BusinessException; import com.ruoyi.web.controller.common.BusinessException;
@@ -134,9 +135,18 @@ public class MesOutorderMiddleController extends BaseController
@PostMapping("/addSave") @PostMapping("/addSave")
@ResponseBody @ResponseBody
public AjaxResult addSave1(@RequestBody MesOutorderMiddleVo mesOutorderMiddleVo) { public AjaxResult addSave1(@RequestBody MesOutorderMiddleVo mesOutorderMiddleVo) {
AjaxResult ajaxResult= mesOutorderMiddleService.insertMesOutorder(mesOutorderMiddleVo); AjaxResult ajaxResult= mesOutorderMiddleService.insertMesOutorder(mesOutorderMiddleVo,"1");
return ajaxResult; return ajaxResult;
} }
@Log(title = "自动建单", businessType = BusinessType.INSERT)
@PostMapping("/addSaveAuto")
@ResponseBody
public AjaxResult addSaveAuto(@RequestBody MesOutorderMiddleAutoVo mesOutorderMiddleAutoVo) {
AjaxResult ajaxResult= mesOutorderMiddleService.insertMesOutorderAuto(mesOutorderMiddleAutoVo);
return ajaxResult;
}
@Log(title = "修改单据状态", businessType = BusinessType.INSERT) @Log(title = "修改单据状态", businessType = BusinessType.INSERT)
@PostMapping("/updateStatus") @PostMapping("/updateStatus")
@ResponseBody @ResponseBody

View File

@@ -50,6 +50,16 @@ public class MesOutorderMiddle
private String beginDate; private String beginDate;
private String endDate; private String endDate;
private String createType;
public String getCreateType() {
return createType;
}
public void setCreateType(String createType) {
this.createType = createType;
}
public String getEndDate() { public String getEndDate() {
return endDate; return endDate;
} }

View File

@@ -0,0 +1,27 @@
package com.ruoyi.project.middle.mesOutorder.domain;
import com.ruoyi.project.middle.mesOutorderDetail.domain.MesOutorderDetailMiddle;
import com.ruoyi.project.out.productAndStock.domain.ViewProductAndStock;
import java.util.List;
public class MesOutorderMiddleAutoVo {
private MesOutorderMiddle mesOutorderMiddle;
private ViewProductAndStock viewProductAndStock;
public MesOutorderMiddle getMesOutorderMiddle() {
return mesOutorderMiddle;
}
public void setMesOutorderMiddle(MesOutorderMiddle mesOutorderMiddle) {
this.mesOutorderMiddle = mesOutorderMiddle;
}
public ViewProductAndStock getViewProductAndStock() {
return viewProductAndStock;
}
public void setViewProductAndStock(ViewProductAndStock viewProductAndStock) {
this.viewProductAndStock = viewProductAndStock;
}
}

View File

@@ -5,6 +5,7 @@ import java.util.Map;
import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.project.middle.mesOutorder.domain.MesOutorderMiddle; import com.ruoyi.project.middle.mesOutorder.domain.MesOutorderMiddle;
import com.ruoyi.project.middle.mesOutorder.domain.MesOutorderMiddleAutoVo;
import com.ruoyi.project.middle.mesOutorder.domain.MesOutorderMiddleVo; import com.ruoyi.project.middle.mesOutorder.domain.MesOutorderMiddleVo;
/** /**
@@ -64,7 +65,7 @@ public interface IMesOutorderMiddleService
public int deleteMesOutorderMiddleById(String id); public int deleteMesOutorderMiddleById(String id);
public AjaxResult insertMesOutorder(MesOutorderMiddleVo mesOutorderMiddleVo); public AjaxResult insertMesOutorder(MesOutorderMiddleVo mesOutorderMiddleVo,String createType);
/** /**
修改单据状态 修改单据状态
@@ -72,4 +73,5 @@ public interface IMesOutorderMiddleService
public Map<String, Object> updateStatus(String[] orderIds, String status, String newStatus); public Map<String, Object> updateStatus(String[] orderIds, String status, String newStatus);
} AjaxResult insertMesOutorderAuto(MesOutorderMiddleAutoVo mesOutorderMiddleAutoVo);
}

View File

@@ -2,10 +2,7 @@ package com.ruoyi.project.middle.mesOutorder.service.impl;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.Date; import java.util.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.core.domain.entity.SysUser;
@@ -15,6 +12,7 @@ import com.ruoyi.common.utils.uuid.UUID;
import com.ruoyi.project.bas.basCustomer.domain.BasCustomer; import com.ruoyi.project.bas.basCustomer.domain.BasCustomer;
import com.ruoyi.project.bas.basCustomer.mapper.BasCustomerMapper; import com.ruoyi.project.bas.basCustomer.mapper.BasCustomerMapper;
import com.ruoyi.project.bas.basJobId.service.IBasJobIdService; import com.ruoyi.project.bas.basJobId.service.IBasJobIdService;
import com.ruoyi.project.middle.mesOutorder.domain.MesOutorderMiddleAutoVo;
import com.ruoyi.project.middle.mesOutorder.domain.MesOutorderMiddleVo; import com.ruoyi.project.middle.mesOutorder.domain.MesOutorderMiddleVo;
import com.ruoyi.project.middle.mesOutorderDetail.domain.MesOutorderDetailMiddle; import com.ruoyi.project.middle.mesOutorderDetail.domain.MesOutorderDetailMiddle;
import com.ruoyi.project.middle.mesOutorderDetail.mapper.MesOutorderDetailMiddleMapper; import com.ruoyi.project.middle.mesOutorderDetail.mapper.MesOutorderDetailMiddleMapper;
@@ -22,6 +20,8 @@ import com.ruoyi.project.out.outStock.domain.OutStockout;
import com.ruoyi.project.out.outStock.mapper.OutStockoutMapper; import com.ruoyi.project.out.outStock.mapper.OutStockoutMapper;
import com.ruoyi.project.out.outStockDetail.domain.OutStockoutDetail; import com.ruoyi.project.out.outStockDetail.domain.OutStockoutDetail;
import com.ruoyi.project.out.outStockDetail.mapper.OutStockoutDetailMapper; import com.ruoyi.project.out.outStockDetail.mapper.OutStockoutDetailMapper;
import com.ruoyi.project.out.productAndStock.domain.ViewProductAndStock;
import com.ruoyi.project.out.productAndStock.service.IViewProductAndStockService;
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 com.ruoyi.project.middle.mesOutorder.mapper.MesOutorderMiddleMapper; import com.ruoyi.project.middle.mesOutorder.mapper.MesOutorderMiddleMapper;
@@ -50,6 +50,8 @@ public class MesOutorderMiddleServiceImpl implements IMesOutorderMiddleService
private OutStockoutMapper outStockoutMapper; private OutStockoutMapper outStockoutMapper;
@Autowired @Autowired
private OutStockoutDetailMapper outStockoutDetailMapper; private OutStockoutDetailMapper outStockoutDetailMapper;
@Autowired
private IViewProductAndStockService viewProductAndStockService;
/** /**
* 查询mes出库单中间表 * 查询mes出库单中间表
@@ -126,7 +128,7 @@ public class MesOutorderMiddleServiceImpl implements IMesOutorderMiddleService
} }
@Override @Override
public AjaxResult insertMesOutorder(MesOutorderMiddleVo mesOutorderMiddleVo) { public AjaxResult insertMesOutorder(MesOutorderMiddleVo mesOutorderMiddleVo,String createType) {
try { try {
MesOutorderMiddle mesOutorderMiddle = mesOutorderMiddleVo.getMesOutorderMiddle(); MesOutorderMiddle mesOutorderMiddle = mesOutorderMiddleVo.getMesOutorderMiddle();
mesOutorderMiddle.setId(UUID.randomUUID().toString()); mesOutorderMiddle.setId(UUID.randomUUID().toString());
@@ -138,6 +140,7 @@ public class MesOutorderMiddleServiceImpl implements IMesOutorderMiddleService
userName = user.getUserName(); userName = user.getUserName();
mesOutorderMiddle.setConstructor(userName); mesOutorderMiddle.setConstructor(userName);
mesOutorderMiddle.setStatus("1"); mesOutorderMiddle.setStatus("1");
mesOutorderMiddle.setCreateType(createType);
mesOutorderMiddleMapper.insertMesOutorderMiddle(mesOutorderMiddle); mesOutorderMiddleMapper.insertMesOutorderMiddle(mesOutorderMiddle);
OutStockout outStockout = new OutStockout(); OutStockout outStockout = new OutStockout();
outStockout.setStockoutId(mesOutorderMiddle.getSaleOrder()); outStockout.setStockoutId(mesOutorderMiddle.getSaleOrder());
@@ -211,4 +214,41 @@ public class MesOutorderMiddleServiceImpl implements IMesOutorderMiddleService
resultMap.put("errorInfo", builder.toString()); resultMap.put("errorInfo", builder.toString());
return resultMap; return resultMap;
} }
@Override
public AjaxResult insertMesOutorderAuto(MesOutorderMiddleAutoVo mesOutorderMiddleAutoVo) {
ViewProductAndStock viewProductAndStock = mesOutorderMiddleAutoVo.getViewProductAndStock();
List<ViewProductAndStock> viewProductAndStocks = viewProductAndStockService.selectViewProductAndStockList(viewProductAndStock);
MesOutorderMiddleVo mesOutorderMiddleVo = new MesOutorderMiddleVo();
MesOutorderMiddle mesOutorderMiddle = new MesOutorderMiddle();
List<MesOutorderDetailMiddle> mesOutorderDetailMiddleList = new ArrayList<>();
BigDecimal quantity = viewProductAndStock.getBhQuantity();
//拼接数据
for (ViewProductAndStock viewProductAndStock1 : viewProductAndStocks) {
if (quantity.compareTo(BigDecimal.valueOf(0))==0){
break;
}
MesOutorderDetailMiddle mesOutorderDetailMiddle = new MesOutorderDetailMiddle();
mesOutorderDetailMiddle.setErpCode(viewProductAndStock1.getProductId());
mesOutorderDetailMiddle.setProductName(viewProductAndStock1.getProductName());
mesOutorderDetailMiddle.setProduceDate(viewProductAndStock1.getInClassName());
mesOutorderDetailMiddle.setProductBatch(viewProductAndStock1.getLotNo());
mesOutorderDetailMiddle.setMaterialCode(viewProductAndStock1.getClassgroupNumber());
mesOutorderDetailMiddle.setShape(viewProductAndStock1.getProductDetailId());
mesOutorderDetailMiddle.setPrintDate(viewProductAndStock1.getPrintDate());
//mesOutorderDetailMiddle.setQuantity(viewProductAndStock1.getMaterialCode());
//mesOutorderDetailMiddle.setRemark(viewProductAndStock1.getMaterialCode());
if (quantity.compareTo(viewProductAndStock1.getQuantity())>=0){
mesOutorderDetailMiddle.setPlanInQuantity(viewProductAndStock1.getQuantity());
quantity = quantity.subtract(viewProductAndStock1.getQuantity());
}else {
mesOutorderDetailMiddle.setPlanInQuantity(quantity);
quantity = BigDecimal.ZERO;
}
mesOutorderDetailMiddleList.add(mesOutorderDetailMiddle);
}
mesOutorderMiddleVo.setMesOutorderMiddle(mesOutorderMiddle);
mesOutorderMiddleVo.setMesOutorderDetailMiddleList(mesOutorderDetailMiddleList);
return insertMesOutorder(mesOutorderMiddleVo, "2");
}
} }

View File

@@ -556,7 +556,7 @@ public class OutStockoutServiceImpl implements IOutStockoutService {
mesOutorderMiddleVo.setMesOutorderDetailMiddleList(mesOutorderDetailMiddles); mesOutorderMiddleVo.setMesOutorderDetailMiddleList(mesOutorderDetailMiddles);
AjaxResult ajaxResult = mesOutorderMiddleService.insertMesOutorder(mesOutorderMiddleVo); AjaxResult ajaxResult = mesOutorderMiddleService.insertMesOutorder(mesOutorderMiddleVo,"1");
OutStockout outStockout = new OutStockout(); OutStockout outStockout = new OutStockout();
outStockout.setStockoutId(stockoutId); outStockout.setStockoutId(stockoutId);
outStockout.setStatus("2"); outStockout.setStatus("2");

View File

@@ -44,12 +44,21 @@ public class ViewProductAndStock extends BaseEntity
/** 库存数量 */ /** 库存数量 */
@Excel(name = "库存数量") @Excel(name = "库存数量")
private BigDecimal quantity; private BigDecimal quantity;
private BigDecimal bhQuantity;
@Excel(name = "出库时间") @Excel(name = "出库时间")
private String printDate; private String printDate;
private String outType; private String outType;
public BigDecimal getBhQuantity() {
return bhQuantity;
}
public void setBhQuantity(BigDecimal bhQuantity) {
this.bhQuantity = bhQuantity;
}
public String getPrintDate() { public String getPrintDate() {
return printDate; return printDate;
} }

View File

@@ -16,10 +16,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<result property="saleName" column="sale_name" /> <result property="saleName" column="sale_name" />
<result property="status" column="status" /> <result property="status" column="status" />
<result property="saleOrder" column="sale_order" /> <result property="saleOrder" column="sale_order" />
<result property="createType" column="create_type" />
</resultMap> </resultMap>
<sql id="selectMesOutorderMiddleVo"> <sql id="selectMesOutorderMiddleVo">
select mom.id, order_id, constructor, operation_type, create_time, xf_time, order_type,sale_unit,status,sale_order,customer_name as sale_name from mes_outorder_middle mom select mom.id, order_id, constructor, operation_type, create_time, xf_time, order_type,sale_unit,status,sale_order,customer_name as sale_name,mom.create_type from mes_outorder_middle mom
left join bas_customer bc on bc.customer_no = mom.sale_unit left join bas_customer bc on bc.customer_no = mom.sale_unit
</sql> </sql>
<sql id="selectMesOutorderMiddleVo1"> <sql id="selectMesOutorderMiddleVo1">
@@ -78,6 +79,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="saleUnit != null">sale_unit,</if> <if test="saleUnit != null">sale_unit,</if>
<if test="status != null">status,</if> <if test="status != null">status,</if>
<if test="saleOrder != null">sale_order,</if> <if test="saleOrder != null">sale_order,</if>
<if test="createType != null">create_type,</if>
</trim> </trim>
<trim prefix="values (" suffix=")" suffixOverrides=","> <trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="id != null">#{id},</if> <if test="id != null">#{id},</if>
@@ -90,6 +92,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="saleUnit != null">#{saleUnit},</if> <if test="saleUnit != null">#{saleUnit},</if>
<if test="status != null">#{status},</if> <if test="status != null">#{status},</if>
<if test="saleOrder != null">#{saleOrder},</if> <if test="saleOrder != null">#{saleOrder},</if>
<if test="createType != null">#{createType},</if>
</trim> </trim>
</insert> </insert>

View File

@@ -66,6 +66,9 @@
<a id="continue" class="btn btn-success" onclick="newReceiptAgain()" > <a id="continue" class="btn btn-success" onclick="newReceiptAgain()" >
<i class="fa fa-plus"></i> 继续建单 <i class="fa fa-plus"></i> 继续建单
</a> </a>
<a id="autoCreate" class="btn btn-info" onclick="openAutoCreateModal()" >
<i class="fa fa-magic"></i> 自动建单
</a>
<a id="delete" class="btn btn-danger" onclick="deleteProduct()" > <a id="delete" class="btn btn-danger" onclick="deleteProduct()" >
<i class="fa fa-plus"></i> 删除物资 <i class="fa fa-plus"></i> 删除物资
</a> </a>
@@ -482,6 +485,104 @@
$.form.reset() $.form.reset()
} }
// 自动建单弹窗
function openAutoCreateModal() {
var html = '<div style="padding: 20px;">' +
'<form class="form-horizontal">' +
'<div class="form-group">' +
'<label class="col-sm-4 control-label is-required">物料牌号:</label>' +
'<div class="col-sm-7">' +
'<input type="text" id="auto_materialCode" class="form-control" placeholder="请输入物料牌号">' +
'</div>' +
'</div>' +
'<div class="form-group">' +
'<label class="col-sm-4 control-label">物料规格:</label>' +
'<div class="col-sm-7">' +
'<input type="text" id="auto_produceDate" class="form-control" placeholder="请输入物料规格">' +
'</div>' +
'</div>' +
'<div class="form-group">' +
'<label class="col-sm-4 control-label is-required">备货数量:</label>' +
'<div class="col-sm-7">' +
'<input type="number" id="auto_planInQuantity" class="form-control" placeholder="请输入备货数量">' +
'</div>' +
'</div>' +
'</form>' +
'</div>';
layer.open({
type: 1,
title: '自动建单',
area: ['500px', '320px'],
content: html,
btn: ['确定', '取消'],
yes: function (index, layero) {
var materialCode = $("#auto_materialCode").val();
var produceDate = $("#auto_produceDate").val();
var planInQuantity = $("#auto_planInQuantity").val();
if ($.common.isEmpty(materialCode) || $.common.isEmpty(planInQuantity)) {
$.modal.alertWarning("物料牌号和备货数量为必填项");
return;
}
if (planInQuantity <= 0) {
$.modal.alertWarning("备货数量必须大于0");
return;
}
var loadIndex = layer.load(2);
// 组装参数,保持与 /mes/mesOutorder/addSave 的 mesOutorderMiddle 一致
var params = new Object();
var o = {};
var a = $("#formId").serializeArray();
$.each(a, function() {
if (o[this.name]) {
if (!o[this.name].push) {
o[this.name] = [o[this.name]];
}
o[this.name].push(this.value || '');
} else {
o[this.name] = this.value || '';
}
});
// 将弹窗中的内容加入 viewProductAndStock
var viewProductAndStock = {
classgroupNumber: materialCode,
inClassName: produceDate,
bhQuantity: planInQuantity
};
params.mesOutorderMiddle = o;
params.viewProductAndStock = viewProductAndStock;
// 调用正式接口
$.ajax({
url: 'http://localhost:8090/mes/mesOutorder/addSaveAuto',
type: 'post',
contentType: 'application/json',
data: JSON.stringify(params),
dataType: 'json',
success: function(result) {
layer.close(loadIndex);
if (result.code == web_status.SUCCESS) {
layer.close(index);
$.modal.msgSuccess("自动建单成功");
} else {
$.modal.alertError(result.msg || "接口调用失败");
}
},
error: function(XMLHttpRequest, textStatus, error) {
layer.close(loadIndex);
$.modal.alertError("网络错误,设置失败");
}
});
}
});
}
//删除物资 //删除物资
function deleteProduct() { function deleteProduct() {
//获取选中行的内容 //获取选中行的内容

View File

@@ -927,6 +927,19 @@
title: '销售单位', title: '销售单位',
align: 'center' align: 'center'
}, },
{
field: 'createType',
title: '建单类型',
align: 'center',
formatter: function (value, row, index) {
// return $.table.selectDictLabel(djstatus, value);
if (value === "1") {
return "人工建单"
} else if (value == "2") {
return "自动建单"
}
}
},
{ {
field: 'createTime', field: 'createTime',