<script setup lang="ts">
|
import { computed, onMounted, ref, watch } from 'vue';
|
import { jsonClone } from '@sa/utils';
|
import { fetchCreateMatcheck, fetchUpdateMatcheck, fetchCheckItemList } from '@/service/api/qm/matcheck';
|
import { useFormRules, useNaiveForm } from '@/hooks/common/form';
|
import { $t } from '@/locales';
|
import { useRoute } from 'vue-router';
|
|
defineOptions({
|
name: 'MatcheckOperateDrawer'
|
});
|
|
interface Props {
|
/** the type of operation */
|
operateType: NaiveUI.TableOperateType;
|
/** the edit row data */
|
rowData?: Api.Qm.Matcheck | null;
|
}
|
|
const props = defineProps<Props>();
|
|
interface Emits {
|
(e: 'submitted'): void;
|
}
|
|
const emit = defineEmits<Emits>();
|
|
const visible = defineModel<boolean>('visible', {
|
default: false
|
});
|
|
const { formRef, validate, restoreValidation } = useNaiveForm();
|
const { createRequiredRule } = useFormRules();
|
const route = useRoute();
|
|
// 检验项选项
|
const checkItemOptions = ref<CommonType.Option[]>([]);
|
|
// 获取检验项选项
|
async function getCheckItemOptions() {
|
const judgeCode = Array.isArray(route.query.judgeCode) ? route.query.judgeCode[0] : route.query.judgeCode;
|
if (!judgeCode) {
|
checkItemOptions.value = [];
|
return;
|
}
|
|
const { data, error } = await fetchCheckItemList({ judgeId: judgeCode });
|
if (!error && data) {
|
checkItemOptions.value = data.map(item => ({
|
label: item.itemName, // 接口返回的字段是 item_name
|
value: item.itemCode // 接口返回的字段是 item_code
|
}));
|
}
|
}
|
|
const title = computed(() => {
|
const titles: Record<NaiveUI.TableOperateType, string> = {
|
add: '新增材料检验统计',
|
edit: '编辑材料检验统计'
|
};
|
return titles[props.operateType];
|
});
|
|
type Model = Api.Qm.MatcheckOperateParams;
|
|
const model = ref<Model>(createDefaultModel());
|
|
const generateDetailsChecked = computed<string | number | boolean | undefined>({
|
get() {
|
return model.value.generateDetails ?? '0';
|
},
|
set(value) {
|
model.value.generateDetails = String(value ?? '0');
|
}
|
});
|
|
|
function createDefaultModel(): Model {
|
// 获取当前日期,格式为 yyyy-MM-dd
|
const today = new Date().toISOString().split('T')[0];
|
const matCode = (route.query.matCode as string) || '';
|
|
return {
|
id: '',
|
pid: '',
|
batchCode: route.query.batchCode as string || '',
|
matCode,
|
instrumentCode: '',
|
techReq: '',
|
checkStd: '',
|
testEnv: '',
|
itemCode: '',
|
subBatchCode: '',
|
sampleNumber: null,
|
sampleType: null,
|
checkName: '',
|
checkTime: today,
|
reviewName: '',
|
reviewTime: null,
|
maxval: null,
|
minval: null,
|
avgval: null,
|
sdval: null,
|
cvval: null,
|
cpkval: null,
|
badval: null,
|
judge: '',
|
singlejudge: '',
|
verName: '',
|
verCode: '',
|
archDate: '',
|
del: null,
|
flag: '',
|
toMesTime: null,
|
chkDes: '',
|
generateDetails: '0'
|
};
|
}
|
|
type RuleKey = Extract<
|
keyof Model,
|
| 'id'
|
>;
|
|
const rules: Record<RuleKey, App.Global.FormRule> = {
|
id: createRequiredRule('主键,编码不能为空'),
|
};
|
|
function handleUpdateModelWhenEdit() {
|
model.value = createDefaultModel();
|
|
if (props.operateType === 'edit' && props.rowData) {
|
Object.assign(model.value, jsonClone(props.rowData));
|
model.value.generateDetails = model.value.generateDetails ?? '0';
|
}
|
}
|
|
function closeDrawer() {
|
visible.value = false;
|
}
|
|
async function handleSubmit() {
|
await validate();
|
|
const { id, pid, batchCode, matCode, instrumentCode, techReq, checkStd, testEnv, itemCode, subBatchCode, sampleNumber, sampleType, checkName, checkTime, reviewName, reviewTime, maxval, minval, avgval, sdval, cvval, cpkval, badval, judge, singlejudge, verName, verCode, archDate, del, flag, toMesTime, chkDes, generateDetails } = model.value;
|
|
// request
|
if (props.operateType === 'add') {
|
const { error } = await fetchCreateMatcheck({ id, pid, batchCode, matCode, instrumentCode, techReq, checkStd, testEnv, itemCode, subBatchCode, sampleNumber, sampleType, checkName, checkTime, reviewName, reviewTime, maxval, minval, avgval, sdval, cvval, cpkval, badval, judge, singlejudge, verName, verCode, archDate, del, flag, toMesTime, chkDes, generateDetails });
|
if (error) return;
|
}
|
|
if (props.operateType === 'edit') {
|
const { error } = await fetchUpdateMatcheck({ id, pid, batchCode, matCode, instrumentCode, techReq, checkStd, testEnv, itemCode, subBatchCode, sampleNumber, sampleType, checkName, checkTime, reviewName, reviewTime, maxval, minval, avgval, sdval, cvval, cpkval, badval, judge, singlejudge, verName, verCode, archDate, del, flag, toMesTime, chkDes, generateDetails });
|
if (error) return;
|
}
|
|
window.$message?.success($t('common.updateSuccess'));
|
closeDrawer();
|
emit('submitted');
|
}
|
|
onMounted(() => {
|
getCheckItemOptions();
|
});
|
|
watch(visible, () => {
|
if (visible.value) {
|
handleUpdateModelWhenEdit();
|
restoreValidation();
|
getCheckItemOptions();
|
}
|
});
|
</script>
|
|
<template>
|
<NDrawer v-model:show="visible" :title="title" display-directive="show" :width="800" class="max-w-90%">
|
<NDrawerContent :title="title" :native-scrollbar="false" closable>
|
<NForm ref="formRef" :model="model" :rules="rules" label-placement="left" :label-width="180">
|
<NFormItem label="批次号" path="batchCode">
|
<NInput v-model:value="model.batchCode" placeholder="批次号" :disabled="true" />
|
</NFormItem>
|
<NFormItem label="检验项" path="itemCode">
|
<NSelect
|
v-model:value="model.itemCode"
|
placeholder="请选择检验项"
|
:options="checkItemOptions"
|
clearable
|
filterable
|
/>
|
</NFormItem>
|
<NFormItem label="盘号" path="subBatchCode">
|
<NInput v-model:value="model.subBatchCode" placeholder="请输入盘号" />
|
</NFormItem>
|
<NFormItem path="maxval">
|
<template #label>
|
最大值/<br>
|
烟丝质量/<br>
|
(含末率)
|
</template>
|
<NInputNumber v-model:value="model.maxval" placeholder="请输入最大值" class="w-full" />
|
</NFormItem>
|
<NFormItem path="minval">
|
<template #label>
|
最小值/<br>
|
烟末质量/<br>
|
(含末率)
|
</template>
|
<NInputNumber v-model:value="model.minval" placeholder="请输入最小值" class="w-full" />
|
</NFormItem>
|
<NFormItem path="avgval">
|
<template #label>
|
平均值/<br>
|
含末率
|
</template>
|
<NInputNumber v-model:value="model.avgval" placeholder="请输入平均值" class="w-full" />
|
</NFormItem>
|
<NFormItem label="SD值" path="sdval">
|
<NInputNumber v-model:value="model.sdval" placeholder="请输入SD值" class="w-full" />
|
</NFormItem>
|
<NFormItem label="CV值" path="cvval">
|
<NInputNumber v-model:value="model.cvval" placeholder="请输入CV值" class="w-full" />
|
</NFormItem>
|
<NFormItem label="CPK值" path="cpkval">
|
<NInputNumber v-model:value="model.cpkval" placeholder="请输入CPK值" class="w-full" />
|
</NFormItem>
|
<NFormItem label="超标数" path="badval">
|
<NInputNumber v-model:value="model.badval" placeholder="请输入超标数" class="w-full" />
|
</NFormItem>
|
<NFormItem label="检验日期" path="checkTime">
|
<NDatePicker
|
v-model:formatted-value="model.checkTime"
|
type="date"
|
value-format="yyyy-MM-dd"
|
clearable
|
/>
|
</NFormItem>
|
<NFormItem label="判定" path="judge">
|
<NInput v-model:value="model.judge" placeholder="请输入判定" />
|
</NFormItem>
|
<NFormItem label="单项判定" path="singlejudge">
|
<NInput v-model:value="model.singlejudge" placeholder="请输入单项判定" />
|
</NFormItem>
|
<NFormItem label="描述" path="chkDes">
|
<NInput v-model:value="model.chkDes" placeholder="请输入描述" />
|
</NFormItem>
|
<NFormItem label="生成明细" path="generateDetails">
|
<NCheckbox v-model:checked="generateDetailsChecked" checked-value="1" unchecked-value="0" />
|
</NFormItem>
|
</NForm>
|
<template #footer>
|
<NSpace :size="16">
|
<NButton @click="closeDrawer">{{ $t('common.cancel') }}</NButton>
|
<NButton type="primary" @click="handleSubmit">{{ $t('common.confirm') }}</NButton>
|
</NSpace>
|
</template>
|
</NDrawerContent>
|
</NDrawer>
|
</template>
|
|
<style scoped>
|
.n-form-item-label {
|
white-space: pre-line;
|
line-height: 1.4;
|
}
|
</style>
|