| | |
| | | </div> |
| | | <div class="search-item"> |
| | | <el-button type="primary" |
| | | @click="handleQuery">搜索</el-button> |
| | | @click="handleQuery">搜索 |
| | | </el-button> |
| | | </div> |
| | | </div> |
| | | </div> |
| | |
| | | margin-bottom: 40px;"> |
| | | <el-button type="primary" |
| | | style="margin-top: 20px;" |
| | | @click="printTransferCard">打印流转卡</el-button> |
| | | @click="printTransferCard">打印流转卡 |
| | | </el-button> |
| | | </div> |
| | | </el-dialog> |
| | | <el-dialog v-model="reportDialogVisible" |
| | | :title="`报工(机台:${currentReportRowData?.deviceName || '-'})`" |
| | | width="500px"> |
| | | <el-form ref="reportFormRef" |
| | | :title="`报工(工单编号:${currentReportRowData?.workOrderNo || '-'})`" |
| | | width="1000px"> |
| | | <el-form |
| | | ref="reportFormRef" |
| | | :model="reportForm" |
| | | :rules="reportFormRules" |
| | | label-width="120px"> |
| | | label-width="120px" |
| | | > |
| | | <el-row :gutter="20"> |
| | | |
| | | <el-col :span="12"> |
| | | <el-form-item label="待生产数量"> |
| | | <el-input v-model="reportForm.planQuantity" |
| | | readonly |
| | | style="width: 300px" /> |
| | | <el-input v-model="reportForm.planQuantity" readonly disabled/> |
| | | </el-form-item> |
| | | <el-form-item label="本次生产数量" |
| | | prop="quantity"> |
| | | <el-input v-model.number="reportForm.quantity" |
| | | </el-col> |
| | | |
| | | <el-col :span="12"> |
| | | <el-form-item label="本次生产数量" prop="quantity"> |
| | | <el-input |
| | | v-model.number="reportForm.quantity" |
| | | type="number" |
| | | min="1" |
| | | step="1" |
| | | style="width: 300px" |
| | | placeholder="请输入本次生产数量" |
| | | @input="handleQuantityInput" /> |
| | | style="width: 100%" |
| | | @input="handleQuantityInput" |
| | | /> |
| | | </el-form-item> |
| | | <el-form-item label="补产数量" |
| | | prop="replenishQty"> |
| | | <el-input v-model.number="reportForm.replenishQty" |
| | | </el-col> |
| | | |
| | | <el-col :span="12"> |
| | | <el-form-item label="补产数量" prop="replenishQty"> |
| | | <el-input |
| | | v-model.number="reportForm.replenishQty" |
| | | type="number" |
| | | min="0" |
| | | step="1" |
| | | style="width: 300px" |
| | | placeholder="请输入补产数量" /> |
| | | placeholder="请输入补产数量" |
| | | /> |
| | | </el-form-item> |
| | | <el-form-item label="报废数量" |
| | | prop="scrapQty"> |
| | | <el-input v-model.number="reportForm.scrapQty" |
| | | </el-col> |
| | | |
| | | <el-col :span="12"> |
| | | <el-form-item label="报废数量" prop="scrapQty"> |
| | | <el-input |
| | | v-model.number="reportForm.scrapQty" |
| | | type="number" |
| | | min="0" |
| | | step="1" |
| | | style="width: 300px" |
| | | placeholder="请输入报废数量" |
| | | @input="handleScrapQtyInput" /> |
| | | @input="handleScrapQtyInput" |
| | | /> |
| | | </el-form-item> |
| | | <el-form-item label="班组信息"> |
| | | </el-col> |
| | | |
| | | <el-col :span="12"> |
| | | <el-form-item label="班组信息" prop="teamList"> |
| | | <el-select |
| | | v-model="reportForm.teamList" |
| | | multiple |
| | |
| | | collapse-tags |
| | | value-key="userId" |
| | | placeholder="请选择班组成员" |
| | | style="width: 300px" |
| | | > |
| | | <el-option |
| | | v-for="user in userTeamOptions" |
| | |
| | | /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="开始时间" |
| | | prop="startTime"> |
| | | <el-date-picker v-model="reportForm.startTime" |
| | | </el-col> |
| | | |
| | | <el-col :span="12"> |
| | | <el-form-item label="机台" prop="machineId"> |
| | | <el-select |
| | | v-model="reportForm.machineId" |
| | | placeholder="请选择机台" |
| | | filterable |
| | | clearable |
| | | @change="(val) => handleDeviceChange(val)" |
| | | :disabled="isDetail" |
| | | > |
| | | <el-option |
| | | v-for="item in deviceOptions" |
| | | :key="item.id" |
| | | :label="item.deviceName" |
| | | :value="item.id" |
| | | /> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-col> |
| | | |
| | | <el-col :span="12"> |
| | | <el-form-item label="开始时间" prop="startTime"> |
| | | <el-date-picker |
| | | v-model="reportForm.startTime" |
| | | type="datetime" |
| | | value-format="YYYY-MM-DD HH:mm:ss" |
| | | format="YYYY-MM-DD HH:mm:ss" |
| | | style="width: 300px" |
| | | placeholder="请选择开始时间" |
| | | clearable /> |
| | | style="width: 100%" |
| | | /> |
| | | </el-form-item> |
| | | <el-form-item label="结束时间" |
| | | prop="endTime"> |
| | | <el-date-picker v-model="reportForm.endTime" |
| | | </el-col> |
| | | |
| | | <el-col :span="12"> |
| | | <el-form-item label="结束时间" prop="endTime"> |
| | | <el-date-picker |
| | | v-model="reportForm.endTime" |
| | | type="datetime" |
| | | value-format="YYYY-MM-DD HH:mm:ss" |
| | | format="YYYY-MM-DD HH:mm:ss" |
| | | style="width: 300px" |
| | | placeholder="请选择结束时间" |
| | | clearable /> |
| | | style="width: 100%" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | |
| | | <el-col :span="12"> |
| | | <el-form-item label="审核人" prop="auditUserId"> |
| | | <el-select v-model="reportForm.auditUserId" |
| | | style="width: 300px" |
| | | <el-select |
| | | v-model="reportForm.auditUserId" |
| | | placeholder="请选择审核人" |
| | | clearable |
| | | filterable |
| | | @change="handleReviewerIdChange"> |
| | | <el-option v-for="user in userOptions" |
| | | @change="handleReviewerIdChange" |
| | | > |
| | | <el-option |
| | | v-for="user in userOptions" |
| | | :key="user.userId" |
| | | :label="user.nickName" |
| | | :value="user.userId" /> |
| | | :value="user.userId" |
| | | /> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-col> |
| | | |
| | | </el-row> |
| | | </el-form> |
| | | <template #footer> |
| | | <span class="dialog-footer"> |
| | |
| | | import QRCode from "qrcode"; |
| | | import { getCurrentInstance, reactive, toRefs } from "vue"; |
| | | import FilesDia from "./components/filesDia.vue"; |
| | | import {getDeviceLedger} from "@/api/equipmentManagement/ledger.js"; |
| | | |
| | | const { proxy } = getCurrentInstance(); |
| | | |
| | | const currentUserId = ref(""); |
| | | const deviceOptions = ref([]) |
| | | const currentUserName = ref(""); |
| | | |
| | | const ensureCurrentUser = async () => { |
| | |
| | | console.error("获取用户信息失败", err); |
| | | } |
| | | }; |
| | | |
| | | // 机台获取 |
| | | const getDeviceList = () => { |
| | | getDeviceLedger().then(res => { |
| | | deviceOptions.value = Array.isArray(res?.data) ? res.data : [] |
| | | }) |
| | | } |
| | | |
| | | const handleDeviceChange = (val) => { |
| | | const device = deviceOptions.value.find(item => item.id === val) |
| | | reportForm.machineName = device?.deviceName || "" |
| | | reportForm.machineId = val || "" |
| | | } |
| | | |
| | | const normalizeArray = (val) => { |
| | | if (val === null || val === undefined) return []; |
| | |
| | | label: "工序名称", |
| | | prop: "processName", |
| | | }, |
| | | // { |
| | | // label: "机台名称", |
| | | // prop: "deviceName", |
| | | // }, |
| | | { |
| | | label: "机台名称", |
| | | prop: "deviceName", |
| | | prop: "deviceNames", |
| | | }, |
| | | { |
| | | label: "需求数量", |
| | |
| | | productProcessRouteItemId: "", |
| | | userId: "", |
| | | productMainId: null, |
| | | teamList:[] |
| | | teamList: [], |
| | | machineId: null, |
| | | }); |
| | | |
| | | // 本次生产数量验证规则 |
| | |
| | | startTime: [{ required: true, message: "请选择开始时间", trigger: "change" }], |
| | | endTime: [{ required: true, message: "请选择结束时间", trigger: "change" }], |
| | | auditUserId: [{ required: true, message: "请选择审核人", trigger: "change" }], |
| | | teamList: [{required: true, message: "请选择班组", trigger: "change"}], |
| | | machineId: [{required: true, message: "请选择设备", trigger: "change"}], |
| | | }; |
| | | |
| | | // 处理本次生产数量输入,限制必须大于等于1 |
| | |
| | | ensureCurrentUser(); |
| | | getList(); |
| | | getUserList(); |
| | | getDeviceList(); |
| | | }); |
| | | </script> |
| | | |
| | | <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; |
| | |
| | | } |
| | | .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; |