From 0c357e90050d9d461c6ab0d85e1b9c2bac2f6f55 Mon Sep 17 00:00:00 2001
From: zhangwencui <1064582902@qq.com>
Date: 星期一, 19 一月 2026 17:50:36 +0800
Subject: [PATCH] Merge branch 'dev_new' of http://114.132.189.42:9002/r/product-inventory-APP-before into dev_new
---
src/pages/productionManagement/productionDispatching/index.vue | 995 +++++-----------------------------------------------------
1 files changed, 91 insertions(+), 904 deletions(-)
diff --git a/src/pages/productionManagement/productionDispatching/index.vue b/src/pages/productionManagement/productionDispatching/index.vue
index 2dde7b3..7aea197 100644
--- a/src/pages/productionManagement/productionDispatching/index.vue
+++ b/src/pages/productionManagement/productionDispatching/index.vue
@@ -2,232 +2,109 @@
<view class="production-dispatching">
<!-- 浣跨敤閫氱敤椤甸潰澶撮儴缁勪欢 -->
<PageHeader title="鐢熶骇娲惧伐" @back="goBack" />
-
- <!-- 鐐掓満鐘舵�佸睍绀� -->
- <view class="machines-section">
- <view class="section-title">鐐掓満鐘舵��</view>
- <view class="machines-grid">
- <view v-for="machine in machines" :key="machine.id" class="machine-card">
- <view class="machine-title">鐐掓満{{ machine.id }}</view>
- <view class="machine-metrics">
- <view class="metric-item">
- <text class="metric-label">鎬婚噺(kg)</text>
- <up-input
- v-model="machineTotal[machine.key]"
- type="number"
- placeholder="璇疯緭鍏ユ�婚噺"
- border="surround"
- size="mini"
- class="metric-input"
- @change="updateMachineVacant(machine.key)"
- />
- </view>
- <view class="metric-item">
- <text class="metric-label">姝e湪鐢熶骇(kg)</text>
- <text class="metric-value">{{ machineInProduction[machine.key] }}</text>
- </view>
- <view class="metric-item">
- <text class="metric-label">绌轰綑閲�(kg)</text>
- <text class="metric-value">{{ machineVacant[machine.key] }}</text>
- </view>
- </view>
- </view>
- </view>
- <!-- 鎹熻�楃巼璁剧疆 -->
- <view class="loss-rate-section">
- <view class="section-title">鎹熻�楃巼璁剧疆</view>
- <view class="loss-rate-content">
- <view class="loss-rate-item">
- <up-button
- class="loss-rate-btn"
- type="primary"
- plain
- size="small"
- @click="showLossRateSheet = true"
- >{{ lossRate ? `鎹熻�楃巼: ${lossRate}%` : '璇烽�夋嫨鎹熻�楃巼' }}</up-button>
- <up-action-sheet
- :show="showLossRateSheet"
- :actions="lossRateOptions"
- @select="onLossRateSelect"
- title="閫夋嫨鎹熻�楃巼"
- @close="showLossRateSheet = false"
- />
- </view>
- </view>
- </view>
- <view class="save-section">
- <up-button type="primary" @click="saveMachineTotals" size="normal" class="save-btn">淇濆瓨鐐掓満璁剧疆</up-button>
- </view>
- </view>
<!-- 鎼滅储鍖哄煙 -->
<view class="search-section">
- <view class="search-form">
- <view class="search-item">
- <text class="search-label">瀹㈡埛鍚嶇О</text>
+ <view class="search-bar">
+ <view class="search-input">
<up-input
+ class="search-text"
+ placeholder="璇疯緭鍏ュ鎴峰悕绉版悳绱�"
v-model="searchForm.customerName"
- placeholder="璇疯緭鍏ュ鎴峰悕绉�"
@change="handleQuery"
clearable
- border="surround"
- class="search-input"
/>
</view>
- <view class="search-item">
- <text class="search-label">椤圭洰鍚嶇О</text>
- <up-input
- v-model="searchForm.projectName"
- placeholder="璇疯緭鍏ラ」鐩悕绉�"
- @change="handleQuery"
- clearable
- border="surround"
- class="search-input"
- />
- </view>
- <view class="search-buttons">
- <up-button type="primary" @click="handleQuery" size="small" class="search-btn">鎼滅储</up-button>
- <up-button @click="handleReset" size="small" class="reset-btn">閲嶇疆</up-button>
+ <view class="filter-button" @click="handleQuery">
+ <up-icon name="search" size="24" color="#999"></up-icon>
</view>
</view>
</view>
- <!-- 鎵归噺鎿嶄綔鍖哄煙 -->
- <view class="batch-actions-section" v-if="showBatchActions">
- <view class="batch-info">
- <text class="batch-text">宸查�夋嫨 {{ selectedItems.length }} 涓」鐩�</text>
- </view>
- <view class="batch-buttons">
- <up-button type="primary" size="small" @click="handleAutoDispatch" class="batch-btn">鑷姩娲惧崟</up-button>
- <up-button type="default" size="small" @click="clearSelection" class="batch-btn">鍙栨秷閫夋嫨</up-button>
- </view>
- </view>
-
- <!-- 鍏ㄩ�夋搷浣滃尯鍩� -->
- <view class="select-all-section" v-if="tableData.length > 0">
- <view class="select-all-content">
- <up-checkbox
- v-model="isAllSelected"
- @change="toggleAllSelection"
- label="鍏ㄩ��"
- class="select-all-checkbox"
- :disabled="tableData.length === 0 || tableData.filter(item => item.pendingQuantity > 0 && item.speculativeTradingName).length === 0"
- />
- </view>
- </view>
-
<!-- 鐢熶骇娲惧伐鍒楄〃 -->
<view class="ledger-list" v-if="tableData.length > 0">
- <view v-for="(item, index) in tableData" :key="item.id || index" class="list-item">
+ <view v-for="(item, index) in tableData" :key="item.id || index">
<view class="ledger-item">
- <!-- 閫夋嫨澶嶉�夋 -->
- <view class="item-checkbox">
- <up-checkbox
- :model-value="selectedItems.some(selected => selected.id === item.id)"
- @change="(checked) => toggleItemSelection(item, checked)"
- :disabled="item.pendingQuantity <= 0 || !item.speculativeTradingName"
- shape="circle"
- />
+ <view class="item-header">
+ <view class="item-left">
+ <view class="document-icon">
+ <up-icon name="file-text" size="16" color="#ffffff"></up-icon>
+ </view>
+ <text class="item-id">{{ item.salesContractNo }}</text>
+ </view>
+ </view>
+ <up-divider></up-divider>
+
+ <view class="item-details">
+ <view class="detail-row">
+ <text class="detail-label">褰曞叆鏃ユ湡</text>
+ <text class="detail-value">{{ item.entryDate }}</text>
+ </view>
+ <view class="detail-row">
+ <text class="detail-label">瀹㈡埛鍚堝悓鍙�</text>
+ <text class="detail-value">{{ item.customerContractNo }}</text>
+ </view>
+ <view class="detail-row">
+ <text class="detail-label">瀹㈡埛鍚嶇О</text>
+ <text class="detail-value">{{ item.customerName }}</text>
+ </view>
+ <view class="detail-row">
+ <text class="detail-label">椤圭洰鍚嶇О</text>
+ <text class="detail-value">{{ item.projectName }}</text>
+ </view>
+ <view class="detail-row">
+ <text class="detail-label">浜у搧澶х被</text>
+ <text class="detail-value">{{ item.productCategory }}</text>
+ </view>
+ <view class="detail-row">
+ <text class="detail-label">瑙勬牸鍨嬪彿</text>
+ <text class="detail-value">{{ item.specificationModel }}</text>
+ </view>
+ <view class="detail-row">
+ <text class="detail-label">鎬绘暟閲�</text>
+ <text class="detail-value">{{ item.quantity }} {{ item.unit }}</text>
+ </view>
+ <view class="detail-row">
+ <text class="detail-label">鎺掍骇鏁伴噺</text>
+ <text class="detail-value highlight">{{ item.schedulingNum }}</text>
+ </view>
+ <view class="detail-row">
+ <text class="detail-label">寰呮帓鏁伴噺</text>
+ <text class="detail-value" :class="{ 'danger': item.pendingQuantity <= 0 }">{{ item.pendingQuantity }}</text>
+ </view>
</view>
- <view class="item-content">
- <view class="item-header">
- <view class="item-left">
- <view class="document-icon">
- <up-icon name="file-text" size="16" color="#ffffff"></up-icon>
- </view>
- <text class="item-id">{{ item.salesContractNo }}</text>
- </view>
- <text class="entry-date">{{ item.entryDate }}</text>
- </view>
-
- <view class="item-details">
- <!-- <view class="detail-row">
- <text class="detail-label">瀹㈡埛鍚堝悓鍙�</text>
- <text class="detail-value">{{ item.customerContractNo }}</text>
- </view> -->
- <view class="detail-row">
- <text class="detail-label">瀹㈡埛鍚嶇О</text>
- <text class="detail-value">{{ item.customerName }}</text>
- </view>
- <!-- <view class="detail-row">
- <text class="detail-label">椤圭洰鍚嶇О</text>
- <text class="detail-value">{{ item.projectName }}</text>
- </view> -->
- <view class="detail-row">
- <text class="detail-label">浜у搧澶х被</text>
- <text class="detail-value">{{ item.productCategory }}</text>
- </view>
- <view class="detail-row">
- <text class="detail-label">瑙勬牸鍨嬪彿</text>
- <text class="detail-value">{{ item.specificationModel }}</text>
- </view>
- <view class="detail-row">
- <text class="detail-label">缁戝畾鏈哄櫒</text>
- <text class="detail-value">{{ item.speculativeTradingName }}</text>
- </view>
- <view class="detail-row">
- <text class="detail-label">鍗曚綅</text>
- <text class="detail-value">{{ item.unit }}</text>
- </view>
- <view class="detail-row">
- <text class="detail-label">褰曞叆鏃ユ湡</text>
- <text class="detail-value">{{ item.entryDate }}</text>
- </view>
- <view class="detail-row">
- <text class="detail-label">鏁伴噺</text>
- <text class="detail-value">{{ item.quantity }}</text>
- </view>
- <view class="detail-row">
- <text class="detail-label">鎺掍骇鏁伴噺</text>
- <text class="detail-value highlight">{{ item.schedulingNum }}</text>
- </view>
- <view class="detail-row">
- <text class="detail-label">寰呮帓鏁伴噺</text>
- <text class="detail-value" :class="{ 'danger': item.pendingQuantity <= 0 }">{{ item.pendingQuantity }}</text>
- </view>
-
- <!-- 鎿嶄綔鎸夐挳鍖哄煙 -->
- <view class="action-buttons">
- <up-button
- type="primary"
- size="small"
- @click="handleDispatch(item)"
- class="action-btn"
- :disabled="item.pendingQuantity <= 0 || !item.speculativeTradingName"
- >
- {{ item.pendingQuantity <= 0 ? '鏃犻渶娲惧伐' : !item.speculativeTradingName ? '鏈粦瀹氭満鍣�' : '鐢熶骇娲惧伐' }}
- </up-button>
- </view>
- </view>
+ <!-- 鎿嶄綔鎸夐挳鍖哄煙 -->
+ <view class="action-buttons">
+ <up-button
+ type="primary"
+ size="small"
+ @click="handleDispatch(item)"
+ class="action-btn"
+ :disabled="item.pendingQuantity <= 0"
+ >
+ 鐢熶骇娲惧伐
+ </up-button>
</view>
</view>
</view>
</view>
-
<view v-else class="no-data">
- <up-empty mode="data" icon="http://cdn.uviewui.com/uview/empty/data.png">
- <text class="no-data-text">鏆傛棤鐢熶骇娲惧伐鏁版嵁</text>
- </up-empty>
+ <text>鏆傛棤鐢熶骇娲惧伐鏁版嵁</text>
</view>
<!-- 娲惧伐寮圭獥 -->
<DispatchModal ref="dispatchModalRef" @confirm="handleDispatchConfirm" />
-
- <!-- 鑷姩娲惧崟寮圭獥 -->
- <AutoDispatchDia ref="autoDispatchDia" />
</view>
</template>
<script setup>
-import { ref, reactive, toRefs, getCurrentInstance, nextTick } from "vue";
+import { ref, reactive, toRefs, getCurrentInstance } from "vue";
import { onShow } from '@dcloudio/uni-app';
import dayjs from "dayjs";
-import {schedulingListPage, schedulingList, addSpeculatTrading, updateSpeculatTrading, getLossRate, addLossRate, updateLossRate} from "@/api/productionManagement/productionOrder.js";
+import {schedulingListPage} from "@/api/productionManagement/productionOrder.js";
import PageHeader from "@/components/PageHeader.vue";
import DispatchModal from "./components/DispatchModal.vue";
-import AutoDispatchDia from "./components/autoDispatchDia.vue";
-
const { proxy } = getCurrentInstance();
// 鍔犺浇鐘舵��
@@ -236,77 +113,23 @@
// 鍒楄〃鏁版嵁
const tableData = ref([]);
-// 閫夋嫨鐩稿叧鏁版嵁
-const selectedItems = ref([]);
-const isAllSelected = ref(false);
-const showBatchActions = ref(false);
// 鎼滅储琛ㄥ崟鏁版嵁
const data = reactive({
searchForm: {
customerName: "",
- projectName: "",
},
});
const { searchForm } = toRefs(data);
// 鍒嗛〉閰嶇疆
const page = reactive({
- current: 1,
- size: 100,
- total: 0,
+ current: -1,
+ size: -1,
});
-
-// 鐐掓満鐘舵�佹暟鎹�
-const machineTotal = reactive({
- m1: 0,
- m2: 0,
- m3: 0,
- m4: 0,
-})
-
-const machineInProduction = reactive({
- m1: 0,
- m2: 0,
- m3: 0,
- m4: 0,
-})
-
-const machineVacant = reactive({
- m1: 0,
- m2: 0,
- m3: 0,
- m4: 0,
-})
-
-// 鐐掓満閰嶇疆鏁扮粍
-const machines = [
- { id: 1, key: 'm1' },
- { id: 2, key: 'm2' },
- { id: 3, key: 'm3' },
- { id: 4, key: 'm4' }
-]
-
-// 鏄惁鏈夋煡璇㈡暟鎹紙鐢ㄤ簬鍒ゆ柇鏄柊澧炶繕鏄慨鏀癸級
-const hasQueryData = ref(false);
-
-// 鎹熻�楃巼鐩稿叧鏁版嵁
-const lossRate = ref(""); // 褰撳墠閫夋嫨鐨勬崯鑰楃巼
-const showLossRateSheet = ref(false); // 鎺у埗鎹熻�楃巼閫夋嫨闈㈡澘鏄剧ず
-const lossRateOptions = ref([
- { name: "6%", value: "6" },
- { name: "7%", value: "7" },
- { name: "8%", value: "8" },
- { name: "9%", value: "9" },
- { name: "10%", value: "10" }
-]);
-const lossRateData = ref(null); // 鎹熻�楃巼鏌ヨ杩斿洖鐨勬暟鎹�
// 娲惧伐寮圭獥寮曠敤
const dispatchModalRef = ref();
-
-// 鑷姩娲惧崟寮圭獥寮曠敤
-const autoDispatchDia = ref();
// 閫氱敤鎻愮ず鍑芥暟
const showLoadingToast = (message) => {
@@ -325,73 +148,9 @@
uni.navigateBack();
};
-// 閲嶇疆鎼滅储
-const handleReset = () => {
- searchForm.value.customerName = "";
- searchForm.value.projectName = "";
- handleQuery();
-};
-
// 鏌ヨ鍒楄〃
const handleQuery = () => {
- page.current = 1;
getList();
-};
-
-// 鑾峰彇鐐掓満鐢熶骇鏁版嵁
-const getMachineProductionData = () => {
- schedulingList().then((res) => {
- if (res.data && Array.isArray(res.data)) {
- // 閲嶇疆鏁版嵁
- machineInProduction.m1 = 0;
- machineInProduction.m2 = 0;
- machineInProduction.m3 = 0;
- machineInProduction.m4 = 0;
-
- // 澶勭悊鐐掓満鏁版嵁
- res.data.forEach(item => {
- const machineId = Number(item.id);
- if (machineId >= 1 && machineId <= 4) {
- const machineKey = `m${machineId}`;
-
- if (item.workLoad !== null && item.workLoad !== undefined) {
- machineTotal[machineKey] = Number(item.workLoad) || 0;
- }
-
- if (item.currentWorkLoad !== null && item.currentWorkLoad !== undefined) {
- machineInProduction[machineKey] = Number(item.currentWorkLoad) || 0;
- }
-
- // 璁$畻绌轰綑閲�
- machineVacant[machineKey] = machineTotal[machineKey] - machineInProduction[machineKey];
- }
- });
- }
- }).catch(err => {
- console.error('鑾峰彇鐐掓満鏁版嵁澶辫触:', err);
- });
-};
-
-// 鎹熻�楃巼閫夋嫨浜嬩欢
-const onLossRateSelect = (action) => {
- lossRate.value = action.value;
- showLossRateSheet.value = false;
- console.log('閫夋嫨浜嗘崯鑰楃巼:', action.name, '鍊�:', action.value);
-};
-
-// 鑾峰彇鎹熻�楃巼鏁版嵁
-const getLossRateData = () => {
- getLossRate().then((res) => {
- if (res.data) {
- lossRateData.value = res.data;
- // 璁剧疆褰撳墠閫夋嫨鐨勬崯鑰楃巼
- if (res.data.rate !== null && res.data.rate !== undefined) {
- lossRate.value = res.data.rate.toString();
- }
- }
- }).catch(err => {
- console.error('鑾峰彇鎹熻�楃巼澶辫触:', err);
- });
};
// 鑾峰彇鍒楄〃鏁版嵁
@@ -399,25 +158,18 @@
loading.value = true;
showLoadingToast('鍔犺浇涓�...');
+ // 鏋勯�犺姹傚弬鏁�
const params = { ...searchForm.value, ...page };
schedulingListPage(params).then((res) => {
loading.value = false;
closeToast();
+ // 澶勭悊姣忔潯鏁版嵁锛屽鍔爌endingQuantity瀛楁
tableData.value = (res.data.records || []).map(item => ({
- ...item,
- pendingQuantity: (Number(item.quantity) || 0) - (Number(item.schedulingNum) || 0)
- })).filter(item => item.pendingQuantity > 0);
-
- page.total = res.data.total || 0;
-
- // 鑾峰彇鐐掓満鏁版嵁
- getMachineProductionData();
-
- // 鑾峰彇鎹熻�楃巼鏁版嵁
- getLossRateData();
-
+ ...item,
+ pendingQuantity: (Number(item.quantity) || 0) - (Number(item.schedulingNum) || 0)
+ }));
}).catch(() => {
loading.value = false;
closeToast();
@@ -438,14 +190,6 @@
return;
}
- if (!item.speculativeTradingName) {
- uni.showToast({
- title: '璇ラ」鐩湭缁戝畾鏈哄櫒锛屾棤娉曟淳宸�',
- icon: 'none'
- });
- return;
- }
-
dispatchModalRef.value?.open(item);
};
@@ -454,595 +198,38 @@
getList(); // 鍒锋柊鍒楄〃
};
-// 鏇存柊鐐掓満绌轰綑閲�
-const updateMachineVacant = (machineKey) => {
- machineVacant[machineKey] = (Number(machineTotal[machineKey]) || 0) - (Number(machineInProduction[machineKey]) || 0);
-};
-
-// 鑾峰彇鐐掓満鏌ヨ鏁版嵁
-const getMachineQueryData = (machineId) => {
- // 杩欓噷闇�瑕佹牴鎹疄闄呮儏鍐典粠鏌ヨ鏁版嵁涓幏鍙栧搴旂殑鐐掓満鏁版嵁
- // 鏆傛椂杩斿洖涓�涓ā鎷熸暟鎹�
- return {
- id: machineId,
- name: `鐐掓満${machineId}`,
- workLoad: machineTotal[`m${machineId}`] || 0,
- currentWorkLoad: machineInProduction[`m${machineId}`] || 0
- };
-};
-
-// 淇濆瓨鎹熻�楃巼璁剧疆
-const saveLossRate = () => {
- if (!lossRate.value) {
- console.log('鏈�夋嫨鎹熻�楃巼锛岃烦杩囦繚瀛�');
- return Promise.resolve();
- }
-
- const lossRateDataToSave = {
- rate: parseFloat(lossRate.value) || 0
- };
-
- // 濡傛灉鏈夋煡璇㈠埌鐨勬崯鑰楃巼鏁版嵁锛岃鏄庢槸淇敼鎿嶄綔锛岄渶瑕佷紶閫抜d
- if (lossRateData.value && lossRateData.value.id) {
- lossRateDataToSave.id = lossRateData.value.id;
- }
-
- console.log('淇濆瓨鎹熻�楃巼鏁版嵁:', lossRateDataToSave);
-
- // 鏍规嵁鏄惁鏈夋崯鑰楃巼鏁版嵁鍐冲畾璋冪敤鏂板鎺ュ彛杩樻槸淇敼鎺ュ彛
- const saveLossApi = lossRateData.value && lossRateData.value.id ? updateLossRate : addLossRate;
- const successMessage = lossRateData.value && lossRateData.value.id ? '鎹熻�楃巼淇敼鎴愬姛' : '鎹熻�楃巼鏂板鎴愬姛';
-
- return saveLossApi(lossRateDataToSave).then(res => {
- console.log('鎹熻�楃巼淇濆瓨鎴愬姛:', res);
- uni.showToast({
- title: successMessage,
- icon: 'success'
- });
-
- // 鏇存柊鎹熻�楃巼鏁版嵁
- if (res.data) {
- lossRateData.value = res.data;
- }
-
- return res;
- }).catch(err => {
- console.error('鎹熻�楃巼淇濆瓨澶辫触:', err);
- uni.showToast({
- title: '鎹熻�楃巼淇濆瓨澶辫触',
- icon: 'none'
- });
- throw err;
- });
-};
-
-// 淇濆瓨鐐掓満鎬婚噺璁剧疆
-const saveMachineTotals = () => {
- // 鏋勯�犱繚瀛樻暟鎹暟缁勶紝浣跨敤machines鏁扮粍寰幆鏋勫缓
- const saveData = machines.map(machine => {
- const machineData = {
- name: `鐐掓満${machine.id}`, // 鐐掓満鍚嶇О
- workLoad: machineTotal[machine.key] || 0, // 鎬婚噺
- vacant: machineVacant[machine.key] || 0 // 绌轰綑閲�
- };
-
- // 濡傛灉鏄慨鏀规搷浣滐紝闇�瑕佷紶閫抜d瀛楁
- if (hasQueryData.value) {
- // 杩欓噷闇�瑕佷粠鏌ヨ鏁版嵁涓幏鍙栧搴旂殑id
- // 鍋囪鏌ヨ鏁版嵁涓瘡涓倰鏈烘暟鎹兘鏈塱d瀛楁
- const queryData = getMachineQueryData(machine.id);
- if (queryData && queryData.id) {
- machineData.id = queryData.id;
- }
- }
-
- return machineData;
- });
-
- console.log('淇濆瓨鐐掓満璁剧疆鏁版嵁:', saveData);
-
- // 鏍规嵁鏄惁鏈夋煡璇㈡暟鎹喅瀹氳皟鐢ㄦ柊澧炴帴鍙h繕鏄慨鏀规帴鍙�
- const saveApi = hasQueryData.value ? updateSpeculatTrading : addSpeculatTrading;
- const successMessage = hasQueryData.value ? '鐐掓満璁剧疆淇敼鎴愬姛' : '鐐掓満璁剧疆鏂板鎴愬姛';
-
- console.log(`璋冪敤鎺ュ彛: ${hasQueryData.value ? '淇敼' : '鏂板'}`);
-
- // 鍏堜繚瀛樻崯鑰楃巼锛屽啀淇濆瓨鐐掓満璁剧疆
- saveLossRate().then(() => {
- // 璋冪敤鍚庣API淇濆瓨鐐掓満璁剧疆
- return saveApi(saveData);
- }).then(res => {
- uni.showToast({
- title: successMessage,
- icon: 'success'
- });
- console.log('淇濆瓨鎴愬姛:', res);
-
- // 淇濆瓨鎴愬姛鍚庯紝璁剧疆hasQueryData涓簍rue锛屼笅娆′繚瀛樺皢璋冪敤淇敼鎺ュ彛
- if (!hasQueryData.value) {
- hasQueryData.value = true;
- }
- }).catch(err => {
- uni.showToast({
- title: '淇濆瓨澶辫触',
- icon: 'none'
- });
- console.error('淇濆瓨澶辫触:', err);
- });
-};
-
-// 鍒囨崲鍗曚釜椤圭洰閫夋嫨鐘舵��
-const toggleItemSelection = (item, checked) => {
- // 浠呭厑璁搁�夋嫨宸茬粦瀹氭満鍣ㄤ笖寰呮淳鏁伴噺>0鐨勯」鐩�
- if (!item.speculativeTradingName || item.pendingQuantity <= 0) return;
-
- console.log('鍒囨崲閫夋嫨鐘舵��:', item.id, checked);
-
- // 浣跨敤鏇翠弗鏍肩殑姣旇緝閫昏緫锛岀‘淇滻D鍞竴鎬�
- const index = selectedItems.value.findIndex(selected => {
- // 娣卞害姣旇緝瀵硅薄锛岀‘淇濇槸鍚屼竴涓」鐩�
- return JSON.stringify(selected) === JSON.stringify(item);
- });
-
- if (checked) {
- // 濡傛灉閫変腑涓斾笉鍦ㄩ�変腑鍒楄〃涓紝鍒欐坊鍔�
- if (index === -1) {
- selectedItems.value.push({...item}); // 鍒涘缓鏂板璞★紝閬垮厤寮曠敤闂
- console.log('娣诲姞椤圭洰鍚庨�変腑鏁伴噺:', selectedItems.value.length);
- }
- } else {
- // 濡傛灉鍙栨秷閫変腑涓斿湪閫変腑鍒楄〃涓紝鍒欑Щ闄�
- if (index > -1) {
- selectedItems.value.splice(index, 1);
- console.log('绉婚櫎椤圭洰鍚庨�変腑鏁伴噺:', selectedItems.value.length);
- }
- }
-
- console.log('褰撳墠閫変腑椤圭洰鍒楄〃:', selectedItems.value.map(s => s.id));
- updateAllSelectedStatus();
- updateBatchActionsVisibility();
-};
-
-// 鍒囨崲鍏ㄩ�夌姸鎬�
-const toggleAllSelection = () => {
- if (isAllSelected.value) {
- selectedItems.value = [];
- } else {
- selectedItems.value = tableData.value.filter(item => item.pendingQuantity > 0 && item.speculativeTradingName).map(item => ({ ...item }));
- }
- isAllSelected.value = !isAllSelected.value;
- updateBatchActionsVisibility();
-};
-
-// 鏇存柊鍏ㄩ�夌姸鎬�
-const updateAllSelectedStatus = () => {
- const selectableItems = tableData.value.filter(item => item.pendingQuantity > 0 && item.speculativeTradingName);
- if (selectableItems.length > 0 && selectedItems.value.length === selectableItems.length &&
- selectableItems.every(item => selectedItems.value.some(selected => selected.id === item.id))) {
- isAllSelected.value = true;
- } else {
- isAllSelected.value = false;
- }
-};
-
-// 鏇存柊鎵归噺鎿嶄綔鏄剧ず鐘舵��
-const updateBatchActionsVisibility = () => {
- showBatchActions.value = selectedItems.value.length > 0;
-};
-
-// 娓呯┖閫夋嫨
-const clearSelection = () => {
- selectedItems.value = [];
- isAllSelected.value = false;
- showBatchActions.value = false;
-};
-
-// 鑾峰彇閫変腑鐨勯」鐩�
-const getSelectedItems = () => {
- return selectedItems.value;
-};
-
-// 澶勭悊鑷姩娲惧崟
-const handleAutoDispatch = () => {
- if (selectedItems.value.length === 0) {
- uni.showToast({
- title: '璇烽�夋嫨瑕佹淳宸ョ殑椤圭洰',
- icon: 'none'
- });
- return;
- }
-
- // 妫�鏌ユ槸鍚︽墍鏈夐�変腑椤圭洰閮芥湁缁戝畾鏈哄櫒
- const unboundItems = selectedItems.value.filter(item => !item.speculativeTradingName);
- if (unboundItems.length > 0) {
- uni.showToast({
- title: '鎵�閫夐」鐩腑鏈夋湭缁戝畾鏈哄櫒鐨勯」鐩紝鏃犳硶鑷姩娲惧崟',
- icon: 'none'
- });
- return;
- }
-
- // 纭繚浼犻�掔殑鏄畬鏁寸殑閫変腑椤圭洰鏁扮粍
- autoDispatchDia.value?.openDialog([...selectedItems.value]);
-};
-
// 椤甸潰鏄剧ず鏃跺姞杞芥暟鎹�
onShow(() => {
+ // 鍔犺浇鍒楄〃鏁版嵁
getList();
- clearSelection();
});
</script>
<style scoped lang="scss">
+@import '@/styles/sales-common.scss';
+
+// 鐢熶骇娲惧伐椤甸潰鏍峰紡
.production-dispatching {
min-height: 100vh;
background: #f8f9fa;
- padding: 20rpx;
+ position: relative;
}
-// 鎹熻�楃巼璁剧疆鍖哄煙
-.loss-rate-section {
- background: #ffffff;
- border: 1rpx solid #e4e7ed;
- border-radius: 12rpx;
- padding: 32rpx;
- margin-top: 24rpx;
- margin-bottom: 32rpx;
- box-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.08);
-}
-
-.loss-rate-section .section-title {
- font-size: 32rpx;
- font-weight: 600;
- color: #303133;
- margin-bottom: 20rpx;
-}
-
-.loss-rate-section .loss-rate-content {
- display: flex;
- flex-direction: column;
- gap: 24rpx;
-}
-
-.loss-rate-section .loss-rate-content .loss-rate-item {
- display: flex;
- align-items: center;
- gap: 24rpx;
-}
-
-.loss-rate-section .loss-rate-content .loss-rate-label {
- font-size: 30rpx;
- font-weight: 500;
- color: #303133;
- min-width: 140rpx;
- white-space: nowrap;
-}
-
-.loss-rate-section .loss-rate-content .loss-rate-btn {
- min-width: 260rpx;
- font-size: 28rpx;
- height: 64rpx;
- line-height: 64rpx;
- border-radius: 8rpx;
- font-weight: 500;
-}
-
-// 鐐掓満鐘舵�佸尯鍩�
-.machines-section {
- margin-bottom: 30rpx;
-}
-
-.machines-section .section-title {
- font-size: 32rpx;
- font-weight: 600;
- color: #303133;
- margin-bottom: 20rpx;
-}
-
-.machines-grid {
- display: grid;
- grid-template-columns: 1fr 1fr;
- gap: 20rpx;
-}
-
-.machine-card {
- background: #ffffff;
- border-radius: 16rpx;
- padding: 24rpx;
- box-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.05);
- border: 1rpx solid #e9ecef;
-}
-
-.machine-title {
- font-size: 28rpx;
- font-weight: 600;
- color: #2c3e50;
- text-align: center;
- margin-bottom: 20rpx;
- padding-bottom: 16rpx;
- border-bottom: 2rpx solid #3498db;
-}
-
-.machine-metrics {
- display: flex;
- flex-direction: column;
- gap: 16rpx;
-}
-
-.metric-item {
- display: flex;
- justify-content: space-between;
- align-items: center;
- padding: 8rpx 0;
-}
-
-.metric-label {
- font-size: 24rpx;
- color: #6c757d;
-}
-
-.metric-value {
- font-size: 26rpx;
- font-weight: 600;
- color: #2c3e50;
-}
-
-// 杈撳叆妗嗘牱寮�
-.metric-input {
- width: 120rpx;
- text-align: right;
-}
-
-// 淇濆瓨鍖哄煙
-.save-section {
- display: flex;
- justify-content: center;
- margin-top: 30rpx;
- padding-top: 20rpx;
- border-top: 1rpx solid #e9ecef;
-}
-
-.save-btn {
- min-width: 200rpx;
-}
-
-// 鎼滅储鍖哄煙
-.search-section {
- background: #ffffff;
- border-radius: 16rpx;
- padding: 24rpx;
- margin-bottom: 30rpx;
- box-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.05);
-}
-
-.search-form {
- display: flex;
- flex-direction: column;
- gap: 20rpx;
-}
-
-.search-item {
- display: flex;
- align-items: center;
- gap: 20rpx;
-}
-
-.search-label {
- font-size: 26rpx;
- color: #606266;
- min-width: 140rpx;
-}
-
-.search-input {
- flex: 1;
-}
-
-.search-buttons {
- display: flex;
- gap: 20rpx;
- justify-content: flex-end;
- margin-top: 10rpx;
-}
-
-.search-btn, .reset-btn {
- min-width: 120rpx;
-}
-
-// 鍒楄〃鏍峰紡
-.ledger-list {
- display: flex;
- flex-direction: column;
- gap: 24rpx;
-}
-
-.list-item {
- background: #ffffff;
- border-radius: 16rpx;
- overflow: hidden;
- box-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.05);
-}
-
+// 鍒楄〃椤规牱寮�
.ledger-item {
- padding: 0;
-}
-
-.item-header {
- display: flex;
- justify-content: space-between;
- align-items: center;
- padding: 24rpx 24rpx 0 24rpx;
-}
-
-.item-left {
- display: flex;
- align-items: center;
- gap: 16rpx;
-}
-
-.document-icon {
- width: 48rpx;
- height: 48rpx;
- background: #409eff;
- border-radius: 8rpx;
- display: flex;
- align-items: center;
- justify-content: center;
-}
-
-.item-id {
- font-size: 28rpx;
- font-weight: 600;
- color: #303133;
-}
-
-.entry-date {
- font-size: 24rpx;
- color: #909399;
-}
-
-.item-details {
- padding: 24rpx;
-}
-
-.detail-row {
- display: flex;
- justify-content: space-between;
- align-items: center;
- padding: 12rpx 0;
- border-bottom: 1rpx solid #f5f5f5;
-}
-
-.detail-row:last-child {
- border-bottom: none;
-}
-
-.detail-label {
- font-size: 26rpx;
- color: #606266;
-}
-
-.detail-value {
- font-size: 26rpx;
- color: #303133;
- font-weight: 500;
-}
-
-.detail-value.highlight {
- color: #ff6b35;
- font-weight: 600;
-}
-
-.detail-value.danger {
- color: #ee0a24;
- font-weight: 600;
-}
-
-.action-buttons {
- padding: 0 24rpx 24rpx 24rpx;
- display: flex;
- justify-content: flex-end;
-}
-
-.action-btn {
- min-width: 180rpx;
-}
-
-// 鎵归噺鎿嶄綔鍖哄煙鏍峰紡
-.batch-actions-section {
- background: #e8f4ff;
- border: 1rpx solid #409eff;
- border-radius: 12rpx;
- padding: 20rpx 24rpx;
- margin-bottom: 24rpx;
- display: flex;
- justify-content: space-between;
- align-items: center;
-}
-
-.batch-actions-section .batch-text {
- font-size: 28rpx;
- font-weight: 600;
- color: #409eff;
-}
-
-.batch-actions-section .batch-buttons {
- display: flex;
- gap: 16rpx;
-}
-
-.batch-actions-section .batch-btn {
- min-width: 140rpx;
-}
-
-// 鍏ㄩ�夋搷浣滃尯鍩熸牱寮�
-.select-all-section {
- background: #ffffff;
- border-radius: 12rpx;
- padding: 20rpx 24rpx;
- margin-bottom: 16rpx;
- border: 1rpx solid #e4e7ed;
-}
-
-.select-all-section .select-all-content {
- display: flex;
- align-items: center;
-}
-
-.select-all-section .select-all-checkbox {
- font-size: 28rpx;
- font-weight: 500;
-}
-
-// 鍒楄〃椤归�夋嫨妗嗘牱寮�
-.ledger-item {
- display: flex;
- align-items: flex-start;
- padding: 0;
-}
-
-.item-checkbox {
- padding: 24rpx 16rpx 0 24rpx;
- display: flex;
- align-items: center;
-}
-
-.item-content {
- flex: 1;
-}
-
-// 绌虹姸鎬�
-.no-data {
- padding: 100rpx 0;
- text-align: center;
-}
-
-.no-data-text {
- font-size: 28rpx;
- color: #909399;
- margin-top: 20rpx;
-}
-
-// 鐐瑰嚮缂栬緫鍖哄煙鏍峰紡
-.metric-value-container {
- cursor: pointer;
- min-width: 120rpx;
- text-align: right;
- padding: 4rpx 8rpx;
- border-radius: 4rpx;
- transition: all 0.2s ease;
-}
-
-.metric-value-container:hover {
- background-color: #f0f8ff;
- border: 1rpx solid #409eff;
+ .detail-value.highlight {
+ color: #ff6b35;
+ font-weight: 600;
+ }
+
+ .detail-value.danger {
+ color: #ee0a24;
+ font-weight: 600;
+ }
}
// 閫傞厤 uView 缁勪欢鏍峰紡
:deep(.up-input) {
background: transparent;
}
-
-:deep(.up-input__content) {
- background: #f8f9fa;
-}
-</style>
\ No newline at end of file
+</style>
--
Gitblit v1.9.3