完工汇报质检详情 撤回
This commit is contained in:
parent
3c02f65a44
commit
45815cb602
@ -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'
|
||||
})
|
||||
}
|
||||
}
|
||||
@ -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 })
|
||||
},
|
||||
|
||||
// 导出
|
||||
|
||||
@ -22,6 +22,8 @@ export interface SubmitLog {
|
||||
|
||||
assingStatus?: number
|
||||
|
||||
remark?: string
|
||||
|
||||
}
|
||||
|
||||
// 派工工单汇报记录 API
|
||||
|
||||
@ -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>
|
||||
@ -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 {}
|
||||
}
|
||||
|
||||
|
||||
@ -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
|
||||
async function submitResultDetail(row:any) {
|
||||
showSubmitOuter.value = true
|
||||
qcId.value = row.id
|
||||
}
|
||||
submitFlag.value = true
|
||||
|
||||
|
||||
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)
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@ -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">
|
||||
仅支持 PDF、DOC、DOCX、XLS、XLSX、JPG、PNG、GIF,单文件最大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>
|
||||
|
||||
@ -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 {}
|
||||
}
|
||||
|
||||
|
||||
@ -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,22 +731,38 @@ async function loadDictOptions() {
|
||||
// }
|
||||
|
||||
function cancelQuality(row:any) {
|
||||
dialog.warning({
|
||||
title: '提示',
|
||||
content: '确定要撤回质检记录吗?',
|
||||
positiveText: '确定',
|
||||
negativeText: '取消',
|
||||
onPositiveClick: async () => {
|
||||
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(row.id)
|
||||
await qualityTestingApi.cancel({"assingId":qcCancelFormData.value.assingWorkId,"remark":qcCancelFormData.value.remark})
|
||||
message.success('撤回成功')
|
||||
qcCancelModel.value = false
|
||||
getlist()
|
||||
}catch(error) {
|
||||
console.log("撤回失败"+error)
|
||||
console.log("撤回失败"+error);
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
onMounted(() => {
|
||||
getlist()
|
||||
|
||||
Loading…
Reference in New Issue
Block a user