Browse Source

[fix]

品质管理 制程检验
修改添加制程检验页面,按照新版prd重新设计页面及功能;
修改制程检验物料VO类,添加物料型号和已检验数字段;
修改制程检验导出类,去除工序名称字典注解;
修改制程检验详情页面,按照新版添加页面实现;
修改制程检验列表页面,修改搜索栏字段,列表字段添加审批相关;修改导出方法;
修改选择物料页面,添加物料型号、已检验数字段,设置列居中显示;
dev
王晓迪 3 months ago
parent
commit
86fe75f87d
  1. 6
      ruoyi-admin/src/main/java/com/ruoyi/quality/domain/VO/CheckoutMaterialVO.java
  2. 2
      ruoyi-admin/src/main/java/com/ruoyi/quality/domain/VO/CheckoutProcessExportVO.java
  3. 778
      ruoyi-admin/src/main/resources/templates/quality/manufacturingCheckout/add.html
  4. 253
      ruoyi-admin/src/main/resources/templates/quality/manufacturingCheckout/detail.html
  5. 206
      ruoyi-admin/src/main/resources/templates/quality/manufacturingCheckout/manufacturingCheckout.html
  6. 23
      ruoyi-admin/src/main/resources/templates/quality/manufacturingCheckout/materialSelect.html

6
ruoyi-admin/src/main/java/com/ruoyi/quality/domain/VO/CheckoutMaterialVO.java

@ -36,6 +36,12 @@ public class CheckoutMaterialVO extends BaseEntity {
@Excel(name = "物料描述") @Excel(name = "物料描述")
private String materialDescribe; private String materialDescribe;
/**物料型号*/
private String materialModel;
//已检验数
private Integer checkedNum;
/** 物料加工方式 */ /** 物料加工方式 */
@Excel(name = "物料加工方式") @Excel(name = "物料加工方式")
private String materialProcessMethod; private String materialProcessMethod;

2
ruoyi-admin/src/main/java/com/ruoyi/quality/domain/VO/CheckoutProcessExportVO.java

@ -41,7 +41,7 @@ public class CheckoutProcessExportVO {
private String workshopName; private String workshopName;
/** 制程工序名称 */ /** 制程工序名称 */
@Excel(name = "工序名称",sort = 9,dictType = "manufacturing_process_name") @Excel(name = "工序名称",sort = 9)
private String manufacturingProcessName; private String manufacturingProcessName;
/** 工序顺序 */ /** 工序顺序 */

778
ruoyi-admin/src/main/resources/templates/quality/manufacturingCheckout/add.html

@ -3,7 +3,30 @@
<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>
<style>
.fixed-table-container {
border: 0px solid #ddd;
min-height: 140px;
}
.table-striped-two{
overflow: hidden;
scroll: auto;
}
.bordered-container {
/* 自动高度,根据内容自动调整 */
min-height: 0; /* 确保高度能收缩至内容高度 */
/* 自动宽度,对于块级元素已经是默认行为,但如果你想强调这一点或针对特定情况,可以显式声明 */
width: auto;
height: auto;
border: 1px dashed blue; /* 灰色边框,可根据需要调整颜色 */
/* 以下可选,根据需要添加,用于控制内外边距和布局 */
padding: 1rem;
box-sizing: border-box; /* 包含边框和内边距在宽度计算中 */
margin-bottom: 20px;
}
</style>
<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-manufacturingCheckout-add"> <form class="form-horizontal m" id="form-manufacturingCheckout-add">
@ -28,19 +51,29 @@
<div class="container"> <div class="container">
<div class="form-row"> <div class="form-row">
<div class="btn-group-sm" id="toolbar" role="group"> <span>选择物料</span>
<span>选择物料</span> <a class="btn btn-success" onclick="insertRow()">
<a class="btn btn-success" onclick="insertRow()"> <i class="fa fa-plus"></i> 选择物料
<i class="fa fa-plus"></i> 选择物料 </a>
</a>
</div>
</div> </div>
<div class="row"> <div class="row">
<div class="col-sm-12 select-table table-striped"> <div class="col-sm-12 select-table table-striped">
<table id="bootstrap-table"></table> <table id="bootstrap-material-table"></table>
</div> </div>
</div> </div>
</div> </div>
<div class="container mt-5">
<div class="btn-group-sm" style="margin-top: 10px;margin-bottom: 10px;">
<span>选择制程工序</span>
<a class="btn btn-success" onclick="insertCheckProcess()">
<i class="fa fa-plus"></i> 添加制程工序
</a>
</div>
<div id="contentArea" class="mt-3">
<!-- 初始内容可以在这里,例如一个列表项和一个表单 -->
</div>
</div>
</div> </div>
<th:block th:include="include :: footer" /> <th:block th:include="include :: footer" />
<th:block th:include="include :: datetimepicker-js" /> <th:block th:include="include :: datetimepicker-js" />
@ -50,7 +83,15 @@
var prefix = ctx + "quality/manufacturingCheckout"; var prefix = ctx + "quality/manufacturingCheckout";
var checkoutProcessList = []; var checkoutProcessList = [];
var materialProcessList = []; var materialProcessList = [];
var uniqueIdList = [];
var processMethodDatas = [[${@dict.getType('processMethod')}]]; var processMethodDatas = [[${@dict.getType('processMethod')}]];
var materialTypeDatas = [[${@category.getChildByCode('materialType')}]];
var manufacturingProcessNameDatas = [[${@dict.getType('manufacturing_process_name')}]];
var processBadClassificationDatas = [[${@dict.getType('process_bad_classification')}]];
var processBadGradeDatas = [[${@dict.getType('process_bad_grade')}]];
var manufacturingProcessList = [];
var processNameList = [];
var curIndex = 0;
$("#form-manufacturingCheckout-add").validate({ $("#form-manufacturingCheckout-add").validate({
focusCleanup: true focusCleanup: true
}); });
@ -62,48 +103,54 @@
obj[item.name] = item.value; obj[item.name] = item.value;
return obj; return obj;
}, {}); }, {});
// 获取bootstrap-table的数据,这里假设你使用bootstrap-table的API获取所有数据 var table = $('#bootstrap-material-table').bootstrapTable('getData');
var table = $('#bootstrap-table').bootstrapTable('getData');
// 检查表格数据是否为空 // 检查表格数据是否为空
if (table.length===0){ if (table.length===0){
$.modal.alertWarning("请至少添加一条物料数据后再保存!"); $.modal.alertWarning("请至少添加一条物料数据后再保存!");
return; return;
} }
// console.log(table); var checkOutNum = table[0].currentCheckoutNum;
// 将表数据转换成与complaintNoticeData格式一致的数组 //未检验数
var materialDataList = table.map(function(item) { var unCheckNum = Number(table[0].makeTotal)-Number(table[0].checkedNum);
// 根据实际字段名调整 if(checkOutNum == ''||checkOutNum == null
return { ||checkOutNum == undefined||checkOutNum === 0){
"materialNo": item.materialNo, // 假设id对应materialId $.modal.alertWarning("物料本次检验数为空!");
"materialPhotourl": item.materialPhotourl, // 假设quantity是物料数量字段 return;
"materialName": item.materialName, }
"materialType": item.materialType, if(checkOutNum > unCheckNum){
"materialUnit": item.materialUnit, $.modal.alertWarning("物料本次检验数超出未检验数,请检查!");
"materialBrand": item.materialBrand, return;
"materialDescribe": item.materialDescribe, }
"materialProcessMethod": item.materialProcessMethod, var checkOutMaterial = table[0];
"makeTotal": item.makeTotal, var qualityManufacturingCheckout = {
"checkedNum": item.checkedNum, makeNo: $("#makeNo").val(),
"currentCheckoutNum": item.currentCheckoutNum, checkoutTime: $("input[name='checkoutTime']").val(),
"processQualifiedNum":item.processQualifiedNum, materialNo: table[0].materialNo,
"processUnqualifiedNum":item.processUnqualifiedNum materialName: table[0].materialName
// ...其他字段 }
};
}); $(".bordered-container").each(function (index,container){
materialDataList.forEach(function(item) { var tableId = "bootstrap-manufacturingProcess-table-"+uniqueIdList[index];
item.materialProcessList = []; var unqualifiedTableId = "bootstrap-unqualifiedClass-table-"+uniqueIdList[index];
materialProcessList.forEach(function (process){ var processDatas = $("#"+tableId).bootstrapTable("getData")[0];
if(process.materialNo === item.materialNo){
item.materialProcessList.push(process); var okAcceptedNum = $(container).find("input[name='okAcceptedNum']").val();
} var specialConcessionsNum = $(container).find("input[name='specialConcessionsNum']").val();
}) processDatas.okAcceptedNum = okAcceptedNum;
}); processDatas.specialConcessionsNum = specialConcessionsNum;
const combinedData = Object.assign({}, manufacturingCheckoutData, { checkoutMaterialList: materialDataList }); var unqualifiedClassList = $("#"+unqualifiedTableId).bootstrapTable("getData");
// 合并表单数据和表格数据 if(unqualifiedClassList <= 0){
console.log(combinedData) $.modal.alertWarning("工序"+processDatas.manufacturingProcessCode+"不合格分类为空,请检查!");
// 使用 JSON.stringify() 序列化数据 return;
const jsonData = JSON.stringify(combinedData); }
processDatas.unqualifiedClassList = unqualifiedClassList;
materialProcessList.push(processDatas);
})
checkOutMaterial.materialProcessList = materialProcessList;
qualityManufacturingCheckout.checkoutMaterial = checkOutMaterial;
const jsonData = JSON.stringify(qualityManufacturingCheckout);
// 发送 AJAX 请求到后端接口 // 发送 AJAX 请求到后端接口
$.operate.saveJson(prefix + "/add", jsonData); $.operate.saveJson(prefix + "/add", jsonData);
} }
@ -114,8 +161,6 @@
autoclose: true autoclose: true
}); });
/*加载所有的关联生产单号*/
loadAllMakeNos();
/*加载所有的关联生产单号*/ /*加载所有的关联生产单号*/
function loadAllMakeNos(){ function loadAllMakeNos(){
var url = ctx + 'system/makeorder/getAllMakeNos'; var url = ctx + 'system/makeorder/getAllMakeNos';
@ -126,9 +171,7 @@
success: function (data){ success: function (data){
if (data && Array.isArray(data)){ if (data && Array.isArray(data)){
var selectElement = $('#makeNo'); //获取生产编号下拉框元素 var selectElement = $('#makeNo'); //获取生产编号下拉框元素
//清空下拉框现有选项
selectElement.empty(); selectElement.empty();
// 添加默认选项(如果需要)
selectElement.append('<option value="">请选择关联生产单号</option>'); selectElement.append('<option value="">请选择关联生产单号</option>');
//遍历返回的数据,添加下拉框的选项 //遍历返回的数据,添加下拉框的选项
$.each(data,function (index,item){ $.each(data,function (index,item){
@ -144,46 +187,63 @@
//物料信息展示列表 //物料信息展示列表
$(function() { $(function() {
loadAllMakeNos();
var options = { var options = {
id: "bootstrap-material-table",
modalName: "选择物料", modalName: "选择物料",
showSearch: false, showSearch: false,
showRefresh: false, showRefresh: false,
showToggle: false, showToggle: false,
showColumns: false, showColumns: false,
height: 40,
pagination: false, // 设置不分页 pagination: false, // 设置不分页
columns: [{ columns: [
checkbox: true
},
{ {
title: '料号', title: '料号',
field: 'materialNo', field: 'materialNo',
align: 'center',
}, },
{ {
title: '图片', title: '图片',
align: 'center',
field: 'materialPhotourl', field: 'materialPhotourl',
}, },
{ {
title: '物料名称', title: '物料名称',
align: 'center',
field: 'materialName', field: 'materialName',
}, },
{ {
title: '物料类型', title: '物料类型',
align: 'center',
field: 'materialType', field: 'materialType',
formatter: function(value, row, index) {
return $.table.selectCategoryLabel(materialTypeDatas, value);
}
},
{
title: '物料型号',
align: 'center',
field: 'materialModel',
}, },
{ {
title: '描述', title: '描述',
align: 'center',
field: 'materialDescribe', field: 'materialDescribe',
}, },
{ {
title: '品牌', title: '品牌',
align: 'center',
field: 'materialBrand', field: 'materialBrand',
}, },
{ {
title: '单位', title: '单位',
align: 'center',
field: 'materialUnit', field: 'materialUnit',
}, },
{ {
title: '物料加工方式', title: '加工方式',
align: 'center',
field: 'materialProcessMethod', field: 'materialProcessMethod',
formatter: function(value, row, index) { formatter: function(value, row, index) {
return $.table.selectDictLabel(processMethodDatas, value); return $.table.selectDictLabel(processMethodDatas, value);
@ -191,34 +251,37 @@
}, },
{ {
title: '订单数', title: '订单数',
align: 'center',
field: 'makeTotal', field: 'makeTotal',
}, },
{ {
title: '已检验数', title: '已检验数',
align: 'center',
field: 'checkedNum', field: 'checkedNum',
}, },
{ {
title: '本次检验数', title: '本次检验数',
align: 'center',
field: 'currentCheckoutNum', field: 'currentCheckoutNum',
editable: { editable: {
type:'text' type:'text',
} mode:'inline',
}, validate: function (v) {
{ if (!v) return '数量不能为空';
title: '制程检验报告', if (isNaN(v)) return '数量必须是数字';
align: 'center', var checkNum = parseInt(v);
formatter: function(value, row, index) { if (checkNum < 0) return '数量必须是正整数';
var actions = []; }
actions.push('<a class="btn btn-success btn-xs" href="javascript:void(0)" onclick="checkoutReport(\'' + row.materialNo + '\')"><i class="fa fa-plus"></i>检验报告</a> ');
return actions.join('');
} }
}, },
{ {
title: '工序合格数', title: '工序合格数',
align: 'center',
field: 'processQualifiedNum', field: 'processQualifiedNum',
}, },
{ {
title: '工序不合格数', title: '工序不合格数',
align: 'center',
field: 'processUnqualifiedNum', field: 'processUnqualifiedNum',
}, },
{ {
@ -233,13 +296,19 @@
] ]
}; };
$.table.init(options); $.table.init(options);
}) selectProcessCode();
});
/*选择物料按钮*/ /*选择物料按钮*/
function insertRow() { function insertRow() {
var material = $("#bootstrap-material-table").bootstrapTable("getData");
if(material.length>0){
$.modal.msgError("每次只能添加一个物料,请先删除当前物料");
return;
}
var selectedMakeNo = $("#makeNo").val(); var selectedMakeNo = $("#makeNo").val();
if (!selectedMakeNo) { if (!selectedMakeNo) {
$.modal.alertWarning("请先选择生产单号。"); $.modal.alertWarning("请先选择生产单号");
return; return;
} }
var encodedMakeNo = encodeURIComponent(selectedMakeNo); var encodedMakeNo = encodeURIComponent(selectedMakeNo);
@ -254,11 +323,9 @@
function doSubmit(index, layero,uniqueId){ function doSubmit(index, layero,uniqueId){
console.log(uniqueId);
var iframeWin = window[layero.find('iframe')[0]['name']]; var iframeWin = window[layero.find('iframe')[0]['name']];
var rowData = iframeWin.$('#bootstrap-materialSelect-table').bootstrapTable('getSelections')[0]; var rowData = iframeWin.$('#bootstrap-materialSelect-table').bootstrapTable('getSelections')[0];
console.log("rowData: "+rowData); $("#bootstrap-material-table").bootstrapTable('insertRow', {
$("#bootstrap-table").bootstrapTable('insertRow', {
index:1, index:1,
row: { row: {
materialNo:rowData.materialNo, materialNo:rowData.materialNo,
@ -268,9 +335,13 @@
materialDescribe: rowData.materialDescribe, materialDescribe: rowData.materialDescribe,
materialBrand: rowData.materialBrand, materialBrand: rowData.materialBrand,
materialUnit: rowData.materialUnit, materialUnit: rowData.materialUnit,
materialModel: rowData.materialModel,
materialProcessMethod: rowData.materialProcessMethod, materialProcessMethod: rowData.materialProcessMethod,
makeTotal:rowData.makeTotal, makeTotal:rowData.makeTotal,
currentCheckoutNum: "" checkedNum: rowData.checkedNum,
currentCheckoutNum: "",
processQualifiedNum: 0,
processUnqualifiedNum: 0,
} }
}) })
layer.close(index); layer.close(index);
@ -291,102 +362,509 @@
} }
} }
} }
// 逻辑删除前端的一行数据
function removeRow(materialNo){
$("#bootstrap-table").bootstrapTable('remove', {
field: 'materialNo',
values: materialNo
})
}
// 在父页面中定义处理函数 //新增制程工序模块
function handleCheckoutReportData(index, layero){ function insertCheckProcess() {
var iframeWin = window[layero.find('iframe')[0]['name']];
var processQualifiedNum = 0;
var processUnqualifiedNum = 0;
var materialNo = iframeWin.$('#form-checkoutReport-add').find('input[name="materialNo"]').val();
var materialName = iframeWin.$('#form-checkoutReport-add').find('input[name="materialName"]').val();
var uniqueIdString = iframeWin.$('#uniqueIdList').val();
var uniqueIdList = uniqueIdString.split(',');
console.log(uniqueIdList);
iframeWin.$('.container.bordered-container').each(function(index, tableElement) {
var tableId = uniqueIdList[index];
var $processTable = iframeWin.$('#bootstrap-manufacturingProcess-table-'+tableId);
var rows = $processTable.bootstrapTable('getData');
var manufacturingProcessCode = $processTable.find('select[name="manufacturingProcessCode"]').val();
var okAcceptedNum = iframeWin.$('#form-manfa-'+tableId).find('input[name="okAcceptedNum"]').val(); var material = $("#bootstrap-material-table").bootstrapTable("getData");
okAcceptedNum = Number(okAcceptedNum); if(material.length == 0){
var specialConcessionsNum = iframeWin.$('#form-manfa-'+tableId).find('input[name="specialConcessionsNum"]').val(); $.modal.msgError("物料表格为空,请先选择物料");
specialConcessionsNum = Number(specialConcessionsNum); return;
if (!isNaN(processQualifiedNum) && !isNaN(okAcceptedNum) && !isNaN(specialConcessionsNum)) { }
processQualifiedNum = processQualifiedNum + okAcceptedNum + specialConcessionsNum;
console.log(processQualifiedNum);
} else {
console.log("One or more variables is not a valid number.");
}
var materialProcess = {
materialNo: materialNo,
materialName: materialName,
manufacturingProcessCode: manufacturingProcessCode,
manufacturingProcessName: rows[0].manufacturingProcessName,
deviceName: rows[0].deviceName,
deviceModelCode: rows[0].deviceModelCode,
processSequence: rows[0].processSequence,
workshopName: rows[0].workshopName,
modName: rows[0].modName,
processInspectionItem: rows[0].processInspectionItem,
okAcceptedNum: okAcceptedNum,
specialConcessionsNum: specialConcessionsNum,
unqualifiedClassList: []
};
var unqualifiedRows = iframeWin.$('#bootstrap-unqualifiedClass-table-'+tableId).bootstrapTable('getData'); curIndex ++;
for (var i = 0; i < unqualifiedRows.length; i++) { var uniqueId = "unique_" + curIndex;
var row = unqualifiedRows[i]; uniqueIdList.push(uniqueId);
// 获取 '不良分类' 列的 <select> 元素的当前值
var processBadClassificationValue = iframeWin.$('#bootstrap-unqualifiedClass-table-' + tableId + ' tbody tr:eq(' + i + ') select[name="processBadClassification"]').val(); var newItem =
var processBadGradeValue = iframeWin.$('#bootstrap-unqualifiedClass-table-' + tableId + ' tbody tr:eq(' + i + ') select[name="processBadGrade"]').val(); '<div class="container bordered-container" id="div_'+ uniqueId +'">' +
"<div class='col-sm-12 my-3'>" +
`<h5>制程工序${curIndex}</h5>` +
"<div class='col-sm-12 select-table table-striped'>" +
'<table class="table-container checkoutMaterial-edit-table" id="bootstrap-manufacturingProcess-table-'+uniqueId+'"></table>' +
"</div>" +
"</div>" +
"<div class='col-sm-12 move-right'>" +
"<h3>合格数</h3>\n" +
" <div class='row'>" +
" <div class='form-group col-sm-6'>" +
" <label class='col-sm-4 control-label is-required'>ok允收数:</label>" +
" <div class='col-sm-8'>" +
" <input id='okAcceptedNum' name='okAcceptedNum' oninput='okAcceptedHandler()' class='form-control' type='number' value='0' required>" +
" </div>" +
" </div>" +
" <div class='form-group col-sm-6'>" +
" <label class='col-sm-4 control-label'>ok报告图片:</label>" +
" <div class='col-sm-8'>" +
" <input name='okReportUrl' class='form-control' type='text'>" +
" </div>" +
" </div>" +
" </div>" +
" <div class='row'>" +
" <div class='form-group col-sm-6'>" +
" <label class='col-sm-4 control-label is-required'>特采/让步数:</label>" +
" <div class='col-sm-8'>" +
" <input id='specialConcessionsNum' name='specialConcessionsNum' oninput='okAcceptedHandler()' class='form-control' type='number' value='0' required>" +
" </div>" +
" </div>" +
" <div class='form-group col-sm-6'>" +
" <label class='col-sm-4 control-label'>特采报告图片:</label>" +
" <div class='col-sm-8'>" +
" <input name='specialReportUrl' class='form-control' type='text'>" +
" </div>\n" +
" </div>\n" +
" </div>"+
"</form>"+
"</div>" +
"<div class='col-sm-12 my-3'>" +
"<h5>不合格数</h5>" +
"<div class='form-row'> " +
"<a class='btn btn-success' onclick='insertUnqualifiedRow(\"#bootstrap-unqualifiedClass-table-" + uniqueId + "\")'>"+
"<i class='fa fa-plus'></i> 添加 " +"</a>" +
"</div>" +
'<div class="col-sm-12 select-table table-striped-two" id="unqualified_'+uniqueId+'">' +
'<table class="table-container checkoutMaterial-edit-table" id="bootstrap-unqualifiedClass-table-' + uniqueId + '"></table>' +
"</div>" +
"</div>" +
"</div>";
$("#contentArea").append(newItem);
var bootstarpId = "bootstrap-manufacturingProcess-table-" + uniqueId;
var options1 = {
id:bootstarpId,
showSearch: false,
showRefresh: false,
showToggle: false,
showColumns: false,
pagination: false, // 设置不分页
modalName: "选择制程工序",
height:30,
columns: [
{
title: '制程工序编号',
field: 'manufacturingProcessCode',
align: 'center',
formatter: function (value, row, index) {
var tableId = bootstarpId;
return initProcessCodeSelector(value,row,index,tableId);
}
},
{
title: '制程工序名称',
align: 'center',
field: 'manufacturingProcessName',
formatter:function (value, row, index) {
var tableId = bootstarpId;
return manufacturingProcessNameFormatter(value,row,index,tableId);
}
},
{
title: '设备名称',
align: 'center',
field: 'deviceName',
},
{
title: '设备型号',
align: 'center',
field: 'deviceModelCode',
},
{
title: '工序顺序',
align: 'center',
field: 'processSequence',
},
{
title: '车间名称',
align: 'center',
field: 'workshopName',
},
{
title: '零件名称',
align: 'center',
field: 'modName',
},
{
title: '工序检验项目',
align: 'center',
field: 'processInspectionItem',
},
{
title: '操作',
align: 'center',
formatter: function(value, row, index) {
var actions = [];
actions.push('<a class="btn btn-danger btn-xs" href="javascript:void(0)" onclick="removeProcess(\'' + uniqueId + '\')"><i class="fa fa-remove"></i>删除</a> ');
return actions.join('');
}
},
],
};
$.table.init(options1);
//初始化不合格分类表格
var unqualifiedTableId = 'bootstrap-unqualifiedClass-table-' + uniqueId;
var options2 = {
id:'bootstrap-unqualifiedClass-table-' + uniqueId,
showSearch: false,
showRefresh: false,
showToggle: false,
showColumns: false,
height: 40,
pagination: false, // 设置不分页
modalName: "添加不合格分类",
columns: [
{
title: '不合格分类Id',
field: 'unqualifiedClassId',
visible: false,
},
{
title: '不良分类',
align: 'center',
field: 'processBadClassification',
formatter:function (value, row, index) {
return processBadClassificationFormatter(value,row,index,unqualifiedTableId);
}
},
{
title: '不良等级',
align: 'center',
field: 'processBadGrade',
formatter:function (value, row, index) {
return processBadGradeFormatter(value,row,index,unqualifiedTableId);
}
},
{
title: '不良数量',
align: 'center',
field: 'processBadNum',
editable: {
type:'text',
mode:'inline',
validate: function (v) {
if (!v) return '数量不能为空';
if (isNaN(v)) return '数量必须是数字';
var checkNum = parseInt(v);
if (checkNum < 0) return '数量必须是正整数';
}
}
},
{
title: '报告',
align: 'center',
field: 'processBadPhotourl',
editable:true
// formatter: function(value, row, index) {
// var actions = [];
// actions.push('<a class="btn btn-success btn-xs" href="javascript:void(0)" ><i class="fa fa-plus"></i>上传</a> ');
// return actions.join('');
// }
},
{
title: '操作',
align: 'center',
formatter: function(value, row, index) {
var actions = [];
actions.push(`<a class="btn btn-danger btn-xs" href="javascript:void(0)" onclick="removeUnqualifiedClassRow('${row.unqualifiedClassId}', '${options2.id}','${row.processBadNum}')"><i class="fa fa-remove"></i>删除</a> `);
return actions.join('');
}
},
],
onEditableSave: function (field, row, oldValue, $el) {
updateUnqualifiedNum();
}
};
$.table.init(options2);
$(".fixed-table-container","#unqualified_" + uniqueId).css("min-height","200px");
$("#bootstrap-manufacturingProcess-table-" +uniqueId ).bootstrapTable('insertRow', {
index: 1,
row: {
manufacturingProcessCode: '',
manufacturingProcessName: '',
deviceName: '',
deviceModelCode: '',
processSequence: '',
workshopName: '',
modName: ''
}
});
};
function insertUnqualifiedRow(tableId) {
var $table = $(tableId); // 使用传入的ID获取表格实例
var newRow = {
unqualifiedClassId: 'UC_' + new Date().getTime(), // 示例生成唯一ID
processBadClassification: '',
processBadGrade: '',
processBadNum: '',
processBadPhotourl: '',
};
$table.bootstrapTable('append', newRow);
}
//查询所有的制程工序编号
function selectProcessCode(){
$.ajax({
url: ctx + 'quality/manufacturingCheckout/getProcessCodeList',
type: "post",
dataType: "json",
success: function (res) {
if (res.rows.length > 0) {
var processData = res.rows;
processData.forEach(function (process){
manufacturingProcessList.push(process.manufacturingProcessCode);
processNameList.push(process.manufacturingProcessName);
})
}else {
$.modal.error("数据为空");
}
}
});
}
// 重新初始化下拉框列表
function initProcessCodeSelector(value, row, index,tableId) {
var selectHtml = `<select class="form-control" onchange="handleManufacturingProcessChange(this, ${index}, '${tableId}')">`;
selectHtml += '<option value=""' + (value === undefined || value === '' || value === null ? ' selected' : '') + '>所有</option>';
manufacturingProcessList.forEach(function (child) {
selectHtml += '<option value="' + child + '"' + (value === child ? ' selected' : '') + '>' + child + '</option>';
});
selectHtml += '</select>';
return selectHtml;
}
// 更新原始数据对象
row.processBadClassification = processBadClassificationValue;
row.processBadGrade = processBadGradeValue;
var unquilifiedClass = { function handleManufacturingProcessChange(selectElement,index, tableId) {
processBadClassification: row.processBadClassification, var selectedValue = $(selectElement).val();
processBadGrade: row.processBadGrade, if(checkCodeUnique(selectedValue)){
processBadNum: row.processBadNum, $.modal.msgError("该工序已添加,请重新选择");
clearProcessTable(index,tableId);
return;
}
if (selectedValue) {
$.ajax({
url: ctx + 'quality/manufacturingProcess/getProcessByCode/' + selectedValue,
method: 'GET',
dataType: 'json',
success: function (response) {
if (response.data) {
var newData = response.data;
var newRowData = {
manufacturingProcessCode: selectedValue || '',
manufacturingProcessName: newData.manufacturingProcessName || '',
deviceName: newData.deviceName || '',
deviceModelCode: newData.deviceModelCode || '',
processSequence: newData.processSequence || '',
workshopName: newData.workshopName || '',
modName: newData.modName || '',
processInspectionItem: newData.processInspectionItem || '',
};
// 使用Bootstrap Table的updateRow方法更新表格数据,注意这里使用传入的索引
$('#' + tableId).bootstrapTable('updateRow', {
index: index, // 使用传递进来的索引
row: newRowData
});
} else {
$.modal.msgError('后端请求数据为空');
console.error('后端请求数据为空');
}
},
error: function (xhr, status, error) {
console.error('请求出错:', status, ", ", error);
} }
var processBadNum = Number(row.processBadNum); });
if(!isNaN(processBadNum)){ }
processUnqualifiedNum += processBadNum; }
// 删除物料的一行数据
function removeRow(materialNo){
$("#bootstrap-material-table").bootstrapTable('remove', {
field: 'materialNo',
values: materialNo
})
}
//刪除制程检验工序
function removeProcess(uniqueId){
$("#div_"+uniqueId).remove();
// 从 uniqueIdList 中移除 uniqueId
var index = uniqueIdList.indexOf(uniqueId);
if (index > -1) {
uniqueIdList.splice(index, 1);
}
}
//删除不良分类
function removeUnqualifiedClassRow(unqualifiedClassId,tableId,processBadNum) {
$("#"+tableId).bootstrapTable('remove', {
field: 'unqualifiedClassId',
values: unqualifiedClassId
});
//物料主表减去不良数
updateUnqualifiedNum();
}
//自定义制程检验名称的初始化函数
function manufacturingProcessNameFormatter(value, row, index,tableId){
var selectHtml = `<select class="form-control" onchange="onManufacturingProcessName(this, ${index}, '${tableId}')">`;
selectHtml += '<option value=""' + (value === undefined || value === '' ? ' selected' : '') + '>所有</option>';
processNameList.forEach(function (child) {
selectHtml += '<option value="' + child + '"' + (value === child ? ' selected' : '') + '>' + child + '</option>';
});
selectHtml += '</select>';
return selectHtml;
}
function onManufacturingProcessName(selectElement, rowIndex,tableId) {
var manufacturingProcessNameValue = $(selectElement).val();
if(checkNameUnique(manufacturingProcessNameValue)){
$.modal.msgError("该工序已添加,请重新选择");
clearProcessTable(rowIndex,tableId);
return;
}
if (manufacturingProcessNameValue) {
$.ajax({
url: ctx + 'quality/manufacturingProcess/getProcessByName',
method: 'GET',
dataType: 'json',
data:{manufacturingProcessName: manufacturingProcessNameValue},
success: function(response) {
if (response.data) {
var newData = response.data;
var newRowData = {
manufacturingProcessCode: newData.manufacturingProcessCode || '',
manufacturingProcessName: manufacturingProcessNameValue || '',
deviceName: newData.deviceName || '',
deviceModelCode: newData.deviceModelCode || '',
processSequence: newData.processSequence || '',
workshopName: newData.workshopName || '',
modName: newData.modName || '',
processInspectionItem: newData.processInspectionItem || '',
};
// 使用Bootstrap Table的updateRow方法更新表格数据,注意这里使用传入的索引
$('#' + tableId).bootstrapTable('updateRow', {
index: rowIndex, // 使用传递进来的索引
row: newRowData
});
} else {
console.error('后端请求数据为空');
}
},
error: function(xhr, status, error) {
console.error('请求出错:', status, ", ", error);
} }
materialProcess.unqualifiedClassList.push(unquilifiedClass); });
console.log(materialProcess); }
} }
materialProcessList.push(materialProcess); // 自定义不良分类的初始化函数
function processBadClassificationFormatter(value, row, index,tableId) {
var selectHtml = `<select class="form-control" onchange="onProcessBadClassification(this, ${index}, '${tableId}')">`;
selectHtml += '<option value=""' + (value === undefined || value === '' ? ' selected' : '') + '>所有</option>';
processBadClassificationDatas.forEach(function (child) {
selectHtml += '<option value="' + child.dictValue + '"' + (value === child.dictValue ? ' selected' : '') + '>' + child.dictLabel + '</option>';
});
selectHtml += '</select>';
return selectHtml;
}
// 列中获取不良分类的下拉改变数据
function onProcessBadClassification(selectElement, rowIndex, tableId) {
var processBadClassificationValue = $(selectElement).val();
var tableData = $("#"+tableId).bootstrapTable('getData');
var newRow = tableData[rowIndex]; // 获取当前行数据
// 更新行数据
newRow.processBadClassification = processBadClassificationValue;
$("#"+tableId).bootstrapTable('updateRow', {index: rowIndex, row: newRow});
}
// 自定义不良等级的格式化函数
function processBadGradeFormatter(value, row, index, tableId) {
var selectHtml = `<select class="form-control" onchange="onProcessBadGrade(this, ${index}, '${tableId}')">`;
selectHtml += '<option value=""' + (value === undefined || value === '' ? ' selected' : '') + '>所有</option>';
processBadGradeDatas.forEach(function (child) {
selectHtml += '<option value="' + child.dictValue + '"' + (value === child.dictValue ? ' selected' : '') + '>' + child.dictLabel + '</option>';
}); });
// console.log("processQualifiedNum: "+processQualifiedNum); selectHtml += '</select>';
// console.log("processUnqualifiedNum: "+processUnqualifiedNum); return selectHtml;
var newData = { }
processQualifiedNum: processQualifiedNum, // 列中获取不良等级的下拉改变数据
processUnqualifiedNum: processUnqualifiedNum, function onProcessBadGrade(selectElement, rowIndex,tableId) {
var processBadGradeValue = $(selectElement).val();
var tableData = $("#"+tableId).bootstrapTable('getData');
var newRow = tableData[rowIndex]; // 获取当前行数据
// 重新渲染成本小类的设备名称列
// 更新行数据
newRow.processBadGrade = processBadGradeValue;
$("#"+tableId).bootstrapTable('updateRow', {index: rowIndex, row: newRow});
}
//特采让步数监听函数
//OK允收数监听函数
function okAcceptedHandler(){
var tableId = "bootstrap-material-table";
const okInputs = $("input[name='okAcceptedNum']");
const specialInputs = $("input[name='specialConcessionsNum']");
let sum = 0;
// 遍历所有输入框
for (let i = 0; i < okInputs.length; i++) {
const value = parseInt(okInputs[i].value);
const specialValue = parseInt(specialInputs[i].value);
if (!isNaN(value)&&!isNaN(specialValue)) {
sum = sum + value + specialValue;
}
} }
updateRowByMaterialNo(materialNo,newData); var tableData = $("#"+tableId).bootstrapTable('getData')[0];
layer.close(index); tableData.processQualifiedNum = sum;
$("#"+tableId).bootstrapTable('updateRow', {index: 0, row: tableData});
} }
/*检验报告*/ //校验工序编号是否唯一
function checkoutReport(materialNo){ function checkCodeUnique(selectedCode){
var makeNo = $('#makeNo').val(); //获取生产编号下拉框元素 var processCodeList = [];
var url = ctx + 'quality/manufacturingCheckout/checkoutReport/' + materialNo+'/'+makeNo; $(".bordered-container").each(function (index,container){
var options = { var tableId = "bootstrap-manufacturingProcess-table-"+uniqueIdList[index];
title: '制程检验报告', var processDatas = $("#"+tableId).bootstrapTable("getData")[0];
url: url, processCodeList.push(processDatas.manufacturingProcessCode);
callBack: handleCheckoutReportData })
return processCodeList.includes(selectedCode);
}
//校验工序名称是否唯一
function checkNameUnique(selectedName){
var processNameList = [];
$(".bordered-container").each(function (index,container){
var tableId = "bootstrap-manufacturingProcess-table-"+uniqueIdList[index];
var processDatas = $("#"+tableId).bootstrapTable("getData")[0];
processNameList.push(processDatas.manufacturingProcessName);
})
return processNameList.includes(selectedName);
}
//清空检验工序表格
function clearProcessTable(rowIndex,tableId){
var newRowData = {
manufacturingProcessCode: '',
manufacturingProcessName: '',
deviceName: '',
deviceModelCode: '',
processSequence: '',
workshopName: '',
modName: '',
processInspectionItem: '',
}; };
$.modal.openOptions(options); $('#' + tableId).bootstrapTable('updateRow', {
index: rowIndex,
row: newRowData
});
}
//更新物料表格工序不合格数
function updateUnqualifiedNum(){
var unqualifiedNum = 0;
uniqueIdList.forEach(function (uniqueId){
var unqualifiedTableId = "bootstrap-unqualifiedClass-table-" + uniqueId;
var unqualifyList = $("#"+unqualifiedTableId).bootstrapTable("getData");
if(unqualifyList.length>0){
unqualifyList.forEach(function (unqualify){
unqualifiedNum += Number(unqualify.processBadNum == ''?0:unqualify.processBadNum);
});
}
})
var newRow = {
processUnqualifiedNum: unqualifiedNum,
}
$('#bootstrap-material-table').bootstrapTable('updateRow', {
index: 0,
row: newRow
});
} }
</script> </script>
</body> </body>
</html> </html>

253
ruoyi-admin/src/main/resources/templates/quality/manufacturingCheckout/detail.html

@ -5,6 +5,28 @@
<th:block th:include="include:: select2-css" /> <th:block th:include="include:: select2-css" />
<th:block th:include="include :: datetimepicker-css" /> <th:block th:include="include :: datetimepicker-css" />
</head> </head>
<style>
.fixed-table-container {
border: 0px solid #ddd;
min-height: 140px;
}
.table-striped-two{
overflow: hidden;
scroll: auto;
}
.bordered-container {
/* 自动高度,根据内容自动调整 */
min-height: 0; /* 确保高度能收缩至内容高度 */
/* 自动宽度,对于块级元素已经是默认行为,但如果你想强调这一点或针对特定情况,可以显式声明 */
width: auto;
height: auto;
border: 1px dashed blue; /* 灰色边框,可根据需要调整颜色 */
/* 以下可选,根据需要添加,用于控制内外边距和布局 */
padding: 1rem;
box-sizing: border-box; /* 包含边框和内边距在宽度计算中 */
margin-bottom: 20px;
}
</style>
<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-manufacturingCheckout-edit" th:object="${qualityManufacturingCheckout}"> <form class="form-horizontal m" id="form-manufacturingCheckout-edit" th:object="${qualityManufacturingCheckout}">
@ -34,6 +56,12 @@
</div> </div>
</div> </div>
</div> </div>
<div class="container mt-5" style="margin-top: 10px;">
<div id="contentArea" class="mt-3">
<!-- 初始内容可以在这里,例如一个列表项和一个表单 -->
</div>
</div>
</div> </div>
<th:block th:include="include :: footer" /> <th:block th:include="include :: footer" />
<th:block th:include="include:: select2-js" /> <th:block th:include="include:: select2-js" />
@ -44,7 +72,13 @@
var makeNo = [[${qualityManufacturingCheckout.makeNo}]]; var makeNo = [[${qualityManufacturingCheckout.makeNo}]];
var prefix = ctx + "quality/manufacturingCheckout"; var prefix = ctx + "quality/manufacturingCheckout";
var processMethodDatas = [[${@dict.getType('processMethod')}]]; var processMethodDatas = [[${@dict.getType('processMethod')}]];
var materialTypeDatas = [[${@category.getChildByCode('materialType')}]];
var processBadClassificationDatas = [[${@dict.getType('process_bad_classification')}]];
var processBadGradeDatas = [[${@dict.getType('process_bad_grade')}]];
var checkoutMaterial = qualityManufacturingCheckout.checkoutMaterial;
var processList = checkoutMaterial.materialProcessList;
$("#form-manufacturingCheckout-edit").validate({focusCleanup: true }); $("#form-manufacturingCheckout-edit").validate({focusCleanup: true });
var curIndex = 0;
//物料信息展示列表 //物料信息展示列表
$(function() { $(function() {
$('#makeNo').val(makeNo); $('#makeNo').val(makeNo);
@ -54,42 +88,57 @@
showRefresh: false, showRefresh: false,
showToggle: false, showToggle: false,
showColumns: false, showColumns: false,
height: 40,
pagination: false, // 设置不分页 pagination: false, // 设置不分页
queryParams: queryParams, queryParams: queryParams,
modalName: "选择物料", modalName: "选择物料",
columns: [{ columns: [
checkbox: true
},
{ {
title: '料号', title: '料号',
field: 'materialNo', field: 'materialNo',
align: 'center',
}, },
{ {
title: '图片', title: '图片',
align: 'center',
field: 'materialPhotourl', field: 'materialPhotourl',
}, },
{ {
title: '物料名称', title: '物料名称',
align: 'center',
field: 'materialName', field: 'materialName',
}, },
{ {
title: '物料类型', title: '物料类型',
align: 'center',
field: 'materialType', field: 'materialType',
}, },
{
title: '物料型号',
align: 'center',
field: 'materialModel',
formatter: function(value, row, index) {
return $.table.selectCategoryLabel(materialTypeDatas, value);
}
},
{ {
title: '描述', title: '描述',
align: 'center',
field: 'materialDescribe', field: 'materialDescribe',
}, },
{ {
title: '品牌', title: '品牌',
align: 'center',
field: 'materialBrand', field: 'materialBrand',
}, },
{ {
title: '单位', title: '单位',
align: 'center',
field: 'materialUnit', field: 'materialUnit',
}, },
{ {
title: '物料加工方式', title: '加工方式',
align: 'center',
field: 'materialProcessMethod', field: 'materialProcessMethod',
formatter: function(value, row, index) { formatter: function(value, row, index) {
return $.table.selectDictLabel(processMethodDatas, value); return $.table.selectDictLabel(processMethodDatas, value);
@ -97,41 +146,200 @@
}, },
{ {
title: '订单数', title: '订单数',
align: 'center',
field: 'makeTotal', field: 'makeTotal',
}, },
{ {
title: '已检验数', title: '已检验数',
align: 'center',
field: 'checkedNum', field: 'checkedNum',
}, },
{ {
title: '本次检验数', title: '本次检验数',
field: 'currentCheckoutNum',
editable: {
type:'text'
}
},
{
title: '制程检验报告',
align: 'center', align: 'center',
formatter: function(value, row, index) { field: 'currentCheckoutNum',
var actions = [];
actions.push('<a class="btn btn-success btn-xs" href="javascript:void(0)" onclick="checkoutReport(\'' + row.materialNo + '\')">检验报告</a> ');
return actions.join('');
}
}, },
{ {
title: '工序合格数', title: '工序合格数',
align: 'center',
field: 'processQualifiedNum', field: 'processQualifiedNum',
}, },
{ {
title: '工序不合格数', title: '工序不合格数',
align: 'center',
field: 'processUnqualifiedNum', field: 'processUnqualifiedNum',
}, },
] ]
}; };
$.table.init(options); $.table.init(options);
processList.forEach(function (process){
insertCheckProcess(process);
})
}) })
//新增制程工序模块
function insertCheckProcess(process) {
curIndex ++;
var uniqueId = "unique_" + curIndex;
var newItem =
'<div class="container bordered-container" id="div_'+ uniqueId +'">' +
"<div class='col-sm-12 my-3'>" +
`<h5>制程工序${curIndex}</h5>` +
"<div class='col-sm-12 select-table table-striped'>" +
'<table class="table-container checkoutMaterial-edit-table" id="bootstrap-manufacturingProcess-table-'+uniqueId+'"></table>' +
"</div>" +
"</div>" +
"<div class='col-sm-12 move-right'>" +
"<h3>合格数</h3>\n" +
" <div class='row'>" +
" <div class='form-group col-sm-6'>" +
" <label class='col-sm-4 control-label is-required'>ok允收数:</label>" +
" <div class='col-sm-8'>" +
` <input readonly id='okAcceptedNum' name='okAcceptedNum' oninput='okAcceptedHandler()' class='form-control' type='number' value='${process.okAcceptedNum}' required>` +
" </div>" +
" </div>" +
" <div class='form-group col-sm-6'>" +
" <label class='col-sm-4 control-label'>ok报告图片:</label>" +
" <div class='col-sm-8'>" +
" <input readonly name='okReportUrl' class='form-control' type='text'>" +
" </div>" +
" </div>" +
" </div>" +
" <div class='row'>" +
" <div class='form-group col-sm-6'>" +
" <label class='col-sm-4 control-label is-required'>特采/让步数:</label>" +
" <div class='col-sm-8'>" +
` <input readonly id='specialConcessionsNum' name='specialConcessionsNum' oninput='okAcceptedHandler()' class='form-control' type='number' value='${process.specialConcessionsNum}' required>` +
" </div>" +
" </div>" +
" <div class='form-group col-sm-6'>" +
" <label class='col-sm-4 control-label'>特采报告图片:</label>" +
" <div class='col-sm-8'>" +
" <input readonly name='specialReportUrl' class='form-control' type='text'>" +
" </div>\n" +
" </div>\n" +
" </div>"+
"</form>"+
"</div>" +
"<div class='col-sm-12 my-3'>" +
"<h5>不合格数</h5>" +
'<div class="col-sm-12 select-table table-striped-two" id="unqualified_'+uniqueId+'">' +
'<table class="table-container checkoutMaterial-edit-table" id="bootstrap-unqualifiedClass-table-' + uniqueId + '"></table>' +
"</div>" +
"</div>" +
"</div>";
$("#contentArea").append(newItem);
var bootstarpId = "bootstrap-manufacturingProcess-table-" + uniqueId;
var processList = [];
processList.push(process);
console.log(processList);
var unQualifiedList = process.unqualifiedClassList;
var options1 = {
id:bootstarpId,
showSearch: false,
showRefresh: false,
showToggle: false,
showColumns: false,
pagination: false, // 设置不分页
modalName: "制程工序",
data: processList,
height:30,
columns: [
{
title: '制程工序编号',
field: 'manufacturingProcessCode',
align: 'center',
},
{
title: '制程工序名称',
align: 'center',
field: 'manufacturingProcessName',
},
{
title: '设备名称',
align: 'center',
field: 'deviceName',
},
{
title: '设备型号',
align: 'center',
field: 'deviceModelCode',
},
{
title: '工序顺序',
align: 'center',
field: 'processSequence',
},
{
title: '车间名称',
align: 'center',
field: 'workshopName',
},
{
title: '零件名称',
align: 'center',
field: 'modName',
},
{
title: '工序检验项目',
align: 'center',
field: 'processInspectionItem',
},
],
};
$.table.init(options1);
//初始化不合格分类表格
var unqualifiedTableId = 'bootstrap-unqualifiedClass-table-' + uniqueId;
var options2 = {
id:'bootstrap-unqualifiedClass-table-' + uniqueId,
showSearch: false,
showRefresh: false,
showToggle: false,
showColumns: false,
height: 40,
data: unQualifiedList,
pagination: false, // 设置不分页
modalName: "添加不合格分类",
columns: [
{
title: '不合格分类Id',
field: 'unqualifiedClassId',
visible: false,
},
{
title: '不良分类',
align: 'center',
field: 'processBadClassification',
formatter: function(value, row, index) {
return $.table.selectDictLabel(processBadClassificationDatas, value);
}
},
{
title: '不良等级',
align: 'center',
field: 'processBadGrade',
formatter: function(value, row, index) {
return $.table.selectDictLabel(processBadGradeDatas, value);
}
},
{
title: '不良数量',
align: 'center',
field: 'processBadNum',
},
{
title: '报告',
align: 'center',
field: 'processBadPhotourl',
},
]
};
$.table.init(options2);
$(".fixed-table-container","#unqualified_" + uniqueId).css("min-height","200px");
};
function queryParams(params) { function queryParams(params) {
var curParams = { var curParams = {
// 传递参数查询参数 // 传递参数查询参数
@ -139,11 +347,6 @@
}; };
return curParams; return curParams;
} }
function submitHandler() {
if ($.validate.form()) {
$.operate.save(prefix + "/detail", $('#form-manufacturingCheckout-edit').serialize());
}
}
$("input[name='checkoutTime']").datetimepicker({ $("input[name='checkoutTime']").datetimepicker({
format: "yyyy-mm-dd", format: "yyyy-mm-dd",
@ -152,12 +355,8 @@
}); });
/*检验报告*/
function checkoutReport(materialNo){
var manufacturingCheckoutCode = $('#manufacturingCheckoutCode').val(); //获取制程检验单编号
var url = ctx + 'quality/manufacturingCheckout/checkoutReportDetail/' + materialNo+'/'+manufacturingCheckoutCode;
$.modal.open("制程检验报告",url);
}
</script> </script>
</body> </body>
</html> </html>

206
ruoyi-admin/src/main/resources/templates/quality/manufacturingCheckout/manufacturingCheckout.html

@ -18,12 +18,6 @@
<label>生产单号:</label> <label>生产单号:</label>
<input type="text" name="makeNo"/> <input type="text" name="makeNo"/>
</li> </li>
<li class="select-time">
<label>检验时间:</label>
<input type="text" class="time-input" id="startTime" placeholder="开始时间" name="params[beginCheckoutTime]"/>
<span>-</span>
<input type="text" class="time-input" id="endTime" placeholder="结束时间" name="params[endCheckoutTime]"/>
</li>
<li> <li>
<label>料号:</label> <label>料号:</label>
<input type="text" name="materialNo"/> <input type="text" name="materialNo"/>
@ -32,6 +26,23 @@
<label>物料名称:</label> <label>物料名称:</label>
<input type="text" name="materialName"/> <input type="text" name="materialName"/>
</li> </li>
<li>
<label>录入人:</label>
<input type="text" name="createBy"/>
</li>
<li>
<label>审批状态:</label>
<select name="auditStatus" th:with="type=${@dict.getType('auditStatus')}">
<option value="">所有</option>
<option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}"></option>
</select>
</li>
<li class="select-time">
<label>检验时间:</label>
<input type="text" class="time-input" id="startTime" placeholder="开始时间" name="params[beginCheckoutTime]"/>
<span>-</span>
<input type="text" class="time-input" id="endTime" placeholder="结束时间" name="params[endCheckoutTime]"/>
</li>
<li class="select-time"> <li class="select-time">
<label>录入时间:</label> <label>录入时间:</label>
<input type="text" class="time-input" id="startTime" placeholder="开始时间" name="params[beginCreateTime]"/> <input type="text" class="time-input" id="startTime" placeholder="开始时间" name="params[beginCreateTime]"/>
@ -51,7 +62,7 @@
<a class="btn btn-success" onclick="$.operate.add()" shiro:hasPermission="quality:manufacturingCheckout:add"> <a class="btn btn-success" onclick="$.operate.add()" shiro:hasPermission="quality:manufacturingCheckout:add">
<i class="fa fa-plus"></i> 添加 <i class="fa fa-plus"></i> 添加
</a> </a>
<a class="btn btn-warning" onclick="exportExcel()" shiro:hasPermission="quality:manufacturingCheckout:export"> <a class="btn btn-success" onclick="exportExcel()" shiro:hasPermission="quality:manufacturingCheckout:export">
<i class="fa fa-download"></i> 导出 <i class="fa fa-download"></i> 导出
</a> </a>
</div> </div>
@ -61,10 +72,12 @@
</div> </div>
</div> </div>
<th:block th:include="include :: footer" /> <th:block th:include="include :: footer" />
<script th:src="@{/js/activiti.js}"></script>
<script th:inline="javascript"> <script th:inline="javascript">
var detailFlag = [[${@permission.hasPermi('quality:manufacturingCheckout:detail')}]]; var detailFlag = [[${@permission.hasPermi('quality:manufacturingCheckout:detail')}]];
var prefix = ctx + "quality/manufacturingCheckout"; var prefix = ctx + "quality/manufacturingCheckout";
var loginName = [[${@permission.getPrincipalProperty('loginName')}]];
$(function() { $(function() {
var options = { var options = {
@ -84,48 +97,121 @@
field: 'manufacturingCheckoutId', field: 'manufacturingCheckoutId',
visible: false visible: false
}, },
{
title: '使用状态',
visible: false,
field: 'useStatus',
},
{
title: '当前任务名称',
visible: false,
field: 'taskName',
},
{
title: '流程实例ID',
visible: false,
field: 'instanceId',
},
{
title: '流程实例类型',
visible: false,
field: 'instanceType',
},
{
title: '流程实例提交ID',
visible: false,
field: 'submitInstanceId',
},
{
title: '申请标题',
visible: false,
field: 'applyTitle',
},
{
title: '申请人',
visible: false,
field: 'applyUser',
},
{
title: '流程恢复实例ID',
visible: false,
field: 'restoreInstanceId',
},
{
title: '流程作废实例ID',
visible: false,
field: 'cancelInstanceId',
},
{ title: '当前状态',field: 'taskStatus',align: 'center',
formatter: function(value, row, index) {
if(row.auditStatus!="1"&&value != "未启动"){
return '<span class="badge badge-danger">' + value + '</span>';
}
if(value === "未启动"){
return '<span class="badge badge-primary">' + value + '</span>';
}
return '<span class="badge badge-primary">' + value + '</span>';
}
},
{ {
title: '制程检验单号', title: '制程检验单号',
field: 'manufacturingCheckoutCode', field: 'manufacturingCheckoutCode',
align: 'center',
}, },
{ {
title: '关联生产单号', title: '关联生产单号',
align: 'center',
field: 'makeNo', field: 'makeNo',
}, },
{ {
title: '检验时间', title: '检验时间',
align: 'center',
field: 'checkoutTime', field: 'checkoutTime',
}, },
{ {
title: '物料数合计', title: '料号',
field: 'materialTotal', align: 'center',
field: 'materialNo',
},
{
title: '物料名称',
align: 'center',
field: 'materialName',
}, },
{ {
title: '数量合计', title: '数量合计',
align: 'center',
field: 'numTotal', field: 'numTotal',
}, },
{ {
title: '制程工序合格数', title: '制程工序合格数',
align: 'center',
field: 'processQualifiedNum', field: 'processQualifiedNum',
}, },
{ {
title: '制程工序不合格数', title: '制程工序不合格数',
align: 'center',
field: 'processUnqualifiedNum', field: 'processUnqualifiedNum',
}, },
{ {
title: '录入人', title: '录入人',
align: 'center',
field: 'createBy', field: 'createBy',
}, },
{ {
title: '录入时间', title: '录入时间',
align: 'center',
field: 'createTime', field: 'createTime',
}, },
{ {
title: '更新人', title: '更新人',
align: 'center',
field: 'updateBy', field: 'updateBy',
}, },
{ {
title: '上次更新时间', title: '上次更新时间',
align: 'center',
field: 'updateTime', field: 'updateTime',
}, },
{ {
@ -133,70 +219,60 @@
align: 'center', align: 'center',
formatter: function(value, row, index) { formatter: function(value, row, index) {
var actions = []; var actions = [];
// 有流程实例id
if (row.instanceId) {
// 有待办人展示审批按钮,
if (row.todoUserId) {
var todoUserIdList = row.todoUserId.split(",");
if(todoUserIdList.includes(loginName)){
var nodeName = row.taskName=='驳回调整'?' 调整申请':' 审批';
actions.push('<a class="btn btn-success btn-xs" href="javascript:void(0)" onclick="showVerifyDialog(\'' + prefix + '\',\'' + row.taskId + '\', \'' + row.taskName+"-"+row.instanceTypeName+"申请" + '\')"><i class="fa fa-edit"></i> '+nodeName+'</a> ');
}
}
// 审批历史
actions.push('<a class="btn btn-success btn-xs" href="javascript:void(0)" onclick="showHistoryDialog(\'' + row.instanceId + '\')"> 审批历史</a> ');
// 进度查看
actions.push('<a class="btn btn-success btn-xs" href="javascript:void(0)" onclick="showProcessImgDialog(\'' + row.instanceId + '\')"> 进度查看</a> ');
}
actions.push('<a class="btn btn-success btn-xs ' + detailFlag + '" href="javascript:void(0)" onclick="detail(\'' + row.manufacturingCheckoutCode + '\')"><i class="fa fa-edit"></i>详情</a> '); actions.push('<a class="btn btn-success btn-xs ' + detailFlag + '" href="javascript:void(0)" onclick="detail(\'' + row.manufacturingCheckoutCode + '\')"><i class="fa fa-edit"></i>详情</a> ');
return actions.join(''); var actionLinks = actions.join('');
return $.table.dropdownToggle(actionLinks);
} }
}] }],
rowStyle: function (row, index) {
if (row.auditStatus=="0") {
// 如果审核状态为待审核,则设置为红色
return {css:{"color":"red"}};
}
// 否则使用默认样式
return {};
}
}; };
$.table.init(options); $.table.init(options);
}); });
// 导出 // 导出
function exportExcel(formId) { function exportExcel() {
// $.table.set(); var ids = $.table.selectColumns("manufacturingCheckoutCode");
var checkoutData = []; var dataParam = $("#formId").serializeArray();
var selections = $("#bootstrap-table").bootstrapTable("getSelections");
if(selections.length === 0){ let tipMsg = "确定导出当前所有数据吗?";
// $.modal.alertWarning("请至少选择一条bom信息"); if ($.common.isNotEmpty(ids)) {
// return; tipMsg = `确定导出 ${ids} 数据吗?`;
$.modal.confirm("确定导出所有制程检验吗?", function() { dataParam.push({ "name": "ids", "value": ids });
var currentId = $.common.isEmpty(formId) ? $('form').attr('id') : formId;
var params = $("#bootstrap-table").bootstrapTable('getOptions');
var dataParam = $("#" + currentId).serializeArray();
dataParam.push({ "name": "orderByColumn", "value": params.sortName });
dataParam.push({ "name": "isAsc", "value": params.sortOrder });
$.modal.loading("正在导出数据,请稍后...");
$.post(prefix + '/exportAll', dataParam, function(result) {
if (result.code == web_status.SUCCESS) {
window.location.href = ctx + "common/download?fileName=" + encodeURI(result.msg) + "&delete=" + true;
} else if (result.code == web_status.WARNING) {
$.modal.alertWarning(result.msg)
} else {
$.modal.alertError(result.msg);
}
$.modal.closeLoading();
});
});
}else {
//·拼接单号
for(let i=0;i<selections.length;i++){
checkoutData.push(selections[i].manufacturingCheckoutCode);
}
$.modal.confirm("确定导出" + checkoutData + "吗?", function () {
var checkouts = JSON.stringify(checkoutData);
// console.log(bomNos);
$.modal.loading("正在导出数据,请稍后...");
var config = {
url: prefix + '/export',
type: "post",
dataType: "json",
contentType: "application/json;charset=utf-8",
data: checkouts,
success: function(result) {
console.log(result);
window.location.href = ctx + "common/download?fileName=" + encodeURI(result.msg) + "&delete=" + true;
$.modal.alertSuccess("导出成功!")
$.modal.closeLoading();
},
error: function (result){
$.modal.alertError(result.msg);
}
};
$.ajax(config)
// $.operate.saveJson(prefix + "/export", bomNos);
});
} }
}; $.modal.confirm(tipMsg, function () {
$.modal.loading("正在导出数据,请稍后...");
$.post( prefix + "/export", dataParam, function (result) {
if (result.code === web_status.SUCCESS) {
window.location.href = ctx + "common/download?fileName="+ encodeURI(result.msg) + "&delete=" + true;
} else {
$.modal.alertError(result.msg);
}
$.modal.closeLoading();
});
});
}
function detail(manufacturingCheckoutCode){ function detail(manufacturingCheckoutCode){
var url = ctx +'quality/manufacturingCheckout/detail/'+manufacturingCheckoutCode; var url = ctx +'quality/manufacturingCheckout/detail/'+manufacturingCheckoutCode;
$.modal.open("制程检验详情",url); $.modal.open("制程检验详情",url);

23
ruoyi-admin/src/main/resources/templates/quality/manufacturingCheckout/materialSelect.html

@ -40,36 +40,49 @@
{ {
title: '料号', title: '料号',
field: 'materialNo', field: 'materialNo',
align: 'center',
}, },
{ {
title: '图片', title: '图片',
align: 'center',
field: 'materialPhotourl', field: 'materialPhotourl',
}, },
{ {
title: '物料名称', title: '物料名称',
align: 'center',
field: 'materialName', field: 'materialName',
}, },
{ {
title: '类型', title: '物料类型',
align: 'center',
field: 'materialType', field: 'materialType',
formatter: function(value, row, index) { formatter: function(value, row, index) {
return $.table.selectCategoryLabel(materialTypeDatas, value); return $.table.selectCategoryLabel(materialTypeDatas, value);
} }
}, },
{
title: '型号',
align: 'center',
field: 'materialModel',
},
{ {
title: '描述', title: '描述',
align: 'center',
field: 'materialDescribe', field: 'materialDescribe',
}, },
{ {
title: '品牌', title: '品牌',
align: 'center',
field: 'materialBrand', field: 'materialBrand',
}, },
{ {
title: '单位', title: '单位',
align: 'center',
field: 'materialUnit', field: 'materialUnit',
}, },
{ {
title: '加工方式', title: '加工方式',
align: 'center',
field: 'materialProcessMethod', field: 'materialProcessMethod',
formatter: function(value, row, index) { formatter: function(value, row, index) {
return $.table.selectDictLabel(processMethodDatas, value); return $.table.selectDictLabel(processMethodDatas, value);
@ -77,8 +90,14 @@
}, },
{ {
title: '订单数', title: '订单数',
align: 'center',
field: 'makeTotal' field: 'makeTotal'
} },
{
title: '已检验数',
align: 'center',
field: 'checkedNum'
},
] ]
}; };
$.table.init(options); $.table.init(options);

Loading…
Cancel
Save