Browse Source

feat: 二期问题修改

sunxiao 5 days ago
parent
commit
1133f1f897

+ 1 - 1
.env.test

@@ -2,7 +2,7 @@
 VITE_APP_TITLE = 智能国标化验室数据平台
 
 # 生产环境配置
-VITE_APP_ENV = 'production'
+VITE_APP_ENV = 'test'
 
 # 管理系统/生产环境
 VITE_APP_BASE_API = 'http://192.168.40.21:8889'

+ 4 - 1
src/layout/components/Navbar.vue

@@ -60,6 +60,7 @@ import RuoYiDoc from '@/components/RuoYi/Doc'
 import useAppStore from '@/store/modules/app'
 import useUserStore from '@/store/modules/user'
 import useSettingsStore from '@/store/modules/settings'
+import { getDeployBasePrefix } from '@/utils/environment';
 
 const appStore = useAppStore()
 const userStore = useUserStore()
@@ -88,8 +89,10 @@ function logout() {
     cancelButtonText: '取消',
     type: 'warning'
   }).then(() => {
+    // TODO: DELETE
     userStore.logOut().then(() => {
-      location.href = '/index';
+      // location.href = '/index';
+      location.href = import.meta.env.VITE_APP_ENV == 'test'? '/data/' : '/index';
     })
   }).catch(() => { });
 }

+ 5 - 1
src/router/index.js

@@ -2,6 +2,8 @@ import { createWebHashHistory, createRouter } from 'vue-router'
 /* Layout */
 import Layout from '@/layout'
 
+import { getDeployBasePrefix } from '@/utils/environment';
+
 /**
  * Note: 路由配置项
  *
@@ -161,7 +163,9 @@ export const dynamicRoutes = [
 ]
 
 const router = createRouter({
-  history: createWebHashHistory(),
+  // TODO: DELETE
+  // history: createWebHashHistory(),
+  history: createWebHashHistory(import.meta.env.VITE_APP_ENV == 'test' ? '/data/' : ''),
   routes: constantRoutes,
   scrollBehavior(to, from, savedPosition) {
     if (savedPosition) {

+ 8 - 0
src/utils/environment.js

@@ -0,0 +1,8 @@
+export const getDeployBasePrefix = (VITE_APP_ENV) => {
+  const ENV_BASE_PATH = {
+    development: '/',
+    test: '/data/',
+    production: '/'
+  }
+  return ENV_BASE_PATH[VITE_APP_ENV]
+}

+ 3 - 1
src/views/client/device/index.vue

@@ -9,6 +9,7 @@ const { proxy } = getCurrentInstance();
 const queryParams = ref({ 
   pageNum: 1,
   pageSize: 10,
+  deviceStatus: ''
  });
 
 const total = ref(0);
@@ -85,6 +86,7 @@ const handleReset = () => {
   queryParams.value = {
     pageNum: 1,
     pageSize: 10,
+    deviceStatus: ''
   }
   initPageData();
 }
@@ -168,7 +170,7 @@ onMounted(() => {
         </el-col>
         <el-col :span="6">
           <el-form-item label="设备状态">
-            <el-select v-model="queryParams.deviceStatus" placeholder="请选择设备状态" clearable>
+            <el-select v-model="queryParams.deviceStatus" placeholder="请选择设备状态" :empty-values="[null, undefined]">
               <el-option label="全部" value="" />
               <el-option v-for="item in deviceStatusOptions" :key="item.label" :label="item.label" :value="item.value" />
             </el-select>

+ 0 - 12
src/views/client/manage/index copy.vue

@@ -1,12 +0,0 @@
-<script setup lang="ts">
-
-</script>
-
-<template>
-
-
-</template>
-
-<style lang="scss" scoped>
-
-</style>

+ 6 - 9
src/views/client/manage/index.vue

@@ -53,9 +53,6 @@ const cascaderProps = {
   lazyLoad(node, resolve) {
     const { level } = node
     getRegion({ regionLevel: level + 1, parentId: node.data.regionId, pageSize: 100 }).then(({ rows }) => {
-
-      console.log( "rows", rows );
-
       const nodes = rows.map(item => {
         return {
           value: item.regionCod,
@@ -69,9 +66,9 @@ const cascaderProps = {
   },
 }
 
-// 新增机构
+// 新增集团
 const handleAddOrganization = () => {
-  formData.value = { ...formData.value, type: 0, title: "新增机构", isAdd: true }
+  formData.value = { ...formData.value, type: 0, title: "新增集团", isAdd: true }
   dialogVisible.value = true;
 }
 
@@ -89,7 +86,7 @@ const handleEditOrganizationOrFactory = (row) => {
     parentId: type == 0 ? 0 : parentId,
     parentName,
     type,
-    title: type == 0 ? "编辑机构" : "编辑水厂",
+    title: type == 0 ? "编辑集团" : "编辑水厂",
     regionList: [provinceCode, cityCode, countryCode]
   };
   dialogVisible.value = true;
@@ -166,7 +163,7 @@ const onChangeTag= (row) => {
   }).catch(() => {})
 }
 
-// 新增机构 - 保存
+// 新增集团 - 保存
 const handleDialogConfirm = async () => {
   if (!formRef.value) return
   await formRef.value.validate(async (valid, fields) => {
@@ -227,7 +224,7 @@ onMounted(() => {
         </el-col>
         <el-col :span="6">
           <el-form-item label="状态">
-            <el-select v-model="queryParams.status" placeholder="请选择状态" filterable clearable>
+            <el-select v-model="queryParams.status" placeholder="请选择状态" :empty-values="[null, undefined]">
               <el-option v-for="item in statusOptions" :key="item.label" :label="item.label" :value="item.value" />
             </el-select>
           </el-form-item>
@@ -243,7 +240,7 @@ onMounted(() => {
 
     <el-card shadow="never" :body-style="{ padding: '20px' }">
       <div class="flex justify-between items-center mb-[10px]">
-        <el-button type="primary" @click="handleAddOrganization" :loading="loading" :icon="CirclePlus">新增机构</el-button>
+        <el-button type="primary" @click="handleAddOrganization" :loading="loading" :icon="CirclePlus">新增集团</el-button>
       </div>
       <el-table :data="tableData" style="width: 100%" v-loading="tableLoading" row-key="id" border>
         <el-table-column prop="name" label="机构名称" width="280" fixed/>

+ 4 - 3
src/views/configuration/point/index.vue

@@ -146,9 +146,9 @@ onMounted(() => {
           </el-form-item>
         </el-col>
         <el-col :span="6">
-          <el-form-item label="设备SN" prop="deviceId">
+          <el-form-item label="设备SN / 名称" prop="deviceId">
             <el-select v-model="queryParams.deviceId" placeholder="请选择设备SN" filterable clearable>
-              <el-option v-for="item in deviceSelectOptions" :key="item.deviceId" :label="item.deviceName" :value="item.deviceId" />
+              <el-option v-for="item in deviceSelectOptions" :key="item.deviceId" :label="(item.deviceSn ? item.deviceSn + '-' : '') + item.deviceName  || ''" :value="item.deviceId" />
             </el-select>
           </el-form-item>
         </el-col>
@@ -167,7 +167,8 @@ onMounted(() => {
       </div>
       <el-table :data="tableData" style="width: 100%" v-loading="loading" row-key="id" border>
         <el-table-column prop="organization.name" label="所属水厂" width="220" fixed/>
-        <el-table-column prop="bizDevice.deviceName" label="所属设备SN" />
+        <el-table-column prop="bizDevice.deviceSn" label="所属设备SN" />
+        <el-table-column prop="bizDevice.deviceName" label="所属设备名称" />
         <el-table-column prop="name" label="取样点位名称"/>
         <el-table-column prop="code" label="取样点位编号"/>
         <el-table-column prop="createUser.userName" label="创建人"/>

+ 0 - 229
src/views/report/detection-month/index copy.vue

@@ -1,229 +0,0 @@
-<script setup>
-import { dayjs } from 'element-plus';
-import { getContinuousAssayListNew, getDeviceList } from '@/api/report/lab';
-
-const { proxy } = getCurrentInstance();
-
-const queryParams = ref({
-  pageNum: 1,
-  pageSize: 10,
-  deviceNo: '',
-  activeRadioName: 'daterange'
-});
-
-const tableLoading = ref(false);
-const loading = ref(false);
-
-const datePickerValue = ref([]);
-const tempDataValue = ref({timeBegin: dayjs(new Date()).startOf('week').format('YYYY') + '年'});
-
-const tableData = ref([]);
-const columns = ref([]);
-const options = ref([]);
-
-const dateBeforeSevenDays = computed(() => new Date(dayjs().subtract(7, 'day').format('YYYY-MM-DD')))
-
-const format = computed(() => {
-  return queryParams.value.activeRadioName === 'week' ? tempDataValue.value.timeBegin + ' 第 ww 周'  : 'YYYY-MM'
-})
-
-const label = computed(() => {
-  return queryParams.value.activeRadioName === 'week' ? '选择周' : '选择月'
-})
-
-const onChangeDatePicker = (value) => {
-  const timeBegin = dayjs(value).startOf('week').format('YYYY') + '年';
-  const timeEnd = dayjs(value).endOf('week').format('MM-DD');
-  
-  tempDataValue.value = { timeBegin, timeEnd };
-}
-
-const onRadioChange = () => {
-  datePickerValue.value = new Date();
-}
-
-const getStartTimeAndEndTime = () => {
-  const { activeRadioName } = queryParams.value;
-  const time = datePickerValue.value;
-  let timeBegin = '';
-  let timeEnd = '';
-  
-  if ( activeRadioName === 'daterange' ) {
-    if (time.length) {
-      const [ startTime, endTime ] = time;
-      timeBegin = dayjs(startTime).format('YYYY-MM-DD')
-      timeEnd = dayjs(endTime).format('YYYY-MM-DD')
-    }
-  } else {
-    timeBegin = dayjs(time).startOf('month').format('YYYY-MM-DD');
-    timeEnd = dayjs(time).endOf('month').format('YYYY-MM-DD');
-  }
- 
-  return {
-    timeBegin,
-    timeEnd
-  }
-}
-
-const initPageData = async() => {
-  tableLoading.value = true;
-  loading.value = true;
-
-  const dateResult = getStartTimeAndEndTime();
-  const { data } = await getContinuousAssayListNew({...dateResult, deviceNo: queryParams.value.deviceNo});
-  console.log("data", data);
-  const whiteTableList = [
-    // { title: '检测指标', key: 'assayName' },
-    { title: '实际检测数量', key: 'assayCounts' },
-    { title: '最小值', key: 'minVal' },
-    { title: '最大值', key: 'maxVal' },
-    { title: '合格率(%)', key: 'passedRates' }, 
-    { title: '标线(%)', key: 'bx' },
-    { title: '合格率偏差', key: 'ratesDeviation' }
-  ]
-
-  const tempBodyObject = {};
-  const middleData = Object.entries(data).map(([key, value]) => {
-    const children = Object.entries(value).map(([k, v]) => {
-      const [child] = v;
-      tempBodyObject[key + '-' + k] = child;
-      return {
-        label: k, 
-        prop: key + '-' + k, 
-        width: 160
-      }
-    });
-    
-    return {
-      label: key === 'total' ? '' : key,
-      children
-    }
-  });
-  
-  if ( middleData.length ) {
-    columns.value = [{ label: '检测点位', fixed: "left", children: [{ label: '检测指标', prop: 'title', width: 150 }]}].concat(middleData);
-    tableData.value = whiteTableList.map(item => {
-      const { key } = item;
-      Object.entries(tempBodyObject).map(([k, v]) => {
-        item = {
-          ...item,
-          [k]: v[key]
-        }
-      })
-      return item;
-    });
-  } else {
-    columns.value = [];
-    tableData.value = []
-  }
-  tableLoading.value = false;
-  loading.value = false;
-}
-
-const handlerQuery = () => {
-  initPageData();
-}
-
-const handlerReset = () => {
-  const [ item ] = options.value;
-  datePickerValue.value = [dateBeforeSevenDays.value, new Date()];
-  queryParams.value.activeRadioName = 'daterange';
-  queryParams.value.deviceNo = item?.deviceNo || '';
-  initPageData();
-}
-
-const handleExport = () => {
-  const dateResult = getStartTimeAndEndTime();
-  proxy.getDownload("/business/exportContinuousAssayCountByDates", {
-    ...dateResult,
-    deviceNo: queryParams.value.deviceNo
-  }, `${new Date().getTime()}.xlsx`);
-}
-
-onMounted(async() => {
-
-  datePickerValue.value = [dateBeforeSevenDays.value, new Date()];
-
-  await getDeviceList({ type: 2 }).then(({ data }) => {
-    const [ item ] = data;
-    queryParams.value.deviceNo = item?.deviceNo || '';
-    options.value = data
-  });
-  
-  await initPageData();
-})
-</script>
-
-<template>
-  <div class="lab-day-viewport space-y-[10px]">
-    <el-card shadow="never" :body-style="{ border: '0px' }">
-      <template #header>
-        <p class="space-x-[10px]">
-          <span class="font-bold">数据筛选</span>
-        </p>
-      </template>
-      <el-row class="pt-[5px]" justify="space-between" :gutter="20">
-        <el-col :span="6">
-          <el-form-item label="设备名称">
-            <el-select v-model="queryParams.deviceNo" placeholder="请选择" filterable clearable>
-              <el-option v-for="item in options" :key="item.deviceNo" :label="item.deviceName" :value="item.deviceNo" />
-            </el-select>
-          </el-form-item>
-        </el-col>
-        <el-col :span="14">
-          <div class="flex items-center space-x-[20px]">
-            <el-form-item label="统计时段">
-              <el-radio-group v-model="queryParams.activeRadioName" @change="onRadioChange">
-                <el-radio-button label="按周" value="daterange" />
-                <el-radio-button label="按月" value="month" />
-              </el-radio-group>
-            </el-form-item>
-            <el-form-item>
-              <el-date-picker
-                v-model="datePickerValue"
-                start-placeholder="开始时间"
-                end-placeholder="结束时间"
-                placeholder="请选择月份"
-                :type="queryParams.activeRadioName"
-                :editable="false"
-                :clearable="false"
-                style="max-width: 280px;"
-                @change="onChangeDatePicker"
-              />
-            </el-form-item>
-          </div>
-        </el-col>
-        <el-col :span="4">
-          <div class="flex justify-end">
-            <el-button type="primary" @click="handlerQuery" :loading="loading">查询</el-button>
-            <el-button @click="handlerReset" :loading="loading">重置</el-button>
-          </div>
-        </el-col>
-      </el-row>
-    </el-card>
-
-    <el-card shadow="never" :body-style="{ padding: '20px' }">
-      <div class="flex justify-between items-center mb-[10px]">
-        <h4 class="font-bold">统计报表</h4>
-        <el-button
-          type="warning"
-          plain
-          icon="Download"
-          @click="handleExport"
-          :loading="loading"
-        >导出</el-button>
-      </div>
-      <el-table :data="tableData" style="width: 100%" v-loading="tableLoading">
-        <!-- <el-table-column prop="title" label="检测点位" width="160" fixed="left" header-align="center" /> -->
-        <el-table-column  :label="col.label" :width="col.width || 200" :fixed="col.fixed" align="center" v-for="col, index in columns">
-          <el-table-column :prop="child.prop" :label="child.label" :width="child.width" v-for="child in col.children"/>
-        </el-table-column>
-        <!-- <el-table-column prop="totalDeviationRate" label="总质控合格率" width="120" header-align="center" fixed="right" align="center"/> -->
-      </el-table>
-    </el-card>
-
-  </div>
-  
-</template>
-
-<style lang="scss" scoped></style>

+ 1 - 1
src/views/report/detection-month/index.vue

@@ -40,7 +40,7 @@ const onChangeDatePicker = (value) => {
 }
 
 const onRadioChange = () => {
-  datePickerValue.value = new Date();
+  datePickerValue.value = queryParams.value.activeRadioName === 'daterange' ? [dateBeforeSevenDays.value, new Date()] : new Date();
 }
 
 const getStartTimeAndEndTime = () => {

+ 1 - 1
src/views/report/record/index.vue

@@ -155,7 +155,7 @@ const handleExport = () => {
   const [ timeBegin, timeEnd ] = datePieckerValue.value;
   
   proxy.getDownload("/business/exportAssayPageListByDeviceNoAndDate", {
-    timeBegin, timeEnd, deviceNo: queryParams.value.deviceNo
+    timeBegin, timeEnd, deviceNo: queryParams.value.deviceNo, type: route.query.t
   }, `${new Date().getTime()}.xlsx`);
 }
 

+ 8 - 5
src/views/report/report-daily/index.vue

@@ -12,6 +12,7 @@ const drawerData = ref({});
 const currentDateTime = ref('');
 
 const categoryOptions = [
+  { label: '全部', value: '' },
   { label: '化验室设备', value: 1 },
   { label: '连续检测设备', value: 2 },
 ]
@@ -53,7 +54,6 @@ const getDeviceClass = ({ assayStatus: key }) => {
 const initPageData = async () => {
   tableLoading.value = true;
   
-  const { data: deviceData } = await getDeviceList({ type: queryParams.value.type });
   const { total: pageTotal, rows } = await getDailyTable(queryParams.value);
   
   total.value = pageTotal;
@@ -64,7 +64,6 @@ const initPageData = async () => {
   }));
   
   tableLoading.value = false;
-  selectOptions.value = deviceData;
 }
 
 const handleDatePickerChange = () => {
@@ -99,7 +98,7 @@ const handleTableBtnClick = async (row) => {
 
 // 设备类型变化
 const reloadPageData = async (type) => {
-  queryParams.value.type = type;
+  queryParams.value.type = type || '';
   queryParams.value.deviceNo = '';
   queryParams.value.pageNum = 1;
   queryParams.value.pageSize = 10;
@@ -112,6 +111,9 @@ const reloadPageData = async (type) => {
 }
 
 onMounted( async () => {
+  const { data: deviceData } = await getDeviceList({ type: queryParams.value.type });
+  selectOptions.value = deviceData;
+  
   reloadPageData();
   currentDateTime.value = dayjs(new Date()).format('YYYY-MM-DD hh:mm:ss');
 })
@@ -224,8 +226,9 @@ onMounted( async () => {
               placeholder="选择设备类型"
               v-model="queryParams.type"
               @change="reloadPageData"
+              :empty-values="[null, undefined]"
+              :value-on-clear="null"
             >
-              <el-option label="全部" value="" />
               <el-option
                 v-for="item in categoryOptions"
                 :key="item.value"
@@ -260,7 +263,7 @@ onMounted( async () => {
         </div>
         <el-table :data="tableData" style="width: 100%" v-loading="tableLoading">
           <el-table-column prop="deviceName" label="设备名称" width="180" fixed/>
-          <el-table-column prop="deviceNo" label="设备名称" width="180" />
+          <el-table-column prop="deviceNo" label="设备编号" width="180" />
           <el-table-column prop="worksName" label="所属水厂" width="180"/>
           <el-table-column prop="assayStatus" label="当前设备状态" width="180">
             <template #default="{ row }">

+ 5 - 5
src/views/system/user/index.vue

@@ -133,7 +133,7 @@
                <el-table-column type="selection" width="50" align="center" />
                <el-table-column label="用户编号" align="center" key="userId" prop="userId" v-if="columns[0].visible" />
                <el-table-column label="用户名称" align="center" key="userName" prop="userName" v-if="columns[1].visible" :show-overflow-tooltip="true" />
-               <el-table-column label="用户昵称" align="center" key="nickName" prop="nickName" v-if="columns[2].visible" :show-overflow-tooltip="true" />
+               <el-table-column label="用户姓名" align="center" key="nickName" prop="nickName" v-if="columns[2].visible" :show-overflow-tooltip="true" />
                <el-table-column label="部门" align="center" key="deptName" prop="dept.deptName" v-if="columns[3].visible" :show-overflow-tooltip="true" />
                <el-table-column label="手机号码" align="center" key="phonenumber" prop="phonenumber" v-if="columns[4].visible" width="120" />
                <el-table-column label="状态" align="center" key="status" v-if="columns[5].visible">
@@ -183,8 +183,8 @@
          <el-form :model="form" :rules="rules" ref="userRef" label-width="80px">
             <el-row>
                <el-col :span="12">
-                  <el-form-item label="用户昵称" prop="nickName">
-                     <el-input v-model="form.nickName" placeholder="请输入用户昵称" maxlength="30" />
+                  <el-form-item label="用户姓名" prop="nickName">
+                     <el-input v-model="form.nickName" placeholder="请输入用户姓名" maxlength="30" />
                   </el-form-item>
                </el-col>
                <el-col :span="12">
@@ -371,7 +371,7 @@ const upload = reactive({
 const columns = ref([
   { key: 0, label: `用户编号`, visible: true },
   { key: 1, label: `用户名称`, visible: true },
-  { key: 2, label: `用户昵称`, visible: true },
+  { key: 2, label: `用户姓名`, visible: true },
   { key: 3, label: `部门`, visible: true },
   { key: 4, label: `手机号码`, visible: true },
   { key: 5, label: `状态`, visible: true },
@@ -390,7 +390,7 @@ const data = reactive({
   },
   rules: {
     userName: [{ required: true, message: "用户名称不能为空", trigger: "blur" }, { min: 2, max: 20, message: "用户名称长度必须介于 2 和 20 之间", trigger: "blur" }],
-    nickName: [{ required: true, message: "用户昵称不能为空", trigger: "blur" }],
+    nickName: [{ required: true, message: "用户姓名不能为空", trigger: "blur" }],
     password: [{ required: true, message: "用户密码不能为空", trigger: "blur" }, { min: 5, max: 20, message: "用户密码长度必须介于 5 和 20 之间", trigger: "blur" }, { pattern: /^[^<>"'|\\]+$/, message: "不能包含非法字符:< > \" ' \\\ |", trigger: "blur" }],
     email: [{ type: "email", message: "请输入正确的邮箱地址", trigger: ["blur", "change"] }],
     phonenumber: [{ pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/, message: "请输入正确的手机号码", trigger: "blur" }]

+ 7 - 1
vite.config.js

@@ -7,11 +7,17 @@ import tailwindcss from 'tailwindcss';
 export default defineConfig(({ mode, command }) => {
   const env = loadEnv(mode, process.cwd())
   const { VITE_APP_ENV } = env
+  const ENV_BASE_PATH = {
+    development: '/',
+    test: '/data/',
+    production: '/'
+  }
+  const base = ENV_BASE_PATH[VITE_APP_ENV];
   return {
     // 部署生产环境和开发环境下的URL。
     // 默认情况下,vite 会假设你的应用是被部署在一个域名的根路径上
     // 例如 https://www.ruoyi.vip/。如果应用被部署在一个子路径上,你就需要用这个选项指定这个子路径。例如,如果你的应用被部署在 https://www.ruoyi.vip/admin/,则设置 baseUrl 为 /admin/。
-    base: VITE_APP_ENV === 'production' ? '/data/' : '',
+    base,
     plugins: createVitePlugins(env, command === 'build'),
     resolve: {
       // https://cn.vitejs.dev/config/#resolve-alias