| src/api/product/wire.ts | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/components/product_card/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/pages.json | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/pages/index/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/pages/production/detail/twistDetail.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/pages/production/detail/wireDetail.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/pages/production/list/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/pages/production/twist/report/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/pages/production/wire/report/reportManage.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/pages/production/wire/report/wire.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
src/api/product/wire.ts
@@ -19,6 +19,59 @@ data: data, }); }, // è·åæä¸æ¥å·¥æ å½¢æ°æ® getWireOutputTree(params: any) { return request<BaseResult<any>>({ url: "/app/getWireOutputTree", method: "GET", data: params, }); }, // æ°å¢æå addRodBagTree(data: any) { return request<BaseResult<any>>({ url: "/app/addRodBagTree", method: "POST", data: data, }); }, // å 餿å deleteRodBagTree(data: any) { return request<BaseResult<any>>({ url: "/app/deleteRodBagTree", method: "DELETE", data: data, }); }, // æ´æ°æå updateRodBagTree(data: any) { return request<BaseResult<any>>({ url: "/wireOutput/updateRodBagTree", method: "POST", data: data, }); }, // æ¹éæ°å¢æä¸æ¥å·¥ addWireOutputList(data: any) { return request<BaseResult<any>>({ url: "/wireDrawing/addWireOutputList", method: "POST", data: data, }); }, // å 餿䏿¥å·¥ deleteWireOutput(params: any) { return request<BaseResult<any>>({ url: `/app/deleteWireOutput?id=${params.id}`, method: "DELETE", }); }, }; export default WireApi; src/components/product_card/index.vue
@@ -21,6 +21,32 @@ </view> </wd-col> </wd-row> <wd-row class="my-2" v-if="data.type === 'æä¸' && data.poleModel"> <wd-col :span="24"> <view class="flex"> <view class="icon_box"> <wd-icon name="folder" color="#0D867F"></wd-icon> </view> <text class="text-[#646874] mx-2"> éæåå·: <text class="text-[#252525]">{{ data.poleModel }}</text> </text> </view> </wd-col> </wd-row> <wd-row class="my-2" v-if="data.type === 'æä¸' && data.contractNo"> <wd-col :span="24"> <view class="flex"> <view class="icon_box"> <wd-icon name="folder" color="#0D867F"></wd-icon> </view> <text class="text-[#646874] mx-2"> ååå·: <text class="text-[#252525]">{{ data.contractNo }}</text> </text> </view> </wd-col> </wd-row> <wd-row class="my-2"> <wd-col :span="12"> <view class="flex"> src/pages.json
@@ -164,6 +164,12 @@ } }, { "path": "pages/production/wire/report/reportManage", "style": { "navigationBarTitleText": "æ¥å·¥ç®¡ç" } }, { "path": "pages/production/wire/attachment/index", "style": { "navigationBarTitleText": "æä¸éä»¶" src/pages/index/index.vue
@@ -252,8 +252,8 @@ // åå¨çç»IDåç产åå¤ID if (data) { if (data.team) { setTeamId(data.team); if (data.id) { setTeamId(data.id); } if (data.prepareId) { setPrepareId(data.prepareId); src/pages/production/detail/twistDetail.vue
@@ -41,7 +41,7 @@ import { onLoad } from "@dcloudio/uni-app"; import ProductCard from "@/components/product_card/index.vue"; import TwistApi from "@/api/product/twist"; import { getPrepareId, setPrepareId } from "@/utils/cache"; import { getPrepareId, setPrepareId, clearPrepareId } from "@/utils/cache"; import HomeApi from "@/api/home"; const paramsId = ref(); @@ -72,9 +72,14 @@ const { data } = await HomeApi.getIndex(); if (data && data.prepareId) { setPrepareId(data.prepareId); } else { // å¦ææ²¡æ prepareIdï¼æ¸ 空ç¼å clearPrepareId(); } } catch (error) { console.error("è·åç产åå¤ID失败:", error); // è·å失败æ¶ä¹æ¸ 空ç¼å clearPrepareId(); } }; src/pages/production/detail/wireDetail.vue
@@ -9,16 +9,13 @@ totalAmount: 'totalAmount', amount: 'amount', unAmount: 'unAmount', poleModel: 'poleModel', contractNo: 'contractNo', }" /> <view class="mx-3"> <wd-grid class="rounded-lg" clickable> <wd-grid-item icon="computer" link-type="navigateTo" :url="`/pages/production/wire/report/wire?id=${paramsId}&model=${cardData.model}&oneLength=${cardData.oneLength}`" text="æ¥å·¥" /> <wd-grid-item icon="computer" @click="handleReportClick" text="æ¥å·¥" /> <!-- <wd-grid-item icon="chart" text="èªæ£" @@ -46,6 +43,8 @@ import { onLoad } from "@dcloudio/uni-app"; import ProductCard from "@/components/product_card/index.vue"; import WireApi from "@/api/product/wire"; import { getPrepareId, setPrepareId, clearPrepareId } from "@/utils/cache"; import HomeApi from "@/api/home"; const paramsId = ref(); const cardData = reactive({ @@ -56,6 +55,9 @@ amount: undefined, unAmount: undefined, oneLength: undefined, poleModel: undefined, contractNo: undefined, type: "æä¸", }); const getDetailData = async (id: string) => { @@ -69,11 +71,59 @@ cardData.amount = data.amount; cardData.unAmount = data.unAmount; cardData.oneLength = data.oneLength; cardData.poleModel = data.poleModel; cardData.contractNo = data.contractNo; cardData.type = data.type || "æä¸"; }; onLoad((options: any) => { // è·åå¹¶ç¼åç产åå¤ID const initPrepareId = async () => { try { const { data } = await HomeApi.getIndex(); if (data && data.prepareId) { setPrepareId(data.prepareId); } else { // å¦ææ²¡æ prepareIdï¼æ¸ 空ç¼å clearPrepareId(); } } catch (error) { console.error("è·åç产åå¤ID失败:", error); // è·å失败æ¶ä¹æ¸ 空ç¼å clearPrepareId(); } }; // å¤çæ¥å·¥ç¹å» const handleReportClick = () => { const prepareId = getPrepareId(); console.log("æä¸è¡¨æ ¼æ¥å·¥æ£æ¥ - prepareIdå¼:", prepareId); // 妿prepareIdä¸ºç©ºææªå®ä¹ï¼è¯´æç产å夿ªå®æ if (!prepareId) { console.log("æä¸è¡¨æ ¼æ¥å·¥é»æ¢ - ç产å夿ªå®æ"); uni.showModal({ title: "æç¤º", content: "请å¨çµèç«¯å®æç产åå¤ç¡®è®¤ï¼åè¿è¡æ¥å·¥æä½", showCancel: false, confirmText: "ç¡®å®", success: () => { // ç¨æ·ç¹å»ç¡®å®åï¼ä¸åä»»ä½æä½ }, }); return; } // 妿æ prepareIdï¼æ£å¸¸è·³è½¬ uni.navigateTo({ url: `/pages/production/wire/report/wire?id=${paramsId.value}&model=${cardData.model}&oneLength=${cardData.oneLength}`, }); }; onLoad(async (options: any) => { paramsId.value = options.id; getDetailData(options.id); await getDetailData(options.id); // è·åå¹¶ç¼åç产åå¤ID await initPrepareId(); }); </script> src/pages/production/list/index.vue
@@ -41,6 +41,8 @@ amount: "amount", unAmount: "unAmount", unit: "unit", poleModel: "poleModel", contractNo: "contractNo", }); const props = defineProps({ api: { @@ -99,6 +101,8 @@ map.totalAmount = "totalAmount"; map.amount = "amount"; map.unAmount = "unAmount"; map.poleModel = "poleModel"; map.contractNo = "contractNo"; } if (data.data.total == 0) { pagingRef.value.complete(true); src/pages/production/twist/report/index.vue
@@ -176,9 +176,9 @@ const { data } = await HomeApi.getIndex(); if (data) { // åå¨çç»ID if (data.team) { teamId.value = data.team; setTeamId(data.team); if (data.id) { teamId.value = data.id; setTeamId(data.id); } // åå¨ç产åå¤ID if (data.prepareId) { src/pages/production/wire/report/reportManage.vue
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,655 @@ <template> <view class="report-manage-page"> <view class="pt-2"> <wd-card class="card_bg"> <template #title> <view class="flex justify-between w-full"> <text class="font-medium text-[#252525]">æ¥å·¥ç®¡ç</text> <wd-button icon="file-add" :round="false" size="small" custom-class="add_btn" @click="handleAdd" > æ°å¢ </wd-button> </view> </template> <wd-row class="my-2"> <wd-col :span="24"> <view class="flex"> <view class="icon_box"> <wd-icon name="folder" color="#0D867F"></wd-icon> </view> <text class="text-[#646874] mx-2"> é¢ç¨æå·: <text class="text-[#252525]">{{ parentData?.poleNumber || "" }}</text> </text> </view> </wd-col> </wd-row> <wd-row class="my-2"> <wd-col :span="24"> <view class="flex"> <view class="icon_box"> <wd-icon name="folder" color="#0D867F"></wd-icon> </view> <text class="text-[#646874] mx-2"> æåå·: <text class="text-[#252525]">{{ parentData?.poleModel || "" }}</text> </text> </view> </wd-col> </wd-row> <wd-row class="my-2"> <wd-col :span="24"> <view class="flex"> <view class="icon_box"> <wd-icon name="folder" color="#0D867F"></wd-icon> </view> <text class="text-[#646874] mx-2"> æå å·: <text class="text-[#252525]">{{ parentData?.polePackageNumber || "" }}</text> </text> </view> </wd-col> </wd-row> <wd-row class="my-2"> <wd-col :span="24"> <view class="flex"> <view class="icon_box"> <wd-icon name="folder" color="#0D867F"></wd-icon> </view> <text class="text-[#646874] mx-2"> æé: <text class="text-[#252525]">{{ parentData?.poleWeight || "" }}kg</text> </text> </view> </wd-col> </wd-row> </wd-card> </view> <view class="page-content"> <wd-card v-for="(child, childIndex) in childList" :key="child.id || child.tempId || childIndex" class="card_bg" > <template #title> <text class="font-medium text-[#252525]">åä¸çå·: {{ child.monofilamentNumber }}</text> </template> <wd-row class="my-2" v-if="child.model"> <wd-col :span="12"> <view class="flex"> <view class="icon_box"> <wd-icon name="folder" color="#0D867F"></wd-icon> </view> <text class="text-[#646874] mx-2"> è§æ ¼åå·: <text class="text-[#252525]">{{ child.model }}</text> </text> </view> </wd-col> <wd-col :span="12"> <view class="flex"> <view class="icon_box"> <wd-icon name="folder" color="#0D867F"></wd-icon> </view> <text class="text-[#646874] mx-2"> çåå·: <text class="text-[#252525]">{{ child.dishModel }}</text> </text> </view> </wd-col> </wd-row> <wd-row class="my-2"> <wd-col :span="12" v-if="child.oneLength"> <view class="flex"> <view class="icon_box"> <wd-icon name="folder" color="#0D867F"></wd-icon> </view> <text class="text-[#646874] mx-2"> çé¿(m): <text class="text-[#252525]">{{ child.oneLength }}</text> </text> </view> </wd-col> <wd-col :span="12" v-if="child.isJoint !== undefined && child.isJoint !== null"> <view class="flex"> <view class="icon_box"> <wd-icon name="folder" color="#0D867F"></wd-icon> </view> <text class="text-[#646874] mx-2"> æ¯å¦æ¥å¤´: <text class="text-[#252525]"> {{ child.isJoint === 1 ? "æ¯" : child.isJoint === 0 ? "å¦" : "" }} </text> </text> </view> </wd-col> </wd-row> <wd-row class="my-2"> <wd-col :span="14" v-if="child.actuallyLength"> <view class="flex"> <view class="icon_box"> <wd-icon name="folder" color="#0D867F"></wd-icon> </view> <text class="text-[#646874] mx-2"> å®é é¿åº¦(m): <text class="text-[#252525]">{{ child.actuallyLength }}</text> </text> </view> </wd-col> <wd-col :span="10" v-if="child.productUser"> <view class="flex"> <view class="icon_box"> <wd-icon name="folder" color="#0D867F"></wd-icon> </view> <text class="text-[#646874] mx-2"> ç产人: <text class="text-[#252525]">{{ child.productUser }}</text> </text> </view> </wd-col> </wd-row> <wd-row class="my-2"> <wd-col :span="24" v-if="child.actuallyWeight"> <view class="flex"> <view class="icon_box"> <wd-icon name="folder" color="#0D867F"></wd-icon> </view> <text class="text-[#646874] mx-2"> å®é éé(kg): <text class="text-[#252525]">{{ child.actuallyWeight }}</text> </text> </view> </wd-col> </wd-row> <wd-row class="my-2"> <wd-col :span="24" v-if="child.productTime"> <view class="flex"> <view class="icon_box"> <wd-icon name="folder" color="#0D867F"></wd-icon> </view> <text class="text-[#646874] mx-2"> çäº§æ¥æ: <text class="text-[#252525]">{{ child.productTime }}</text> </text> </view> </wd-col> </wd-row> <wd-row class="my-2"> <wd-col :span="24" v-if="child.processHour"> <view class="flex"> <view class="icon_box"> <wd-icon name="folder" color="#0D867F"></wd-icon> </view> <text class="text-[#646874] mx-2"> å å·¥æ¶é´(h): <text class="text-[#252525]">{{ child.processHour }}</text> </text> </view> </wd-col> </wd-row> <template #footer> <view class="flex gap-2"> <wd-button plain size="small" @click="toAttachment(child)">éä»¶</wd-button> <wd-button plain type="error" size="small" @click="handleDeleteSingle(child)"> å é¤ </wd-button> </view> </template> </wd-card> </view> <!-- æ°å¢æ¥å·¥å¼¹æ¡ --> <wd-popup v-model="addDialogVisible" position="bottom" custom-class="yl-popup"> <view class="add-dialog"> <view class="dialog-header"> <text class="dialog-title">æ°å¢æ¥å·¥</text> <wd-icon name="close" class="close-icon" @click="closeAddDialog"></wd-icon> </view> <view class="dialog-content"> <wd-cell-group> <wd-input v-model="newChildData.dishModel" label="çåå·" label-width="100px" placeholder="请è¾å ¥çåå·" /> <wd-input v-model="newChildData.actuallyLength" label="å®é é¿åº¦(m)" label-width="100px" type="number" placeholder="请è¾å ¥å®é é¿åº¦" /> <wd-input v-model="newChildData.actuallyWeight" label="å®é éé(kg)" label-width="100px" type="number" placeholder="请è¾å ¥å®é éé" /> <wd-cell title="æ¯å¦æ¥å¤´" label-width="100px"> <wd-radio-group v-model="newChildData.isJoint"> <wd-radio :value="1">æ¯</wd-radio> <wd-radio :value="0">å¦</wd-radio> </wd-radio-group> </wd-cell> </wd-cell-group> </view> <view class="dialog-footer"> <wd-button plain @click="closeAddDialog">åæ¶</wd-button> <wd-button type="primary" class="ml-2" @click="handleSaveNewChild">ä¿å</wd-button> </view> </view> </wd-popup> <wd-toast /> </view> </template> <script setup lang="ts"> import { ref, watch, nextTick } from "vue"; import { onLoad } from "@dcloudio/uni-app"; import { useToast, dayjs } from "wot-design-uni"; import WireApi from "@/api/product/wire"; import { getTeamId } from "@/utils/cache"; import { useUserStore } from "@/store/modules/user"; const toast = useToast(); const userStore = useUserStore(); const paramsId = ref(); const parentData = ref<any>(null); const childList = ref<any[]>([]); const model = ref(); const oneLength = ref(); const allChildDataList = ref<any[]>([]); const wireDetail = ref<any>(null); // æ°å¢å¼¹æ¡ç¸å ³ const addDialogVisible = ref(false); const newChildData = ref({ dishModel: "", actuallyLength: "", actuallyWeight: "", isJoint: 0, meterWeight: 0, // ç±³é }); // è·åè¯¦æ æ°æ® const getDetailData = async (id: string) => { try { const { data } = await WireApi.getWireDetailById({ id }); wireDetail.value = data; model.value = data.model; oneLength.value = data.oneLength; } catch (error) { console.error("è·å详æ 失败:", error); } }; // åå§åæ°æ® const getData = async () => { try { const { code, data } = await WireApi.getWireOutputTree({ wireId: paramsId.value, }); if (code == 200) { allChildDataList.value = []; const parentMap = new Map(); data.forEach((item: any) => { const parentKey = `${item.poleNumber}-${item.poleModel}-${item.polePackageNumber}`; if (item.node && Array.isArray(item.node)) { item.node.forEach((child: any) => { const childData = { ...child, parentKey: parentKey, poleNumber: item.poleNumber, poleModel: item.poleModel, polePackageNumber: item.polePackageNumber, supplier: item.supplier, }; allChildDataList.value.push(childData); }); } }); // å·æ°å½å页é¢çå级å表 const parentKey = `${parentData.value.poleNumber}-${parentData.value.poleModel}-${parentData.value.polePackageNumber}`; childList.value = allChildDataList.value .filter((child) => child.parentKey === parentKey) .map((child, index) => ({ ...child, customIndex: index + 1, selected: false, })); } } catch (error) { console.error("è·åæ°æ®å¤±è´¥:", error); toast.error("è·åæ°æ®å¤±è´¥"); } }; // æå¼æ°å¢å¼¹æ¡ const handleAdd = () => { const lastChild = childList.value[childList.value.length - 1]; // ä»è¯¦æ æ°æ®ä¸è·åç±³é const meterWeight = Number(wireDetail.value?.meterWeight) || Number(wireDetail.value?.weight) || Number(wireDetail.value?.theoryWeight) || 0; // åå§åæ°æ°æ®ï¼å¦æææå䏿¡æ°æ®ï¼ä½¿ç¨å ¶å¼ä½ä¸ºé»è®¤å¼ newChildData.value = { dishModel: lastChild?.dishModel || "", actuallyLength: lastChild?.actuallyLength || "", actuallyWeight: lastChild?.actuallyWeight || "", isJoint: lastChild?.isJoint || 0, meterWeight: meterWeight, }; addDialogVisible.value = true; }; // ä¿åæ°å¢çåçº§æ°æ® const handleSaveNewChild = async () => { if (!newChildData.value.actuallyLength || !newChildData.value.actuallyWeight) { toast.error("请è¾å ¥å®æ´ä¿¡æ¯ï¼å®é é¿åº¦åééä¸ºå¿ å¡«é¡¹ï¼"); return; } const lastChild = childList.value[childList.value.length - 1]; // çææ°çåä¸çå· const newMonofilamentNumber = addMonofilamentNumber(lastChild?.monofilamentNumber, "æä¸"); const newChild = { id: null, tempId: `temp_${Date.now()}`, parentKey: `${parentData.value.poleNumber}-${parentData.value.poleModel}-${parentData.value.polePackageNumber}`, teamId: getTeamId(), type: "æä¸", wireId: paramsId.value, poleNumber: parentData.value.poleNumber, poleModel: parentData.value.poleModel, supplier: parentData.value.supplier, polePackageNumber: parentData.value.polePackageNumber, dishModel: newChildData.value.dishModel || null, poleWeight: parentData.value.poleWeight, monofilamentNumber: newMonofilamentNumber, model: model.value || "", oneLength: oneLength.value || null, theoryWeight: lastChild?.theoryWeight || null, actuallyLength: newChildData.value.actuallyLength, actuallyWeight: newChildData.value.actuallyWeight, processHour: lastChild?.processHour || null, productUser: userStore.userInfo?.nickname || userStore.userInfo?.nickName || "", productTime: dayjs().format("YYYY-MM-DD HH:mm:ss"), customIndex: childList.value.length + 1, isJoint: newChildData.value.isJoint, selected: false, }; // 为æ¯ä¸ªåçº§æ°æ®æ·»å æéä¿¡æ¯ const childrenWithPoleWeight = [ { ...newChild, poleWeight: parentData.value.poleWeight, }, ]; try { const { code, data } = await WireApi.addWireOutputList(childrenWithPoleWeight); if (code == 200) { if (data) { toast.warning(data); } else { toast.success("ä¿åæå"); } closeAddDialog(); await getData(); } } catch (error) { console.error("ä¿å失败:", error); toast.error("ä¿å失败"); } }; // å ³éæ°å¢å¼¹æ¡ const closeAddDialog = () => { addDialogVisible.value = false; // éç½®è¡¨åæ°æ® newChildData.value = { dishModel: "", actuallyLength: "", actuallyWeight: "", isJoint: 0, meterWeight: 0, }; }; // çææ°çåä¸çå· const addMonofilamentNumber = (val: string, type: string) => { if (val) { if (type == "æä¸") { const arr = val.split("-"); if (arr.length >= 3) { const prefix = `${arr[0]}-${arr[1]}`; let count = 0; allChildDataList.value.forEach((child) => { if (child.monofilamentNumber) { const childArr = child.monofilamentNumber.split("-"); if (childArr.length >= 3) { const childPrefix = `${childArr[0]}-${childArr[1]}`; if (childPrefix === prefix) { count++; } } } }); childList.value.forEach((child) => { if (child.monofilamentNumber && !child.id) { const childArr = child.monofilamentNumber.split("-"); if (childArr.length >= 3) { const childPrefix = `${childArr[0]}-${childArr[1]}`; if (childPrefix === prefix) { count++; } } } }); const a = count + 1; const paddedA = a < 10 ? `0${a}` : `${a}`; return `${prefix}-${paddedA}`; } } } return ""; }; // 跳转å°éä»¶é¡µé¢ const toAttachment = (item: any) => { uni.navigateTo({ url: "/pages/production/wire/attachment/index", success: () => { // 页é¢è·³è½¬æåååéäºä»¶ä¼ éæ°æ® uni.$emit("detailData", item); }, fail: (error) => { console.error("跳转é件页é¢å¤±è´¥:", error); toast.error("跳转失败"); }, }); }; // å é¤å个åçº§æ°æ® const handleDeleteSingle = async (child: any) => { try { const res = await uni.showModal({ title: "æç¤º", content: `ç¡®å®å é¤è¿æ¡æ°æ®åï¼`, }); if (res.confirm) { // 妿æ¯å·²ä¿åçæ°æ®ï¼è°ç¨å 餿¥å£ if (child.id) { await WireApi.deleteWireOutput({ id: child.id }); await getData(); toast.success("å 餿å"); } else { // å¦ææ¯æªä¿åçæ°æ®ï¼ç´æ¥ä»å表ä¸ç§»é¤ const index = childList.value.findIndex((row) => row.tempId === child.tempId); if (index !== -1) { childList.value.splice(index, 1); // éæ°è®¡ç®åºå· childList.value.forEach((item, idx) => { item.customIndex = idx + 1; }); toast.success("å 餿å"); } } } } catch (error) { console.error("å é¤å¤±è´¥:", error); toast.error("å é¤å¤±è´¥"); } }; // èªå¨è®¡ç®å®é éé const handleCalculateWeight = (row: any) => { // ä» newChildData 对象ä¸è·åç±³é const meterWeight = Number(row.meterWeight) || 0; const actuallyLength = Number(row.actuallyLength); if (meterWeight > 0 && actuallyLength > 0) { const calculatedWeight = (meterWeight * actuallyLength) / 1000; row.actuallyWeight = Number(calculatedWeight.toFixed(3)); } console.log("row", meterWeight, actuallyLength); }; // çå¬å®é é¿åº¦ååï¼èªå¨è®¡ç®éé watch( () => newChildData.value.actuallyLength, (newValue, oldValue) => { console.log("å®é é¿åº¦åå:", { newValue, oldValue, newChildData: newChildData.value }); if (newValue && String(newValue).trim() !== "") { // ä½¿ç¨ nextTick ç¡®ä¿ v-model å·²ç»æ´æ° nextTick(() => { handleCalculateWeight(newChildData.value); }); } }, { immediate: false, deep: true } ); onLoad(async (options: any) => { paramsId.value = options.wireId; // ä»é¡µé¢åæ°ä¸è·åç¶çº§æ°æ® parentData.value = { id: options.parentId, poleNumber: options.poleNumber, poleModel: options.poleModel, polePackageNumber: options.polePackageNumber, poleWeight: options.poleWeight, supplier: options.supplier, }; await getDetailData(options.wireId); await getData(); }); </script> <style lang="scss" scoped> .report-manage-page { min-height: 100vh; background: #f3f9f8; padding-bottom: 20px; } .card_bg { box-shadow: 0px 0px 12px 0px rgba(0, 0, 0, 0.05); padding-bottom: 10px; } .icon_box { display: flex; align-items: center; justify-content: center; width: 20px; height: 20px; background: #e7f4ec99; border-radius: 50%; } :deep() { .add_btn { border-radius: 4px; } } .add-dialog { max-height: 80vh; display: flex; flex-direction: column; background: #fff; border-radius: 12px 12px 0 0; } .dialog-header { display: flex; justify-content: space-between; align-items: center; padding: 16px; border-bottom: 1px solid #e6e6e6; position: sticky; top: 0; background: #fff; z-index: 10; } .dialog-title { font-size: 16px; color: #333; font-weight: 500; } .close-icon { font-size: 20px; color: #999; padding: 4px; } .dialog-content { flex: 1; overflow-y: auto; padding: 16px; } .dialog-footer { display: flex; justify-content: flex-end; padding: 16px; border-top: 1px solid #e6e6e6; gap: 8px; } .page-content { padding: 12px; margin-top: 12px; } </style> src/pages/production/wire/report/wire.vue
@@ -1,41 +1,181 @@ <template> <view class="list"> <z-paging ref="pagingRef" v-model="wireReportList" :fixed="false" @query="getWireReportList"> <template #top> <CardTitle title="æ¥å·¥ä¿¡æ¯" :hideAction="true" :full="false" @action="addReport" /> </template> <wd-card v-for="(item, index) in wireReportList" :key="index" type="rectangle" custom-class="round" <CardTitle title="æ¥å·¥ä¿¡æ¯" :hideAction="false" :full="false"> <template #action> <wd-button icon="file-add" :round="false" size="small" custom-class="add_btn" @click="handleAddParent" > æ°å¢æå </wd-button> </template> </CardTitle> <!-- ç¶çº§åè¡¨ï¼æå ï¼ --> <view class="parent-list"> <wd-card v-for="(item, index) in parentDataList" :key="item.id || index" class="card_bg"> <template #title> <view class="flex justify-between"> <view> <wd-icon name="user" color="#0D867F"></wd-icon> <text class="text-[#0D867F] ml-2 font-medium">ç产人</text> <text class="text-[#333333] ml-2">{{ item.productUser }}</text> <view class="flex justify-between w-full"> <view class="flex items-center"> <text class="font-medium text-[#252525]">æå ä¿¡æ¯</text> <view v-if="item.isAutoAdd == 1" class="text-xs text-blue-500 ml-2">èªå¨æ·»å </view> </view> <!-- <view class="text-[#A8A8A8]" @click="toEdit">ç¼è¾</view> --> <wd-button plain type="error" size="small" @click="handleDeleteRodBag(item)"> å é¤ </wd-button> </view> </template> <ProductionCard :data="cardAttr" :value="item" /> <view> <wd-row class="my-2" v-if="item.poleNumber"> <wd-col :span="24"> <view class="flex"> <view class="icon_box"> <wd-icon name="folder" color="#0D867F"></wd-icon> </view> <text class="text-[#646874] mx-2"> é¢ç¨æå·: <text class="text-[#252525]">{{ item.poleNumber }}</text> </text> </view> </wd-col> </wd-row> <wd-row class="my-2" v-if="item.poleModel"> <wd-col :span="12"> <view class="flex"> <view class="icon_box"> <wd-icon name="folder" color="#0D867F"></wd-icon> </view> <text class="text-[#646874] mx-2"> æåå·: <text class="text-[#252525]">{{ item.poleModel }}</text> </text> </view> </wd-col> <wd-col :span="12"> <view class="flex"> <view class="icon_box"> <wd-icon name="folder" color="#0D867F"></wd-icon> </view> <text class="text-[#646874] mx-2"> æå å·: <text class="text-[#252525]">{{ item.polePackageNumber }}</text> </text> </view> </wd-col> </wd-row> <wd-row class="my-2"> <wd-col :span="24" v-if="item.poleWeight"> <view class="flex"> <view class="icon_box"> <wd-icon name="folder" color="#0D867F"></wd-icon> </view> <text class="text-[#646874] mx-2"> æé(kg): <text class="text-[#252525]">{{ item.poleWeight }}</text> </text> </view> </wd-col> </wd-row> <wd-row class="my-2"> <wd-col :span="24" v-if="item.supplier"> <view class="flex"> <view class="icon_box"> <wd-icon name="folder" color="#0D867F"></wd-icon> </view> <text class="text-[#646874] mx-2"> ä¾åºå: <text class="text-[#252525]">{{ item.supplier }}</text> </text> </view> </wd-col> </wd-row> <wd-row class="my-2" v-if="item.isConsumed !== undefined"> <wd-col :span="24"> <view class="flex items-center"> <view class="icon_box"> <wd-icon name="folder" color="#0D867F"></wd-icon> </view> <text class="text-[#646874] mx-2">æ¶èæ åµ:</text> <wd-switch v-model="item.isConsumed" :disabled="false" active-text="å·²èå®" inactive-text="è¿å©ä½" :active-value="1" :inactive-value="0" size="20" @change="handleConsumedChange(item, $event)" /> </view> </wd-col> </wd-row> </view> <template #footer> <wd-button size="small" plain style="margin-right: 10px" @click="toAttachment(item)"> éä»¶ <view class="flex justify-start"> <wd-button plain size="small" type="primary" @click="openChildDialog(item)"> æ¥å·¥ç®¡ç </wd-button> <wd-button size="small" plain @click="toCheck(item.id)">èªæ£</wd-button> </view> </template> </wd-card> </z-paging> <wd-popup v-model="dialog.visible" position="bottom" custom-class="yl-popup"> <view class="action px-3"> <wd-button type="text" @click="cancel">åæ¶</wd-button> <wd-button type="text" @click="submit">ç¡®å®</wd-button> </view> <WireForm ref="wireFormRef" /> <!-- æ°å¢æå å¼¹æ¡ --> <wd-popup v-model="parentDialogVisible" position="bottom" custom-class="yl-popup"> <view class="parent-dialog"> <view class="dialog-header"> <text class="dialog-title">æ°å¢æå </text> <wd-icon name="close" class="close-icon" @click="closeParentDialog"></wd-icon> </view> <view class="dialog-content"> <wd-cell-group> <wd-input v-model="newParentData.poleNumber" label="é¢ç¨æå·" label-width="100px" placeholder="请è¾å ¥é¢ç¨æå·" /> <wd-input v-model="newParentData.poleModel" label="æåå·" label-width="100px" placeholder="请è¾å ¥æåå·" /> <wd-input v-model="newParentData.polePackageNumber" label="æå å·" label-width="100px" placeholder="请è¾å ¥æå å·" /> <wd-input v-model="newParentData.poleWeight" label="æé(kg)" label-width="100px" type="number" placeholder="请è¾å ¥æé" /> <wd-picker v-model="newParentData.supplier" label="ä¾åºå" label-width="100px" :columns="supplierOptions" placeholder="è¯·éæ©ä¾åºå" /> </wd-cell-group> </view> <view class="dialog-footer"> <wd-button plain @click="closeParentDialog">åæ¶</wd-button> <wd-button type="primary" class="ml-2" @click="handleSaveNewParent">ä¿å</wd-button> </view> </view> </wd-popup> <!-- Drawç»ä»¶ï¼é¢ç¨èªæ£ï¼ --> <wd-popup v-model="drawFormRef.visible" position="bottom" custom-class="yl-popup"> <Draw :wire-id="drawData.wireId" @@ -43,172 +183,324 @@ @close="handleDrawClose" /> </wd-popup> <wd-toast /> </view> </template> <script setup lang="ts"> import CardTitle from "@/components/card-title/index.vue"; import WireForm from "./wireForm.vue"; import { useToast } from "wot-design-uni"; import ProductionCard from "../../components/ProductionCard.vue"; import zPaging from "@/components/z-paging/z-paging.vue"; import { useToast, dayjs } from "wot-design-uni"; import { onLoad } from "@dcloudio/uni-app"; import { onMounted, nextTick } from "vue"; import WireApi from "@/api/product/wire"; import ManageApi from "@/api/product/manage"; import Draw from "./rawMaterial.vue"; import { getTeamId } from "@/utils/cache"; import { useUserStore } from "@/store/modules/user"; import WireDetailApi from "@/api/product/wire"; const pagingRef = ref(); const wireFormRef = ref(); const paramsId = ref(); const toast = useToast(); const dialog = reactive({ visible: false, const userStore = useUserStore(); const paramsId = ref(); const model = ref(); const oneLength = ref(); // ç¶çº§æ°æ®å表 const parentDataList = ref<any[]>([]); // åçº§æ°æ®åè¡¨ï¼ææåçº§æ°æ®çæå¹³ååè¡¨ï¼ const childDataList = ref<any[]>([]); // ä¾åºåé项 const supplierOptions = ref<any[]>([]); // ç¶çº§å¼¹æ¡ç¸å ³ const parentDialogVisible = ref(false); const newParentData = ref({ poleNumber: "", poleModel: "", polePackageNumber: "", poleWeight: undefined as number | undefined, supplier: "", isConsumed: 1, }); // Drawç»ä»¶ç¸å ³ const drawFormRef = reactive({ visible: false, }); // å¤çdrawç»ä»¶å ³éäºä»¶ const handleDrawClose = () => { // ç¡®ä¿å¼¹çªè¢«æ£ç¡®å ³é drawFormRef.visible = false; }; const drawData = ref({ wireId: "", poleNumber: "", }); const showDrawPopup = async () => { console.log("è¿å ¥è¯¥æ¹æ³ï¼"); // è·åè¯¦æ æ°æ® const getDetailData = async (id: string) => { try { const { data } = await ManageApi.queryWireRawMaterialInspect({ wireId: paramsId.value, poleNumber: drawData.value.poleNumber, }); console.log("data", data); // éé ä¸åçæ°æ®ç»æè¿åæ ¼å¼ if (data == null) { drawData.value = { wireId: paramsId.value, poleNumber: drawData.value.poleNumber, const { data } = await WireDetailApi.getWireDetailById({ id }); model.value = data.model; oneLength.value = data.oneLength; } catch (error) { console.error("è·å详æ 失败:", error); } }; // æ¾ç¤ºDrawå¼¹çª drawFormRef.visible = true; toast.success("请填åé¢ç¨ä¿¡æ¯!"); } else { // toast.error("å·²åå¨é¢ç¨ä¿¡æ¯,æ éå¡«æ¥!"); // å è½½ä¾åºååå ¸ const loadSupplierDict = async () => { try { const res = await ManageApi.dictAPI("al_supplier"); if (res.data && Array.isArray(res.data)) { supplierOptions.value = res.data.map((item: any) => ({ label: item.dictLabel || "", value: item.dictValue || item.value || "", })); } } catch (error) { console.error("è·åé¢ç¨ä¿¡æ¯å¤±è´¥:", error); toast.error("è·åä¿¡æ¯å¤±è´¥ï¼è¯·éè¯"); console.error("å è½½ä¾åºååå ¸å¤±è´¥:", error); } }; const cardAttr = ref<any[]>([ { label: "é¢ç¨æå·", prop: "poleNumber", span: 24, }, { label: "åä¸çå·", prop: "monofilamentNumber", span: 24, }, { label: "æåå·", prop: "poleModel", }, { label: "æå å·", prop: "polePackageNumber", }, { label: "æé(kg)", prop: "poleWeight", }, { label: "è§æ ¼åå·", prop: "model", }, { label: "çåå·", prop: "dishModel", }, { label: "çé¿(m)", prop: "oneLength", }, { label: "å®é é¿åº¦", prop: "actuallyLength", }, { label: "å®é éé(kg)", prop: "actuallyWeight", }, ]); const wireReportList = ref<any[]>([]); // const toEdit = () => { // uni.navigateTo({ // url: "/pages/production/wire/report/wireEdit", // }); // }; const addReport = () => { dialog.visible = true; }; const submit = async () => { const result = await wireFormRef.value.submit(); dialog.visible = !result.success; // 设置poleNumberå°drawDataä¸ if (result.success) { drawData.value.poleNumber = result.poleNumber; showDrawPopup(); } pagingRef.value.reload(); }; const cancel = () => { toast.show("åæ¶"); dialog.visible = false; }; const toAttachment = (item: any) => { uni.navigateTo({ url: "/pages/production/wire/attachment/index", success: () => { // 页é¢è·³è½¬æåååéäºä»¶ä¼ éæ°æ® uni.$emit("detailData", item); }, }); }; const toCheck = (id: number) => { uni.navigateTo({ url: `/pages/production/wire/selfInspect/index?id=${id}`, }); }; // è·åæä¸æ¥å·¥å表 const getWireReportList = async () => { const { data } = await ManageApi.getReportList({ // åå§åæ°æ® const getData = async () => { try { const { code, data } = await WireApi.getWireOutputTree({ wireId: paramsId.value, type: "æä¸", }); pagingRef.value.complete(data); if (code == 200) { parentDataList.value = []; childDataList.value = []; const parentMap = new Map(); data.forEach((item: any) => { const parentKey = `${item.poleNumber}-${item.poleModel}-${item.polePackageNumber}`; if (!parentMap.has(parentKey)) { const parentData = { id: parentKey, poleNumber: item.poleNumber, poleModel: item.poleModel, polePackageNumber: item.polePackageNumber, dishModel: item.dishModel, poleWeight: item.poleWeight, supplier: item.supplier, isConsumed: item.isConsumed === true || item.isConsumed === 1 ? 1 : 0, treeId: item.id, isAutoAdd: item.isAutoAdd, }; parentMap.set(parentKey, parentData); parentDataList.value.push(parentData); } if (item.node && Array.isArray(item.node)) { item.node.forEach((child: any) => { const childData = { ...child, parentKey: parentKey, poleNumber: item.poleNumber, poleModel: item.poleModel, polePackageNumber: item.polePackageNumber, supplier: item.supplier, selected: false, }; childDataList.value.push(childData); }); } }); } } catch (error) { console.error("è·åæ°æ®å¤±è´¥:", error); toast.error("è·åæ°æ®å¤±è´¥"); } }; onLoad((options: any) => { // æ°å¢ç¶çº§æ°æ® - æå¼å¼¹æ¡ const handleAddParent = () => { const lastParent = parentDataList.value[0]; // åå§åæ°æ°æ®ï¼å¦æææå䏿¡æ°æ®ï¼ä½¿ç¨å ¶å¼ä½ä¸ºé»è®¤å¼ newParentData.value = { poleNumber: lastParent?.poleNumber || "", poleModel: lastParent?.poleModel || "", polePackageNumber: lastParent?.polePackageNumber || "", poleWeight: lastParent?.poleWeight || null, supplier: lastParent?.supplier || "", isConsumed: 1, }; parentDialogVisible.value = true; }; // ä¿åæ°ç¶çº§æ°æ® const handleSaveNewParent = async () => { if ( !newParentData.value.poleNumber || !newParentData.value.poleModel || !newParentData.value.polePackageNumber || !newParentData.value.poleWeight ) { toast.error("请填å宿´çç¶çº§ä¿¡æ¯ï¼é¢ç¨æå·ãæåå·ãæå å·ãæéä¸ºå¿ å¡«é¡¹ï¼"); return; } try { const { code } = await WireApi.addRodBagTree({ wireId: paramsId.value, poleNumber: newParentData.value.poleNumber, poleModel: newParentData.value.poleModel, polePackageNumber: newParentData.value.polePackageNumber, supplier: newParentData.value.supplier, poleWeight: newParentData.value.poleWeight, isConsumed: newParentData.value.isConsumed, }); if (code == 200) { toast.success("ä¿åæå"); closeParentDialog(); await getData(); } } catch (error) { console.error("ä¿å失败:", error); toast.error("ä¿å失败"); } }; // å ³éç¶çº§å¼¹æ¡ const closeParentDialog = () => { parentDialogVisible.value = false; // éç½®è¡¨åæ°æ® newParentData.value = { poleNumber: "", poleModel: "", polePackageNumber: "", poleWeight: undefined, supplier: "", isConsumed: 1, }; }; // å 餿å const handleDeleteRodBag = async (row: any) => { try { const res = await uni.showModal({ title: "æç¤º", content: `ç¡®å®å 餿å ï¼${row.poleNumber} - ${row.poleModel} - ${row.polePackageNumber} åï¼`, }); if (res.confirm) { const { code } = await WireApi.deleteRodBagTree({ wireId: paramsId.value, poleModel: row.poleModel, poleNumber: row.poleNumber, polePackageNumber: row.polePackageNumber, }); if (code === 200) { toast.success("å 餿å"); await getData(); } else { toast.error("å é¤å¤±è´¥"); } } } catch (error) { console.error("å 餿å 失败:", error); toast.error("å é¤å¤±è´¥"); } }; // æ¶èæ åµåå const handleConsumedChange = async (row: any, value: any) => { if (row.treeId) { // ä¿åæ§å¼ï¼ç¨äºå¤±è´¥æ¶æ¢å¤ const oldValue = row.isConsumed; // å¤ç valueï¼å¯è½æ¯æ°åã对象æå ¶ä»æ ¼å¼ let isConsumedValue: number; if (typeof value === "object" && value !== null && "value" in value) { // 妿æ¯å¯¹è±¡æ ¼å¼ {value: 1} isConsumedValue = value.value; } else if (typeof value === "number") { // å¦ææ¯æ°å isConsumedValue = value; } else if (typeof value === "boolean") { // 妿æ¯å¸å°å¼ isConsumedValue = value ? 1 : 0; } else { // å ¶ä»æ åµï¼å°è¯è½¬æ¢ isConsumedValue = value === 1 || value === "1" || value === true ? 1 : 0; } // å æ´æ° UI row.isConsumed = isConsumedValue; try { const { code } = await WireApi.updateRodBagTree({ treeId: row.treeId, isConsumed: isConsumedValue, }); if (code != 200) { toast.error("æ´æ°å¤±è´¥"); // æ´æ°å¤±è´¥æ¶æ¢å¤åå¼ row.isConsumed = oldValue; } } catch (error) { console.error("æ´æ°æ¶èæ åµå¤±è´¥:", error); toast.error("æ´æ°å¤±è´¥"); // æ´æ°å¤±è´¥æ¶æ¢å¤åå¼ row.isConsumed = oldValue; } } }; // æå¼åçº§é¡µé¢ const openChildDialog = async (parentRow: any) => { // æ£æ¥æ¯å¦æé¢ç¨ä¿¡æ¯ try { const { code, data } = await ManageApi.queryWireRawMaterialInspect({ wireId: paramsId.value, poleNumber: parentRow.poleNumber, }); if (code == 200) { if (data == null) { // æ¾ç¤ºDrawç»ä»¶ drawData.value = { wireId: paramsId.value, poleNumber: parentRow.poleNumber, }; drawFormRef.visible = true; toast.warning("请å å¡«åé¢ç¨ä¿¡æ¯"); return; } } } catch (error) { console.error("æ£æ¥é¢ç¨ä¿¡æ¯å¤±è´¥:", error); } // è·³è½¬å°æ¥å·¥ç®¡çé¡µé¢ uni.navigateTo({ url: `/pages/production/wire/report/reportManage?wireId=${paramsId.value}&parentId=${parentRow.id}&poleNumber=${parentRow.poleNumber}&poleModel=${parentRow.poleModel}&polePackageNumber=${parentRow.polePackageNumber}&poleWeight=${parentRow.poleWeight}&supplier=${parentRow.supplier || ""}`, }); }; // å¤çdrawç»ä»¶å ³éäºä»¶ const handleDrawClose = () => { drawFormRef.visible = false; }; onLoad(async (options: any) => { paramsId.value = options.id; await getDetailData(options.id); await loadSupplierDict(); await getData(); }); </script> <style lang="scss" scoped> .list { height: calc(100vh - 30px); min-height: calc(100vh - 30px); padding: 12px; background: #f3f9f8; @@ -219,8 +511,49 @@ } } .action { .parent-list { margin-top: 12px; } .card_bg { box-shadow: 0px 0px 12px 0px rgba(0, 0, 0, 0.05); padding-bottom: 10px; margin-bottom: 12px; } .icon_box { display: flex; justify-content: space-between; align-items: center; justify-content: center; width: 20px; height: 20px; background: #e7f4ec99; border-radius: 50%; } .edit-form { padding: 12px 0; } .parent-dialog { max-height: 80vh; display: flex; flex-direction: column; background: #fff; border-radius: 12px 12px 0 0; } .dialog-content { flex: 1; overflow-y: auto; padding: 16px; } .dialog-footer { display: flex; justify-content: flex-end; padding: 16px; border-top: 1px solid #e6e6e6; gap: 8px; } </style>