完工汇报质检详情 撤回

This commit is contained in:
shaoleiliu-netizen123 2026-07-17 11:05:57 +08:00
parent 3c02f65a44
commit 45815cb602
9 changed files with 349 additions and 399 deletions

View File

@ -82,5 +82,12 @@ export const qcResultDetailApi = {
// 下载导入模板
downloadTemplate() {
return request({ url: `/biz/qcResultDetail/template`, method: 'get', responseType: 'blob' })
},
selectlistByqcId(qcId:any) {
return request({
url:`/biz/qcResultDetail/selectlistByqcId/${qcId}`,
method:'get'
})
}
}

View File

@ -73,8 +73,10 @@ export const qualityTestingApi = {
return request({ url: '/mes/qc/partial', method: 'post', data })
},
//质检撤回
cancel(id: number) {
return request({ url: `/mes/dispatch/revoke/${id}`, method: 'put' })
cancel(data:{assingId:number,remark:string}) {
console.log(data);
return request({ url: `/mes/dispatch/revoke`, method: 'put',data })
},
// 导出

View File

@ -22,6 +22,8 @@ export interface SubmitLog {
assingStatus?: number
remark?: string
}
// 派工工单汇报记录 API

View File

@ -40,14 +40,14 @@
</n-tabs>
</template>
<script setup lang="ts">
import { ref, reactive, watch } from 'vue'
import { ref, reactive, watch, onMounted } from 'vue'
import {
NButton, NSpace, useMessage
} from 'naive-ui'
import {useRoute} from "vue-router";
import {QcResultDetail} from "@/api/qcResultDetail.ts";
import {qcResultDetailApi, type QcResultDetail} from "@/api/qcResultDetail.ts";
import { qualityTestingApi} from '@/api/qualityTesting'
import router from '@/router';
import SubmitDetailPage from '@/components/SubmitDetailPage.vue';
@ -58,16 +58,19 @@ const props = defineProps({
showReworkTab:Boolean,
showConnessionTab:Boolean,
showTraceCode:Boolean,
qcId:Number
})
const message = useMessage()
const route = useRoute()
const traceCode = ref(String(route.params.traceCode))
const emit = defineEmits(['updateSubmitDetail'])
const emit = defineEmits(['updateSubmitDetail','qcSumitDetail'])
const submitDetail = reactive<any>({})
@ -105,10 +108,12 @@ function handleFormDetailScrapData(formDetailData:QcResultDetail) {
function handleFormDetailReworkData(formDetailData:QcResultDetail) {
Object.assign(formDetailReworkData, formDetailData)
submitDetail.reworkData = formDetailReworkData
}
function handleFormDetailConcessionData(formDetailData:QcResultDetail){
Object.assign(formDetailConcessionData, formDetailData)
submitDetail.concessionData = formDetailConcessionData
}
@ -116,13 +121,18 @@ function handleFormDetailConcessionData(formDetailData:QcResultDetail){
watch(
submitDetail,
(newVal)=>{
console.log(newVal);
emit('updateSubmitDetail',{...newVal})
},{ deep: true }
)
watch(
submitDetail,
(newVal)=>{
emit('qcSumitDetail',{...newVal})
}
)
function handleReset() {
@ -135,4 +145,25 @@ function handleReset() {
}
async function loadData() {
if(props.qcId == -1) return
const resultList = await qcResultDetailApi.selectlistByqcId(props.qcId);
Object.assign(formDetailOKData,{...resultList.formDetailOKData})
Object.assign(formDetailScrapData,{...resultList.formDetailScrapData})
Object.assign(formDetailReworkData, { ...resultList.formDetailReworkData})
Object.assign(formDetailConcessionData, { ...resultList.formDetailConsecctionData })
submitDetail.okData = resultList.formDetailOKData ?? { ...defaultFormDetailData, resultType: 1, handleAction: '下一道工序', actionStatus: 1 }
submitDetail.scrapData = resultList.formDetailScrapData ?? { ...defaultFormDetailData, resultType: 2, handleAction: '报废次品', actionStatus: 1 }
submitDetail.reworkData = resultList.formDetailReworkData ?? { ...defaultFormDetailData, resultType: 3, handleAction: '返工', actionStatus: 1 }
submitDetail.concessionData = resultList.formDetailConsecctionData ?? { ...defaultFormDetailData, resultType: 4, handleAction: '让步接收', actionStatus: 1 }
}
onMounted(()=>{
loadData()
})
</script>

View File

@ -54,8 +54,8 @@
</template>
<script setup lang="ts">
import { ref, reactive, onMounted } from 'vue'
import { NButton, NSpace, NIcon, type DataTableColumns} from 'naive-ui'
import { ref, reactive,h, onMounted } from 'vue'
import { NButton, NSpace,NTag, NIcon, type DataTableColumns} from 'naive-ui'
import { SearchOutline, RefreshOutline } from '@vicons/ionicons5'
import { qcResultDetailApi, type QcResultDetail } from '@/api/qcResultDetail'
import { dictDataApi } from '@/api/org'
@ -92,7 +92,7 @@ const actionStatusOptions = ref<{ label: string; value: any }[]>([])
//
const qcResultTypeOptions = ref<{ label: string; value: any }[]>([])
//
const qcActionStatusOptions = ref<{ label: string; value: any }[]>([])
const qcActionStatusOptions = ref<{ label: string; value: any;class:any }[]>([])
//
@ -113,7 +113,8 @@ const columns: DataTableColumns<QcResultDetail> = [
render(row) {
const val = row.actionStatus
const opt = qcActionStatusOptions.value.find(o => o.value === val || String(o.value) === String(val))
return opt ? opt.label : (val ?? '-')
if (!opt) return val ?? '-'
return h(NTag, { type: opt.class, size: 'small' }, { default: () => opt.label })
}
},
{ title: '备注/原因描述', key: 'remark' },
@ -195,7 +196,7 @@ async function loadDictOptions() {
}catch {}
try {
const data = await dictDataApi.listByType('qc_action_status')
qcActionStatusOptions.value = data.map(d => ({ label: d.dictLabel, value: (Number(d.dictValue) || d.dictValue) }))
qcActionStatusOptions.value = data.map(d => ({ label: d.dictLabel, value: (Number(d.dictValue) || d.dictValue),class: d.listClass }))
}catch {}
}

View File

@ -224,7 +224,23 @@
<!-- </n-card>-->
</n-modal>
<!-- 提交判定明细抽屉 -->
<n-drawer v-model:show="showSubmitOuter" :width="800">
<SumbitDetailCard
:showOkTab="true"
:showScrapTab="true"
:showReworkTab = true
:showConnessionTab="true"
:showTraceCode = "true"
:qcId="qcId"
@qcSumitDetail="handleSubmitDetail"
/>
<n-space justify="center" style="width: 100%; margin-top: 16px;">
<n-button size="small" @click="handleReset">重置</n-button>
<n-button type="primary" size="small" @click="handleSubmitResultDetail">提交</n-button>
</n-space>
</n-drawer>
</div>
@ -245,13 +261,18 @@ import { qualityTestingApi, type QualityTesting } from '@/api/qualityTesting'
import {assingReworkApi} from '@/api/assingRework'
import { dictDataApi } from '@/api/org'
import {QcResultDetail} from "@/api/qcResultDetail.ts";
import {qcResultDetailApi, type QcResultDetail} from "@/api/qcResultDetail.ts";
import SumbitDetailCard from '@/components/SumbitDetailCard.vue'
import router from "@/router";
const message = useMessage()
const dialog = useDialog()
//
const showSubmitOuter = ref<Boolean>(false)
const qcId = ref<number>(-1)
//
@ -287,7 +308,7 @@ const detailIsCollapse = ref(true)
// const submitDetailModalVisible = ref(false)
const traceCodeShow = ref(false)
///
const submitFlag = ref<Boolean>()
const showTraceFlag = ref<Boolean>()
const customOrderKeys = [
@ -411,21 +432,25 @@ const defaultFormData: QualityTesting = {
}
const formData = reactive<QualityTesting>({ ...defaultFormData })
// const defaultFormDetailData:QcResultDetail = {
// qcId: undefined,
// resultType: undefined,
// qty: 0,
// traceCode: undefined,
// defectCode: undefined,
// handleAction: undefined,
// actionStatus: undefined
// }
const defaultFormDetailData:QcResultDetail = {
qcId: undefined,
resultType: undefined,
qty: 0,
traceCode: undefined,
defectCode: undefined,
handleAction: undefined,
actionStatus: undefined,
remark: '',
title:undefined,
images:[],
attachments:[]
}
let formDetailOKData = reactive<QcResultDetail>({ ...defaultFormDetailData, resultType: 1,handleAction:'下一道工序',actionStatus:1 })
// const formDetailOKData = reactive<QcResultDetail>({ ...defaultFormDetailData, resultType: 1,handleAction:'',actionStatus:1 })
// const formDetailScrapData = reactive<QcResultDetail>({ ...defaultFormDetailData,resultType: 2,handleAction:'',actionStatus:1 })
// const formDetailReworkData = reactive<QcResultDetail>({ ...defaultFormDetailData,resultType: 3,handleAction:'',actionStatus:1 })
// const formDetailConcessionData = reactive<QcResultDetail>({ ...defaultFormDetailData,resultType: 4,handleAction:'',actionStatus:1 })
let formDetailScrapData = reactive<QcResultDetail>({ ...defaultFormDetailData,resultType: 2,handleAction:'报废次品',actionStatus:1 })
let formDetailReworkData = reactive<QcResultDetail>({ ...defaultFormDetailData,resultType: 3,handleAction:'返工',actionStatus:1 })
let formDetailConcessionData = reactive<QcResultDetail>({ ...defaultFormDetailData,resultType: 4,handleAction:'让步接收',actionStatus:1 })
const assingWorkDisabled = ref(true)
@ -609,6 +634,8 @@ function handleAdd() {
function handleEdit(row: QualityTesting) {
modalTitle.value = '编辑质检单表'
assingWorkDisabled.value = true
console.log(row);
Object.assign(formData, row)
if (formData.inspectTime && typeof formData.inspectTime === 'string') {
formData.inspectTime = new Date(formData.inspectTime.replace(' ', 'T')).getTime()
@ -837,30 +864,43 @@ async function loadAssignWorkOrder() {
}
//
function submitResultDetail(row:any) {
if (row.traceType != 1) {
traceCodeShow.value = true
}
submitFlag.value = true
async function submitResultDetail(row:any) {
showSubmitOuter.value = true
qcId.value = row.id
}
let path = `/qc/submitDetail/${row.qcNo}/${row.id}/${submitFlag.value}/${row.traceCode}`
router.push(path)
function handleSubmitDetail(submitDetail:any){
formDetailOKData = submitDetail.okData ? submitDetail.okData : formDetailOKData ;
formDetailScrapData = submitDetail.scrapData ? submitDetail.scrapData : formDetailScrapData
formDetailReworkData = submitDetail.reworkData ? submitDetail.reworkData : formDetailReworkData
formDetailConcessionData = submitDetail.concessionData ? submitDetail.concessionData : formDetailConcessionData
}
//
function submitBFResultDetail(row:any) {
async function handleSubmitResultDetail() {
if (row.traceType != 1) {
traceCodeShow.value = true
}
submitFlag.value = false
formDetailOKData.qcId = qcId.value
formDetailScrapData.qcId = qcId.value
formDetailReworkData.qcId = qcId.value
formDetailConcessionData.qcId =qcId.value
let path = `/qc/submitDetail/${row.qcNo}/${row.id}/${submitFlag.value}/${traceCodeShow.value}`
router.push(path)
const submitParam = [
formDetailOKData,
formDetailScrapData,
formDetailReworkData,
formDetailConcessionData]
console.log(submitParam);
await qualityTestingApi.submit(submitParam)
message.success('提交成功')
router.go(-1)
}
@ -871,25 +911,6 @@ function queryResultDetail(row:any) {
router.push(path)
}
//
function handleCancelQuality(row:any) {
dialog.warning({
title: '提示',
content: '确定要撤回ID:'+row.id+'质检记录吗?',
positiveText: '确定',
negativeText: '取消',
onPositiveClick: async () => {
try {
await qualityTestingApi.cancel(row.id)
message.success('撤回成功')
loadData()
} catch (error) {
console.log("撤回失败"+error)
}
}
})
}

View File

@ -1,164 +1,43 @@
<template>
<div class="page-container">
<n-card :title="title" style="margin-bottom: 16px">
<n-card :title="title" >
<n-tabs type="card" animated>
<n-tab-pane name="合格" tab="合格">
<n-form ref="formRef" :model="formDetailOKData" label-placement="left" label-width="100px">
<n-grid x-gap="12" :cols="2">
<n-gi>
<n-form-item label="判定数量" path="qty">
<n-input-number v-model:value="formDetailOKData.qty" placeholder="请输入判定数量" :min="0" />
</n-form-item>
</n-gi>
<n-gi>
<n-form-item label="批次号或SN码" path="traceCode" v-show="traceCodeShow">
<n-input v-model:value="formDetailOKData.traceCode" placeholder="请输入批次号或SN码(启用追溯时必填)" />
</n-form-item>
</n-gi>
</n-grid>
<n-grid x-gap="8" :cols="3">
<n-gi>
<n-form-item label="备注" >
<n-input
v-model:value="formDetailOKData.remark"
type="textarea"
placeholder="输入备注原因"
<n-tab-pane name="合格" tab="合格" style="width: 50%;">
<SubmitDetailPage
key="ok"
:disabled="false"
:formDetailData="formDetailOKData"
:showTraceCode="true"
@update:formDetailData= handleFormDetailOKData
/>
</n-form-item>
</n-gi>
</n-grid>
</n-form>
</n-tab-pane>
<n-tab-pane name="报废" tab="报废">
<n-form ref="formRef" :model="formDetailScrapData" label-placement="left" label-width="100px">
<n-grid x-gap="12" :cols="2">
<n-gi>
<n-form-item label="判定数量" path="qty">
<n-input-number v-model:value="formDetailScrapData.qty" placeholder="请输入判定数量" :min="0" />
</n-form-item>
</n-gi>
<n-gi>
<n-form-item label="批次号或SN码" path="traceCode" v-show="traceCodeShow">
<n-input v-model:value="formDetailScrapData.traceCode" placeholder="请输入批次号或SN码(启用追溯时必填)" />
</n-form-item>
</n-gi>
</n-grid>
<n-grid x-gap="8" :cols="3">
<n-gi>
<n-form-item label="备注" >
<n-input
v-model:value="formDetailScrapData.remark"
type="textarea"
placeholder="输入备注原因"
<n-tab-pane name="报废" tab="报废" style="width: 50%;">
<SubmitDetailPage
key="scrap"
:disabled="false"
:formDetailData="formDetailScrapData"
:showTraceCode="true"
@update:formDetailData= handleFormDetailScrapData
/>
</n-form-item>
</n-gi>
</n-grid>
</n-form>
</n-tab-pane>
<n-tab-pane name="返工" tab="返工">
<n-form ref="formRef" :model="formDetailReworkData" label-placement="left" label-width="100px">
<n-grid x-gap="12" :cols="2">
<n-gi>
<n-form-item label="判定数量" path="qty">
<n-input-number v-model:value="formDetailReworkData.qty" placeholder="请输入判定数量" :min="0" />
</n-form-item>
</n-gi>
<n-gi>
<n-form-item label="批次号或SN码" path="traceCode" v-show="traceCodeShow">
<n-input v-model:value="formDetailReworkData.traceCode" placeholder="请输入批次号或SN码(启用追溯时必填)" />
</n-form-item>
</n-gi>
</n-grid>
<n-grid x-gap="8" :cols="3">
<n-gi>
<n-form-item label="备注" >
<n-input
v-model:value="formDetailReworkData.remark"
type="textarea"
placeholder="输入备注原因"
<n-tab-pane name="返工" tab="返工" style="width: 50%;">
<SubmitDetailPage
key="rework"
:disabled="false"
:formDetailData="formDetailReworkData"
:showTraceCode="true"
@update:formDetailData= handleFormDetailReworkData
/>
</n-form-item>
</n-gi>
</n-grid>
</n-form>
</n-tab-pane>
<n-tab-pane name="让步接收" tab="让步接收">
<n-form ref="formRef" :model="formDetailConcessionData" label-placement="left" label-width="100px">
<n-tab-pane name="让步接收" tab="让步接收" style="width: 50%;">
<n-grid x-gap="12" :cols="2">
<n-gi>
<n-form-item label="判定数量" path="qty">
<n-input-number v-model:value="formDetailConcessionData.qty" placeholder="请输入判定数量" :min="0" />
</n-form-item>
</n-gi>
<n-gi>
<n-form-item label="批次号或SN码" path="traceCode" v-show="traceCodeShow">
<n-input v-model:value="formDetailConcessionData.traceCode" placeholder="请输入批次号或SN码(启用追溯时必填)" />
</n-form-item>
</n-gi>
</n-grid>
<n-grid x-gap="8" :cols="3">
<n-gi>
<n-form-item label="备注" >
<n-input
v-model:value="formDetailConcessionData.remark"
type="textarea"
placeholder="输入备注原因"
<SubmitDetailPage
key="conession"
:disabled="false"
:formDetailData="formDetailConcessionData"
:showTraceCode="true"
@update:formDetailData= handleFormDetailConcessionData
/>
</n-form-item>
</n-gi>
</n-grid>
<n-grid x-gap="8" :cols="3">
<n-gi>
<n-form-item label="图片">
<n-upload
action="null"
:max="5"
:custom-request="()=>{}"
@change="handleUploadImageChange"
v-model:file-list="imageList"
list-type="image-card"
>
点击上传
</n-upload>
</n-form-item>
</n-gi>
</n-grid>
<n-grid x-gap="8" :cols="3">
<n-gi>
<n-form-item label="附件">
<n-upload
multiple
directory-dnd
:max="5"
:custom-request="()=>{}"
@change="handleUploadChange"
v-model:file-list="fileList"
accept=".pdf,.doc,.docx,.xls,.xlsx"
:max-size="10*1024*1024"
>
<n-upload-dragger>
<div style="margin-bottom: 12px">
<n-icon size="48" :depth="3">
<ArchiveIcon />
</n-icon>
</div>
<n-text style="font-size: 16px">
点击或者拖动文件到该区域来上传
</n-text>
<n-p depth="3" style="margin: 8px 0 0 0">
仅支持 PDFDOCDOCXXLSXLSXJPGPNGGIF单文件最大10MB
</n-p>
</n-upload-dragger>
</n-upload>
</n-form-item>
</n-gi>
</n-grid>
</n-form>
</n-tab-pane>
</n-tabs>
@ -179,33 +58,22 @@ import {
import {useRoute} from "vue-router";
import {QcResultDetail} from "@/api/qcResultDetail.ts";
import {qcResultDetailApi, type QcResultDetail} from "@/api/qcResultDetail.ts";
import {fileApi} from '@/api/system1'
import { qualityTestingApi} from '@/api/qualityTesting'
import router from '@/router';
import SubmitDetailPage from '@/components/SubmitDetailPage.vue';
const message = useMessage()
const route = useRoute()
const qcId =ref( Number(route.params.id))
const traceCode = ref(String(route.params.traceCode))
const traceCodeShow = ref(route.params.traceCodeShow === 'true')
const submitFlag = ref(route.params.submitFlag === 'true')
const MAX_FILE_SIZE = 10 * 1024 * 1024
//
const imageList = ref<any[]>([])
const uploadImages = ref<File[]>([])
const imageExts = ['jpg', 'jpeg', 'png']
//
const fileList = ref<any[]>([])
const uploadFiles = ref<File[]>([])
const fileExts = ['pdf', 'doc', 'docx', 'xls', 'xlsx']
const title = ref(`质检编号: ${route.params.qcNo}`)
@ -223,10 +91,29 @@ const defaultFormDetailData:QcResultDetail = {
attachments:[]
}
const formDetailOKData = reactive<QcResultDetail>({ ...defaultFormDetailData, resultType: 1,handleAction:'下一道工序',actionStatus:1 })
const formDetailScrapData = reactive<QcResultDetail>({ ...defaultFormDetailData,resultType: 2,handleAction:'报废次品',actionStatus:1 })
const formDetailReworkData = reactive<QcResultDetail>({ ...defaultFormDetailData,resultType: 3,handleAction:'返工',actionStatus:1 })
const formDetailConcessionData = reactive<QcResultDetail>({ ...defaultFormDetailData,resultType: 4,handleAction:'让步接收',actionStatus:1 })
const formDetailOKData = reactive<QcResultDetail>({ ...defaultFormDetailData,traceCode:traceCode.value, resultType: 1,handleAction:'下一道工序',actionStatus:1 })
const formDetailScrapData = reactive<QcResultDetail>({ ...defaultFormDetailData,traceCode:traceCode.value,resultType: 2,handleAction:'报废次品',actionStatus:1 })
const formDetailReworkData = reactive<QcResultDetail>({ ...defaultFormDetailData,traceCode:traceCode.value,resultType: 3,handleAction:'返工',actionStatus:1 })
const formDetailConcessionData = reactive<QcResultDetail>({ ...defaultFormDetailData,traceCode:traceCode.value,resultType: 4,handleAction:'让步接收',actionStatus:1 })
function handleFormDetailOKData(formDetailData:QcResultDetail) {
Object.assign(formDetailOKData, formDetailData)
}
function handleFormDetailScrapData(formDetailData:QcResultDetail) {
Object.assign(formDetailScrapData, formDetailData)
}
function handleFormDetailReworkData(formDetailData:QcResultDetail) {
Object.assign(formDetailReworkData, formDetailData)
}
function handleFormDetailConcessionData(formDetailData:QcResultDetail){
Object.assign(formDetailConcessionData, formDetailData)
}
async function handleSubmitResultDetail() {
@ -236,8 +123,6 @@ async function handleSubmitResultDetail() {
formDetailReworkData.qcId = qcId.value
formDetailConcessionData.qcId =qcId.value
formDetailConcessionData.images = uploadImages.value
formDetailConcessionData.attachments = uploadFiles.value
const submitParam = [
formDetailOKData,
@ -248,7 +133,7 @@ async function handleSubmitResultDetail() {
console.log(submitParam);
submitFlag.value? await qualityTestingApi.submit(submitParam) : await qualityTestingApi.submitBF(submitParam)
await qualityTestingApi.submit(submitParam)
message.success('提交成功')
router.go(-1)
@ -257,120 +142,28 @@ async function handleSubmitResultDetail() {
async function handleUploadChange ({ file, fileList }: { file: any, fileList: any[] }) {
const invalidNames: string[] = []
fileList.forEach(item => {
if (!item.file) return
const f = item.file
const ext = f.name.toLowerCase().split('.').pop() || ''
if (!fileExts.includes(ext)) {
invalidNames.push(f.name)
item.status = 'error'
}
if (invalidNames.length) {
message.error(`格式不支持:${invalidNames.join('、')}`)
}
const pendingList = fileList.filter(
item => item.status === 'pending' && item.file && item.status !== 'error'
)
if (pendingList.length === 0) return
const promises = pendingList.map(async (item) => {
try {
const res = await fileApi.uploadDingAttachment(item.file)
uploadFiles.value.push({ uid: item.id, ...res })
item.status = 'success'
item.percentage = 100
message.success("附件上传成功")
} catch (err) {
console.error('附件上传失败', err)
item.status = 'error'
}
})
// await Promise.all(promises)
// const successIds = fileList.filter(x => x.status === 'success').map(x => x.id)
// uploadFiles.value = uploadFiles.value.filter(att => successIds.includes(att.uid))
})
}
async function handleUploadImageChange({ file, fileList }: { file: any, fileList: any[] }) {
const invalidNames: string[] = []
fileList.forEach(item => {
if (!item.file) return
const f = item.file
const ext = f.name.toLowerCase().split('.').pop() || ''
if (!imageExts.includes(ext)) {
invalidNames.push(f.name)
item.status = 'error'
}
if (f.size > MAX_FILE_SIZE) {
message.error(`${f.name} 超出10MB大小限制`)
item.status = 'error'
}
})
if (invalidNames.length) {
message.error(`格式不支持:${invalidNames.join('、')}`)
}
// 2.
const pendingList = fileList.filter(
item => item.status === 'pending' && item.file && item.status !== 'error'
)
if (pendingList.length === 0) return
// 3.
const promises = pendingList.map(async (item) => {
try {
const res = await fileApi.uploadDingImage(item.file)
uploadImages.value.push({ uid: item.id, ...res })
item.status = 'success'
item.percentage = 100
message.success("上传成功")
} catch (err) {
console.error('图片上传失败', err)
item.status = 'error'
}
})
// await Promise.all(promises)
// const successIds = fileList.filter(x => x.status === 'success').map(x => x.id)
// uploadImages.value = uploadImages.value.filter(img => successIds.includes(img.uid))
}
function handleReset() {
Object.assign(formDetailOKData, { ...defaultFormDetailData, resultType: 1, handleAction: '下一道工序', actionStatus: 1 })
Object.assign(formDetailScrapData, { ...defaultFormDetailData, resultType: 2, handleAction: '报废次品', actionStatus: 1 })
Object.assign(formDetailReworkData, { ...defaultFormDetailData, resultType: 3, handleAction: '返工', actionStatus: 1 })
Object.assign(formDetailConcessionData, { ...defaultFormDetailData, resultType: 4, handleAction: '让步接收', actionStatus: 1 })
imageList.value = []
uploadImages.value = []
fileList.value = []
uploadFiles.value = []
message.info("表单已重置")
}
onMounted(()=>{
async function loadData() {
if(qcId.value != null || qcId.value != '') {
//qcId
const resultList = await qcResultDetailApi.selectlistByqcId(qcId.value);
Object.assign(formDetailOKData,{...resultList.formDetailOKData})
Object.assign(formDetailScrapData,{...resultList.formDetailScrapData})
}
}
onMounted(()=>{
loadData()
})
</script>
<style>

View File

@ -31,7 +31,7 @@
<!-- 工具栏 -->
<div class="table-toolbar">
<n-space>
<n-button type="primary" @click="handleStatistics">
<n-button type="primary" @click="handleStatistics" disabled>
<template #icon></template>
汇报统计
</n-button>
@ -235,8 +235,8 @@ const qcResultTypeOptions = ref<{ label: string; value: any;class:any }[]>([])
const qcSourceTypeOptions = ref<{ label: string; value: any;class:any }[]>([])
//
const qcStatusOptions = ref<{ label: string; value: any;class:any }[]>([])
//
const qcAssingStatusOptions = ref<{ label: string; value: any ;class:any}[]>([])
//
const submitStatusOptions = ref<{ label: string; value: any ;class:any}[]>([])
//
const formRules = {
}
@ -261,37 +261,19 @@ const columns: DataTableColumns<SubmitLog> = [
},
{ title: '工序名称', key: 'processName',align: 'center' },
{ title: '工序编号', key: 'processCode',align: 'center' },
{ title: '汇报数量', key: 'quantity',align: 'center'},
{ title: '派工编号', key: 'assingCode',align: 'center' },
{ title: '派工人', key: 'userName',align: 'center' },
{ title: '派工状态', key: 'assingStatus',align: 'center',
{ title: '汇报人', key: 'userName',align: 'center' },
{ title: '派工状态', key: 'submitStatus',align: 'center',
render: (row) => {
const val = row.assingStatus
const opt = qcAssingStatusOptions.value.find(o => o.value === val || String(o.value) === String(val))
const val = row.submitStatus
const opt = submitStatusOptions.value.find(o => o.value === val || String(o.value) === String(val))
if (!opt) return val ?? '-'
return h(NTag, { type: opt.class, size: 'small' }, { default: () => opt.label })
}
},
{ title: '派工完成时间', key: 'completedTime',align: 'center'},
{
title: '操作',
key: 'actions',
width: 140,
fixed: 'right',
render(row) {
return h('div', { style: { display: 'flex', alignItems: 'center', gap: '8px', flexWrap: 'nowrap' } }, [
h(NButton, { size: 'small', quaternary: true, onClick: () => handleViewReport(row) }, {
default: () => ['汇报信息']
}),
// h(NButton, { size: 'small', quaternary: true, onClick: () => handleEdit(row) }, {
// default: () => [h(NIcon, null, { default: () => h(CreateOutline) }), ' ']
// }),
// h(NButton, { size: 'small', quaternary: true, type: 'error', onClick: () => handleDelete(row) }, {
// default: () => [h(NIcon, null, { default: () => h(TrashOutline) }), ' ']
// })
])
}
}
{ title: '撤回原因', key: 'remark',align: 'center' },
]
//
@ -505,8 +487,8 @@ async function loadDictOptions() {
qcStatusOptions.value = data.map(d => ({ label: d.dictLabel, value: (Number(d.dictValue) || d.dictValue),class:d.listClass }))
}catch {}
try {
const data = await dictDataApi.listByType('assing_status')
qcAssingStatusOptions.value = data.map(d => ({ label: d.dictLabel, value: (Number(d.dictValue) || d.dictValue),class:d.listClass }))
const data = await dictDataApi.listByType('submit_status')
submitStatusOptions.value = data.map(d => ({ label: d.dictLabel, value: (Number(d.dictValue) || d.dictValue),class:d.listClass }))
}catch {}
}

View File

@ -130,6 +130,7 @@
:showScrapTab="true"
:showReworkTab = false
:showTraceCode="false"
:qcId="-1"
@updateSubmitDetail="handleSubmitDetail"
/>
@ -142,11 +143,42 @@
:loading="pauseLoading"
@click="pauseSubmit"
:disabled="pauseisedbtn"
>保存</n-button>
>确认</n-button>
</n-space>
</template>
</n-modal>
<!-- 质检撤回弹框 -->
<n-modal
v-model:show="qcCancelModel"
title="提示"
preset="card"
style="width: 400px"
:mask-closable="false"
>
<n-card title="确定要撤回质检记录吗?">
<n-form ref="formRef" :model="qcCancelFormData" label-placement="left" label-width="100px">
<n-form-item label="备注" label-width="100">
<n-input
v-model:value="qcCancelFormData.remark"
type="textarea"
placeholder="输入撤回原因"
/>
</n-form-item>
</n-form>
<template #footer>
<n-space justify="end">
<n-button @click="qcCancelModel = false">取消</n-button>
<n-button
type="primary"
@click="cancelSubmit"
>确认</n-button>
</n-space>
</template>
</n-card>
</n-modal>
</div>
@ -191,6 +223,7 @@ import type { PlmModelOpenContext } from '@/api/plmModel'
import AssingWorkVue from '@/views/biz/flowingAround/assingWork.vue'
import { qualityTestingApi, type QualityTesting } from '@/api/qualityTesting'
import SumbitDetailCard from '@/components/SumbitDetailCard.vue'
import { SubmitLog } from '@/api/submitLog'
const dialog = useDialog()
@ -514,8 +547,28 @@ let pausemodal = ref(false)
let pauseform = reactive<any>({
id:'',
qcNum:'',
okData:undefined,
scrapData:undefined
okData:{
id:undefined,
qcId:undefined,
resultType:undefined,
qty:0,
traceCode:undefined,
defectCode:undefined,
handleAction:undefined,
actionStatus:undefined,
remark:undefined,
},
scrapData:{
id:undefined,
qcId:undefined,
resultType:undefined,
qty:0,
traceCode:undefined,
defectCode:undefined,
handleAction:undefined,
actionStatus:undefined,
remark:undefined,
}
})
const pauseformRef = ref()
@ -541,6 +594,18 @@ const pauserules = {
let pauseLoading = ref(false)
let pauseisedbtn = ref(false)
//
const qcCancelModel = ref<Boolean>(false)
const qcCancelFormData = ref<SubmitLog>({
assingWorkId:undefined,
remark:undefined
})
let qcCancelLoading = ref<Boolean>(false)
let qcDisabledBtn = ref<Boolean>(false)
function handlpause(n:any) {
gxobg.id = n.id
gxobg.name = n.name
@ -565,8 +630,38 @@ function checkPauseSumbit():boolean {
return false
}
if(pauseform.okData == null || pauseform.okData == '' ) {
pauseform.okData={
id:undefined,
qcId:undefined,
resultType:undefined,
qty:0,
traceCode:undefined,
defectCode:undefined,
handleAction:undefined,
actionStatus:undefined,
remark:undefined,
}
}
if(pauseform.scrapData == null || pauseform.scrapData == '' ) {
pauseform.scrapData={
id:undefined,
qcId:undefined,
resultType:undefined,
qty:0,
traceCode:undefined,
defectCode:undefined,
handleAction:undefined,
actionStatus:undefined,
remark:undefined,
}
}
//
const checkNum = pauseform.okData?.qty + pauseform.scrapData?.qty
const okQty = pauseform.okData?.qty ?? 0
const scrapQty = pauseform.scrapData?.qty ?? 0
const checkNum = okQty + scrapQty
if(checkNum != pauseform.qcNum) {
message.error("汇报数量总和不等于提交数量")
@ -606,7 +701,6 @@ function handleUpdateQcNum(qcNum:number) {
function handleSubmitDetail(submitDetail:any){
pauseform.okData = submitDetail.okData
pauseform.scrapData = submitDetail.scrapData
console.log(pauseform);
@ -614,6 +708,7 @@ function handleSubmitDetail(submitDetail:any){
//
async function loadDictOptions() {
qcCancelLoading = true
try {
const data = await dictDataApi.listByType('assing_status')
qcAssingStatusOptions.value = data.map(d => ({ label: d.dictLabel, value: (Number(d.dictValue) || d.dictValue),class:d.listClass }))
@ -636,21 +731,37 @@ async function loadDictOptions() {
// }
function cancelQuality(row:any) {
dialog.warning({
title: '提示',
content: '确定要撤回质检记录吗?',
positiveText: '确定',
negativeText: '取消',
onPositiveClick: async () => {
try {
await qualityTestingApi.cancel(row.id)
qcCancelModel.value = true
qcCancelFormData.value.assingWorkId = row.id
qcCancelLoading.value = true
qcDisabledBtn.value = true
// dialog.warning({
// title: '',
// content: '',
// positiveText: '',
// negativeText: '',
// onPositiveClick: async () => {
// try {
// await qualityTestingApi.cancel(row.id)
// message.success('')
// getlist()
// } catch (error) {
// console.log(""+error)
// }
// }
// })
}
async function cancelSubmit() {
try{
await qualityTestingApi.cancel({"assingId":qcCancelFormData.value.assingWorkId,"remark":qcCancelFormData.value.remark})
message.success('撤回成功')
qcCancelModel.value = false
getlist()
} catch (error) {
console.log("撤回失败"+error)
}catch(error) {
console.log("撤回失败"+error);
}
}
})
}
onMounted(() => {