| | |
| | | type="icon" |
| | | icon="scan" |
| | | color="#0d867f" |
| | | @click="openScan" |
| | | style="color: #0d867f" |
| | | @click="openScan" |
| | | ></wd-button> |
| | | </template> |
| | | </CardTitle> |
| | | |
| | | <!-- 当前物料信息 --> |
| | | <view class="material-info" v-if="currentMaterial"> |
| | | <view v-if="currentMaterial" class="material-info"> |
| | | <wd-card custom-class="info-card"> |
| | | <view class="info-compact"> |
| | | <view class="icon_box"> |
| | |
| | | <text class="outbound_item_label">生产批次号:</text> |
| | | <text class="outbound_item_value">{{ item.monofilamentNumber || "-" }}</text> |
| | | </view> |
| | | <view class="outbound_item_row"> |
| | | <text class="outbound_item_label">规格型号:</text> |
| | | <text class="outbound_item_value">{{ item.model || "-" }}</text> |
| | | </view> |
| | | <view class="outbound_item_row"> |
| | | <text class="outbound_item_label">重量:</text> |
| | | <text class="outbound_item_value">{{ item.weight || "-" }} kg</text> |
| | | </view> |
| | | <view class="outbound_item_row"> |
| | | <text class="outbound_item_label">厂家:</text> |
| | | <text class="outbound_item_value">{{ item.clienteleName || "-" }}</text> |
| | | </view> |
| | | <view class="outbound_item_row"> |
| | | <text class="outbound_item_label">段长:</text> |
| | | <text class="outbound_item_value">{{ item.actuallyLength || "-" }} M</text> |
| | | </view> |
| | | <view class="outbound_item_row"> |
| | | <text class="outbound_item_label">生产日期:</text> |
| | | <text class="outbound_item_value">{{ item.productionDate || "-" }}</text> |
| | | </view> |
| | | <template v-if="!item.isMesMissing"> |
| | | <view class="outbound_item_row"> |
| | | <text class="outbound_item_label">规格型号:</text> |
| | | <text class="outbound_item_value">{{ item.model || "-" }}</text> |
| | | </view> |
| | | <view class="outbound_item_row"> |
| | | <text class="outbound_item_label">重量:</text> |
| | | <text class="outbound_item_value">{{ item.weight || "-" }} kg</text> |
| | | </view> |
| | | <view class="outbound_item_row"> |
| | | <text class="outbound_item_label">厂家:</text> |
| | | <text class="outbound_item_value">{{ item.clienteleName || "-" }}</text> |
| | | </view> |
| | | <view class="outbound_item_row"> |
| | | <text class="outbound_item_label">段长:</text> |
| | | <text class="outbound_item_value">{{ item.actuallyLength || "-" }} M</text> |
| | | </view> |
| | | <view class="outbound_item_row"> |
| | | <text class="outbound_item_label">生产日期:</text> |
| | | <text class="outbound_item_value">{{ item.productionDate || "-" }}</text> |
| | | </view> |
| | | </template> |
| | | </view> |
| | | </view> |
| | | <view class="outbound_item_action"> |
| | |
| | | |
| | | <!-- 底部按钮 --> |
| | | <view v-if="goodsList.length > 0" class="outbound_footer"> |
| | | <wd-button block @click="handleOutbound" style="background: #0d867f"> |
| | | <wd-button block style="background: #0d867f" @click="handleOutbound"> |
| | | <text class="text-[#fff]">出库</text> |
| | | </wd-button> |
| | | </view> |
| | |
| | | // 格式化时间 |
| | | const formatTime = (date: Date) => { |
| | | return dayjs(date).format("YYYY-MM-DD HH:mm:ss"); |
| | | }; |
| | | |
| | | const handleMonofilamentNumber = (value?: string) => { |
| | | if (!value) return ""; |
| | | if (!value.includes("-")) { |
| | | if (value.length < 3) { |
| | | toast.error("单丝编号长度不足,无法添加 '-'"); |
| | | return ""; |
| | | } |
| | | const insertIndex = value.length - 3; |
| | | return `${value.slice(0, insertIndex)}-${value.slice(insertIndex)}`; |
| | | } |
| | | return value; |
| | | }; |
| | | |
| | | // 直接扫码 |
| | |
| | | let scanData; |
| | | try { |
| | | scanData = JSON.parse(scanText); |
| | | } catch (e) { |
| | | } catch { |
| | | toast.error("二维码格式错误"); |
| | | return; |
| | | } |
| | | |
| | | outPutId = scanData.id; |
| | | monofilamentNumber = scanData.monofilamentNumber; |
| | | |
| | | if (!outPutId) { |
| | | toast.error("二维码格式错误,缺少id信息"); |
| | | if (outPutId) { |
| | | //TODO兼容目前已打印的二维码 |
| | | // 有 id:按 id 查重并调 getTagByIdAll(返回数组) |
| | | const exists = goodsList.value.some((item) => { |
| | | const itemId = item.id; |
| | | return itemId && itemId === outPutId && itemId !== "-"; |
| | | }); |
| | | if (exists) { |
| | | toast.error("该条码已存在,请勿重复扫码"); |
| | | return; |
| | | } |
| | | const { data } = await OutboundApi.getTagByIdAll({ |
| | | outPutId: outPutId, |
| | | }); |
| | | const list = data || []; |
| | | if (!list.length) { |
| | | toast.error("未查询到条码信息"); |
| | | return; |
| | | } |
| | | tagData = list[0]; |
| | | needContractCheck = true; |
| | | } else if (monofilamentNumber) { |
| | | // 有 monofilamentNumber:按单丝号查重并调 getTagByMonofilamentNumber(返回对象) |
| | | const exists = goodsList.value.some((item) => { |
| | | const itemMono = item.monofilamentNumber; |
| | | return itemMono && itemMono === monofilamentNumber && itemMono !== "-"; |
| | | }); |
| | | if (exists) { |
| | | toast.error("该条码已存在,请勿重复扫码"); |
| | | return; |
| | | } |
| | | const { data } = await OutboundApi.getTagByMonofilamentNumber({ |
| | | monofilamentNumber, |
| | | }); |
| | | if (!data || (Array.isArray(data) && !data.length)) { |
| | | toast.error("未查询到条码信息"); |
| | | return; |
| | | } |
| | | tagData = Array.isArray(data) ? data[0] : data; |
| | | outPutId = tagData?.id || monofilamentNumber; |
| | | needContractCheck = true; |
| | | } else { |
| | | toast.error("二维码格式错误,缺少id或单丝编号信息"); |
| | | return; |
| | | } |
| | | |
| | | // 检查是否已存在(根据 id 判断) |
| | | const exists = goodsList.value.some((item) => { |
| | | const itemId = item.id; |
| | | return itemId && itemId === outPutId && itemId !== "-"; |
| | | }); |
| | | |
| | | if (exists) { |
| | | toast.error("该条码已存在,请勿重复扫码"); |
| | | return; |
| | | } |
| | | |
| | | // 调用接口获取绞线/拉丝详细信息(含出库状态) |
| | | const { data } = await OutboundApi.getTagByIdAll({ |
| | | outPutId: outPutId, |
| | | }); |
| | | |
| | | const list = data || []; |
| | | if (!list.length) { |
| | | toast.error("未查询到条码信息"); |
| | | return; |
| | | } |
| | | |
| | | tagData = list[0]; |
| | | needContractCheck = true; // 只有绞线需要做合同号校验 |
| | | } else { |
| | | // ===== 单丝拉丝二维码逻辑(纯字符串) ===== |
| | | // 示例:ZD7z30202616101201#[@]01,Φ5.6,-,750826011001001,600.6 |
| | |
| | | return; |
| | | } |
| | | |
| | | // 调用拉丝接口:GET /mes/app/getTagByLsMonofilamentNumber?monofilamentNumber=xxxx |
| | | const { data } = await OutboundApi.getTagByLsMonofilamentNumber({ |
| | | monofilamentNumber, |
| | | }); |
| | | // 调用拉丝接口:GET /mes/app/getTagByMonofilamentNumber?monofilamentNumber=xxxx |
| | | let data; |
| | | try { |
| | | const response = await OutboundApi.getTagByMonofilamentNumber({ |
| | | monofilamentNumber, |
| | | }); |
| | | data = response.data; |
| | | } catch { |
| | | data = null; |
| | | } |
| | | |
| | | const list = Array.isArray(data) ? data : data ? [data] : []; |
| | | if (!list.length) { |
| | | toast.error("未查询到条码信息"); |
| | | const formattedMonofilamentNumber = handleMonofilamentNumber(monofilamentNumber); |
| | | if (!formattedMonofilamentNumber) { |
| | | return; |
| | | } |
| | | const newItem = { |
| | | id: monofilamentNumber || "-", |
| | | contractNo: "未在mes中生产", |
| | | monofilamentNumber: formattedMonofilamentNumber, |
| | | model: "-", |
| | | weight: "-", |
| | | clienteleName: "-", |
| | | actuallyLength: "-", |
| | | productionDate: "-", |
| | | type: "", |
| | | devicemodel: "", |
| | | state: "", |
| | | projectId: "", |
| | | productuser: "", |
| | | rawData: null, |
| | | scanCode: scanText, |
| | | scanTime: formatTime(new Date()), |
| | | isMesMissing: true, |
| | | }; |
| | | goodsList.value.push(newItem); |
| | | toast.success("扫码成功"); |
| | | return; |
| | | } |
| | | |
| | |
| | | const requestData = goodsList.value.map((item) => ({ |
| | | outPutId: item.id, |
| | | projectId: item.projectId || "", |
| | | monofilamentNumber: item.monofilamentNumber || "", |
| | | })); |
| | | |
| | | // 按出库单明细构建请求体 |
| | |
| | | try { |
| | | // 如果是编码过的(包含 %),decode 一次;否则直接返回 |
| | | return val.includes("%") ? decodeURIComponent(val) : val; |
| | | } catch (e) { |
| | | } catch { |
| | | return val; |
| | | } |
| | | }; |