gaoluyang
7 天以前 a6fc4c9dfe7fae23229312c813f0b1e933d87d5b
宝东
1.计量器具台账报错
2.生产报工、生产排产完成进度改为四舍五入
已修改5个文件
287 ■■■■■ 文件已修改
src/api/equipmentManagement/measurementEquipment.js 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/equipmentManagement/measurementEquipment/filesDia.vue 88 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/equipmentManagement/measurementEquipment/index.vue 168 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/productionManagement/workOrderEdit/index.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/productionManagement/workOrderManagement/index.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/equipmentManagement/measurementEquipment.js
@@ -53,3 +53,30 @@
        data
    })
}
// 通用附件查询
export function getStorageAttachmentList(query) {
  return request({
    url: "/storageAttachment/list",
    method: "get",
    params: query,
  });
}
// 通用附件保存
export function addStorageAttachment(data) {
  return request({
    url: "/storageAttachment/add",
    method: "post",
    data: data,
  });
}
// 通用附件删除
export function delStorageAttachment(ids) {
  return request({
    url: "/storageAttachment/delete",
    method: "delete",
    data: ids,
  });
}
src/views/equipmentManagement/measurementEquipment/filesDia.vue
@@ -1,38 +1,16 @@
<template>
  <div>
    <el-dialog
        v-model="dialogFormVisible"
        title="上传附件"
        width="50%"
        @close="closeDia"
    >
    <el-dialog v-model="dialogFormVisible" title="上传附件" width="50%" @close="closeDia">
      <div style="margin-bottom: 10px;text-align: right">
        <el-upload
            v-model:file-list="fileList"
            class="upload-demo"
            :action="uploadUrl"
            :on-success="handleUploadSuccess"
            :on-error="handleUploadError"
            name="file"
            :show-file-list="false"
            :headers="headers"
            style="display: inline;margin-right: 10px"
        >
        <el-upload v-model:file-list="fileList" class="upload-demo" :action="uploadUrl"
          :on-success="handleUploadSuccess" :on-error="handleUploadError" name="files" :show-file-list="false"
          :headers="headers" style="display: inline;margin-right: 10px">
          <el-button type="primary">上传附件</el-button>
        </el-upload>
        <el-button type="danger" plain @click="handleDelete">删除</el-button>
      </div>
      <PIMTable
          rowKey="id"
          :column="tableColumn"
          :tableData="tableData"
          :page="page"
          :tableLoading="tableLoading"
          :isSelection="true"
          @selection-change="handleSelectionChange"
          @pagination="paginationSearch"
          height="500"
      >
      <PIMTable rowKey="id" :column="tableColumn" :tableData="tableData" :page="page" :tableLoading="tableLoading"
        :isSelection="true" @selection-change="handleSelectionChange" @pagination="paginationSearch" height="500">
      </PIMTable>
      <template #footer>
        <div class="dialog-footer">
@@ -51,10 +29,10 @@
import filePreview from '@/components/filePreview/index.vue'
import PIMTable from "@/components/PIMTable/PIMTable.vue";
import {
  fileAdd,
  fileDel,
  fileListPage
} from "@/api/financialManagement/revenueManagement.js";
  addStorageAttachment,
  delStorageAttachment,
  getStorageAttachmentList
} from "@/api/equipmentManagement/measurementEquipment.js";
const { proxy } = getCurrentInstance()
const emit = defineEmits(['close'])
@@ -101,7 +79,7 @@
const headers = ref({
  Authorization: "Bearer " + getToken(),
});
const uploadUrl = ref(import.meta.env.VITE_APP_BASE_API + "/file/upload"); // 上传的图片服务器地址
const uploadUrl = ref(import.meta.env.VITE_APP_BASE_API + "/common/upload"); // 上传的服务器地址
// 打开弹框
const openDialog = (row,type) => {
@@ -113,12 +91,13 @@
const paginationSearch = (obj) => {
    page.current = obj.page;
    page.size = obj.limit;
  // 前端分页暂不处理,直接调用获取全量列表
    getList();
};
const getList = () => {
  fileListPage({accountId: currentId.value,accountType:accountType.value, ...page}).then(res => {
    tableData.value = res.data.records;
        page.total = res.data.total;
  getStorageAttachmentList({ recordId: currentId.value, recordType: accountType.value }).then(res => {
    tableData.value = res.data;
    page.total = res.data ? res.data.length : 0;
  })
}
// 表格选择数据
@@ -134,22 +113,25 @@
// 上传成功处理
function handleUploadSuccess(res, file) {
  // 如果上传成功
  if (res.code == 200) {
    const fileRow = {}
    fileRow.name = res.data.originalName
    fileRow.url = res.data.tempPath
    uploadFile(fileRow)
  } else {
    proxy.$modal.msgError("文件上传失败");
  }
}
function uploadFile(file) {
  file.accountId = currentId.value;
  file.accountType = accountType.value;
  fileAdd(file).then(res => {
  if (res.code == 200 && res.data && res.data.length > 0) {
    const newFiles = res.data.map(item => ({
      ...item,
      name: item.originalFilename || item.name
    }));
    const mergedFiles = [...(tableData.value || []), ...newFiles];
    const storageAttachmentDTO = {
      recordType: accountType.value,
      recordId: currentId.value,
      application: "file",
      storageBlobDTOs: mergedFiles
    };
    addStorageAttachment(storageAttachmentDTO).then(r => {
    proxy.$modal.msgSuccess("文件上传成功");
    getList()
  })
  } else {
    proxy.$modal.msgError("文件上传失败");
  }
}
// 上传失败处理
function handleUploadError() {
@@ -163,7 +145,7 @@
const handleDelete = () => {
  let ids = [];
  if (selectedRows.value.length > 0) {
    ids = selectedRows.value.map((item) => item.id);
    ids = selectedRows.value.map((item) => item.storageAttachmentId);
  } else {
    proxy.$modal.msgWarning("请选择数据");
    return;
@@ -173,7 +155,7 @@
    cancelButtonText: "取消",
    type: "warning",
  }).then(() => {
    fileDel(ids).then((res) => {
    delStorageAttachment(ids).then((res) => {
      proxy.$modal.msgSuccess("删除成功");
      getList();
    });
@@ -191,6 +173,4 @@
});
</script>
<style scoped>
</style>
<style scoped></style>
src/views/equipmentManagement/measurementEquipment/index.vue
@@ -3,37 +3,48 @@
        <div class="search_form mb20">
            <div>
                <span class="search_title">录入日期:</span>
                <el-date-picker
                    v-model="searchForm.recordDate"
        <el-date-picker v-model="searchForm.recordDate"
                    value-format="YYYY-MM-DD"
                    format="YYYY-MM-DD"
                    type="date"
                    placeholder="请选择"
                    clearable
                    style="width: 160px"
                    @change="handleQuery"
                />
                        @change="handleQuery" />
                <span class="search_title ml10">计量器具编号:</span>
                <el-input v-model="searchForm.code" placeholder="请输入编号" clearable style="width: 240px" @change="handleQuery"/>
        <el-input v-model="searchForm.code"
                  placeholder="请输入编号"
                  clearable
                  style="width: 240px"
                  @change="handleQuery" />
                <span class="search_title ml10">状态:</span>
                <el-select v-model="searchForm.status" placeholder="请选择状态" @change="handleQuery" style="width: 160px" clearable>
                    <el-option label="有效" :value="1"></el-option>
                    <el-option label="逾期" :value="2"></el-option>
        <el-select v-model="searchForm.status"
                   placeholder="请选择状态"
                   @change="handleQuery"
                   style="width: 160px"
                   clearable>
          <el-option label="有效"
                     :value="1"></el-option>
          <el-option label="逾期"
                     :value="2"></el-option>
                </el-select>
                <el-button type="primary" @click="handleQuery" style="margin-left: 10px"
                >搜索</el-button
                >
                <el-button @click="handleReset" style="margin-left: 10px">重置</el-button>
        <el-button type="primary"
                   @click="handleQuery"
                   style="margin-left: 10px">搜索</el-button>
        <el-button @click="handleReset"
                   style="margin-left: 10px">重置</el-button>
            </div>
            <div>
                <el-button type="primary" @click="openForm('add')">新增计量器具</el-button>
                <el-button type="danger" plain @click="handleDelete">删除</el-button>
        <el-button type="primary"
                   @click="openForm('add')">新增计量器具</el-button>
        <el-button type="danger"
                   plain
                   @click="handleDelete">删除</el-button>
                <el-button @click="handleOut">导出</el-button>
            </div>
        </div>
        <div class="table_list">
            <PIMTable
                rowKey="id"
      <PIMTable rowKey="id"
                :column="tableColumn"
                :tableData="tableData"
                :page="page"
@@ -42,18 +53,26 @@
                :tableLoading="tableLoading"
                @pagination="pagination"
        :dbRowClick="dbRowClick"
        :rowClassName="rowClassName"
            ></PIMTable>
                :rowClassName="rowClassName"></PIMTable>
        </div>
        <form-dia ref="formDia" @close="handleQuery"></form-dia>
        <calibration-dia ref="calibrationDia" @close="handleQuery"></calibration-dia>
    <form-dia ref="formDia"
              @close="handleQuery"></form-dia>
    <calibration-dia ref="calibrationDia"
                     @close="handleQuery"></calibration-dia>
    <files-dia ref="filesDia"></files-dia>
    <rowClickDataForm ref="rowClickData"></rowClickDataForm>
    </div>
</template>
<script setup>
import {onMounted, ref, reactive, toRefs, getCurrentInstance, nextTick} from "vue";
  import {
    onMounted,
    ref,
    reactive,
    toRefs,
    getCurrentInstance,
    nextTick,
  } from "vue";
import FormDia from "@/views/equipmentManagement/measurementEquipment/components/formDia.vue";
import {ElMessageBox} from "element-plus";
import useUserStore from "@/store/modules/user.js";
@@ -63,9 +82,9 @@
  measuringInstrumentListPage,
} from "@/api/equipmentManagement/measurementEquipment.js";
import FilesDia from "./filesDia.vue";
import rowClickDataForm from "./components/rowClickData.vue"
  import rowClickDataForm from "./components/rowClickData.vue";
const { proxy } = getCurrentInstance();
const userStore = useUserStore()
  const userStore = useUserStore();
const data = reactive({
    searchForm: {
@@ -81,56 +100,56 @@
        label: "出厂编号",
        prop: "code",
    minWidth:150,
    align:"center"
      align: "center",
    },
  {
    label: "计量器具名称",
    prop: "name",
    width: '160px',
      width: "160px",
    align: "center",
  },
    {
        label: "检定单位",
        prop: "unit",
        width: 200,
    align:"center"
      align: "center",
    },
    {
        label: "证书编号",
        prop: "model",
        width:200,
    align:"center"
      align: "center",
    },
    {
        label: "最新鉴定日期",
        prop: "mostDate",
        width: 130,
    align:"center"
      align: "center",
    },
    {
        label: "录入人",
        prop: "userName",
        width: 130,
    align:"center"
      align: "center",
    },
    {
        label: "录入日期",
        prop: "recordDate",
    align:"center",
    minWidth: 130
      minWidth: 130,
    },
    {
        label: "有效日期",
        prop: "valid",
        width: 130,
    align:"center"
      align: "center",
    },
  {
    label: "状态",
    prop: "status",
    width: 130,
    align: "center",
    formatData: (params) => {
      formatData: params => {
      if (params === 1) {
        return "有效";
      } else if (params === 2) {
@@ -138,26 +157,26 @@
      } else {
        return null;
      }
    }
      },
  },
    {
        dataType: "action",
        label: "操作",
        align: "center",
        width: '130',
        fixed: 'right',
      width: "130",
      fixed: "right",
        operation: [
      {
          name: "附件",
          type: "text",
          clickFun: (row) => {
          clickFun: row => {
          openFilesFormDia(row);
          },
      },
            {
                name: "查看",
          name: "编辑",
                type: "text",
                clickFun: (row) => {
          clickFun: row => {
                    openCalibrationDia("verifying", row);
                },
            },
@@ -166,8 +185,8 @@
]);
const tableData = ref([]);
const tableLoading = ref(false);
const rowClickData = ref([])
const filesDia = ref()
  const rowClickData = ref([]);
  const filesDia = ref();
const page = reactive({
    current: 1,
    size: 100,
@@ -176,17 +195,17 @@
const selectedRows = ref([]);
// 打开附件弹框
const openFilesFormDia = (row) => {
    filesDia.value?.openDialog(row,'计量器具台账')
  const openFilesFormDia = row => {
    filesDia.value?.openDialog(row, "measuring_instrument_ledger");
};
const dbRowClick = (row)=>{
  rowClickData.value?.openDialog(row)
}
  const dbRowClick = row => {
    rowClickData.value?.openDialog(row);
  };
// 行样式:快到期(7天内)或逾期标红
const rowClassName = ({ row }) => {
  console.log('rowClassName called:', row);
    console.log("rowClassName called:", row);
  // valid 是有效天数,mostDate 是最新检定日期
  if (row.valid && row.mostDate) {
    const mostDate = new Date(row.mostDate);
@@ -197,24 +216,33 @@
    
    const now = new Date();
    const diffDays = Math.ceil((expireDate - now) / (1000 * 60 * 60 * 24));
    console.log('row:', row.code, 'validDays:', validDays, 'expireDate:', expireDate, 'diffDays:', diffDays);
      console.log(
        "row:",
        row.code,
        "validDays:",
        validDays,
        "expireDate:",
        expireDate,
        "diffDays:",
        diffDays
      );
    // 7天内到期或已逾期都标红
    if (diffDays <= 7) {
      console.log('return warning-row');
      return 'warning-row';
        console.log("return warning-row");
        return "warning-row";
    }
  } else {
    console.log('row missing valid or mostDate:', row.valid, row.mostDate);
      console.log("row missing valid or mostDate:", row.valid, row.mostDate);
  }
  return '';
}
    return "";
  };
// 表格选择数据
const handleSelectionChange = (selection) => {
  const handleSelectionChange = selection => {
    selectedRows.value = selection;
};
const formDia = ref()
const calibrationDia = ref()
  const formDia = ref();
  const calibrationDia = ref();
// 查询列表
/** 搜索按钮操作 */
@@ -231,39 +259,41 @@
    page.current = 1;
    getList();
};
const pagination = (obj) => {
  const pagination = obj => {
    page.current = obj.page;
    page.size = obj.limit;
    getList();
};
const getList = () => {
    tableLoading.value = true;
    measuringInstrumentListPage({ ...searchForm.value, ...page }).then((res) => {
    measuringInstrumentListPage({ ...searchForm.value, ...page })
      .then(res => {
        tableLoading.value = false;
        tableData.value = res.data.records;
        page.total = res.data.total;
    }).catch((err) => {
        tableLoading.value = false;
    })
      .catch(err => {
        tableLoading.value = false;
      });
};
// 打开弹框
const openForm = (type, row) => {
    nextTick(() => {
        formDia.value?.openDialog(type, row)
    })
      formDia.value?.openDialog(type, row);
    });
};
// 打开检定校准弹框
const openCalibrationDia = (type, row) => {
    nextTick(() => {
        calibrationDia.value?.openDialog(type, row)
    })
}
      calibrationDia.value?.openDialog(type, row);
    });
  };
const handleDelete = () => {
    let ids = [];
    if (selectedRows.value.length > 0) {
        ids = selectedRows.value.map((item) => item.id);
      ids = selectedRows.value.map(item => item.id);
    } else {
        proxy.$modal.msgWarning("请选择数据");
        return;
@@ -276,7 +306,7 @@
        .then(() => {
            tableLoading.value = true;
            measuringInstrumentDelete(ids)
                .then((res) => {
          .then(res => {
                    proxy.$modal.msgSuccess("删除成功");
                    getList();
                })
@@ -296,7 +326,11 @@
        type: "warning",
    })
        .then(() => {
            proxy.download("/measuringInstrumentLedger/export", {}, "计量器具台账.xlsx");
        proxy.download(
          "/measuringInstrumentLedger/export",
          {},
          "计量器具台账.xlsx"
        );
        })
        .catch(() => {
            proxy.$modal.msg("已取消");
src/views/productionManagement/workOrderEdit/index.vue
@@ -289,7 +289,7 @@
  if (!Number.isFinite(n)) return 0;
  if (n <= 0) return 0;
  if (n >= 100) return 100;
  return Math.round(n);
  return parseFloat(n.toFixed(2));
};
const progressColor = percentage => {
src/views/productionManagement/workOrderManagement/index.vue
@@ -526,7 +526,7 @@
  if (!Number.isFinite(n)) return 0;
  if (n <= 0) return 0;
  if (n >= 100) return 100;
  return Math.round(n);
    return parseFloat(n.toFixed(2));
};
const progressColor = percentage => {