From 26b2a4b21b3c2cd34e6781cf7876eae580a7e1ec Mon Sep 17 00:00:00 2001
From: zhangwencui <1064582902@qq.com>
Date: 星期六, 23 五月 2026 15:02:35 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/dev_NEW_pro_鹤壁' into dev_NEW_pro_鹤壁
---
src/pages.json | 14
src/pages/equipmentManagement/repair/maintain.vue | 19
src/pages/qualityManagement/finalInspection/index.vue | 26
src/pages/qualityManagement/finalInspection/add.vue | 95 +--
src/pages/qualityManagement/materialInspection/add.vue | 95 +--
src/pages/equipmentManagement/repair/acceptance.vue | 314 ++++++++++++++
src/api/equipmentManagement/repair.js | 13
src/pages/qualityManagement/processInspection/detail.vue | 37 +
src/pages/equipmentManagement/repair/detail.vue | 360 ++++++++++++++++
src/pages/qualityManagement/processInspection/index.vue | 26
src/pages/equipmentManagement/repair/index.vue | 91 +++
src/pages/equipmentManagement/repair/add.vue | 23
src/pages/qualityManagement/materialInspection/detail.vue | 39 +
src/pages/qualityManagement/materialInspection/index.vue | 26
src/pages/qualityManagement/processInspection/add.vue | 95 +--
src/pages/qualityManagement/finalInspection/detail.vue | 37 +
16 files changed, 1,045 insertions(+), 265 deletions(-)
diff --git a/src/api/equipmentManagement/repair.js b/src/api/equipmentManagement/repair.js
index 927d5fb..d909eb3 100644
--- a/src/api/equipmentManagement/repair.js
+++ b/src/api/equipmentManagement/repair.js
@@ -70,6 +70,19 @@
data,
});
};
+
+/**
+ * @desc 鎶ヤ慨楠屾敹纭
+ * @param {楠屾敹鍙傛暟} data
+ * @returns
+ */
+export const repairAcceptance = (data) => {
+ return request({
+ url: "/device/repair/acceptance",
+ method: "post",
+ data,
+ });
+};
export const getSparePartsList = (params) => {
return request({
url: "/spareParts/listPage",
diff --git a/src/pages.json b/src/pages.json
index b3d204b..30a1a63 100644
--- a/src/pages.json
+++ b/src/pages.json
@@ -689,6 +689,20 @@
}
},
{
+ "path": "pages/equipmentManagement/repair/acceptance",
+ "style": {
+ "navigationBarTitleText": "璁惧鎶ヤ慨楠屾敹",
+ "navigationStyle": "custom"
+ }
+ },
+ {
+ "path": "pages/equipmentManagement/repair/detail",
+ "style": {
+ "navigationBarTitleText": "璁惧鎶ヤ慨璇︽儏",
+ "navigationStyle": "custom"
+ }
+ },
+ {
"path": "pages/equipmentManagement/upkeep/index",
"style": {
"navigationBarTitleText": "璁惧淇濆吇",
diff --git a/src/pages/equipmentManagement/repair/acceptance.vue b/src/pages/equipmentManagement/repair/acceptance.vue
new file mode 100644
index 0000000..9a283a6
--- /dev/null
+++ b/src/pages/equipmentManagement/repair/acceptance.vue
@@ -0,0 +1,314 @@
+<template>
+ <view class="repair-acceptance">
+ <PageHeader title="璁惧鎶ヤ慨楠屾敹"
+ @back="goBack" />
+ <!-- 鎶ヤ慨淇℃伅 -->
+ <view class="section">
+ <view class="section-title">鎶ヤ慨淇℃伅</view>
+ <view class="info-item">
+ <text class="info-label">璁惧鍚嶇О</text>
+ <text class="info-value">{{ detail.deviceName || '-' }}</text>
+ </view>
+ <view class="info-item">
+ <text class="info-label">瑙勬牸鍨嬪彿</text>
+ <text class="info-value">{{ detail.deviceModel || '-' }}</text>
+ </view>
+ <view class="info-item">
+ <text class="info-label">鎶ヤ慨鏃ユ湡</text>
+ <text class="info-value">{{ formatDate(detail.repairTime) || '-' }}</text>
+ </view>
+ <view class="info-item">
+ <text class="info-label">鎶ヤ慨浜�</text>
+ <text class="info-value">{{ detail.repairName || '-' }}</text>
+ </view>
+ <view class="info-item">
+ <text class="info-label">缁翠慨浜�</text>
+ <text class="info-value">{{ detail.maintenanceName || '-' }}</text>
+ </view>
+ <view class="info-item">
+ <text class="info-label">缁翠慨椤圭洰</text>
+ <text class="info-value">{{ detail.machineryCategory || '-' }}</text>
+ </view>
+ <view class="info-item">
+ <text class="info-label">鏁呴殰鐜拌薄</text>
+ <text class="info-value multi-line">{{ detail.remark || '-' }}</text>
+ </view>
+ <view class="info-item">
+ <text class="info-label">缁翠慨缁撴灉</text>
+ <text class="info-value multi-line">{{ detail.maintenanceResult || '-' }}</text>
+ </view>
+ <view class="info-item">
+ <text class="info-label">缁翠慨鏃ユ湡</text>
+ <text class="info-value">{{ formatDateTime(detail.maintenanceTime) || '-' }}</text>
+ </view>
+ </view>
+ <!-- 楠屾敹琛ㄥ崟 -->
+ <u-form ref="formRef"
+ :model="form"
+ label-width="110">
+ <u-cell-group title="楠屾敹淇℃伅">
+ <u-form-item label="楠屾敹浜�"
+ prop="acceptanceName"
+ required
+ border-bottom>
+ <u-input v-model="form.acceptanceName"
+ disabled
+ placeholder="楠屾敹浜�" />
+ </u-form-item>
+ <u-form-item label="楠屾敹鏃堕棿"
+ prop="acceptanceTime"
+ required
+ border-bottom>
+ <u-input v-model="form.acceptanceTime"
+ placeholder="璇烽�夋嫨楠屾敹鏃堕棿"
+ readonly
+ @click="showDatePicker = true" />
+ <template #right>
+ <u-icon name="arrow-right"
+ @click="showDatePicker = true"></u-icon>
+ </template>
+ </u-form-item>
+ <u-form-item label="楠屾敹澶囨敞"
+ prop="acceptanceRemark"
+ required
+ border-bottom>
+ <u-textarea v-model="form.acceptanceRemark"
+ placeholder="璇疯緭鍏ラ獙鏀跺娉�"
+ :maxlength="200"
+ count
+ :autoHeight="true" />
+ </u-form-item>
+ </u-cell-group>
+ <view class="footer-btns">
+ <u-button class="cancel-btn"
+ @click="goBack">鍙栨秷</u-button>
+ <u-button class="save-btn"
+ type="primary"
+ @click="handleSubmit"
+ :loading="loading">楠屾敹纭</u-button>
+ </view>
+ </u-form>
+ <up-datetime-picker :show="showDatePicker"
+ v-model="pickerDateValue"
+ mode="datetime"
+ title="閫夋嫨楠屾敹鏃堕棿"
+ @confirm="onDateConfirm"
+ @cancel="showDatePicker = false" />
+ </view>
+</template>
+
+<script setup>
+ import { ref, onMounted } from "vue";
+ import { onLoad } from "@dcloudio/uni-app";
+ import PageHeader from "@/components/PageHeader.vue";
+ import { repairAcceptance, getRepairById } from "@/api/equipmentManagement/repair";
+ import useUserStore from "@/store/modules/user";
+ import dayjs from "dayjs";
+
+ defineOptions({ name: "repair-acceptance" });
+
+ const showToast = message => {
+ uni.showToast({ title: message, icon: "none" });
+ };
+
+ const userStore = useUserStore();
+ const loading = ref(false);
+ const showDatePicker = ref(false);
+ const pickerDateValue = ref(Date.now());
+ const repairId = ref("");
+ const detail = ref({});
+
+ const form = ref({
+ id: "",
+ acceptanceName: "",
+ acceptanceTime: dayjs().format("YYYY-MM-DD HH:mm:ss"),
+ acceptanceRemark: "",
+ });
+
+ const formatDate = dateStr => {
+ if (!dateStr) return "";
+ return dayjs(dateStr).format("YYYY-MM-DD");
+ };
+
+ const formatDateTime = dateStr => {
+ if (!dateStr) return "";
+ return dayjs(dateStr).format("YYYY-MM-DD HH:mm:ss");
+ };
+
+ const canAccept = item => {
+ const currentName = userStore.nickName || userStore.name || "";
+ return currentName && item.acceptanceName === currentName;
+ };
+
+ const loadDetail = async id => {
+ try {
+ const cached = uni.getStorageSync("repairDetail");
+ if (cached) {
+ detail.value = typeof cached === "string" ? JSON.parse(cached) : cached;
+ }
+ if (id && (!detail.value?.id || detail.value.id != id)) {
+ const { code, data } = await getRepairById(id);
+ if (code == 200) {
+ detail.value = data;
+ }
+ }
+ if (!canAccept(detail.value)) {
+ showToast("浠呮寚瀹氶獙鏀朵汉鍙繘琛岄獙鏀�");
+ setTimeout(() => uni.navigateBack(), 1500);
+ return;
+ }
+ form.value.id = detail.value.id;
+ form.value.acceptanceName = detail.value.acceptanceName || "";
+ } catch (e) {
+ showToast("鑾峰彇鎶ヤ慨淇℃伅澶辫触");
+ }
+ };
+
+ const onDateConfirm = e => {
+ form.value.acceptanceTime = dayjs(e.value).format("YYYY-MM-DD HH:mm:ss");
+ pickerDateValue.value = e.value;
+ showDatePicker.value = false;
+ };
+
+ const handleSubmit = async () => {
+ if (!form.value.acceptanceTime?.trim()) {
+ showToast("璇烽�夋嫨楠屾敹鏃堕棿");
+ return;
+ }
+ if (!form.value.acceptanceRemark?.trim()) {
+ showToast("璇疯緭鍏ラ獙鏀跺娉�");
+ return;
+ }
+ try {
+ loading.value = true;
+ const { code } = await repairAcceptance({
+ id: form.value.id,
+ acceptanceTime: form.value.acceptanceTime,
+ acceptanceRemark: form.value.acceptanceRemark,
+ });
+ if (code == 200) {
+ showToast("楠屾敹鎴愬姛");
+ uni.removeStorageSync("repairDetail");
+ setTimeout(() => uni.navigateBack(), 500);
+ } else {
+ loading.value = false;
+ }
+ } catch (e) {
+ loading.value = false;
+ showToast("楠屾敹鎻愪氦澶辫触");
+ }
+ };
+
+ const goBack = () => {
+ uni.removeStorageSync("repairDetail");
+ uni.navigateBack();
+ };
+
+ onLoad(options => {
+ if (options.id) {
+ repairId.value = options.id;
+ }
+ });
+
+ onMounted(async () => {
+ if (!userStore.nickName) {
+ await userStore.getInfo().catch(() => {});
+ }
+ if (repairId.value) {
+ loadDetail(repairId.value);
+ }
+ });
+</script>
+
+<style scoped lang="scss">
+ @import "@/static/scss/form-common.scss";
+
+ .repair-acceptance {
+ min-height: 100vh;
+ background-color: #f8f9fa;
+ padding-bottom: 160rpx;
+ }
+
+ .section {
+ background-color: #ffffff;
+ margin-bottom: 16px;
+ overflow: hidden;
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);
+ }
+
+ .section-title {
+ font-size: 16px;
+ font-weight: 600;
+ color: #333333;
+ padding: 16px 16px 12px;
+ border-bottom: 1px solid #f0f0f0;
+ }
+
+ .info-item {
+ display: flex;
+ padding: 14px 16px;
+ border-bottom: 1px solid #f8f8f8;
+ align-items: flex-start;
+ }
+
+ .info-item:last-child {
+ border-bottom: none;
+ }
+
+ .info-label {
+ font-size: 14px;
+ color: #666666;
+ min-width: 80px;
+ flex-shrink: 0;
+ line-height: 22px;
+ }
+
+ .info-value {
+ font-size: 14px;
+ color: #333333;
+ flex: 1;
+ line-height: 22px;
+ text-align: right;
+ }
+
+ .multi-line {
+ text-align: left;
+ word-break: break-all;
+ }
+
+ .footer-btns {
+ position: fixed;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ background: #fff;
+ display: flex;
+ justify-content: space-around;
+ align-items: center;
+ padding: 0.75rem 0;
+ box-shadow: 0 -0.125rem 0.5rem rgba(0, 0, 0, 0.05);
+ z-index: 1000;
+ }
+
+ .cancel-btn {
+ font-weight: 400;
+ font-size: 1rem;
+ color: #666;
+ background: #f5f5f5;
+ border: 1px solid #ddd;
+ width: 45%;
+ height: 2.5rem;
+ border-radius: 2.5rem;
+ }
+
+ .save-btn {
+ font-weight: 500;
+ font-size: 1rem;
+ color: #fff;
+ background: linear-gradient(140deg, #00baff 0%, #006cfb 100%);
+ border: none;
+ width: 45%;
+ height: 2.5rem;
+ border-radius: 2.5rem;
+ }
+</style>
diff --git a/src/pages/equipmentManagement/repair/add.vue b/src/pages/equipmentManagement/repair/add.vue
index 73c4eba..39ab9a4 100644
--- a/src/pages/equipmentManagement/repair/add.vue
+++ b/src/pages/equipmentManagement/repair/add.vue
@@ -76,6 +76,13 @@
placeholder="璇疯緭鍏ョ淮淇汉"
clearable />
</u-form-item>
+ <u-form-item label="楠屾敹浜�"
+ prop="acceptanceName"
+ border-bottom>
+ <u-input v-model="form.acceptanceName"
+ placeholder="璇疯緭鍏ラ獙鏀朵汉"
+ clearable />
+ </u-form-item>
<u-form-item label="缁翠慨椤圭洰"
prop="machineryCategory"
border-bottom>
@@ -198,6 +205,8 @@
repairTime: dayjs().format("YYYY-MM-DD"), // 鎶ヤ慨鏃ユ湡
repairName: undefined, // 鎶ヤ慨浜�
maintenanceName: undefined, // 缁翠慨浜�
+ acceptanceName: undefined, // 楠屾敹浜�
+ status: "0", // 鎶ヤ慨鐘舵��
machineryCategory: undefined, // 缁翠慨椤圭洰
remark: undefined, // 鏁呴殰鐜拌薄
storageBlobDTOs: [], // 鍥剧墖闄勪欢
@@ -206,10 +215,11 @@
// 鎶ヤ慨鐘舵�侀�夐」
const repairStatusOptions = ref([
{ name: "寰呯淮淇�", value: "0" },
- { name: "瀹岀粨", value: "1" },
- { name: "澶辫触", value: "2" },
+ { name: "瀹屾垚", value: "1" },
+ { name: "缁翠慨澶辫触", value: "2" },
+ { name: "寰呴獙鏀�", value: "3" },
]);
- const repairStatusText = ref("");
+ const repairStatusText = ref("寰呯淮淇�");
// 鎵撳紑鎶ヤ慨鐘舵�侀�夋嫨鍣�
const openRepairStatusPicker = () => {
@@ -253,12 +263,15 @@
form.value.repairTime = dayjs(data.repairTime).format("YYYY-MM-DD");
form.value.repairName = data.repairName;
form.value.maintenanceName = data.maintenanceName;
+ form.value.acceptanceName = data.acceptanceName;
+ form.value.status = String(data.status ?? "0");
form.value.machineryCategory = data.machineryCategory;
form.value.remark = data.remark;
form.value.storageBlobDTOs = data.storageBlobVOs || [];
repairStatusText.value =
- repairStatusOptions.value.find(item => item.value == data.status)
- ?.name || "";
+ repairStatusOptions.value.find(
+ item => item.value == String(data.status)
+ )?.name || "";
// 璁剧疆璁惧鍚嶇О鏄剧ず
const device = deviceOptions.value.find(
item => item.id === data.deviceLedgerId
diff --git a/src/pages/equipmentManagement/repair/detail.vue b/src/pages/equipmentManagement/repair/detail.vue
new file mode 100644
index 0000000..75fe1e4
--- /dev/null
+++ b/src/pages/equipmentManagement/repair/detail.vue
@@ -0,0 +1,360 @@
+<template>
+ <view class="repair-detail">
+ <PageHeader title="璁惧鎶ヤ慨璇︽儏"
+ @back="goBack" />
+ <view class="content-container">
+ <!-- 1. 鎶ヤ慨鐧昏 -->
+ <view class="section">
+ <view class="section-head">
+ <view class="section-bar"></view>
+ <text class="section-head-text">1. 鎶ヤ慨鐧昏</text>
+ </view>
+ <view class="desc-table">
+ <view class="desc-row">
+ <view class="desc-cell">
+ <text class="desc-label">璁惧鍚嶇О</text>
+ <text class="desc-value">{{ detail.deviceName || '-' }}</text>
+ </view>
+ <view class="desc-cell">
+ <text class="desc-label">瑙勬牸鍨嬪彿</text>
+ <text class="desc-value">{{ detail.deviceModel || '-' }}</text>
+ </view>
+ </view>
+ <view class="desc-row">
+ <view class="desc-cell">
+ <text class="desc-label">鎶ヤ慨鏃ユ湡</text>
+ <text class="desc-value">{{ formatDate(detail.repairTime) || '-' }}</text>
+ </view>
+ <view class="desc-cell">
+ <text class="desc-label">鎶ヤ慨浜�</text>
+ <text class="desc-value">{{ detail.repairName || '-' }}</text>
+ </view>
+ </view>
+ <view class="desc-row">
+ <view class="desc-cell">
+ <text class="desc-label">楠屾敹浜�</text>
+ <text class="desc-value">{{ detail.acceptanceName || '-' }}</text>
+ </view>
+ <view class="desc-cell">
+ <text class="desc-label">缁翠慨浜�</text>
+ <text class="desc-value">{{ detail.maintenanceName || '-' }}</text>
+ </view>
+ </view>
+ <view class="desc-row full">
+ <view class="desc-cell full">
+ <text class="desc-label">鏁呴殰鐜拌薄</text>
+ <text class="desc-value">{{ detail.remark || '-' }}</text>
+ </view>
+ </view>
+ <view class="desc-row full">
+ <view class="desc-cell full status-cell">
+ <text class="desc-label">褰撳墠鐘舵��</text>
+ <view class="desc-value">
+ <u-tag :type="getStatusType(detail.status)"
+ size="mini">{{ getStatusLabel(detail.status) }}</u-tag>
+ </view>
+ </view>
+ </view>
+ </view>
+ <view class="image-block">
+ <text class="image-block-title">璁惧闂鍥剧墖</text>
+ <view v-if="imageList.length"
+ class="image-content">
+ <CommonUpload :model-value="imageList"
+ disabled />
+ </view>
+ <view v-else
+ class="image-empty">
+ <up-icon name="photo"
+ size="40"
+ color="#c0c4cc"></up-icon>
+ <text class="image-empty-text">鏆傛棤璁惧闂鍥剧墖</text>
+ </view>
+ </view>
+ </view>
+
+ <!-- 2. 缁翠慨澶勭悊 -->
+ <view class="section">
+ <view class="section-head">
+ <view class="section-bar"></view>
+ <text class="section-head-text">2. 缁翠慨澶勭悊</text>
+ </view>
+ <view class="desc-table">
+ <view class="desc-row">
+ <view class="desc-cell">
+ <text class="desc-label">缁翠慨浜�</text>
+ <text class="desc-value">{{ detail.maintenanceName || '-' }}</text>
+ </view>
+ <view class="desc-cell">
+ <text class="desc-label">缁翠慨鏃堕棿</text>
+ <text class="desc-value">{{ formatDateTime(detail.maintenanceTime) || '-' }}</text>
+ </view>
+ </view>
+ <view class="desc-row full">
+ <view class="desc-cell full">
+ <text class="desc-label">缁翠慨缁撴灉</text>
+ <text class="desc-value">{{ detail.maintenanceResult || '-' }}</text>
+ </view>
+ </view>
+ </view>
+ </view>
+
+ <!-- 3. 楠屾敹 -->
+ <view class="section">
+ <view class="section-head">
+ <view class="section-bar"></view>
+ <text class="section-head-text">3. 楠屾敹</text>
+ </view>
+ <view class="desc-table">
+ <view class="desc-row">
+ <view class="desc-cell">
+ <text class="desc-label">楠屾敹浜�</text>
+ <text class="desc-value">{{ detail.acceptanceName || '-' }}</text>
+ </view>
+ <view class="desc-cell">
+ <text class="desc-label">楠屾敹鏃堕棿</text>
+ <text class="desc-value">{{ formatDateTime(detail.acceptanceTime) || '-' }}</text>
+ </view>
+ </view>
+ <view class="desc-row full">
+ <view class="desc-cell full">
+ <text class="desc-label">楠屾敹澶囨敞</text>
+ <text class="desc-value">{{ detail.acceptanceRemark || '-' }}</text>
+ </view>
+ </view>
+ </view>
+ </view>
+ </view>
+ </view>
+</template>
+
+<script setup>
+ import { ref, computed, onMounted } from "vue";
+ import { onLoad } from "@dcloudio/uni-app";
+ import PageHeader from "@/components/PageHeader.vue";
+ import CommonUpload from "@/components/CommonUpload.vue";
+ import { getRepairById } from "@/api/equipmentManagement/repair";
+ import dayjs from "dayjs";
+
+ defineOptions({ name: "repair-detail" });
+
+ const showToast = message => {
+ uni.showToast({ title: message, icon: "none" });
+ };
+
+ const repairId = ref("");
+ const detail = ref({});
+
+ const STATUS_MAP = {
+ 0: { label: "寰呯淮淇�", type: "error" },
+ 1: { label: "瀹屾垚", type: "success" },
+ 2: { label: "缁翠慨澶辫触", type: "warning" },
+ 3: { label: "寰呴獙鏀�", type: "primary" },
+ };
+
+ const getStatusLabel = status => STATUS_MAP[status]?.label || "-";
+ const getStatusType = status => STATUS_MAP[status]?.type || "info";
+
+ const imageList = computed(() => {
+ return detail.value.storageBlobVOs || detail.value.storageBlobDTOs || [];
+ });
+
+ const formatDate = dateStr => {
+ if (!dateStr) return "";
+ return dayjs(dateStr).format("YYYY-MM-DD");
+ };
+
+ const formatDateTime = dateStr => {
+ if (!dateStr) return "";
+ return dayjs(dateStr).format("YYYY-MM-DD HH:mm:ss");
+ };
+
+ const loadDetail = async id => {
+ try {
+ const cached = uni.getStorageSync("repairDetail");
+ if (cached) {
+ detail.value = typeof cached === "string" ? JSON.parse(cached) : cached;
+ }
+ if (id) {
+ const { code, data } = await getRepairById(id);
+ if (code == 200) {
+ detail.value = { ...detail.value, ...data };
+ }
+ }
+ } catch (e) {
+ showToast("鑾峰彇璇︽儏澶辫触");
+ }
+ };
+
+ const goBack = () => {
+ uni.removeStorageSync("repairDetail");
+ uni.navigateBack();
+ };
+
+ onLoad(options => {
+ if (options.id) {
+ repairId.value = options.id;
+ }
+ });
+
+ onMounted(() => {
+ loadDetail(repairId.value);
+ });
+</script>
+
+<style scoped lang="scss">
+ .repair-detail {
+ min-height: 100vh;
+ background-color: #f0f2f5;
+ padding-bottom: 24px;
+ }
+
+ .content-container {
+ padding: 12px;
+ }
+
+ .section {
+ background-color: #ffffff;
+ border-radius: 4px;
+ margin-bottom: 12px;
+ overflow: hidden;
+ border: 1px solid #ebeef5;
+ }
+
+ .section-head {
+ display: flex;
+ align-items: center;
+ padding: 12px 16px;
+ border-bottom: 1px solid #ebeef5;
+ background: #fff;
+ }
+
+ .section-bar {
+ width: 4px;
+ height: 16px;
+ background: #409eff;
+ border-radius: 2px;
+ margin-right: 8px;
+ flex-shrink: 0;
+ }
+
+ .section-head-text {
+ font-size: 15px;
+ font-weight: 600;
+ color: #303133;
+ }
+
+ .desc-table {
+ border-top: 1px solid #ebeef5;
+ }
+
+ .desc-row {
+ display: flex;
+ border-bottom: 1px solid #ebeef5;
+
+ &:last-child {
+ border-bottom: none;
+ }
+
+ &.full {
+ .desc-cell.full {
+ flex: 1;
+ width: 100%;
+ }
+ }
+ }
+
+ .desc-cell {
+ flex: 1;
+ display: flex;
+ min-width: 0;
+ border-right: 1px solid #ebeef5;
+
+ &:last-child {
+ border-right: none;
+ }
+
+ &.full {
+ border-right: none;
+ }
+ }
+
+ .desc-label {
+ width: 88px;
+ flex-shrink: 0;
+ padding: 10px 12px;
+ font-size: 13px;
+ color: #606266;
+ background: #f5f7fa;
+ border-right: 1px solid #ebeef5;
+ line-height: 20px;
+ box-sizing: border-box;
+ }
+
+ .desc-value {
+ flex: 1;
+ padding: 10px 12px;
+ font-size: 13px;
+ color: #303133;
+ background: #ffffff;
+ line-height: 20px;
+ word-break: break-all;
+ min-width: 0;
+ box-sizing: border-box;
+ }
+
+ .status-cell {
+ .desc-value {
+ display: flex;
+ align-items: center;
+ }
+ }
+
+ .image-block {
+ padding: 12px 16px 16px;
+ border-top: 1px solid #ebeef5;
+ }
+
+ .image-block-title {
+ display: block;
+ font-size: 13px;
+ color: #606266;
+ margin-bottom: 12px;
+ }
+
+ .image-content {
+ padding: 0;
+ }
+
+ .image-empty {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ min-height: 120px;
+ background: #fafafa;
+ border: 1px dashed #dcdfe6;
+ border-radius: 4px;
+ gap: 8px;
+ }
+
+ .image-empty-text {
+ font-size: 13px;
+ color: #c0c4cc;
+ }
+
+ @media (max-width: 400px) {
+ .desc-row:not(.full) {
+ flex-direction: column;
+
+ .desc-cell {
+ border-right: none;
+ border-bottom: 1px solid #ebeef5;
+
+ &:last-child {
+ border-bottom: none;
+ }
+ }
+ }
+ }
+</style>
diff --git a/src/pages/equipmentManagement/repair/index.vue b/src/pages/equipmentManagement/repair/index.vue
index 8c41ab1..c37bd62 100644
--- a/src/pages/equipmentManagement/repair/index.vue
+++ b/src/pages/equipmentManagement/repair/index.vue
@@ -37,10 +37,8 @@
<text class="item-id">璁惧鍚嶇О锛歿{ item.deviceName }}</text>
</view>
<view class="status-tag">
- <u-tag v-if="item.status === 1"
- type="success">瀹岀粨</u-tag>
- <u-tag v-if="item.status === 0"
- type="error">寰呯淮淇�</u-tag>
+ <u-tag :type="getStatusType(item.status)"
+ size="mini">{{ getStatusLabel(item.status) }}</u-tag>
</view>
</view>
<up-divider></up-divider>
@@ -62,6 +60,10 @@
<text class="detail-value">{{ item.maintenanceName || '-' }}</text>
</view>
<view class="detail-row">
+ <text class="detail-label">楠屾敹浜�</text>
+ <text class="detail-value">{{ item.acceptanceName || '-' }}</text>
+ </view>
+ <view class="detail-row">
<text class="detail-label">缁翠慨椤圭洰</text>
<text class="detail-value">{{ item.machineryCategory || '-' }}</text>
</view>
@@ -75,11 +77,26 @@
</view>
<view class="detail-row">
<text class="detail-label">缁翠慨鏃ユ湡</text>
- <text class="detail-value">{{ formatDate(item.maintenanceTime) || '-' }}</text>
+ <text class="detail-value">{{ formatDateTime(item.maintenanceTime) || '-' }}</text>
</view>
</view>
<!-- 鎸夐挳鍖哄煙 -->
<view class="action-buttons">
+ <u-button type="info"
+ size="small"
+ plain
+ class="action-btn"
+ @click="goDetail(item)">
+ 璇︽儏
+ </u-button>
+ <u-button type="success"
+ size="small"
+ class="action-btn"
+ v-if="item.status === 3"
+ :disabled="!canAccept(item)"
+ @click="goAcceptance(item)">
+ 楠屾敹
+ </u-button>
<u-button type="primary"
size="small"
class="action-btn"
@@ -135,6 +152,22 @@
const userStore = useUserStore();
+ const STATUS_MAP = {
+ 0: { label: "寰呯淮淇�", type: "error" },
+ 1: { label: "瀹屾垚", type: "success" },
+ 2: { label: "缁翠慨澶辫触", type: "warning" },
+ 3: { label: "寰呴獙鏀�", type: "primary" },
+ };
+
+ const getStatusLabel = status => STATUS_MAP[status]?.label || "-";
+ const getStatusType = status => STATUS_MAP[status]?.type || "info";
+
+ const canAccept = item => {
+ if (item.status !== 3) return false;
+ const currentName = userStore.nickName || userStore.name || "";
+ return currentName && item.acceptanceName === currentName;
+ };
+
// 鎼滅储鍏抽敭璇�
const searchKeyword = ref("");
@@ -154,6 +187,18 @@
const month = String(date.getMonth() + 1).padStart(2, "0");
const day = String(date.getDate()).padStart(2, "0");
return `${year}-${month}-${day}`;
+ };
+
+ const formatDateTime = dateStr => {
+ if (!dateStr) return "";
+ const date = new Date(dateStr);
+ const year = date.getFullYear();
+ const month = String(date.getMonth() + 1).padStart(2, "0");
+ const day = String(date.getDate()).padStart(2, "0");
+ const hours = String(date.getHours()).padStart(2, "0");
+ const minutes = String(date.getMinutes()).padStart(2, "0");
+ const seconds = String(date.getSeconds()).padStart(2, "0");
+ return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
};
// 鏌ヨ鍒楄〃
@@ -194,7 +239,6 @@
showToast("鍙傛暟閿欒");
return;
}
- // 浣跨敤uni.setStorageSync瀛樺偍id
uni.setStorageSync("repairId", id);
uni.navigateTo({
url: "/pages/equipmentManagement/repair/maintain",
@@ -208,13 +252,31 @@
});
};
- // 缂栬緫 - 璺宠浆鍒癮dd椤甸潰锛岄�氳繃id鍖哄垎鏂板杩樻槸缂栬緫
+ // 缂栬緫
const edit = id => {
if (!id) return;
- // 浣跨敤uni.setStorageSync瀛樺偍id
- // uni.setStorageSync("repairId", id);
uni.navigateTo({
url: "/pages/equipmentManagement/repair/add?id=" + id,
+ });
+ };
+
+ // 璇︽儏
+ const goDetail = item => {
+ uni.setStorageSync("repairDetail", JSON.stringify(item));
+ uni.navigateTo({
+ url: "/pages/equipmentManagement/repair/detail?id=" + item.id,
+ });
+ };
+
+ // 楠屾敹
+ const goAcceptance = item => {
+ if (!canAccept(item)) {
+ showToast("浠呮寚瀹氶獙鏀朵汉鍙繘琛岄獙鏀�");
+ return;
+ }
+ uni.setStorageSync("repairDetail", JSON.stringify(item));
+ uni.navigateTo({
+ url: "/pages/equipmentManagement/repair/acceptance?id=" + item.id,
});
};
@@ -243,6 +305,9 @@
};
onMounted(() => {
+ if (!userStore.nickName) {
+ userStore.getInfo().catch(() => {});
+ }
getList();
});
@@ -254,9 +319,8 @@
<style scoped lang="scss">
@import "@/styles/sales-common.scss";
- // 璁惧缁翠慨鐗规湁鏍峰紡
.sales-account {
- padding-bottom: 80px; // 涓烘诞鍔ㄦ寜閽暀鍑虹┖闂�
+ padding-bottom: 80px;
}
.status-tag {
@@ -265,6 +329,7 @@
}
.action-buttons {
- gap: 8px; // 涓庡叕鍏辨牱寮忎腑鐨� 12px 涓嶅悓
+ gap: 8px;
+ flex-wrap: wrap;
}
-</style>
\ No newline at end of file
+</style>
diff --git a/src/pages/equipmentManagement/repair/maintain.vue b/src/pages/equipmentManagement/repair/maintain.vue
index 9b077d6..72989d4 100644
--- a/src/pages/equipmentManagement/repair/maintain.vue
+++ b/src/pages/equipmentManagement/repair/maintain.vue
@@ -12,10 +12,10 @@
<u-cell-group title="缁翠慨淇℃伅"
inset>
<u-form-item prop="maintenanceName"
- label="鎶ヤ慨浜�"
+ label="缁翠慨浜�"
required>
<u-input v-model="form.maintenanceName"
- placeholder="璇疯緭鍏ユ姤淇汉"
+ placeholder="璇疯緭鍏ョ淮淇汉"
clearable />
</u-form-item>
<u-form-item prop="maintenanceResult"
@@ -177,7 +177,7 @@
// 琛ㄥ崟楠岃瘉瑙勫垯
const formRules = {
maintenanceName: [
- { required: true, trigger: "blur", message: "璇疯緭鍏ユ姤淇汉" },
+ { required: true, trigger: "blur", message: "璇疯緭鍏ョ淮淇汉" },
],
maintenanceResult: [
{ required: true, trigger: "blur", message: "璇疯緭鍏ョ淮淇粨鏋�" },
@@ -188,10 +188,11 @@
};
const repairStatusOptions = ref([
{ name: "寰呯淮淇�", value: "0" },
- { name: "瀹岀粨", value: "1" },
- { name: "澶辫触", value: "2" },
+ { name: "瀹屾垚", value: "1" },
+ { name: "缁翠慨澶辫触", value: "2" },
+ { name: "寰呴獙鏀�", value: "3" },
]);
- const repairStatusText = ref("瀹岀粨");
+ const repairStatusText = ref("寰呴獙鏀�");
// 鎵撳紑鎶ヤ慨鐘舵�侀�夋嫨鍣�
const openRepairStatusPicker = () => {
uni.showActionSheet({
@@ -207,7 +208,7 @@
maintenanceName: userStore.nickName || "", // 榛樿浣跨敤褰撳墠鐢ㄦ埛鏄电О
maintenanceResult: undefined, // 缁翠慨缁撴灉
maintenanceTime: dayjs().format("YYYY-MM-DD HH:mm:ss"), // 缁翠慨鏃ユ湡锛堝彧鏄剧ず鏃ユ湡锛�
- status: "1",
+ status: "3",
sparePartsIds: [],
});
@@ -225,7 +226,7 @@
maintenanceName: userStore.nickName || "",
maintenanceResult: undefined,
maintenanceTime: dayjs().format("YYYY-MM-DD HH:mm:ss"),
- status: "1",
+ status: "3",
sparePartsIds: [],
};
selectedSpareParts.value = [];
@@ -411,7 +412,7 @@
// 鍒濆鍖栬〃鍗曟暟鎹�
const initForm = async () => {
- form.value.status = "1";
+ form.value.status = "3";
// 璁剧疆鎶ヤ慨浜轰负褰撳墠鐢ㄦ埛鏄电О
form.value.maintenanceName = userStore.nickName || "";
// 璁剧疆褰撳墠鏃ユ湡锛堝彧鍖呭惈骞存湀鏃ワ級
diff --git a/src/pages/qualityManagement/finalInspection/add.vue b/src/pages/qualityManagement/finalInspection/add.vue
index 94321dd..9bae6c6 100644
--- a/src/pages/qualityManagement/finalInspection/add.vue
+++ b/src/pages/qualityManagement/finalInspection/add.vue
@@ -68,14 +68,32 @@
placeholder="璇疯緭鍏ュ崟浣�"
disabled />
</up-form-item>
- <up-form-item label="鏁伴噺"
+ <up-form-item label="鎬绘暟閲�"
prop="quantity"
required
border-bottom>
<up-input v-model="form.quantity"
type="number"
- placeholder="璇疯緭鍏ユ暟閲�"
+ placeholder="璇疯緭鍏ユ�绘暟閲�"
:disabled="processQuantityDisabled" />
+ </up-form-item>
+ <up-form-item label="鍚堟牸鏁伴噺"
+ prop="qualifiedQuantity"
+ required
+ border-bottom>
+ <up-input v-model="form.qualifiedQuantity"
+ type="number"
+ placeholder="璇疯緭鍏ュ悎鏍兼暟閲�"
+ clearable />
+ </up-form-item>
+ <up-form-item label="涓嶅悎鏍兼暟閲�"
+ prop="unqualifiedQuantity"
+ required
+ border-bottom>
+ <up-input v-model="form.unqualifiedQuantity"
+ type="number"
+ placeholder="璇疯緭鍏ヤ笉鍚堟牸鏁伴噺"
+ clearable />
</up-form-item>
<up-form-item label="妫�娴嬪崟浣�"
prop="checkCompany"
@@ -83,19 +101,6 @@
<up-input v-model="form.checkCompany"
placeholder="璇疯緭鍏ユ娴嬪崟浣�"
clearable />
- </up-form-item>
- <up-form-item label="妫�娴嬬粨鏋�"
- prop="checkResult"
- required
- border-bottom>
- <up-input v-model="form.checkResult"
- placeholder="璇烽�夋嫨妫�娴嬬粨鏋�"
- readonly
- @click="showResultSheet" />
- <template #right>
- <up-icon @click="showResultSheet = true"
- name="arrow-right" />
- </template>
</up-form-item>
<up-form-item label="妫�楠屽憳"
prop="checkName"
@@ -208,12 +213,6 @@
@select="selectModel"
@close="showModelSheet = false"
title="閫夋嫨瑙勬牸鍨嬪彿" />
- <!-- 妫�娴嬬粨鏋滈�夋嫨 -->
- <up-action-sheet :show="showResultSheet"
- :actions="resultSheetOptions"
- @select="selectResult"
- @close="showResultSheet = false"
- title="閫夋嫨妫�娴嬬粨鏋�" />
<!-- 妫�楠屽憳閫夋嫨 -->
<up-action-sheet :show="showInspectorSheet"
:actions="userSheetOptions"
@@ -340,8 +339,6 @@
const showProductTree = ref(false);
// 瑙勬牸鍨嬪彿閫夋嫨
const showModelSheet = ref(false);
- // 妫�娴嬬粨鏋滈�夋嫨
- const showResultSheet = ref(false);
// 妫�楠屽憳閫夋嫨
const showInspectorSheet = ref(false);
// 鎸囨爣閫夋嫨
@@ -359,8 +356,9 @@
testStandardId: "",
unit: "",
quantity: "",
+ qualifiedQuantity: "",
+ unqualifiedQuantity: "",
checkCompany: "",
- checkResult: "",
productMainId: null,
purchaseLedgerId: null,
});
@@ -380,11 +378,6 @@
const modelOptions = ref([]);
// 妫�楠屽憳鍒楄〃
const userList = ref([]);
- // 妫�娴嬬粨鏋滈�夐」
- const resultOptions = ref([
- { label: "鍚堟牸", value: "鍚堟牸" },
- { label: "涓嶅悎鏍�", value: "涓嶅悎鏍�" },
- ]);
// 鎸囨爣閫夐」
const testStandardOptions = ref([]);
// 褰撳墠浜у搧ID
@@ -409,13 +402,6 @@
return modelOptions.value.map(item => ({
name: item.model,
value: item.id,
- }));
- });
-
- const resultSheetOptions = computed(() => {
- return resultOptions.value.map(item => ({
- name: item.label,
- value: item.value,
}));
});
@@ -447,10 +433,9 @@
],
unit: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
quantity: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
+ qualifiedQuantity: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
+ unqualifiedQuantity: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
checkCompany: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
- checkResult: [
- { required: true, message: "璇烽�夋嫨妫�娴嬬粨鏋�", trigger: "change" },
- ],
};
// 鏄惁涓虹紪杈戞ā寮�
@@ -555,12 +540,6 @@
modelOptions.value.find(item => item.id == value)?.model || "";
form.value.unit =
modelOptions.value.find(item => item.id == value)?.unit || "";
- };
-
- // 閫夋嫨妫�娴嬬粨鏋�
- const selectResult = e => {
- form.value.checkResult = e.value;
- showResultSheet.value = false;
};
// 閫夋嫨妫�楠屽憳
@@ -685,7 +664,15 @@
// return;
// }
if (!form.value.quantity) {
- showToast("璇疯緭鍏ユ暟閲�");
+ showToast("璇疯緭鍏ユ�绘暟閲�");
+ return;
+ }
+ if (!form.value.qualifiedQuantity && form.value.qualifiedQuantity !== 0) {
+ showToast("璇疯緭鍏ュ悎鏍兼暟閲�");
+ return;
+ }
+ if (!form.value.unqualifiedQuantity && form.value.unqualifiedQuantity !== 0) {
+ showToast("璇疯緭鍏ヤ笉鍚堟牸鏁伴噺");
return;
}
if (!form.value.productId) {
@@ -696,11 +683,6 @@
showToast("璇烽�夋嫨鎸囨爣");
return;
}
- if (!form.value.checkResult) {
- showToast("璇烽�夋嫨妫�娴嬬粨鏋�");
- return;
- }
-
loading.value = true;
form.value.inspectType = 2;
@@ -712,6 +694,8 @@
const data = { ...form.value, qualityInspectParams: tableData.value };
data.quantity = Number(data.quantity);
+ data.qualifiedQuantity = Number(data.qualifiedQuantity);
+ data.unqualifiedQuantity = Number(data.unqualifiedQuantity);
if (isEdit.value) {
const res = await qualityInspectUpdate(data);
showToast("淇濆瓨鎴愬姛");
@@ -751,7 +735,8 @@
unit: "",
quantity: "",
checkCompany: "",
- checkResult: "",
+ qualifiedQuantity: "",
+ unqualifiedQuantity: "",
productMainId: null,
purchaseLedgerId: null,
};
@@ -773,7 +758,8 @@
unit: "kg",
quantity: 1000,
checkCompany: "绗笁鏂规娴嬫満鏋�",
- checkResult: "鍚堟牸",
+ qualifiedQuantity: 0,
+ unqualifiedQuantity: 0,
productMainId: null,
purchaseLedgerId: null,
};
@@ -852,8 +838,9 @@
testStandardId: "",
unit: "",
quantity: "",
+ qualifiedQuantity: "",
+ unqualifiedQuantity: "",
checkCompany: "",
- checkResult: "",
productMainId: null,
purchaseLedgerId: null,
};
diff --git a/src/pages/qualityManagement/finalInspection/detail.vue b/src/pages/qualityManagement/finalInspection/detail.vue
index d274a28..316d2fd 100644
--- a/src/pages/qualityManagement/finalInspection/detail.vue
+++ b/src/pages/qualityManagement/finalInspection/detail.vue
@@ -15,11 +15,11 @@
</view>
<text class="header-title">{{ detailData.productName || '-' }}</text>
<view class="status-tags">
- <u-tag v-if="detailData.checkResult"
- :type="getTagType(detailData.checkResult)"
+ <u-tag v-if="detailData.passRate != null && detailData.passRate !== ''"
+ type="primary"
size="small"
class="status-tag">
- {{ detailData.checkResult || '-' }}
+ 鍚堟牸鐜� {{ formatPassRate(detailData.passRate) }}
</u-tag>
<u-tag :type="getStateTagType(detailData.inspectState)"
size="small"
@@ -59,8 +59,20 @@
<text class="detail-value">{{ detailData.unit || '-' }}</text>
</view>
<view class="detail-row">
- <text class="detail-label">鏁伴噺</text>
- <text class="detail-value">{{ detailData.quantity || 0 }}</text>
+ <text class="detail-label">鎬绘暟閲�</text>
+ <text class="detail-value">{{ detailData.quantity ?? 0 }}</text>
+ </view>
+ <view class="detail-row">
+ <text class="detail-label">鍚堟牸鏁伴噺</text>
+ <text class="detail-value">{{ detailData.qualifiedQuantity ?? 0 }}</text>
+ </view>
+ <view class="detail-row">
+ <text class="detail-label">涓嶅悎鏍兼暟閲�</text>
+ <text class="detail-value">{{ detailData.unqualifiedQuantity ?? 0 }}</text>
+ </view>
+ <view class="detail-row">
+ <text class="detail-label">鍚堟牸鐜�</text>
+ <text class="detail-value">{{ formatPassRate(detailData.passRate) }}</text>
</view>
<view class="detail-row">
<text class="detail-label">妫�娴嬪崟浣�</text>
@@ -162,15 +174,12 @@
};
// 鑾峰彇鏍囩绫诲瀷
- const getTagType = result => {
- switch (result) {
- case "鍚堟牸":
- return "success";
- case "涓嶅悎鏍�":
- return "error";
- default:
- return "info";
- }
+ const formatPassRate = rate => {
+ if (rate === null || rate === undefined || rate === "") return "-";
+ const num = Number(rate);
+ if (isNaN(num)) return rate;
+ if (num <= 1) return `${(num * 100).toFixed(2)}%`;
+ return `${num}%`;
};
// 鑾峰彇鐘舵�佹爣绛剧被鍨�
diff --git a/src/pages/qualityManagement/finalInspection/index.vue b/src/pages/qualityManagement/finalInspection/index.vue
index 0e860ff..7eebf01 100644
--- a/src/pages/qualityManagement/finalInspection/index.vue
+++ b/src/pages/qualityManagement/finalInspection/index.vue
@@ -76,11 +76,11 @@
</view>
</view>
<view class="status-tags">
- <u-tag v-if="item.checkResult"
- :type="getTagType(item.checkResult)"
+ <u-tag v-if="item.passRate != null && item.passRate !== ''"
+ type="primary"
size="mini"
class="status-tag">
- {{ item.checkResult }}
+ 鍚堟牸鐜� {{ formatPassRate(item.passRate) }}
</u-tag>
<u-tag :type="getStateTagType(item.inspectState)"
size="mini"
@@ -316,11 +316,13 @@
return inspectState ? "checkmark-circle" : "time";
};
- // 鑾峰彇鏍囩绫诲瀷
- const getTagType = checkResult => {
- if (checkResult === "鍚堟牸") return "success";
- if (checkResult === "涓嶅悎鏍�") return "error";
- return "default";
+ // 鏍煎紡鍖栧悎鏍肩巼
+ const formatPassRate = rate => {
+ if (rate === null || rate === undefined || rate === "") return "-";
+ const num = Number(rate);
+ if (isNaN(num)) return rate;
+ if (num <= 1) return `${(num * 100).toFixed(2)}%`;
+ return `${num}%`;
};
// 鑾峰彇鐘舵�佹爣绛剧被鍨�
@@ -383,9 +385,11 @@
pendingCount.value = inspectionList.value.filter(
item => !item.inspectState
).length;
- qualifiedCount.value = inspectionList.value.filter(
- item => item.checkResult === "鍚堟牸"
- ).length;
+ qualifiedCount.value = inspectionList.value.filter(item => {
+ const rate = Number(item.passRate);
+ if (isNaN(rate)) return false;
+ return rate <= 1 ? rate >= 1 : rate >= 100;
+ }).length;
})
.catch(err => {
tableLoading.value = false;
diff --git a/src/pages/qualityManagement/materialInspection/add.vue b/src/pages/qualityManagement/materialInspection/add.vue
index e04391f..fec83fd 100644
--- a/src/pages/qualityManagement/materialInspection/add.vue
+++ b/src/pages/qualityManagement/materialInspection/add.vue
@@ -68,14 +68,32 @@
placeholder="璇疯緭鍏ュ崟浣�"
disabled />
</up-form-item>
- <up-form-item label="鏁伴噺"
+ <up-form-item label="鎬绘暟閲�"
prop="quantity"
required
border-bottom>
<up-input v-model="form.quantity"
type="number"
- placeholder="璇疯緭鍏ユ暟閲�"
+ placeholder="璇疯緭鍏ユ�绘暟閲�"
:disabled="supplierQuantityDisabled" />
+ </up-form-item>
+ <up-form-item label="鍚堟牸鏁伴噺"
+ prop="qualifiedQuantity"
+ required
+ border-bottom>
+ <up-input v-model="form.qualifiedQuantity"
+ type="number"
+ placeholder="璇疯緭鍏ュ悎鏍兼暟閲�"
+ clearable />
+ </up-form-item>
+ <up-form-item label="涓嶅悎鏍兼暟閲�"
+ prop="unqualifiedQuantity"
+ required
+ border-bottom>
+ <up-input v-model="form.unqualifiedQuantity"
+ type="number"
+ placeholder="璇疯緭鍏ヤ笉鍚堟牸鏁伴噺"
+ clearable />
</up-form-item>
<up-form-item label="妫�娴嬪崟浣�"
prop="checkCompany"
@@ -83,19 +101,6 @@
<up-input v-model="form.checkCompany"
placeholder="璇疯緭鍏ユ娴嬪崟浣�"
clearable />
- </up-form-item>
- <up-form-item label="妫�娴嬬粨鏋�"
- prop="checkResult"
- required
- border-bottom>
- <up-input v-model="form.checkResult"
- placeholder="璇烽�夋嫨妫�娴嬬粨鏋�"
- readonly
- @click="showResultSheet" />
- <template #right>
- <up-icon @click="showResultSheet = true"
- name="arrow-right" />
- </template>
</up-form-item>
<up-form-item label="妫�楠屽憳"
prop="checkName"
@@ -220,12 +225,6 @@
@select="selectModel"
@close="showModelSheet = false"
title="閫夋嫨瑙勬牸鍨嬪彿" />
- <!-- 妫�娴嬬粨鏋滈�夋嫨 -->
- <up-action-sheet :show="showResultSheet"
- :actions="resultSheetOptions"
- @select="selectResult"
- @close="showResultSheet = false"
- title="閫夋嫨妫�娴嬬粨鏋�" />
<!-- 妫�楠屽憳閫夋嫨 -->
<up-action-sheet :show="showInspectorSheet"
:actions="userSheetOptions"
@@ -352,8 +351,6 @@
const showProductTree = ref(false);
// 瑙勬牸鍨嬪彿閫夋嫨
const showModelSheet = ref(false);
- // 妫�娴嬬粨鏋滈�夋嫨
- const showResultSheet = ref(false);
// 妫�楠屽憳閫夋嫨
const showInspectorSheet = ref(false);
// 鎸囨爣閫夋嫨
@@ -371,8 +368,9 @@
testStandardId: "",
unit: "",
quantity: "",
+ qualifiedQuantity: "",
+ unqualifiedQuantity: "",
checkCompany: "",
- checkResult: "",
productMainId: null,
purchaseLedgerId: null,
});
@@ -392,11 +390,6 @@
const modelOptions = ref([]);
// 妫�楠屽憳鍒楄〃
const userList = ref([]);
- // 妫�娴嬬粨鏋滈�夐」
- const resultOptions = ref([
- { label: "鍚堟牸", value: "鍚堟牸" },
- { label: "涓嶅悎鏍�", value: "涓嶅悎鏍�" },
- ]);
// 鎸囨爣閫夐」
const testStandardOptions = ref([]);
// 褰撳墠浜у搧ID
@@ -421,13 +414,6 @@
return modelOptions.value.map(item => ({
name: item.model,
value: item.id,
- }));
- });
-
- const resultSheetOptions = computed(() => {
- return resultOptions.value.map(item => ({
- name: item.label,
- value: item.value,
}));
});
@@ -459,10 +445,9 @@
],
unit: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
quantity: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
+ qualifiedQuantity: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
+ unqualifiedQuantity: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
checkCompany: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
- checkResult: [
- { required: true, message: "璇烽�夋嫨妫�娴嬬粨鏋�", trigger: "change" },
- ],
};
// 鏄惁涓虹紪杈戞ā寮�
@@ -568,12 +553,6 @@
modelOptions.value.find(item => item.id == value)?.model || "";
form.value.unit =
modelOptions.value.find(item => item.id == value)?.unit || "";
- };
-
- // 閫夋嫨妫�娴嬬粨鏋�
- const selectResult = e => {
- form.value.checkResult = e.value;
- showResultSheet.value = false;
};
// 閫夋嫨妫�楠屽憳
@@ -698,7 +677,15 @@
return;
}
if (!form.value.quantity) {
- showToast("璇疯緭鍏ユ暟閲�");
+ showToast("璇疯緭鍏ユ�绘暟閲�");
+ return;
+ }
+ if (!form.value.qualifiedQuantity && form.value.qualifiedQuantity !== 0) {
+ showToast("璇疯緭鍏ュ悎鏍兼暟閲�");
+ return;
+ }
+ if (!form.value.unqualifiedQuantity && form.value.unqualifiedQuantity !== 0) {
+ showToast("璇疯緭鍏ヤ笉鍚堟牸鏁伴噺");
return;
}
if (!form.value.productId) {
@@ -709,11 +696,6 @@
showToast("璇烽�夋嫨鎸囨爣");
return;
}
- if (!form.value.checkResult) {
- showToast("璇烽�夋嫨妫�娴嬬粨鏋�");
- return;
- }
-
loading.value = true;
form.value.inspectType = 0;
@@ -725,6 +707,8 @@
const data = { ...form.value, qualityInspectParams: tableData.value };
data.quantity = Number(data.quantity);
+ data.qualifiedQuantity = Number(data.qualifiedQuantity);
+ data.unqualifiedQuantity = Number(data.unqualifiedQuantity);
if (isEdit.value) {
const res = await qualityInspectUpdate(data);
showToast("淇濆瓨鎴愬姛");
@@ -764,7 +748,8 @@
unit: "",
quantity: "",
checkCompany: "",
- checkResult: "",
+ qualifiedQuantity: "",
+ unqualifiedQuantity: "",
productMainId: null,
purchaseLedgerId: null,
};
@@ -786,7 +771,8 @@
unit: "kg",
quantity: 1000,
checkCompany: "绗笁鏂规娴嬫満鏋�",
- checkResult: "鍚堟牸",
+ qualifiedQuantity: 0,
+ unqualifiedQuantity: 0,
productMainId: null,
purchaseLedgerId: null,
};
@@ -865,8 +851,9 @@
testStandardId: "",
unit: "",
quantity: "",
+ qualifiedQuantity: "",
+ unqualifiedQuantity: "",
checkCompany: "",
- checkResult: "",
productMainId: null,
purchaseLedgerId: null,
};
diff --git a/src/pages/qualityManagement/materialInspection/detail.vue b/src/pages/qualityManagement/materialInspection/detail.vue
index 12ff7a3..8ae3970 100644
--- a/src/pages/qualityManagement/materialInspection/detail.vue
+++ b/src/pages/qualityManagement/materialInspection/detail.vue
@@ -15,11 +15,11 @@
</view>
<text class="header-title">{{ detailData.productName || '-' }}</text>
<view class="status-tags">
- <u-tag v-if="detailData.checkResult"
- :type="getTagType(detailData.checkResult)"
+ <u-tag v-if="detailData.passRate != null && detailData.passRate !== ''"
+ type="primary"
size="small"
class="status-tag">
- {{ detailData.checkResult || '-' }}
+ 鍚堟牸鐜� {{ formatPassRate(detailData.passRate) }}
</u-tag>
<u-tag :type="getStateTagType(detailData.inspectState)"
size="small"
@@ -59,8 +59,20 @@
<text class="detail-value">{{ detailData.unit || '-' }}</text>
</view>
<view class="detail-row">
- <text class="detail-label">鏁伴噺</text>
- <text class="detail-value">{{ detailData.quantity || 0 }}</text>
+ <text class="detail-label">鎬绘暟閲�</text>
+ <text class="detail-value">{{ detailData.quantity ?? 0 }}</text>
+ </view>
+ <view class="detail-row">
+ <text class="detail-label">鍚堟牸鏁伴噺</text>
+ <text class="detail-value">{{ detailData.qualifiedQuantity ?? 0 }}</text>
+ </view>
+ <view class="detail-row">
+ <text class="detail-label">涓嶅悎鏍兼暟閲�</text>
+ <text class="detail-value">{{ detailData.unqualifiedQuantity ?? 0 }}</text>
+ </view>
+ <view class="detail-row">
+ <text class="detail-label">鍚堟牸鐜�</text>
+ <text class="detail-value">{{ formatPassRate(detailData.passRate) }}</text>
</view>
<view class="detail-row">
<text class="detail-label">妫�娴嬪崟浣�</text>
@@ -161,16 +173,13 @@
return dayjs(date).format("YYYY-MM-DD");
};
- // 鑾峰彇鏍囩绫诲瀷
- const getTagType = result => {
- switch (result) {
- case "鍚堟牸":
- return "success";
- case "涓嶅悎鏍�":
- return "error";
- default:
- return "info";
- }
+ // 鏍煎紡鍖栧悎鏍肩巼
+ const formatPassRate = rate => {
+ if (rate === null || rate === undefined || rate === "") return "-";
+ const num = Number(rate);
+ if (isNaN(num)) return rate;
+ if (num <= 1) return `${(num * 100).toFixed(2)}%`;
+ return `${num}%`;
};
// 鑾峰彇鐘舵�佹爣绛剧被鍨�
diff --git a/src/pages/qualityManagement/materialInspection/index.vue b/src/pages/qualityManagement/materialInspection/index.vue
index eb4a140..571e68f 100644
--- a/src/pages/qualityManagement/materialInspection/index.vue
+++ b/src/pages/qualityManagement/materialInspection/index.vue
@@ -76,11 +76,11 @@
</view>
</view>
<view class="status-tags">
- <u-tag v-if="item.checkResult"
- :type="getTagType(item.checkResult)"
+ <u-tag v-if="item.passRate != null && item.passRate !== ''"
+ type="primary"
size="mini"
class="status-tag">
- {{ item.checkResult }}
+ 鍚堟牸鐜� {{ formatPassRate(item.passRate) }}
</u-tag>
<u-tag :type="getStateTagType(item.inspectState)"
size="mini"
@@ -316,11 +316,13 @@
return inspectState ? "checkmark-circle" : "time";
};
- // 鑾峰彇鏍囩绫诲瀷
- const getTagType = checkResult => {
- if (checkResult === "鍚堟牸") return "success";
- if (checkResult === "涓嶅悎鏍�") return "error";
- return "default";
+ // 鏍煎紡鍖栧悎鏍肩巼
+ const formatPassRate = rate => {
+ if (rate === null || rate === undefined || rate === "") return "-";
+ const num = Number(rate);
+ if (isNaN(num)) return rate;
+ if (num <= 1) return `${(num * 100).toFixed(2)}%`;
+ return `${num}%`;
};
// 鑾峰彇鐘舵�佹爣绛剧被鍨�
@@ -383,9 +385,11 @@
pendingCount.value = inspectionList.value.filter(
item => !item.inspectState
).length;
- qualifiedCount.value = inspectionList.value.filter(
- item => item.checkResult === "鍚堟牸"
- ).length;
+ qualifiedCount.value = inspectionList.value.filter(item => {
+ const rate = Number(item.passRate);
+ if (isNaN(rate)) return false;
+ return rate <= 1 ? rate >= 1 : rate >= 100;
+ }).length;
})
.catch(err => {
tableLoading.value = false;
diff --git a/src/pages/qualityManagement/processInspection/add.vue b/src/pages/qualityManagement/processInspection/add.vue
index 2f6a6d0..f546fcb 100644
--- a/src/pages/qualityManagement/processInspection/add.vue
+++ b/src/pages/qualityManagement/processInspection/add.vue
@@ -68,14 +68,32 @@
placeholder="璇疯緭鍏ュ崟浣�"
disabled />
</up-form-item>
- <up-form-item label="鏁伴噺"
+ <up-form-item label="鎬绘暟閲�"
prop="quantity"
required
border-bottom>
<up-input v-model="form.quantity"
type="number"
- placeholder="璇疯緭鍏ユ暟閲�"
+ placeholder="璇疯緭鍏ユ�绘暟閲�"
:disabled="processQuantityDisabled" />
+ </up-form-item>
+ <up-form-item label="鍚堟牸鏁伴噺"
+ prop="qualifiedQuantity"
+ required
+ border-bottom>
+ <up-input v-model="form.qualifiedQuantity"
+ type="number"
+ placeholder="璇疯緭鍏ュ悎鏍兼暟閲�"
+ clearable />
+ </up-form-item>
+ <up-form-item label="涓嶅悎鏍兼暟閲�"
+ prop="unqualifiedQuantity"
+ required
+ border-bottom>
+ <up-input v-model="form.unqualifiedQuantity"
+ type="number"
+ placeholder="璇疯緭鍏ヤ笉鍚堟牸鏁伴噺"
+ clearable />
</up-form-item>
<up-form-item label="妫�娴嬪崟浣�"
prop="checkCompany"
@@ -83,19 +101,6 @@
<up-input v-model="form.checkCompany"
placeholder="璇疯緭鍏ユ娴嬪崟浣�"
clearable />
- </up-form-item>
- <up-form-item label="妫�娴嬬粨鏋�"
- prop="checkResult"
- required
- border-bottom>
- <up-input v-model="form.checkResult"
- placeholder="璇烽�夋嫨妫�娴嬬粨鏋�"
- readonly
- @click="showResultSheet" />
- <template #right>
- <up-icon @click="showResultSheet = true"
- name="arrow-right" />
- </template>
</up-form-item>
<up-form-item label="妫�楠屽憳"
prop="checkName"
@@ -212,12 +217,6 @@
@select="selectModel"
@close="showModelSheet = false"
title="閫夋嫨瑙勬牸鍨嬪彿" />
- <!-- 妫�娴嬬粨鏋滈�夋嫨 -->
- <up-action-sheet :show="showResultSheet"
- :actions="resultSheetOptions"
- @select="selectResult"
- @close="showResultSheet = false"
- title="閫夋嫨妫�娴嬬粨鏋�" />
<!-- 妫�楠屽憳閫夋嫨 -->
<up-action-sheet :show="showInspectorSheet"
:actions="userSheetOptions"
@@ -344,8 +343,6 @@
const showProductTree = ref(false);
// 瑙勬牸鍨嬪彿閫夋嫨
const showModelSheet = ref(false);
- // 妫�娴嬬粨鏋滈�夋嫨
- const showResultSheet = ref(false);
// 妫�楠屽憳閫夋嫨
const showInspectorSheet = ref(false);
// 鎸囨爣閫夋嫨
@@ -363,8 +360,9 @@
testStandardId: "",
unit: "",
quantity: "",
+ qualifiedQuantity: "",
+ unqualifiedQuantity: "",
checkCompany: "",
- checkResult: "",
productMainId: null,
purchaseLedgerId: null,
});
@@ -384,11 +382,6 @@
const modelOptions = ref([]);
// 妫�楠屽憳鍒楄〃
const userList = ref([]);
- // 妫�娴嬬粨鏋滈�夐」
- const resultOptions = ref([
- { label: "鍚堟牸", value: "鍚堟牸" },
- { label: "涓嶅悎鏍�", value: "涓嶅悎鏍�" },
- ]);
// 鎸囨爣閫夐」
const testStandardOptions = ref([]);
// 褰撳墠浜у搧ID
@@ -413,13 +406,6 @@
return modelOptions.value.map(item => ({
name: item.model,
value: item.id,
- }));
- });
-
- const resultSheetOptions = computed(() => {
- return resultOptions.value.map(item => ({
- name: item.label,
- value: item.value,
}));
});
@@ -451,10 +437,9 @@
],
unit: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
quantity: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
+ qualifiedQuantity: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
+ unqualifiedQuantity: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
checkCompany: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
- checkResult: [
- { required: true, message: "璇烽�夋嫨妫�娴嬬粨鏋�", trigger: "change" },
- ],
};
// 鏄惁涓虹紪杈戞ā寮�
@@ -559,12 +544,6 @@
modelOptions.value.find(item => item.id == value)?.model || "";
form.value.unit =
modelOptions.value.find(item => item.id == value)?.unit || "";
- };
-
- // 閫夋嫨妫�娴嬬粨鏋�
- const selectResult = e => {
- form.value.checkResult = e.value;
- showResultSheet.value = false;
};
// 閫夋嫨妫�楠屽憳
@@ -689,7 +668,15 @@
return;
}
if (!form.value.quantity) {
- showToast("璇疯緭鍏ユ暟閲�");
+ showToast("璇疯緭鍏ユ�绘暟閲�");
+ return;
+ }
+ if (!form.value.qualifiedQuantity && form.value.qualifiedQuantity !== 0) {
+ showToast("璇疯緭鍏ュ悎鏍兼暟閲�");
+ return;
+ }
+ if (!form.value.unqualifiedQuantity && form.value.unqualifiedQuantity !== 0) {
+ showToast("璇疯緭鍏ヤ笉鍚堟牸鏁伴噺");
return;
}
if (!form.value.productId) {
@@ -700,11 +687,6 @@
showToast("璇烽�夋嫨鎸囨爣");
return;
}
- if (!form.value.checkResult) {
- showToast("璇烽�夋嫨妫�娴嬬粨鏋�");
- return;
- }
-
loading.value = true;
form.value.inspectType = 1;
@@ -716,6 +698,8 @@
const data = { ...form.value, qualityInspectParams: tableData.value };
data.quantity = Number(data.quantity);
+ data.qualifiedQuantity = Number(data.qualifiedQuantity);
+ data.unqualifiedQuantity = Number(data.unqualifiedQuantity);
if (isEdit.value) {
const res = await qualityInspectUpdate(data);
showToast("淇濆瓨鎴愬姛");
@@ -755,7 +739,8 @@
unit: "",
quantity: "",
checkCompany: "",
- checkResult: "",
+ qualifiedQuantity: "",
+ unqualifiedQuantity: "",
productMainId: null,
purchaseLedgerId: null,
};
@@ -777,7 +762,8 @@
unit: "kg",
quantity: 1000,
checkCompany: "绗笁鏂规娴嬫満鏋�",
- checkResult: "鍚堟牸",
+ qualifiedQuantity: 0,
+ unqualifiedQuantity: 0,
productMainId: null,
purchaseLedgerId: null,
};
@@ -856,8 +842,9 @@
testStandardId: "",
unit: "",
quantity: "",
+ qualifiedQuantity: "",
+ unqualifiedQuantity: "",
checkCompany: "",
- checkResult: "",
productMainId: null,
purchaseLedgerId: null,
};
diff --git a/src/pages/qualityManagement/processInspection/detail.vue b/src/pages/qualityManagement/processInspection/detail.vue
index 798aeee..ee368e4 100644
--- a/src/pages/qualityManagement/processInspection/detail.vue
+++ b/src/pages/qualityManagement/processInspection/detail.vue
@@ -15,11 +15,11 @@
</view>
<text class="header-title">{{ detailData.productName || '-' }}</text>
<view class="status-tags">
- <u-tag v-if="detailData.checkResult"
- :type="getTagType(detailData.checkResult)"
+ <u-tag v-if="detailData.passRate != null && detailData.passRate !== ''"
+ type="primary"
size="small"
class="status-tag">
- {{ detailData.checkResult }}
+ 鍚堟牸鐜� {{ formatPassRate(detailData.passRate) }}
</u-tag>
<u-tag :type="getStateTagType(detailData.inspectState)"
size="small"
@@ -59,8 +59,20 @@
<text class="detail-value">{{ detailData.unit || '-' }}</text>
</view>
<view class="detail-row">
- <text class="detail-label">鏁伴噺</text>
- <text class="detail-value">{{ detailData.quantity || 0 }}</text>
+ <text class="detail-label">鎬绘暟閲�</text>
+ <text class="detail-value">{{ detailData.quantity ?? 0 }}</text>
+ </view>
+ <view class="detail-row">
+ <text class="detail-label">鍚堟牸鏁伴噺</text>
+ <text class="detail-value">{{ detailData.qualifiedQuantity ?? 0 }}</text>
+ </view>
+ <view class="detail-row">
+ <text class="detail-label">涓嶅悎鏍兼暟閲�</text>
+ <text class="detail-value">{{ detailData.unqualifiedQuantity ?? 0 }}</text>
+ </view>
+ <view class="detail-row">
+ <text class="detail-label">鍚堟牸鐜�</text>
+ <text class="detail-value">{{ formatPassRate(detailData.passRate) }}</text>
</view>
<view class="detail-row">
<text class="detail-label">妫�娴嬪崟浣�</text>
@@ -162,15 +174,12 @@
};
// 鑾峰彇鏍囩绫诲瀷
- const getTagType = result => {
- switch (result) {
- case "鍚堟牸":
- return "success";
- case "涓嶅悎鏍�":
- return "error";
- default:
- return "info";
- }
+ const formatPassRate = rate => {
+ if (rate === null || rate === undefined || rate === "") return "-";
+ const num = Number(rate);
+ if (isNaN(num)) return rate;
+ if (num <= 1) return `${(num * 100).toFixed(2)}%`;
+ return `${num}%`;
};
// 鑾峰彇鐘舵�佹爣绛剧被鍨�
diff --git a/src/pages/qualityManagement/processInspection/index.vue b/src/pages/qualityManagement/processInspection/index.vue
index 40358ef..8f0d064 100644
--- a/src/pages/qualityManagement/processInspection/index.vue
+++ b/src/pages/qualityManagement/processInspection/index.vue
@@ -76,11 +76,11 @@
</view>
</view>
<view class="status-tags">
- <u-tag v-if="item.checkResult"
- :type="getTagType(item.checkResult)"
+ <u-tag v-if="item.passRate != null && item.passRate !== ''"
+ type="primary"
size="mini"
class="status-tag">
- {{ item.checkResult }}
+ 鍚堟牸鐜� {{ formatPassRate(item.passRate) }}
</u-tag>
<u-tag :type="getStateTagType(item.inspectState)"
size="mini"
@@ -316,11 +316,13 @@
return inspectState ? "checkmark-circle" : "time";
};
- // 鑾峰彇鏍囩绫诲瀷
- const getTagType = checkResult => {
- if (checkResult === "鍚堟牸") return "success";
- if (checkResult === "涓嶅悎鏍�") return "error";
- return "default";
+ // 鏍煎紡鍖栧悎鏍肩巼
+ const formatPassRate = rate => {
+ if (rate === null || rate === undefined || rate === "") return "-";
+ const num = Number(rate);
+ if (isNaN(num)) return rate;
+ if (num <= 1) return `${(num * 100).toFixed(2)}%`;
+ return `${num}%`;
};
// 鑾峰彇鐘舵�佹爣绛剧被鍨�
@@ -383,9 +385,11 @@
pendingCount.value = inspectionList.value.filter(
item => !item.inspectState
).length;
- qualifiedCount.value = inspectionList.value.filter(
- item => item.checkResult === "鍚堟牸"
- ).length;
+ qualifiedCount.value = inspectionList.value.filter(item => {
+ const rate = Number(item.passRate);
+ if (isNaN(rate)) return false;
+ return rate <= 1 ? rate >= 1 : rate >= 100;
+ }).length;
})
.catch(err => {
tableLoading.value = false;
--
Gitblit v1.9.3