Browse Source

feat: update

Hu Cheng 2 years ago
parent
commit
09de86ce7c

+ 2 - 1
.env.production

@@ -1,2 +1,3 @@
 VITE_API_BASE_URL="https://coldverify.coldbaozhida.com/api"
-VITE_API_LOCAL_BASE_URL="http://coldverifylocal.coldbaozhida.com/api"
+VITE_API_LOCAL_BASE_URL="http://192.168.1.23:6400"
+VITE_API_COLD_BASE_URL="https://cold.coldbaozhida.com/api"

+ 27 - 0
src/api/modules/TaskData.js

@@ -63,3 +63,30 @@ export const addTaskData = (data) => {
     data,
   });
 };
+
+// 任务数据(编辑)
+export const editTaskData = (data) => {
+  return service.request({
+    method: "POST",
+    url: `${localBaseUrl}/TaskData/Up`,
+    data,
+  });
+};
+
+// 任务数据(编辑)
+export const deleteTaskData = (data) => {
+  return service.request({
+    method: "POST",
+    url: `${localBaseUrl}/TaskData/Del`,
+    data,
+  });
+};
+
+// 任务数据(导出excel)
+export const exportTaskData = (data) => {
+  return service.request({
+    method: "POST",
+    url: `${localBaseUrl}/TaskData/Export_Data_Excel`,
+    data,
+  });
+};

+ 19 - 37
src/layout/index.vue

@@ -1,47 +1,29 @@
 <template>
-  <n-layout
-    has-sider
-    position="absolute"
-    style="top: 0; right: 0; bottom: 0; left: 0"
-  >
-    <n-config-provider :theme="darkTheme">
-      <n-layout-sider
-        collapse-mode="transform"
-        :collapsed-width="0"
-        show-trigger="bar"
-        :native-scrollbar="false"
-        class="h-full"
-      >
+  <n-layout position="absolute" style="top: 0; right: 0; bottom: 0; left: 0">
+    <n-layout-header class="h-16 px-6" bordered>
+      <n-space justify="space-between" align="center" class="h-full">
         <h2 class="text-center leading-[64px]">冷链验证报告生成系统</h2>
-        <MenuComponent />
-      </n-layout-sider>
-    </n-config-provider>
-    <n-layout>
-      <n-layout-header class="h-16 px-6" bordered>
-        <n-space justify="end" align="center" class="h-full">
-          <n-dropdown trigger="hover" :options="options" @select="handleSelect">
-            <n-avatar round class="cursor-pointer"> {{ username }} </n-avatar>
-          </n-dropdown>
-        </n-space>
-      </n-layout-header>
-      <n-layout-content
-        content-style="padding: 24px; background-color: #f0f2f5"
-        :native-scrollbar="false"
+        <n-dropdown trigger="hover" :options="options" @select="handleSelect">
+          <n-avatar round class="cursor-pointer"> {{ username }} </n-avatar>
+        </n-dropdown>
+      </n-space>
+    </n-layout-header>
+    <n-layout-content
+      content-style="padding: 24px; background-color: #f0f2f5"
+      :native-scrollbar="false"
+    >
+      <n-card
+        :bordered="false"
+        style="height: calc(100vh - 112px); min-height: 600px"
       >
-        <n-card
-          :bordered="false"
-          style="height: calc(100vh - 112px); min-height: 600px"
-        >
-          <RouterView />
-        </n-card>
-      </n-layout-content>
-    </n-layout>
+        <RouterView />
+      </n-card>
+    </n-layout-content>
   </n-layout>
 </template>
 
 <script setup>
-import { darkTheme, NIcon } from "naive-ui";
-import MenuComponent from "@/layout/components/menu/index.vue";
+import { NIcon } from "naive-ui";
 import { removeToken } from "@/utils/storage/sessionToken";
 import { LogoutOutlined as LogoutIcon } from "@vicons/antd";
 

+ 1 - 1
src/utils/axios.js

@@ -12,7 +12,7 @@ const showMessage = (res) => {
 
 const service = axios.create({
   baseURL: import.meta.env.VITE_API_BASE_URL,
-  timeout: 60000 * 15,
+  timeout: 1000 * 60 * 8,
 });
 
 // 添加请求拦截器

+ 96 - 32
src/views/project/certificate/index.vue

@@ -1,33 +1,62 @@
 <template>
   <n-space vertical>
-    <n-space justify="space-between">
+    <n-space>
+      <n-button text style="font-size: 24px" @click="$router.back">
+        <n-icon>
+          <ArrowLeftOutlined />
+        </n-icon>
+      </n-button>
       <n-breadcrumb>
         <n-breadcrumb-item>任务管理</n-breadcrumb-item>
         <n-breadcrumb-item>校准证书</n-breadcrumb-item>
       </n-breadcrumb>
-      <n-button type="primary" @click="showEditModal">编辑</n-button>
-    </n-space>
-    <n-descriptions bordered>
-      <n-descriptions-item label="报告名称">
-        {{ taskInfo.T_name }}
-      </n-descriptions-item>
-      <n-descriptions-item label="创建时间">
-        {{ taskInfo.CreateTime }}
-      </n-descriptions-item>
-      <n-descriptions-item label="修改时间">
-        {{ taskInfo.UpdateTime }}
-      </n-descriptions-item>
-    </n-descriptions>
-    <n-space justify="end">
-      <n-button text style="font-size: 24px" @click="onPrint">
-        <n-icon>
-          <printer-icon />
-        </n-icon>
-      </n-button>
     </n-space>
-    <n-scrollbar style="max-height: 550px" trigger="none">
-      <vue-pdf-embed ref="pdfRef" :source="taskInfo.T_pdf3" />
-    </n-scrollbar>
+    <n-grid x-gap="12" :cols="4">
+      <n-gi>
+        <n-card>
+          <n-list>
+            <template #header>
+              <n-button type="primary" @click="showAddModal">添加</n-button>
+            </template>
+            <template v-for="item of []" :key="item">
+              <n-list-item>
+                <template #suffix>
+                  <n-button type="error" size="small">删除</n-button>
+                </template>
+                123
+              </n-list-item>
+            </template>
+          </n-list>
+        </n-card>
+      </n-gi>
+      <n-gi :span="3">
+        <n-card>
+          <n-space vertical>
+            <n-descriptions bordered>
+              <n-descriptions-item label="报告名称">
+                {{ taskInfo.T_name }}
+              </n-descriptions-item>
+              <n-descriptions-item label="创建时间">
+                {{ taskInfo.CreateTime }}
+              </n-descriptions-item>
+              <n-descriptions-item label="修改时间">
+                {{ taskInfo.UpdateTime }}
+              </n-descriptions-item>
+            </n-descriptions>
+            <div class="flex justify-end">
+              <n-button text style="font-size: 24px" @click="onPrint">
+                <n-icon>
+                  <printer-icon />
+                </n-icon>
+              </n-button>
+            </div>
+            <n-scrollbar style="max-height: 550px" trigger="none">
+              <vue-pdf-embed ref="pdfRef" :source="taskInfo.T_pdf3" />
+            </n-scrollbar>
+          </n-space>
+        </n-card>
+      </n-gi>
+    </n-grid>
   </n-space>
   <n-modal
     :show-icon="false"
@@ -38,15 +67,41 @@
     negative-text="取消"
     @positive-click="editTaskInfo"
   >
-    <n-upload :default-upload="false" :max="1" @change="handleChange">
-      <n-button>选择文件</n-button>
-    </n-upload>
+    <n-form
+      ref="formRef"
+      :model="model"
+      :rules="rules"
+      label-placement="left"
+      label-width="auto"
+      require-mark-placement="right-hanging"
+      :size="size"
+      :style="{
+        maxWidth: '640px',
+      }"
+    >
+      <n-form-item label="名称" path="T_name">
+        <n-input v-model:value="formValue.T_name" />
+      </n-form-item>
+    </n-form>
+    <n-form-item label="上传文件" required>
+      <n-upload :default-upload="false" :max="1" @change="handleChange">
+        <n-button>
+          <template #icon>
+            <n-icon><upload-icon /></n-icon>
+          </template>
+        </n-button>
+      </n-upload>
+    </n-form-item>
   </n-modal>
 </template>
 
 <script setup>
 import VuePdfEmbed from "vue-pdf-embed";
-import { PrinterOutlined as PrinterIcon } from "@vicons/antd";
+import {
+  PrinterOutlined as PrinterIcon,
+  ArrowLeftOutlined,
+  UploadOutlined as UploadIcon,
+} from "@vicons/antd";
 import { editTask, getTask, getUpFileToken } from "@/api";
 import * as qiniu from "qiniu-js";
 
@@ -58,6 +113,9 @@ const message = useMessage();
 
 const pdfRef = ref(null);
 
+//
+const pdfList = ref([]);
+
 // 任务信息
 const taskInfo = ref({});
 
@@ -69,7 +127,8 @@ const modal = reactive({
 
 // 表单数据
 const formValue = reactive({
-  T_pdf3: null,
+  T_name: "",
+  T_pdf3: [],
 });
 
 // 打印pdf
@@ -98,14 +157,15 @@ const handleChange = async ({ file }) => {
       message.error("上传失败");
     },
     complete: (res) => {
-      formValue.T_pdf3 = res.key;
+      formValue.T_pdf3 = [`${res.key}-${formValue.T_name}`];
+      console.log(formValue);
     },
   });
 };
 
 // 显示添加
-const showEditModal = () => {
-  modal.title = "编辑";
+const showAddModal = () => {
+  modal.title = "新增";
   modal.showModal = true;
 };
 
@@ -113,7 +173,7 @@ const showEditModal = () => {
 const editTaskInfo = async () => {
   const { data: res } = await editTask({
     T_task_id: task.T_task_id,
-    T_pdf3: formValue.T_pdf3,
+    T_pdf3: `${taskInfo.value.T_pdf3}|${formValue.T_pdf3}`,
   });
   message.success(res.Msg);
   getTaskInfo();
@@ -125,6 +185,10 @@ const getTaskInfo = async () => {
     T_task_id: task.T_task_id,
   });
   taskInfo.value = res.Data;
+  pdfList.value = res.Data.T_pdf3.split("|");
+  const str1 =
+    "https://bzdcoldverifyoss.baozhida.cn/UpImage/1678870726ff1c8023-2cda-405f-945e-ffcaa4fa3abc.pdf-123";
+  console.log(str1.endsWith("pdf"));
 };
 
 // 获取上传token

+ 12 - 4
src/views/project/data/checkout/index.vue

@@ -1,9 +1,16 @@
 <template>
   <n-space vertical>
-    <n-breadcrumb>
-      <n-breadcrumb-item>任务管理</n-breadcrumb-item>
-      <n-breadcrumb-item>数据校验</n-breadcrumb-item>
-    </n-breadcrumb>
+    <n-space>
+      <n-button text style="font-size: 24px" @click="$router.back">
+        <n-icon>
+          <ArrowLeftOutlined />
+        </n-icon>
+      </n-button>
+      <n-breadcrumb>
+        <n-breadcrumb-item>任务管理</n-breadcrumb-item>
+        <n-breadcrumb-item>数据校验</n-breadcrumb-item>
+      </n-breadcrumb>
+    </n-space>
     <n-data-table
       remote
       :columns="columns"
@@ -19,6 +26,7 @@
 import { h } from "vue";
 import { checkTaskData } from "@/api";
 import { NTag } from "naive-ui";
+import { ArrowLeftOutlined } from "@vicons/antd";
 
 const task = window.sessionStorage.getItem("task")
   ? JSON.parse(window.sessionStorage.getItem("task"))

+ 7 - 2
src/views/project/data/edit/AddVue.vue

@@ -53,7 +53,12 @@ import { getTaskDataClassList, addTaskData } from "@/api";
 
 // const emit = defineEmits(["submit"]);
 
-const props = defineProps(["task"]);
+const props = defineProps({
+  task: {
+    required: true,
+    default: {},
+  },
+});
 
 const message = useMessage();
 
@@ -133,7 +138,7 @@ const getClassList = async () => {
   const { data: res } = await getTaskDataClassList({
     T_task_id: props.task.T_task_id,
   });
-  options.value = res.Data;
+  options.value = res.Data !== null ? res.Data : [];
 };
 
 getClassList();

+ 122 - 0
src/views/project/data/edit/ExportVue.vue

@@ -0,0 +1,122 @@
+<template>
+  <n-button type="primary" @click="showImportModal">导出数据</n-button>
+  <n-modal
+    style="width: 30%"
+    v-model:show="showModal"
+    :show-icon="false"
+    preset="dialog"
+    title="导出"
+    positive-text="确认"
+    negative-text="取消"
+    @positive-click="exportTask"
+  >
+    <n-form
+      ref="formRef"
+      :model="formValue"
+      :rules="rules"
+      label-placement="left"
+      label-width="auto"
+    >
+      <n-form-item label="SN" path="T_sn_list">
+        <n-select
+          v-model:value="formValue.T_sn_list"
+          label-field="T_sn"
+          value-field="T_sn"
+          :options="options"
+          multiple
+          clearable
+        />
+      </n-form-item>
+      <n-form-item label="开始时间" path="Time_start">
+        <n-date-picker
+          v-model:formatted-value="formValue.Time_start"
+          value-format="yyyy.MM.dd HH:mm:ss"
+          type="datetime"
+          clearable
+          class="w-full"
+        />
+      </n-form-item>
+      <n-form-item label="结束时间" path="Time_end">
+        <n-date-picker
+          v-model:formatted-value="formValue.Time_end"
+          value-format="yyyy.MM.dd HH:mm:ss"
+          type="datetime"
+          clearable
+          class="w-full"
+        />
+      </n-form-item>
+    </n-form>
+  </n-modal>
+</template>
+
+<script setup>
+import { exportTaskData } from "@/api";
+
+const props = defineProps({
+  task: {
+    required: true,
+    default: {},
+  },
+  classList: {
+    required: true,
+    default: [],
+  },
+});
+
+const options = computed(() => {
+  return props.classList;
+});
+
+console.log(options);
+
+const message = useMessage();
+
+const formRef = ref(null);
+
+// 是否展示 Modal
+const showModal = ref(false);
+
+// 表单数据
+const formValue = reactive({
+  T_sn_list: [],
+  Time_start: null,
+  Time_end: null,
+});
+
+// 表单规则
+const rules = {
+  Time_start: {
+    required: true,
+    trigger: ["blur", "change"],
+    message: "不能为空",
+  },
+  Time_end: {
+    required: true,
+    trigger: ["blur", "change"],
+    message: "不能为空",
+  },
+  T_sn_list: {
+    type: "array",
+    required: true,
+    trigger: ["blur", "change"],
+    message: "不能为空",
+  },
+};
+
+// 显示导入
+const showImportModal = () => {
+  showModal.value = true;
+};
+
+const exportTask = async () => {
+  const { data: res } = await exportTaskData({
+    T_task_id: props.task.T_task_id,
+    T_sn_list: formValue.T_sn_list.join(),
+    Time_start: formValue.Time_start,
+    Time_end: formValue.Time_end,
+  });
+  location.href = res.Data;
+};
+</script>
+
+<style lang="scss" scoped></style>

+ 6 - 1
src/views/project/data/edit/ImportVue.vue

@@ -79,7 +79,12 @@
 <script setup>
 import { getV3DataList, addTaskData } from "@/api";
 
-const props = defineProps(["task"]);
+const props = defineProps({
+  task: {
+    required: true,
+    default: {}
+  }
+});
 
 const message = useMessage();
 

+ 155 - 41
src/views/project/data/edit/index.vue

@@ -1,9 +1,16 @@
 <template>
   <n-space vertical>
-    <n-breadcrumb>
-      <n-breadcrumb-item>任务管理</n-breadcrumb-item>
-      <n-breadcrumb-item>数据编辑</n-breadcrumb-item>
-    </n-breadcrumb>
+    <n-space>
+      <n-button text style="font-size: 24px" @click="$router.back">
+        <n-icon>
+          <ArrowLeftOutlined />
+        </n-icon>
+      </n-button>
+      <n-breadcrumb>
+        <n-breadcrumb-item>任务管理</n-breadcrumb-item>
+        <n-breadcrumb-item>数据编辑</n-breadcrumb-item>
+      </n-breadcrumb>
+    </n-space>
     <n-grid x-gap="12" :cols="4">
       <n-gi>
         <n-card>
@@ -61,8 +68,8 @@
                 clearable
               />
             </n-space>
-            <n-button type="primary">搜索</n-button>
-            <n-button type="primary">导出数据</n-button>
+            <n-button type="primary" @click="getDataList">搜索</n-button>
+            <ExportVue :task="task" :classList="classList" />
             <ImportVue :task="task" />
             <AddVue :task="task" />
             <SetVue />
@@ -85,28 +92,49 @@
       </n-gi>
     </n-grid>
   </n-space>
-  <n-modal v-model:show="showModal" :show-icon="false" preset="dialog">
-    <n-form-item>
-      <n-input v-model:value="formValue.value" />
-    </n-form-item>
+  <n-modal
+    v-model:show="modal.showModal"
+    :title="modal.title"
+    :show-icon="false"
+    preset="dialog"
+  >
+    <template v-if="modal.title === '温度'">
+      <n-form-item :rule="rule">
+        <n-input v-model:value="formValue.T_t" />
+      </n-form-item>
+    </template>
+    <template v-else>
+      <n-form-item :rule="rule">
+        <n-input v-model:value="formValue.T_rh" />
+      </n-form-item>
+    </template>
     <n-space justify="end">
-      <n-popconfirm @positive-click="handleDelete">
+      <n-popconfirm @positive-click="deleteTask">
         <template #trigger>
           <n-button type="error">删除该点</n-button>
         </template>
         是否确认删除?
       </n-popconfirm>
-      <n-button type="primary">确定</n-button>
+      <n-button type="primary" @click="editTask">确定</n-button>
     </n-space>
   </n-modal>
 </template>
 
 <script setup>
 import { Chart } from "highcharts-vue";
-import { getTaskDataClassList, getTaskDataList } from "@/api";
+import {
+  deleteTaskData,
+  editTaskData,
+  getTaskDataClassList,
+  getTaskDataList,
+} from "@/api";
 import AddVue from "./AddVue.vue";
 import ImportVue from "./ImportVue.vue";
 import SetVue from "./SetVue.vue";
+import ExportVue from "./ExportVue.vue";
+import { ArrowLeftOutlined } from "@vicons/antd";
+
+const message = useMessage();
 
 const task = window.sessionStorage.getItem("task")
   ? JSON.parse(window.sessionStorage.getItem("task"))
@@ -115,6 +143,20 @@ const task = window.sessionStorage.getItem("task")
 const chart1 = ref(null);
 const chart2 = ref(null);
 
+// Modal 数据源
+const modal = reactive({
+  showModal: false,
+  title: "",
+});
+
+const rule = {
+  T_t: {
+    required: true,
+    trigger: "blur",
+    message: "不能为空",
+  },
+};
+
 // 查询数据
 const queryData = reactive({
   T_task_id: task.T_task_id,
@@ -128,26 +170,19 @@ const queryData = reactive({
 
 // 表单数据
 const formValue = reactive({
-  value: null,
-  datetimeValue: null,
-  selectValue: null,
+  T_t: null,
+  T_rh: null,
 });
 
-// 表单规则
-const rules = {
-  datetimeValue: {
-    required: true,
-    trigger: "blur",
-    message: "不能为空",
-  },
-};
-
 // 设备列表
 const classList = ref([]);
 
 // 列表
 const dataList = ref([]);
 
+//
+const dataInfo = ref({});
+
 // 选项组受控模式下的值
 const checkValues = ref([]);
 
@@ -165,7 +200,60 @@ const onScroll = (e) => {
 const handleCheckAll = (checked) => {
   if (checked) {
     checkValues.value = classList.value.map((item) => item.T_id);
+    checkValues.value.forEach(async (item) => {
+      queryData.T_id = item;
+      await getDataList();
+      const data1 = dataList.value.map((item) => [
+        new Date(item.T_time).getTime(),
+        item.T_t,
+      ]);
+      const data2 = dataList.value.map((item) => [
+        new Date(item.T_time).getTime(),
+        item.T_rh,
+      ]);
+      chart1.value.chart.addSeries({
+        id: item,
+        name: item,
+        data: data1,
+        lineWidth: 1,
+        cursor: "pointer",
+        events: {
+          click(e) {
+            modal.title = "温度";
+            modal.showModal = true;
+            formValue.T_t = e.point.y;
+            queryData.T_id = e.point.series.name;
+            getDataList();
+            dataInfo.value = dataList.value[e.point.index];
+          },
+        },
+      });
+      chart2.value.chart.addSeries({
+        id: item,
+        name: item,
+        data: data2,
+        lineWidth: 1,
+        cursor: "pointer",
+        events: {
+          click(e) {
+            modal.title = "湿度";
+            modal.showModal = true;
+            formValue.T_rh = e.point.y;
+            queryData.T_id = e.point.series.name;
+            getDataList();
+            dataInfo.value = dataList.value[e.point.index];
+          },
+        },
+      });
+    });
   } else {
+    const arr = checkValues.value;
+    arr.forEach(async (item) => {
+      chart1.value.chart.get(item).remove();
+    });
+    arr.forEach(async (item) => {
+      chart2.value.chart.get(item).remove();
+    });
     checkValues.value = [];
   }
 };
@@ -180,10 +268,8 @@ const onUpdateValues = async (values, meta) => {
     new Date(item.T_time).getTime(),
     item.T_t,
   ]);
-  const data2 = dataList.value.map((item) => [
-    new Date(item.T_time).getTime(),
-    item.T_rh,
-  ]);
+  const data2 = dataList.value.map((item) => [new Date(item.T_time).getTime(), item.T_rh]);
+  console.log(data2);
   if (meta.actionType === "check") {
     chart1.value.chart.addSeries({
       id: meta.value,
@@ -192,8 +278,13 @@ const onUpdateValues = async (values, meta) => {
       lineWidth: 1,
       cursor: "pointer",
       events: {
-        click() {
-          showModal.value = true;
+        click(e) {
+          modal.title = "温度";
+          modal.showModal = true;
+          formValue.T_t = e.point.y;
+          queryData.T_id = e.point.series.name;
+          getDataList();
+          dataInfo.value = dataList.value[e.point.index];
         },
       },
     });
@@ -205,8 +296,12 @@ const onUpdateValues = async (values, meta) => {
       cursor: "pointer",
       events: {
         click(e) {
-          showModal.value = true;
-          console.log(e);
+          modal.title = "湿度";
+          modal.showModal = true;
+          formValue.T_rh = e.point.y;
+          queryData.T_id = e.point.series.name;
+          getDataList();
+          dataInfo.value = dataList.value[e.point.index];
         },
       },
     });
@@ -216,11 +311,6 @@ const onUpdateValues = async (values, meta) => {
   }
 };
 
-// 删除
-const handleDelete = () => {
-  console.log("delete");
-};
-
 // 图表配置
 const chartOptions1 = {
   xAxis: {
@@ -313,13 +403,37 @@ const chartOptions2 = {
   series: [],
 };
 
-// 是否展示 Modal
-const showModal = ref(false);
+// 删除
+const deleteTask = async () => {
+  const { data: res } = await deleteTaskData({
+    T_task_id: queryData.T_task_id,
+    Id: dataInfo.value.ID,
+  });
+  if (res.Code === 200) {
+    modal.showModal = false;
+    message.success(res.Msg);
+  }
+};
+
+// 编辑
+const editTask = async () => {
+  const { data: res } = await editTaskData({
+    T_task_id: queryData.T_task_id,
+    Id: dataInfo.value.ID,
+    T_t: formValue.T_t ? formValue.T_t : dataInfo.value.T_t,
+    T_rh: formValue.T_rh ? formValue.T_rh : dataInfo.value.T_rh,
+    T_time: dataInfo.value.T_time,
+  });
+  if (res.Code === 200) {
+    modal.showModal = false;
+    message.success(res.Msg);
+  }
+};
 
 // 获取设备列表
 const getClassList = async () => {
   const { data: res } = await getTaskDataClassList({
-    T_task_id: task.T_task_id,
+    T_task_id: queryData.T_task_id,
   });
   classList.value = res.Data ? res.Data : [];
 };

+ 12 - 6
src/views/project/data/source/index.vue

@@ -4,10 +4,17 @@
       {{ pinText }}
     </template>
     <n-space vertical>
-      <n-breadcrumb>
-        <n-breadcrumb-item>任务管理</n-breadcrumb-item>
-        <n-breadcrumb-item>数据来源</n-breadcrumb-item>
-      </n-breadcrumb>
+      <n-space>
+        <n-button text style="font-size: 24px" @click="$router.back">
+          <n-icon>
+            <ArrowLeftOutlined />
+          </n-icon>
+        </n-button>
+        <n-breadcrumb>
+          <n-breadcrumb-item>任务管理</n-breadcrumb-item>
+          <n-breadcrumb-item>数据编辑</n-breadcrumb-item>
+        </n-breadcrumb>
+      </n-space>
       <n-space>
         <n-form-item label="SN" label-placement="left">
           <n-input v-model:value="queryData.T_sn" />
@@ -96,6 +103,7 @@
 import { NSpace } from "naive-ui";
 import { extractTaskData, getTaskDataList, importTaskData } from "@/api";
 import { message } from "@/plugin/naive-ui";
+import { ArrowLeftOutlined } from "@vicons/antd";
 
 const notification = useNotification();
 
@@ -163,7 +171,6 @@ const handleSearch = () => {
 
 //
 const importTaskInfo = async () => {
-  pinShow.value = true;
   pinText.value = "正在打包数据";
   const { data: res } = await importTaskData({
     T_task_id: queryData.T_task_id,
@@ -200,7 +207,6 @@ const extractTaskInfo = async () => {
   } else {
     showModal.value = true;
   }
-  pinShow.value = false;
 };
 
 // 获取列表

+ 12 - 4
src/views/project/equipment/index.vue

@@ -1,9 +1,16 @@
 <template>
   <n-space vertical>
-    <n-breadcrumb>
-      <n-breadcrumb-item>任务管理</n-breadcrumb-item>
-      <n-breadcrumb-item>设备管理</n-breadcrumb-item>
-    </n-breadcrumb>
+    <n-space>
+      <n-button text style="font-size: 24px" @click="$router.back">
+        <n-icon>
+          <ArrowLeftOutlined />
+        </n-icon>
+      </n-button>
+      <n-breadcrumb>
+        <n-breadcrumb-item>任务管理</n-breadcrumb-item>
+        <n-breadcrumb-item>设备管理</n-breadcrumb-item>
+      </n-breadcrumb>
+    </n-space>
     <n-space justify="space-between">
       <n-input-group>
         <n-input
@@ -67,6 +74,7 @@ import {
   editDeviceClassList,
   deleteDeviceClassList,
 } from "@/api";
+import { ArrowLeftOutlined } from "@vicons/antd";
 
 const task = window.sessionStorage.getItem("task")
   ? JSON.parse(window.sessionStorage.getItem("task"))

+ 44 - 69
src/views/project/index.vue

@@ -9,15 +9,7 @@
 
 <script setup>
 import { h } from "vue";
-import {
-  NButton,
-  NSpace,
-  NCard,
-  NTag,
-  NGridItem,
-  NGrid,
-  NIcon,
-} from "naive-ui";
+import { NButton, NSpace, NCard, NTag, NIcon } from "naive-ui";
 import { getTaskList } from "@/api";
 import { ArrowRightOutlined as ArrowRightIcon } from "@vicons/antd";
 
@@ -51,6 +43,7 @@ const columns = [
   {
     title: "流程",
     key: "T_task_id",
+    width: 460,
     render(row) {
       return h(
         NSpace,
@@ -179,66 +172,48 @@ const columns = [
     title: "操作",
     key: "actions",
     render(row) {
-      return h(
-        NGrid,
-        {
-          xGap: 12,
-          yGap: 12,
-          cols: 4,
-        },
-        {
-          default: () =>
-            [
-              "实施方案",
-              "校准证书",
-              "设备管理",
-              "数据来源",
-              "数据编辑",
-              "数据校验",
-              "报告生成",
-              "报告审核",
-            ].map((item) =>
-              h(
-                NGridItem,
-                {},
-                {
-                  default: () =>
-                    h(
-                      NButton,
-                      {
-                        type: "primary",
-                        size: "small",
-                        onClick: () => {
-                          window.sessionStorage.setItem(
-                            "task",
-                            JSON.stringify(row)
-                          );
-                          if (item === "实施方案") {
-                            router.push("/scheme");
-                          } else if (item === "校准证书") {
-                            router.push("/certificate");
-                          } else if (item === "设备管理") {
-                            router.push("/equipment");
-                          } else if (item === "数据来源") {
-                            router.push("/data_source");
-                          } else if (item === "数据编辑") {
-                            router.push("/data_edit");
-                          } else if (item === "数据校验") {
-                            router.push("/data_checkout");
-                          } else if (item === "报告生成") {
-                            router.push("/report_create");
-                          } else {
-                            router.push("/report_audit");
-                          }
-                        },
-                      },
-                      { default: () => item }
-                    ),
-                }
-              )
-            ),
-        }
-      );
+      return h(NSpace, null, {
+        default: () =>
+          [
+            "实施方案",
+            "校准证书",
+            "设备管理",
+            "数据来源",
+            "数据编辑",
+            "数据校验",
+            "报告生成",
+            "报告审核",
+          ].map((item) =>
+            h(
+              NButton,
+              {
+                type: "primary",
+                size: "small",
+                onClick: () => {
+                  window.sessionStorage.setItem("task", JSON.stringify(row));
+                  if (item === "实施方案") {
+                    router.push("/scheme");
+                  } else if (item === "校准证书") {
+                    router.push("/certificate");
+                  } else if (item === "设备管理") {
+                    router.push("/equipment");
+                  } else if (item === "数据来源") {
+                    router.push("/data_source");
+                  } else if (item === "数据编辑") {
+                    router.push("/data_edit");
+                  } else if (item === "数据校验") {
+                    router.push("/data_checkout");
+                  } else if (item === "报告生成") {
+                    router.push("/report_create");
+                  } else {
+                    router.push("/report_audit");
+                  }
+                },
+              },
+              { default: () => item }
+            )
+          ),
+      });
     },
   },
 ];

+ 12 - 5
src/views/project/report/audit/index.vue

@@ -1,10 +1,17 @@
 <template>
   <n-space vertical>
     <n-space justify="space-between">
-      <n-breadcrumb>
-        <n-breadcrumb-item>任务管理</n-breadcrumb-item>
-        <n-breadcrumb-item>报告审核</n-breadcrumb-item>
-      </n-breadcrumb>
+      <n-space>
+        <n-button text style="font-size: 24px" @click="$router.back">
+          <n-icon>
+            <ArrowLeftOutlined />
+          </n-icon>
+        </n-button>
+        <n-breadcrumb>
+          <n-breadcrumb-item>任务管理</n-breadcrumb-item>
+          <n-breadcrumb-item>报告审核</n-breadcrumb-item>
+        </n-breadcrumb>
+      </n-space>
       <n-button type="primary" @click="handleCheck">审核</n-button>
     </n-space>
     <n-descriptions bordered>
@@ -65,7 +72,7 @@
 <script setup>
 import VuePdfEmbed from "vue-pdf-embed";
 import { getTask, updateTaskData } from "@/api";
-import { PrinterOutlined as PrinterIcon } from "@vicons/antd";
+import { PrinterOutlined as PrinterIcon, ArrowLeftOutlined } from "@vicons/antd";
 import TabFour from "./tab-four/index.vue";
 
 const dialog = useDialog();

+ 26 - 20
src/views/project/report/audit/tab-four/index.vue

@@ -1,22 +1,25 @@
 <template>
   <n-space vertical>
     <n-space>
-      <n-input
-        v-model:value="queryData.T_sn"
-        type="text"
-        placeholder="请输入SN"
-      />
-      <n-input
-        v-model:value="queryData.T_Class_id"
-        type="text"
-        placeholder="请输入设备编号"
-      />
-      <n-date-picker
-        value-format="yyyy.MM.dd HH:mm:ss"
-        type="daterange"
-        clearable
-      />
-      <n-button type="primary">搜索</n-button>
+      <n-space align="center">
+        <span>开始时间</span>
+        <n-date-picker
+          v-model:formatted-value="queryData.Time_start"
+          value-format="yyyy-MM-dd HH:mm:ss"
+          type="datetime"
+          clearable
+        />
+      </n-space>
+      <n-space align="center">
+        <span>结束时间</span>
+        <n-date-picker
+          v-model:formatted-value="queryData.Time_end"
+          value-format="yyyy-MM-dd HH:mm:ss"
+          type="datetime"
+          clearable
+        />
+      </n-space>
+      <n-button type="primary" @click="getDataList">搜索</n-button>
     </n-space>
     <n-data-table
       remote
@@ -36,9 +39,8 @@ const props = defineProps(["task"]);
 // 查询参数
 const queryData = reactive({
   T_task_id: props.task.T_task_id,
-  Time_start: "",
-  Time_end: "",
-  T_sn: "",
+  Time_start: null,
+  Time_end: null,
 });
 
 // 列表
@@ -78,7 +80,11 @@ const pagination = reactive({
 
 // 获取列表
 const getDataList = async () => {
-  const { data: res } = await extractTaskData(queryData);
+  const { data: res } = await extractTaskData({
+    ...queryData,
+    Time_start: queryData.Time_start !== null ? queryData.Time_start : "",
+    Time_end: queryData.Time_end !== null ? queryData.Time_end : "",
+  });
   dataList.value = res.Data ? res.Data : [];
 };
 

+ 12 - 5
src/views/project/report/create/index.vue

@@ -1,9 +1,16 @@
 <template>
   <n-space vertical>
-    <n-breadcrumb>
-      <n-breadcrumb-item>任务管理</n-breadcrumb-item>
-      <n-breadcrumb-item>报告生成</n-breadcrumb-item>
-    </n-breadcrumb>
+    <n-space>
+      <n-button text style="font-size: 24px" @click="$router.back">
+        <n-icon>
+          <ArrowLeftOutlined />
+        </n-icon>
+      </n-button>
+      <n-breadcrumb>
+        <n-breadcrumb-item>任务管理</n-breadcrumb-item>
+        <n-breadcrumb-item>报告生成</n-breadcrumb-item>
+      </n-breadcrumb>
+    </n-space>
     <n-scrollbar style="max-height: 650px">
       <div class="w-1/2 mx-auto">
         <n-form
@@ -168,7 +175,7 @@
 
 <script setup>
 import { getVerifyTemplateMapDataList } from "@/api";
-import { QuestionCircleOutlined as QuestionIcon } from "@vicons/antd";
+import { QuestionCircleOutlined as QuestionIcon, ArrowLeftOutlined } from "@vicons/antd";
 import { useTaskStore } from "@/store/task";
 
 const taskStore = useTaskStore();

+ 23 - 13
src/views/project/scheme/index.vue

@@ -1,10 +1,17 @@
 <template>
   <n-space vertical>
     <n-space justify="space-between">
-      <n-breadcrumb>
-        <n-breadcrumb-item>任务管理</n-breadcrumb-item>
-        <n-breadcrumb-item>实施方案</n-breadcrumb-item>
-      </n-breadcrumb>
+      <n-space>
+        <n-button text style="font-size: 24px" @click="$router.back">
+          <n-icon>
+            <ArrowLeftOutlined />
+          </n-icon>
+        </n-button>
+        <n-breadcrumb>
+          <n-breadcrumb-item>任务管理</n-breadcrumb-item>
+          <n-breadcrumb-item>实施方案</n-breadcrumb-item>
+        </n-breadcrumb>
+      </n-space>
       <n-space>
         <n-button type="primary" @click="showPutModal">生成方案</n-button>
         <n-button type="primary" @click="showUploadModal"
@@ -32,7 +39,7 @@
             <n-popover trigger="hover">
               <template #trigger>
                 <n-icon size="20" class="ml-3">
-                  <QuestionCircleOutlined />
+                  <info-icon />
                 </n-icon>
               </template>
               <n-image width="200" :src="item.T_text" />
@@ -48,7 +55,7 @@
             <n-popover trigger="hover">
               <template #trigger>
                 <n-icon size="20" class="ml-3">
-                  <QuestionCircleOutlined />
+                  <info-icon />
                 </n-icon>
               </template>
               <n-image width="200" :src="item.T_text" />
@@ -87,7 +94,7 @@
             <n-popover trigger="hover">
               <template #trigger>
                 <n-icon size="20" class="ml-3">
-                  <QuestionCircleOutlined />
+                  <info-icon />
                 </n-icon>
               </template>
               <n-image width="200" :src="item.T_text" />
@@ -108,7 +115,7 @@
             <n-popover trigger="hover">
               <template #trigger>
                 <n-icon size="20" class="ml-3">
-                  <QuestionCircleOutlined />
+                  <info-icon />
                 </n-icon>
               </template>
               <n-image width="200" :src="item.T_text" />
@@ -131,7 +138,7 @@
             <n-popover trigger="hover">
               <template #trigger>
                 <n-icon size="20" class="ml-3">
-                  <QuestionCircleOutlined />
+                  <info-icon />
                 </n-icon>
               </template>
               <n-image width="200" :src="item.T_text" />
@@ -153,7 +160,7 @@
             <n-popover trigger="hover">
               <template #trigger>
                 <n-icon size="20" class="ml-3">
-                  <QuestionCircleOutlined />
+                  <info-icon />
                 </n-icon>
               </template>
               <n-image width="200" :src="item.T_text" />
@@ -176,7 +183,7 @@
             <n-popover trigger="hover">
               <template #trigger>
                 <n-icon size="20" class="ml-3">
-                  <QuestionCircleOutlined />
+                  <info-icon />
                 </n-icon>
               </template>
               <n-image width="200" :src="item.T_text" />
@@ -199,7 +206,7 @@
             <n-popover trigger="hover">
               <template #trigger>
                 <n-icon size="20" class="ml-3">
-                  <QuestionCircleOutlined />
+                  <info-icon />
                 </n-icon>
               </template>
               <n-image width="200" :src="item.T_text" />
@@ -253,7 +260,10 @@ import {
   putVerifyTemplateMapData,
   editTask,
 } from "@/api";
-import { QuestionCircleOutlined } from "@vicons/antd";
+import {
+  InfoCircleOutlined as InfoIcon,
+  ArrowLeftOutlined,
+} from "@vicons/antd";
 import * as qiniu from "qiniu-js";
 import { getToken } from "@/utils/storage/sessionToken";
 import { useTaskStore } from "@/store/task";

+ 4 - 1
vite.config.js

@@ -8,7 +8,10 @@ import WindiCSS from "vite-plugin-windicss";
 
 // https://vitejs.dev/config/
 export default defineConfig({
-  base: "",
+  server: {
+    host: true,
+  },
+  base: "./",
   plugins: [
     vue(),
     WindiCSS(),