Browse Source

QC子件信息录入

master
yangzz 3 weeks ago
parent
commit
df3ff873ac
  1. 10
      src/api/report/qcSubPart.js
  2. 744
      src/views/modules/report/qcSubpart.vue

10
src/api/report/qcSubPart.js

@ -0,0 +1,10 @@
import { createAPI } from '@/utils/httpRequest.js'
export const getHeaderList = data => createAPI('/report/qcSubPartQuery/getHeaderList', 'POST', data)
export const getDetailList = data => createAPI('/report/qcSubPartQuery/getDetailList', 'POST', data)
export const queryAddMainList = data => createAPI('/report/qcSubPartAdd/queryAddMainList', 'POST', data)
export const queryAddDetailList = data => createAPI('/report/qcSubPartAdd/queryAddDetailList', 'POST', data)
export const saveAddRecord = data => createAPI('/report/qcSubPartAdd/saveAddRecord', 'POST', data)
export const updateRecord = data => createAPI('/report/qcSubPartAdd/updateRecord', 'POST', data)

744
src/views/modules/report/qcSubpart.vue

@ -0,0 +1,744 @@
<template>
<div class="mod-qc-subpart">
<el-form :inline="true" label-position="top" :model="queryForm">
<el-form-item label="BU">
<el-select v-model="queryForm.citemCode" placeholder="请选择" clearable style="width: 120px">
<el-option
v-for="i in userBuList"
:key="i.buNo"
:label="i.buDesc"
:value="normalizeBuKey(i)"
/>
</el-select>
</el-form-item>
<el-form-item label="派工单号">
<el-input v-model="queryForm.seqNo" clearable style="width: 140px" />
</el-form-item>
<el-form-item label="物料编码">
<el-input v-model="queryForm.partNo" clearable style="width: 140px" />
</el-form-item>
<el-form-item label="SKU">
<el-input v-model="queryForm.sku" clearable style="width: 120px" />
</el-form-item>
<el-form-item label="生产日期">
<el-date-picker
style="width: 150px"
v-model="queryForm.startDate"
type="datetime"
value-format="yyyy-MM-dd HH:mm"
format="yyyy-MM-dd HH:mm"
placeholder="开始日期"
/>
-
<el-date-picker
style="width: 150px"
v-model="queryForm.endDate"
type="datetime"
value-format="yyyy-MM-dd HH:mm"
format="yyyy-MM-dd HH:mm"
placeholder="结束日期"
/>
</el-form-item>
<el-form-item label=" ">
<el-button type="primary" @click="queryHeader">查询</el-button>
<el-button type="primary" @click="resetQuery">重置</el-button>
<el-button type="primary" @click="openAddDialog">新增</el-button>
</el-form-item>
</el-form>
<el-table
:data="headerList"
border
v-loading="headerLoading"
highlight-current-row
@current-change="onHeaderCurrentChange"
:height="headerTableHeight"
style="width: 100%; margin-top: 8px"
>
<el-table-column prop="recordNo" label="记录号" min-width="140" />
<el-table-column prop="citemCode" label="BU" min-width="90" />
<el-table-column prop="seqNo" label="派工单号" min-width="120" />
<el-table-column prop="orderNo" label="工单号" min-width="120" />
<el-table-column prop="itemNo" label="工序号" min-width="90" />
<el-table-column prop="itemDesc" label="工序描述" min-width="120" />
<el-table-column prop="workCenterNo" label="加工中心" min-width="120" />
<el-table-column prop="partNo" label="物料编码" min-width="120" />
<el-table-column prop="partDesc" label="物料名称" min-width="180" />
<el-table-column prop="sku" label="SKU" min-width="100" />
<el-table-column prop="bomRevNo" label="BOM版本号" min-width="110" />
<el-table-column prop="resourceId" label="设备编码" min-width="120" />
<el-table-column prop="resourceDesc" label="设备名称" min-width="160" />
<el-table-column prop="qtyApprove" label="合格数量" min-width="100" />
<el-table-column prop="scheduledDate" label="生产日期" min-width="120" :formatter="formatDisplayDate" />
<el-table-column label="操作" width="90" fixed="right">
<template slot-scope="scope">
<a type="text" size="small" @click="openEditDialog(scope.row)">编辑</a>
</template>
</el-table-column>
</el-table>
<el-table
:data="detailList"
ref="detailTable"
border
v-loading="detailLoading"
style="width: 100%; margin-top: 10px"
:height="detailTableHeight"
>
<el-table-column prop="sortNo" label="序号" width="70" />
<el-table-column prop="partNo" label="子件编码" min-width="120" />
<el-table-column prop="partDesc" label="子件描述" min-width="180" />
<el-table-column prop="supplierId" label="供应商编码" min-width="130" />
<el-table-column prop="supplierName" label="供应商名称" min-width="160" />
<el-table-column prop="modelNo" label="型号" min-width="120" />
<el-table-column prop="manufactureDate" label="生产日期" min-width="120" />
</el-table>
<el-dialog
:title="editMode === 'add' ? '新增QC子件' : '编辑QC子件'"
:close-on-click-modal="false"
:visible.sync="editVisible"
width="1280px"
v-drag
>
<el-form :inline="true" label-position="top" :model="addQuery">
<el-form-item label="BU">
<el-select v-model="addQuery.citemCode" placeholder="请选择" clearable style="width: 120px" :disabled="editMode === 'edit'">
<el-option
v-for="i in userBuList"
:key="i.buNo"
:label="i.buDesc"
:value="normalizeBuKey(i)"
/>
</el-select>
</el-form-item>
<el-form-item label="工单号">
<el-input v-model="addQuery.orderNo" clearable style="width: 140px" :disabled="editMode === 'edit'" />
</el-form-item>
<el-form-item label="派工单号">
<el-input v-model="addQuery.seqNo" clearable style="width: 140px" :disabled="editMode === 'edit'" />
</el-form-item>
<el-form-item label="物料编码">
<el-input v-model="addQuery.partNo" clearable style="width: 140px" :disabled="editMode === 'edit'" />
</el-form-item>
<el-form-item label="SKU">
<el-input v-model="addQuery.sku" clearable style="width: 120px" :disabled="editMode === 'edit'" />
</el-form-item>
<el-form-item label="生产日期">
<el-date-picker
style="width: 150px"
v-model="addQuery.startDate"
type="datetime"
value-format="yyyy-MM-dd HH:mm"
format="yyyy-MM-dd HH:mm"
placeholder="开始日期"
:disabled="editMode === 'edit'"
/>
-
<el-date-picker
style="width: 150px"
v-model="addQuery.endDate"
type="datetime"
value-format="yyyy-MM-dd HH:mm"
format="yyyy-MM-dd HH:mm"
placeholder="结束日期"
:disabled="editMode === 'edit'"
/>
</el-form-item>
<el-form-item label=" ">
<el-button type="primary" :disabled="editMode === 'edit'" @click="queryAddMainCandidates">查询候选主数据</el-button>
</el-form-item>
</el-form>
<el-table
:data="addMainList"
border
v-loading="addMainLoading"
highlight-current-row
@current-change="onAddMainCurrentChange"
:height="180"
style="width: 100%; margin-bottom: 10px"
>
<el-table-column prop="orderNo" label="工单号" min-width="120" />
<el-table-column prop="seqNo" label="派工单号" min-width="120" />
<el-table-column prop="itemNo" label="工序号" min-width="90" />
<el-table-column prop="itemDesc" label="工序描述" min-width="120" />
<el-table-column prop="workCenterNo" label="加工中心" min-width="120" />
<el-table-column prop="partNo" label="物料编码" min-width="120" />
<el-table-column prop="partDesc" label="物料描述" min-width="180" />
<el-table-column prop="sku" label="SKU" min-width="100" />
<el-table-column prop="bomRevNo" label="BOM版本号" min-width="110" />
<el-table-column prop="scheduledDate" label="生产日期" min-width="120" :formatter="formatDisplayDate" />
<el-table-column prop="resourceId" label="设备编码" min-width="120" />
<el-table-column prop="resourceDesc" label="设备名称" min-width="160" />
<el-table-column prop="qtyApprove" label="合格数量" min-width="100" />
</el-table>
<el-form :inline="true" label-position="top">
<el-form-item label="派工单号">
<el-input v-model="addForm.mainData.seqNo" disabled style="width: 140px" />
</el-form-item>
<el-form-item label="物料编码">
<el-input v-model="addForm.mainData.partNo" disabled style="width: 140px" />
</el-form-item>
<el-form-item label="物料描述">
<el-input v-model="addForm.mainData.partDesc" disabled style="width: 180px" />
</el-form-item>
<el-form-item label="SKU">
<el-input v-model="addForm.mainData.sku" disabled style="width: 120px" />
</el-form-item>
<el-form-item>
<span slot="label" @click="openChooseList(519, null, -1, 'resource')"><a herf="#">设备编码</a></span>
<el-input v-model="addForm.mainData.resourceId" style="width: 140px" />
</el-form-item>
<el-form-item label="设备名称">
<el-input v-model="addForm.mainData.resourceDesc" disabled style="width: 180px" />
</el-form-item>
<el-form-item label="合格数量">
<el-input-number :controls="false" :min="0" :step="0" v-model="addForm.mainData.qtyApprove" style="width: 120px" />
</el-form-item>
</el-form>
<el-table :data="addForm.detailList" border :height="320" style="width: 100%">
<el-table-column label="序号" width="70">
<template slot-scope="scope">{{ scope.$index + 1 }}</template>
</el-table-column>
<el-table-column prop="partNo" label="子件编码" min-width="120" />
<el-table-column prop="partDesc" label="子件描述" min-width="170" />
<el-table-column label="供应商编码" min-width="160">
<template slot-scope="scope">
<div class="qc-subpart-supplier-cell">
<el-button type="primary" class="qc-subpart-supplier-btn" style="width: 24px; padding: 3px 6px" @click="openChooseList(501, scope.row, scope.$index, 'supplier')">...</el-button>
<el-input v-model="scope.row.supplierId" class="qc-subpart-detail-input qc-subpart-supplier-input" :readonly="true" />
</div>
</template>
</el-table-column>
<el-table-column prop="supplierName" label="供应商名称" min-width="160">
<template slot-scope="scope">
<el-input v-model="scope.row.supplierName" class="qc-subpart-detail-input" :readonly="true" />
</template>
</el-table-column>
<el-table-column prop="modelNo" label="型号" min-width="120">
<template slot-scope="scope">
<el-input v-model="scope.row.modelNo" class="qc-subpart-detail-input" />
</template>
</el-table-column>
<el-table-column prop="manufactureDate" label="生产日期" min-width="150">
<template slot-scope="scope">
<el-input v-model="scope.row.manufactureDate" class="qc-subpart-detail-input" />
</template>
</el-table-column>
</el-table>
<span slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm">保存</el-button>
<el-button type="primary" @click="editVisible = false">关闭</el-button>
</span>
</el-dialog>
<Chooselist ref="baseList" @getBaseData="handleChooseData" />
</div>
</template>
<script>
import Chooselist from '@/views/modules/common/Chooselist_eam'
import { getSiteAndBuByUserName } from '@/api/qc/qc.js'
import {
getHeaderList,
getDetailList,
queryAddMainList,
queryAddDetailList,
saveAddRecord,
updateRecord
} from '@/api/report/qcSubPart'
export default {
components: {
Chooselist
},
data () {
return {
userBuList: [],
defaultBuNo: '',
headerTableHeight: 260,
detailTableHeight: 220,
headerLoading: false,
detailLoading: false,
addMainLoading: false,
headerList: [],
detailList: [],
currentHeader: null,
editVisible: false,
editMode: 'add',
queryForm: {
site: this.$store.state.user.site,
citemCode: '',
seqNo: '',
partNo: '',
sku: '',
startDate: '',
endDate: '',
searchFlag: 'N'
},
addQuery: {
citemCode: '',
orderNo: '',
seqNo: '',
partNo: '',
sku: '',
partDesc: '',
startDate: '',
endDate: '',
searchFlag: 'N'
},
addMainList: [],
addForm: {
site: this.$store.state.user.site,
username: this.$store.state.user.name,
recordNo: '',
mainData: {
citemCode: '',
orderNo: '',
seqNo: '',
itemNo: '',
itemDesc: '',
workCenterNo: '',
bomRevNo: '',
partNo: '',
partDesc: '',
sku: '',
resourceId: '',
resourceDesc: '',
scheduledDate: '',
qtyApprove: 0
},
detailList: []
},
chooseContext: {
tagNo: 0,
type: '',
rowIndex: -1
}
}
},
created () {
this.loadBuList()
this.resetQuery()
},
mounted () {
this.adjustMainTableHeights()
window.addEventListener('resize', this.adjustMainTableHeights)
},
beforeDestroy () {
window.removeEventListener('resize', this.adjustMainTableHeights)
},
methods: {
normalizeBuKey (item) {
if (!item) {
return ''
}
const buNo = item.buNo || ''
if (String(buNo).indexOf('_') >= 0) {
return String(buNo)
}
return `${item.site}_${buNo}`
},
loadBuList () {
const tempData = {
username: this.$store.state.user.name
}
getSiteAndBuByUserName(tempData).then(({ data }) => {
if (data && data.code === 0) {
this.userBuList = data.rows || []
const hardTagBu = this.userBuList.find(item => item.buDesc === '硬标')
const fallbackBu = this.userBuList.length > 0 ? this.userBuList[0] : null
this.defaultBuNo = hardTagBu ? this.normalizeBuKey(hardTagBu) : (fallbackBu ? this.normalizeBuKey(fallbackBu) : '')
this.queryForm.citemCode = this.defaultBuNo
this.addQuery.citemCode = this.defaultBuNo
}
})
},
resetQuery () {
const end = new Date()
const start = new Date()
start.setDate(start.getDate() - 3)
this.queryForm.startDate = this.formatDateTime(start)
this.queryForm.endDate = this.formatDateTime(end)
this.queryForm.searchFlag = 'N'
this.queryForm.citemCode = this.defaultBuNo
this.queryForm.seqNo = ''
this.queryForm.partNo = ''
this.queryForm.sku = ''
this.headerList = []
this.detailList = []
this.currentHeader = null
},
queryHeader () {
this.queryForm.searchFlag = 'Y'
this.queryForm.site = this.extractSiteFromBuKey(this.queryForm.citemCode)
this.headerLoading = true
getHeaderList(this.queryForm).then(({ data }) => {
if (data && data.code === 200) {
this.headerList = data.rows || []
//
this.currentHeader = null
this.detailList = []
} else {
this.$message.error(data.msg || '查询失败')
}
}).finally(() => {
this.headerLoading = false
})
},
onHeaderCurrentChange (row) {
this.currentHeader = row
if (!row) {
this.detailList = []
return
}
this.detailLoading = true
getDetailList({
site: this.queryForm.site,
recordNo: row.recordNo
}).then(({ data }) => {
if (data && data.code === 200) {
this.detailList = data.rows || []
} else {
this.$message.error(data.msg || '查询明细失败')
}
}).finally(() => {
this.detailLoading = false
})
},
openAddDialog () {
this.editMode = 'add'
this.editVisible = true
this.addMainList = []
this.addQuery = {
citemCode: this.queryForm.citemCode || this.defaultBuNo,
orderNo: '',
seqNo: '',
partNo: '',
sku: '',
partDesc: '',
startDate: this.queryForm.startDate,
endDate: this.queryForm.endDate,
searchFlag: 'N'
}
this.addForm = {
site: this.queryForm.site,
username: this.$store.state.user.name,
recordNo: '',
mainData: {
citemCode: '',
orderNo: '',
seqNo: '',
itemNo: '',
itemDesc: '',
workCenterNo: '',
bomRevNo: '',
partNo: '',
partDesc: '',
sku: '',
resourceId: '',
resourceDesc: '',
scheduledDate: '',
qtyApprove: 0
},
detailList: []
}
},
openEditDialog (row) {
this.editMode = 'edit'
this.editVisible = true
this.addMainList = [{
orderNo: row.orderNo || '',
seqNo: row.seqNo || '',
itemNo: row.itemNo || '',
itemDesc: row.itemDesc || '',
workCenterNo: row.workCenterNo || '',
partNo: row.partNo || '',
partDesc: row.partDesc || '',
sku: row.sku || '',
bomRevNo: row.bomRevNo || '',
scheduledDate: row.scheduledDate || '',
resourceId: row.resourceId || '',
resourceDesc: row.resourceDesc || '',
qtyApprove: Number(row.qtyApprove || 0)
}]
this.addQuery = {
...this.addQuery,
citemCode: this.queryForm.citemCode || this.defaultBuNo,
orderNo: row.orderNo || '',
seqNo: row.seqNo || '',
partNo: row.partNo || '',
sku: row.sku || '',
startDate: this.queryForm.startDate,
endDate: this.queryForm.endDate
}
this.addForm = {
site: this.queryForm.site,
username: this.$store.state.user.name,
recordNo: row.recordNo,
mainData: {
citemCode: row.citemCode,
orderNo: row.orderNo || '',
seqNo: row.seqNo,
itemNo: row.itemNo || '',
itemDesc: row.itemDesc || '',
workCenterNo: row.workCenterNo || '',
partNo: row.partNo,
partDesc: row.partDesc,
sku: row.sku,
bomRevNo: row.bomRevNo || '',
resourceId: row.resourceId,
resourceDesc: row.resourceDesc || '',
scheduledDate: row.scheduledDate,
qtyApprove: Number(row.qtyApprove || 0)
},
detailList: []
}
getDetailList({
site: this.queryForm.site,
recordNo: row.recordNo
}).then(({ data }) => {
if (data && data.code === 200) {
this.addForm.detailList = (data.rows || []).map(item => ({
partNo: item.partNo || '',
partDesc: item.partDesc || '',
supplierId: item.supplierId || '',
supplierName: item.supplierName || '',
modelNo: item.modelNo || '',
manufactureDate: item.manufactureDate || '',
sortNo: item.sortNo || 0
}))
} else {
this.$message.error(data.msg || '加载编辑明细失败')
}
})
},
queryAddMainCandidates () {
if (this.editMode === 'edit') {
return
}
this.addQuery.searchFlag = 'Y'
this.addMainLoading = true
const queryPayload = {
citemCode: this.addQuery.citemCode,
orderNo: this.addQuery.orderNo,
seqNo: this.addQuery.seqNo,
partNo: this.addQuery.partNo,
sku: this.addQuery.sku,
partDesc: this.addQuery.partDesc,
startDate: this.addQuery.startDate,
endDate: this.addQuery.endDate,
searchFlag: this.addQuery.searchFlag
}
queryAddMainList(queryPayload).then(({ data }) => {
if (data && data.code === 200) {
this.addMainList = data.rows || []
//
} else {
this.$message.error(data.msg || '查询候选主数据失败')
}
}).finally(() => {
this.addMainLoading = false
})
},
onAddMainCurrentChange (row) {
if (!row) {
return
}
this.addForm.mainData = {
citemCode: row.citemCode || '',
orderNo: row.orderNo || '',
seqNo: row.seqNo || '',
itemNo: row.itemNo || '',
itemDesc: row.itemDesc || '',
workCenterNo: row.workCenterNo || '',
partNo: row.partNo || '',
partDesc: row.partDesc || '',
sku: row.sku || '',
bomRevNo: row.bomRevNo || '',
resourceId: row.resourceId || '',
resourceDesc: row.resourceDesc || '',
scheduledDate: row.scheduledDate || '',
qtyApprove: Number(row.qtyApprove || 0)
}
queryAddDetailList({
site: this.extractSiteFromBuKey(this.addQuery.citemCode),
seqNo: this.addForm.mainData.seqNo
}).then(({ data }) => {
if (data && data.code === 200) {
this.addForm.detailList = (data.rows || []).map((item, index) => ({
partNo: item.partNo || '',
partDesc: item.partDesc || '',
supplierId: item.supplierId || '',
supplierName: item.supplierName || '',
modelNo: item.modelNo || '',
manufactureDate: item.manufactureDate || '',
sortNo: index + 1
}))
} else {
this.$message.error(data.msg || '查询候选明细失败')
}
})
},
openChooseList (tagNo, row, rowIndex, type) {
this.chooseContext = {
tagNo: tagNo,
type: type,
rowIndex: rowIndex
}
//
this.$refs.baseList.init(tagNo, '', '')
},
handleChooseData (row) {
if (this.chooseContext.type === 'resource' && this.chooseContext.tagNo === 519) {
this.addForm.mainData.resourceId = row.resource_id || row.resourceId || row.RESOURCEID || ''
this.addForm.mainData.resourceDesc = row.resource_desc || row.resourceDesc || row.RESOURCEDESC || ''
}
if (this.chooseContext.type === 'supplier' && this.chooseContext.tagNo === 501 && this.chooseContext.rowIndex >= 0) {
this.addForm.detailList[this.chooseContext.rowIndex].supplierId = row.SupplierID || ''
this.addForm.detailList[this.chooseContext.rowIndex].supplierName = row.SupplierName || ''
}
},
submitForm () {
if (!this.addForm.mainData.seqNo) {
this.$message.warning('请先选择主数据')
return
}
const buKey = this.addQuery.citemCode || this.queryForm.citemCode
const site = this.extractSiteFromBuKey(buKey)
const buNo = this.extractPureBuCode(buKey)
const payload = {
site: site,
username: this.addForm.username,
recordNo: this.addForm.recordNo,
mainData: {
...this.addForm.mainData,
citemCode: buNo,
scheduledDate: this.normalizeDateForSave(this.addForm.mainData.scheduledDate)
},
detailList: this.addForm.detailList
}
const api = this.editMode === 'add' ? saveAddRecord : updateRecord
api(payload).then(({ data }) => {
if (data && data.code === 200) {
this.$message.success(data.msg || '保存成功')
this.editVisible = false
this.queryHeader()
} else {
this.$message.error(data.msg || '保存失败')
}
})
},
formatDateTime (date) {
const y = date.getFullYear()
const m = (`0${date.getMonth() + 1}`).slice(-2)
const d = (`0${date.getDate()}`).slice(-2)
const hh = '00'
const mm = '00'
return `${y}-${m}-${d} ${hh}:${mm}`
},
extractSiteFromBuKey (buKey) {
if (!buKey || buKey.indexOf('_') < 0) {
return this.$store.state.user.site
}
return buKey.split('_')[0]
},
extractBuNoFromBuKey (buKey) {
if (!buKey || buKey.indexOf('_') < 0) {
return buKey || ''
}
const splitIndex = buKey.indexOf('_')
return buKey.substring(splitIndex + 1)
},
extractPureBuCode (buKey) {
if (!buKey || buKey.indexOf('_') < 0) {
return buKey || ''
}
const splitIndex = buKey.lastIndexOf('_')
return buKey.substring(splitIndex + 1)
},
formatDisplayDate (row, column, cellValue) {
if (!cellValue) {
return ''
}
const text = String(cellValue).trim()
if (/^\d+$/.test(text)) {
const date = new Date(Number(text))
if (!Number.isNaN(date.getTime())) {
const y = date.getFullYear()
const m = (`0${date.getMonth() + 1}`).slice(-2)
const d = (`0${date.getDate()}`).slice(-2)
return `${y}-${m}-${d}`
}
}
if (text.includes('T')) {
return text.substring(0, 10)
}
if (text.includes(' ')) {
return text.substring(0, 10)
}
return text
},
adjustMainTableHeights () {
const total = window.innerHeight - 200
const headerHeight = Math.max(220, Math.floor(total * 0.4))
this.headerTableHeight = headerHeight
this.$nextTick(() => {
const detailComp = this.$refs.detailTable
const detailEl = detailComp && detailComp.$el ? detailComp.$el : null
if (!detailEl) {
this.detailTableHeight = Math.max(320, total - headerHeight - 24)
return
}
const detailTop = detailEl.getBoundingClientRect().top
const bottomGap = 16
const dynamicHeight = Math.floor(window.innerHeight - detailTop - bottomGap)
this.detailTableHeight = Math.max(320, dynamicHeight)
})
},
normalizeDateForSave (rawDate) {
if (!rawDate) {
return ''
}
const text = String(rawDate).trim()
if (/^\d+$/.test(text)) {
const date = new Date(Number(text))
if (!Number.isNaN(date.getTime())) {
const y = date.getFullYear()
const m = (`0${date.getMonth() + 1}`).slice(-2)
const d = (`0${date.getDate()}`).slice(-2)
return `${y}-${m}-${d}`
}
}
if (text.includes('-')) {
return text.substring(0, 10)
}
return text
}
}
}
</script>
<style scoped>
.qc-subpart-detail-input {
margin-top: -3px;
}
.qc-subpart-supplier-btn {
margin-top: -3px;
}
.qc-subpart-supplier-cell {
display: flex;
align-items: center;
}
.qc-subpart-supplier-input {
margin-left: 4px;
flex: 1;
}
</style>
Loading…
Cancel
Save