From cc3001ab9e0ab8ce673b812a22ebea1edd332f2a Mon Sep 17 00:00:00 2001
From: spring <2396852758@qq.com>
Date: 星期六, 14 三月 2026 15:38:33 +0800
Subject: [PATCH] fix: 完成仓储物流的功能开发

---
 src/pages/inventoryManagement/stockManagement/subtract.vue |  268 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 268 insertions(+), 0 deletions(-)

diff --git a/src/pages/inventoryManagement/stockManagement/subtract.vue b/src/pages/inventoryManagement/stockManagement/subtract.vue
new file mode 100644
index 0000000..4970275
--- /dev/null
+++ b/src/pages/inventoryManagement/stockManagement/subtract.vue
@@ -0,0 +1,268 @@
+<template>
+  <view class="subtract-page">
+    <PageHeader title="搴撳瓨鍑哄簱" @back="goBack" />
+
+    <scroll-view scroll-y class="content-scroll">
+      <view class="form-section">
+        <view class="form-row">
+          <text class="form-label">浜у搧鍚嶇О</text>
+          <up-input v-model="form.productName" disabled />
+        </view>
+        <view class="form-row">
+          <text class="form-label">瑙勬牸</text>
+          <up-input v-model="form.model" disabled />
+        </view>
+        <view class="form-row">
+          <text class="form-label">鍗曚綅</text>
+          <up-input v-model="form.unit" disabled />
+        </view>
+      </view>
+
+      <view class="form-section">
+        <view class="section-title">鍑哄簱/杩囩淇℃伅</view>
+        <view class="form-row">
+          <text class="form-label">杞︾墝鍙�</text>
+          <up-input v-model="form.licensePlateNo" placeholder="璇疯緭鍏ヨ溅鐗屽彿" />
+        </view>
+        <view class="form-row">
+          <text class="form-label">姣涢噸(鍚�)</text>
+          <up-input
+            v-model="form.grossWeight"
+            type="number"
+            placeholder="璇疯緭鍏ユ瘺閲�"
+          />
+        </view>
+        <view class="form-row">
+          <text class="form-label">鐨噸(鍚�)</text>
+          <up-input
+            v-model="form.tareWeight"
+            type="number"
+            placeholder="璇疯緭鍏ョ毊閲�"
+          />
+        </view>
+        <view class="form-row">
+          <text class="form-label">鍑�閲�(鍚�)</text>
+          <up-input
+            v-model="form.netWeight"
+            type="number"
+            disabled
+            placeholder="鑷姩璁$畻"
+          />
+        </view>
+        <view class="form-row">
+          <text class="form-label">杩囩鏃ユ湡</text>
+          <view class="selector-trigger" @click="openWeighingDatePicker">
+            <text class="selector-text" :class="{ placeholder: !form.weighingDate }">
+              {{ form.weighingDate || '璇烽�夋嫨杩囩鏃ユ湡' }}
+            </text>
+            <up-icon name="calendar" size="16" color="#999"></up-icon>
+          </view>
+        </view>
+        <view class="form-row">
+          <text class="form-label">杩囩鍛�</text>
+          <up-input v-model="form.weighingOperator" placeholder="璇疯緭鍏ヨ繃纾呭憳" />
+        </view>
+        <view class="form-row">
+          <text class="form-label">澶囨敞</text>
+          <up-input v-model="form.remark" type="textarea" placeholder="閫夊~" />
+        </view>
+      </view>
+    </scroll-view>
+
+    <view class="bottom-bar">
+      <view class="btn-submit" @click="handleSubmit">鍑哄簱</view>
+    </view>
+
+    <!-- 杩囩鏃ユ湡閫夋嫨鍣� -->
+    <up-popup :show="showWeighingDatePicker" mode="bottom" @close="showWeighingDatePicker = false">
+      <up-datetime-picker
+        :show="true"
+        v-model="weighingDateValue"
+        mode="datetime"
+        @confirm="onWeighingDateConfirm"
+        @cancel="showWeighingDatePicker = false"
+      />
+    </up-popup>
+  </view>
+</template>
+
+<script setup>
+import { ref, reactive, watch } from 'vue'
+import { onLoad } from '@dcloudio/uni-app'
+import dayjs from 'dayjs'
+import PageHeader from '@/components/PageHeader.vue'
+import { subtractStockInventory } from '@/api/inventoryManagement/stockInventory.js'
+import { subtractStockUnInventory } from '@/api/inventoryManagement/stockUninventory.js'
+
+const form = reactive({
+  id: undefined,
+  // 浜у搧鍙婂簱瀛樺熀纭�淇℃伅锛堟潵鑷垪琛ㄨ褰曪級
+  productId: undefined,
+  productModelId: undefined,
+  parentId: undefined,
+  parentName: '',
+  productName: '',
+  model: '',
+  unit: '',
+  qualitity: undefined,
+  lockedQuantity: undefined,
+  unLockedQuantity: undefined,
+  warnNum: undefined,
+  currentStock: undefined,
+  totalStockIn: undefined,
+  totalStockOut: undefined,
+  createTime: '',
+  updateTime: '',
+  version: undefined,
+  // 鍑哄簱/杩囩淇℃伅
+  licensePlateNo: '',
+  grossWeight: '',
+  tareWeight: '',
+  netWeight: '',
+  weighingDate: '',
+  weighingOperator: '',
+  remark: ''
+})
+
+const type = ref('0') // 0 鍚堟牸搴撳瓨锛�1 涓嶅悎鏍煎簱瀛�
+const showWeighingDatePicker = ref(false)
+const weighingDateValue = ref(Date.now())
+
+onLoad((options) => {
+  if (options && options.type != null) {
+    type.value = options.type
+  }
+  const cached = uni.getStorageSync('stockSubtractRecord')
+  if (cached) {
+    try {
+      const payload = typeof cached === 'string' ? JSON.parse(cached) : cached
+      const item = payload && payload.item ? payload.item : payload
+      // 灏嗗垪琛ㄨ褰曠殑瀹屾暣瀛楁鎷疯礉鍒拌〃鍗曚腑锛屼繚鎸佷笌 PC 绔� Subtract.vue 涓�鑷�
+      Object.assign(form, item)
+      uni.removeStorageSync('stockSubtractRecord')
+    } catch (e) {
+      uni.removeStorageSync('stockSubtractRecord')
+    }
+  }
+})
+
+// 鍑�閲� = 姣涢噸 - 鐨噸
+const computeNetWeight = () => {
+  const gross = Number(form.grossWeight)
+  const tare = Number(form.tareWeight)
+  if (!isNaN(gross) && !isNaN(tare)) {
+    const net = Number((gross - tare).toFixed(2))
+    form.netWeight = net > 0 ? net : 0
+  } else {
+    form.netWeight = ''
+  }
+}
+
+watch(
+  () => [form.grossWeight, form.tareWeight],
+  () => {
+    computeNetWeight()
+  }
+)
+
+const openWeighingDatePicker = () => {
+  weighingDateValue.value = form.weighingDate
+    ? dayjs(form.weighingDate, 'YYYY-MM-DD HH:mm:ss').valueOf()
+    : Date.now()
+  showWeighingDatePicker.value = true
+}
+
+const onWeighingDateConfirm = (e) => {
+  const ts = e?.value ?? weighingDateValue.value
+  form.weighingDate = dayjs(ts).format('YYYY-MM-DD HH:mm:ss')
+  showWeighingDatePicker.value = false
+}
+
+const handleSubmit = () => {
+  if (!form.id) {
+    uni.showToast({ title: '璁板綍淇℃伅缂哄け锛屾棤娉曞嚭搴�', icon: 'none' })
+    return
+  }
+  const payload = { ...form }
+  const api = type.value === '0' ? subtractStockInventory : subtractStockUnInventory
+  api(payload)
+    .then(() => {
+      uni.showToast({ title: '鍑哄簱鎴愬姛', icon: 'success' })
+      setTimeout(() => {
+        uni.navigateBack()
+      }, 400)
+    })
+    .catch(() => {
+      uni.showToast({ title: '鍑哄簱澶辫触', icon: 'none' })
+    })
+}
+
+const goBack = () => uni.navigateBack()
+</script>
+
+<style lang="scss" scoped>
+.subtract-page {
+  min-height: 100vh;
+  background: #f5f5f5;
+  padding-bottom: 100rpx;
+}
+.content-scroll {
+  height: calc(100vh - 100rpx);
+}
+.form-section {
+  background: #fff;
+  margin: 24rpx;
+  padding: 24rpx;
+  border-radius: 16rpx;
+}
+.section-title {
+  font-size: 28rpx;
+  font-weight: 500;
+  color: #333;
+  margin-bottom: 12rpx;
+}
+.form-row {
+  margin-bottom: 24rpx;
+}
+.form-label {
+  display: block;
+  font-size: 26rpx;
+  color: #666;
+  margin-bottom: 12rpx;
+}
+.selector-trigger {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  padding: 20rpx 24rpx;
+  background: #f5f5f5;
+  border-radius: 12rpx;
+}
+.selector-text {
+  font-size: 28rpx;
+  color: #333;
+}
+.selector-text.placeholder {
+  color: #999;
+}
+.bottom-bar {
+  position: fixed;
+  left: 0;
+  right: 0;
+  bottom: 0;
+  padding: 16rpx 24rpx calc(16rpx + env(safe-area-inset-bottom));
+  background: #fff;
+  box-shadow: 0 -4rpx 16rpx rgba(0, 0, 0, 0.04);
+}
+.btn-submit {
+  height: 88rpx;
+  border-radius: 999rpx;
+  background: #2979ff;
+  color: #fff;
+  font-size: 30rpx;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+}
+</style>
+

--
Gitblit v1.9.3