From d460a2475ccf345d119701f3c631584f747ce2f5 Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期一, 15 六月 2026 17:17:25 +0800
Subject: [PATCH] 君歌 1.不需要bom、生产核算 2.新增销售台账后自动生成一个生产订单,然后对订单进行排产 3.生产排产要求可以选择计划时间,时间格式为年月日+时分秒;也要可以多选报工人 4.web和app生产报工中要细分报工开始和报工结束两个操作,根据操作的提交时间记录实际报工时长展示报工台账中 5.报工人选择的谁,只有在相关账号才能看到可报工的数据 6.不合格管理字段按照单据进行修改。 7.生产工时、质量问题汇总、客户档案、销售及回款都能从各模块中导出数据
---
src/views/productionManagement/processRoute/index.vue | 6
src/api/productionManagement/workOrder.js | 9
src/views/productionManagement/processRoute/processRouteItem/index.vue | 607 ------------
src/views/productionManagement/workOrderEdit/index.vue | 8
src/views/productionManagement/workOrderManagement/index.vue | 641 +++---------
/dev/null | 45
src/views/productionManagement/productionReporting/index.vue | 14
src/views/productionManagement/processRoute/New.vue | 66 -
src/views/salesManagement/indicatorStats/index.vue | 10
src/views/qualityManagement/nonconformingManagement/components/orderFormDia.vue | 428 +++++---
src/views/productionManagement/productionOrder/index.vue | 207 ++--
src/views/productionManagement/productionTraceability/index.vue | 6
src/views/productionManagement/processRoute/Edit.vue | 105 --
src/views/qualityManagement/nonconformingManagement/components/inspectionFormDia.vue | 239 ++--
src/api/qualityManagement/nonconformingManagement.js | 68 +
src/views/qualityManagement/nonconformingManagement/index.vue | 439 +++----
16 files changed, 930 insertions(+), 1,968 deletions(-)
diff --git a/src/api/productionManagement/workOrder.js b/src/api/productionManagement/workOrder.js
index b3050c9..79d1827 100644
--- a/src/api/productionManagement/workOrder.js
+++ b/src/api/productionManagement/workOrder.js
@@ -16,6 +16,15 @@
});
}
+// 寮�濮嬫姤宸�
+export function startWork(data) {
+ return request({
+ url: "/productionProductMain/startWork",
+ method: "post",
+ data: data,
+ });
+}
+
export function addProductMain(data) {
return request({
url: "/productionProductMain/addProductMain",
diff --git a/src/api/qualityManagement/nonconformingManagement.js b/src/api/qualityManagement/nonconformingManagement.js
index 50a1b74..e49ad37 100644
--- a/src/api/qualityManagement/nonconformingManagement.js
+++ b/src/api/qualityManagement/nonconformingManagement.js
@@ -1,5 +1,7 @@
import request from "@/utils/request";
+// ==================== 涓嶅悎鏍肩鐞嗭紙鏃фā鍧楋級 ====================
+
// 鏌ヨ涓嶅悎鏍肩鐞嗗垪琛�
export function qualityUnqualifiedListPage(query) {
return request({
@@ -8,7 +10,7 @@
params: query,
});
}
-// 鏂板涓嶅悎鏍肩鐞嗗垪琛�
+// 鏂板涓嶅悎鏍肩鐞�
export function qualityUnqualifiedAdd(query) {
return request({
url: "/quality/qualityUnqualified/add",
@@ -16,7 +18,7 @@
data: query,
});
}
-// 淇敼涓嶅悎鏍肩鐞嗗垪琛�
+// 淇敼涓嶅悎鏍肩鐞�
export function qualityUnqualifiedUpdate(query) {
return request({
url: "/quality/qualityUnqualified/update",
@@ -32,7 +34,7 @@
data: query,
});
}
-// 鍒犻櫎涓嶅悎鏍肩鐞嗗垪琛�
+// 鍒犻櫎涓嶅悎鏍肩鐞�
export function qualityUnqualifiedDel(query) {
return request({
url: "/quality/qualityUnqualified/del",
@@ -40,7 +42,7 @@
data: query,
});
}
-// 鏌ヨ涓嶅悎鏍肩鐞嗕俊鎭�
+// 鏌ヨ涓嶅悎鏍肩鐞嗚鎯�
export function getQualityUnqualifiedInfo(query) {
return request({
url: "/quality/qualityUnqualified/" + query,
@@ -48,3 +50,61 @@
data: query,
});
}
+
+// ==================== 涓嶅悎鏍煎搧澶勭悊鍗曪紙鏂版ā鍧楋級 ====================
+
+// 鍒嗛〉鏌ヨ涓嶅悎鏍煎搧澶勭悊鍗�
+export function qualityUnqualifiedOrderListPage(query) {
+ return request({
+ url: "/qualityUnqualifiedOrder/listPage",
+ method: "get",
+ params: query,
+ });
+}
+// 鏌ョ湅澶勭悊鍗曡鎯�
+export function getQualityUnqualifiedOrderDetail(id) {
+ return request({
+ url: `/qualityUnqualifiedOrder/${id}`,
+ method: "get",
+ });
+}
+// 鏂板澶勭悊鍗�
+export function saveQualityUnqualifiedOrder(data) {
+ return request({
+ url: "/qualityUnqualifiedOrder/save",
+ method: "post",
+ data,
+ });
+}
+// 淇敼澶勭悊鍗�
+export function updateQualityUnqualifiedOrder(data) {
+ return request({
+ url: "/qualityUnqualifiedOrder/update",
+ method: "put",
+ data,
+ });
+}
+// 鍒犻櫎澶勭悊鍗�
+export function deleteQualityUnqualifiedOrder(ids) {
+ return request({
+ url: "/qualityUnqualifiedOrder/delete",
+ method: "delete",
+ data: ids,
+ });
+}
+// 澶勭悊锛堝缃級澶勭悊鍗�
+export function dealQualityUnqualifiedOrder(data) {
+ return request({
+ url: "/qualityUnqualifiedOrder/deal",
+ method: "post",
+ data,
+ });
+}
+// 瀵煎嚭澶勭悊鍗�
+export function exportQualityUnqualifiedOrder(id) {
+ return request({
+ url: `/qualityUnqualifiedOrder/export/${id}`,
+ method: "get",
+ responseType: "blob",
+ });
+}
diff --git a/src/api/qualityManagement/qualityUnqualifiedOrder.js b/src/api/qualityManagement/qualityUnqualifiedOrder.js
deleted file mode 100644
index a6bc577..0000000
--- a/src/api/qualityManagement/qualityUnqualifiedOrder.js
+++ /dev/null
@@ -1,45 +0,0 @@
-import request from "@/utils/request";
-
-// 鍒嗛〉鏌ヨ涓嶅悎鏍煎搧澶勭悊鍗�
-export function listPage(query) {
- return request({
- url: "/qualityUnqualifiedOrder/listPage",
- method: "get",
- params: query,
- });
-}
-
-// 鏌ョ湅璇︽儏
-export function getDetail(id) {
- return request({
- url: `/qualityUnqualifiedOrder/${id}`,
- method: "get",
- });
-}
-
-// 鏂板澶勭悊鍗�
-export function save(data) {
- return request({
- url: "/qualityUnqualifiedOrder/save",
- method: "post",
- data,
- });
-}
-
-// 淇敼澶勭悊鍗�
-export function update(data) {
- return request({
- url: "/qualityUnqualifiedOrder/update",
- method: "put",
- data,
- });
-}
-
-// 鍒犻櫎澶勭悊鍗�
-export function remove(ids) {
- return request({
- url: "/qualityUnqualifiedOrder/delete",
- method: "delete",
- data: ids,
- });
-}
diff --git a/src/views/productionManagement/processRoute/Edit.vue b/src/views/productionManagement/processRoute/Edit.vue
index 0c0fe0f..d13a66e 100644
--- a/src/views/productionManagement/processRoute/Edit.vue
+++ b/src/views/productionManagement/processRoute/Edit.vue
@@ -25,33 +25,6 @@
</el-button>
</el-form-item>
- <el-form-item
- label="BOM"
- prop="bomId"
- :rules="[
- {
- required: true,
- message: '璇烽�夋嫨BOM',
- trigger: 'change',
- }
- ]"
- >
- <el-select
- v-model="formState.bomId"
- placeholder="璇烽�夋嫨BOM"
- clearable
- :disabled="!formState.productModelId || bomOptions.length === 0"
- style="width: 100%"
- >
- <el-option
- v-for="item in bomOptions"
- :key="item.id"
- :label="item.bomNo || `BOM-${item.id}`"
- :value="item.id"
- />
- </el-select>
- </el-form-item>
-
<el-form-item label="澶囨敞" prop="description">
<el-input v-model="formState.description" type="textarea" />
</el-form-item>
@@ -76,7 +49,6 @@
<script setup>
import {ref, computed, getCurrentInstance, onMounted, nextTick, watch} from "vue";
import {update} from "@/api/productionManagement/processRoute.js";
-import {getByModel} from "@/api/productionManagement/productBom.js";
import ProductSelectDialog from "@/views/basicData/product/ProductSelectDialog.vue";
const props = defineProps({
@@ -99,7 +71,6 @@
productModelId: undefined,
productName: "",
productModelName: "",
- bomId: undefined,
description: '',
});
@@ -113,7 +84,6 @@
});
const showProductSelectDialog = ref(false);
-const bomOptions = ref([]);
let { proxy } = getCurrentInstance()
@@ -129,92 +99,29 @@
productId: props.record.productId,
productModelId: props.record.productModelId,
productName: props.record.productName || "",
- // 娉ㄦ剰锛歳ecord涓殑瀛楁鏄痬odel锛岄渶瑕佹槧灏勫埌productModelName
productModelName: props.record.model || props.record.productModelName || "",
- bomId: props.record.bomId,
description: props.record.description || '',
};
- // 濡傛灉鏈変骇鍝佸瀷鍙稩D锛屽姞杞紹OM鍒楄〃
- if (props.record.productModelId) {
- loadBomList(props.record.productModelId);
- }
}
}
-// 鍔犺浇BOM鍒楄〃
-const loadBomList = async (productModelId) => {
- if (!productModelId) {
- bomOptions.value = [];
- return;
- }
- try {
- const res = await getByModel(productModelId);
- // 澶勭悊杩斿洖鐨凚OM鏁版嵁锛氬彲鑳芥槸鏁扮粍銆佸璞℃垨鍖呭惈data瀛楁
- let bomList = [];
- if (Array.isArray(res)) {
- bomList = res;
- } else if (res && res.data) {
- bomList = Array.isArray(res.data) ? res.data : [res.data];
- } else if (res && typeof res === 'object') {
- bomList = [res];
- }
- bomOptions.value = bomList;
- } catch (error) {
- console.error("鍔犺浇BOM鍒楄〃澶辫触锛�", error);
- bomOptions.value = [];
- }
-};
-
// 浜у搧閫夋嫨澶勭悊
-const handleProductSelect = async (products) => {
+const handleProductSelect = (products) => {
if (products && products.length > 0) {
const product = products[0];
- // 鍏堟煡璇OM鍒楄〃锛堝繀閫夛級
- try {
- const res = await getByModel(product.id);
- // 澶勭悊杩斿洖鐨凚OM鏁版嵁锛氬彲鑳芥槸鏁扮粍銆佸璞℃垨鍖呭惈data瀛楁
- let bomList = [];
- if (Array.isArray(res)) {
- bomList = res;
- } else if (res && res.data) {
- bomList = Array.isArray(res.data) ? res.data : [res.data];
- } else if (res && typeof res === 'object') {
- bomList = [res];
- }
-
- if (bomList.length > 0) {
- formState.value.productModelId = product.id;
- formState.value.productName = product.productName;
- formState.value.productModelName = product.model;
- // 濡傛灉褰撳墠閫夋嫨鐨凚OM涓嶅湪鏂板垪琛ㄤ腑锛屽垯閲嶇疆BOM閫夋嫨
- const currentBomExists = bomList.some(bom => bom.id === formState.value.bomId);
- if (!currentBomExists) {
- formState.value.bomId = undefined;
- }
- bomOptions.value = bomList;
- showProductSelectDialog.value = false;
- // 瑙﹀彂琛ㄥ崟楠岃瘉鏇存柊
- proxy.$refs["formRef"]?.validateField('productModelId');
- } else {
- proxy.$modal.msgError("璇ヤ骇鍝佹病鏈塀OM锛岃鍏堝垱寤築OM");
- }
- } catch (error) {
- // 濡傛灉鎺ュ彛杩斿洖404鎴栧叾浠栭敊璇紝璇存槑娌℃湁BOM
- proxy.$modal.msgError("璇ヤ骇鍝佹病鏈塀OM锛岃鍏堝垱寤築OM");
- }
+ formState.value.productModelId = product.id;
+ formState.value.productName = product.productName;
+ formState.value.productModelName = product.model;
+ showProductSelectDialog.value = false;
+ proxy.$refs["formRef"]?.validateField('productModelId');
}
};
const handleSubmit = () => {
proxy.$refs["formRef"].validate(valid => {
if (valid) {
- // 楠岃瘉鏄惁閫夋嫨浜嗕骇鍝佸拰BOM
if (!formState.value.productModelId) {
proxy.$modal.msgError("璇烽�夋嫨浜у搧");
- return;
- }
- if (!formState.value.bomId) {
- proxy.$modal.msgError("璇烽�夋嫨BOM");
return;
}
update(formState.value).then(res => {
diff --git a/src/views/productionManagement/processRoute/New.vue b/src/views/productionManagement/processRoute/New.vue
index b7f4f26..4f06198 100644
--- a/src/views/productionManagement/processRoute/New.vue
+++ b/src/views/productionManagement/processRoute/New.vue
@@ -24,26 +24,6 @@
: '閫夋嫨浜у搧' }}
</el-button>
</el-form-item>
- <el-form-item label="BOM"
- prop="bomId"
- :rules="[
- {
- required: true,
- message: '璇烽�夋嫨BOM',
- trigger: 'change',
- }
- ]">
- <el-select v-model="formState.bomId"
- placeholder="璇烽�夋嫨BOM"
- clearable
- :disabled="!formState.productModelId || bomOptions.length === 0"
- style="width: 100%">
- <el-option v-for="item in bomOptions"
- :key="item.id"
- :label="item.bomNo || `BOM-${item.id}`"
- :value="item.id" />
- </el-select>
- </el-form-item>
<el-form-item label="澶囨敞"
prop="description">
<el-input v-model="formState.description"
@@ -68,7 +48,6 @@
<script setup>
import { ref, computed, getCurrentInstance } from "vue";
import { add } from "@/api/productionManagement/processRoute.js";
- import { getByModel } from "@/api/productionManagement/productBom.js";
import ProductSelectDialog from "@/views/basicData/product/ProductSelectDialog.vue";
const props = defineProps({
@@ -86,7 +65,6 @@
productModelId: undefined,
productName: "",
productModelName: "",
- bomId: undefined,
description: "",
});
@@ -100,7 +78,6 @@
});
const showProductSelectDialog = ref(false);
- const bomOptions = ref([]);
let { proxy } = getCurrentInstance();
@@ -111,59 +88,28 @@
productModelId: undefined,
productName: "",
productModelName: "",
- bomId: undefined,
description: "",
};
- bomOptions.value = [];
isShow.value = false;
};
// 浜у搧閫夋嫨澶勭悊
- const handleProductSelect = async products => {
+ const handleProductSelect = products => {
if (products && products.length > 0) {
const product = products[0];
- // 鍏堟煡璇OM鍒楄〃锛堝繀閫夛級
- try {
- const res = await getByModel(product.id);
- // 澶勭悊杩斿洖鐨凚OM鏁版嵁锛氬彲鑳芥槸鏁扮粍銆佸璞℃垨鍖呭惈data瀛楁
- let bomList = [];
- if (Array.isArray(res)) {
- bomList = res;
- } else if (res && res.data) {
- bomList = Array.isArray(res.data) ? res.data : [res.data];
- } else if (res && typeof res === "object") {
- bomList = [res];
- }
-
- if (bomList.length > 0) {
- formState.value.productModelId = product.id;
- formState.value.productName = product.productName;
- formState.value.productModelName = product.model;
- formState.value.bomId = undefined; // 閲嶇疆BOM閫夋嫨
- bomOptions.value = bomList;
- showProductSelectDialog.value = false;
- // 瑙﹀彂琛ㄥ崟楠岃瘉鏇存柊
- proxy.$refs["formRef"]?.validateField("productModelId");
- } else {
- proxy.$modal.msgError("璇ヤ骇鍝佹病鏈塀OM锛岃鍏堝垱寤築OM");
- }
- } catch (error) {
- // 濡傛灉鎺ュ彛杩斿洖404鎴栧叾浠栭敊璇紝璇存槑娌℃湁BOM
- proxy.$modal.msgError("璇ヤ骇鍝佹病鏈塀OM锛岃鍏堝垱寤築OM");
- }
+ formState.value.productModelId = product.id;
+ formState.value.productName = product.productName;
+ formState.value.productModelName = product.model;
+ showProductSelectDialog.value = false;
+ proxy.$refs["formRef"]?.validateField("productModelId");
}
};
const handleSubmit = () => {
proxy.$refs["formRef"].validate(valid => {
if (valid) {
- // 楠岃瘉鏄惁閫夋嫨浜嗕骇鍝佸拰BOM
if (!formState.value.productModelId) {
proxy.$modal.msgError("璇烽�夋嫨浜у搧");
- return;
- }
- if (!formState.value.bomId) {
- proxy.$modal.msgError("璇烽�夋嫨BOM");
return;
}
console.log(formState.value, "formState.value====");
diff --git a/src/views/productionManagement/processRoute/index.vue b/src/views/productionManagement/processRoute/index.vue
index 1ef5b9d..e14e02b 100644
--- a/src/views/productionManagement/processRoute/index.vue
+++ b/src/views/productionManagement/processRoute/index.vue
@@ -89,10 +89,6 @@
prop: "model",
},
{
- label: "BOM缂栧彿",
- prop: "bomNo",
- },
- {
label: "鎻忚堪",
prop: "description",
},
@@ -263,8 +259,6 @@
processRouteCode: row.processRouteCode || "",
productName: row.productName || "",
model: row.model || "",
- bomNo: row.bomNo || "",
- bomId: row.bomId || "",
description: row.description || "",
type: "route",
},
diff --git a/src/views/productionManagement/processRoute/processRouteItem/index.vue b/src/views/productionManagement/processRoute/processRouteItem/index.vue
index 3c52410..db7905d 100644
--- a/src/views/productionManagement/processRoute/processRouteItem/index.vue
+++ b/src/views/productionManagement/processRoute/processRouteItem/index.vue
@@ -30,14 +30,6 @@
<span class="info-value">{{ routeInfo.model || '-' }}</span>
</div>
</div>
- <div class="info-item">
- <div class="info-label-wrapper">
- <span class="info-label">BOM缂栧彿</span>
- </div>
- <div class="info-value-wrapper">
- <span class="info-value">{{ routeInfo.bomNo || '-' }}</span>
- </div>
- </div>
<div class="info-item"
v-if="routeInfo.quantity && routeInfo.quantity !== 0">
<div class="info-label-wrapper">
@@ -253,164 +245,6 @@
</div>
</div>
</template>
- <!-- bom妯″潡 -->
- <div class="section-header"
- style="margin-top: 20px;">
- <div class="section-title">BOM 缁撴瀯</div>
- <div class="section-actions"
- v-if="pageType === 'order' && editable">
- <el-button v-if="!bomDataValue.isEdit"
- type="primary"
- @click="bomDataValue.isEdit = true">
- 缂栬緫
- </el-button>
- <el-button v-if="bomDataValue.isEdit"
- @click="cancelEditBom">
- 鍙栨秷
- </el-button>
- <el-button v-if="bomDataValue.isEdit"
- type="primary"
- @click="handleSaveBom"
- :loading="bomDataValue.loading">
- 淇濆瓨BOM
- </el-button>
- </div>
- </div>
- <el-table :data="bomTableData"
- border
- :preserve-expanded-content="false"
- :default-expand-all="true"
- style="width: 100%">
- <el-table-column type="expand">
- <template #default>
- <el-form ref="bomFormRef"
- :model="bomDataValue">
- <el-table :data="bomDataValue.dataList"
- row-key="tempId"
- default-expand-all
- :tree-props="{children: 'children', hasChildren: 'hasChildren'}"
- style="width: 100%">
- <el-table-column prop="productName"
- label="浜у搧" />
- <el-table-column prop="model"
- label="瑙勬牸">
- <template #default="{ row }">
- <el-form-item v-if="pageType === 'order' && bomDataValue.isEdit"
- :rules="[{ required: true, message: '璇烽�夋嫨瑙勬牸', trigger: ['blur','change'] }]"
- style="margin: 0">
- <el-select v-model="row.model"
- placeholder="璇烽�夋嫨瑙勬牸"
- clearable
- :disabled="!bomDataValue.isEdit || bomDataValue.dataList.some(item => (item).tempId === row.tempId)"
- style="width: 100%"
- @visible-change="(v) => { if (v) openBomDialog(row.tempId) }">
- <el-option v-if="row.model"
- :label="row.model"
- :value="row.model" />
- </el-select>
- </el-form-item>
- </template>
- </el-table-column>
- <el-table-column prop="processName"
- label="娑堣�楀伐搴�">
- <template #default="{ row }">
- <el-form-item v-if="pageType === 'order' && bomDataValue.isEdit"
- :rules="bomDataValue.dataList.some(item => (item).tempId === row.tempId) ? [] : [{ required: true, message: '璇烽�夋嫨娑堣�楀伐搴�', trigger: 'change' }]"
- style="margin: 0">
- <el-select v-model="row.processId"
- placeholder="璇烽�夋嫨"
- filterable
- clearable
- style="width: 100%"
- @change="value => handleBomProcessChange(row, value)"
- :disabled="!bomDataValue.isEdit || bomDataValue.dataList.some(item => (item).tempId === row.tempId)">
- <el-option v-for="item in bomDataValue.processOptions"
- :key="item.id"
- :label="item.name"
- :value="item.id" />
- </el-select>
- </el-form-item>
- </template>
- </el-table-column>
- <el-table-column prop="unitQuantity"
- label="鍗曚綅浜у嚭鎵�闇�鏁伴噺">
- <template #default="{ row }">
- <el-form-item v-if="pageType === 'order' && bomDataValue.isEdit"
- :rules="[{ required: true, message: '璇疯緭鍏ュ崟浣嶄骇鍑烘墍闇�鏁伴噺', trigger: ['blur','change'] }]"
- style="margin: 0">
- <el-input-number v-model="row.unitQuantity"
- :min="0"
- :precision="2"
- :step="1"
- controls-position="right"
- style="width: 100%"
- @change="handleUnitQuantityChange"
- :disabled="!bomDataValue.isEdit || bomDataValue.dataList.some(item => (item).tempId === row.tempId)" />
- </el-form-item>
- </template>
- </el-table-column>
- <el-table-column v-if="pageType === 'order'"
- prop="demandedQuantity"
- label="闇�姹傛�婚噺">
- <template #default="{ row }">
- <el-form-item v-if="pageType === 'order' && bomDataValue.isEdit"
- :rules="[{ required: true, message: '璇疯緭鍏ラ渶姹傛�婚噺', trigger: ['blur','change'] }]"
- style="margin: 0">
- <el-input-number v-model="row.demandedQuantity"
- :min="0"
- :precision="2"
- :step="1"
- controls-position="right"
- style="width: 100%"
- :disabled="true" />
- </el-form-item>
- </template>
- </el-table-column>
- <el-table-column prop="unit"
- label="鍗曚綅">
- <template #default="{ row }">
- <el-form-item v-if="pageType === 'order' && bomDataValue.isEdit"
- :rules="[{ required: true, message: '璇疯緭鍏ュ崟浣�', trigger: ['blur','change'] }]"
- style="margin: 0">
- <el-input v-model="row.unit"
- placeholder="璇疯緭鍏ュ崟浣�"
- clearable
- :disabled="!bomDataValue.isEdit || bomDataValue.dataList.some(item => (item).tempId === row.tempId)" />
- </el-form-item>
- </template>
- </el-table-column>
- <el-table-column label="鎿嶄綔"
- fixed="right"
- width="200"
- v-if="pageType === 'order' && bomDataValue.isEdit">
- <template #default="{ row }">
- <el-button v-if="bomDataValue.isEdit && !bomDataValue.dataList.some(item => (item).tempId === row.tempId)"
- type="danger"
- text
- @click="removeBomItem(row.tempId)">鍒犻櫎
- </el-button>
- <el-button v-if="bomDataValue.isEdit"
- type="primary"
- text
- @click="addBomItem(row.tempId)">娣诲姞
- </el-button>
- </template>
- </el-table-column>
- </el-table>
- </el-form>
- </template>
- </el-table-column>
- <el-table-column label="BOM缂栧彿"
- prop="bomNo" />
- <el-table-column label="浜у搧鍚嶇О"
- prop="productName" />
- <el-table-column label="瑙勬牸鍨嬪彿"
- prop="model" />
- </el-table>
- <ProductSelectDialog v-if="bomDataValue.showProductDialog"
- v-model="bomDataValue.showProductDialog"
- :single="true"
- @confirm="handleBomProduct" />
<!-- 涓婁紶缁勪欢寮圭獥 -->
<el-dialog v-model="uploadDialogVisible"
title="涓婁紶闄勪欢"
@@ -553,12 +387,6 @@
sortRouteItem,
} from "@/api/productionManagement/productProcessRoute.js";
import { processList } from "@/api/productionManagement/productionProcess.js";
- import { listProcessBom } from "@/api/productionManagement/productionOrder.js";
- import {
- queryList,
- queryList2,
- add2,
- } from "@/api/productionManagement/productStructure.js";
import AttachmentUpload from "@/components/AttachmentUpload/file/index.vue";
import {
attachmentList,
@@ -584,7 +412,6 @@
const dialogVisible = ref(false);
const operationType = ref("add"); // add | edit
const formRef = ref(null);
- const bomFormRef = ref(null);
const submitLoading = ref(false);
const cardsContainer = ref(null);
const tableRef = ref(null);
@@ -593,7 +420,6 @@
processRouteCode: "",
productName: "",
model: "",
- bomNo: "",
description: "",
quantity: 0,
technologyRoutingId: "",
@@ -770,7 +596,6 @@
processList({ size: -1, current: -1 })
.then(res => {
processOptions.value = res.data.records || [];
- bomDataValue.value.processOptions = processOptions.value;
})
.catch(err => {
console.error("鑾峰彇宸ュ簭澶辫触锛�", err);
@@ -783,16 +608,11 @@
processRouteCode: route.query.processRouteCode || "",
productName: route.query.productName || "",
model: route.query.model || "",
- bomNo: route.query.bomNo || "",
- bomId: route.query.bomId || "",
description: route.query.description || "",
quantity: route.query.quantity || 0,
technologyRoutingId: route.query.technologyRoutingId || "",
status: !(route.query.status == 1 || route.query.status === "false"),
};
- bomTableData.value[0].productName = routeInfo.value.productName;
- bomTableData.value[0].model = routeInfo.value.model;
- bomTableData.value[0].bomNo = routeInfo.value.bomNo;
};
// 鏂板
@@ -1147,103 +967,6 @@
}
};
- // BOM鐩稿叧鐘舵�佸拰鏂规硶
- const bomTableData = ref([
- {
- productName: "",
- model: "",
- bomNo: "",
- },
- ]);
-
- const bomDataValue = ref({
- dataList: [],
- processOptions: [],
- showProductDialog: false,
- currentRowName: null,
- loading: false,
- isEdit: false,
- });
-
- const syncProcessOperationFields = item => {
- const processId =
- item.processId ?? item.operationId ?? item.technologyOperationId ?? "";
- if (!processId) {
- item.processId = "";
- return;
- }
- const option = bomDataValue.value.processOptions.find(
- p => p.id === processId
- );
- const processName =
- option?.name || item.processName || item.operationName || "";
-
- item.processId = processId;
- if (pageType.value === "order") {
- item.technologyOperationId = processId;
- } else {
- item.operationId = processId;
- }
- item.processName = processName;
- item.operationName = processName;
- };
-
- const normalizeTreeData = items => {
- items.forEach(item => {
- item.tempId = item.tempId || item.id || `${Date.now()}_${Math.random()}`;
- syncProcessOperationFields(item);
- if (Array.isArray(item.children) && item.children.length > 0) {
- normalizeTreeData(item.children);
- }
- });
- };
-
- const toQuantityNumber = value => {
- const numberValue = Number(value);
- if (!Number.isFinite(numberValue)) {
- return 0;
- }
- return Number(numberValue.toFixed(2));
- };
-
- const syncDemandedQuantityTree = (items, parentDemandedQuantity = null) => {
- items.forEach(item => {
- if (parentDemandedQuantity !== null) {
- item.demandedQuantity = toQuantityNumber(
- parentDemandedQuantity * toQuantityNumber(item.unitQuantity)
- );
- }
-
- if (Array.isArray(item.children) && item.children.length > 0) {
- syncDemandedQuantityTree(
- item.children,
- toQuantityNumber(item.demandedQuantity)
- );
- }
- });
- };
-
- const recalculateDemandedQuantities = () => {
- if (pageType.value !== "order") {
- return;
- }
-
- const rootDemandedQuantity = routeInfo.value.quantity;
- if (
- rootDemandedQuantity === undefined ||
- rootDemandedQuantity === null ||
- rootDemandedQuantity === ""
- ) {
- syncDemandedQuantityTree(bomDataValue.value.dataList);
- return;
- }
-
- syncDemandedQuantityTree(
- bomDataValue.value.dataList,
- toQuantityNumber(rootDemandedQuantity)
- );
- };
-
const processChange = value => {
processOptions.value.forEach(item => {
if (item.id == value) {
@@ -1254,340 +977,10 @@
});
};
- const findSiblings = (items, tempId) => {
- if (!items || items.length === 0) return null;
- // 妫�鏌ュ綋鍓嶅眰绾�
- if (items.some(item => item.tempId === tempId)) {
- return items;
- }
- // 閫掑綊鏌ユ壘瀛愮骇
- for (const item of items) {
- if (item.children && item.children.length > 0) {
- const result = findSiblings(item.children, tempId);
- if (result) return result;
- }
- }
- return null;
- };
-
- const handleBomProcessChange = (row, value) => {
- row.processId = value || "";
- syncProcessOperationFields(row);
-
- // 妫�鏌ュ悓涓�灞傜骇鏄惁宸茬粡鏈夊叾浠栦笉鍚岀殑宸ュ簭琚�変腑
- const siblings = findSiblings(bomDataValue.value.dataList, row.tempId);
- if (siblings && value) {
- const hasDifferentProcess = siblings.some(sibling => {
- return (
- sibling.tempId !== row.tempId &&
- sibling.processId &&
- sibling.processId !== value
- );
- });
- if (hasDifferentProcess) {
- ElMessage.warning("鍚屼竴灞傜骇宸插瓨鍦ㄤ笉鍚岀殑宸ュ簭锛岃鍏堢粺涓�宸ュ簭鍚庡啀杩涜淇敼");
- }
- }
- };
-
- const openBomDialog = tempId => {
- bomDataValue.value.currentRowName = tempId;
- bomDataValue.value.showProductDialog = true;
- };
-
- const fetchBomData = async () => {
- try {
- const isOrderPage = pageType.value === "order";
- const { data } = await (isOrderPage ? queryList2 : queryList)(
- routeInfo.value.bomId
- );
- bomDataValue.value.dataList = data || [];
- normalizeTreeData(bomDataValue.value.dataList);
- recalculateDemandedQuantities();
- } catch (err) {
- console.error("鑾峰彇BOM鏁版嵁澶辫触锛�", err);
- }
- };
-
- const childItem = (item, tempId, productData) => {
- if (item.tempId === tempId) {
- item.productName = productData.productName;
- item.model = productData.model;
- item.productModelId = productData.id;
- item.unit = productData.unit || "";
- return true;
- }
- if (item.children && item.children.length > 0) {
- for (let child of item.children) {
- if (childItem(child, tempId, productData)) {
- return true;
- }
- }
- }
- return false;
- };
-
- const handleBomProduct = row => {
- if (!Array.isArray(row) || row.length === 0) {
- ElMessage.warning("璇烽�夋嫨涓�涓骇鍝�");
- return;
- }
- const productData = row[row.length - 1];
-
- const isTopLevel = bomDataValue.value.dataList.some(
- item => item.tempId === bomDataValue.value.currentRowName
- );
- if (isTopLevel) {
- if (
- productData.productName === bomTableData.value[0].productName &&
- productData.model === bomTableData.value[0].model
- ) {
- const hasOther = bomDataValue.value.dataList.some(
- item =>
- item.tempId !== bomDataValue.value.currentRowName &&
- item.productName === bomTableData.value[0].productName &&
- item.model === bomTableData.value[0].model
- );
- if (hasOther) {
- ElMessage.warning("鏈�澶栧眰鍜屽綋鍓嶄骇鍝佷竴鏍风殑涓�绾у彧鑳芥湁涓�涓�");
- return;
- }
- }
- }
- bomDataValue.value.dataList.forEach(item => {
- if (item.tempId === bomDataValue.value.currentRowName) {
- item.productName = productData.productName;
- item.model = productData.model;
- item.productModelId = productData.id;
- item.unit = productData.unit || "";
- return;
- }
- childItem(item, bomDataValue.value.currentRowName, productData);
- });
- bomDataValue.value.showProductDialog = false;
- };
-
- const removeBomItem = tempId => {
- const topIndex = bomDataValue.value.dataList.findIndex(
- item => item.tempId === tempId
- );
- if (topIndex !== -1) {
- bomDataValue.value.dataList.splice(topIndex, 1);
- return;
- }
-
- const delchildItem = (items, tempId) => {
- for (let i = 0; i < items.length; i++) {
- const item = items[i];
- if (item.tempId === tempId) {
- items.splice(i, 1);
- return true;
- }
- if (item.children && item.children.length > 0) {
- if (delchildItem(item.children, tempId)) {
- return true;
- }
- }
- }
- return false;
- };
-
- bomDataValue.value.dataList.forEach(item => {
- if (item.children && item.children.length > 0) {
- delchildItem(item.children, tempId);
- }
- });
- };
-
- const handleUnitQuantityChange = () => {
- recalculateDemandedQuantities();
- };
-
- const addchildItem = (item, tempId) => {
- if (item.tempId === tempId) {
- if (!item.children) {
- item.children = [];
- }
- item.children.push({
- parentId: item.id || "",
- parentTempId: item.tempId || "",
- productName: "",
- productId: "",
- model: undefined,
- productModelId: undefined,
- processId: "",
- processName: "",
- [pageType.value === "order" ? "technologyOperationId" : "operationId"]:
- "",
- operationName: "",
- unitQuantity: 1,
- demandedQuantity: 0,
- children: [],
- unit: "",
- tempId: new Date().getTime(),
- });
- recalculateDemandedQuantities();
- return true;
- }
- if (item.children && item.children.length > 0) {
- for (let child of item.children) {
- if (addchildItem(child, tempId)) {
- return true;
- }
- }
- }
- return false;
- };
-
- const addBomItem = tempId => {
- bomDataValue.value.dataList.forEach(item => {
- if (item.tempId === tempId) {
- if (!item.children) {
- item.children = [];
- }
- item.children.push({
- parentId: item.id || "",
- parentTempId: item.tempId || "",
- productName: "",
- productId: "",
- model: undefined,
- productModelId: undefined,
- processId: "",
- processName: "",
- [pageType.value === "order" ? "technologyOperationId" : "operationId"]:
- "",
- operationName: "",
- unitQuantity: 1,
- demandedQuantity: 0,
- unit: "",
- children: [],
- tempId: new Date().getTime(),
- });
- recalculateDemandedQuantities();
- return;
- }
- addchildItem(item, tempId);
- });
- };
-
- const validateAllBom = () => {
- let isValid = true;
- const isOrderPage = pageType.value === "order";
-
- const validateItem = (item, isTopLevel = false) => {
- if (!item.model) {
- ElMessage.error("璇烽�夋嫨瑙勬牸");
- isValid = false;
- return;
- }
- if (!isTopLevel && !item.processId) {
- ElMessage.error("璇烽�夋嫨娑堣�楀伐搴�");
- isValid = false;
- return;
- }
- if (!item.unitQuantity) {
- ElMessage.error("璇疯緭鍏ュ崟浣嶄骇鍑烘墍闇�鏁伴噺");
- isValid = false;
- return;
- }
- if (isOrderPage && !item.demandedQuantity) {
- ElMessage.error("璇疯緭鍏ラ渶姹傛�婚噺");
- isValid = false;
- return;
- }
-
- if (item.children && item.children.length > 0) {
- item.children.forEach(child => {
- validateItem(child, false);
- });
- }
- };
-
- // 鏍¢獙鍚屼竴灞傜骇鐨勫伐搴忔槸鍚︿竴鑷�
- const validateProcessConsistency = items => {
- if (!items || items.length === 0) return;
-
- // 妫�鏌ュ綋鍓嶅眰绾�
- const processes = items
- .filter(item => item.processId)
- .map(item => item.processId);
- if (processes.length > 1) {
- const uniqueProcesses = [...new Set(processes)];
- if (uniqueProcesses.length > 1) {
- ElMessage.error("鍚屼竴灞傜骇鐨勫伐搴忓繀椤讳竴鑷�");
- isValid = false;
- return;
- }
- }
-
- // 閫掑綊妫�鏌ュ瓙绾�
- items.forEach(item => {
- if (item.children && item.children.length > 0) {
- validateProcessConsistency(item.children);
- }
- });
- };
-
- bomDataValue.value.dataList.forEach(item => {
- validateItem(item, true);
- });
-
- validateProcessConsistency(bomDataValue.value.dataList);
-
- return isValid;
- };
-
- const buildSubmitTree = items => {
- return items.map(item => {
- const current = { ...item };
- syncProcessOperationFields(current);
- current.children = Array.isArray(current.children)
- ? buildSubmitTree(current.children)
- : [];
- return current;
- });
- };
-
- const cancelEditBom = () => {
- bomDataValue.value.isEdit = false;
- fetchBomData();
- };
-
- const handleSaveBom = () => {
- bomDataValue.value.loading = true;
- console.log(bomDataValue.value.dataList, "bomDataValue.value.dataList");
-
- normalizeTreeData(bomDataValue.value.dataList);
- recalculateDemandedQuantities();
-
- const valid = validateAllBom();
- if (valid) {
- add2({
- // bomId: Number(routeInfo.value.bomId),
- productionOrderBomId: Number(routeInfo.value.bomId) || null,
- children: buildSubmitTree(bomDataValue.value.dataList || []),
- })
- .then(() => {
- ElMessage.success("BOM淇濆瓨鎴愬姛");
- bomDataValue.value.isEdit = false;
- refreshCurrentPage();
- })
- .catch(() => {
- ElMessage.error("BOM淇濆瓨澶辫触");
- })
- .finally(() => {
- bomDataValue.value.loading = false;
- });
- } else {
- bomDataValue.value.loading = false;
- }
- };
-
const refreshCurrentPage = () => {
getRouteInfo();
getList();
getProcessList();
- fetchBomData();
if (pageType.value === "order") {
getAttachmentList();
}
diff --git a/src/views/productionManagement/productionOrder/index.vue b/src/views/productionManagement/productionOrder/index.vue
index 4d71881..e77d2bf 100644
--- a/src/views/productionManagement/productionOrder/index.vue
+++ b/src/views/productionManagement/productionOrder/index.vue
@@ -192,7 +192,8 @@
</div>
</div>
</el-dialog>
- <MaterialLedgerDialog v-model="materialDialogVisible"
+ <!-- 棰嗘枡/琛ユ枡/棰嗘枡璇︽儏鍔熻兘宸查殣钘� -->
+ <!-- <MaterialLedgerDialog v-model="materialDialogVisible"
:order-row="currentMaterialOrder"
@saved="getList" />
<MaterialDetailDialog v-model="materialDetailDialogVisible"
@@ -200,16 +201,16 @@
@confirmed="getList" />
<MaterialSupplementDialog v-model="materialSupplementDialogVisible"
:order-row="currentMaterialSupplementOrder"
- @saved="getList" />
+ @saved="getList" /> -->
<new-product-order v-if="isShowNewModal"
v-model:visible="isShowNewModal"
@completed="handleQuery" />
- <!-- 鎵撳嵃棰嗘枡鍗曠粍浠� -->
- <div class="print-requisition-wrapper">
+ <!-- 鎵撳嵃棰嗘枡鍗曞姛鑳藉凡闅愯棌 -->
+ <!-- <div class="print-requisition-wrapper">
<PrintMaterialRequisition ref="printRef"
:order-row="printOrderRow"
:material-list="printMaterialList" />
- </div>
+ </div> -->
</div>
</template>
@@ -237,16 +238,18 @@
} from "@/api/productionManagement/productionOrder.js";
import { productWorkOrderPage } from "@/api/productionManagement/workOrder.js";
import { listMain as getOrderProcessRouteMain } from "@/api/productionManagement/productProcessRoute.js";
- import MaterialLedgerDialog from "@/views/productionManagement/productionOrder/components/MaterialLedgerDialog.vue";
- import MaterialDetailDialog from "@/views/productionManagement/productionOrder/components/MaterialDetailDialog.vue";
- import MaterialSupplementDialog from "@/views/productionManagement/productionOrder/components/MaterialSupplementDialog.vue";
- import PrintMaterialRequisition from "@/views/productionManagement/productionOrder/components/PrintMaterialRequisition.vue";
+ // 棰嗘枡/琛ユ枡/棰嗘枡璇︽儏/鎵撳嵃棰嗘枡鍗曞姛鑳藉凡闅愯棌
+ // import MaterialLedgerDialog from "@/views/productionManagement/productionOrder/components/MaterialLedgerDialog.vue";
+ // import MaterialDetailDialog from "@/views/productionManagement/productionOrder/components/MaterialDetailDialog.vue";
+ // import MaterialSupplementDialog from "@/views/productionManagement/productionOrder/components/MaterialSupplementDialog.vue";
+ // import PrintMaterialRequisition from "@/views/productionManagement/productionOrder/components/PrintMaterialRequisition.vue";
import PIMTable from "@/components/PIMTable/PIMTable.vue";
import { listPage } from "@/api/productionManagement/processRoute.js";
- import {
- listMaterialPickingDetail,
- listMaterialPickingBom,
- } from "@/api/productionManagement/productionOrder.js";
+ // 棰嗘枡鍔熻兘宸查殣钘�
+ // import {
+ // listMaterialPickingDetail,
+ // listMaterialPickingBom,
+ // } from "@/api/productionManagement/productionOrder.js";
const NewProductOrder = defineAsyncComponent(() =>
import("@/views/productionManagement/productionOrder/New.vue")
);
@@ -398,41 +401,42 @@
showSourceData(row);
},
},
- {
- name: "棰嗘枡",
- type: "text",
- color: "#5EC7AB",
- showHide: row => !row.endOrder && !row.returned,
- clickFun: row => {
- openMaterialDialog(row);
- },
- },
- {
- name: "琛ユ枡",
- type: "text",
- color: "#5EC7AB",
- showHide: row => !row.endOrder && !row.returned,
- clickFun: row => {
- openMaterialSupplementDialog(row);
- },
- },
- {
- name: "棰嗘枡璇︽儏",
- type: "text",
- color: "#5EC7AB",
- clickFun: row => {
- openMaterialDetailDialog(row);
- },
- },
- {
- name: "鎵撳嵃棰嗘枡鍗�",
- type: "text",
- color: "#5EC7AB",
- showHide: row => !row.endOrder,
- clickFun: row => {
- handlePrint(row);
- },
- },
+ // 棰嗘枡/琛ユ枡/棰嗘枡璇︽儏/鎵撳嵃棰嗘枡鍗曞姛鑳藉凡闅愯棌
+ // {
+ // name: "棰嗘枡",
+ // type: "text",
+ // color: "#5EC7AB",
+ // showHide: row => !row.endOrder && !row.returned,
+ // clickFun: row => {
+ // openMaterialDialog(row);
+ // },
+ // },
+ // {
+ // name: "琛ユ枡",
+ // type: "text",
+ // color: "#5EC7AB",
+ // showHide: row => !row.endOrder && !row.returned,
+ // clickFun: row => {
+ // openMaterialSupplementDialog(row);
+ // },
+ // },
+ // {
+ // name: "棰嗘枡璇︽儏",
+ // type: "text",
+ // color: "#5EC7AB",
+ // clickFun: row => {
+ // openMaterialDetailDialog(row);
+ // },
+ // },
+ // {
+ // name: "鎵撳嵃棰嗘枡鍗�",
+ // type: "text",
+ // color: "#5EC7AB",
+ // showHide: row => !row.endOrder,
+ // clickFun: row => {
+ // handlePrint(row);
+ // },
+ // },
{
name: "鐢熶骇杩芥函",
type: "text",
@@ -525,48 +529,48 @@
orderId: null,
routeId: null,
});
- const materialDialogVisible = ref(false);
- const currentMaterialOrder = ref(null);
- const materialDetailDialogVisible = ref(false);
- const currentMaterialDetailOrder = ref(null);
- const materialSupplementDialogVisible = ref(false);
- const currentMaterialSupplementOrder = ref(null);
+ // 棰嗘枡/琛ユ枡/棰嗘枡璇︽儏鍔熻兘宸查殣钘�
+ // const materialDialogVisible = ref(false);
+ // const currentMaterialOrder = ref(null);
+ // const materialDetailDialogVisible = ref(false);
+ // const currentMaterialDetailOrder = ref(null);
+ // const materialSupplementDialogVisible = ref(false);
+ // const currentMaterialSupplementOrder = ref(null);
- // 鎵撳嵃鐩稿叧
- const printOrderRow = ref(null);
- const printMaterialList = ref([]);
- const handlePrint = async row => {
- printOrderRow.value = row;
- proxy.$modal.loading("姝e湪鑾峰彇棰嗘枡鏁版嵁...");
- try {
- printMaterialList.value = [];
- const detailRes = await listMaterialPickingDetail(row.id);
- const detailList = Array.isArray(detailRes?.data)
- ? detailRes.data
- : detailRes?.data?.records || [];
-
- if (detailList.length > 0) {
- printMaterialList.value = detailList;
- }
-
- if (printMaterialList.value.length === 0) {
- proxy.$modal.msgWarning("鏆傛棤棰嗘枡鏁版嵁");
- return;
- }
-
- // 绛夊緟 DOM 鏇存柊鍚庢墽琛屾墦鍗�
- proxy.$nextTick(() => {
- setTimeout(() => {
- window.print();
- }, 800);
- });
- } catch (e) {
- console.error("鑾峰彇棰嗘枡鏁版嵁澶辫触锛�", e);
- proxy.$modal.msgError("鑾峰彇棰嗘枡鏁版嵁澶辫触");
- } finally {
- proxy.$modal.closeLoading();
- }
- };
+ // 鎵撳嵃棰嗘枡鍗曞姛鑳藉凡闅愯棌
+ // const printOrderRow = ref(null);
+ // const printMaterialList = ref([]);
+ // const handlePrint = async row => {
+ // printOrderRow.value = row;
+ // proxy.$modal.loading("姝e湪鑾峰彇棰嗘枡鏁版嵁...");
+ // try {
+ // printMaterialList.value = [];
+ // const detailRes = await listMaterialPickingDetail(row.id);
+ // const detailList = Array.isArray(detailRes?.data)
+ // ? detailRes.data
+ // : detailRes?.data?.records || [];
+ //
+ // if (detailList.length > 0) {
+ // printMaterialList.value = detailList;
+ // }
+ //
+ // if (printMaterialList.value.length === 0) {
+ // proxy.$modal.msgWarning("鏆傛棤棰嗘枡鏁版嵁");
+ // return;
+ // }
+ //
+ // proxy.$nextTick(() => {
+ // setTimeout(() => {
+ // window.print();
+ // }, 800);
+ // });
+ // } catch (e) {
+ // console.error("鑾峰彇棰嗘枡鏁版嵁澶辫触锛�", e);
+ // proxy.$modal.msgError("鑾峰彇棰嗘枡鏁版嵁澶辫触");
+ // } finally {
+ // proxy.$modal.closeLoading();
+ // }
+ // };
const openBindRouteDialog = async (row, type) => {
bindForm.orderId = row.id;
@@ -612,20 +616,21 @@
}
};
- const openMaterialDialog = row => {
- currentMaterialOrder.value = row;
- materialDialogVisible.value = true;
- };
+ // 棰嗘枡/琛ユ枡/棰嗘枡璇︽儏鍔熻兘宸查殣钘�
+ // const openMaterialDialog = row => {
+ // currentMaterialOrder.value = row;
+ // materialDialogVisible.value = true;
+ // };
- const openMaterialDetailDialog = async row => {
- currentMaterialDetailOrder.value = row;
- materialDetailDialogVisible.value = true;
- };
+ // const openMaterialDetailDialog = async row => {
+ // currentMaterialDetailOrder.value = row;
+ // materialDetailDialogVisible.value = true;
+ // };
- const openMaterialSupplementDialog = row => {
- currentMaterialSupplementOrder.value = row;
- materialSupplementDialogVisible.value = true;
- };
+ // const openMaterialSupplementDialog = row => {
+ // currentMaterialSupplementOrder.value = row;
+ // materialSupplementDialogVisible.value = true;
+ // };
const handleReset = () => {
searchForm.value = {
diff --git a/src/views/productionManagement/productionReporting/index.vue b/src/views/productionManagement/productionReporting/index.vue
index fa4e163..4b1346f 100644
--- a/src/views/productionManagement/productionReporting/index.vue
+++ b/src/views/productionManagement/productionReporting/index.vue
@@ -244,13 +244,13 @@
fixed: "right",
width: 250,
operation: [
- {
- name: "鏌ョ湅鎶曞叆",
- type: "text",
- clickFun: row => {
- showInput(row);
- },
- },
+ // {
+ // name: "鏌ョ湅鎶曞叆",
+ // type: "text",
+ // clickFun: row => {
+ // showInput(row);
+ // },
+ // },
{
name: "鍙傛暟璇︽儏",
type: "text",
diff --git a/src/views/productionManagement/productionTraceability/index.vue b/src/views/productionManagement/productionTraceability/index.vue
index a726ad0..15508ff 100644
--- a/src/views/productionManagement/productionTraceability/index.vue
+++ b/src/views/productionManagement/productionTraceability/index.vue
@@ -173,9 +173,9 @@
align="center"
width="200">
<template #default="{ row }">
- <el-button type="primary"
- link
- @click="showInput(row.id)">鏌ョ湅鎶曞叆</el-button>
+<!-- <el-button type="primary"-->
+<!-- link-->
+<!-- @click="showInput(row.id)">鏌ョ湅鎶曞叆</el-button>-->
<el-button type="primary"
link
@click="showParamDetail(row.productionOperationParamList)">鍙傛暟璇︽儏</el-button>
diff --git a/src/views/productionManagement/workOrderEdit/index.vue b/src/views/productionManagement/workOrderEdit/index.vue
index 98d29f5..e215fdb 100644
--- a/src/views/productionManagement/workOrderEdit/index.vue
+++ b/src/views/productionManagement/workOrderEdit/index.vue
@@ -47,16 +47,16 @@
label-width="120px">
<el-form-item label="璁″垝寮�濮嬫椂闂�">
<el-date-picker v-model="editrow.planStartTime"
- type="date"
+ type="datetime"
placeholder="璇烽�夋嫨"
- value-format="YYYY-MM-DD"
+ value-format="YYYY-MM-DD HH:mm:ss"
style="width: 300px" />
</el-form-item>
<el-form-item label="璁″垝缁撴潫鏃堕棿">
<el-date-picker v-model="editrow.planEndTime"
- type="date"
+ type="datetime"
placeholder="璇烽�夋嫨"
- value-format="YYYY-MM-DD"
+ value-format="YYYY-MM-DD HH:mm:ss"
style="width: 300px" />
</el-form-item>
</el-form>
diff --git a/src/views/productionManagement/workOrderManagement/index.vue b/src/views/productionManagement/workOrderManagement/index.vue
index b721de6..dcbb49f 100644
--- a/src/views/productionManagement/workOrderManagement/index.vue
+++ b/src/views/productionManagement/workOrderManagement/index.vue
@@ -24,6 +24,11 @@
<el-button type="primary"
@click="handleQuery">鎼滅储</el-button>
</div>
+ <div class="search-item">
+ <el-switch v-model="filterMine"
+ active-text="浠呯湅鎴戠殑"
+ @change="handleQuery" />
+ </div>
</div>
</div>
<div class="table_list">
@@ -115,9 +120,9 @@
@click="printTransferCard">鎵撳嵃娴佽浆鍗�</el-button>
</div>
</el-dialog>
- <!-- 鎶ュ伐寮圭獥 -->
+ <!-- 鎶ュ伐寮圭獥锛堢粨鏉熸姤宸ョ敤锛� -->
<el-dialog v-model="reportDialogVisible"
- title="鎶ュ伐"
+ title="缁撴潫鎶ュ伐"
width="500px">
<el-form ref="reportFormRef"
:model="reportForm"
@@ -161,7 +166,6 @@
:value="user.userId" />
</el-select>
</el-form-item>
- <!-- 宸ユ椂 -->
<el-form-item label="宸ユ椂"
v-if="currentReportRowData?.type == 0"
prop="workHour">
@@ -245,7 +249,7 @@
<template #footer>
<span class="dialog-footer">
<el-button type="primary"
- @click="handleReport">纭畾</el-button>
+ @click="handleFinishWork">纭畾</el-button>
<el-button @click="reportDialogVisible = false">鍙栨秷</el-button>
</span>
</template>
@@ -268,9 +272,9 @@
import {
productWorkOrderPage,
addProductMain,
+ startWork,
downProductWorkOrder,
} from "@/api/productionManagement/workOrder.js";
- import { listMaterialPickingDetail } from "@/api/productionManagement/productionOrder.js";
import { findProcessParamListOrder } from "@/api/productionManagement/productProcessRoute.js";
import { getUserProfile, userListNoPageByTenantId } from "@/api/system/user.js";
import { getDicts } from "@/api/system/dict/data";
@@ -285,124 +289,59 @@
const { proxy } = getCurrentInstance();
const userStore = useUserStore();
+ const isCompleted = row => {
+ const status = Number(row?.completionStatus);
+ return Number.isFinite(status) && status >= 100;
+ };
+
+ const canOperate = row => !row.endOrder && !isCompleted(row);
+
const tableColumn = ref([
+ { label: "宸ュ崟绫诲瀷", prop: "workOrderType", width: "80" },
+ { label: "宸ュ崟缂栧彿", prop: "workOrderNo", width: "140" },
+ { label: "鐢熶骇璁㈠崟鍙�", prop: "npsNo", width: "140" },
+ { label: "浜у搧鍚嶇О", prop: "productName", width: "140" },
+ { label: "瑙勬牸", prop: "model" },
+ { label: "鍗曚綅", prop: "unit" },
+ { label: "宸ュ簭鍚嶇О", prop: "operationName", width: "100" },
+ { label: "闇�姹傛暟閲�", prop: "planQuantity", width: "140" },
+ { label: "瀹屾垚鏁伴噺", prop: "completeQuantity", width: "140" },
+ { label: "瀹屾垚杩涘害", prop: "completionStatus", dataType: "slot", slot: "completionStatus", width: "140" },
+ { label: "璁″垝寮�濮嬫椂闂�", prop: "planStartTime", width: "140" },
+ { label: "璁″垝缁撴潫鏃堕棿", prop: "planEndTime", width: "140" },
+ { label: "瀹為檯寮�濮嬫椂闂�", prop: "actualStartTime", width: "140" },
+ { label: "瀹為檯缁撴潫鏃堕棿", prop: "actualEndTime", width: "140" },
{
- label: "宸ュ崟绫诲瀷",
- prop: "workOrderType",
- width: "80",
- },
- {
- label: "宸ュ崟缂栧彿",
- prop: "workOrderNo",
- width: "140",
- },
- {
- label: "鐢熶骇璁㈠崟鍙�",
- prop: "npsNo",
- width: "140",
- },
- {
- label: "浜у搧鍚嶇О",
- prop: "productName",
- width: "140",
- },
- {
- label: "瑙勬牸",
- prop: "model",
- },
- {
- label: "鍗曚綅",
- prop: "unit",
- },
- {
- label: "宸ュ簭鍚嶇О",
- prop: "operationName",
- width: "100",
- },
- {
- label: "闇�姹傛暟閲�",
- prop: "planQuantity",
- width: "140",
- },
- {
- label: "瀹屾垚鏁伴噺",
- prop: "completeQuantity",
- width: "140",
- },
- {
- label: "瀹屾垚杩涘害",
- prop: "completionStatus",
- dataType: "slot",
- slot: "completionStatus",
- width: "140",
- },
- {
- label: "璁″垝寮�濮嬫椂闂�",
- prop: "planStartTime",
- width: "140",
- },
- {
- label: "璁″垝缁撴潫鏃堕棿",
- prop: "planEndTime",
- width: "140",
- },
- {
- label: "瀹為檯寮�濮嬫椂闂�",
- prop: "actualStartTime",
- width: "140",
- },
- {
- label: "瀹為檯缁撴潫鏃堕棿",
- prop: "actualEndTime",
- width: "140",
- },
- {
- label: "鎿嶄綔",
- width: "260",
- align: "center",
- dataType: "action",
- fixed: "right",
+ label: "鎿嶄綔", width: "260", align: "center", dataType: "action", fixed: "right",
operation: [
{
name: "娴佽浆鍗�",
- clickFun: row => {
- downloadAndPrintWorkOrder(row);
- },
+ clickFun: row => { downloadAndPrintWorkOrder(row); },
},
{
name: "闄勪欢",
- clickFun: row => {
- openWorkOrderFiles(row);
- },
+ clickFun: row => { openWorkOrderFiles(row); },
},
- // {
- // name: "鐗╂枡",
- // clickFun: row => {
- // openMaterialDialog(row);
- // },
- // },
{
- name: "鎶ュ伐",
- clickFun: row => {
- showReportDialog(row);
- },
- showHide: row => !row.endOrder,
+ name: "寮�濮嬫姤宸�",
+ showHide: row => canOperate(row) && !row.actualStartTime,
disabled: row => {
if (row.planQuantity <= 0) return true;
if (!row.userIds) return false;
try {
- const userIds =
- typeof row.userIds === "string"
- ? JSON.parse(row.userIds)
- : row.userIds;
+ const userIds = typeof row.userIds === "string" ? JSON.parse(row.userIds) : row.userIds;
if (Array.isArray(userIds)) {
return !userIds.some(id => String(id) === String(userStore.id));
}
return true;
- } catch (e) {
- return true;
- }
+ } catch (e) { return true; }
},
+ clickFun: row => { handleStartWork(row); },
+ },
+ {
+ name: "缁撴潫鎶ュ伐",
+ showHide: row => canOperate(row) && !!row.actualStartTime,
+ clickFun: row => { showReportDialog(row); },
},
],
},
@@ -410,8 +349,6 @@
const tableData = ref([]);
const tableLoading = ref(false);
const transferCardVisible = ref(false);
- const transferCardData = ref([]);
- const transferCardQrUrl = ref("");
const transferCardRowData = ref(null);
const reportDialogVisible = ref(false);
const fileDialogVisible = ref(false);
@@ -438,112 +375,69 @@
const dictOptions = ref({});
const paramLoading = ref(false);
- // 鐢熶骇鍚堟牸鏁伴噺楠岃瘉瑙勫垯
const validateQuantity = (rule, value, callback) => {
if (value === null || value === undefined || value === "") {
callback(new Error("璇疯緭鍏ョ敓浜у悎鏍兼暟閲�"));
return;
}
const num = Number(value);
- // 鏁存暟涓斿ぇ浜庣瓑浜�1
if (isNaN(num) || !Number.isInteger(num) || num < 0) {
callback(new Error("鐢熶骇鍚堟牸鏁伴噺蹇呴』澶т簬绛変簬0"));
return;
}
callback();
};
-
- // 鎶ュ簾鏁伴噺楠岃瘉瑙勫垯
const validateScrapQty = (rule, value, callback) => {
if (value === null || value === undefined || value === "") {
callback();
return;
}
const num = Number(value);
- // 鏁存暟涓斿ぇ浜庣瓑浜�0
if (isNaN(num) || !Number.isInteger(num) || num < 0) {
callback(new Error("鎶ュ簾鏁伴噺蹇呴』澶т簬绛変簬0"));
return;
}
callback();
};
-
- // 楠岃瘉瑙勫垯
const reportFormRules = {
quantity: [{ required: true, validator: validateQuantity, trigger: "blur" }],
scrapQty: [{ validator: validateScrapQty, trigger: "blur" }],
};
- // 澶勭悊鐢熶骇鍚堟牸鏁伴噺杈撳叆锛岄檺鍒跺繀椤诲ぇ浜庣瓑浜�0
const handleQuantityInput = value => {
- if (value === "" || value === null || value === undefined) {
- reportForm.quantity = null;
- return;
- }
+ if (value === "" || value === null || value === undefined) { reportForm.quantity = null; return; }
const num = Number(value);
- if (isNaN(num)) {
- return;
- }
- // 濡傛灉灏忎簬1锛屾竻闄�
- if (num < 0) {
- reportForm.quantity = null;
- return;
- }
- // 濡傛灉鏄皬鏁板彇鏁存暟閮ㄥ垎
+ if (isNaN(num)) return;
+ if (num < 0) { reportForm.quantity = null; return; }
if (!Number.isInteger(num)) {
const intValue = Math.floor(num);
- // 濡傛灉鍙栨暣鍚庡皬浜�1锛屾竻闄�
- if (intValue < 0) {
- reportForm.quantity = null;
- return;
- }
+ if (intValue < 0) { reportForm.quantity = null; return; }
reportForm.quantity = intValue;
return;
}
reportForm.quantity = num;
};
- // 澶勭悊鎶ュ簾鏁伴噺
const handleScrapQtyInput = value => {
- if (value === "" || value === null || value === undefined) {
- reportForm.scrapQty = null;
- return;
- }
+ if (value === "" || value === null || value === undefined) { reportForm.scrapQty = null; return; }
const num = Number(value);
- // 濡傛灉鏄疦aN锛屼繚鎸佸師鍊�
- if (isNaN(num)) {
- return;
- }
- // 濡傛灉鏄礋鏁帮紝娓呴櫎杈撳叆
- if (num < 0) {
- reportForm.scrapQty = null;
- return;
- }
- // 濡傛灉鏄皬鏁帮紝鍙栨暣鏁伴儴鍒�
- if (!Number.isInteger(num)) {
- reportForm.scrapQty = Math.floor(num);
- return;
- }
- // 鏈夋晥鐨勯潪璐熸暣鏁帮紙鍖呮嫭0锛�
+ if (isNaN(num)) return;
+ if (num < 0) { reportForm.scrapQty = null; return; }
+ if (!Number.isInteger(num)) { reportForm.scrapQty = Math.floor(num); return; }
reportForm.scrapQty = num;
};
+ const filterMine = ref(false);
const currentReportRowData = ref(null);
const materialDialogVisible = ref(false);
const currentMaterialOrderRow = ref(null);
- const page = reactive({
- current: 1,
- size: 100,
- total: 0,
- });
+ const page = reactive({ current: 1, size: 100, total: 0 });
const data = reactive({
- searchForm: {
- workOrderNo: "",
- npsNo: "",
- },
+ searchForm: { workOrderNo: "", npsNo: "" },
});
const { searchForm } = toRefs(data);
+
const toProgressPercentage = val => {
const n = Number(val);
if (!Number.isFinite(n)) return 0;
@@ -559,78 +453,41 @@
return "#67c23a";
};
- // 鏌ヨ鍒楄〃
- /** 鎼滅储鎸夐挳鎿嶄綔 */
- const handleQuery = () => {
- page.current = 1;
- getList();
- };
-
- const pagination = obj => {
- page.current = obj.page;
- page.size = obj.limit;
- getList();
- };
+ const handleQuery = () => { page.current = 1; getList(); };
+ const pagination = obj => { page.current = obj.page; page.size = obj.limit; getList(); };
const getList = () => {
tableLoading.value = true;
const params = { ...searchForm.value, ...page };
+ if (filterMine.value) { params.filterMine = true; }
productWorkOrderPage(params)
.then(res => {
tableLoading.value = false;
tableData.value = res.data.records;
page.total = res.data.total;
})
- .catch(() => {
- tableLoading.value = false;
- });
+ .catch(() => { tableLoading.value = false; });
};
- // 涓嬭浇骞舵墦鍗板伐鍗曟祦杞崱锛堟枃浠舵祦锛�
const downloadAndPrintWorkOrder = async row => {
if (!row || !row.id) {
proxy.$modal.msgError("缂哄皯宸ュ崟ID锛屾棤娉曚笅杞芥祦杞崱");
return;
}
- const fileName = row.workOrderNo
- ? `宸ュ崟娴佽浆鍗${row.workOrderNo}.xlsx`
- : "宸ュ崟娴佽浆鍗�.xlsx";
try {
- // 璋冪敤鎺ュ彛锛屼互 responseType: 'blob' 鑾峰彇鏂囦欢娴�
const blob = await downProductWorkOrder(row.id);
-
- if (!blob) {
- proxy.$modal.msgError("鏈幏鍙栧埌娴佽浆鍗℃枃浠�");
- return;
- }
-
- // 鍒涘缓 Blob URL
- const fileBlob =
- blob instanceof Blob
- ? blob
- : new Blob([blob], { type: blob.type || "application/octet-stream" });
+ if (!blob) { proxy.$modal.msgError("鏈幏鍙栧埌娴佽浆鍗℃枃浠�"); return; }
+ const fileBlob = blob instanceof Blob ? blob : new Blob([blob], { type: blob.type || "application/octet-stream" });
const url = window.URL.createObjectURL(fileBlob);
-
- // 鍒涘缓闅愯棌 iframe锛岀敤浜庤Е鍙戞祻瑙堝櫒鎵撳嵃
const iframe = document.createElement("iframe");
iframe.style.position = "fixed";
- iframe.style.right = "0";
- iframe.style.bottom = "0";
- iframe.style.width = "0";
- iframe.style.height = "0";
- iframe.style.border = "0";
+ iframe.style.right = "0"; iframe.style.bottom = "0";
+ iframe.style.width = "0"; iframe.style.height = "0"; iframe.style.border = "0";
iframe.src = url;
document.body.appendChild(iframe);
-
iframe.onload = () => {
- try {
- iframe.contentWindow?.focus();
- iframe.contentWindow?.print();
- } catch (e) {
- console.error("鑷姩璋冪敤鎵撳嵃澶辫触", e);
- // 閫�鑰屾眰鍏舵锛屾墦寮�鏂扮獥鍙g敱鐢ㄦ埛鎵嬪姩鎵撳嵃
- window.open(url);
- }
+ try { iframe.contentWindow?.focus(); iframe.contentWindow?.print(); }
+ catch (e) { window.open(url); }
};
} catch (e) {
console.error("涓嬭浇宸ュ崟娴佽浆鍗″け璐�", e);
@@ -638,17 +495,7 @@
}
};
- const showTransferCard = async row => {
- transferCardRowData.value = row;
- const qrContent = String(row.id);
-
- transferCardQrUrl.value = await QRCode.toDataURL(qrContent);
- transferCardVisible.value = true;
- };
-
- const printTransferCard = () => {
- window.print();
- };
+ const printTransferCard = () => { window.print(); };
const currentWorkOrderRow = ref(null);
const openWorkOrderFiles = row => {
@@ -657,58 +504,57 @@
fileDialogVisible.value = true;
};
- const showReportDialog = async row => {
- if (row.productionOrderId) {
- try {
- const res = await listMaterialPickingDetail(row.productionOrderId);
- const records = Array.isArray(res.data)
- ? res.data
- : res.data?.records || [];
- if (res.code === 200 && records.length === 0) {
- proxy.$modal.msgError("鏈鏂欐棤娉曟姤宸�");
- return;
+ const handleStartWork = row => {
+ proxy.$modal
+ .confirm("纭寮�濮嬫姤宸ワ紵", "鎻愮ず", { type: "info" })
+ .then(async () => {
+ try {
+ await startWork({
+ productionOperationTaskId: row.id,
+ userId: userStore.id,
+ });
+ proxy.$modal.msgSuccess("寮�濮嬫姤宸ユ垚鍔�");
+ getList();
+ } catch (e) {
+ proxy.$modal.msgError("寮�濮嬫姤宸ュけ璐�");
}
- } catch (error) {
- console.error("鏌ヨ棰嗘枡璇︽儏澶辫触:", error);
- }
- }
+ })
+ .catch(() => {});
+ };
+
+ const showReportDialog = async row => {
currentReportRowData.value = row;
const planQuantity = Number(row.planQuantity || 0);
const completeQuantity = Number(row.completeQuantity || 0);
const remainingQuantity = Math.max(0, planQuantity - completeQuantity);
reportForm.planQuantity = remainingQuantity;
- reportForm.quantity =
- row.quantity !== undefined && row.quantity !== null ? row.quantity : null;
+ reportForm.quantity = row.quantity !== undefined && row.quantity !== null ? row.quantity : null;
reportForm.productProcessRouteItemId = row.productProcessRouteItemId;
reportForm.workOrderId = row.id;
reportForm.reportWork = row.reportWork;
reportForm.productMainId = row.productMainId;
- reportForm.scrapQty =
- row.scrapQty !== undefined && row.scrapQty !== null ? row.scrapQty : null;
- reportForm.productionOrderRoutingOperationId =
- row.productionOrderRoutingOperationId;
+ reportForm.scrapQty = row.scrapQty !== undefined && row.scrapQty !== null ? row.scrapQty : null;
+ reportForm.productionOrderRoutingOperationId = row.productionOrderRoutingOperationId;
reportForm.productionOrderId = row.productionOrderId;
- if (row.type == 0) {
- reportForm.workHour = row.workHour || 0;
- } else {
- reportForm.workHour = 0;
- }
+ reportForm.workHour = row.type == 0 ? (row.workHour || 0) : 0;
nextTick(() => {
reportFormRef.value?.clearValidate();
if (row.productionOrderRoutingOperationId && row.productionOrderId) {
loadParams(row.productionOrderRoutingOperationId, row.productionOrderId);
}
});
+ if (userStore.id) {
+ reportForm.userId = userStore.id;
+ reportForm.userName = userStore.name || userStore.nickName || "";
+ }
getUserProfile()
.then(res => {
- if (res.code === 200) {
+ if (res.code === 200 && res.data) {
reportForm.userId = res.data.userId;
- reportForm.userName = res.data.nickName;
+ reportForm.userName = res.data.nickName || res.data.userName || "";
}
})
- .catch(err => {
- console.error("鑾峰彇鐢ㄦ埛淇℃伅澶辫触", err);
- });
+ .catch(err => { console.error("鑾峰彇鐢ㄦ埛淇℃伅澶辫触", err); });
reportDialogVisible.value = true;
};
@@ -718,70 +564,36 @@
materialDialogVisible.value = true;
};
- const handleReport = () => {
+ const handleFinishWork = () => {
reportFormRef.value?.validate(valid => {
- if (!valid) {
- return false;
- }
+ if (!valid) return;
if (reportForm.planQuantity <= 0) {
- ElMessageBox.alert("寰呯敓浜ф暟閲忎负0锛屾棤娉曟姤宸�", "鎻愮ず", {
- confirmButtonText: "纭畾",
- });
+ ElMessageBox.alert("寰呯敓浜ф暟閲忎负0锛屾棤娉曟姤宸�", "鎻愮ず", { confirmButtonText: "纭畾" });
return;
}
-
- // 楠岃瘉鐢熶骇鍚堟牸鏁伴噺
- if (
- reportForm.quantity === null ||
- reportForm.quantity === undefined ||
- reportForm.quantity === ""
- ) {
- ElMessageBox.alert("璇疯緭鍏ョ敓浜у悎鏍兼暟閲�", "鎻愮ず", {
- confirmButtonText: "纭畾",
- });
+ if (reportForm.quantity === null || reportForm.quantity === undefined || reportForm.quantity === "") {
+ ElMessageBox.alert("璇疯緭鍏ョ敓浜у悎鏍兼暟閲�", "鎻愮ず", { confirmButtonText: "纭畾" });
return;
}
-
const quantity = Number(reportForm.quantity);
-
if (isNaN(quantity) || quantity < 0) {
- ElMessageBox.alert("鐢熶骇鍚堟牸鏁伴噺蹇呴』澶т簬绛変簬0", "鎻愮ず", {
- confirmButtonText: "纭畾",
- });
+ ElMessageBox.alert("鐢熶骇鍚堟牸鏁伴噺蹇呴』澶т簬绛変簬0", "鎻愮ず", { confirmButtonText: "纭畾" });
return;
}
-
- // if (quantity > reportForm.planQuantity) {
- // ElMessageBox.alert("鏈鐢熶骇鏁伴噺涓嶈兘瓒呰繃寰呯敓浜ф暟閲�", "鎻愮ず", {
- // confirmButtonText: "纭畾",
- // });
- // return;
- // }
-
- // 楠岃瘉鎶ュ簾鏁伴噺
const scrapQty = Number(reportForm.scrapQty);
if (!isNaN(scrapQty) && scrapQty < 0) {
- ElMessageBox.alert("鎶ュ簾鏁伴噺涓嶈兘灏忎簬0", "鎻愮ず", {
- confirmButtonText: "纭畾",
- });
+ ElMessageBox.alert("鎶ュ簾鏁伴噺涓嶈兘灏忎簬0", "鎻愮ず", { confirmButtonText: "纭畾" });
return;
}
-
- // if (!isNaN(scrapQty) && scrapQty > quantity) {
- // ElMessageBox.alert("鎶ュ簾鏁伴噺涓嶈兘澶т簬鏈鐢熶骇鏁伴噺", "鎻愮ず", {
- // confirmButtonText: "纭畾",
- // });
- // return;
- // }
const productionOperationParamList = params.value.map(param => ({
...param,
inputValue: reportForm.paramGroups[param.id] ?? "",
}));
- const submitParams = {
- quantity: quantity,
+ addProductMain({
+ quantity,
scrapQty: isNaN(scrapQty) ? 0 : scrapQty,
userId: reportForm.userId,
userName: reportForm.userName,
@@ -789,23 +601,18 @@
productProcessRouteItemId: reportForm.productProcessRouteItemId,
reportWork: reportForm.reportWork,
productMainId: reportForm.productMainId,
- productionOrderRoutingOperationId:
- reportForm.productionOrderRoutingOperationId,
+ productionOrderRoutingOperationId: reportForm.productionOrderRoutingOperationId,
productionOrderId: reportForm.productionOrderId,
workHour: reportForm.workHour,
productionOperationParamList: productionOperationParamList,
- };
-
- addProductMain(submitParams)
- .then(res => {
- proxy.$modal.msgSuccess("鎶ュ伐鎴愬姛");
+ })
+ .then(() => {
+ proxy.$modal.msgSuccess("缁撴潫鎶ュ伐鎴愬姛");
reportDialogVisible.value = false;
getList();
})
.catch(() => {
- ElMessageBox.alert("鎶ュ伐澶辫触", "鎻愮ず", {
- confirmButtonText: "纭畾",
- });
+ ElMessageBox.alert("缁撴潫鎶ュ伐澶辫触", "鎻愮ず", { confirmButtonText: "纭畾" });
});
});
};
@@ -820,221 +627,81 @@
if (dictOptions.value[dictType]) return dictOptions.value[dictType];
try {
const res = await getDicts(dictType);
- if (res.code === 200) {
- dictOptions.value[dictType] = res.data;
- return res.data;
- }
+ if (res.code === 200) { dictOptions.value[dictType] = res.data; return res.data; }
return [];
- } catch (error) {
- console.error("鑾峰彇瀛楀吀鏁版嵁澶辫触:", error);
- return [];
- }
+ } catch (error) { console.error("鑾峰彇瀛楀吀鏁版嵁澶辫触:", error); return []; }
};
const loadParams = (productionOrderRoutingOperationId, productionOrderId) => {
paramLoading.value = true;
- findProcessParamListOrder({
- productionOrderRoutingOperationId,
- productionOrderId,
- })
+ findProcessParamListOrder({ productionOrderRoutingOperationId, productionOrderId })
.then(res => {
if (res.code === 200) {
const paramList = res.data || [];
params.value = paramList;
reportForm.paramGroups = {};
paramList.forEach(param => {
- if (!reportForm.paramGroups[param.id]) {
- reportForm.paramGroups[param.id] = "";
- }
- if (param.paramType == "3" && param.paramFormat) {
- getDictOptions(param.paramFormat);
- }
+ if (!reportForm.paramGroups[param.id]) { reportForm.paramGroups[param.id] = ""; }
+ if (param.paramType == "3" && param.paramFormat) { getDictOptions(param.paramFormat); }
});
}
})
- .catch(err => {
- console.error("鑾峰彇宸ュ簭鍙傛暟澶辫触:", err);
- })
- .finally(() => {
- paramLoading.value = false;
- });
+ .catch(err => { console.error("鑾峰彇宸ュ簭鍙傛暟澶辫触:", err); })
+ .finally(() => { paramLoading.value = false; });
};
onMounted(() => {
userStore.getInfo();
getList();
- // 鑾峰彇鐢ㄦ埛鍒楄〃
userListNoPageByTenantId().then(res => {
- if (res.code === 200) {
- userOptions.value = res.data;
- }
+ if (res.code === 200) { userOptions.value = res.data; }
});
});
</script>
<style scoped lang="scss">
- .search-row {
- display: flex;
- align-items: center;
- gap: 12px;
- }
- .search-item {
- display: flex;
- align-items: center;
- }
- .search_title {
- margin-right: 8px;
- font-size: 14px;
- color: #606266;
- }
- .transfer-card-title {
- text-align: center;
- font-size: 24px;
- font-weight: bold;
- margin-bottom: 20px;
- color: #303133;
- }
- .transfer-card-container {
- display: flex;
- justify-content: space-between;
- padding: 20px;
- }
- .transfer-card-info {
- flex: 1;
- margin-right: 20px;
- }
- .info-group {
- margin-bottom: 20px;
- }
- .info-item {
- display: flex;
- margin-bottom: 10px;
- }
- .info-label {
- width: 100px;
- font-weight: bold;
- color: #606266;
- }
- .info-value {
- flex: 1;
- color: #303133;
- }
- .transfer-card-qr {
- display: flex;
- flex-direction: column;
- align-items: center;
- }
- .qr-container {
- text-align: center;
- }
- .print-button-container {
- text-align: center;
- margin-top: 20px;
- }
- .param-grid {
- margin-top: 10px;
- border-top: 1px solid #ebe9f3;
- padding-top: 10px;
- }
- .param-item {
- margin-bottom: 12px;
- }
- .param-input-group {
- display: flex;
- align-items: center;
- gap: 8px;
- }
- .param-input {
- flex: 1;
- }
- .param-select {
- flex: 1;
- }
- .param-unit {
- color: #909399;
- font-size: 12px;
- min-width: 30px;
- }
+ .search-row { display: flex; align-items: center; gap: 12px; }
+ .search-item { display: flex; align-items: center; }
+ .search_title { margin-right: 8px; font-size: 14px; color: #606266; }
+ .transfer-card-title { text-align: center; font-size: 24px; font-weight: bold; margin-bottom: 20px; color: #303133; }
+ .transfer-card-container { display: flex; justify-content: space-between; padding: 20px; }
+ .transfer-card-info { flex: 1; margin-right: 20px; }
+ .info-group { margin-bottom: 20px; }
+ .info-item { display: flex; margin-bottom: 10px; }
+ .info-label { width: 100px; font-weight: bold; color: #606266; }
+ .info-value { flex: 1; color: #303133; }
+ .transfer-card-qr { display: flex; flex-direction: column; align-items: center; }
+ .qr-container { text-align: center; }
+ .print-button-container { text-align: center; margin-top: 20px; }
+ .param-grid { margin-top: 10px; border-top: 1px solid #ebe9f3; padding-top: 10px; }
+ .param-item { margin-bottom: 12px; }
+ .param-input-group { display: flex; align-items: center; gap: 8px; }
+ .param-input { flex: 1; }
+ .param-select { flex: 1; }
+ .param-unit { color: #909399; font-size: 12px; min-width: 30px; }
</style>
-<style lang="scss">
+<style lang="scss">
@media print {
- @page {
- size: landscape;
- }
- body * {
- visibility: hidden;
- }
- .el-dialog__wrapper,
- .el-dialog,
- .el-dialog__body,
- .transfer-card-title,
- .transfer-card-container,
- .transfer-card-container *,
- .info-item,
- .info-label,
- .info-value {
- visibility: visible;
- }
- .print-button-container {
- visibility: hidden;
- }
- .el-dialog__wrapper {
- position: absolute;
- top: 0;
- left: 0;
- right: 0;
- margin: 0;
- }
- .el-dialog {
- width: 100% !important;
- max-width: 800px;
- margin: 0 auto !important;
- }
- .el-dialog__header,
- .el-dialog__footer {
- display: none;
- }
- .el-dialog__body {
- padding: 20px;
- }
- .transfer-card-container {
- height: auto;
- display: flex;
- gap: 20px;
- }
+ @page { size: landscape; }
+ body * { visibility: hidden; }
+ .el-dialog__wrapper, .el-dialog, .el-dialog__body,
+ .transfer-card-title, .transfer-card-container, .transfer-card-container *,
+ .info-item, .info-label, .info-value { visibility: visible; }
+ .print-button-container { visibility: hidden; }
+ .el-dialog__wrapper { position: absolute; top: 0; left: 0; right: 0; margin: 0; }
+ .el-dialog { width: 100% !important; max-width: 800px; margin: 0 auto !important; }
+ .el-dialog__header, .el-dialog__footer { display: none; }
+ .el-dialog__body { padding: 20px; }
+ .transfer-card-container { height: auto; display: flex; gap: 20px; }
.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;
- }
+ .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; }
}
}
- .transfer-card-qr {
- width: 160px;
- display: flex;
- flex-direction: column;
- align-items: center;
- justify-content: flex-start;
- }
- .qr-container img {
- width: 140px !important;
- height: 140px !important;
- }
+ .transfer-card-qr { width: 160px; display: flex; flex-direction: column; align-items: center; justify-content: flex-start; }
+ .qr-container img { width: 140px !important; height: 140px !important; }
}
</style>
diff --git a/src/views/qualityManagement/nonconformingManagement/components/inspectionFormDia.vue b/src/views/qualityManagement/nonconformingManagement/components/inspectionFormDia.vue
index e53fc49..c423cea 100644
--- a/src/views/qualityManagement/nonconformingManagement/components/inspectionFormDia.vue
+++ b/src/views/qualityManagement/nonconformingManagement/components/inspectionFormDia.vue
@@ -1,117 +1,120 @@
<template>
<div>
<el-dialog
- v-model="dialogFormVisible"
- :title="operationType === 'add' ? '鏂板涓嶅悎鏍煎鐞�' : '澶勭悊涓嶅悎鏍�'"
- width="70%"
- @close="closeDia"
+ v-model="dialogFormVisible"
+ :title="operationType === 'add' ? '鏂板涓嶅悎鏍煎鐞�' : '澶勭悊涓嶅悎鏍�'"
+ width="75%"
+ @close="closeDia"
>
- <el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef">
- <el-row :gutter="30">
+ <el-form :model="form" label-width="130px" :rules="rules" ref="formRef">
+ <el-row :gutter="20">
<el-col :span="12">
- <el-form-item label="绫诲埆锛�" prop="inspectType">
- <el-select v-model="form.inspectType" disabled>
+ <el-form-item label="绫诲埆">
+ <el-select v-model="form.inspectType" disabled style="width: 100%">
<el-option label="鍘熸潗鏂欐楠�" :value="0" />
<el-option label="杩囩▼妫�楠�" :value="1" />
<el-option label="鍑哄巶妫�楠�" :value="2" />
</el-select>
</el-form-item>
</el-col>
- </el-row>
- <el-row :gutter="30">
<el-col :span="12">
- <el-form-item label="浜у搧鍚嶇О锛�" prop="productId">
+ <el-form-item label="浜у搧鍚嶇О">
<el-tree-select
- v-model="form.productId"
- placeholder="璇烽�夋嫨"
- clearable
- disabled
- check-strictly
- @change="getModels"
- :data="productOptions"
- :render-after-expand="false"
- style="width: 100%"
+ v-model="form.productId"
+ placeholder="璇烽�夋嫨"
+ clearable
+ disabled
+ check-strictly
+ @change="getModels"
+ :data="productOptions"
+ :render-after-expand="false"
+ style="width: 100%"
/>
</el-form-item>
</el-col>
- <el-col :span="12">
- <el-form-item label="瑙勬牸鍨嬪彿锛�" prop="model">
- <el-input v-model="form.model" placeholder="璇疯緭鍏�" clearable disabled/>
+ </el-row>
+
+ <el-row :gutter="20">
+ <el-col :span="8">
+ <el-form-item label="瑙勬牸鍨嬪彿">
+ <el-input v-model="form.model" placeholder="璇疯緭鍏�" clearable disabled />
+ </el-form-item>
+ </el-col>
+ <el-col :span="8">
+ <el-form-item label="鍗曚綅">
+ <el-input v-model="form.unit" placeholder="璇疯緭鍏�" clearable disabled />
+ </el-form-item>
+ </el-col>
+ <el-col :span="8">
+ <el-form-item label="鏁伴噺">
+ <el-input v-model="form.quantity" placeholder="璇疯緭鍏�" clearable disabled />
</el-form-item>
</el-col>
</el-row>
- <el-row :gutter="30">
+
+ <el-row :gutter="20">
<el-col :span="12">
- <el-form-item label="鍗曚綅锛�" prop="unit">
- <el-input v-model="form.unit" placeholder="璇疯緭鍏�" clearable disabled/>
+ <el-form-item label="妫�楠屽憳">
+ <el-input v-model="form.checkName" placeholder="璇疯緭鍏�" clearable disabled />
</el-form-item>
</el-col>
<el-col :span="12">
- <el-form-item label="鏁伴噺锛�" prop="quantity">
- <el-input v-model="form.quantity" placeholder="璇疯緭鍏�" clearable disabled/>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="妫�楠屽憳锛�" prop="checkName">
- <el-input v-model="form.checkName" placeholder="璇疯緭鍏�" clearable disabled/>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="妫�娴嬫棩鏈燂細" prop="checkTime">
+ <el-form-item label="妫�娴嬫棩鏈�">
<el-date-picker
- v-model="form.checkTime"
- type="date"
- disabled
- placeholder="璇烽�夋嫨鏃ユ湡"
- value-format="YYYY-MM-DD"
- format="YYYY-MM-DD"
- clearable
- style="width: 100%"
+ v-model="form.checkTime"
+ type="date"
+ disabled
+ placeholder="璇烽�夋嫨鏃ユ湡"
+ value-format="YYYY-MM-DD"
+ format="YYYY-MM-DD"
+ clearable
+ style="width: 100%"
/>
</el-form-item>
</el-col>
</el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="涓嶅悎鏍肩幇璞★細" prop="defectivePhenomena">
- <el-input v-model="form.defectivePhenomena" placeholder="璇疯緭鍏�" clearable/>
+
+ <el-row :gutter="20">
+ <el-col :span="24">
+ <el-form-item label="涓嶅悎鏍肩幇璞�" prop="defectivePhenomena">
+ <el-input v-model="form.defectivePhenomena" type="textarea" :rows="2" placeholder="璇疯緭鍏�" clearable />
</el-form-item>
</el-col>
- <el-col :span="12">
- <el-form-item label="澶勭悊缁撴灉锛�" prop="dealResult">
- <el-select v-model="form.dealResult" placeholder="璇烽�夋嫨" clearable>
+ </el-row>
+
+ <el-row :gutter="20">
+ <el-col :span="8">
+ <el-form-item label="澶勭悊缁撴灉" prop="dealResult">
+ <el-select v-model="form.dealResult" placeholder="璇烽�夋嫨" clearable style="width: 100%">
<el-option :label="item.label" :value="item.value" v-for="item in filteredRejectionHandling" :key="item.value" />
</el-select>
</el-form-item>
</el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="澶勭悊浜猴細" prop="dealName">
+ <el-col :span="8">
+ <el-form-item label="澶勭悊浜�" prop="dealName">
<el-select v-model="form.dealName" placeholder="璇烽�夋嫨" clearable style="width: 100%">
- <el-option v-for="item in userList" :key="item.nickName" :label="item.nickName" :value="item.nickName"/>
+ <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-form-item label="澶勭悊鏃ユ湡锛�" prop="dealTime">
+ <el-col :span="8">
+ <el-form-item label="澶勭悊鏃ユ湡" prop="dealTime">
<el-date-picker
- v-model="form.dealTime"
- type="date"
- placeholder="璇烽�夋嫨鏃ユ湡"
- value-format="YYYY-MM-DD"
- format="YYYY-MM-DD"
- clearable
- style="width: 100%"
+ v-model="form.dealTime"
+ type="date"
+ placeholder="璇烽�夋嫨鏃ユ湡"
+ value-format="YYYY-MM-DD"
+ format="YYYY-MM-DD"
+ clearable
+ style="width: 100%"
/>
</el-form-item>
</el-col>
</el-row>
- <el-row :gutter="30">
+
+ <el-row :gutter="20">
<el-col :span="24">
- <el-form-item label="闄勪欢锛�">
+ <el-form-item label="闄勪欢">
<FileUpload v-model:file-list="form.storageBlobDTOs" :file-list="form.storageBlobVOs" />
</el-form-item>
</el-col>
@@ -128,20 +131,22 @@
</template>
<script setup>
-import {ref, reactive, toRefs, computed} from "vue";
-import {productTreeList} from "@/api/basicData/product.js";
+import { ref, reactive, toRefs, computed } from "vue";
+import { productTreeList } from "@/api/basicData/product.js";
import {
getQualityUnqualifiedInfo,
qualityUnqualifiedDeal
} from "@/api/qualityManagement/nonconformingManagement.js";
-import {userListNoPage} from "@/api/system/user.js";
+import { userListNoPage } from "@/api/system/user.js";
import FileUpload from "@/components/AttachmentUpload/file/index.vue";
-const { proxy } = getCurrentInstance()
-const emit = defineEmits(['close'])
-const { rejection_handling } = proxy.useDict("rejection_handling")
+const { proxy } = getCurrentInstance();
+const emit = defineEmits(["close"]);
+
+const { rejection_handling } = proxy.useDict("rejection_handling");
const dialogFormVisible = ref(false);
-const operationType = ref('')
+const operationType = ref("");
+
const data = reactive({
form: {
checkTime: "",
@@ -154,48 +159,36 @@
quantity: "",
checkCompany: "",
checkResult: "",
- inspectType: '',
- defectivePhenomena: '',
- dealResult: '',
- dealName: '',
- dealTime: '',
+ inspectType: "",
+ defectivePhenomena: "",
+ dealResult: "",
+ dealName: "",
+ dealTime: "",
method: undefined,
storageBlobDTOs: [],
storageBlobVOs: [],
},
rules: {
- checkTime: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" },],
- process: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
- checkName: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
- productId: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
- model: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
- unit: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
- quantity: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
- checkCompany: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
- checkResult: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
- defectivePhenomena: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- dealResult: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
+ defectivePhenomena: [{ required: true, message: "璇疯緭鍏ヤ笉鍚堟牸鐜拌薄", trigger: "blur" }],
+ dealResult: [{ required: true, message: "璇烽�夋嫨澶勭悊缁撴灉", trigger: "change" }],
dealName: [{ required: true, message: "璇烽�夋嫨澶勭悊浜�", trigger: "change" }],
- dealTime: [{ required: true, message: "璇疯緭鍏�", trigger: "change" }],
+ dealTime: [{ required: true, message: "璇烽�夋嫨澶勭悊鏃ユ湡", trigger: "change" }],
},
});
const { form, rules } = toRefs(data);
const productOptions = ref([]);
-const userList = ref([]); // 澶勭悊浜轰笅鎷夊垪琛�
+const userList = ref([]);
const filteredRejectionHandling = computed(() => {
const data = rejection_handling.value;
if (form.value.method) {
- return data.filter(item => item && item.label && item.label !== '杩斿伐' && item.label !== '杩斾慨')
+ return data.filter(item => item && item.label && item.label !== "杩斿伐" && item.label !== "杩斾慨");
}
- return data
-})
+ return data;
+});
-
-// 鎵撳紑寮规
const openDialog = async (type, row) => {
operationType.value = type;
- // 澶勭悊浜轰笅鎷夊垪琛�
try {
const userRes = await userListNoPage();
userList.value = userRes.data || [];
@@ -206,74 +199,74 @@
dialogFormVisible.value = true;
form.value = {};
getProductOptions();
- if (operationType.value === 'edit') {
+ if (operationType.value === "edit") {
getQualityUnqualifiedInfo(row.id).then(res => {
- const { inspectState, ...rest } = (res.data || {})
- // 鏈夋暟鎹氨鏄剧ず榛樿鍊硷紝娌℃湁灏变笉鏄剧ず
- form.value = { ...rest }
- })
+ const { inspectState, ...rest } = (res.data || {});
+ form.value = { ...rest };
+ });
}
-}
+};
+
const getProductOptions = () => {
productTreeList().then((res) => {
productOptions.value = convertIdToValue(res);
});
};
+
const getModels = (value) => {
form.value.productName = findNodeById(productOptions.value, value);
};
+
const findNodeById = (nodes, productId) => {
for (let i = 0; i < nodes.length; i++) {
if (nodes[i].value === productId) {
- return nodes[i].label; // 鎵惧埌鑺傜偣锛岃繑鍥炶鑺傜偣
+ return nodes[i].label;
}
if (nodes[i].children && nodes[i].children.length > 0) {
const foundNode = findNodeById(nodes[i].children, productId);
if (foundNode) {
- return foundNode; // 鍦ㄥ瓙鑺傜偣涓壘鍒帮紝杩斿洖璇ヨ妭鐐�
+ return foundNode;
}
}
}
- return null; // 娌℃湁鎵惧埌鑺傜偣锛岃繑鍥瀗ull
+ return null;
};
+
function convertIdToValue(data) {
return data.map((item) => {
const { id, children, ...rest } = item;
const newItem = {
...rest,
- value: id, // 灏� id 鏀逛负 value
+ value: id,
};
if (children && children.length > 0) {
newItem.children = convertIdToValue(children);
}
-
return newItem;
});
}
-// 鎻愪氦浜у搧琛ㄥ崟
+
const submitForm = () => {
proxy.$refs.formRef.validate(valid => {
if (valid) {
- // 鐘舵�佸瓧娈典笉鍦ㄨ〃鍗曞~鍐欙紝涔熶笉浼犵粰鍚庣锛涘鐞嗙粺涓�璧� /deal 鎺ュ彛
- const { inspectState, ...payload } = (form.value || {})
+ const { inspectState, ...payload } = (form.value || {});
qualityUnqualifiedDeal(payload).then(() => {
proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
closeDia();
- })
+ });
}
- })
-}
-// 鍏抽棴寮规
+ });
+};
+
const closeDia = () => {
proxy.resetForm("formRef");
dialogFormVisible.value = false;
- emit('close')
+ emit("close");
};
+
defineExpose({
openDialog,
});
</script>
-<style scoped>
-
-</style>
\ No newline at end of file
+<style scoped></style>
diff --git a/src/views/qualityManagement/nonconformingManagement/components/orderFormDia.vue b/src/views/qualityManagement/nonconformingManagement/components/orderFormDia.vue
index 0cba8c3..9bba241 100644
--- a/src/views/qualityManagement/nonconformingManagement/components/orderFormDia.vue
+++ b/src/views/qualityManagement/nonconformingManagement/components/orderFormDia.vue
@@ -2,166 +2,220 @@
<div>
<el-dialog
v-model="dialogFormVisible"
- :title="operationType === 'add' ? '鏂板涓嶅悎鏍煎搧澶勭悊鍗�' : '缂栬緫涓嶅悎鏍煎搧澶勭悊鍗�'"
- width="70%"
+ :title="operationType === 'add' ? '鏂板涓嶅悎鏍煎搧澶勭悊鍗�' : operationType === 'view' ? '涓嶅悎鏍煎搧澶勭悊鍗曡鎯�' : operationType === 'dispose' ? '澶勭疆涓嶅悎鏍煎搧澶勭悊鍗�' : '缂栬緫涓嶅悎鏍煎搧澶勭悊鍗�'"
+ width="75%"
@close="closeDia"
>
- <el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef">
- <el-row :gutter="30">
+ <el-form :model="form" label-width="130px" :rules="rules" ref="formRef">
+ <!-- 鍏宠仈涓嶅悎鏍煎搧锛堜粎鏂板鏃讹級 -->
+ <el-row :gutter="20" v-if="operationType === 'add'">
<el-col :span="12">
- <el-form-item label="椤圭洰鍚嶇О" prop="projectName">
- <el-input v-model="form.projectName" placeholder="璇疯緭鍏�" clearable :disabled="operationType === 'view'" />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="椤圭洰缂栧彿" prop="projectNo">
- <el-input v-model="form.projectNo" placeholder="璇疯緭鍏�" clearable :disabled="operationType === 'view'" />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="璁惧鍚嶇О" prop="equipmentName">
- <el-input v-model="form.equipmentName" placeholder="璇疯緭鍏�" clearable :disabled="operationType === 'view'" />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="璁惧鍥惧彿" prop="equipmentDrawingNo">
- <el-input v-model="form.equipmentDrawingNo" placeholder="璇疯緭鍏�" clearable :disabled="operationType === 'view'" />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="鐗╂枡/閮ㄤ欢鍚嶇О" prop="materialName">
- <el-input v-model="form.materialName" placeholder="璇疯緭鍏�" clearable :disabled="operationType === 'view'" />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鐗╂枡鍥惧彿" prop="materialDrawingNo">
- <el-input v-model="form.materialDrawingNo" placeholder="璇疯緭鍏�" clearable :disabled="operationType === 'view'" />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="鍨嬪彿瑙勬牸" prop="specificationModel">
- <el-input v-model="form.specificationModel" placeholder="璇疯緭鍏�" clearable :disabled="operationType === 'view'" />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鏉愯川" prop="materialQuality">
- <el-input v-model="form.materialQuality" placeholder="璇疯緭鍏�" clearable :disabled="operationType === 'view'" />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="鎬绘暟閲�" prop="quantity">
- <el-input-number v-model="form.quantity" :min="0" style="width: 100%" :disabled="operationType === 'view'" />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="涓嶅悎鏍兼暟閲�" prop="unqualifiedQuantity">
- <el-input-number v-model="form.unqualifiedQuantity" :min="0" style="width: 100%" :disabled="operationType === 'view'" />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="涓嶅悎鏍煎伐搴�" prop="unqualifiedProcess">
- <el-select v-model="form.unqualifiedProcess" placeholder="璇烽�夋嫨" clearable :disabled="operationType === 'view'" style="width: 100%">
- <el-option label="鏉ユ枡" :value="1" />
- <el-option label="鍒剁▼" :value="2" />
- <el-option label="鎴愬搧" :value="3" />
+ <el-form-item label="鍏宠仈涓嶅悎鏍煎搧" prop="unqualifiedId">
+ <el-select v-model="form.unqualifiedId" placeholder="閫夋嫨涓嶅悎鏍煎搧璁板綍" filterable clearable
+ @change="handleUnqualifiedSelect" style="width: 100%">
+ <el-option v-for="item in unqualifiedList" :key="item.id"
+ :label="item.productName + ' ' + item.model + ' (' + item.quantity + ')'"
+ :value="item.id" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
- <el-form-item label="渚涘簲鍟嗗悕绉�" prop="supplierName">
- <el-input v-model="form.supplierName" placeholder="璇疯緭鍏�" clearable :disabled="operationType === 'view'" />
+ <el-form-item label="涓嶅悎鏍煎伐搴�">
+ <el-radio-group v-model="form.unqualifiedProcess" :disabled="operationType === 'view' || operationType === 'dispose'">
+ <el-radio :value="1">鏉ユ枡</el-radio>
+ <el-radio :value="2">鍒剁▼</el-radio>
+ <el-radio :value="3">鎴愬搧</el-radio>
+ </el-radio-group>
</el-form-item>
</el-col>
</el-row>
- <el-row :gutter="30">
+
+ <el-divider>鍩烘湰淇℃伅</el-divider>
+ <el-row :gutter="20">
<el-col :span="12">
- <el-form-item label="妫�楠屽憳" prop="inspectorName">
- <el-input v-model="form.inspectorName" placeholder="璇疯緭鍏�" clearable :disabled="operationType === 'view'" />
+ <el-form-item label="椤圭洰鍚嶇О">
+ <el-input v-model="form.projectName" placeholder="璇疯緭鍏�" clearable :disabled="operationType === 'view' || operationType === 'dispose'" />
</el-form-item>
</el-col>
<el-col :span="12">
- <el-form-item label="妫�楠屾棩鏈�" prop="inspectDate">
- <el-date-picker v-model="form.inspectDate" type="date" value-format="YYYY-MM-DD" format="YYYY-MM-DD" placeholder="璇烽�夋嫨" clearable style="width: 100%" :disabled="operationType === 'view'" />
+ <el-form-item label="椤圭洰缂栧彿">
+ <el-input v-model="form.projectNo" placeholder="璇疯緭鍏�" clearable :disabled="operationType === 'view' || operationType === 'dispose'" />
</el-form-item>
</el-col>
</el-row>
- <el-row :gutter="30">
+
+ <el-row :gutter="20">
<el-col :span="12">
- <el-form-item label="璐d换浜�" prop="responsiblePerson">
- <el-input v-model="form.responsiblePerson" placeholder="璇疯緭鍏�" clearable :disabled="operationType === 'view'" />
+ <el-form-item label="璁惧鍚嶇О">
+ <el-input v-model="form.equipmentName" placeholder="璇疯緭鍏�" clearable :disabled="operationType === 'view' || operationType === 'dispose'" />
</el-form-item>
</el-col>
<el-col :span="12">
- <el-form-item label="璐d换閮ㄩ棬" prop="responsibleDept">
- <el-input v-model="form.responsibleDept" placeholder="璇疯緭鍏�" clearable :disabled="operationType === 'view'" />
+ <el-form-item label="璁惧鍥惧彿">
+ <el-input v-model="form.equipmentDrawingNo" placeholder="璇疯緭鍏�" clearable :disabled="operationType === 'view' || operationType === 'dispose'" />
</el-form-item>
</el-col>
</el-row>
- <el-row :gutter="30">
+
+ <el-row :gutter="20">
+ <el-col :span="12">
+ <el-form-item label="鐗╂枡/閮ㄤ欢鍚嶇О">
+ <el-input v-model="form.materialName" placeholder="璇疯緭鍏�" clearable :disabled="operationType === 'view' || operationType === 'dispose'" />
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="鐗╂枡鍥惧彿">
+ <el-input v-model="form.materialDrawingNo" placeholder="璇疯緭鍏�" clearable :disabled="operationType === 'view' || operationType === 'dispose'" />
+ </el-form-item>
+ </el-col>
+ </el-row>
+
+ <el-row :gutter="20">
+ <el-col :span="8">
+ <el-form-item label="鍨嬪彿瑙勬牸">
+ <el-input v-model="form.specificationModel" placeholder="璇疯緭鍏�" clearable :disabled="operationType === 'view' || operationType === 'dispose'" />
+ </el-form-item>
+ </el-col>
+ <el-col :span="8">
+ <el-form-item label="鏉愯川">
+ <el-input v-model="form.materialQuality" placeholder="璇疯緭鍏�" clearable :disabled="operationType === 'view' || operationType === 'dispose'" />
+ </el-form-item>
+ </el-col>
+ <el-col :span="8">
+ <el-form-item label="渚涘簲鍟�">
+ <el-input v-model="form.supplierName" placeholder="璇疯緭鍏�" clearable :disabled="operationType === 'view' || operationType === 'dispose'" />
+ </el-form-item>
+ </el-col>
+ </el-row>
+
+ <el-divider>涓嶅悎鏍间俊鎭�</el-divider>
+ <el-row :gutter="20">
+ <el-col :span="8">
+ <el-form-item label="鎬绘暟閲�">
+ <el-input-number v-model="form.quantity" :min="0" :precision="2" style="width: 100%" :disabled="operationType === 'view' || operationType === 'dispose'" />
+ </el-form-item>
+ </el-col>
+ <el-col :span="8">
+ <el-form-item label="涓嶅悎鏍兼暟閲�">
+ <el-input-number v-model="form.unqualifiedQuantity" :min="0" :precision="2" style="width: 100%" :disabled="operationType === 'view' || operationType === 'dispose'" />
+ </el-form-item>
+ </el-col>
+ <el-col :span="8">
+ <el-form-item label="妫�楠屾棩鏈�">
+ <el-date-picker v-model="form.inspectDate" type="date" value-format="YYYY-MM-DD" placeholder="璇烽�夋嫨" clearable style="width: 100%" :disabled="operationType === 'view' || operationType === 'dispose'" />
+ </el-form-item>
+ </el-col>
+ </el-row>
+
+ <el-row :gutter="20">
+ <el-col :span="8">
+ <el-form-item label="妫�楠屽憳">
+ <el-input v-model="form.inspectorName" placeholder="璇疯緭鍏�" clearable :disabled="operationType === 'view' || operationType === 'dispose'" />
+ </el-form-item>
+ </el-col>
+ <el-col :span="8">
+ <el-form-item label="璐d换浜�">
+ <el-input v-model="form.responsiblePerson" placeholder="璇疯緭鍏�" clearable :disabled="operationType === 'view' || operationType === 'dispose'" />
+ </el-form-item>
+ </el-col>
+ <el-col :span="8">
+ <el-form-item label="璐d换閮ㄩ棬">
+ <el-input v-model="form.responsibleDept" placeholder="璇疯緭鍏�" clearable :disabled="operationType === 'view' || operationType === 'dispose'" />
+ </el-form-item>
+ </el-col>
+ </el-row>
+
+ <el-row :gutter="20">
<el-col :span="24">
- <el-form-item label="闂鎻忚堪" prop="problemDescription">
- <el-input type="textarea" v-model="form.problemDescription" placeholder="璇疯緭鍏�" clearable :disabled="operationType === 'view'" :rows="3" />
+ <el-form-item label="闂鎻忚堪">
+ <el-input type="textarea" v-model="form.problemDescription" placeholder="璇疯緭鍏�" clearable :disabled="operationType === 'view' || operationType === 'dispose'" :rows="3" />
</el-form-item>
</el-col>
</el-row>
- <el-row :gutter="30">
+
+ <el-divider>澶勭疆鍐崇瓥</el-divider>
+ <el-row :gutter="20">
<el-col :span="24">
- <el-form-item label="鍘熷洜鍒嗘瀽鍙婂缓璁�" prop="reasonAnalysis">
+ <el-form-item label="澶勭疆鏂瑰紡" prop="disposalMethod">
+ <el-radio-group v-model="form.disposalMethod" :disabled="operationType === 'view'">
+ <el-radio :value="1">璁╂鎺ユ敹</el-radio>
+ <el-radio :value="2">鍘傚唴缁翠慨</el-radio>
+ <el-radio :value="3">杩斿巶缁翠慨</el-radio>
+ <el-radio :value="4">鎹㈣揣</el-radio>
+ <el-radio :value="5">閫�璐�</el-radio>
+ <el-radio :value="6">鎶ュ簾</el-radio>
+ </el-radio-group>
+ </el-form-item>
+ </el-col>
+ </el-row>
+
+ <el-row :gutter="20" v-if="form.disposalMethod === 2 || form.disposalMethod === 3">
+ <el-col :span="24">
+ <el-form-item label="鍘傚唴/杩斿巶缁翠慨璇勪及">
+ <el-input type="textarea" v-model="form.repairEvaluation" placeholder="璇勪及缁翠慨鍙鎬с�佹墍闇�宸ユ椂銆佺墿鏂欑瓑" clearable :disabled="operationType === 'view'" :rows="3" />
+ </el-form-item>
+ </el-col>
+ </el-row>
+
+ <el-row :gutter="20">
+ <el-col :span="24">
+ <el-form-item label="鍘熷洜鍒嗘瀽鍙婂缓璁�">
<el-input type="textarea" v-model="form.reasonAnalysis" placeholder="璇疯緭鍏�" clearable :disabled="operationType === 'view'" :rows="3" />
</el-form-item>
</el-col>
</el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="绾犳鎺柦" prop="correctionAction">
- <el-input type="textarea" v-model="form.correctionAction" placeholder="璇疯緭鍏�" clearable :disabled="operationType === 'view'" :rows="3" />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="澶勭疆鏂瑰紡" prop="disposalMethod">
- <el-select v-model="form.disposalMethod" placeholder="璇烽�夋嫨" clearable :disabled="operationType === 'view'" style="width: 100%">
- <el-option label="璁╂鎺ユ敹" :value="1" />
- <el-option label="鍘傚唴缁翠慨" :value="2" />
- <el-option label="杩斿巶缁翠慨" :value="3" />
- <el-option label="鎹㈣揣" :value="4" />
- <el-option label="閫�璐�" :value="5" />
- <el-option label="鎶ュ簾" :value="6" />
- </el-select>
+
+ <el-row :gutter="20">
+ <el-col :span="24">
+ <el-form-item label="绾犳鎺柦">
+ <el-input type="textarea" v-model="form.correctionAction" placeholder="璇疯緭鍏�" clearable :disabled="operationType === 'view'" :rows="2" />
</el-form-item>
</el-col>
</el-row>
- <el-row :gutter="30">
+
+ <el-row :gutter="20">
<el-col :span="24">
- <el-form-item label="缁翠慨璇勪及" prop="repairEvaluation">
- <el-input type="textarea" v-model="form.repairEvaluation" placeholder="璇疯緭鍏�" clearable :disabled="operationType === 'view'" :rows="3" />
+ <el-form-item label="棰勯槻鎺柦">
+ <el-input type="textarea" v-model="form.preventiveAction" placeholder="璇疯緭鍏�" clearable :disabled="operationType === 'view'" :rows="2" />
</el-form-item>
</el-col>
</el-row>
- <el-row :gutter="30">
+
+ <el-divider>瀹℃壒鎰忚</el-divider>
+ <el-row :gutter="20">
<el-col :span="24">
- <el-form-item label="棰勯槻鎺柦" prop="preventiveAction">
- <el-input type="textarea" v-model="form.preventiveAction" placeholder="璇疯緭鍏�" clearable :disabled="operationType === 'view'" :rows="3" />
+ <el-form-item label="璐d换閮ㄩ棬涓荤鎰忚">
+ <el-input type="textarea" v-model="form.deptOpinion" placeholder="璇疯緭鍏�" clearable :disabled="operationType === 'view'" :rows="2" />
</el-form-item>
</el-col>
</el-row>
- <el-row :gutter="30">
+
+ <el-row :gutter="20">
<el-col :span="24">
- <el-form-item label="澶囨敞" prop="remark">
+ <el-form-item label="鍏徃澶勭悊鍐冲畾">
+ <el-input type="textarea" v-model="form.companyDecision" placeholder="璇疯緭鍏�" clearable :disabled="operationType === 'view'" :rows="2" />
+ </el-form-item>
+ </el-col>
+ </el-row>
+
+ <el-row :gutter="20">
+ <el-col :span="24">
+ <el-form-item label="鎬荤粡鐞嗘剰瑙�">
+ <el-input type="textarea" v-model="form.generalManagerOpinion" placeholder="璇疯緭鍏�" clearable :disabled="operationType === 'view'" :rows="2" />
+ </el-form-item>
+ </el-col>
+ </el-row>
+
+ <el-row :gutter="20">
+ <el-col :span="24">
+ <el-form-item label="澶囨敞">
<el-input type="textarea" v-model="form.remark" placeholder="璇疯緭鍏�" clearable :disabled="operationType === 'view'" :rows="2" />
</el-form-item>
</el-col>
</el-row>
- <el-row :gutter="30">
+
+ <el-divider>闄勪欢</el-divider>
+ <el-row :gutter="20">
<el-col :span="24">
<el-form-item label="闄勪欢">
<FileUpload v-model:file-list="form.storageBlobDTOs" :file-list="form.storageBlobVOs" :disabled="operationType === 'view'" />
@@ -181,7 +235,13 @@
<script setup>
import { ref, reactive, toRefs, getCurrentInstance } from "vue";
-import { save, update, getDetail } from "@/api/qualityManagement/qualityUnqualifiedOrder.js";
+import {
+ saveQualityUnqualifiedOrder,
+ updateQualityUnqualifiedOrder,
+ getQualityUnqualifiedOrderDetail,
+ qualityUnqualifiedListPage,
+ dealQualityUnqualifiedOrder,
+} from "@/api/qualityManagement/nonconformingManagement.js";
import FileUpload from "@/components/AttachmentUpload/file/index.vue";
const { proxy } = getCurrentInstance();
@@ -189,77 +249,82 @@
const dialogFormVisible = ref(false);
const operationType = ref("");
+const unqualifiedList = ref([]);
+
+const emptyForm = {
+ unqualifiedId: undefined,
+ projectName: "",
+ projectNo: "",
+ equipmentId: undefined,
+ equipmentName: "",
+ equipmentDrawingNo: "",
+ materialName: "",
+ productModelId: undefined,
+ materialDrawingNo: "",
+ specificationModel: "",
+ materialQuality: "",
+ quantity: undefined,
+ unqualifiedQuantity: undefined,
+ unqualifiedProcess: undefined,
+ supplierName: "",
+ inspectorName: "",
+ inspectDate: "",
+ responsiblePerson: "",
+ responsibleDept: "",
+ problemDescription: "",
+ reasonAnalysis: "",
+ correctionAction: "",
+ disposalMethod: undefined,
+ repairEvaluation: "",
+ preventiveAction: "",
+ deptOpinion: "",
+ companyDecision: "",
+ generalManagerOpinion: "",
+ remark: "",
+ storageBlobDTOs: [],
+ storageBlobVOs: [],
+};
const data = reactive({
- form: {
- projectName: "",
- projectNo: "",
- equipmentName: "",
- equipmentDrawingNo: "",
- materialName: "",
- materialDrawingNo: "",
- specificationModel: "",
- materialQuality: "",
- quantity: undefined,
- unqualifiedQuantity: undefined,
- unqualifiedProcess: undefined,
- supplierName: "",
- inspectorName: "",
- inspectDate: "",
- responsiblePerson: "",
- responsibleDept: "",
- problemDescription: "",
- reasonAnalysis: "",
- correctionAction: "",
- disposalMethod: undefined,
- repairEvaluation: "",
- preventiveAction: "",
- remark: "",
- storageBlobDTOs: [],
- storageBlobVOs: [],
- },
+ form: { ...emptyForm },
rules: {
- projectName: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
+ unqualifiedId: [{ required: true, message: "璇烽�夋嫨鍏宠仈涓嶅悎鏍煎搧", trigger: "change" }],
+ disposalMethod: [{ required: true, message: "璇烽�夋嫨澶勭疆鏂瑰紡", trigger: "change" }],
},
});
const { form, rules } = toRefs(data);
+
+const loadUnqualifiedList = () => {
+ qualityUnqualifiedListPage({ inspectState: 0, page: 1, size: 999 }).then(res => {
+ unqualifiedList.value = res.data?.records || [];
+ });
+};
+
+const handleUnqualifiedSelect = (id) => {
+ const record = unqualifiedList.value.find(item => item.id === id);
+ if (!record) return;
+ form.value.materialName = record.productName || "";
+ form.value.specificationModel = record.model || "";
+ form.value.quantity = record.quantity;
+ form.value.inspectorName = record.checkName || "";
+ form.value.inspectDate = record.checkTime || "";
+ form.value.problemDescription = record.defectivePhenomena || "";
+ form.value.unqualifiedProcess = record.inspectType != null ? record.inspectType + 1 : undefined;
+ form.value.unqualifiedQuantity = record.quantity;
+};
const openDialog = async (type, row) => {
operationType.value = type;
dialogFormVisible.value = true;
if (type === "add") {
- form.value = {
- projectName: "",
- projectNo: "",
- equipmentName: "",
- equipmentDrawingNo: "",
- materialName: "",
- materialDrawingNo: "",
- specificationModel: "",
- materialQuality: "",
- quantity: undefined,
- unqualifiedQuantity: undefined,
- unqualifiedProcess: undefined,
- supplierName: "",
- inspectorName: "",
- inspectDate: "",
- responsiblePerson: "",
- responsibleDept: "",
- problemDescription: "",
- reasonAnalysis: "",
- correctionAction: "",
- disposalMethod: undefined,
- repairEvaluation: "",
- preventiveAction: "",
- remark: "",
- storageBlobDTOs: [],
- storageBlobVOs: [],
- };
+ loadUnqualifiedList();
+ Object.assign(data.form, { ...emptyForm });
} else {
- form.value = {};
+ Object.assign(data.form, { ...emptyForm });
if (row?.id) {
- getDetail(row.id).then((res) => {
- form.value = res.data || res || {};
+ getQualityUnqualifiedOrderDetail(row.id).then((res) => {
+ const detail = res.data || res || {};
+ Object.assign(data.form, { ...emptyForm }, detail);
});
}
}
@@ -268,14 +333,31 @@
const submitForm = () => {
proxy.$refs.formRef.validate((valid) => {
if (valid) {
- const { status, ...payload } = form.value || {};
+ const { status, storageBlobVOs, ...payload } = form.value || {};
if (operationType.value === "add") {
- save(payload).then(() => {
+ saveQualityUnqualifiedOrder(payload).then(() => {
proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
closeDia();
});
+ } else if (operationType.value === "dispose") {
+ const dealFields = {
+ id: payload.id,
+ disposalMethod: payload.disposalMethod,
+ repairEvaluation: payload.repairEvaluation,
+ reasonAnalysis: payload.reasonAnalysis,
+ correctionAction: payload.correctionAction,
+ preventiveAction: payload.preventiveAction,
+ remark: payload.remark,
+ deptOpinion: payload.deptOpinion,
+ companyDecision: payload.companyDecision,
+ generalManagerOpinion: payload.generalManagerOpinion,
+ };
+ dealQualityUnqualifiedOrder(dealFields).then(() => {
+ proxy.$modal.msgSuccess("澶勭疆鎴愬姛");
+ closeDia();
+ });
} else {
- update(payload).then(() => {
+ updateQualityUnqualifiedOrder(payload).then(() => {
proxy.$modal.msgSuccess("淇敼鎴愬姛");
closeDia();
});
diff --git a/src/views/qualityManagement/nonconformingManagement/index.vue b/src/views/qualityManagement/nonconformingManagement/index.vue
index 3afcf9c..084fc71 100644
--- a/src/views/qualityManagement/nonconformingManagement/index.vue
+++ b/src/views/qualityManagement/nonconformingManagement/index.vue
@@ -1,314 +1,265 @@
<template>
<div class="app-container">
<div class="search_form">
- <el-form :model="searchForm" inline style="margin-bottom: 0;">
- <el-form-item label="绫诲瀷锛�">
- <el-select v-model="searchForm.inspectType" clearable style="width: 200px" @change="handleQuery">
- <el-option label="鍘熸潗鏂欐楠�" :value="0" />
- <el-option label="杩囩▼妫�楠�" :value="1" />
- <el-option label="鍑哄巶妫�楠�" :value="2" />
- </el-select>
+ <el-form :model="queryParams" inline style="margin-bottom: 0;">
+ <el-form-item label="澶勭悊鍗曠紪鍙�">
+ <el-input v-model="queryParams.orderNo" style="width: 200px" placeholder="杈撳叆缂栧彿" clearable
+ :prefix-icon="Search" @change="handleQuery" />
</el-form-item>
- <el-form-item label="鐘舵�侊細">
- <el-select v-model="searchForm.inspectState" clearable style="width: 200px" @change="handleQuery">
- <el-option label="寰呭鐞�" :value="0" />
- <el-option label="宸插鐞�" :value="1" />
- </el-select>
+ <el-form-item label="椤圭洰鍚嶇О">
+ <el-input v-model="queryParams.projectName" style="width: 200px" placeholder="杈撳叆椤圭洰" clearable
+ :prefix-icon="Search" @change="handleQuery" />
</el-form-item>
- <el-form-item label="浜у搧鍚嶇О锛�">
- <el-input
- v-model="searchForm.productName"
- style="width: 200px"
- placeholder="璇疯緭鍏ヤ骇鍝佸悕绉版悳绱�"
- @change="handleQuery"
- clearable
- :prefix-icon="Search"
- />
- </el-form-item>
- <el-form-item label="妫�娴嬫棩鏈燂細">
- <el-date-picker v-model="searchForm.entryDate" value-format="YYYY-MM-DD" format="YYYY-MM-DD" type="daterange"
- style="width: 300px"
- placeholder="璇烽�夋嫨" clearable @change="changeDaterange" />
+<!-- <el-form-item label="鐘舵��">–>-->
+<!-- <el-select v-model="queryParams.status" clearable style="width: 150px" @change="handleQuery" placeholder="鍏ㄩ儴">–>-->
+<!-- <el-option label="鑽夌" :value="0" />–>-->
+<!-- <el-option label="寰呭鎵�" :value="1" />–>-->
+<!-- <el-option label="瀹℃壒涓�" :value="2" />–>-->
+<!-- <el-option label="宸插畬鎴�" :value="3" />–>-->
+<!-- <el-option label="宸查┏鍥�" :value="4" />–>-->
+<!-- </el-select>–>-->
+<!-- </el-form-item>–>-->
+ <el-form-item label="鍒涘缓鏃堕棿">
+ <el-date-picker v-model="dateRange" value-format="YYYY-MM-DD" type="daterange"
+ style="width: 260px" placeholder="璇烽�夋嫨" clearable @change="changeDaterange" />
</el-form-item>
<el-form-item>
<el-button type="primary" @click="handleQuery">鎼滅储</el-button>
+ <el-button @click="resetQuery">閲嶇疆</el-button>
</el-form-item>
</el-form>
</div>
<div class="mb20" style="text-align: right;">
-<!-- <el-button type="primary" @click="openForm('add')">鏂板</el-button>-->
- <el-button type="primary" @click="openOrderForm">澶勭悊鍗�</el-button>
- <el-button @click="handleOut">瀵煎嚭</el-button>
- <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>
- </div>
- <div class="table_list">
- <PIMTable
- rowKey="id"
- :column="tableColumn"
- :tableData="tableData"
- :page="page"
- :isSelection="true"
- @selection-change="handleSelectionChange"
- :tableLoading="tableLoading"
- @pagination="pagination"
- :total="page.total"
- ></PIMTable>
+ <el-button type="primary" @click="handleAdd">鏂板澶勭悊鍗�</el-button>
+ <el-button type="danger" plain :disabled="!selectedRows.length" @click="handleDelete">鍒犻櫎</el-button>
</div>
- <FormDia ref="formDia" @close="handleQuery"></FormDia>
- <InspectionFormDia ref="inspectionFormDia" @close="handleQuery"></InspectionFormDia>
- <OrderFormDia ref="orderFormDia" @close="handleQuery"></OrderFormDia>
+ <div class="table_list">
+ <PIMTable rowKey="id" :column="tableColumn" :tableData="tableData" :page="page"
+ :isSelection="true" @selection-change="handleSelectionChange"
+ :tableLoading="tableLoading" @pagination="pagination" :total="page.total" />
+ </div>
+ <OrderFormDia ref="orderFormDia" @close="handleQuery" />
</div>
</template>
<script setup>
import { Search } from "@element-plus/icons-vue";
-import {onMounted, ref, reactive, toRefs, nextTick, getCurrentInstance} from "vue";
-import FormDia from "@/views/qualityManagement/nonconformingManagement/components/formDia.vue";
-import {ElMessageBox} from "element-plus";
-import {qualityUnqualifiedDel, qualityUnqualifiedListPage} from "@/api/qualityManagement/nonconformingManagement.js";
-import InspectionFormDia from "@/views/qualityManagement/nonconformingManagement/components/inspectionFormDia.vue";
+import { onMounted, ref, reactive, nextTick, getCurrentInstance } from "vue";
+import { ElMessageBox } from "element-plus";
+import {
+ qualityUnqualifiedOrderListPage,
+ deleteQualityUnqualifiedOrder,
+} from "@/api/qualityManagement/nonconformingManagement.js";
import OrderFormDia from "@/views/qualityManagement/nonconformingManagement/components/orderFormDia.vue";
import dayjs from "dayjs";
-const data = reactive({
- searchForm: {
- inspectType: "",
- inspectState: "",
- productName: "",
- entryDate: undefined, // 褰曞叆鏃ユ湡
- entryDateStart: undefined,
- entryDateEnd: undefined,
- },
+const { proxy } = getCurrentInstance();
+
+const disposalMethodMap = { 1: "璁╂鎺ユ敹", 2: "鍘傚唴缁翠慨", 3: "杩斿巶缁翠慨", 4: "鎹㈣揣", 5: "閫�璐�", 6: "鎶ュ簾" };
+const statusMap = { 0: "鑽夌", 1: "寰呭鎵�", 2: "瀹℃壒涓�", 3: "宸插畬鎴�", 4: "宸查┏鍥�" };
+
+const queryParams = reactive({
+ orderNo: "",
+ projectName: "",
+ status: null,
+ entryDateStart: undefined,
+ entryDateEnd: undefined,
});
-const { searchForm } = toRefs(data);
-const tableColumn = ref([
- {
- label: "鐘舵��",
- prop: "inspectState",
- dataType: "tag",
- formatData: (params) => {
- if (params == 0) {
- return "寰呭鐞�";
- } else if (params == 1) {
- return "宸插鐞�";
- } else {
- return null;
- }
- },
- formatType: (params) => {
- if (params == '涓嶅悎鏍�') {
- return "danger";
- } else if (params == '鍚堟牸') {
- return "success";
- } else {
- return 'danger';
- }
- },
- },
- {
- label: "妫�娴嬫棩鏈�",
- prop: "checkTime",
- width: 120
- },
- {
- label: "绫诲埆",
- prop: "inspectType",
- dataType: "tag",
- width: 120,
- formatData: (params) => {
- if (params == 0) {
- return "鍘熸潗鏂欐楠�";
- } else if (params == 1) {
- return "杩囩▼妫�楠�";
- } else {
- return '鍑哄巶妫�楠�';
- }
- },
- formatType: (params) => {
- if (params == '涓嶅悎鏍�') {
- return "info";
- } else if (params == '鍚堟牸') {
- return "success";
- } else {
- return 'primary';
- }
- },
- },
- {
- label: "妫�楠屽憳",
- prop: "checkName",
- },
- {
- label: "浜у搧鍚嶇О",
- prop: "productName",
- },
- {
- label: "瑙勬牸鍨嬪彿",
- prop: "model",
- },
- {
- label: "鍗曚綅",
- prop: "unit",
- },
- {
- label: "鏁伴噺",
- prop: "quantity",
- width: 100
- },
- {
- label: "涓嶅悎鏍肩幇璞�",
- prop: "defectivePhenomena",
- width: 120
- },
- {
- label: "澶勭悊缁撴灉",
- prop: "dealResult",
- width: 120
- },
- {
- label: "澶勭悊浜�",
- prop: "dealName",
- width: 120
- },
- {
- label: "澶勭悊鏃ユ湡",
- prop: "dealTime",
- width: 120
- },
- {
- dataType: "action",
- label: "鎿嶄綔",
- align: "center",
- fixed: "right",
- width: 100,
- operation: [
- {
- name: "澶勭悊",
- type: "text",
- clickFun: (row) => {
- openInspectionForm("edit", row);
- },
- disabled: (row) => row.inspectState === 1,
- },
- ],
- },
-]);
+
+const dateRange = ref(undefined);
const tableData = ref([]);
const selectedRows = ref([]);
const tableLoading = ref(false);
const page = reactive({
current: 1,
size: 100,
- total: 0
+ total: 0,
});
-const formDia = ref()
-const inspectionFormDia = ref()
-const orderFormDia = ref()
-const { proxy } = getCurrentInstance()
+const orderFormDia = ref();
+
+const tableColumn = ref([
+ {
+ label: "澶勭悊鍗曠紪鍙�",
+ prop: "orderNo",
+ width: 160,
+ },
+ {
+ label: "椤圭洰鍚嶇О",
+ prop: "projectName",
+ },
+ {
+ label: "鍨嬪彿瑙勬牸",
+ prop: "specificationModel",
+ width: 120,
+ },
+ {
+ label: "涓嶅悎鏍兼暟閲�",
+ prop: "unqualifiedQuantity",
+ width: 100,
+ },
+ {
+ label: "澶勭疆鏂瑰紡",
+ prop: "disposalMethod",
+ width: 110,
+ dataType: "tag",
+ formatData: (val) => disposalMethodMap[val] || "",
+ },
+ // {
+ // label: "鐘舵��",
+ // prop: "status",
+ // width: 80,
+ // dataType: "tag",
+ // formatData: (val) => statusMap[val] || "",
+ // formatType: (val) => {
+ // const map = { 0: "info", 1: "warning", 2: "", 3: "success", 4: "danger" };
+ // return map[val] || "info";
+ // },
+ // },
+ {
+ label: "妫�楠屽憳",
+ prop: "inspectorName",
+ width: 100,
+ },
+ {
+ label: "妫�楠屾棩鏈�",
+ prop: "inspectDate",
+ width: 110,
+ },
+ {
+ label: "鍒涘缓鏃堕棿",
+ prop: "createTime",
+ width: 160,
+ },
+ {
+ dataType: "action",
+ label: "鎿嶄綔",
+ align: "center",
+ fixed: "right",
+ width: 160,
+ operation: [
+ {
+ name: "瀵煎嚭",
+ type: "text",
+ clickFun: (row) => {
+ handleExport(row);
+ },
+ },
+ {
+ name: "澶勭疆",
+ type: "text",
+ showHide: (row) => row.status === 0,
+ clickFun: (row) => {
+ nextTick(() => {
+ orderFormDia.value?.openDialog("dispose", row);
+ });
+ },
+ },
+ {
+ name: "缂栬緫",
+ type: "text",
+ clickFun: (row) => {
+ nextTick(() => {
+ orderFormDia.value?.openDialog("edit", row);
+ });
+ },
+ },
+ {
+ name: "璇︽儏",
+ type: "text",
+ clickFun: (row) => {
+ nextTick(() => {
+ orderFormDia.value?.openDialog("view", row);
+ });
+ },
+ },
+ ],
+ },
+]);
const changeDaterange = (value) => {
- searchForm.value.entryDateStart = undefined;
- searchForm.value.entryDateEnd = undefined;
+ queryParams.entryDateStart = undefined;
+ queryParams.entryDateEnd = undefined;
if (value) {
- searchForm.value.entryDateStart = dayjs(value[0]).format("YYYY-MM-DD");
- searchForm.value.entryDateEnd = dayjs(value[1]).format("YYYY-MM-DD");
+ queryParams.entryDateStart = dayjs(value[0]).format("YYYY-MM-DD");
+ queryParams.entryDateEnd = dayjs(value[1]).format("YYYY-MM-DD");
}
getList();
};
-// 鏌ヨ鍒楄〃
-/** 鎼滅储鎸夐挳鎿嶄綔 */
+
const handleQuery = () => {
page.current = 1;
getList();
};
+
+const resetQuery = () => {
+ queryParams.orderNo = "";
+ queryParams.projectName = "";
+ queryParams.status = null;
+ dateRange.value = undefined;
+ queryParams.entryDateStart = undefined;
+ queryParams.entryDateEnd = undefined;
+ handleQuery();
+};
+
const pagination = (obj) => {
page.current = obj.page;
page.size = obj.limit;
getList();
};
+
const getList = () => {
tableLoading.value = true;
- const params = { ...searchForm.value, ...page };
- params.entryDate = undefined
- qualityUnqualifiedListPage(params).then(res => {
- tableLoading.value = false;
- tableData.value = res.data.records
- page.total = res.data.total;
- }).catch(err => {
- tableLoading.value = false;
- })
+ const params = { ...queryParams, page: page.current, size: page.size };
+ qualityUnqualifiedOrderListPage(params)
+ .then((res) => {
+ tableLoading.value = false;
+ tableData.value = res.data?.records || [];
+ page.total = res.data?.total || 0;
+ })
+ .catch(() => {
+ tableLoading.value = false;
+ });
};
-// 琛ㄦ牸閫夋嫨鏁版嵁
+
const handleSelectionChange = (selection) => {
selectedRows.value = selection;
};
-// 鎵撳紑寮规
-const openForm = (type, row) => {
- if (type !== 'add' && row?.inspectState === 1) {
- proxy.$modal.msgWarning("宸插鐞嗙殑鏁版嵁涓嶈兘鍐嶇紪杈�");
- return;
- }
- nextTick(() => {
- formDia.value?.openDialog(type, row)
- })
-};
-// 鎵撳紑澶勭悊寮规
-const openInspectionForm = (type, row) => {
- if (row?.inspectState === 1) {
- proxy.$modal.msgWarning("宸插鐞嗙殑鏁版嵁涓嶈兘鍐嶅鐞�");
- return;
- }
- nextTick(() => {
- inspectionFormDia.value?.openDialog(type, row)
- })
-};
-
-// 鎵撳紑澶勭悊鍗曞脊妗�
-const openOrderForm = () => {
+const handleAdd = () => {
nextTick(() => {
orderFormDia.value?.openDialog("add", null);
});
};
-// 鍒犻櫎
const handleDelete = () => {
- let ids = [];
- if (selectedRows.value.length > 0) {
- ids = selectedRows.value.map((item) => item.id);
- } else {
+ if (selectedRows.value.length === 0) {
proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
return;
}
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "瀵煎嚭", {
+ const ids = selectedRows.value.map((item) => item.id);
+ ElMessageBox.confirm("閫変腑鐨勫鐞嗗崟灏嗚鍒犻櫎锛屾槸鍚︾‘璁わ紵", "鎻愮ず", {
confirmButtonText: "纭",
cancelButtonText: "鍙栨秷",
type: "warning",
})
- .then(() => {
- qualityUnqualifiedDel(ids).then((res) => {
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
- getList();
- });
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
+ .then(() => {
+ deleteQualityUnqualifiedOrder(ids).then(() => {
+ proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
+ getList();
});
+ })
+ .catch(() => {
+ proxy.$modal.msg("宸插彇娑�");
+ });
};
-// 瀵煎嚭
-const handleOut = () => {
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- proxy.download("/quality/qualityUnqualified/export", {}, "涓嶅悎鏍肩鐞�.xlsx");
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
+
+const handleExport = (row) => {
+ proxy.$download.zip(
+ `/qualityUnqualifiedOrder/export/${row.id}`,
+ `涓嶅悎鏍煎搧澶勭悊鍗昣${row.orderNo || row.id}.xlsx`
+ );
};
+
onMounted(() => {
getList();
});
diff --git a/src/views/salesManagement/indicatorStats/index.vue b/src/views/salesManagement/indicatorStats/index.vue
index 8ae15ed..de74c56 100644
--- a/src/views/salesManagement/indicatorStats/index.vue
+++ b/src/views/salesManagement/indicatorStats/index.vue
@@ -25,7 +25,7 @@
</div>
<div class="stat-content">
<div class="stat-value">楼{{ indicatorKpis.salesAmount.toLocaleString() }}</div>
- <div class="stat-label">閿�鍞</div>
+ <div class="stat-label">鍚堝悓閲戦</div>
</div>
<div class="stat-bg-decoration"></div>
</div>
@@ -287,7 +287,7 @@
const option = {
title: { text: '澶氱淮搴﹂攢鍞寚鏍囪秼鍔�', left: 'center' },
tooltip: { trigger: 'axis' },
- legend: { data: ['璁㈠崟鏁�', '閿�鍞'], top: 30 },
+ legend: { data: ['璁㈠崟鏁�', '鍚堝悓閲戦'], top: 30 },
grid: { left: '3%', right: '8%', bottom: '3%', containLabel: true },
xAxis: {
type: 'category',
@@ -317,7 +317,7 @@
itemStyle: { color: '#409eff' }
},
{
- name: '閿�鍞',
+ name: '鍚堝悓閲戦',
type: 'bar',
yAxisIndex: 0,
data: chartData.salesAmountList || [],
@@ -335,7 +335,7 @@
const option = {
title: { text: '澶氱淮搴﹂攢鍞寚鏍囪秼鍔�', left: 'center' },
tooltip: { trigger: 'axis' },
- legend: { data: ['璁㈠崟鏁�', '閿�鍞'], top: 30 },
+ legend: { data: ['璁㈠崟鏁�', '鍚堝悓閲戦'], top: 30 },
grid: { left: '3%', right: '8%', bottom: '3%', containLabel: true },
xAxis: { type: 'category', data: [] },
yAxis: [
@@ -355,7 +355,7 @@
],
series: [
{ name: '璁㈠崟鏁�', type: 'line', yAxisIndex: 1, data: [], itemStyle: { color: '#409eff' } },
- { name: '閿�鍞', type: 'bar', yAxisIndex: 0, data: [], itemStyle: { color: '#67c23a' } }
+ { name: '鍚堝悓閲戦', type: 'bar', yAxisIndex: 0, data: [], itemStyle: { color: '#67c23a' } }
]
}
indicatorChart.setOption(option)
--
Gitblit v1.9.3