| | |
| | | prop="specificationModel" /> |
| | | <el-table-column label="单位" |
| | | prop="unit" /> |
| | | <el-table-column label="料号" |
| | | prop="materialCode" /> |
| | | <el-table-column label="数量" |
| | | prop="quantity" /> |
| | | <el-table-column label="税率(%)" |
| | |
| | | <el-option v-for="item in supplierList" |
| | | :key="item.id" |
| | | :label="item.supplierName" |
| | | :value="item.id" /> |
| | | :value="item.id" >{{item.supplierName + '---' + item.supplierType}}</el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-col> |
| | |
| | | prop="productCategory" /> |
| | | <el-table-column label="规格型号" |
| | | prop="specificationModel" /> |
| | | <el-table-column label="料号" |
| | | prop="materialCode" /> |
| | | <el-table-column label="单位" |
| | | prop="unit" |
| | | width="70" /> |
| | |
| | | prop="taxExclusiveTotalPrice" |
| | | :formatter="formattedNumber" |
| | | width="150" /> |
| | | <el-table-column label="是否质检" |
| | | prop="isChecked" |
| | | width="150"> |
| | | <template #default="scope"> |
| | | <el-tag :type="scope.row.isChecked ? 'success' : 'info'"> |
| | | {{ scope.row.isChecked ? '是' : '否' }} |
| | | </el-tag> |
| | | </template> |
| | | </el-table-column> |
| | | <!-- <el-table-column label="是否质检"--> |
| | | <!-- prop="isChecked"--> |
| | | <!-- width="150">--> |
| | | <!-- <template #default="scope">--> |
| | | <!-- <el-tag :type="scope.row.isChecked ? 'success' : 'info'">--> |
| | | <!-- {{ scope.row.isChecked ? '是' : '否' }}--> |
| | | <!-- </el-tag>--> |
| | | <!-- </template>--> |
| | | <!-- </el-table-column>--> |
| | | <el-table-column fixed="right" |
| | | label="操作" |
| | | min-width="60" |
| | |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-col> |
| | | |
| | | <el-col :span="24"> |
| | | <el-form-item label="料号:" |
| | | prop="materialCode"> |
| | | <el-input v-model="productForm.materialCode" |
| | | placeholder="请输入" |
| | | disabled /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="24"> |
| | | <el-form-item label="批号:" |
| | | prop="batchNo"> |
| | | <el-input v-model="productForm.batchNo" |
| | | clearable |
| | | placeholder="选填,可输入批号;留空将自动生成" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row :gutter="30"> |
| | | <el-col :span="12"> |
| | |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row :gutter="30"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="是否质检:" |
| | | prop="isChecked"> |
| | | <el-radio-group v-model="productForm.isChecked"> |
| | | <el-radio label="是" |
| | | :value="true" /> |
| | | <el-radio label="否" |
| | | :value="false" /> |
| | | </el-radio-group> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <!-- <el-row :gutter="30">--> |
| | | <!-- <el-col :span="12">--> |
| | | <!-- <el-form-item label="是否质检:"--> |
| | | <!-- prop="isChecked">--> |
| | | <!-- <el-radio-group v-model="productForm.isChecked">--> |
| | | <!-- <el-radio label="是"--> |
| | | <!-- :value="true" />--> |
| | | <!-- <el-radio label="否"--> |
| | | <!-- :value="false" />--> |
| | | <!-- </el-radio-group>--> |
| | | <!-- </el-form-item>--> |
| | | <!-- </el-col>--> |
| | | <!-- </el-row>--> |
| | | </el-form> |
| | | </FormDialog> |
| | | <FileListDialog |
| | |
| | | productCategory: "", |
| | | productModelId: "", |
| | | specificationModel: "", |
| | | materialCode: "", |
| | | batchNo: "", |
| | | unit: "", |
| | | quantity: "", |
| | | taxInclusiveUnitPrice: "", |
| | |
| | | if (type === "edit") { |
| | | // 复制行数据 |
| | | productForm.value = { ...row }; |
| | | |
| | | // el-radio-group 的 value 是布尔 true/false |
| | | // 后端/表格数据可能是 0/1 或字符串,需做一次归一化,避免不回显/提交默认“否” |
| | | const normalizeIsChecked = (val) => { |
| | | if (val === true) return true; |
| | | if (val === false) return false; |
| | | if (val === 1 || val === "1") return true; |
| | | if (val === 0 || val === "0") return false; |
| | | if (typeof val === "string") { |
| | | const s = val.trim().toLowerCase(); |
| | | if (["是", "yes", "true", "y"].includes(s)) return true; |
| | | if (["否", "no", "false", "n"].includes(s)) return false; |
| | | } |
| | | return !!val; |
| | | }; |
| | | productForm.value.isChecked = normalizeIsChecked(row?.isChecked); |
| | | |
| | | // 如果是从模板加载的数据,可能没有 productId 和 productModelId |
| | | // 需要根据 productCategory 和 specificationModel 来查找对应的 ID |
| | |
| | | }; |
| | | const getProductOptions = () => { |
| | | return productTreeList().then(res => { |
| | | productOptions.value = convertIdToValue(res); |
| | | const tree = convertIdToValue(res); |
| | | productOptions.value = filterOutSemiFinished(tree); |
| | | return res; |
| | | }); |
| | | }; |
| | | |
| | | const filterOutSemiFinished = (nodes = []) => { |
| | | return (nodes || []) |
| | | .filter(node => { |
| | | const label = String(node?.label ?? ""); |
| | | return !label.includes("半成品"); |
| | | }) |
| | | .map(node => { |
| | | const next = { ...node }; |
| | | if (next.children && next.children.length > 0) { |
| | | next.children = filterOutSemiFinished(next.children); |
| | | } |
| | | return next; |
| | | }); |
| | | }; |
| | | const getModels = value => { |
| | | if (value) { |
| | |
| | | if (index !== -1) { |
| | | productForm.value.specificationModel = modelOptions.value[index].model; |
| | | productForm.value.unit = modelOptions.value[index].unit; |
| | | productForm.value.materialCode = modelOptions.value[index].materialCode; |
| | | } else { |
| | | productForm.value.specificationModel = null; |
| | | productForm.value.unit = null; |
| | | productForm.value.materialCode = null; |
| | | } |
| | | }; |
| | | const findNodeById = (nodes, productId) => { |
| | |
| | | return newItem; |
| | | }); |
| | | } |
| | | |
| | | /** 与库存新增一致:未填批号时前端生成(PH + 时间戳 + 随机数) */ |
| | | const generateProductBatchNo = () => { |
| | | const d = new Date(); |
| | | const pad = (n) => String(n).padStart(2, "0"); |
| | | const ts = `${d.getFullYear()}${pad(d.getMonth() + 1)}${pad(d.getDate())}${pad(d.getHours())}${pad(d.getMinutes())}${pad(d.getSeconds())}`; |
| | | const r = Math.floor(Math.random() * 10000) |
| | | .toString() |
| | | .padStart(4, "0"); |
| | | return `PH${ts}${r}`; |
| | | }; |
| | | |
| | | const ensureProductBatchNo = () => { |
| | | const v = (productForm.value.batchNo ?? "").toString().trim(); |
| | | productForm.value.batchNo = v || generateProductBatchNo(); |
| | | }; |
| | | |
| | | // 提交产品表单 |
| | | const submitProduct = () => { |
| | | proxy.$refs["productFormRef"].validate(valid => { |
| | | if (valid) { |
| | | ensureProductBatchNo(); |
| | | if (operationType.value === "edit") { |
| | | submitProductEdit(); |
| | | } else { |
| | |
| | | const handleDelete = () => { |
| | | let ids = []; |
| | | if (selectedRows.value.length > 0) { |
| | | // 检查是否有他人维护的数据 |
| | | const unauthorizedData = selectedRows.value.filter( |
| | | item => item.recorderName !== userStore.nickName |
| | | ); |
| | | if (unauthorizedData.length > 0) { |
| | | proxy.$modal.msgWarning("不可删除他人维护的数据"); |
| | | return; |
| | | } |
| | | ids = selectedRows.value.map(item => item.id); |
| | | } else { |
| | | proxy.$modal.msgWarning("请选择数据"); |