This commit is contained in:
zty 2024-09-19 15:44:04 +08:00
commit b5190de25b
16 changed files with 992 additions and 314 deletions

View File

@ -200,4 +200,4 @@
}
</script>
</html>
</html>

File diff suppressed because one or more lines are too long

View File

@ -171,6 +171,7 @@
return oPromise
};
var _initPlugin = function (szContainerID) {
let oPromise = new Promise(function (resolve, reject) {
if (!m_utilsInc.isUndefined(szContainerID)) {
m_options.szContainerID = szContainerID
@ -598,6 +599,7 @@
}
;
this.I_Login = function (szIP, iProtocol, iPort, szUserName, szPassword, options) {
let oPromise = new Promise(function (resolve, reject) {
var szDeviceIdentify = szIP + "_" + iPort;
var iIndex = this.findDeviceIndexByIP(szDeviceIdentify);

View File

@ -1705,68 +1705,6 @@ const routes = [
},
component: "inm/warehouse",
},
{
name: "good",
path: "/inm/good",
meta: {
title: "成品库",
// icon: "el-icon-cellphone",
perms: ["good"],
},
children: [
{
name: "good",
path: "/inm/good",
meta: {
title: "成品库",
// icon: "el-icon-cellphone",
perms: ["good"],
},
component: "inm/good",
},
{
name: "good_mio",
path: "/inm/good_mio",
meta: {
title: "出入库记录",
// icon: "el-icon-cellphone",
perms: ["good_mio"],
},
component: "inm/good_mio",
},
],
},
{
name: "halfgood",
path: "/inm/halfgood",
meta: {
title: "半成品库",
// icon: "el-icon-cellphone",
perms: ["halfgood"],
},
children: [
{
name: "halfgood",
path: "/inm/halfgood",
meta: {
title: "半成品库",
// icon: "el-icon-cellphone",
perms: ["halfgood"],
},
component: "inm/halfgood",
},
{
name: "halfgood_mio",
path: "/inm/halfgood_mio",
meta: {
title: "出入库记录",
// icon: "el-icon-cellphone",
perms: ["halfgood_mio"],
},
component: "inm/halfgood_mio",
},
],
},
{
name: "mainso",
path: "/inm/mainso",
@ -1829,6 +1767,77 @@ const routes = [
},
],
},
{
name: "halfgood",
path: "/inm/halfgood",
meta: {
title: "半成品库",
// icon: "el-icon-cellphone",
perms: ["halfgood"],
},
children: [
{
name: "halfgood",
path: "/inm/halfgood",
meta: {
title: "半成品库",
// icon: "el-icon-cellphone",
perms: ["halfgood"],
},
component: "inm/halfgood",
},
{
name: "halfgood_mio",
path: "/inm/halfgood_mio",
meta: {
title: "出入库记录",
// icon: "el-icon-cellphone",
perms: ["halfgood_mio"],
},
component: "inm/halfgood_mio",
},
],
},
{
name: "good",
path: "/inm/good",
meta: {
title: "成品库",
// icon: "el-icon-cellphone",
perms: ["good"],
},
children: [
{
name: "good",
path: "/inm/good",
meta: {
title: "成品库",
// icon: "el-icon-cellphone",
perms: ["good"],
},
component: "inm/good",
},
{
name: "good_mio",
path: "/inm/good_mio",
meta: {
title: "出入库记录",
// icon: "el-icon-cellphone",
perms: ["good_mio"],
},
component: "inm/good_mio",
},
],
},
{
name: "inmScrap",
path: "/inm/inmScrap",
meta: {
title: "废品库",
perms: ["inmScrap"],
},
component: "inm/inmScrap",
},
// {
// "name": "materialbatch",
// "path": "/inm/materialbatch",
@ -1878,15 +1887,6 @@ const routes = [
},
component: "inm/workshop_mio",
},
{
name: "inmScrap",
path: "/inm/inmScrap",
meta: {
title: "废品库",
perms: ["inmScrap"],
},
component: "inm/inmScrap",
},
],
},
//采购 pum
@ -3303,6 +3303,17 @@ const routes = [
},
component: "statistics/task_rate_gx.vue",
},
//人员绩效统计——光芯
{
path: "/work_statistics",
name: "work_statistics",
meta: {
title: "人员生产统计",
icon: "el-icon-trend-charts",
perms: ["work_statistics"],
},
component: "statistics/work_statistics.vue",
},
//库存统计——光芯
{
path: "/statistic_inm",

View File

@ -223,10 +223,16 @@
</div>
<span>监控设备</span>
</div>
<div class="infoLine">
<span :class="['circles', {'circles_1':eqk.running_state==10}]"></span>
<span>{{ eqk.name }}</span>
<div class="infoLine">
<span class="circles"></span>
<span>{{ eqj.name }}</span>
</div>
<el-row class="infoLine">
<el-col :span="12">
<div id="divPlugin" class="plugin"></div>
</el-col>
</el-row>
</div>
</div>
</el-aside>
@ -348,8 +354,9 @@ export default {
eqs: {},//
eqc: {},//
eqz: {},//
eqk: {},//
eqj: {},//
resizeTimeout:null,
}
},
mounted() {
@ -382,6 +389,24 @@ export default {
this.$emit('close')
},
handleClick() {
//退
//退
WebVideoCtrl.I_Stop({
success: function () {
console.log("停止预览成功!");
},
error: function (oError) {
console.log("停止预览失败!")
}
}).then(()=>{
//退
WebVideoCtrl.I_Logout(this.ip).then(() => {
console.log(this.ip + " " + "退出成功!");
WebVideoCtrl.I_DestroyPlugin();//
}, () => {
console.log(this.ip + " " + "退出失败!");
});
});
this.pfkdetail = false;
this.detailItem = {};
},
@ -389,6 +414,7 @@ export default {
this.pfkdetail = true;
this.detailItem = row;
this.$nextTick(() => {
this.init()
this.getEquipments(row.equipments);
})
@ -404,7 +430,11 @@ export default {
that.eqc = res;
} else if (res.type == 30) {
that.eqz = res;
}
}else if (res.type == 50) { //
that.eqj = res;
this.ip = res.ip;
this.login();
}
}))
});
const promise = Promise.all(reqs);
@ -492,12 +522,68 @@ export default {
that.resizeChart("dataChart");
that.resizeChart("dataChart2");
that.resizeChart("dataChart3");
}, 300);
}, 300);
},
//
//
init() {
WebVideoCtrl.I_InsertOBJECTPlugin("divPlugin");
WebVideoCtrl.I_InitPlugin("divPlugin", "100%", "100%", {
iWndowType: 2, //N*N
bWndFull: true, //
cbInitPluginCompleted: function () {
WebVideoCtrl.I_InsertOBJECTPlugin("divPlugin").then(() => {
//
WebVideoCtrl.I_CheckPluginVersion().then((bFlag) => {
if (bFlag) {
alert("检测到新的插件版本双击开发包目录里的HCWebSDKPlugin.exe升级");
}
});
}, () => {
alert("插件初始化失败请确认是否已安装插件如果未安装请双击开发包目录里的HCWebSDKPlugin.exe安装");
});
},
});
},
//
login(){
WebVideoCtrl.I_Login(
this.eqj.ip,
1,
this.eqj.port,
this.eqj.login_name,
this.eqj.login_pwd,
{
async: true,
cgi: 1,
success: (xmlDoc) => {
console.log("登录成功", xmlDoc);
//
WebVideoCtrl.I_StartRealPlay(this.eqj.ip + "_" + this.eqj.port, {
success: () => {
console.log("预览成功");
},
});
},
error: (xmlDoc) => {
console.log("登录失败", xmlDoc);
},
}
);
}
}
}
</script>
<style>
/*监控设备样式*/
.plugin {
width: 200px;
height: 200px;
/* background: #ffffff; */
border: 2px solid rgba(237, 159, 23, 0.8);
}
.tableBg {
width: 100%;
height: 88vh;
@ -661,4 +747,4 @@ export default {
font-size:40px;
margin:4px;
}
</style>
</style>

View File

@ -329,12 +329,13 @@ export default {
yAxis: {},
series: [{ type: 'line' }]
},
}
},
mounted() {
let that = this;
that.init();
},
mounted() {
},
methods: {
initDom() {
var chart1 = echarts.init(document.getElementById('dataChart'), 'dark');
@ -359,12 +360,16 @@ export default {
this.$refs.table.queryData(this.query);
},
rowClick(row) {
this.pollutantDetail = true;
this.detailItem = row;
this.$nextTick(() => {
this.init();
this.getEquipments(row.equipments);
this.initTimeNow();
this.initDom();
})
},
getEquipments(ids) {
@ -384,9 +389,11 @@ export default {
that.getDetailData(3, id);
}
else if (res.type == 50) { //
debugger;
this.login(res);//
that.eqj = res;
this.ip = res.ip;
this.login();
}
})
});
@ -444,55 +451,70 @@ export default {
// }
})
},
handleClick() {
this.pollutantDetail = false;
handleClick() {
//退
//退
WebVideoCtrl.I_Stop({
success: function () {
console.log("停止预览成功!");
},
error: function (oError) {
console.log("停止预览失败!")
}
}).then(()=>{
//退
WebVideoCtrl.I_Logout(this.ip).then(() => {
console.log(this.ip + " " + "退出成功!");
WebVideoCtrl.I_DestroyPlugin();//
}, () => {
console.log(this.ip + " " + "退出失败!");
});
});
this.pollutantDetail = false;
this.detailItem = {};
},
//
//
init() {
WebVideoCtrl.I_InsertOBJECTPlugin("divPlugin");
//
alert(1)
WebVideoCtrl.I_InitPlugin("divPlugin", 200, 200, {
WebVideoCtrl.I_InitPlugin("divPlugin", "100%", "100%", {
iWndowType: 2, //N*N
bWndFull: true, //
cbInitPluginCompleted: function () {
alert(1)
WebVideoCtrl.I_InsertOBJECTPlugin("divPlugin").then(() => {
WebVideoCtrl.I_InsertOBJECTPlugin("divPlugin").then(() => {
//
WebVideoCtrl.I_CheckPluginVersion().then((bFlag) => {
if (bFlag) {
alert("检测到新的插件版本双击开发包目录里的HCWebSDKPlugin.exe升级");
}
});
}, () => {
alert("插件初始化失败请确认是否已安装插件如果未安装请双击开发包目录里的HCWebSDKPlugin.exe安装");
});
},
});
},
}, () => {
alert("插件初始化失败请确认是否已安装插件如果未安装请双击开发包目录里的HCWebSDKPlugin.exe安装");
});
},
});
},
//
login(jkdata){
login(){
WebVideoCtrl.I_Login(
jkdata.ip,
this.eqj.ip,
1,
jkdata.port,
jkdata.login_name,
jkdata.login_pwd,
this.eqj.port,
this.eqj.login_name,
this.eqj.login_pwd,
{
async: true,
cgi: 1,
success: (xmlDoc) => {
console.log("登录成功", xmlDoc);
//
WebVideoCtrl.I_StartRealPlay(szIp + "_" + ipPort, {
WebVideoCtrl.I_StartRealPlay(this.eqj.ip + "_" + this.eqj.port, {
success: () => {
console.log("预览成功");
},
@ -503,8 +525,7 @@ export default {
},
}
);
}
}
}
}
</script>
@ -513,5 +534,6 @@ export default {
width: 200px;
height: 200px;
/* background: #ffffff; */
border: 2px solid rgba(237, 159, 23, 0.8);
}
</style>

View File

@ -1,26 +1,96 @@
<template>
<el-container>
<el-aside width="20%">
<div class="leftDiv">
<el-divider content-position="left">登录预览</el-divider>
<el-row type="flex" class="row-bg" justify="space-around">
<el-col :span="10">
<div class="grid-content bg-purple-light">
<el-button @click="Login" type="text">登录</el-button>
</div>
</el-col>
<el-col :span="10">
<div class="grid-content bg-purple-light">
<el-button @click="logOut" type="text">登出设备</el-button>
</div>
</el-col>
</el-row>
<el-row type="flex" class="row-bg" justify="space-around">
<el-col :span="10">
<div class="grid-content bg-purple-light">
<el-button @click="vShow" type="text">预览</el-button>
</div>
</el-col>
<el-col :span="10">
<div class="grid-content bg-purple-light">
<el-button @click="stopShow" type="text">停止预览</el-button>
</div>
</el-col>
</el-row>
<el-row type="flex" class="row-bg" justify="space-around">
<el-col :span="10">
<div class="grid-content bg-purple-light">
<el-button @click="breakdom" type="text">销毁设备</el-button>
</div>
</el-col>
<el-col :span="10">
<div class="grid-content bg-purple-light">
<el-button @click="init" type="text">初始化设备</el-button>
</div>
</el-col>
</el-row>
<el-row type="flex" class="row-bg" justify="space-around">
<el-col :span="10">
<div class="grid-content bg-purple-light">
<el-button @click="clickOpenSound" type="text">打开声音</el-button>
</div>
</el-col>
<el-col :span="10">
<div class="grid-content bg-purple-light">
<el-button @click="clickCloseSound" type="text">关闭声音</el-button>
</div>
</el-col>
</el-row>
<el-row type="flex" class="row-bg" justify="space-around">
<el-col >
<div class="grid-content bg-purple-light">
<el-row>
<el-col :span="12">
<el-button disabled type="text">窗口分割数</el-button>
</el-col>
<el-col :span="12" >
<el-select v-model="video_value" placeholder="请选择" @change="changeWndNum()" style="width:80%;">
<el-option v-for="item in options"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
</el-col>
</el-row>
</div>
</el-col>
</el-row>
</div>
</el-aside>
<el-main>
<div class="about">
<div id="divPlugin" class="plugin"></div>
<div style="margin-top: 30px;">
<el-button @click="Login" type="primary">登录</el-button>
<el-button @click="vShow" type="primary">预览</el-button>
<el-button @click="stopShow" type="warning">停止预览</el-button>
<el-button @click="logOut" type="warning">登出设备</el-button>
<el-button @click="breakdom" type="warning">销毁设备</el-button>
<el-button @click="init" type="warning">初始化设备</el-button>
<el-select v-model="video_value" placeholder="请选择" @change="changeWndNum()">
<el-option v-for="item in options"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
</div>
</div>
<div id="divPlugin" class="plugin"></div>
</el-main>
</el-container>
</template>
@ -53,19 +123,22 @@ export default {
value: 4,
label: '4x4'
}
]
],
};
},
mounted() {
let that = this;
that.init();
},
methods: {
//
init() {
// alert('init')
WebVideoCtrl.I_InsertOBJECTPlugin("divPlugin");
WebVideoCtrl.I_InitPlugin("divPlugin", 600, 600, {
WebVideoCtrl.I_InitPlugin("divPlugin", "100%", "100%", {
iWndowType: 2, //N*N
bWndFull: true, //
cbInitPluginCompleted: function () {
@ -82,6 +155,7 @@ export default {
});
},
});
},
//
Login() {
@ -95,10 +169,26 @@ export default {
async: true,
cgi: 1,
success: (xmlDoc) => {
console.log("登录成功", xmlDoc);
//TODO
this.getChannelInfo();
this.$message({
showClose: true,
message: '登录成功!',
type: 'success'
});
},
error: (xmlDoc) => {
console.log("登录失败", xmlDoc);
this.$message({
showClose: true,
message: '登录失败!',
type: 'error'
});
},
}
);
@ -107,8 +197,20 @@ export default {
vShow() {
WebVideoCtrl.I_StartRealPlay(this.szIp + "_" + this.ipPort, {
success: () => {
console.log("预览成功");
},
this.$message({
showClose: true,
message: '预览成功!',
type: 'success'
});
},error: () => {
this.$message({
showClose: true,
message: '预览失败!',
type: 'error'
});
},
});
@ -122,10 +224,19 @@ export default {
if (oWndInfo != null) {
WebVideoCtrl.I_Stop({
success: function () {
console.log("停止预览成功!")
this.$message({
showClose: true,
message: '停止预览成功!',
type: 'success'
});
},
error: function (oError) {
console.log("停止预览失败!")
this.$message({
showClose: true,
message: '停止预览失败!',
type: 'error'
});
}
});
}
@ -137,6 +248,7 @@ export default {
},
//
logOut() {
//WebVideoCtrl.I_Logout(this.szIp + "_" + this.ipPort, {});
var szDeviceIdentify =this.szIp;
@ -144,14 +256,35 @@ export default {
return;
}
WebVideoCtrl.I_Logout(szDeviceIdentify).then(() => {
console.log(szDeviceIdentify + " " + "退出成功!");
this.$message({
showClose: true,
message: '退出成功!',
type: 'success'
});
}, () => {
console.log(szDeviceIdentify + " " + "退出失败!");
this.$message({
showClose: true,
message: '退出成功!',
type: 'error'
});
});
},
//
breakdom() {
WebVideoCtrl.I_DestroyPlugin();
WebVideoCtrl.I_DestroyPlugin().then(() => {
this.$message({
showClose: true,
message: '插件已销毁!',
type: 'success'
});
}, () => {
this.$message({
showClose: true,
message: '插件销毁失败!',
type: 'error'
});
});
},
//
@ -173,14 +306,103 @@ export default {
console.log(szInfo, oError.errorCode, oError.errorMsg);
});
}
}
},
//
clickOpenSound() {
var oWndInfo = WebVideoCtrl.I_GetWindowStatus(0),
szInfo = "";
if (oWndInfo != null) {
var allWndInfo = WebVideoCtrl.I_GetWindowStatus();
//
for (var i = 0, iLen = allWndInfo.length; i < iLen; i++) {
oWndInfo = allWndInfo[i];
if (oWndInfo.bSound) {
WebVideoCtrl.I_CloseSound(oWndInfo.iIndex);
break;
}
}
WebVideoCtrl.I_OpenSound().then(() => {
console.log(oWndInfo.szDeviceIdentify + " " + "打开声音成功!");
}, (oError) => {
var szInfo = " 打开声音失败!";
console.log(oWndInfo.szDeviceIdentify + szInfo, oError.errorCode, oError.errorMsg);
});
}
},
//
clickCloseSound() {
var oWndInfo = WebVideoCtrl.I_GetWindowStatus(0),
szInfo = "";
if (oWndInfo != null) {
WebVideoCtrl.I_CloseSound().then(() => {
console.log(oWndInfo.szDeviceIdentify + " " + "关闭声音成功!");
}, (oError) => {
var szInfo = " 关闭声音失败!";
console.log(oWndInfo.szDeviceIdentify + szInfo, oError.errorCode, oError.errorMsg);
});
}
},
},
};
</script>
<style scoped>
.plugin {
width: 600px;
height: 600px;
/* background: #ffffff; */
width:100%;
height:100%;
border: 2px solid rgb(45 188 51);
}
.leftDiv{
margin-top:10px;
width:95%
}
.el-row {
margin-bottom: 8px;
&:last-child {
margin-bottom: 0;
}
text-align:center;
}
.el-col {
border-radius: 4px;
}
.bg-purple-dark {
background: #99a8bf;
}
.bg-purple {
background: #1ab5cd;
}
.bg-purple-light {
background: #25a1ad;
}
.grid-content {
border-radius: 4px;
min-height: 36px;
}
.row-bg {
padding: 10px 0;
}
.row-bg .el-button{
border:none
}
.bg-purple-left {
background: #25a1ad;
width:80%;
}
.bg-purple-center {
background: #25a1ad;
width:80%;
}
.bg-purple-right {
background: #25a1ad;
width:80%;
}
.yuntai .el-button{
border:none
}
</style>

View File

@ -624,6 +624,8 @@ export default {
setData(data) {
Object.assign(this.form, data);
this.formCount = this.form.count;
this.form.count_notok = data.count_notok;
this.count_notok_json = data.count_notok_json;
},
//
setFilters(filters) {

View File

@ -2,6 +2,39 @@
<el-container>
<el-header>
<div class="right-panel">
<!-- 检验类型 -->
<el-select v-model="query.process_name"
placeholder="检验类型">
<el-option
v-for="item in options"
:key="item.value"
:label="item.name"
:value="item.value"
>
</el-option>
</el-select>
<!-- 检验人 -->
<!-- <el-select v-model="query.test_user"
placeholder="检验人">
<el-option
v-for="item in userOptions"
:key="item.id"
:label="item.name"
:value="item.id"
>
</el-option>
</el-select>
<el-select v-model="query.shift"
placeholder="班次">
<el-option
v-for="item in shiftOptions"
:key="item.id"
:label="item.name"
:value="item.id"
>
</el-option>
</el-select> -->
<el-date-picker
v-model="query.start_date"
type="date"
@ -18,8 +51,13 @@
</div>
<el-button @click="handleExport" type="primary">导出</el-button>
</el-header>
<el-main style="background: #ffffff">
<scTable :data="tableData" id="exportDiv">
<el-main class="nopadding">
<scTable
:data="tableData"
id="exportDiv"
stripe
hideDo
hidePagination>
<el-table-column type="index" width="50" />
<el-table-column label="物料名称" prop="物料名"></el-table-column>
<el-table-column label="规格" prop="规格"> </el-table-column>
@ -32,7 +70,7 @@
</el-table-column>
<el-table-column label="检验数" prop="检验数"></el-table-column>
<el-table-column label="合格数" prop="合格数量"></el-table-column>
<el-table-column label="不合格数" align="center">
<el-table-column label="不合格数" align="center" v-if="query.process_name == '一次超洗'">
<el-table-column label="黑圈内径" prop="黑圈内径"></el-table-column>
<el-table-column label="黑圈内径圆度" prop="黑圈内径圆度"></el-table-column>
<el-table-column label="黑圈外径" prop="黑圈外径"></el-table-column>
@ -43,6 +81,9 @@
<el-table-column label="厚度" prop="厚度"></el-table-column>
<el-table-column label="准合格" prop="准合格"></el-table-column>
<el-table-column label="圆准" prop="圆准"></el-table-column>
<el-table-column label="合计" prop="不合格数"></el-table-column>
</el-table-column>
<el-table-column label="不合格数" align="center" v-else>
<el-table-column label="脏" prop="脏"></el-table-column>
<el-table-column label="气泡" prop="气泡"></el-table-column>
<el-table-column label="水纹" prop="水纹"></el-table-column>
@ -61,7 +102,6 @@
</el-main>
</el-container>
</template>
<script>
export default {
name: "chart",
@ -69,12 +109,25 @@ export default {
data() {
return {
query:{
start_date:'',
fw_type:'prod',
end_date:'',
fw_type:'prod'
start_date:'',
process_name:'一次超洗',
group_by_dept: ", dept.id",
group_by_user: ", suser.id",
group_by_shift: ", shift.id",
select_col_dept: ", dept.name as 部门",
select_col_user: ", suser.name as 检验人",
select_col_shift: ", shift.name as 班次"
},
currentDate: "",
tableData: [],
options:[
{name:'外观',value:'一次超洗'},
{name:'尺寸',value:'二次超洗'}
],
userOptions:[],
shiftOptions:[],
};
},
mounted() {
@ -88,8 +141,22 @@ export default {
let queryDate = year + "-" + month + "-" + day;
that.query.start_date = that.query.end_date = that.currentDate = queryDate;
this.getData();
this.getUsers();
this.getShifts();
},
methods: {
getUsers(){
let that = this;
this.$API.system.user.list.req({ page: 0, posts__code__contains: "check" }).then((res) => {
that.userOptions = res;
});
},
getShifts(){
let that = this;
that.$API.mtm.shift.list.req({ page: 0 }).then((res) => {
that.shiftOptions = res;
});
},
getData() {
let that = this;
let obj = {};

View File

@ -125,6 +125,8 @@
</el-table-column>
<el-table-column label="合格数" prop="合格数">
</el-table-column>
<el-table-column label="前道不良" prop="加工前不良">
</el-table-column>
<el-table-column label="不合格数" align="center">
<el-table-column label="线痕" prop="线痕"></el-table-column>
<el-table-column label="破损" prop="破损"></el-table-column>
@ -183,6 +185,8 @@
</el-table-column>
<el-table-column label="合格数" prop="合格数">
</el-table-column>
<el-table-column label="前道不良" prop="加工前不良">
</el-table-column>
<el-table-column label="不合格数" align="center">
<el-table-column label="线痕" prop="线痕"></el-table-column>
<el-table-column label="破损" prop="破损"></el-table-column>
@ -241,6 +245,8 @@
</el-table-column>
<el-table-column label="合格数" prop="合格数">
</el-table-column>
<el-table-column label="前道不良" prop="加工前不良">
</el-table-column>
<el-table-column label="不合格数" align="center">
<el-table-column label="线痕" prop="线痕"></el-table-column>
<el-table-column label="破损" prop="破损"></el-table-column>
@ -299,6 +305,8 @@
</el-table-column>
<el-table-column label="合格数" prop="合格数">
</el-table-column>
<el-table-column label="前道不良" prop="加工前不良">
</el-table-column>
<el-table-column label="不合格数" align="center">
<el-table-column label="线痕" prop="线痕"></el-table-column>
<el-table-column label="破损" prop="破损"></el-table-column>
@ -357,6 +365,8 @@
</el-table-column>
<el-table-column label="合格数" prop="合格数">
</el-table-column>
<el-table-column label="前道不良" prop="加工前不良">
</el-table-column>
<el-table-column label="不合格数" align="center">
<el-table-column label="线痕" prop="线痕"></el-table-column>
<el-table-column label="破损" prop="破损"></el-table-column>
@ -415,6 +425,8 @@
</el-table-column>
<el-table-column label="合格数" prop="合格数">
</el-table-column>
<el-table-column label="前道不良" prop="加工前不良">
</el-table-column>
<el-table-column label="不合格数" align="center">
<el-table-column label="线痕" prop="线痕"></el-table-column>
<el-table-column label="破损" prop="破损"></el-table-column>
@ -473,6 +485,8 @@
</el-table-column>
<el-table-column label="合格数" prop="合格数">
</el-table-column>
<el-table-column label="前道不良" prop="加工前不良">
</el-table-column>
<el-table-column label="不合格数" align="center">
<el-table-column label="线痕" prop="线痕"></el-table-column>
<el-table-column label="破损" prop="破损"></el-table-column>
@ -531,6 +545,8 @@
</el-table-column>
<el-table-column label="合格数" prop="合格数">
</el-table-column>
<el-table-column label="前道不良" prop="加工前不良">
</el-table-column>
<el-table-column label="不合格数" align="center">
<el-table-column label="线痕" prop="线痕"></el-table-column>
<el-table-column label="破损" prop="破损"></el-table-column>
@ -589,6 +605,8 @@
</el-table-column>
<el-table-column label="合格数" prop="合格数">
</el-table-column>
<el-table-column label="前道不良" prop="加工前不良">
</el-table-column>
<el-table-column label="不合格数" align="center">
<el-table-column label="线痕" prop="线痕"></el-table-column>
<el-table-column label="破损" prop="破损"></el-table-column>
@ -647,6 +665,8 @@
</el-table-column>
<el-table-column label="合格数" prop="合格数">
</el-table-column>
<el-table-column label="前道不良" prop="加工前不良">
</el-table-column>
<el-table-column label="不合格数" align="center">
<el-table-column label="线痕" prop="线痕"></el-table-column>
<el-table-column label="破损" prop="破损"></el-table-column>
@ -705,6 +725,8 @@
</el-table-column>
<el-table-column label="合格数" prop="合格数">
</el-table-column>
<el-table-column label="前道不良" prop="加工前不良">
</el-table-column>
<el-table-column label="不合格数" align="center">
<el-table-column label="线痕" prop="线痕"></el-table-column>
<el-table-column label="破损" prop="破损"></el-table-column>
@ -763,6 +785,8 @@
</el-table-column>
<el-table-column label="合格数" prop="合格数">
</el-table-column>
<el-table-column label="前道不良" prop="加工前不良">
</el-table-column>
<el-table-column label="不合格数" align="center">
<el-table-column label="线痕" prop="线痕"></el-table-column>
<el-table-column label="破损" prop="破损"></el-table-column>
@ -821,6 +845,8 @@
</el-table-column>
<el-table-column label="合格数" prop="合格数">
</el-table-column>
<el-table-column label="前道不良" prop="加工前不良">
</el-table-column>
<el-table-column label="不合格数" align="center">
<el-table-column label="线痕" prop="线痕"></el-table-column>
<el-table-column label="破损" prop="破损"></el-table-column>
@ -879,6 +905,8 @@
</el-table-column>
<el-table-column label="合格数" prop="合格数">
</el-table-column>
<el-table-column label="前道不良" prop="加工前不良">
</el-table-column>
<el-table-column label="不合格数" align="center">
<el-table-column label="线痕" prop="线痕"></el-table-column>
<el-table-column label="破损" prop="破损"></el-table-column>
@ -937,6 +965,8 @@
</el-table-column>
<el-table-column label="合格数" prop="合格数">
</el-table-column>
<el-table-column label="前道不良" prop="加工前不良">
</el-table-column>
<el-table-column label="不合格数" align="center">
<el-table-column label="线痕" prop="线痕"></el-table-column>
<el-table-column label="破损" prop="破损"></el-table-column>

View File

@ -2,14 +2,27 @@
<el-container>
<el-header>
<div class="right-panel">
<el-select v-model="query.process_name"
style="width: 200px"
placeholder="请选择工序">
<el-option
v-for="item in options"
:key="item.name"
:label="item.name"
:value="item.name"
>
</el-option>
</el-select>
<el-date-picker
v-model="query.start_date"
type="date"
placeholder="查询日期"
value-format="YYYY-MM-DD"
style="width: 160px"
style="width: 200px"
>
</el-date-picker>
<el-input v-model="query.m_s"
placeholder="物料名称" clearable style="width:200px"></el-input>
<el-button
type="primary"
icon="el-icon-search"
@ -18,8 +31,13 @@
</div>
<el-button @click="handleExport" type="primary">导出</el-button>
</el-header>
<el-main style="background: #ffffff">
<scTable :data="tableData" id="exportDiv">
<el-main>
<scTable
:data="tableData"
id="exportDiv"
stripe
hideDo
hidePagination>
<el-table-column type="index" width="50" />
<el-table-column label="物料名称" prop="物料名"></el-table-column>
<el-table-column label="规格" prop="规格"> </el-table-column>
@ -33,28 +51,16 @@
<el-table-column label="检验数" prop="检验数"></el-table-column>
<el-table-column label="合格数" prop="合格数"></el-table-column>
<el-table-column label="不合格数" align="center">
<el-table-column label="黑圈内径" prop="黑圈内径"></el-table-column>
<el-table-column label="黑圈内径圆度" prop="黑圈内径圆度"></el-table-column>
<el-table-column label="黑圈外径" prop="黑圈外径"></el-table-column>
<el-table-column label="黑圈外径圆度" prop="黑圈外径圆度"></el-table-column>
<el-table-column label="产品外径" prop="产品外径"></el-table-column>
<el-table-column label="产品圆度" prop="产品圆度"></el-table-column>
<el-table-column label="产品同心度" prop="产品同心度"></el-table-column>
<el-table-column label="厚度" prop="厚度"></el-table-column>
<el-table-column label="准合格" prop="准合格"></el-table-column>
<el-table-column label="圆准" prop="圆准"></el-table-column>
<el-table-column label="脏" prop="脏"></el-table-column>
<el-table-column label="划伤" prop="划伤"></el-table-column>
<el-table-column label="气泡" prop="气泡"></el-table-column>
<el-table-column label="水纹" prop="水纹"></el-table-column>
<el-table-column label="崩边" prop="崩边"></el-table-column>
<el-table-column label="棕边" prop="棕边"></el-table-column>
<el-table-column label="棕圈" prop="棕圈"></el-table-column>
<el-table-column label="划伤" prop="划伤"></el-table-column>
<el-table-column label="雾面" prop="雾面"></el-table-column>
<el-table-column label="小崩边" prop="小崩边"></el-table-column>
<el-table-column label="麻点" prop="麻点"></el-table-column>
<el-table-column label="黑圈变形" prop="黑圈变形"></el-table-column>
<el-table-column label="倒角" prop="倒角"></el-table-column>
<el-table-column label="线痕" prop="线痕"></el-table-column>
<el-table-column label="破损" prop="破损"></el-table-column>
<el-table-column label="蓝圈" prop="蓝圈"></el-table-column>
<el-table-column label="其他" prop="其他"></el-table-column>
<el-table-column label="合计" prop="不合格数"></el-table-column>
</el-table-column>
</scTable>
@ -69,12 +75,21 @@ export default {
data() {
return {
query:{
start_date:'',
m_s:'',
fw_type:'process',
end_date:'',
fw_type:'process'
start_date:'',
process_name:'',
group_by_dept: ", dept.id",
group_by_user: ", suser.id",
group_by_shift: ", shift.id",
select_col_dept: ", dept.name as 部门",
select_col_user: ", suser.name as 检验人",
select_col_shift: ", shift.name as 班次"
},
currentDate: "",
tableData: [],
options:[],
};
},
mounted() {
@ -87,14 +102,21 @@ export default {
day = day < 10 ? "0" + day : day;
let queryDate = year + "-" + month + "-" + day;
that.query.start_date = that.query.end_date = that.currentDate = queryDate;
this.getProcess();
this.getData();
},
methods: {
getProcess(){
let that = this;
that.$API.mtm.process.list.req({ page: 0}).then((res) => {
that.options = res;
});
},
getData() {
let that = this;
let obj = {};
obj.query = that.query;
that.tableData =[];
that.$API.bi.dataset.exec.req('ftestDay', obj).then((res) => {
that.tableData = res.data2.ds0;
console.log(that.tableData);

View File

@ -2,12 +2,25 @@
<el-container>
<el-header>
<div class="right-panel">
<el-select v-model="material__name">
<el-select v-model="searchType" style="width: 200px" @change="searchTypeChange">
<el-option label="原料批次号" value="batch"></el-option>
<el-option label="物料名称" value="material"></el-option>
</el-select>
<el-input
v-if="searchType === 'batch'"
v-model="query.batch" placeholder="物料批次"
clearable style="width:200px"
></el-input>
<el-select v-else
v-model="query.m_name"
style="width: 200px"
@change="materialChange"
placeholder="请选择物料">
<el-option
v-for="item in options"
:key="item"
:label="item"
:value="item"
:key="item.id"
:label="item.name"
:value="item.name"
>
</el-option>
</el-select>
@ -16,76 +29,78 @@
icon="el-icon-search"
@click="handleQuery"
></el-button>
<el-button
@click="handleExport"
class="tables"
type="primary"
>导出</el-button
>
</div>
</el-header>
<el-main id="elMain">
<el-row :gutter="10" id="elCol">
<el-col :lg="12">
<el-card shadow="never">
<div id="bachart1"></div>
<!-- <scEcharts height="500px" :option="option"></scEcharts> -->
</el-card>
</el-col>
<el-col :lg="12">
<el-card shadow="never" style="position: relative">
<el-button
@click="handleExport"
class="tables"
type="primary"
>导出</el-button
>
<el-table
:data="tableData1"
id="exportDiv7"
:height="tableHeight"
>
<el-table-column type="index" width="50" />
<el-table-column
label="任务编号"
prop="number"
min-width="100px"
>
</el-table-column>
<el-table-column label="计划数" prop="count">
</el-table-column>
<el-table-column label="完成数" prop="count_ok">
</el-table-column>
<el-table-column label="完成率" prop="rate">
</el-table-column>
</el-table>
</el-card>
</el-col>
</el-row>
<el-main class="nopadding">
<scTable
:data="tableData"
id="exportDiv"
stripe
hideDo
hidePagination
>
<el-table-column type="index" width="50" />
<el-table-column label="部门" prop="部门">
</el-table-column>
<el-table-column label="工段" prop="工段">
</el-table-column>
<el-table-column label="原料数" prop="原料数">
</el-table-column>
<el-table-column label="待加工原料数" prop="待加工原料数">
</el-table-column>
<el-table-column label="非本段产物数" prop="非本段产物数">
</el-table-column>
<el-table-column label="待加工产物数" prop="待加工产物数">
</el-table-column>
<el-table-column label="加工中原料数" prop="加工中原料数">
</el-table-column>
<el-table-column label="加工中产物数" prop="加工中产物数">
</el-table-column>
<el-table-column label="合格品数" prop="合格品数">
</el-table-column>
<el-table-column label="不合格品数" prop="不合格品数">
</el-table-column>
<el-table-column label="返工品数" prop="返工品数">
</el-table-column>
<el-table-column label="检验数" prop="检验数">
</el-table-column>
<el-table-column label="废品数" prop="废品数">
</el-table-column>
<el-table-column label="仓库原料数" prop="仓库原料数">
</el-table-column>
<el-table-column label="仓库合格品数" prop="仓库合格品数">
</el-table-column>
<el-table-column label="仓库合格成品数" prop="仓库合格成品数">
</el-table-column>
</scTable>
</el-main>
</el-container>
</template>
<script>
import * as echarts from "echarts";
import T from "@/components/scEcharts/echarts-theme-T.js";
echarts.registerTheme("T", T);
import scEcharts from "@/components/scEcharts";
function deepCopy(obj) {
return JSON.parse(JSON.stringify(obj));
}
export default {
name: "chart",
components: {
scEcharts,
},
data() {
return {
currentYear:'',
currentMonth:'',
start_date:'',
end_date:'',
queryDate:'',
option:{},
seriesData1:[],
seriesData2:[],
seriesData3:[],
material__name:'',
options:['白片','DDG片','一次抛','外协海富'],
query: {
batch: "",
m_name: "",
m_model: "",
m_specification: ""
},
searchType:'batch',
options:[],
tableData:[],
basicOption: {
backgroundColor: "transparent",
title: {
@ -132,77 +147,49 @@ export default {
};
},
mounted() {
let that = this;
let that = this;
that.getOptions();
that.getInmMaterial();
},
methods: {
getOptions(){
let that = this;
let obj = {};
obj.page = 0;
obj.type__in = "10,20";
obj.is_hidden = false;
that.options = [];
that.$API.mtm.material.list.req(obj).then((res) => {
if(res.length>0){
that.options = res;
}
});
},
getInmMaterial(){
let that = this;
let obj = {
name__contains:that.material__name,
page:0
};
this.$API.mtm.material.list.req(obj).then(res=>{
console.log('InmMaterial',res);
that.getWmaterial();
if(res.length>0){
res.forEach(item => {
that.seriesData3[0]+=item.count;
});
let obj = {};
obj.query = that.query;
that.tableData =[];
that.$API.bi.dataset.exec.req('batch_search', obj).then((res) => {
if(res.data2.ds0){
that.tableData = res.data2.ds0;
}
})
});
},
getWmaterial(){
searchTypeChange(){
this.query.batch = '';
this.query.m_name = '';
this.query.m_model = '';
this.query.m_specification = '';
},
materialChange(val){
let that = this;
let obj = {
material__name__contains:that.material__name,
page:0
};
this.$API.wpm.wmaterial.list.req(obj).then(res=>{
console.log('Wmaterial',res);
if(res.length>0){
res.forEach(item => {
if(item.belong_dept_name=="扫边车间"){
if(item.count_xtest==null){
seriesData3[1]+=item.count;
}else{
seriesData1[1]+=item.count;
}
}else if(item.belong_dept_name=="黑化车间"){
if(item.count_xtest==null){
seriesData3[2]+=item.count;
}else{
seriesData1[2]+=item.count;
}
}else if(item.belong_dept_name=="减薄车间"){
if(item.count_xtest==null){
seriesData3[3]+=item.count;
}else{
seriesData1[3]+=item.count;
}
}else if(item.belong_dept_name=="精雕车间"){
if(item.count_xtest==null){
seriesData3[4]+=item.count;
}else{
seriesData1[4]+=item.count;
}
}else if(item.belong_dept_name=="倒角车间"){
if(item.count_xtest==null){
seriesData3[5]+=item.count;
}else{
seriesData1[5]+=item.count;
}
}else if(item.belong_dept_name=="磨抛车间"){
if(item.count_xtest==null){
seriesData3[6]+=item.count;
}else{
seriesData1[6]+=item.count;
}
}
});
console.log(val);
that.options.forEach((item) => {
if (item.name == val) {
that.query.m_model = item.model;
that.query.m_specification = item.specification;
}
let option = deepCopy(that.basicOption);
that.setChart("bachart1", option);
})
},
handleQuery(){
@ -234,9 +221,7 @@ export default {
width: 100%;
height: 500px;
}
.tables{
width:
}
.tableHead {
background:rgb(0,176,240);
height:40px;

View File

@ -637,13 +637,18 @@ export default {
that.query.start_date = that.query.querys[0][0].value = first.toISOString().split('T')[0];
that.query.end_date = that.query.querys[1][0].value = last.toISOString().split('T')[0];
that.options.forEach((item,index)=>{
that.getData(item.id,item.name,index);
console.log('item',item);
setTimeout(()=>{
that.getData(item.id,item.name,index);
},500)
})
},
getMgroup(){
let that = this;
that.options = [];
that.$API.mtm.mgroup.list.req({ page: 0}).then((res) => {
// that.options = res.slice(21);
that.options = res;
let nowDate = new Date();
that.getWeekDate(nowDate);
@ -669,18 +674,19 @@ export default {
getData(mgroup_id,mgroup_name,mgroup_index) {
let that = this;
that.tableData1 = [];
that.query.querys[0][1].value = null;
that.query.querys[1][1].value = null;
let option = deepCopy(that.basicOption);
option.title.text = mgroup_name+"任务进度";
option.series.data[0].value = 0;
option.series.data[1].value = 0;
that.query.querys[0][1].value = mgroup_id;
that.query.querys[1][1].value = mgroup_id;
that.$API.pm.mtask.cquery.req(that.query).then((res) => {
let names = 'tableData'+mgroup_index;
that[names] = res;
console.log('names',names);
console.log('that[names]',that[names]);
// console.log('names',names);
// console.log('that[names]',that[names]);
let count_jh = 0,count_ok = 0,count_diff = 0;
if (res.length > 0) {
res.forEach((item) => {
@ -696,7 +702,6 @@ export default {
let chartId = 'linechart'+mgroup_index;
that.setChart(chartId, option);
}
});
},
handleQuery(){
@ -715,7 +720,9 @@ export default {
that.query.querys[1][0].value = that.end_date;
}
that.options.forEach((item,index)=>{
that.getData(item.id,item.name,index);
setTimeout(()=>{
that.getData(item.id,item.name,index);
},500)
})
},
handleExport(val) {

View File

@ -0,0 +1,223 @@
<template>
<el-container>
<el-aside style="width: 45%; background: #ffffff">
<el-container>
<el-header>
<div class="left-panel">
<span style="font-size: 14px">人员生产统计</span>
</div>
<div class="right-panel">
<!-- 工段 -->
<el-select
v-model="query.mgroup_name"
>
<el-option
v-for="item in options"
:key="item.name"
:label="item.name"
:value="item.name"
>
</el-option>
</el-select>
<!-- 日期 -->
<el-date-picker
v-model="queryData"
type="date"
placeholder="查询日期"
value-format="YYYY-MM-DD"
style="width: 160px"
@change="dateChange"
>
</el-date-picker>
<el-button
type="primary"
icon="el-icon-search"
@click="searchHandle"
></el-button>
<el-button @click="handleExport('1')" type="primary"
>导出</el-button>
</div>
</el-header>
<el-main>
<scTable
ref="tables1"
:data="tableData"
id="exportDiv1"
@row-click="rowClick"
stripe
hideDo
hidePagination
>
<el-table-column label="工段" prop="工段"></el-table-column>
<el-table-column label="操作人" prop="操作人"></el-table-column>
<el-table-column label="生产数" prop="生产数"></el-table-column>
<el-table-column label="合格数" prop="合格数"></el-table-column>
<el-table-column label="不合格数" prop="不合格数"></el-table-column>
<el-table-column label="合格率" prop="合格率"></el-table-column>
<el-table-column label="日期" prop="日期"></el-table-column>
</scTable>
</el-main>
</el-container>
</el-aside>
<el-main class="nopadding">
<el-container>
<el-header>
<div class="left-panel">
<span style="font-size: 14px">人员生产统计详情</span>
</div>
<div class="right-panel">
<el-button @click="handleExport('2')" type="primary"
>导出</el-button
>
</div>
</el-header>
<el-main>
<scTable
ref="tables2"
:data="tableData2"
id="exportDiv2"
stripe
hideDo
hidePagination
>
<el-table-column label="工段" prop="工段"></el-table-column>
<el-table-column label="物料名" prop="物料名"></el-table-column>
<el-table-column label="操作人" prop="操作人"></el-table-column>
<el-table-column label="规格" prop="规格"></el-table-column>
<el-table-column label="型号" prop="型号"></el-table-column>
<el-table-column label="生产数" prop="生产数"></el-table-column>
<el-table-column label="合格数" prop="合格数"></el-table-column>
<el-table-column label="不合格数" prop="不合格数"></el-table-column>
<el-table-column label="合格率" prop="合格率"></el-table-column>
<el-table-column label="日期" prop="日期"></el-table-column>
</scTable>
</el-main>
</el-container>
</el-main>
</el-container>
</template>
<script>
import { mioTypeEnum } from "@/utils/enum.js";
function deepCopy(obj) {
return JSON.parse(JSON.stringify(obj));
}
const ondDayTime = 86400000;
export default {
name: "chart",
data() {
return {
query:{
start_date:"",
end_date:''
},
start_date: "",
end_date: "",
options:[],
tableData: [],
tableData2: [],
queryData:'',
};
},
mounted() {
let that = this;
let date = new Date();
that.query.start_date = that.start_date = that.queryData =
that.query.end_date = that.end_date = date.toISOString().split('T')[0];
// let week = date.getDay(); //week
// let weekFirst = week - 1; //
// let weekLast = 7 - week; //
// if (week == 0) {
// weekFirst = 6;
// weekLast = 0; //
// } else {
// weekFirst = week - 1;
// weekLast = 7 - week;
// }
// let first = new Date(new Date(date.getTime() - weekFirst * ondDayTime)); //
// let last = new Date(new Date(date.getTime() + weekLast * ondDayTime)); //
// this.query.start_date = this.start_date = first.toISOString().split('T')[0];
// this.query.end_date = this.end_date = last.toISOString().split('T')[0];
this.getMgroup();
},
methods: {
getWeekDate(dateTime) {
let date = new Date(dateTime);
let week = date.getDay(); //week
let weekFirst = week - 1; //
let weekLast = 7 - week; //
if (week == 0) {
weekFirst = 6;
weekLast = 0; //
} else {
weekFirst = week - 1;
weekLast = 7 - week;
}
let first = new Date(new Date(date.getTime() - weekFirst * ondDayTime)); //
let last = new Date(new Date(date.getTime() + weekLast * ondDayTime)); //
this.query.start_date = first.toISOString().split('T')[0];
this.query.end_date = last.toISOString().split('T')[0];
},
getMgroup(){
let that = this;
this.$API.mtm.mgroup.list.req({page:0}).then((res) => {
that.options = res;
that.query.mgroup_name = res[0].name;
that.getTableData();
})
},
searchHandle() {
let that = this;
that.tableData = [];
that.getTableData();
},
dateChange(){
this.query.start_date = this.query.end_date = this.queryData;
},
//
getTableData() {
let that = this;
let obj = {};
let query = deepCopy(that.query);
query.group_by_material = "";
query.select_col_material = "";
obj.query = query;
that.$API.bi.dataset.exec.req('ryjxtj', obj).then((res) => {
if (res.data2.ds0) {
that.tableData = res.data2.ds0;
}
});
},
rowClick(row){
console.log(row);
let that = this;
let obj = {};
let query = deepCopy(that.query);
query.where_user = "and userd.name = '"+row.操作人+"'";
obj.query = query;
that.tableData2 = [];
that.$API.bi.dataset.exec.req('ryjxtj', obj).then((res) => {
if( res.data2.ds0){
that.tableData2 = res.data2.ds0;
}
})
},
handleExport(val) {
this.exportLoading = true;
let id = "#exportDiv" + val;
let name = val == "1" ? "库存统计" : "库存出入库统计";
this.$XLSX(id, name);
this.exportLoading = false;
},
},
};
</script>
<style scoped>
.tables {
position: absolute;
top: 4px;
right: 6px;
z-index: 10;
}
</style>

View File

@ -347,10 +347,10 @@ export default {
};
},
mounted() {
this.batchCount = this.itemObj.count;
this.batchCount = this.itemObj.count_cando;
this.form.batch = this.itemObj.batch;
this.form.wm = this.itemObj.id;
this.form.count = this.itemObj.count;
this.form.count = this.itemObj.count_cando;
this.form.supplier = this.itemObj.supplier;
this.deptID = this.$TOOL.data.get('gx_deptID');
this.getUsers();
@ -361,7 +361,6 @@ export default {
this.mode = mode;
this.modeTitle = mode+'抽检';
this.visible = true;
return this;
},
getUsers(){

View File

@ -72,10 +72,10 @@
>放行审批</el-button>
</div>
</el-card>
<!-- 物料消耗 -->
<!-- 输入物料 -->
<el-card
style="width: 100%; margin: 1vh 0"
header="物料消耗"
header="输入物料"
shadow="never"
>
<div>
@ -141,7 +141,7 @@
</el-table-column>
</scTable>
</el-card>
<!-- 物料消耗编辑 -->
<!-- 输入物料编辑 -->
<el-dialog v-model="saveInDialog" title="编辑">
<el-form
:model="saveInForm"
@ -181,8 +181,8 @@
>
</template>
</el-dialog>
<!-- 出物料 -->
<el-card style="width: 100%" header="出物料" shadow="never">
<!-- 出物料 -->
<el-card style="width: 100%" header="出物料" shadow="never">
<scTable
ref="tableOut"
:apiObj="apiObj"