spring
2025-11-20 5b62f70d5df5731a571d709f0f9ff312a7cec5dc
src/pages/production/twist/report/index.vue
@@ -2,9 +2,31 @@
  <view class="list">
    <z-paging ref="pagingRef" v-model="twistReportList" :fixed="false" @query="getTwistReportList">
      <template #top>
        <CardTitle title="报工信息" :hideAction="true" :full="false" @action="addReport" />
        <CardTitle title="报工信息" :hideAction="false" :full="false">
          <template #action>
            <wd-button
              icon="chart"
              :round="false"
              size="small"
              plain
              style="margin-right: 10px"
              @click="handleSelfCheck"
            >
              自检
            </wd-button>
            <wd-button
              icon="file-add"
              :round="false"
              size="small"
              custom-class="add_btn"
              @click="addReport"
            >
              新增
            </wd-button>
          </template>
        </CardTitle>
      </template>
      <wd-card v-for="(item, index) in twistReportList" type="rectangle" custom-class="round">
      <wd-card v-for="item in twistReportList" :key="item.id" type="rectangle" custom-class="round">
        <template #title>
          <view class="flex justify-between">
            <view>
@@ -12,12 +34,15 @@
              <text class="text-[#0D867F] ml-2 font-medium">生产人</text>
              <text class="text-[#333333] ml-2">{{ item.productUser }}</text>
            </view>
            <view class="text-[#A8A8A8]" @click="toEdit">编辑</view>
            <!-- <view class="text-[#A8A8A8]" @click="toEdit">编辑</view> -->
          </view>
        </template>
        <ProductionCard :data="cardAttr" :value="item" />
        <TwistReportCard :data="cardAttr" :value="item" />
        <template #footer>
          <wd-button size="small" plain @click="toCheck(item.id)">自检</wd-button>
          <wd-button size="small" plain style="margin-right: 10px" @click="toAttachment(item)">
            附件
          </wd-button>
          <wd-button size="small" plain type="error" @click="handleDelete(item)">删除</wd-button>
        </template>
      </wd-card>
    </z-paging>
@@ -27,7 +52,21 @@
        <wd-button type="text" @click="cancel">取消</wd-button>
        <wd-button type="text" @click="submit">确定</wd-button>
      </view>
      <TwistForm ref="twistFormRef" />
      <TwistForm
        ref="twistFormRef"
        :first-tare-value="twistReportList.length > 0 ? twistReportList[0].tare : undefined"
        :team-id="teamId"
        :is-first-report="twistReportList.length === 0"
      />
    </wd-popup>
    <wd-popup v-model="drawFormRef.visible" position="bottom" custom-class="yl-popup">
      <Draw
        :single-regulation-info-array="drawData.singleRegulationInfoArray"
        :steel-regulation-info="drawData.steelRegulationInfo"
        :reel-tooling-info="drawData.reelToolingInfo"
        :wire-id="drawData.wireId"
        @close="handleDrawClose"
      />
    </wd-popup>
    <wd-toast />
  </view>
@@ -35,11 +74,25 @@
<script setup lang="ts">
import CardTitle from "@/components/card-title/index.vue";
import TwistForm from "./form.vue";
import { useToast } from "wot-design-uni";
import ProductionCard from "../../components/ProductionCard.vue";
import { useToast, dayjs } from "wot-design-uni";
import TwistReportCard from "../components/TwistReportCard.vue";
import { onLoad } from "@dcloudio/uni-app";
import { ref, reactive, nextTick } from "vue";
import ManageApi from "@/api/product/manage";
import TwistApi from "@/api/product/twist";
import Draw from "./draw.vue";
import HomeApi from "@/api/home";
import { setTeamId, getTeamId, setPrepareId } from "@/utils/cache";
const drawFormRef = reactive({
  visible: false,
});
// 处理draw组件关闭事件
const handleDrawClose = () => {
  // 确保弹窗被正确关闭
  drawFormRef.visible = false;
};
const pagingRef = ref();
const paramsId = ref();
const twistFormRef = ref();
@@ -47,39 +100,95 @@
const dialog = reactive({
  visible: false,
});
const drawData = ref({
  singleRegulationInfoArray: [],
  steelRegulationInfo: {
    model: "",
    twistedDirection: "",
    outerDiameter: "",
    scratch: "",
    oilStain: "",
  },
  reelToolingInfo: {
    nutFixed: "",
    sidePlateFlat: "",
    centerPlateFlat: "",
    paintQuality: "",
    burrCrack: "",
    edgeBlunt: "",
    woodMold: "",
    weldQuality: "",
  },
  wireId: "",
});
const cardAttr = ref<any[]>([
  {
    label: "领用杆号",
    prop: "poleNumber",
  },
  {
    label: "杆重(kg)",
    prop: "poleWeight",
  },
  {
    label: "单丝盘号",
    label: "批次号",
    prop: "monofilamentNumber",
    span: 24,
  },
  {
    label: "实际重量(kg)",
    prop: "actuallyWeight",
    label: "质量追溯号",
    prop: "systemNo",
    span: 24,
  },
  {
    label: "盘长(m)",
    prop: "ontLength",
  },
  {
    label: "理论重量(kg)",
    prop: "theoryWeight",
    prop: "oneLength",
  },
  {
    label: "规格型号",
    prop: "model",
  },
  {
    label: "生产长度(m)",
    prop: "actuallyLength",
  },
  {
    label: "盘具皮重(kg)",
    prop: "tare",
  },
  {
    label: "生产日期",
    prop: "productTime",
    span: 24,
  },
  {
    label: "加工时间(h)",
    prop: "processHour",
  },
]);
const twistReportList = ref<any[]>([]);
const teamId = ref<string | number | null>(null);
// 获取并缓存班组ID和生产准备ID
const initTeamId = async () => {
  // 先尝试从缓存获取
  const cachedTeamId = getTeamId();
  if (cachedTeamId) {
    teamId.value = cachedTeamId;
  }
  // 调用接口获取最新数据
  try {
    const { data } = await HomeApi.getIndex();
    if (data) {
      // 存储班组ID
      if (data.id) {
        teamId.value = data.id;
        setTeamId(data.id);
      }
      // 存储生产准备ID
      if (data.prepareId) {
        setPrepareId(data.prepareId);
      }
    }
  } catch (error) {
    console.error("获取数据失败:", error);
  }
};
const toEdit = () => {
  uni.navigateTo({
@@ -87,24 +196,163 @@
  });
};
const addReport = () => {
  dialog.visible = true;
// 主表数据
const mainTableData = ref<any>({});
// 获取主表数据
const getMainTableData = async () => {
  try {
    const { data } = await TwistApi.getTwistDetailById({
      id: paramsId.value,
    });
    mainTableData.value = {
      model: data.model,
      totalLength: data.totalLength,
      systemNo: data.systemNo,
    };
    // 设置主表数据到表单组件
    if (twistFormRef.value) {
      twistFormRef.value.setMainTableData(mainTableData.value);
    }
  } catch (error) {
    console.error("获取主表数据失败:", error);
  }
};
const submit = () => {
  dialog.visible = twistFormRef.value.submit();
const addReport = async () => {
  // 检查是否所有数据都已保存(都有id)
  if (twistReportList.value.length > 0 && twistReportList.value.every((item) => item.id)) {
    // 确保主表数据已获取
    if (!mainTableData.value.model) {
      await getMainTableData();
    }
    dialog.visible = true;
    // 等待弹窗打开后设置数据
    await nextTick();
    if (twistFormRef.value) {
      twistFormRef.value.setMainTableData(mainTableData.value);
    }
  } else if (twistReportList.value.length === 0) {
    // 确保主表数据已获取
    if (!mainTableData.value.model) {
      await getMainTableData();
    }
    dialog.visible = true;
    // 等待弹窗打开后设置数据
    await nextTick();
    if (twistFormRef.value) {
      twistFormRef.value.setMainTableData(mainTableData.value);
    }
  } else {
    toast.warning("请先保存本条数据,再新增");
  }
};
const submit = async () => {
  // 验证必填字段 - 根据参考代码,需要检查生产长度和盘具皮重
  const formData = twistFormRef.value?.getFormData?.() || {};
  const firstTareValue =
    twistReportList.value.length > 0 ? twistReportList.value[0].tare : undefined;
  if (!formData.actuallyLength) {
    toast.warning("请输入生产长度后再提交");
    return;
  }
  if (!formData.tare && !firstTareValue) {
    toast.warning("请输入盘具皮重后再提交");
    return;
  }
  const isSuccess = await twistFormRef.value.submit();
  if (isSuccess) {
    dialog.visible = false;
    // 提交成功后刷新列表
    pagingRef.value?.reload();
  }
};
const cancel = () => {
  toast.show("取消");
  dialog.visible = false;
};
const toCheck = (id: number) => {
const toAttachment = (item: any) => {
  uni.navigateTo({
    url: `/pages/production/twist/selfInspect/index?id=${id}`,
    url: "/pages/production/twist/attachment/index",
    success: () => {
      // 页面跳转成功后发送事件传递数据
      uni.$emit("detailData", item);
    },
  });
};
const showDrawPopup = async () => {
  try {
    const { data } = await TwistApi.querySingleDishInspection({
      id: paramsId.value,
    });
    // 适配不同的数据结构返回格式
    const responseData = data.data || data;
    if (responseData && responseData.singleWirePrePareInfoVo) {
      const info = responseData.singleWirePrePareInfoVo;
      drawData.value = {
        singleRegulationInfoArray: info.singleRegulationInfoArray || [],
        steelRegulationInfo: info.steelRegulationInfo || {},
        reelToolingInfo: info.reelToolingInfo || {},
        wireId: paramsId.value,
      };
      // 显示Draw弹窗
      drawFormRef.visible = true;
      toast.success("请填写领用信息!");
    } else {
      // toast.error("已存在领用信息,无需填报!");
    }
  } catch (error) {
    console.error("获取领用信息失败:", error);
    toast.error("获取信息失败,请重试");
  }
};
const handleSelfCheck = () => {
  // 跳转到自检页面,传递 wireId
  uni.navigateTo({
    url: `/pages/production/twist/selfInspect/index?id=${paramsId.value}`,
  });
};
// 删除报工记录
const handleDelete = (item: any) => {
  uni.showModal({
    title: "提示",
    content: "确定删除吗?",
    success: async (res) => {
      if (res.confirm) {
        try {
          if (item.id) {
            const { code } = await TwistApi.deleteWireOutput({ id: item.id });
            if (code == 200) {
              toast.success("删除成功");
              // 刷新列表
              pagingRef.value?.reload();
            } else {
              toast.error("删除失败");
            }
          } else {
            toast.warning("该记录尚未保存,无法删除");
          }
        } catch (error) {
          console.error("删除失败:", error);
          toast.error("删除失败,请重试");
        }
      }
    },
  });
};
// 保留原有的confirm函数,用于其他地方调用
// const confirm = async () => {
//   await showDrawPopup();
// };
// 获取拉丝报工列表
const getTwistReportList = async () => {
@@ -112,17 +360,30 @@
    wireId: paramsId.value,
    type: "绞线",
  });
  // 格式化生产日期
  if (Array.isArray(data)) {
    data.forEach((item: any) => {
      if (item.productTime) {
        item.productTime = dayjs(item.productTime).format("YYYY-MM-DD HH:mm:ss");
      }
    });
  }
  pagingRef.value.complete(data);
};
onLoad((options: any) => {
onLoad(async (options: any) => {
  paramsId.value = options.id;
  // 获取并缓存班组ID
  await initTeamId();
  // 获取主表数据
  await getMainTableData();
  showDrawPopup();
});
</script>
<style lang="scss" scoped>
.list {
  height: calc(100vh - 120px);
  height: calc(100vh - 80px);
  padding: 12px;
  background: #f3f9f8;