更新设备维修、发货、精工车间工序工价/生产审核/工时统计、仓储盘点/库存查询/库位/入库,新增车间派工移动端及SQL脚本

This commit is contained in:
Developer
2026-07-17 09:49:34 +08:00
parent 9c1f52078d
commit 2b9058c69c
20 changed files with 3326 additions and 343 deletions

View File

@@ -393,10 +393,38 @@ export default {
}
sendMessage = sendMessage + number + word
this.websock.send(sendMessage)
this.printSelected()
} else {
this.$message.warning('请选择要打印的物料')
}
},
printSelected() {
var list = this.multipleSelection
var printHtml = '<!DOCTYPE html><html><head><meta charset="utf-8"><title>库存盘点打印</title>'
printHtml += '<style>'
printHtml += 'body { font-family: "Microsoft YaHei", sans-serif; margin: 10px; }'
printHtml += 'table { width: 100%; border-collapse: collapse; }'
printHtml += 'th, td { border: 1px solid #333; padding: 8px 12px; text-align: center; font-size: 14px; }'
printHtml += 'th { background-color: #f0f0f0; font-weight: bold; }'
printHtml += '@media print { @page { size: auto; margin: 10mm; } }'
printHtml += '</style></head><body>'
printHtml += '<h2 style="text-align:center;">库存盘点</h2>'
printHtml += '<table><thead><tr><th>物料编码</th><th>物料名称</th><th>图号</th><th>库位</th></tr></thead><tbody>'
for (var i = 0; i < list.length; i++) {
printHtml += '<tr>'
printHtml += '<td>' + (list[i].物料编码 || '') + '</td>'
printHtml += '<td>' + (list[i].物料名称 || '') + '</td>'
printHtml += '<td>' + (list[i].图号或型号 || '') + '</td>'
printHtml += '<td>' + (list[i].货位名称 || '') + '</td>'
printHtml += '</tr>'
}
printHtml += '</tbody></table></body></html>'
var printWindow = window.open('', '_blank')
printWindow.document.write(printHtml)
printWindow.document.close()
printWindow.focus()
printWindow.print()
},
getWord(number, name, val, location) {
let word
word = ''

View File

@@ -80,7 +80,7 @@
@cell-click="handleEdit"
@sort-change="sortChange"
@selection-change="handleSelectionChange">
<el-table-column type="selection" width="40" :reserve-selection="true" />
<el-table-column :reserve-selection="true" type="selection" width="40" />
<el-table-column type="expand" width="1">
<template slot-scope="scope">
<el-table
@@ -93,7 +93,7 @@
style="width:962px"
height="258px"
size="small">
<el-table-column label="物料编码" align="center" prop="物料码"><!-- 备注:修改人:Ld 修改时间:2026-06-29 14:24:00 -->
<el-table-column label="物料编码" align="center" prop="物料码"><!-- 备注:修改人:Ld 修改时间:2026-07-15 17:14:07; 展开行恢复原出入库记录数据。 -->
<template slot-scope="scope">
{{ scope.row.物料编码 }}
</template>
@@ -168,14 +168,23 @@
{{ scope.row.图号或型号 }}
</template>
</el-table-column>
<el-table-column :width="setColumnWidth('数量')" label="库位" sortable="库位" prop="库位" align="center">
<template slot-scope="scope">
{{ scope.row.货位名称 }}
</template>
</el-table-column>
<el-table-column :width="setColumnWidth('数量')" label="库存" sortable="库存" prop="库存" align="center">
<template slot-scope="scope">
{{ scope.row.库存 }}
<el-popover
placement="bottom"
width="300"
trigger="click"
@show="getStockLocationDetail(scope.row)">
<el-table v-loading="stockLocationLoading" :data="stockLocationData" border stripe size="mini" max-height="300">
<el-table-column prop="货位名称" label="库位" align="center" show-overflow-tooltip/>
<el-table-column prop="货位存量" label="数量" align="center">
<template slot-scope="stockScope">
{{ stockScope.row.货位存量 || stockScope.row.库存 || 0 }}
</template>
</el-table-column>
</el-table>
<span slot="reference" style="cursor: pointer; color: #409EFF; text-decoration: underline;">{{ scope.row.库存 }}</span><!-- 备注:修改人:Ld 修改时间:2026-07-15 17:14:07; 库存库位明细改为参考需求数的小窗显示。 -->
</el-popover>
</template>
</el-table-column>
<el-table-column :width="setColumnWidth('数量')" label="需求数" align="center">
@@ -185,7 +194,7 @@
width="400"
trigger="click"
@show="getDemandDetail(scope.row)">
<el-table :data="demandDetailData" border stripe size="mini" max-height="300" v-loading="demandDetailLoading">
<el-table v-loading="demandDetailLoading" :data="demandDetailData" border stripe size="mini" max-height="300">
<el-table-column prop="订单编号" label="订单号" align="center" show-overflow-tooltip/>
<el-table-column prop="最终需求量" label="需求量" align="center"/>
<el-table-column prop="简称" label="客户" align="center"/>
@@ -404,7 +413,9 @@ export default {
order: '', // 排序方式
multipleSelection: [], // 选中的行
demandDetailData: [],
demandDetailLoading: false
demandDetailLoading: false,
stockLocationData: [],
stockLocationLoading: false
}
},
computed: {
@@ -465,18 +476,48 @@ export default {
this.pageCurrent1 = val
this.searchTable2()
},
getInventoryLocationRows(row) {
var param = []
var materialName_check = row.物料名称 ? 1 : 0
var specificationsModel_check = row.图号或型号 ? 1 : 0
param[0] = ['物料名称_check', materialName_check]
param[1] = ['物料名称', row.物料名称]
param[2] = ['图号或型号_check', specificationsModel_check]
param[3] = ['图号或型号', row.图号或型号]
param[4] = ['库位_check', 0]
param[5] = ['库位', '']
param[6] = ['排序名称', '']
param[7] = ['排序方式', '']
var Data = this.CreateData('11', '仓储管理_库存盘点_查询', param)
return this.ExecDatabase(Data).then(response => {
var rows = response.data.rows || response.data || []
// 备注:修改人:Ld 修改时间:2026-07-15 17:14:07; 库存小窗只显示有库存的库位和对应数量。
return rows.filter(function(item) {
return Number(item.货位存量 || item.库存 || 0) > 0
})
})
},
getStockLocationDetail(row) {
this.stockLocationLoading = true
this.stockLocationData = []
this.getInventoryLocationRows(row).then(rows => {
this.stockLocationData = rows
this.stockLocationLoading = false
}).catch(() => {
this.stockLocationLoading = false
})
},
searchTable2() {
var param = []
param[0] = ['物料流水号', this.materialSerialNumber]
var Data = this.CreateData('11', '库存查询_物料出入库记录_查询', param, this.pageSize1, this.pageCurrent1)
this.ExecDatabase(Data).then(response => {
console.log('response.data', response.data)
this.tableData9 = response.data.rows
this.total1 = response.data.total
})
},
handleEdit(row, column) {
if (column.label === '物料编码') { // 备注:修改人:Ld 修改时间:2026-06-29 14:24:00
if (column.label === '物料编码') { // 备注:修改人:Ld 修改时间:2026-07-15 17:14:07; 展开行继续使用原物料出入库记录。
this.materialSerialNumber = row.物料流水号
this.tableData9 = []
this.searchTable2()
@@ -559,11 +600,11 @@ export default {
Promise.all(promises).then(function(results) {
var data = []
// 表头
data.push(['物料编码', '物料名称', '图号型号', '库位', '库存', '需求数', '可用库存', '加工中', '采购中', '毛坯数', '单位', '类型', '库存批次', '待入库', '最低库存', '安全库存', '最高库存', '', '物料编码', '物料名称', '图号/型号', '类型', '出/入库数', '出/入库日期', '批次编码']) // 备注:修改人:Ld 修改时间:2026-06-29 14:24:00
data.push(['物料编码', '物料名称', '图号型号', '库存', '需求数', '可用库存', '加工中', '采购中', '毛坯数', '单位', '类型', '库存批次', '待入库', '最低库存', '安全库存', '最高库存', '', '物料编码', '物料名称', '图号/型号', '类型', '出/入库数', '出/入库日期', '批次编码']) // 备注:修改人:Ld 修改时间:2026-07-15 17:14:07; 选中导出恢复原展开出入库记录明细。
results.forEach(function(item) {
var row = item.row
var mainRow = [
row.物料编码, row.物料名称, row.图号或型号, row.货位名称, row.库存,
row.物料编码, row.物料名称, row.图号或型号, row.库存,
row.需求量, row.库存 - row.需求量, row.加工中 < 0 ? 0 : row.加工中,
row.采购中, row.毛坯库存, row.单位, row.类型, row.批次, row.预库存,
row.最低库存, row.安全库存, row.最高库存, ''
@@ -573,7 +614,7 @@ export default {
if (idx === 0) {
data.push(mainRow.concat([expand.物料编码, expand.物料名称, expand.图号或型号, expand.类型, expand.数量, expand.日期, expand.批次编号 || expand.批次编码]))
} else {
data.push(['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', expand.物料编码, expand.物料名称, expand.图号或型号, expand.类型, expand.数量, expand.日期, expand.批次编号 || expand.批次编码])
data.push(['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', expand.物料编码, expand.物料名称, expand.图号或型号, expand.类型, expand.数量, expand.日期, expand.批次编号 || expand.批次编码])
}
})
} else {
@@ -582,12 +623,11 @@ export default {
})
var ws = XLSX.utils.aoa_to_sheet(data)
ws['!cols'] = [
{ wch: 15 }, { wch: 20 }, { wch: 15 }, { wch: 10 }, { wch: 8 },
{ wch: 8 }, { wch: 10 }, { wch: 8 }, { wch: 8 }, { wch: 8 },
{ wch: 6 }, { wch: 8 }, { wch: 12 }, { wch: 8 }, { wch: 10 },
{ wch: 10 }, { wch: 10 }, { wch: 2 },
{ wch: 15 }, { wch: 20 }, { wch: 15 }, { wch: 8 }, { wch: 10 },
{ wch: 15 }, { wch: 15 }
{ wch: 15 }, { wch: 20 }, { wch: 15 }, { wch: 8 }, { wch: 8 },
{ wch: 10 }, { wch: 8 }, { wch: 8 }, { wch: 8 }, { wch: 6 },
{ wch: 8 }, { wch: 12 }, { wch: 8 }, { wch: 10 }, { wch: 10 },
{ wch: 10 }, { wch: 2 }, { wch: 15 }, { wch: 20 }, { wch: 15 },
{ wch: 8 }, { wch: 10 }, { wch: 15 }, { wch: 15 }
]
var wb = XLSX.utils.book_new()
XLSX.utils.book_append_sheet(wb, ws, '库存查询')
@@ -605,8 +645,6 @@ export default {
this.orderName = 1
} else if (column.prop === '物料名称') {
this.orderName = 2
} else if (column.prop === '库位') {
this.orderName = 3
} else if (column.prop === '库存') {
this.orderName = 4
} else if (column.prop === '最低库存') {

View File

@@ -7,9 +7,12 @@
<el-input v-model="DrawingNo" style="width: 200px " size="small" clearable placeholder="图号/型号"/>
<el-input v-model="locationWarehouseValue" style="width:200px" placeholder="库位" size="small" clearable/>
<el-button style="margin-left: 7px;width: 80px" type="primary" plain size="small" @click="searchTable()">查询</el-button>
<el-button type="primary" icon="el-icon-printer" style="margin-left: 7px" plain size="small" @click="printReceiptDoc1()">打印</el-button>
</div>
<div>
<el-table v-loading="loading" :data="tableData" highlight-current-row show-summary border stripe size="small" style="width: 731px" height="740px">
<el-table ref="table" v-loading="loading" :data="tableData" highlight-current-row show-summary border stripe size="small" style="width: 731px" height="740px"
@selection-change="handleSelectionChange">
<el-table-column type="selection" width="50px"/>
<el-table-column :width="setColumnWidth('序号')" type="index" label="序号" align="center"/>
<el-table-column label="物料编码" align="center" show-overflow-tooltip><!-- 备注:修改人:Ld 修改时间:2026-06-29 14:24:00 -->
<template slot-scope="scope">
@@ -44,15 +47,57 @@
@current-change="handleCurrentChanges"/>
</div>
</el-card>
<el-card v-show="false">
<div style="width:900px;margin-left: 350px">
<el-card>
<div id="WGBLD" style="width: 840px;margin: 0 auto">
<div style="width: 260px;margin: 0 auto 20px">
<h3>浙江景耀数控物料库位清单</h3>
</div>
<div style="margin: 0 0 20px">
<span style="float: right; font-size: 14px;margin-right: 10px">日期:{{ NowTime }}</span>
</div>
<table align="center" border="1 solid black" cellspacing="0px" width="100%">
<tr id="tablehead12" style="height: 35px">
<td colspan="3" style="text-align: center;width: 25%;font-size: 14px">物料编码</td>
<td colspan="5" style="text-align: center;width: 30%;font-size: 14px">物料名称</td>
<td colspan="4" style="text-align: center;width: 22%;font-size: 14px">图号或型号</td>
<td colspan="6" style="text-align: center;width: 23%;font-size: 14px">库位</td>
</tr>
<tr v-for="(list, index) in returns" :key="index" style="height: 35px">
<td colspan="3" style="text-align: center;width: 25%;font-size: 14px">{{ list.物料编码 }}</td>
<td colspan="5" style="text-align: center;width: 30%;font-size: 14px">{{ list.物料名称 }}</td>
<td colspan="4" style="text-align: center;width: 22%;font-size: 14px">{{ list.规格型号 }}</td>
<td colspan="6" style="text-align: center;width: 23%;font-size: 14px">{{ list.库位 }}</td>
</tr>
<tr style="height: 35px">
<td colspan="12" style="text-align: center;font-size: 14px">合计</td>
<td colspan="6" style="text-align: center;">
<div>
<span style="float: right;margin-right: 24%;font-size: 14px">{{ returns.length }} 条</span>
</div>
</td>
</tr>
</table>
<div style="margin-top: 15px"><span style="margin-left: 10px;font-size: 14px">制单:</span></div>
</div>
</el-card>
</div>
</el-card>
</div>
</template>
<script>
import { ExecDatabase } from '@/main'
import { mapGetters } from 'vuex'
import $ from 'jquery'
import { getNowDAY } from '@/utils'
export default {
data() {
return {
NowTime: getNowDAY(),
returns: [],
multipleSelection: [],
locationWarehouseValue: '', // 库位
MaterialCode: '',
MaterialName: '',
@@ -130,6 +175,49 @@ export default {
handleCurrentChanges(val) {
this.pageCurrent = val
this.searchTable()
},
handleSelectionChange(val) {
this.multipleSelection = val
},
async printReceiptDoc1() {
const aa = this.printReceiptDoc()
if (aa === 2) {
await this.sleep(500)
await this.exportTable()
} else if (aa === 1) {
this.$message.warning('请勾选要打印的物料!!')
}
},
sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms))
},
exportTable() {
const htmlNode = $('#WGBLD').html()
const body = $('body')
body.children().hide()
const printNode = $(htmlNode)
body.append(printNode)
window.print()
body.children().not('script').show()
body.children().not('#app').hide()
printNode.remove()
},
printReceiptDoc() {
this.returns = []
if (this.multipleSelection.length !== 0) {
for (let i = 0; i < this.multipleSelection.length; i++) {
this.returns.push({
物料编码: this.multipleSelection[i].物料编号,
物料名称: this.multipleSelection[i].物料名称,
规格型号: this.multipleSelection[i].图号或型号,
库位: this.multipleSelection[i].货位名称
})
}
return 2
} else {
this.$message.warning('未勾选物料!!')
return 1
}
}
}
}

View File

@@ -5,7 +5,7 @@
v-model="PartType"
type="border-card"
style="height: 850px;padding: 0"
@tab-click="pageCurrent=1;pageCurrent1=1">
@tab-click="handleTabClick">
<el-tab-pane label="采购入库" name="采购入库">
<div style="margin-top: 7px; margin-bottom: 7px">
<el-select
@@ -279,6 +279,17 @@
size="small"
@click="submitInStorage2">入库
</el-button>
<!-- 修改人:Ld 修改时间:2026-07-14 09:05:57; 自制件入库增加入库单入口,按自制件类型加载待入库单 -->
<el-badge :value="selfMadeRKDCount" class="item">
<el-button
type="primary"
icon="el-icon-s-home"
style="margin-left: 10px"
plain
size="small"
@click="showSelfMadeRKDDialog">入库单
</el-button>
</el-badge>
</div>
<div>
<el-table
@@ -546,8 +557,11 @@
<el-dialog v-el-drag-dialog :visible.sync="dialogFormVisibleRKD" title="入库单" center width="700px">
<el-table :data="tableDataRKDMerged" border stripe size="small" height="400px">
<el-table-column prop="入库单号" label="入库单号" align="center" show-overflow-tooltip/>
<el-table-column prop="采购合同号" label="采购合同" align="center" show-overflow-tooltip/>
<el-table-column prop="供应商名称" label="供应商" align="center" show-overflow-tooltip/>
<el-table-column v-if="rkdDialogType === '采购'" prop="采购合同号" label="采购合同" align="center" show-overflow-tooltip/>
<el-table-column v-if="rkdDialogType === '采购'" prop="供应商名称" label="供应商" align="center" show-overflow-tooltip/>
<!-- 修改人:Ld 修改时间:2026-07-14 09:05:57; 自制件入库单弹窗显示订单信息 -->
<el-table-column v-if="rkdDialogType === '自制'" prop="订单号" label="订单号" align="center" show-overflow-tooltip/>
<el-table-column v-if="rkdDialogType === '自制'" prop="类型" label="类型" align="center" show-overflow-tooltip/>
<el-table-column prop="到货数" label="到货数" align="center" show-overflow-tooltip/>
<el-table-column label="操作" align="center" width="80px">
<template slot-scope="scope">
@@ -711,6 +725,7 @@ export default {
tableData3: [], // 合同信息表
tableData30: [], // 合同信息表
dialogFormVisibleRKD: false,
rkdDialogType: '采购', // 修改人:Ld 修改时间:2026-07-14 09:05:57; 区分采购/自制件入库单弹窗
tableDataRKD: [],
pageCurrent: 1, // 分页当前页
pageSize: 30, // 分页每页显示条数
@@ -739,6 +754,16 @@ export default {
}
}
return result
},
selfMadeRKDCount() {
// 修改人:Ld 修改时间:2026-07-14 09:05:57; 统计自制件待入库单数量用于按钮角标
var count = 0
for (var i = 0; i < this.tableDataRKD.length; i++) {
if (this.tableDataRKD[i].类型 === '自制') {
count++
}
}
return this.rkdDialogType === '自制' ? this.tableDataRKDMerged.length : count
}
},
updated() {
@@ -762,10 +787,20 @@ export default {
},
methods: {
loadRKDCounter() {
// 修改人:Ld 修改时间:2026-07-14 09:05:57; 默认加载采购入库单数量,避免采购页混入自制件入库单
this.loadRKDData('采购', false)
},
loadRKDData(type, showDialog) {
// 修改人:Ld 修改时间:2026-07-14 09:05:57; 按采购/自制类型统一加载入库单数据
var param = []
param[0] = ['类型_check', 1]
param[1] = ['类型', type]
var Data = this.CreateData('11', '仓储管理_入库单_查询', param)
this.ExecDatabase(Data).then(response => {
this.tableDataRKD = response.data.filter(item => item.是否入库 === 0 || item.是否入库 === false)
if (showDialog) {
this.dialogFormVisibleRKD = true
}
})
},
handleSupplierChange() {
@@ -797,14 +832,23 @@ export default {
this.supplierSelectionName = obj ? obj.label : ''
},
showRKDDialog() {
var param = []
var Data = this.CreateData('11', '仓储管理_入库单_查询', param)
this.ExecDatabase(Data).then(response => {
this.tableDataRKD = response.data.filter(item => item.是否入库 === 0 || item.是否入库 === false )
this.dialogFormVisibleRKD = true
})
this.rkdDialogType = '采购'
this.loadRKDData('采购', true)
},
showSelfMadeRKDDialog() {
// 修改人:Ld 修改时间:2026-07-14 09:05:57; 自制件入库页打开自制件入库单列表
this.rkdDialogType = '自制'
this.loadRKDData('自制', true)
},
selectRKDRow(row) {
if (this.rkdDialogType === '自制') {
this.orderSelectionValue = Number(row.订单流水号) || row.订单流水号
this.numberSelectionValue = ''
this.getnumberSelection()
this.searchTable3()
this.dialogFormVisibleRKD = false
return
}
this.supplierSelectionValue = row.供应商流水号
this.getContractState()
this.$nextTick(() => {
@@ -814,6 +858,13 @@ export default {
})
this.dialogFormVisibleRKD = false
},
handleTabClick() {
// 修改人:Ld 修改时间:2026-07-14 09:05:57; 切换页签时刷新对应类型的入库单数量
this.pageCurrent = 1
this.pageCurrent1 = 1
this.rkdDialogType = this.PartType === '自制件入库' ? '自制' : '采购'
this.loadRKDData(this.rkdDialogType, false)
},
exportTable() {
const htmlNode = $('#WGBLD').html()
const body = $('body')