Kaynağa Gözat

搞定印花机的稼动率

wukai 1 hafta önce
ebeveyn
işleme
270dc47dde
2 değiştirilmiş dosya ile 175 ekleme ve 249 silme
  1. 95 90
      src/views/calc/calcYhj/index.vue
  2. 80 159
      src/views/calc/dayYhj/index.vue

+ 95 - 90
src/views/calc/calcYhj/index.vue

@@ -1,107 +1,63 @@
 <template>
   <div class="app-container">
     <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
-      <el-form-item label="日期" style="width: 308px">
-        <el-date-picker
-          v-model="daterangeDataDate"
-          value-format="YYYY-MM-DD"
-          type="daterange"
-          range-separator="-"
-          start-placeholder="开始日期"
-          end-placeholder="结束日期"
-        ></el-date-picker>
-      </el-form-item>
-      <el-form-item label="产线编号" prop="deviceId">
-        <el-input
-            v-model="queryParams.deviceId"
-            placeholder="请输入产线编号"
-            clearable
-            @keyup.enter="handleQuery"
-        />
-      </el-form-item>
-      <el-form-item label="小时" prop="hour">
-        <el-input
-          v-model="queryParams.hour"
-          placeholder="请输入小时"
-          clearable
-          @keyup.enter="handleQuery"
-        />
+      <el-form-item label="日期">
+        <div style="display: flex; align-items: center;">
+          <el-button icon="ArrowLeft" @click="navigateDay(-1)" size="small" style="margin-right: 5px;"></el-button>
+          <el-date-picker
+            v-model="queryParams.workDay"
+            value-format="YYYY-MM-DD"
+            type="date"
+            placeholder="请选择日期"
+            style="width: 140px;"
+            @change="handleDateChange">
+          </el-date-picker>
+          <el-button icon="ArrowRight" @click="navigateDay(1)" size="small" style="margin-left: 5px;"></el-button>
+        </div>
       </el-form-item>
-      <el-form-item label="版距" prop="distance">
-        <el-input
-          v-model="queryParams.distance"
-          placeholder="请输入版距"
+      <el-form-item label="产线选择" prop="deviceId">
+        <el-select
+          v-model="queryParams.deviceId"
+          placeholder="请选择产线"
           clearable
-          @keyup.enter="handleQuery"
-        />
-      </el-form-item>
-      <el-form-item>
-        <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
-        <el-button icon="Refresh" @click="resetQuery">重置</el-button>
+          @change="handleDeviceChange"
+          style="width: 120px;"
+        >
+          <el-option
+            v-for="n in 8"
+            :key="n"
+            :label="n+'#'"
+            :value="n.toString()"
+          ></el-option>
+        </el-select>
       </el-form-item>
     </el-form>
 
-    <el-row :gutter="10" class="mb8">
-<!--      <el-col :span="1.5">-->
-<!--        <el-button-->
-<!--          type="primary"-->
-<!--          plain-->
-<!--          icon="Plus"-->
-<!--          @click="handleAdd"-->
-<!--          v-hasPermi="['calc:calcYhj:add']"-->
-<!--        >新增</el-button>-->
-<!--      </el-col>-->
-<!--      <el-col :span="1.5">-->
-<!--        <el-button-->
-<!--          type="success"-->
-<!--          plain-->
-<!--          icon="Edit"-->
-<!--          :disabled="single"-->
-<!--          @click="handleUpdate"-->
-<!--          v-hasPermi="['calc:calcYhj:edit']"-->
-<!--        >修改</el-button>-->
-<!--      </el-col>-->
-<!--      <el-col :span="1.5">-->
-<!--        <el-button-->
-<!--          type="danger"-->
-<!--          plain-->
-<!--          icon="Delete"-->
-<!--          :disabled="multiple"-->
-<!--          @click="handleDelete"-->
-<!--          v-hasPermi="['calc:calcYhj:remove']"-->
-<!--        >删除</el-button>-->
-<!--      </el-col>-->
-      <el-col :span="1.5">
-        <el-button
-          type="warning"
-          plain
-          icon="Download"
-          @click="handleExport"
-        >导出</el-button>
-      </el-col>
-      <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
-    </el-row>
-
     <el-table v-loading="loading" :data="calcYhjList" @selection-change="handleSelectionChange">
       <el-table-column type="selection" width="55" align="center" />
 <!--      <el-table-column label="ID" align="center" prop="id" />-->
+      <el-table-column label="产线编号" align="center" prop="deviceId" />
       <el-table-column label="日期" align="center" prop="dataDate" width="180">
         <template #default="scope">
           <span>{{ parseTime(scope.row.dataDate, '{y}-{m}-{d}') }}</span>
         </template>
       </el-table-column>
       <el-table-column label="小时" align="center" prop="hour" />
-      <el-table-column label="产线编号" align="center" prop="deviceId" />
       <el-table-column label="织造米数" align="center" prop="length" />
       <el-table-column label="重量(吨)" align="center" prop="weight" />
       <el-table-column label="版距" align="center" prop="distance" />
-      <el-table-column label="备注" align="center" prop="remark" />
-<!--      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">-->
-<!--        <template #default="scope">-->
-<!--          <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['calc:calcYhj:edit']">修改</el-button>-->
-<!--          <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['calc:calcYhj:remove']">删除</el-button>-->
-<!--        </template>-->
-<!--      </el-table-column>-->
+      <el-table-column label="开机时间(秒)" align="center" prop="openTime" />
+      <el-table-column label="停机时间(秒)" align="center" prop="closeTime" />
+      <el-table-column label="稼动率" align="center">
+        <template #default="scope">
+          {{ calculateAvailability(scope.row.openTime, scope.row.closeTime) }}
+        </template>
+      </el-table-column>
+      <el-table-column label="稼动率(自然时间)" align="center">
+        <template #default="scope">
+          {{ calculateNaturalTimeAvailability(scope.row.openTime) }}
+        </template>
+      </el-table-column>
     </el-table>
 
     <pagination
@@ -163,14 +119,13 @@ const single = ref(true);
 const multiple = ref(true);
 const total = ref(0);
 const title = ref("");
-const daterangeDataDate = ref([]);
 
 const data = reactive({
   form: {},
   queryParams: {
     pageNum: 1,
     pageSize: 10,
-    dataDate: null,
+    workDay: new Date(new Date().getTime() - 24 * 60 * 60 * 1000).Format('yyyy-MM-dd'), // 默认日期为昨天
     hour: null,
     deviceId: null,
     length: null,
@@ -183,13 +138,21 @@ const data = reactive({
 
 const { queryParams, form, rules } = toRefs(data);
 
+function navigateDay(offset) {
+  const currentDate = new Date(queryParams.value.workDay);
+  currentDate.setDate(currentDate.getDate() + offset);
+  queryParams.value.workDay = currentDate.toISOString().split('T')[0];
+  // 日期变更时自动查询
+  handleQuery();
+}
+
 /** 查询印花机1小时统计数据列表 */
 function getList() {
   loading.value = true;
   queryParams.value.params = {};
-  if (null != daterangeDataDate && '' != daterangeDataDate) {
-    queryParams.value.params["beginDataDate"] = daterangeDataDate.value[0];
-    queryParams.value.params["endDataDate"] = daterangeDataDate.value[1];
+  // 使用 dataDate 字段,可能与 workDay 等价
+  if (queryParams.value.workDay) {
+    queryParams.value.params["dataDate"] = queryParams.value.workDay;
   }
   listCalcYhj(queryParams.value).then(response => {
     calcYhjList.value = response.rows;
@@ -224,9 +187,20 @@ function handleQuery() {
   getList();
 }
 
+/** 日期选择变化时自动查询 */
+function handleDateChange() {
+  handleQuery();
+}
+
+/** 产线选择变化时自动查询 */
+function handleDeviceChange() {
+  handleQuery();
+}
+
 /** 重置按钮操作 */
 function resetQuery() {
-  daterangeDataDate.value = [];
+  // 重置为昨天日期
+  queryParams.value.workDay = new Date(new Date().getTime() - 24 * 60 * 60 * 1000).Format('yyyy-MM-dd');
   proxy.resetForm("queryRef");
   handleQuery();
 }
@@ -295,5 +269,36 @@ function handleExport() {
   }, `calcYhj_${new Date().getTime()}.xlsx`)
 }
 
+// 计算稼动率:开机时间 / (开机时间 + 停机时间)
+function calculateAvailability(openTime, closeTime) {
+  if (!openTime && !closeTime) {
+    return '0.00%';
+  }
+
+  const open = Number(openTime) || 0;
+  const close = Number(closeTime) || 0;
+  const total = open + close;
+
+  if (total === 0) {
+    return '0.00%';
+  }
+
+  const rate = (open / total) * 100;
+  return rate.toFixed(2) + '%';
+}
+
+// 计算基于自然时间的稼动率:开机时间 / 1小时(3600秒)
+function calculateNaturalTimeAvailability(openTime) {
+  if (!openTime) {
+    return '0.00%';
+  }
+
+  const open = Number(openTime) || 0;
+  const total = 3600; // 1小时的秒数
+
+  const rate = (open / total) * 100;
+  return rate.toFixed(2) + '%';
+}
+
 getList();
 </script>

+ 80 - 159
src/views/calc/dayYhj/index.vue

@@ -17,65 +17,36 @@
       </el-form-item>
     </el-form>
 
-    <!--    <el-row :gutter="10" class="mb8">-->
-    <!--      <el-col :span="1.5">-->
-    <!--        <el-button-->
-    <!--          type="primary"-->
-    <!--          plain-->
-    <!--          icon="Plus"-->
-    <!--          @click="handleAdd"-->
-    <!--          v-hasPermi="['calc:dayYhj:add']"-->
-    <!--        >新增</el-button>-->
-    <!--      </el-col>-->
-    <!--      <el-col :span="1.5">-->
-    <!--        <el-button-->
-    <!--          type="success"-->
-    <!--          plain-->
-    <!--          icon="Edit"-->
-    <!--          :disabled="single"-->
-    <!--          @click="handleUpdate"-->
-    <!--          v-hasPermi="['calc:dayYhj:edit']"-->
-    <!--        >修改</el-button>-->
-    <!--      </el-col>-->
-    <!--      <el-col :span="1.5">-->
-    <!--        <el-button-->
-    <!--          type="danger"-->
-    <!--          plain-->
-    <!--          icon="Delete"-->
-    <!--          :disabled="multiple"-->
-    <!--          @click="handleDelete"-->
-    <!--          v-hasPermi="['calc:dayYhj:remove']"-->
-    <!--        >删除</el-button>-->
-    <!--      </el-col>-->
-    <!--      <el-col :span="1.5">-->
-    <!--        <el-button-->
-    <!--          type="warning"-->
-    <!--          plain-->
-    <!--          icon="Download"-->
-    <!--          @click="handleExport"-->
-    <!--          v-hasPermi="['calc:dayYhj:export']"-->
-    <!--        >导出</el-button>-->
-    <!--      </el-col>-->
-    <!--      <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>-->
-    <!--    </el-row>-->
-
     <el-table v-loading="loading" :data="dayYhjList" show-summary  :summary-method="getSummaries" @selection-change="handleSelectionChange">
-<!--      <el-table-column type="selection" width="55" align="center"/>-->
-<!--      &lt;!&ndash;      <el-table-column label="ID" align="center" prop="id" />&ndash;&gt;-->
-<!--      <el-table-column label="时间" align="center" prop="time" width="180">-->
-<!--        <template #default="scope">-->
-<!--          <span>{{ parseTime(scope.row.time, '{y}-{m}-{d}') }}</span>-->
-<!--        </template>-->
-<!--      </el-table-column>-->
       <el-table-column label="产线编号" align="center" prop="deviceId"/>
-      <el-table-column label="白柸投放米长(米)" align="center" prop="dayLength"/>
-      <el-table-column label="白柸投放重量(吨)" align="center" prop="dayWeight"/>
-      <el-table-column label="总米长(米)" align="center" prop="length"/>
+      <el-table-column label="白柸投放(米)" align="center" prop="dayLength"/>
+      <el-table-column label="白柸投放(吨)" align="center" prop="dayWeight"/>
+      <el-table-column label="总产量(米)" align="center" prop="length"/>
       <el-table-column label="总重量(吨)" align="center" prop="weight"/>
-      <el-table-column label="A班米长(米)" align="center" prop="lengthA"/>
+      <el-table-column label="A班产量(米)" align="center" prop="lengthA"/>
       <el-table-column label="A班重量(吨)" align="center" prop="weightA"/>
-      <el-table-column label="B班米长(米)" align="center" prop="lengthB"/>
+      <el-table-column label="B班产量(米)" align="center" prop="lengthB"/>
       <el-table-column label="B班重量(吨)" align="center" prop="weightB"/>
+      <el-table-column label="开机时间" align="center">
+        <template #default="scope">
+          {{ formatSeconds(scope.row.openTime) }}
+        </template>
+      </el-table-column>
+      <el-table-column label="停机时间" align="center">
+        <template #default="scope">
+          {{ formatSeconds(scope.row.closeTime) }}
+        </template>
+      </el-table-column>
+      <el-table-column label="稼动率" align="center">
+        <template #default="scope">
+          {{ calculateAvailability(scope.row.openTime, scope.row.closeTime) }}
+        </template>
+      </el-table-column>
+      <el-table-column label="稼动率(自然时间)" align="center">
+        <template #default="scope">
+          {{ calculateNaturalTimeAvailability(scope.row.openTime) }}
+        </template>
+      </el-table-column>
       <!--      <el-table-column label="备注" align="center" prop="remark" />-->
       <!--      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">-->
       <!--        <template #default="scope">-->
@@ -98,7 +69,7 @@
       <el-form ref="dayYhjRef" :model="form" :rules="rules" label-width="80px">
         <el-form-item label="时间" prop="time">
           <el-date-picker clearable
-                          v-model="form.time"
+                          v-model="queryParams.time"
                           type="date"
                           value-format="YYYY-MM-DD"
                           placeholder="请选择时间">
@@ -113,24 +84,30 @@
         <el-form-item label="自然天统计重量" prop="dayWeight">
           <el-input v-model="form.dayWeight" placeholder="请输入自然天统计重量"/>
         </el-form-item>
-        <el-form-item label="总米长" prop="length">
-          <el-input v-model="form.length" placeholder="请输入总米长"/>
+        <el-form-item label="总产量" prop="length">
+          <el-input v-model="form.length" placeholder="请输入总产量"/>
         </el-form-item>
         <el-form-item label="总重量" prop="weight">
           <el-input v-model="form.weight" placeholder="请输入总重量"/>
         </el-form-item>
-        <el-form-item label="A班米长" prop="lengthA">
-          <el-input v-model="form.lengthA" placeholder="请输入A班米长"/>
+        <el-form-item label="A班产量" prop="lengthA">
+          <el-input v-model="form.lengthA" placeholder="请输入A班产量"/>
         </el-form-item>
         <el-form-item label="A班重量" prop="weightA">
           <el-input v-model="form.weightA" placeholder="请输入A班重量"/>
         </el-form-item>
-        <el-form-item label="B班米长" prop="lengthB">
-          <el-input v-model="form.lengthB" placeholder="请输入B班米长"/>
+        <el-form-item label="B班产量" prop="lengthB">
+          <el-input v-model="form.lengthB" placeholder="请输入B班产量"/>
         </el-form-item>
         <el-form-item label="B班重量" prop="weightB">
           <el-input v-model="form.weightB" placeholder="请输入B班重量"/>
         </el-form-item>
+        <el-form-item label="开机时间(秒)" prop="openTime">
+          <el-input v-model="form.openTime" placeholder="请输入开机时间(秒)"/>
+        </el-form-item>
+        <el-form-item label="停机时间(秒)" prop="closeTime">
+          <el-input v-model="form.closeTime" placeholder="请输入停机时间(秒)"/>
+        </el-form-item>
         <el-form-item label="备注" prop="remark">
           <el-input v-model="form.remark" placeholder="请输入备注"/>
         </el-form-item>
@@ -180,7 +157,7 @@ function navigateDay(offset) {
   const currentDate = new Date(queryParams.value.time);
   currentDate.setDate(currentDate.getDate() + offset);
   queryParams.value.time = currentDate.toISOString().split('T')[0];
-  handleQuery();
+  getList();
 }
 
 /** 查询印花机日统计数据列表 */
@@ -212,13 +189,12 @@ function getSummaries(param) {
         sums[index] = '合计';
       return;
     }
-    // if (index === 1) {
-    //   sums[index] = '合计';
-    //     return;
-    // }if (index === 2) {
-    //   sums[index] = '';
-    //     return;
-    // }
+    // 检查是否为稼动率列(没有prop属性的列)
+    if (!column.property) {
+      // 稼动率列没有数据属性,显示 "--"
+      sums[index] = '--';
+      return;
+    }
     const values = data.map(item => Number(item[column.property]));
       if (!values.every(value => isNaN(value))) {
         sums[index] = values.reduce((prev, curr) => {
@@ -237,107 +213,52 @@ function getSummaries(param) {
   return sums;
 }
 
-// 取消按钮
-function cancel() {
-  open.value = false;
-  reset();
-}
+// 计算稼动率:开机时间 / (开机时间 + 停机时间)
+function calculateAvailability(openTime, closeTime) {
+  if (!openTime && !closeTime) {
+    return '0.00%';
+  }
 
-// 表单重置
-function reset() {
-  form.value = {
-    id: null,
-    time: null,
-    deviceId: null,
-    dayLength: null,
-    dayWeight: null,
-    length: null,
-    weight: null,
-    lengthA: null,
-    weightA: null,
-    lengthB: null,
-    weightB: null,
-    remark: null
-  };
-  proxy.resetForm("dayYhjRef");
-}
+  const open = Number(openTime) || 0;
+  const close = Number(closeTime) || 0;
+  const total = open + close;
 
-/** 搜索按钮操作 */
-function handleQuery() {
-  queryParams.value.pageNum = 1;
-  getList();
-}
+  if (total === 0) {
+    return '0.00%';
+  }
 
-/** 重置按钮操作 */
-function resetQuery() {
-  daterangeTime.value = [];
-  proxy.resetForm("queryRef");
-  handleQuery();
+  const rate = (open / total) * 100;
+  return rate.toFixed(2) + '%';
 }
 
-// 多选框选中数据
-function handleSelectionChange(selection) {
-  ids.value = selection.map(item => item.id);
-  single.value = selection.length != 1;
-  multiple.value = !selection.length;
-}
+// 将秒数转换为小时:分钟:秒格式
+function formatSeconds(seconds) {
+  if (!seconds) return '0秒';
 
-/** 新增按钮操作 */
-function handleAdd() {
-  reset();
-  open.value = true;
-  title.value = "添加印花机日统计数据";
-}
+  const sec = parseInt(seconds);
+  const h = Math.floor(sec / 3600);
+  const m = Math.floor((sec % 3600) / 60);
+  const s = sec % 60;
 
-/** 修改按钮操作 */
-function handleUpdate(row) {
-  reset();
-  const _id = row.id || ids.value
-  getDayYhj(_id).then(response => {
-    form.value = response.data;
-    open.value = true;
-    title.value = "修改印花机日统计数据";
-  });
-}
+  const timeParts = [];
+  if (h > 0) timeParts.push(`${h}时`);
+  if (m > 0) timeParts.push(`${m}分`);
+  if (s > 0) timeParts.push(`${s}秒`);
 
-/** 提交按钮 */
-function submitForm() {
-  proxy.$refs["dayYhjRef"].validate(valid => {
-    if (valid) {
-      if (form.value.id != null) {
-        updateDayYhj(form.value).then(response => {
-          proxy.$modal.msgSuccess("修改成功");
-          open.value = false;
-          getList();
-        });
-      } else {
-        addDayYhj(form.value).then(response => {
-          proxy.$modal.msgSuccess("新增成功");
-          open.value = false;
-          getList();
-        });
-      }
-    }
-  });
+  return timeParts.length > 0 ? timeParts.join('') : '0秒';
 }
 
-/** 删除按钮操作 */
-function handleDelete(row) {
-  const _ids = row.id || ids.value;
-  proxy.$modal.confirm('是否确认删除印花机日统计数据编号为"' + _ids + '"的数据项?').then(function () {
-    return delDayYhj(_ids);
-  }).then(() => {
-    getList();
-    proxy.$modal.msgSuccess("删除成功");
-  }).catch(() => {
-  });
-}
+// 计算基于自然时间的稼动率:开机时间 / 24小时(86400秒)
+function calculateNaturalTimeAvailability(openTime) {
+  if (!openTime) {
+    return '0.00%';
+  }
+
+  const open = Number(openTime) || 0;
+  const total = 24 * 60 * 60; // 24小时的秒数
 
-/** 导出按钮操作 */
-function handleExport() {
-  proxy.download('calc/dayYhj/export', {
-    ...queryParams.value
-  }, `dayYhj_${new Date().getTime()}.xlsx`)
+  const rate = (open / total) * 100;
+  return rate.toFixed(2) + '%';
 }
 
 getList();