From f24ec48c98a485af26321f7f4b74fe1611162f5a Mon Sep 17 00:00:00 2001
From: spring <2396852758@qq.com>
Date: 星期三, 25 三月 2026 18:05:32 +0800
Subject: [PATCH] fix: 吨/公斤换算

---
 src/pages/inventoryManagement/receiptManagement/index.vue  |   47 +++++++++++
 src/pages/inventoryManagement/stockManagement/add.vue      |   46 ++++++++++-
 src/pages/inventoryManagement/stockManagement/subtract.vue |   73 +++++++++++++++++-
 src/pages/inventoryManagement/dispatchLog/index.vue        |   46 ++++++++++
 4 files changed, 195 insertions(+), 17 deletions(-)

diff --git a/src/pages/inventoryManagement/dispatchLog/index.vue b/src/pages/inventoryManagement/dispatchLog/index.vue
index df78c59..d8a8491 100644
--- a/src/pages/inventoryManagement/dispatchLog/index.vue
+++ b/src/pages/inventoryManagement/dispatchLog/index.vue
@@ -83,7 +83,19 @@
           </view>
 
           <view class="form-row">
-            <text class="form-label required">姣涢噸(鍚�)</text>
+            <text class="form-label">鍗曚綅</text>
+            <up-radio-group v-model="editForm.unit" class="unit-radio-group">
+              <up-radio
+                v-for="opt in unitOptions"
+                :key="opt.value"
+                :label="opt.label"
+                :name="opt.value"
+              ></up-radio>
+            </up-radio-group>
+          </view>
+
+          <view class="form-row">
+            <text class="form-label required">姣涢噸</text>
             <up-input
               v-model="editForm.grossWeight"
               type="digit"
@@ -93,7 +105,7 @@
           </view>
 
           <view class="form-row">
-            <text class="form-label required">鐨噸(鍚�)</text>
+            <text class="form-label required">鐨噸</text>
             <up-input
               v-model="editForm.tareWeight"
               type="digit"
@@ -103,7 +115,7 @@
           </view>
 
           <view class="form-row">
-            <text class="form-label required">鍑�閲�(鍚�)</text>
+            <text class="form-label required">鍑�閲�</text>
             <up-input v-model="editForm.netWeight" type="digit" placeholder="鑷姩璁$畻" disabled />
           </view>
 
@@ -285,6 +297,7 @@
 const editForm = reactive({
   id: null,
   licensePlateNo: '',
+  unit: '鍚�',
   grossWeight: '',
   tareWeight: '',
   netWeight: '',
@@ -292,6 +305,26 @@
   weighingOperator: '',
   remark: ''
 })
+
+const unitOptions = [
+  { label: '鍚�', value: '鍚�' },
+  { label: '鍏枻', value: '鍏枻' }
+]
+
+const normalizeUnit = (u) => {
+  if (!u) return '鍚�'
+  const s = String(u).trim()
+  if (s === '鍚�' || s === 't' || s === 'ton' || s === 'tonne') return '鍚�'
+  if (
+    s === '鍏枻' ||
+    s === 'kg' ||
+    s === 'kilogram' ||
+    s === '鍗冨厠' ||
+    s === 'kilograms'
+  )
+    return '鍏枻'
+  return '鍚�'
+}
 
 const computeNetWeightEdit = () => {
   const gross = Number(editForm.grossWeight)
@@ -324,6 +357,7 @@
 
 const handleEdit = (row) => {
   Object.assign(editForm, row || {})
+  editForm.unit = normalizeUnit(editForm.unit)
   // 浠ュ綋鍓嶆瘺閲�/鐨噸涓哄噯璁$畻鍑�閲�
   computeNetWeightEdit()
   showEditModal.value = true
@@ -525,6 +559,12 @@
   color: #f56c6c;
   margin-right: 6rpx;
 }
+.unit-radio-group {
+  display: flex;
+  gap: 24rpx;
+  align-items: center;
+  flex-wrap: wrap;
+}
 .selector-trigger {
   display: flex;
   align-items: center;
diff --git a/src/pages/inventoryManagement/receiptManagement/index.vue b/src/pages/inventoryManagement/receiptManagement/index.vue
index 002b2d9..1d51f9b 100644
--- a/src/pages/inventoryManagement/receiptManagement/index.vue
+++ b/src/pages/inventoryManagement/receiptManagement/index.vue
@@ -81,16 +81,29 @@
             <text class="form-label required">杞︾墝鍙�</text>
             <up-input v-model="editForm.licensePlateNo" placeholder="璇疯緭鍏ヨ溅鐗屽彿" />
           </view>
+
           <view class="form-row">
-            <text class="form-label required">姣涢噸(鍚�)</text>
+            <text class="form-label">鍗曚綅</text>
+            <up-radio-group v-model="editForm.unit" class="unit-radio-group">
+              <up-radio
+                v-for="opt in unitOptions"
+                :key="opt.value"
+                :label="opt.label"
+                :name="opt.value"
+              ></up-radio>
+            </up-radio-group>
+          </view>
+
+          <view class="form-row">
+            <text class="form-label required">姣涢噸</text>
             <up-input v-model="editForm.grossWeight" type="digit" placeholder="璇疯緭鍏ユ瘺閲�" @blur="computeNetWeightEdit" />
           </view>
           <view class="form-row">
-            <text class="form-label required">鐨噸(鍚�)</text>
+            <text class="form-label required">鐨噸</text>
             <up-input v-model="editForm.tareWeight" type="digit" placeholder="璇疯緭鍏ョ毊閲�" @blur="computeNetWeightEdit" />
           </view>
           <view class="form-row">
-            <text class="form-label required">鍑�閲�(鍚�)</text>
+            <text class="form-label required">鍑�閲�</text>
             <up-input v-model="editForm.netWeight" type="digit" placeholder="鑷姩璁$畻" disabled />
           </view>
           <view class="form-row">
@@ -275,6 +288,7 @@
 const editForm = reactive({
   id: null,
   licensePlateNo: '',
+  unit: '鍚�',
   grossWeight: '',
   tareWeight: '',
   netWeight: '',
@@ -282,6 +296,26 @@
   weighingOperator: '',
   remark: ''
 })
+
+const unitOptions = [
+  { label: '鍚�', value: '鍚�' },
+  { label: '鍏枻', value: '鍏枻' }
+]
+
+const normalizeUnit = (u) => {
+  if (!u) return '鍚�'
+  const s = String(u).trim()
+  if (s === '鍚�' || s === 't' || s === 'ton' || s === 'tonne') return '鍚�'
+  if (
+    s === '鍏枻' ||
+    s === 'kg' ||
+    s === 'kilogram' ||
+    s === '鍗冨厠' ||
+    s === 'kilograms'
+  )
+    return '鍏枻'
+  return '鍚�'
+}
 
 const computeNetWeightEdit = () => {
   const gross = Number(editForm.grossWeight)
@@ -312,6 +346,7 @@
 
 const handleEdit = (row) => {
   Object.assign(editForm, row || {})
+  editForm.unit = normalizeUnit(editForm.unit)
   computeNetWeightEdit()
   showEditModal.value = true
 }
@@ -534,6 +569,12 @@
   color: #f56c6c;
   margin-right: 6rpx;
 }
+.unit-radio-group {
+  display: flex;
+  gap: 24rpx;
+  align-items: center;
+  flex-wrap: wrap;
+}
 .selector-trigger {
   display: flex;
   align-items: center;
diff --git a/src/pages/inventoryManagement/stockManagement/add.vue b/src/pages/inventoryManagement/stockManagement/add.vue
index 8c29d09..ae1329c 100644
--- a/src/pages/inventoryManagement/stockManagement/add.vue
+++ b/src/pages/inventoryManagement/stockManagement/add.vue
@@ -19,7 +19,14 @@
         </view>
         <view class="form-row">
           <text class="form-label">鍗曚綅</text>
-          <up-input v-model="form.unit" disabled placeholder="璇烽�夋嫨浜у搧鍚庤嚜鍔ㄥ甫鍑�" />
+          <up-radio-group v-model="form.unit" class="unit-radio-group">
+            <up-radio
+              v-for="opt in unitOptions"
+              :key="opt.value"
+              :label="opt.label"
+              :name="opt.value"
+            ></up-radio>
+          </up-radio-group>
         </view>
       </view>
 
@@ -39,7 +46,7 @@
           <up-input v-model="form.licensePlateNo" placeholder="璇疯緭鍏ヨ溅鐗屽彿" />
         </view>
         <view class="form-row">
-          <text class="form-label required">姣涢噸(鍚�)</text>
+          <text class="form-label required">姣涢噸</text>
           <up-input
             v-model="form.grossWeight"
             type="digit"
@@ -47,7 +54,7 @@
           />
         </view>
         <view class="form-row">
-          <text class="form-label required">鐨噸(鍚�)</text>
+          <text class="form-label required">鐨噸</text>
           <up-input
             v-model="form.tareWeight"
             type="digit"
@@ -55,7 +62,7 @@
           />
         </view>
         <view class="form-row">
-          <text class="form-label">鍑�閲�(鍚�)</text>
+          <text class="form-label">鍑�閲�</text>
           <up-input
             v-model="form.netWeight"
             type="digit"
@@ -156,7 +163,7 @@
   productModelId: undefined,
   productName: '',
   productModelName: '',
-  unit: '',
+  unit: '鍚�',
   productType: undefined,
   parentName: '',
   licensePlateNo: '',
@@ -168,6 +175,26 @@
   qualitity: '',
   remark: ''
 })
+
+const unitOptions = [
+  { label: '鍚�', value: '鍚�' },
+  { label: '鍏枻', value: '鍏枻' }
+]
+
+const normalizeUnit = (u) => {
+  if (!u) return ''
+  const s = String(u).trim()
+  if (s === '鍚�' || s === 't' || s === 'ton' || s === 'tonne') return '鍚�'
+  if (
+    s === '鍏枻' ||
+    s === 'kg' ||
+    s === 'kilogram' ||
+    s === '鍗冨厠' ||
+    s === 'kilograms'
+  )
+    return '鍏枻'
+  return s
+}
 
 const type = ref('0') // 鍥哄畾鍚堟牸搴撳瓨
 const isQualified = computed(() => true)
@@ -227,7 +254,8 @@
   form.productModelId = item.id
   form.productName = item.productName
   form.productModelName = item.model
-  form.unit = item.unit
+  const normalizedUnit = normalizeUnit(item.unit)
+  form.unit = normalizedUnit === '鍚�' || normalizedUnit === '鍏枻' ? normalizedUnit : '鍚�'
   form.productType = item.productType
   form.parentName = parentName
 
@@ -470,6 +498,12 @@
   font-size: 24rpx;
   color: #666;
 }
+.unit-radio-group {
+  display: flex;
+  gap: 24rpx;
+  align-items: center;
+  flex-wrap: wrap;
+}
 .no-data {
   text-align: center;
   padding: 40rpx 0;
diff --git a/src/pages/inventoryManagement/stockManagement/subtract.vue b/src/pages/inventoryManagement/stockManagement/subtract.vue
index 7fb85e1..6da92d4 100644
--- a/src/pages/inventoryManagement/stockManagement/subtract.vue
+++ b/src/pages/inventoryManagement/stockManagement/subtract.vue
@@ -14,7 +14,14 @@
         </view>
         <view class="form-row">
           <text class="form-label">鍗曚綅</text>
-          <up-input v-model="form.unit" disabled />
+          <up-radio-group v-model="form.unit" class="unit-radio-group">
+            <up-radio
+              v-for="opt in unitOptions"
+              :key="opt.value"
+              :label="opt.label"
+              :name="opt.value"
+            ></up-radio>
+          </up-radio-group>
         </view>
       </view>
 
@@ -22,7 +29,11 @@
         <view class="section-title">鍑哄簱淇℃伅</view>
         <view class="form-row">
           <text class="form-label">鍑哄簱鏁伴噺</text>
-          <up-input v-model="form.stockOutNum" type="number" :placeholder="'鏈�澶�' + (form.unLockedQuantity ?? 0)" />
+          <up-input
+            v-model="form.stockOutNum"
+            type="number"
+            :placeholder="'鏈�澶�' + maxOutQuantity"
+          />
         </view>
         <view class="form-row">
           <text class="form-label">澶囨敞</text>
@@ -52,7 +63,7 @@
   parentName: '',
   productName: '',
   model: '',
-  unit: '',
+  unit: '鍚�',
   qualitity: undefined,
   lockedQuantity: undefined,
   unLockedQuantity: undefined,
@@ -69,6 +80,45 @@
 })
 
 const type = ref('0') // 鍥哄畾鍚堟牸搴撳瓨
+const unitOptions = [
+  { label: '鍚�', value: '鍚�' },
+  { label: '鍏枻', value: '鍏枻' }
+]
+
+// 璁板綍鐨勫師濮嬪崟浣嶏紝鐢ㄤ簬鍚�/鍏枻鎹㈢畻鏍¢獙鈥滄渶澶у彲鍑哄簱鏁伴噺鈥�
+const recordUnit = ref('')
+
+const normalizeUnit = (u) => {
+  if (!u) return ''
+  const s = String(u).trim()
+  if (s === '鍚�' || s === 't' || s === 'ton' || s === 'tonne') return '鍚�'
+  if (
+    s === '鍏枻' ||
+    s === 'kg' ||
+    s === 'kilogram' ||
+    s === '鍗冨厠' ||
+    s === 'kilograms'
+  )
+    return '鍏枻'
+  return s
+}
+
+const convertByUnit = (value, fromUnit, toUnit) => {
+  if (value === '' || value === undefined || value === null) return 0
+  const num = Number(value)
+  if (Number.isNaN(num)) return 0
+  if (fromUnit === toUnit) return num
+  // 榛樿鍙鐞嗗惃<->鍏枻锛涘叾浠栧崟浣嶇洿鎺ュ師鏍疯繑鍥�
+  if (fromUnit === '鍚�' && toUnit === '鍏枻') return num * 1000
+  if (fromUnit === '鍏枻' && toUnit === '鍚�') return num / 1000
+  return num
+}
+
+const maxOutQuantity = computed(() => {
+  const baseMax = Number(form.unLockedQuantity ?? 0)
+  if (!recordUnit.value || !form.unit) return baseMax
+  return convertByUnit(baseMax, recordUnit.value, form.unit)
+})
 
 onLoad((options) => {
   type.value = '0'
@@ -79,6 +129,9 @@
       const item = payload && payload.item ? payload.item : payload
       // 灏嗗垪琛ㄨ褰曠殑瀹屾暣瀛楁鎷疯礉鍒拌〃鍗曚腑锛屼繚鎸佷笌 PC 绔� Subtract.vue 涓�鑷�
       Object.assign(form, item)
+      const normalizedUnit = normalizeUnit(form.unit)
+      form.unit = normalizedUnit === '鍚�' || normalizedUnit === '鍏枻' ? normalizedUnit : '鍚�'
+      recordUnit.value = form.unit
       uni.removeStorageSync('stockSubtractRecord')
     } catch (e) {
       uni.removeStorageSync('stockSubtractRecord')
@@ -91,8 +144,11 @@
     uni.showToast({ title: '璁板綍淇℃伅缂哄け锛屾棤娉曞嚭搴�', icon: 'none' })
     return
   }
+  const normalizedUnit = normalizeUnit(form.unit)
+  form.unit = normalizedUnit === '鍚�' || normalizedUnit === '鍏枻' ? normalizedUnit : '鍚�'
+
   const outNum = Number(form.stockOutNum)
-  const max = Number(form.unLockedQuantity ?? 0)
+  const max = Number(maxOutQuantity.value ?? 0)
   if (!outNum || outNum <= 0 || outNum > max) {
     uni.showToast({ title: `璇疯緭鍏� 1~${max} 涔嬮棿鐨勬暟閲廯, icon: 'none' })
     return
@@ -100,7 +156,8 @@
   const payload = {
     id: form.id,
     stockOutNum: outNum,
-    remark: form.remark
+    remark: form.remark,
+    unit: form.unit
   }
   subtractStockInventory(payload)
     .then(() => {
@@ -181,5 +238,11 @@
   align-items: center;
   justify-content: center;
 }
+.unit-radio-group {
+  display: flex;
+  gap: 24rpx;
+  align-items: center;
+  flex-wrap: wrap;
+}
 </style>
 

--
Gitblit v1.9.3