| | |
| | | <template> |
| | | <view class="list"> |
| | | <view class="list_box"> |
| | | <z-paging |
| | | ref="pagingRef" |
| | | v-model="cardList" |
| | | :fixed="false" |
| | | :auto-show-back-to-top="true" |
| | | :loading-more-enabled="false" |
| | | @query="getList" |
| | | > |
| | | <template #top> |
| | | <CardTitle title="è¯çº¿é¢ç¨" :hideAction="false" :full="false"> |
| | | <CardTitle title="è¯çº¿é¢ç¨" :hideAction="false"> |
| | | <template #action> |
| | | <wd-button type="icon" icon="scan" color="#0D867F" @click="openScan"></wd-button> |
| | | <wd-button type="icon" icon="add-circle" color="#0D867F" @click="addReport"></wd-button> |
| | | <wd-button type="icon" icon="add-circle" color="#0D867F" @click="openAddForm"></wd-button> |
| | | </template> |
| | | </CardTitle> |
| | | </template> |
| | | <wd-card v-for="(item, index) in cardList" :key="index" type="rectangle" custom-class="round"> |
| | | <template #title> |
| | | <view class="flex justify-between"> |
| | | <view> |
| | | <wd-icon name="a-rootlist" color="#0D867F"></wd-icon> |
| | | <text class="text-[#252525] ml-2 font-medium">{{ item.model }}</text> |
| | | </view> |
| | | <view class="text-[#A8A8A8]" @click="toEdit(item.id)">ç¼è¾</view> |
| | | |
| | | <!-- å±çº§ tabs --> |
| | | <wd-tabs v-model="tab" slidable="always" class="tabs-container"> |
| | | <block v-for="item in nodeList" :key="item.twistedLayer"> |
| | | <wd-tab :title="item.twistedLayer" :name="item.twistedLayer"> |
| | | <scroll-view class="content" scroll-y> |
| | | <SteelCoreCard |
| | | v-for="(m, i) in item.strandedWireDish" |
| | | :key="i" |
| | | :data="m" |
| | | @delete="handleDeleteCard(item, m)" |
| | | /> |
| | | </scroll-view> |
| | | </wd-tab> |
| | | </block> |
| | | </wd-tabs> |
| | | |
| | | <template #bottom> |
| | | <view class="flex justify-center items-center"> |
| | | <wd-button block @click="save"> |
| | | <text class="text-[#fff]">ä¿å</text> |
| | | </wd-button> |
| | | </view> |
| | | </template> |
| | | <ProductionCard :data="cardAttr" :value="item" color="#0D867F" /> |
| | | </wd-card> |
| | | </z-paging> |
| | | <wd-popup v-model="addDialog.visible" position="bottom" custom-class="yl-popup"> |
| | | |
| | | <!-- æ°å¢é¢è¯å¼¹çª --> |
| | | <wd-popup v-model="showAddForm" position="bottom" custom-class="yl-popup"> |
| | | <view class="action px-3"> |
| | | <wd-button type="text" @click="cancelAdd">åæ¶</wd-button> |
| | | <wd-button type="text" @click="submitAdd">ç¡®å®</wd-button> |
| | | </view> |
| | | <SteelCore ref="addFormRef" mode="add" :wireId="paramsId" @refresh="reloadList" /> |
| | | <SteelCoreForm ref="addFormRef" mode="add" :wireId="paramsId" /> |
| | | </wd-popup> |
| | | <wd-popup v-model="editDialog.visible" position="bottom" custom-class="yl-popup"> |
| | | <view class="action px-3"> |
| | | <wd-button type="text" @click="cancelEdit">åæ¶</wd-button> |
| | | <wd-button type="text" @click="submitEdit">ç¡®å®</wd-button> |
| | | </view> |
| | | <SteelCore |
| | | ref="editFormRef" |
| | | mode="edit" |
| | | :wireId="paramsId" |
| | | :editData="editDialog.currentItem" |
| | | @refresh="reloadList" |
| | | /> |
| | | </wd-popup> |
| | | |
| | | <Scan ref="scanRef" emitName="scanSteelCore" /> |
| | | <wd-toast /> |
| | | </view> |
| | |
| | | |
| | | <script setup lang="ts"> |
| | | import CardTitle from "@/components/card-title/index.vue"; |
| | | import ProductionCard from "../../../components/ProductionCard.vue"; |
| | | import SteelCoreCard from "../../components/SteelCoreCard.vue"; |
| | | import SteelCoreForm from "./form.vue"; |
| | | import { useToast } from "wot-design-uni"; |
| | | import SteelCore from "./form.vue"; |
| | | import { onLoad, onUnload, onShow, onHide } from "@dcloudio/uni-app"; |
| | | import ManageApi from "@/api/product/manage"; |
| | | import TwistApi from "@/api/product/twist"; |
| | | import zPaging from "@/components/z-paging/z-paging.vue"; |
| | | import Scan from "@/components/scan/index.vue"; |
| | |
| | | const paramsId = ref(); |
| | | const pagingRef = ref(); |
| | | const addFormRef = ref(); |
| | | const editFormRef = ref(); |
| | | const scanRef = ref(); |
| | | const toast = useToast(); |
| | | const isPageVisible = ref(false); // æ è®°é¡µé¢æ¯å¦å¯è§ |
| | | const addDialog = reactive({ |
| | | visible: false, |
| | | }); |
| | | const editDialog = reactive({ |
| | | visible: false, |
| | | currentItem: null as any, |
| | | editId: undefined as number | undefined, |
| | | }); |
| | | const cardList = ref<any[]>([]); |
| | | const tab = ref(""); |
| | | const nodeList = ref<any[]>([]); |
| | | const showAddForm = ref(false); |
| | | const isPageVisible = ref(false); |
| | | |
| | | const cardAttr = ref<any[]>([ |
| | | { |
| | | label: "æ ·åç¼å·", |
| | | prop: "monofilamentNumber", |
| | | }, |
| | | { |
| | | label: "æ°é", |
| | | prop: "amount", |
| | | unitProp: "unit", |
| | | }, |
| | | { |
| | | label: "éé", |
| | | prop: "weight", |
| | | unitProp: "weightUnit", |
| | | }, |
| | | { |
| | | label: "åå®¶", |
| | | prop: "supplier", |
| | | span: 16, |
| | | }, |
| | | ]); |
| | | // ç嬿 ç¾åæ¢ |
| | | watch(tab, () => { |
| | | if (tab.value) { |
| | | getList(); |
| | | } |
| | | }); |
| | | |
| | | const toEdit = (id: number) => { |
| | | const itemToEdit = cardList.value.find((item) => item.id === id); |
| | | if (itemToEdit) { |
| | | editDialog.currentItem = itemToEdit; |
| | | editDialog.editId = id; |
| | | editDialog.visible = true; |
| | | // è·åé¢è¯å±çº§æ°æ®ï¼åç
§PC端 getSteelCoreDishTypeByWireï¼ |
| | | const fetchSteelCoreData = async (wireId: number) => { |
| | | const { code, data, msg } = await TwistApi.getSteelCoreDishTypeByWire(wireId); |
| | | if (code === 200 && data) { |
| | | nodeList.value = data.nodeList || []; |
| | | |
| | | // 追å "å
¶ä»"å± |
| | | if (data.otherStrandedWireDish && data.otherStrandedWireDish.length > 0) { |
| | | nodeList.value.push({ |
| | | strandedWireDish: data.otherStrandedWireDish, |
| | | twistedLayer: "å
¶ä»", |
| | | twistId: null, |
| | | }); |
| | | } |
| | | |
| | | // 设置é»è®¤ç¬¬ä¸å± |
| | | if (nodeList.value.length > 0 && !tab.value) { |
| | | tab.value = nodeList.value[0].twistedLayer; |
| | | getList(); |
| | | } |
| | | } else { |
| | | toast.error(msg || "è·åé¢è¯å±çº§æ°æ®å¤±è´¥"); |
| | | } |
| | | }; |
| | | |
| | | const addReport = () => { |
| | | // ä»å½åéä¸å±è·ååè¡¨æ°æ® |
| | | const getList = async () => { |
| | | const currentLayer = nodeList.value.find((node) => node.twistedLayer === tab.value); |
| | | if (currentLayer && currentLayer.strandedWireDish) { |
| | | pagingRef.value.complete(currentLayer.strandedWireDish); |
| | | } else { |
| | | pagingRef.value.complete([]); |
| | | } |
| | | }; |
| | | |
| | | // æå¼æ°å¢è¡¨å |
| | | const openAddForm = () => { |
| | | if (!tab.value) { |
| | | toast.error("请å
éæ©ä¸ä¸ªå±"); |
| | | return; |
| | | } |
| | | if (addFormRef.value) { |
| | | addFormRef.value.resetFormData(); |
| | | } |
| | | addDialog.visible = true; |
| | | showAddForm.value = true; |
| | | }; |
| | | |
| | | // æäº¤æ°å¢ |
| | | const submitAdd = async () => { |
| | | const success = await addFormRef.value.submit(); |
| | | if (success) { |
| | | addDialog.visible = false; |
| | | const formData = await addFormRef.value.submit(); |
| | | if (!formData) return; |
| | | |
| | | // æ¥æ¾å½åå± |
| | | const currentLayer = nodeList.value.find((node) => node.twistedLayer === tab.value); |
| | | if (!currentLayer) { |
| | | toast.error("æªæ¾å°å½åéä¸çå±"); |
| | | return; |
| | | } |
| | | |
| | | // åå±é夿£æ¥ |
| | | if (formData.monofilamentNumber) { |
| | | const exists = currentLayer.strandedWireDish?.some( |
| | | (item: any) => item.monofilamentNumber === formData.monofilamentNumber |
| | | ); |
| | | if (exists) { |
| | | toast.error("该é¢è¯å·²é¢ç¨ï¼è¯·å¿é夿·»å "); |
| | | return; |
| | | } |
| | | } |
| | | |
| | | // æ·»å å°å½åå± |
| | | if (!currentLayer.strandedWireDish) { |
| | | currentLayer.strandedWireDish = []; |
| | | } |
| | | currentLayer.strandedWireDish.push({ |
| | | ...formData, |
| | | wireId: paramsId.value, |
| | | }); |
| | | |
| | | getList(); |
| | | showAddForm.value = false; |
| | | toast.success("æ·»å æå"); |
| | | }; |
| | | |
| | | const cancelAdd = () => { |
| | | toast.show("åæ¶"); |
| | | addDialog.visible = false; |
| | | showAddForm.value = false; |
| | | }; |
| | | |
| | | const submitEdit = async () => { |
| | | const success = await editFormRef.value.submitEdit(cardList.value, editDialog.editId); |
| | | if (success) { |
| | | editDialog.visible = false; |
| | | reloadList(); |
| | | } |
| | | }; |
| | | |
| | | const cancelEdit = () => { |
| | | toast.show("åæ¶"); |
| | | editDialog.visible = false; |
| | | }; |
| | | |
| | | const getList = async () => { |
| | | const { code, data } = await ManageApi.getStrandedWireDish({ |
| | | wireId: paramsId.value, |
| | | type: "é¢è¯", |
| | | }); |
| | | if (code == 200) { |
| | | pagingRef.value.complete(data); |
| | | } |
| | | }; |
| | | |
| | | const reloadList = () => { |
| | | pagingRef.value.refresh(); |
| | | }; |
| | | |
| | | // æ«ç ç¸å
³æ¹æ³ |
| | | const openScan = () => { |
| | | scanRef.value.triggerScan(); |
| | | }; |
| | | |
| | | // è·åæ«ç æ°æ® |
| | | const getScanCode = async (code: any) => { |
| | | // æ£æ¥é¡µé¢æ¯å¦å¯è§ï¼å¦æä¸å¯è§åä¸å¤çæ«ç æ°æ® |
| | | if (!isPageVisible.value) { |
| | | return; |
| | | } |
| | | |
| | | try { |
| | | const parseData = JSON.parse(code.code); |
| | | |
| | | // æ£æ¥å¿
éåæ®µï¼modelãsupplierãdiskMaterial |
| | | const requiredFields = ["model", "supplier", "diskMaterial"]; |
| | | const missingFields = requiredFields.filter((field) => !parseData[field]); |
| | | |
| | | if (missingFields.length > 0) { |
| | | toast.error(`äºç»´ç é误ï¼è¯·æ´æ¢äºç»´ç ï¼`); |
| | | if (!tab.value) { |
| | | toast.error("请å
éæ©ä¸ä¸ªå±"); |
| | | return; |
| | | } |
| | | |
| | | // æå¼æ°å¢å¼¹æ¡å¹¶å¡«å
æ«ç è·åçä¿¡æ¯ |
| | | addDialog.visible = true; |
| | | |
| | | // çå¾
å¼¹æ¡æå¼åå¡«å
è¡¨åæ°æ® |
| | | // 使ç¨åéçå¾
ï¼nextTick + setTimeout ç¡®ä¿ç»ä»¶å·²å®å
¨æè½½ |
| | | nextTick(() => { |
| | | setTimeout(() => { |
| | | if (addFormRef.value) { |
| | | addFormRef.value.fillFormData(parseData); |
| | | toast.success("æ«ç æåï¼è¯·ç¡®è®¤ä¿¡æ¯"); |
| | | } else { |
| | | toast.error("表åå 载失败ï¼è¯·éè¯"); |
| | | const currentLayer = nodeList.value.find((node) => node.twistedLayer === tab.value); |
| | | if (!currentLayer) { |
| | | toast.error("æªæ¾å°å½åéä¸çå±"); |
| | | return; |
| | | } |
| | | }, 200); // å»¶è¿200msç¡®ä¿å¼¹æ¡åç»ä»¶å·²å®å
¨æ¸²æ |
| | | }); |
| | | |
| | | const parseData = JSON.parse(code.code); |
| | | |
| | | // æ£æ¥å¿
éåæ®µ |
| | | const requiredFields = ["model", "supplier", "diskMaterial"]; |
| | | const missingFields = requiredFields.filter((field) => !parseData[field]); |
| | | if (missingFields.length > 0) { |
| | | toast.error("äºç»´ç é误ï¼è¯·æ´æ¢äºç»´ç ï¼"); |
| | | return; |
| | | } |
| | | |
| | | // åå±é夿£æ¥ |
| | | if (parseData.monofilamentNumber) { |
| | | const exists = currentLayer.strandedWireDish?.some( |
| | | (item: any) => item.monofilamentNumber === parseData.monofilamentNumber |
| | | ); |
| | | if (exists) { |
| | | toast.error("该é¢è¯å·²é¢ç¨ï¼è¯·å¿é夿«ç "); |
| | | return; |
| | | } |
| | | } |
| | | |
| | | // æå»ºæ°é¢è¯æ°æ® |
| | | const newItem = { |
| | | wireId: paramsId.value, |
| | | diskMaterial: parseData.diskMaterial || "", |
| | | model: parseData.model || "", |
| | | monofilamentNumber: parseData.monofilamentNumber || "", |
| | | amount: parseData.oneLength || parseData.amount || "", |
| | | weight: parseData.weight || "", |
| | | supplier: parseData.supplier || "", |
| | | type: "é¢è¯", |
| | | }; |
| | | |
| | | if (!currentLayer.strandedWireDish) { |
| | | currentLayer.strandedWireDish = []; |
| | | } |
| | | currentLayer.strandedWireDish.push(newItem); |
| | | getList(); |
| | | toast.success("æ«ç æå"); |
| | | } catch (error) { |
| | | toast.error("äºç»´ç å¼å¸¸ï¼è¯·æ´æ¢äºç»´ç ï¼"); |
| | | } |
| | | }; |
| | | |
| | | onLoad((options: any) => { |
| | | // å¼å¯å¹¿æçå¬äºä»¶ |
| | | // æå¼æ«æ |
| | | const openScan = () => { |
| | | scanRef.value.triggerScan(); |
| | | }; |
| | | |
| | | // ä¿åï¼æ¹éæäº¤ï¼ |
| | | const save = () => { |
| | | // æ£æ¥æ¯å¦ææ°æ°æ®éè¦ä¿å |
| | | let hasNewData = false; |
| | | let newCount = 0; |
| | | |
| | | nodeList.value.forEach((node) => { |
| | | if (node.strandedWireDish && Array.isArray(node.strandedWireDish)) { |
| | | const hasNewInLayer = node.strandedWireDish.some( |
| | | (item: { id?: number }) => item.id === undefined || item.id === null |
| | | ); |
| | | if (hasNewInLayer) { |
| | | hasNewData = true; |
| | | newCount += node.strandedWireDish.filter( |
| | | (item: { id?: number }) => item.id === undefined || item.id === null |
| | | ).length; |
| | | } |
| | | } |
| | | }); |
| | | |
| | | if (!hasNewData) { |
| | | toast.error("æ²¡ææ°çé¢è¯æ°æ®éè¦ä¿å"); |
| | | return; |
| | | } |
| | | |
| | | // 确认ä¿å |
| | | uni.showModal({ |
| | | title: "æç¤º", |
| | | content: `确认ä¿å ${newCount} æ¡é¢è¯é¢ç¨æ°æ®åï¼`, |
| | | success: async (res) => { |
| | | if (res.confirm) { |
| | | await handleConfirmSave(); |
| | | } |
| | | }, |
| | | }); |
| | | }; |
| | | |
| | | // æ§è¡æ¹éä¿å |
| | | const handleConfirmSave = async () => { |
| | | const newData: any[] = []; |
| | | |
| | | nodeList.value.forEach((node) => { |
| | | // éå ä¸ä¸çº§ twistId |
| | | if (node.strandedWireDish && Array.isArray(node.strandedWireDish)) { |
| | | node.strandedWireDish.forEach((item: any) => { |
| | | item.saleTwistId = node.twistId; |
| | | }); |
| | | const layerNewData = node.strandedWireDish.filter( |
| | | (item: { id?: number }) => item.id === undefined || item.id === null |
| | | ); |
| | | newData.push(...layerNewData); |
| | | } |
| | | }); |
| | | |
| | | if (newData.length === 0) { |
| | | toast.error("æ²¡ææ°çé¢è¯æ°æ®éè¦ä¿å"); |
| | | return; |
| | | } |
| | | |
| | | const { code, msg } = await TwistApi.addStrandedWireDish(newData); |
| | | if (code == 200) { |
| | | toast.success(msg || "ä¿åæå"); |
| | | // å·æ°æ°æ®è·åææ°ç id |
| | | fetchSteelCoreData(paramsId.value); |
| | | } else { |
| | | toast.error(msg || "ä¿å失败"); |
| | | } |
| | | }; |
| | | |
| | | // å é¤å¡ç |
| | | const handleDeleteCard = async (layer: any, cardData: any) => { |
| | | uni.showModal({ |
| | | title: "æç¤º", |
| | | content: "ç¡®å®è¦å é¤è¯¥é¢è¯åï¼", |
| | | success: async (res) => { |
| | | if (res.confirm) { |
| | | try { |
| | | // å·²ä¿åçæ°æ®è°ç¨æ¥å£å é¤ |
| | | if (cardData.id !== undefined && cardData.id !== null) { |
| | | const { code, msg } = await TwistApi.deleteStrandedWireDish(cardData.id); |
| | | if (code !== 200) { |
| | | toast.error(msg || "å é¤å¤±è´¥"); |
| | | return; |
| | | } |
| | | } |
| | | |
| | | // åç«¯ç§»é¤ |
| | | if (layer.strandedWireDish && Array.isArray(layer.strandedWireDish)) { |
| | | const index = layer.strandedWireDish.findIndex( |
| | | (item: any) => item.monofilamentNumber === cardData.monofilamentNumber |
| | | ); |
| | | if (index !== -1) { |
| | | layer.strandedWireDish.splice(index, 1); |
| | | toast.success("å 餿å"); |
| | | getList(); |
| | | } |
| | | } |
| | | } catch (error: any) { |
| | | toast.error(error.msg || "å é¤å¤±è´¥"); |
| | | } |
| | | } |
| | | }, |
| | | }); |
| | | }; |
| | | |
| | | onLoad(async (options: any) => { |
| | | uni.$on("scanSteelCore", getScanCode); |
| | | paramsId.value = options.id; |
| | | fetchSteelCoreData(options.id); |
| | | }); |
| | | |
| | | onShow(() => { |
| | | // 页颿¾ç¤ºæ¶æ 记为å¯è§ |
| | | isPageVisible.value = true; |
| | | }); |
| | | |
| | | onHide(() => { |
| | | // 页é¢éèæ¶æ 记为ä¸å¯è§ |
| | | isPageVisible.value = false; |
| | | }); |
| | | |
| | | onUnload(() => { |
| | | // åæ¶å¹¿æçå¬äºä»¶ |
| | | uni.$off("scanSteelCore", getScanCode); |
| | | isPageVisible.value = false; |
| | | }); |
| | | </script> |
| | | |
| | | <style lang="scss" scoped> |
| | | .list { |
| | | height: calc(100vh - 120px); |
| | | padding: 12px; |
| | | .list_box { |
| | | height: calc(100vh - 50px); |
| | | background: #f3f9f8; |
| | | |
| | | :deep() { |
| | | .round { |
| | | border-radius: 4px; |
| | | } |
| | | } |
| | | display: flex; |
| | | flex-direction: column; |
| | | } |
| | | |
| | | .action { |
| | |
| | | :deep(.wd-button__content) { |
| | | color: #0d867f; |
| | | } |
| | | |
| | | .tabs-container { |
| | | height: calc(100vh - 200px); |
| | | display: flex; |
| | | flex-direction: column; |
| | | } |
| | | |
| | | .content { |
| | | height: calc(100vh - 200px); |
| | | width: 100%; |
| | | } |
| | | |
| | | :deep(.zp-paging-container) { |
| | | background: transparent !important; |
| | | flex: 1; |
| | | display: flex; |
| | | flex-direction: column; |
| | | } |
| | | |
| | | :deep(.zp-paging-container-content) { |
| | | background: transparent !important; |
| | | flex: 1; |
| | | display: flex; |
| | | flex-direction: column; |
| | | } |
| | | |
| | | :deep(.wd-tabs) { |
| | | background: transparent !important; |
| | | height: 100%; |
| | | display: flex; |
| | | flex-direction: column; |
| | | overflow: hidden; |
| | | } |
| | | |
| | | :deep(.wd-tabs__nav) { |
| | | margin-bottom: 10px; |
| | | flex-shrink: 0; |
| | | position: sticky; |
| | | top: 0; |
| | | z-index: 10; |
| | | background: #f3f9f8; |
| | | } |
| | | |
| | | :deep(.wd-tabs__content) { |
| | | flex: 1; |
| | | overflow: visible; |
| | | } |
| | | |
| | | :deep(.wd-tab__pane) { |
| | | height: 100%; |
| | | } |
| | | |
| | | :deep(.zp-paging-container-top) { |
| | | flex-shrink: 0; |
| | | } |
| | | |
| | | :deep(.zp-paging-container-bottom) { |
| | | flex-shrink: 0; |
| | | padding: 8px 12px; |
| | | } |
| | | </style> |