| | |
| | | :expand-row-keys="expandRowKeys" |
| | | :show-summary="isShowSummary" |
| | | :summary-method="summaryMethod" |
| | | :default-expand-all="defaultExpandAll" |
| | | :tree-props="treeProps" |
| | | :lazy="lazy" |
| | | :load="load" |
| | | @row-click="rowClick" |
| | | @current-change="currentChange" |
| | | @selection-change="handleSelectionChange" |
| | |
| | | type: [String, Object], |
| | | default: () => ({ width: "100%" }), |
| | | }, |
| | | defaultExpandAll: { |
| | | type: Boolean, |
| | | default: false, |
| | | }, |
| | | treeProps: { |
| | | type: Object, |
| | | default: () => ({ children: "children", hasChildren: "hasChildren" }), |
| | | }, |
| | | lazy: { |
| | | type: Boolean, |
| | | default: false, |
| | | }, |
| | | load: { |
| | | type: Function, |
| | | default: null, |
| | | }, |
| | | }); |
| | | |
| | | const mergedHeaderCellStyle = computed(() => ({ |
| | |
| | | })); |
| | | |
| | | // Data |
| | | const multipleTable = ref(null); |
| | | const uploadRefs = ref([]); |
| | | const currentFiles = ref({}); |
| | | const uploadKeys = ref({}); |
| | |
| | | const handleSelectionChange = newSelection => { |
| | | emit("selection-change", newSelection); |
| | | }; |
| | | |
| | | // 展开/折叠树形节点 |
| | | const toggleRowExpansion = (row, expanded) => { |
| | | multipleTable.value?.toggleRowExpansion(row, expanded); |
| | | }; |
| | | |
| | | // 展开所有树形节点 |
| | | const expandAll = () => { |
| | | const expandRows = (rows) => { |
| | | rows?.forEach(row => { |
| | | if (row[props.treeProps.children]?.length > 0) { |
| | | multipleTable.value?.toggleRowExpansion(row, true); |
| | | expandRows(row[props.treeProps.children]); |
| | | } |
| | | }); |
| | | }; |
| | | expandRows(props.tableData); |
| | | }; |
| | | |
| | | // 折叠所有树形节点 |
| | | const collapseAll = () => { |
| | | const collapseRows = (rows) => { |
| | | rows?.forEach(row => { |
| | | if (row[props.treeProps.children]?.length > 0) { |
| | | collapseRows(row[props.treeProps.children]); |
| | | multipleTable.value?.toggleRowExpansion(row, false); |
| | | } |
| | | }); |
| | | }; |
| | | collapseRows(props.tableData); |
| | | }; |
| | | |
| | | defineExpose({ |
| | | toggleRowExpansion, |
| | | expandAll, |
| | | collapseAll, |
| | | multipleTable |
| | | }); |
| | | </script> |
| | | |
| | | <style scoped lang="scss"> |
| | |
| | | }, |
| | | { |
| | | label: "领用状态", |
| | | prop: "usageStatus", |
| | | prop: "isAssigned", |
| | | dataType: "tag", |
| | | width: 100, |
| | | fixed: "right", |
| | |
| | | { |
| | | name: "分配", |
| | | type: "text", |
| | | showHide: row => row.usageStatus != 1, |
| | | showHide: row => row.isAssigned != 1, |
| | | clickFun: row => { |
| | | openAssignDialog(row); |
| | | }, |
| | |
| | | { |
| | | name: "回收", |
| | | type: "text", |
| | | showHide: row => row.usageStatus == 1, |
| | | showHide: row => row.isAssigned == 1, |
| | | clickFun: row => { |
| | | recycle(row); |
| | | }, |
| | |
| | | { |
| | | name: "共享", |
| | | type: "text", |
| | | showHide: row => row.usageStatus == 1, |
| | | showHide: row => row.isAssigned == 1, |
| | | clickFun: row => { |
| | | openShareDialog(row); |
| | | }, |
| | |
| | | form.value.parentId = ""; |
| | | } else { |
| | | form.value.id = currentId.value; |
| | | form.value.parentId = ""; |
| | | form.value.parentId = currentParentId.value; |
| | | } |
| | | addOrEditProduct(form.value).then(res => { |
| | | proxy.$modal.msgSuccess("提交成功"); |
| | |
| | | show-overflow-tooltip |
| | | /> |
| | | <el-table-column label="规格型号" prop="model" show-overflow-tooltip /> |
| | | <el-table-column label="库位" prop="warehouseName" show-overflow-tooltip /> |
| | | <el-table-column label="批号" prop="batchNo" show-overflow-tooltip /> |
| | | <el-table-column label="单位" prop="unit" show-overflow-tooltip /> |
| | | <el-table-column |
| | |
| | | prop="unit"> |
| | | <el-input v-model="formState.unit" disabled /> |
| | | </el-form-item> |
| | | <el-form-item label="库存类型" |
| | | prop="type" |
| | | <el-form-item label="仓库" |
| | | prop="warehouseInfoId" |
| | | :rules="[ |
| | | { |
| | | required: true, |
| | | message: '请选择库存类型', |
| | | message: '请选择仓库', |
| | | trigger: 'change', |
| | | } |
| | | ]"> |
| | | <el-select v-model="formState.type" |
| | | placeholder="请选择库存类型" |
| | | :disabled="isEdit"> |
| | | <el-option label="合格库存" |
| | | value="qualified" /> |
| | | <el-option label="不合格库存" |
| | | value="unqualified" /> |
| | | <el-select v-model="formState.warehouseInfoId" |
| | | placeholder="请选择仓库" |
| | | clearable |
| | | @change="handleWarehouseChange" |
| | | style="width: 100%"> |
| | | <el-option v-for="warehouse in warehouseList" |
| | | :key="warehouse.id" |
| | | :label="warehouse.warehouseName" |
| | | :value="warehouse.id" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="批号" |
| | | prop="batchNo" |
| | | :rules="[ |
| | | { |
| | | required: true, |
| | | message: '请选择批号', |
| | | trigger: 'change', |
| | | } |
| | | ]"> |
| | | <el-select v-model="formState.batchNo" |
| | | placeholder="请选择批号" |
| | | clearable |
| | | @change="handleBatchNoChange" |
| | | style="width: 100%"> |
| | | <el-option v-for="batch in batchNoList" |
| | | :key="batch" |
| | | :label="batch + ' (库存: ' + (batchNoStockMap[batch] || 0) + ')'" |
| | | :value="batch" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item v-if="formState.batchNo && batchNoStockMap[formState.batchNo]" |
| | | label="当前批号库存" |
| | | prop="currentStock"> |
| | | <el-input v-model="batchNoStockMap[formState.batchNo]" disabled /> |
| | | </el-form-item> |
| | | <el-form-item label="出库数量" |
| | | prop="qualitity" |
| | |
| | | :max="formState.maxStock > 0 ? formState.maxStock : undefined" |
| | | style="width: 100%" /> |
| | | </el-form-item> |
| | | <el-form-item label="批号" |
| | | prop="batchNo" |
| | | :rules="[ |
| | | { |
| | | required: true, |
| | | message: '请选择批号', |
| | | trigger: 'change', |
| | | } |
| | | ]"> |
| | | <el-select v-model="formState.batchNo" |
| | | placeholder="请选择批号" |
| | | clearable |
| | | :disabled="isEdit" |
| | | @change="handleBatchNoChange" |
| | | style="width: 100%"> |
| | | <el-option v-for="batch in batchNoList" |
| | | :key="batch" |
| | | :label="batch + ' (库存: ' + (batchNoStockMap[batch] || 0) + ')'" |
| | | :value="batch" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item v-if="formState.batchNo && batchNoStockMap[formState.batchNo]" |
| | | label="当前批号库存" |
| | | prop="currentStock"> |
| | | <el-input v-model="batchNoStockMap[formState.batchNo]" disabled /> |
| | | </el-form-item> |
| | | <el-form-item v-if="isEdit" |
| | | label="来源" |
| | | prop="recordType"> |
| | |
| | | :key="item.value" |
| | | :label="item.label" |
| | | :value="item.value" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="库存类型" |
| | | prop="type" |
| | | :rules="[ |
| | | { |
| | | required: true, |
| | | message: '请选择库存类型', |
| | | trigger: 'change', |
| | | } |
| | | ]"> |
| | | <el-select v-model="formState.type" |
| | | placeholder="请选择库存类型" |
| | | > |
| | | <el-option label="合格库存" |
| | | value="qualified" /> |
| | | <el-option label="不合格库存" |
| | | value="unqualified" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="备注" |
| | |
| | | } from "@/api/basicData/enum.js"; |
| | | import { addStockOutRecordOnly } from "@/api/inventoryManagement/stockInventory.js"; |
| | | import { addUnqualifiedStockOutRecordOnly } from "@/api/inventoryManagement/stockUninventory.js"; |
| | | import { getWarehouseList } from "@/api/inventoryManagement/warehouse.js"; |
| | | import { productModelListByUrl } from "@/api/basicData/productModel.js"; |
| | | |
| | | const userStore = useUserStore(); |
| | | const { proxy } = getCurrentInstance(); |
| | |
| | | const batchNoList = ref([]); |
| | | // 批号库存映射 |
| | | const batchNoStockMap = ref({}); |
| | | // 仓库列表 |
| | | const warehouseList = ref([]); |
| | | // 原始batchNoMaps数据 |
| | | const rawBatchNoMaps = ref({}); |
| | | const page = reactive({ |
| | | current: 1, |
| | | size: 100, |
| | |
| | | productName: "", |
| | | productModelName: "", |
| | | unit: "", |
| | | warehouseInfoId: null, // 仓库ID |
| | | type: undefined, |
| | | qualitity: 0, |
| | | batchNo: null, |
| | |
| | | type: props.type === '0' ? 'qualified' : 'unqualified', |
| | | qualitity: row.stockOutNum, |
| | | batchNo: row.batchNo, |
| | | warehouseInfoId: row.warehouseInfoId, |
| | | recordType: row.recordType, |
| | | remark: row.remark || "", |
| | | maxStock: row.stockOutNum || 0, // 编辑时使用当前出库数量作为最大库存(因为是修改已有记录) |
| | | maxStock: row.stockOutNum || 0, |
| | | }; |
| | | // 编辑时从batchNoMaps获取批号列表 |
| | | if (row.batchNoMaps && Object.keys(row.batchNoMaps).length > 0) { |
| | |
| | | productName: "", |
| | | productModelName: "", |
| | | unit: "", |
| | | warehouseInfoId: null, |
| | | type: undefined, |
| | | qualitity: 0, |
| | | batchNo: null, |
| | |
| | | remark: "", |
| | | maxStock: 0, |
| | | }; |
| | | warehouseList.value = []; |
| | | batchNoList.value = []; |
| | | batchNoStockMap.value = {}; |
| | | rawBatchNoMaps.value = {}; |
| | | }; |
| | | |
| | | // 关闭对话框 |
| | | const closeDialog = () => { |
| | | dialogVisible.value = false; |
| | | resetForm(); |
| | | }; |
| | | |
| | | // 加载仓库列表 |
| | | const loadWarehouseList = async () => { |
| | | try { |
| | | const res = await getWarehouseList(); |
| | | if (res.code === 200) { |
| | | return res.data || []; |
| | | } |
| | | } catch (error) { |
| | | console.error('加载仓库列表失败', error); |
| | | } |
| | | return []; |
| | | }; |
| | | |
| | | // 产品选择处理 |
| | |
| | | formState.value.productModelName = product.model; |
| | | formState.value.productModelId = product.id; |
| | | formState.value.unit = product.unit; |
| | | // 从batchNoMaps获取批号列表和库存 |
| | | if (product.batchNoMaps && Object.keys(product.batchNoMaps).length > 0) { |
| | | batchNoList.value = Object.keys(product.batchNoMaps); |
| | | batchNoStockMap.value = product.batchNoMaps; |
| | | } else { |
| | | batchNoList.value = []; |
| | | batchNoStockMap.value = {}; |
| | | } |
| | | // 清空已选择的批号和最大库存 |
| | | // 解析batchNoMaps数据,格式为:{ 仓库ID: [{批号: 库存}, {批号: 库存}] } |
| | | warehouseList.value = []; |
| | | batchNoList.value = []; |
| | | batchNoStockMap.value = {}; |
| | | rawBatchNoMaps.value = {}; |
| | | formState.value.warehouseInfoId = null; |
| | | formState.value.batchNo = null; |
| | | formState.value.maxStock = 0; |
| | | |
| | | if (product.batchNoMaps && Object.keys(product.batchNoMaps).length > 0) { |
| | | rawBatchNoMaps.value = product.batchNoMaps; |
| | | // 获取所有仓库信息用于反显名称 |
| | | const allWarehouses = await loadWarehouseList(); |
| | | const warehouseMap = {}; |
| | | allWarehouses.forEach(w => { |
| | | warehouseMap[w.id] = w.warehouseName || w.name || w.warehouseCode || `仓库${w.id}`; |
| | | }); |
| | | // 构建仓库列表 |
| | | warehouseList.value = Object.keys(product.batchNoMaps).map(warehouseInfoId => ({ |
| | | id: warehouseInfoId, |
| | | warehouseName: warehouseMap[warehouseInfoId] || `仓库${warehouseInfoId}` |
| | | })); |
| | | } |
| | | showProductSelect.value = false; |
| | | // 触发表单验证更新 |
| | | proxy.$refs["formRef"]?.validateField("productModelId"); |
| | | } |
| | | }; |
| | | |
| | | // 仓库选择变化处理 |
| | | const handleWarehouseChange = (warehouseInfoId) => { |
| | | batchNoList.value = []; |
| | | batchNoStockMap.value = {}; |
| | | formState.value.batchNo = null; |
| | | formState.value.maxStock = 0; |
| | | |
| | | if (warehouseInfoId && rawBatchNoMaps.value[warehouseInfoId]) { |
| | | // 解析该仓库下的批号数据,格式为:[{批号: 库存}, {批号: 库存}] |
| | | const batchArray = rawBatchNoMaps.value[warehouseInfoId]; |
| | | const batchMap = {}; |
| | | const batches = []; |
| | | |
| | | batchArray.forEach(item => { |
| | | const batchNo = Object.keys(item)[0]; |
| | | const stock = item[batchNo]; |
| | | batches.push(batchNo); |
| | | batchMap[batchNo] = stock; |
| | | }); |
| | | |
| | | batchNoList.value = batches; |
| | | batchNoStockMap.value = batchMap; |
| | | } |
| | | }; |
| | | |
| | | // 批号选择变化处理 |
| | | const handleBatchNoChange = (batchNo) => { |
| | | if (batchNo && batchNoStockMap.value[batchNo]) { |
| | |
| | | <el-table-column label="规格型号" |
| | | prop="model" |
| | | show-overflow-tooltip/> |
| | | <el-table-column label="库位" |
| | | prop="warehouseName" |
| | | show-overflow-tooltip/> |
| | | <el-table-column label="批号" |
| | | prop="batchNo" |
| | | show-overflow-tooltip/> |
| | |
| | | prop="unit"> |
| | | <el-input v-model="formState.unit" disabled /> |
| | | </el-form-item> |
| | | <el-form-item label="库存类型" |
| | | prop="type" |
| | | :rules="[ |
| | | { |
| | | required: true, |
| | | message: '请选择库存类型', |
| | | trigger: 'change', |
| | | } |
| | | ]"> |
| | | <el-select v-model="formState.type" |
| | | placeholder="请选择库存类型" |
| | | :disabled="isEdit"> |
| | | <el-option label="合格库存" |
| | | value="qualified" /> |
| | | <el-option label="不合格库存" |
| | | value="unqualified" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="库存数量" |
| | | prop="qualitity"> |
| | | <el-input-number v-model="formState.qualitity" |
| | | :step="1" |
| | | :min="1" |
| | | style="width: 100%" /> |
| | | </el-form-item> |
| | | <el-form-item label="批号" |
| | | prop="batchNo"> |
| | | <el-input v-model="formState.batchNo" |
| | | placeholder="请输入批号" |
| | | :disabled="isEdit" /> |
| | | </el-form-item> |
| | | <el-form-item label="库位" |
| | | prop="warehouseId" |
| | | prop="warehouseInfoId" |
| | | :rules="[ |
| | | { |
| | | required: true, |
| | |
| | | trigger: 'change', |
| | | } |
| | | ]"> |
| | | <el-select v-model="formState.warehouseId" |
| | | <el-select v-model="formState.warehouseInfoId" |
| | | placeholder="请选择库位" |
| | | clearable |
| | | style="width: 100%"> |
| | |
| | | :label="warehouse.warehouseName + ' - ' + warehouse.location" |
| | | :value="warehouse.id" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="批号" |
| | | prop="batchNo"> |
| | | <el-input v-model="formState.batchNo" |
| | | placeholder="请输入批号" |
| | | :disabled="isEdit" /> |
| | | </el-form-item> |
| | | <el-form-item label="库存数量" |
| | | prop="qualitity"> |
| | | <el-input-number v-model="formState.qualitity" |
| | | :step="1" |
| | | :min="1" |
| | | style="width: 100%" /> |
| | | </el-form-item> |
| | | <el-form-item v-if="isEdit" |
| | | label="来源" |
| | |
| | | :min="0" |
| | | :max="formState.qualitity" |
| | | style="width: 100%" /> |
| | | </el-form-item> |
| | | <el-form-item label="库存类型" |
| | | prop="type" |
| | | :rules="[ |
| | | { |
| | | required: true, |
| | | message: '请选择库存类型', |
| | | trigger: 'change', |
| | | } |
| | | ]"> |
| | | <el-select v-model="formState.type" |
| | | placeholder="请选择库存类型" |
| | | :disabled="isEdit"> |
| | | <el-option label="合格库存" |
| | | value="qualified" /> |
| | | <el-option label="不合格库存" |
| | | value="unqualified" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="备注" |
| | | prop="remark"> |
| | |
| | | type: undefined, |
| | | qualitity: 0, |
| | | batchNo: null, |
| | | warehouseId: undefined, |
| | | warehouseInfoId: undefined, |
| | | warnNum: 0, |
| | | recordType: "", |
| | | remark: "", |
| | |
| | | type: props.type === '0' ? 'qualified' : 'unqualified', |
| | | qualitity: row.stockInNum, |
| | | batchNo: row.batchNo, |
| | | warehouseId: row.warehouseId, |
| | | warehouseInfoId: row.warehouseInfoId, |
| | | warnNum: row.warnNum || 0, |
| | | recordType: row.recordType, |
| | | remark: row.remark || "", |
| | |
| | | type: undefined, |
| | | qualitity: 0, |
| | | batchNo: null, |
| | | warehouseId: undefined, |
| | | warehouseInfoId: undefined, |
| | | warnNum: 0, |
| | | recordType: "", |
| | | remark: "", |
| | |
| | | model: formState.value.productModelName, |
| | | unit: formState.value.unit, |
| | | batchNo: formState.value.batchNo, |
| | | warehouseId: formState.value.warehouseId, |
| | | warehouseInfoId: formState.value.warehouseInfoId, |
| | | stockInNum: formState.value.qualitity, |
| | | recordType: formState.value.recordType, |
| | | remark: formState.value.remark, |
| | |
| | | <el-input v-model="formState.unit" |
| | | disabled /> |
| | | </el-form-item> |
| | | <el-form-item label="库位" |
| | | prop="warehouseInfoId" |
| | | :rules="[ |
| | | { |
| | | required: true, |
| | | message: '请选择库位', |
| | | trigger: 'change', |
| | | } |
| | | ]"> |
| | | <el-select v-model="formState.warehouseInfoId" |
| | | placeholder="请选择库位" |
| | | clearable |
| | | style="width: 100%"> |
| | | <el-option v-for="warehouse in warehouseList" |
| | | :key="warehouse.id" |
| | | :label="warehouse.warehouseName + ' - ' + warehouse.location" |
| | | :value="warehouse.id" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="批号" |
| | | prop="batchNo"> |
| | | <el-input v-model="formState.batchNo" |
| | | placeholder="请输入批号" /> |
| | | </el-form-item> |
| | | <el-form-item label="库存数量" |
| | | prop="qualitity"> |
| | | <el-input-number v-model="formState.qualitity" |
| | | :step="1" |
| | | :min="1" |
| | | style="width: 100%" /> |
| | | </el-form-item> |
| | | <el-form-item label="库存类型" |
| | | prop="type" |
| | | :rules="[ |
| | |
| | | <el-option label="不合格库存" |
| | | value="unqualified" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="库存数量" |
| | | prop="qualitity"> |
| | | <el-input-number v-model="formState.qualitity" |
| | | :step="1" |
| | | :min="1" |
| | | style="width: 100%" /> |
| | | </el-form-item> |
| | | <el-form-item label="批号" |
| | | prop="batchNo"> |
| | | <el-input v-model="formState.batchNo" |
| | | placeholder="请输入批号" /> |
| | | </el-form-item> |
| | | <el-form-item v-if="formState.type === 'qualified'" |
| | | label="库存预警数量" |
| | |
| | | </template> |
| | | |
| | | <script setup> |
| | | import { ref, computed, watch, getCurrentInstance } from "vue"; |
| | | import { ref, computed, watch, getCurrentInstance, onMounted } from "vue"; |
| | | import ProductSelectDialog from "@/views/basicData/product/ProductSelectDialog.vue"; |
| | | import { addStockInRecordOnly } from "@/api/inventoryManagement/stockInventory.js"; |
| | | import { createStockUnInventory } from "@/api/inventoryManagement/stockUninventory.js"; |
| | | import { getWarehouseList } from "@/api/inventoryManagement/warehouse.js"; |
| | | |
| | | const props = defineProps({ |
| | | visible: { |
| | |
| | | productName: "", |
| | | productModelName: "", |
| | | unit: "", |
| | | warehouseInfoId: undefined, |
| | | type: undefined, |
| | | qualitity: 0, |
| | | batchNo: null, |
| | | warnNum: 0, |
| | | remark: "", |
| | | }); |
| | | |
| | | // 仓库列表 |
| | | const warehouseList = ref([]); |
| | | |
| | | const isShow = computed({ |
| | | get() { |
| | |
| | | }); |
| | | |
| | | const showProductSelectDialog = ref(false); |
| | | |
| | | // 获取仓库列表 |
| | | const fetchWarehouseList = () => { |
| | | getWarehouseList({ status: true }).then(res => { |
| | | warehouseList.value = res.data || []; |
| | | }).catch(() => { |
| | | proxy.$modal.msgError("获取仓库列表失败"); |
| | | }); |
| | | }; |
| | | |
| | | // 批号为空时转为 null |
| | | watch( |
| | |
| | | productName: "", |
| | | productModelName: "", |
| | | unit: "", |
| | | warehouseInfoId: undefined, |
| | | type: undefined, |
| | | qualitity: 0, |
| | | batchNo: null, |
| | |
| | | }); |
| | | }; |
| | | |
| | | // 组件挂载时加载仓库列表 |
| | | onMounted(() => { |
| | | fetchWarehouseList(); |
| | | }); |
| | | |
| | | defineExpose({ |
| | | closeModal, |
| | | handleSubmit, |
| | |
| | | <el-table-column label="产品大类" prop="productName" show-overflow-tooltip /> |
| | | <el-table-column label="规格型号" prop="model" show-overflow-tooltip /> |
| | | <el-table-column label="单位" prop="unit" show-overflow-tooltip /> |
| | | <el-table-column label="库位" prop="warehouseName" show-overflow-tooltip /> |
| | | <el-table-column label="批号" prop="batchNo" show-overflow-tooltip /> |
| | | <el-table-column label="合格库存数量" prop="qualifiedQuantity" show-overflow-tooltip /> |
| | | <el-table-column label="不合格库存数量" prop="unQualifiedQuantity" show-overflow-tooltip /> |
| | |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="仓库" prop="warehouseId"> |
| | | <el-select v-model="form.warehouseId" placeholder="请选择仓库" style="width: 100%" filterable :disabled="form.source === 'check'"> |
| | | <el-form-item label="仓库" prop="warehouseInfoId"> |
| | | <el-select v-model="form.warehouseInfoId" placeholder="请选择仓库" style="width: 100%" filterable :disabled="form.source === 'check'"> |
| | | <el-option v-for="item in warehouseList" :key="item.id" :label="item.name" :value="item.id" /> |
| | | </el-select> |
| | | </el-form-item> |
| | |
| | | const form = reactive({ |
| | | id: null, |
| | | type: 'profit', |
| | | warehouseId: null, |
| | | warehouseInfoId: null, |
| | | remark: '', |
| | | source: 'manual', |
| | | checkPlanNo: '', |
| | |
| | | |
| | | const rules = { |
| | | type: [{ required: true, message: '请选择盈亏类型', trigger: 'change' }], |
| | | warehouseId: [{ required: true, message: '请选择仓库', trigger: 'change' }], |
| | | warehouseInfoId: [{ required: true, message: '请选择仓库', trigger: 'change' }], |
| | | } |
| | | |
| | | const totalDiffAmount = computed(() => { |
| | |
| | | dialogTitle.value = mode === 'add' ? '新建盈亏单' : '编辑盈亏单' |
| | | if (mode === 'add') { |
| | | Object.assign(form, { |
| | | id: null, type: 'profit', warehouseId: null, remark: '', |
| | | id: null, type: 'profit', warehouseInfoId: null, remark: '', |
| | | source: 'manual', checkPlanNo: '', items: [], |
| | | }) |
| | | } |
| | |
| | | Object.assign(form, { |
| | | id: data.id, |
| | | type: data.type, |
| | | warehouseId: data.warehouseId, |
| | | warehouseInfoId: data.warehouseInfoId, |
| | | remark: data.remark, |
| | | source: data.source, |
| | | checkPlanNo: data.checkPlanNo, |
| | |
| | | <el-table-column align="center" |
| | | label="序号" |
| | | type="index" |
| | | width="60" /> |
| | | width="80" /> |
| | | <el-table-column label="采购合同号" |
| | | prop="purchaseContractNumber" |
| | | width="160" |
| | | min-width="160" |
| | | show-overflow-tooltip /> |
| | | <el-table-column label="销售合同号" |
| | | prop="salesContractNo" |
| | | width="160" |
| | | min-width="160" |
| | | show-overflow-tooltip /> |
| | | <el-table-column label="供应商名称" |
| | | prop="supplierName" |
| | | width="160" |
| | | min-width="160" |
| | | show-overflow-tooltip /> |
| | | <el-table-column label="项目名称" |
| | | prop="projectName" |
| | | width="320" |
| | | min-width="200" |
| | | show-overflow-tooltip /> |
| | | <el-table-column label="审批状态" |
| | | prop="approvalStatus" |
| | | width="100" |
| | | show-overflow-tooltip> |
| | | <template #default="scope"> |
| | | <el-tag :type="getApprovalStatusType(scope.row.approvalStatus)" |
| | | size="small"> |
| | | {{ approvalStatusText[scope.row.approvalStatus] || '未知状态' }} |
| | | </el-tag> |
| | | </template> |
| | | </el-table-column> |
| | | <!-- <el-table-column label="审批状态"--> |
| | | <!-- prop="approvalStatus"--> |
| | | <!-- width="100"--> |
| | | <!-- show-overflow-tooltip>--> |
| | | <!-- <template #default="scope">--> |
| | | <!-- <el-tag :type="getApprovalStatusType(scope.row.approvalStatus)"--> |
| | | <!-- size="small">--> |
| | | <!-- {{ approvalStatusText[scope.row.approvalStatus] || '未知状态' }}--> |
| | | <!-- </el-tag>--> |
| | | <!-- </template>--> |
| | | <!-- </el-table-column>--> |
| | | <el-table-column label="签订日期" |
| | | prop="executionDate" |
| | | width="100" |
| | | width="120" |
| | | show-overflow-tooltip /> |
| | | <el-table-column label="付款方式" |
| | | width="100" |
| | | width="120" |
| | | prop="paymentMethod" |
| | | show-overflow-tooltip /> |
| | | <el-table-column label="合同金额(元)" |
| | | prop="contractAmount" |
| | | width="200" |
| | | width="150" |
| | | show-overflow-tooltip |
| | | :formatter="formattedNumber" /> |
| | | <el-table-column label="录入人" |
| | | prop="recorderName" |
| | | width="120" |
| | | width="100" |
| | | show-overflow-tooltip /> |
| | | <el-table-column label="录入日期" |
| | | prop="entryDate" |
| | | width="100" |
| | | width="120" |
| | | show-overflow-tooltip /> |
| | | <el-table-column label="备注" |
| | | prop="remarks" |
| | | width="200" |
| | | min-width="150" |
| | | show-overflow-tooltip /> |
| | | <el-table-column fixed="right" |
| | | label="操作" |
| | | width="120" |
| | | width="140" |
| | | align="center"> |
| | | <template #default="scope"> |
| | | <el-button link |
| | |
| | | style="width: 160px;" |
| | | @keyup.enter="handleQuery" /> |
| | | </el-form-item> |
| | | <el-form-item label="销售合同号:" |
| | | prop="salesContractNo"> |
| | | <el-input v-model="searchForm.salesContractNo" |
| | | placeholder="请输入" |
| | | clearable |
| | | style="width: 160px;" |
| | | @keyup.enter="handleQuery" /> |
| | | </el-form-item> |
| | | <!-- <el-form-item label="销售合同号:"--> |
| | | <!-- prop="salesContractNo">--> |
| | | <!-- <el-input v-model="searchForm.salesContractNo"--> |
| | | <!-- placeholder="请输入"--> |
| | | <!-- clearable--> |
| | | <!-- style="width: 160px;"--> |
| | | <!-- @keyup.enter="handleQuery" />--> |
| | | <!-- </el-form-item>--> |
| | | <el-form-item label="需求日期范围:" |
| | | prop="dateRange"> |
| | | <el-date-picker v-model="searchForm.dateRange" |
| | |
| | | { |
| | | label: "主生产计划号", |
| | | prop: "mpsNo", |
| | | width: "150px", |
| | | minWidth: "150px", |
| | | align: "center", |
| | | }, |
| | | { |
| | | label: "来源", |
| | | prop: "source", |
| | | width: "150px", |
| | | dataType: "tag", |
| | | formatType: params => { |
| | | return params == "销售" ? "primary" : "info"; |
| | | }, |
| | | formatData: params => { |
| | | return params == "销售" ? "销售" : "内部"; |
| | | }, |
| | | }, |
| | | |
| | | // { |
| | | // label: "来源", |
| | | // prop: "source", |
| | | // width: "150px", |
| | | // dataType: "tag", |
| | | // formatType: params => { |
| | | // return params == "销售" ? "primary" : "info"; |
| | | // }, |
| | | // formatData: params => { |
| | | // return params == "销售" ? "销售" : "内部"; |
| | | // }, |
| | | // }, |
| | | { |
| | | label: "产品名称", |
| | | prop: "productName", |
| | | width: "200px", |
| | | minWidth: "200px", |
| | | dataType: "tag", |
| | | formatType: params => { |
| | | return "primary"; |
| | | }, |
| | | align: "center", |
| | | }, |
| | | { |
| | | label: "产品规格", |
| | | prop: "model", |
| | | width: "150px", |
| | | minWidth: "150px", |
| | | className: "spec-cell", |
| | | align: "center", |
| | | }, |
| | | { |
| | | label: "单位", |
| | | prop: "unit", |
| | | width: "100px", |
| | | align: "center", |
| | | }, |
| | | { |
| | | label: "所需数量", |
| | | prop: "qtyRequired", |
| | | width: "150px", |
| | | align: "right", |
| | | minWidth: "150px", |
| | | align: "center", |
| | | dataType: "slot", |
| | | slot: "qtyRequired", |
| | | className: "volume-cell", |
| | |
| | | }; |
| | | return statusMap[cell] || ""; |
| | | }, |
| | | align: "center", |
| | | }, |
| | | { |
| | | label: "已下发数量", |
| | | prop: "quantityIssued", |
| | | width: "120px", |
| | | minWidth: "120px", |
| | | className: "spec-cell", |
| | | align: "center", |
| | | // formatData: (cell, row) => (cell ? `${cell}${row.unit || "方"}` : 0), |
| | | }, |
| | | { |
| | | label: "需求日期", |
| | | prop: "requiredDate", |
| | | width: "160px", |
| | | minWidth: "160px", |
| | | className: "date-cell", |
| | | formatData: cell => (cell ? dayjs(cell).format("YYYY-MM-DD") : ""), |
| | | align: "center", |
| | | }, |
| | | { |
| | | label: "承诺日期", |
| | | prop: "promisedDeliveryDate", |
| | | width: "160px", |
| | | minWidth: "160px", |
| | | className: "date-cell", |
| | | formatData: cell => (cell ? dayjs(cell).format("YYYY-MM-DD") : ""), |
| | | align: "center", |
| | | }, |
| | | { |
| | | label: "销售合同号", |
| | | prop: "salesContractNo", |
| | | width: "200px", |
| | | dataType: "slot", |
| | | slot: "salesContractNo", |
| | | }, |
| | | { |
| | | label: "客户名称", |
| | | prop: "customerName", |
| | | width: "150px", |
| | | }, |
| | | { |
| | | label: "项目名称", |
| | | prop: "projectName", |
| | | width: "150px", |
| | | }, |
| | | // { |
| | | // label: "销售合同号", |
| | | // prop: "salesContractNo", |
| | | // width: "200px", |
| | | // dataType: "slot", |
| | | // slot: "salesContractNo", |
| | | // }, |
| | | // { |
| | | // label: "客户名称", |
| | | // prop: "customerName", |
| | | // width: "150px", |
| | | // }, |
| | | // { |
| | | // label: "项目名称", |
| | | // prop: "projectName", |
| | | // width: "150px", |
| | | // }, |
| | | { |
| | | label: "备注", |
| | | width: "150px", |
| | | minWidth: "150px", |
| | | prop: "remark", |
| | | align: "center", |
| | | }, |
| | | { |
| | | dataType: "action", |
| | |
| | | mergeForm.productName = row.productName || ""; |
| | | mergeForm.model = row.model || ""; |
| | | mergeForm.totalAssignedQuantity = |
| | | Number(row.qtyRequired || 0) - Number(row.quantityIssued || 0); |
| | | Number(row.qtyRequired || 0) - Number(row.quantityIssued || 0); |
| | | mergeForm.planCompleteTime = row.requiredDate || ""; |
| | | mergeForm.productId = row.productId || ""; |
| | | mergeForm.ids = [row.id]; |
| | | mergeForm.workshopId = row.workshopId ?? undefined; |
| | | sumAssignedQuantity.value = |
| | | Number(row.qtyRequired || 0) - Number(row.quantityIssued || 0); |
| | | Number(row.qtyRequired || 0) - Number(row.quantityIssued || 0); |
| | | isShowNewModal.value = true; |
| | | }, |
| | | }, |