| | |
| | | prop="weighingDate" |
| | | v-if="type === '0'" |
| | | show-overflow-tooltip/> |
| | | <el-table-column label="净重(吨)" |
| | | prop="netWeight" |
| | | v-if="type === '0'" |
| | | show-overflow-tooltip/> |
| | | </el-table> |
| | | <pagination v-show="total > 0" |
| | | :total="total" |
| | |
| | | :page="page" |
| | | :tableLoading="tableLoading" |
| | | @pagination="pagination"> |
| | | <template #inputQuantitySlot="{ row }"> |
| | | {{ row.inputQuantity === 0 ? '-' : row.inputQuantity }} |
| | | </template> |
| | | <template #outputQuantitySlot="{ row }"> |
| | | {{ row.outputQuantity === 0 ? '-' : row.inputQuantity }} |
| | | </template> |
| | | </PIMTable> |
| | | </div> |
| | | </div> |
| | |
| | | label: "投入数量", |
| | | prop: "inputQuantity", |
| | | width: "140", |
| | | dataType: 'slot', |
| | | slot: 'inputQuantitySlot', |
| | | }, |
| | | { |
| | | label: "产出数量", |
| | | prop: "outputQuantity", |
| | | width: "140", |
| | | dataType: 'slot', |
| | | slot: 'outputQuantitySlot', |
| | | } |
| | | ]); |
| | | const tableData = ref([]); |
| | |
| | | <style scoped lang="scss"> |
| | | .search_form { |
| | | margin-bottom: 20px; |
| | | |
| | | .search-row { |
| | | display: flex; |
| | | gap: 20px; |
| | | align-items: center; |
| | | |
| | | .search-item { |
| | | display: flex; |
| | | align-items: center; |
| | |
| | | display: flex; |
| | | gap: 20px; |
| | | height: 350px; |
| | | |
| | | .transfer-card-info { |
| | | flex: 1; |
| | | overflow: auto; |
| | | |
| | | .info-group { |
| | | width: 50%; |
| | | float: left; |
| | | } |
| | | |
| | | .info-item { |
| | | display: flex; |
| | | margin-bottom: 15px; |
| | | |
| | | .info-label { |
| | | width: 120px; |
| | | font-weight: bold; |
| | | margin-right: 20px; |
| | | } |
| | | |
| | | .info-value { |
| | | flex: 1; |
| | | } |
| | | } |
| | | } |
| | | |
| | | .transfer-card-qr { |
| | | width: 240px; |
| | | display: flex; |
| | |
| | | } |
| | | </style> |
| | | |
| | | <style lang="scss"> |
| | | <style lang="scss"> |
| | | @media print { |
| | | @page { |
| | | size: landscape; |
| | |
| | | } |
| | | .transfer-card-info { |
| | | flex: 1; |
| | | |
| | | .info-group { |
| | | width: 100%; |
| | | float: none; |
| | | margin-bottom: 20px; |
| | | } |
| | | |
| | | .info-item { |
| | | display: flex; |
| | | margin-bottom: 10px; |
| | | |
| | | .info-label { |
| | | width: 100px; |
| | | font-weight: bold; |
| | | margin-right: 15px; |
| | | white-space: nowrap; |
| | | } |
| | | |
| | | .info-value { |
| | | flex: 1; |
| | | word-break: break-word; |
| | |
| | | height: 140px !important; |
| | | } |
| | | } |
| | | </style> |
| | | </style> |
| | |
| | | <el-row :gutter="30"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="检验员:" prop="checkName"> |
| | | <el-input v-model="form.checkName" placeholder="请输入" clearable/> |
| | | <el-select v-model="form.checkName" placeholder="请选择" clearable filterable style="width: 100%"> |
| | | <el-option v-for="item in userList" :key="item.nickName" :label="item.nickName" |
| | | :value="item.nickName"/> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | |
| | | <el-row :gutter="30"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="处理人:" prop="dealName"> |
| | | <el-input v-model="form.dealName" placeholder="请输入" clearable/> |
| | | <el-select v-model="form.dealName" placeholder="请选择" clearable filterable style="width: 100%"> |
| | | <el-option v-for="item in userList" :key="item.nickName" :label="item.nickName" |
| | | :value="item.nickName"/> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | |
| | | </template> |
| | | |
| | | <script setup> |
| | | import {ref} from "vue"; |
| | | import {ref, reactive, toRefs, getCurrentInstance} from "vue"; |
| | | import {modelList, productTreeList} from "@/api/basicData/product.js"; |
| | | import { |
| | | getQualityUnqualifiedInfo, |
| | | qualityUnqualifiedAdd, |
| | | qualityUnqualifiedUpdate |
| | | } from "@/api/qualityManagement/nonconformingManagement.js"; |
| | | import {userListNoPage} from "@/api/system/user.js"; |
| | | const { proxy } = getCurrentInstance() |
| | | const emit = defineEmits(['close']) |
| | | |
| | |
| | | }, |
| | | }); |
| | | const { form, rules } = toRefs(data); |
| | | const userList = ref([]); |
| | | const productOptions = ref([]); |
| | | const modelOptions = ref([]) |
| | | |
| | | // 打开弹框 |
| | | const openDialog = (type, row) => { |
| | | operationType.value = type; |
| | | userListNoPage().then(res => { |
| | | userList.value = res.data || []; |
| | | }) |
| | | dialogFormVisible.value = true; |
| | | form.value = {} |
| | | getProductOptions(); |
| | |
| | | <el-row :gutter="30"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="工序:" prop="process"> |
| | | <el-input v-model="form.process" placeholder="请输入工序" clearable /> |
| | | <el-select v-model="form.process" placeholder="请选择工序" clearable filterable @change="getList" style="width: 100%"> |
| | | <el-option v-for="item in processOptions" :key="item.id" :label="item.processName || item.name" |
| | | :value="item.processName || item.name"/> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | |
| | | import {qualityInspectAdd, qualityInspectUpdate} from "@/api/qualityManagement/rawMaterialInspection.js"; |
| | | import {qualityInspectDetailByProductId, getQualityTestStandardParamByTestStandardId} from "@/api/qualityManagement/metricMaintenance.js"; |
| | | import {userListNoPage} from "@/api/system/user.js"; |
| | | import {processList} from "@/api/productionManagement/productionProcess.js"; |
| | | import {qualityInspectParamInfo} from "@/api/qualityManagement/qualityInspectParam.js"; |
| | | const { proxy } = getCurrentInstance() |
| | | const emit = defineEmits(['close']) |
| | |
| | | }, |
| | | }); |
| | | const userList = ref([]); |
| | | const processOptions = ref([]); |
| | | const { form, rules } = toRefs(data); |
| | | const supplierList = ref([]); |
| | | const productOptions = ref([]); |
| | |
| | | }); |
| | | let userLists = await userListNoPage(); |
| | | userList.value = userLists.data; |
| | | processList({}).then((res) => { |
| | | processOptions.value = res.data || []; |
| | | }); |
| | | // 先重置表单数据(保持字段完整,避免弹窗首次渲染时触发必填红框“闪一下”) |
| | | form.value = { |
| | | checkTime: "", |
| | |
| | | <el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef"> |
| | | <el-row :gutter="30"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="供应商:" prop="supplier"> |
| | | <el-select |
| | | v-model="form.supplier" |
| | | placeholder="请选择" |
| | | clearable |
| | | > |
| | | <el-option |
| | | v-for="item in supplierList" |
| | | :key="item.id" |
| | | :label="item.supplierName" |
| | | :value="item.supplierName" |
| | | /> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="产品名称:" prop="productId"> |
| | | <el-tree-select |
| | | v-model="form.productId" |
| | |
| | | <el-row :gutter="30"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="检验员:" prop="checkName"> |
| | | <el-input v-model="form.checkName" placeholder="请输入" clearable/> |
| | | <el-select v-model="form.checkName" placeholder="请选择" clearable filterable style="width: 100%"> |
| | | <el-option v-for="item in userList" :key="item.nickName" :label="item.nickName" |
| | | :value="item.nickName"/> |
| | | </el-select> |
| | | |
| | | </el-form-item> |
| | | </el-col> |
| | |
| | | |
| | | <script setup> |
| | | import {ref, reactive, toRefs, getCurrentInstance, nextTick} from "vue"; |
| | | import {getOptions} from "@/api/procurementManagement/procurementLedger.js"; |
| | | import {modelList, productTreeList} from "@/api/basicData/product.js"; |
| | | import {qualityInspectAdd, qualityInspectUpdate} from "@/api/qualityManagement/rawMaterialInspection.js"; |
| | | import {qualityInspectParamDel, qualityInspectParamInfo} from "@/api/qualityManagement/qualityInspectParam.js"; |
| | | import {qualityInspectDetailByProductId, getQualityTestStandardParamByTestStandardId} from "@/api/qualityManagement/metricMaintenance.js"; |
| | | import {userListNoPage} from "@/api/system/user.js"; |
| | | |
| | | const {proxy} = getCurrentInstance() |
| | | const emit = defineEmits(['close']) |
| | |
| | | const tableLoading = ref(false); |
| | | |
| | | const {form, rules} = toRefs(data); |
| | | const supplierList = ref([]); |
| | | const userList = ref([]); |
| | | const productOptions = ref([]); |
| | | const currentProductId = ref(0); |
| | | const testStandardOptions = ref([]); // 指标选择下拉框数据 |
| | |
| | | // 打开弹框 |
| | | const openDialog = async (type, row) => { |
| | | operationType.value = type; |
| | | getOptions().then((res) => { |
| | | supplierList.value = res.data; |
| | | }); |
| | | userListNoPage().then(res => { |
| | | userList.value = res.data || []; |
| | | }) |
| | | // 先重置表单数据(保持字段完整,避免弹窗首次渲染时触发必填红框“闪一下”) |
| | | form.value = { |
| | | checkTime: "", |
| | |
| | | width: 120 |
| | | }, |
| | | { |
| | | label: "采购订单号", |
| | | prop: "purchaseContractNo", |
| | | width: 120 |
| | | }, |
| | | { |
| | | label: "供应商", |
| | | prop: "supplier", |
| | | width: 230 |
| | | }, |
| | | { |
| | | label: "检验员", |
| | | prop: "checkName", |
| | | }, |
| | |
| | | itemHeight: 12, |
| | | textStyle: { color: '#B8C8E0', fontSize: 14 }, |
| | | data: [ |
| | | { name: '出库', itemStyle: { color: 'rgba(11, 137, 254, 1)' } }, |
| | | { name: '入库', itemStyle: { color: 'rgba(11, 249, 254, 1)' } }, |
| | | { name: '产出', itemStyle: { color: 'rgba(11, 137, 254, 1)' } }, |
| | | { name: '投入', itemStyle: { color: 'rgba(11, 249, 254, 1)' } }, |
| | | ], |
| | | } |
| | | |
| | |
| | | |
| | | const lineSeries = ref([ |
| | | { |
| | | name: '出库', |
| | | name: '产出', |
| | | type: 'line', |
| | | smooth: false, |
| | | showSymbol: true, |
| | |
| | | emphasis: { focus: 'series' }, |
| | | }, |
| | | { |
| | | name: '入库', |
| | | name: '投入', |
| | | type: 'line', |
| | | smooth: false, |
| | | showSymbol: true, |
| | |
| | | formatter(params) { |
| | | let result = params[0].axisValueLabel + '<br/>' |
| | | params.forEach((item) => { |
| | | result += `<div>${item.marker} ${item.seriesName}: ${item.value} 元</div>` |
| | | result += `<div>${item.marker} ${item.seriesName}: ${item.value} 件</div>` |
| | | }) |
| | | return result |
| | | }, |
| | |
| | | { type: 'category', axisTick: { show: false }, axisLabel: { color: '#B8C8E0' }, data: [] }, |
| | | ]) |
| | | const yAxis1 = [ |
| | | { type: 'value', name: '单位: 元', axisLabel: { color: '#B8C8E0' }, nameTextStyle: { color: '#B8C8E0' }, splitLine: { lineStyle: { color: 'rgba(184, 200, 224, 0.2)' } } }, |
| | | { type: 'value', name: '单位: 件', axisLabel: { color: '#B8C8E0' }, nameTextStyle: { color: '#B8C8E0' }, splitLine: { lineStyle: { color: 'rgba(184, 200, 224, 0.2)' } } }, |
| | | ] |
| | | |
| | | const handleDateTypeChange = () => { |
| | |
| | | |
| | | // 兼容字段:有的接口返回 dateStr,有的返回 date |
| | | xAxis1.value[0].data = items.map((d) => d.dateStr ?? d.date ?? '') |
| | | chartSeries.value[0].data = items.map((d) => parseFloat(d.amount) || 0) |
| | | chartSeries.value[0].data = items.map((d) => parseFloat(d.numberOfCompleted) || 0) |
| | | }) |
| | | .catch((err) => { |
| | | console.error('获取生产核算分析失败:', err) |
| | |
| | | |
| | | // 选择变化处理 |
| | | const handleSelectionChange = selection => { |
| | | // 主表格也只保留最后一个选中的项 |
| | | if (selection.length > 1) { |
| | | const lastSelected = selection[selection.length - 1]; |
| | | selectedIds.value = [lastSelected.id]; |
| | | } else if (selection.length === 1) { |
| | | selectedIds.value = [selection[0].id]; |
| | | } else { |
| | | selectedIds.value = []; |
| | | } |
| | | selectedIds.value = selection.map(item => item.id); |
| | | }; |
| | | |
| | | // 打开表单 |