Browse Source

解决冲突。

jiaxiaoqiang 1 year ago
parent
commit
8bb6ac53c2

+ 3 - 1
.env.development

@@ -11,7 +11,9 @@ VITE_APP_BASE_API = '/dev-api'
 # VITE_APP_API_URL = http://vapi.youlai.tech
 # 开发接口地址
 # VITE_APP_API_URL = 'http://192.168.101.4:8078'
-VITE_APP_API_URL = 'http://192.168.101.188:8078'
+# VITE_APP_API_URL = 'http://192.168.101.188:8078' //qhb
+# VITE_APP_API_URL = 'http://192.168.101.30:8078'  //lup
+VITE_APP_API_URL = 'http://192.168.101.64:8078'  #hetao
 
 # 是否启用 Mock 服务
 VITE_MOCK_DEV_SERVER = false

+ 12 - 0
src/api/dept/index.ts

@@ -2,6 +2,18 @@ import request from "@/utils/request";
 import { AxiosPromise } from "axios";
 import { DeptForm, DeptQuery, DeptVO } from "./types";
 
+
+/**
+ * 部门树形列表
+ * @param queryParams
+ */
+export function treeList(): AxiosPromise<any[]> {
+  return request({
+    url: "/api/v1/sys/dept/orgTree",
+    method: "get"
+  });
+}
+
 /**
  * 部门树形表格
  *

+ 50 - 0
src/api/device/index.ts

@@ -0,0 +1,50 @@
+import request from "@/utils/request";
+import {OrderInfoQuery} from "@/api/order/types";
+
+/**
+ * 设备维护
+ *
+ * @param ids
+ */
+export function maintenanceUpdate(params: any) {
+  return request({
+    url: "/api/v1/device/maintenance/maintenance",
+    method: "post",
+    data: params,
+  });
+}
+
+/**
+ * 设备维修
+ * @param params
+ */
+export function repair(params: any) {
+  return request({
+    url: "/api/v1/device/repair/repair",
+    method: "post",
+    data: params,
+  });
+}
+export function audit(params: any) {
+  return request({
+    url: "/api/v1/device/repair/audit",
+    method: "post",
+    data: params,
+  });
+}
+
+export function allocateAudit(params: any) {
+  return request({
+    url: "/api/v1/device/allocate/audit",
+    method: "post",
+    data: params,
+  });
+}
+
+export function allocateExport(deviceNo: String) {
+  return request({
+    url: "/api/v1/device/allocate/export/" + deviceNo,
+    method: "get",
+    responseType: "arraybuffer",
+  });
+}

+ 15 - 0
src/api/user/index.ts

@@ -17,6 +17,21 @@ export function getUserInfoApi(): AxiosPromise {
  *
  * @param queryParams
  */
+export function getUserList(
+    queryParams: UserQuery
+): AxiosPromise<any[]> {
+  return request({
+    url: "/api/v1/sys/user/list",
+    method: "post",
+    data: queryParams,
+  });
+}
+
+/**
+ * 获取用户分页列表
+ *
+ * @param queryParams
+ */
 export function getUserPage(
   queryParams: UserQuery
 ): AxiosPromise<PageResult<UserPageVO[]>> {

+ 5 - 1
src/common/configs/dictDataUtil.ts

@@ -1,7 +1,9 @@
 // 所有的字典类型typeCode都要在这里面写。
 
 const DictDataUtil = {
-  request_url: "/api/v1/sys/dictData/queryByType/",
+  request_url:
+    import.meta.env.VITE_APP_BASE_API + "/api/v1/sys/dictData/queryByType/",
+  dept_tree_url: import.meta.env.VITE_APP_BASE_API + "/api/v1/sys/dept/orgTree",
   TYPE_CODE: {
     //订单类型
     plan_order_type: "plan_order_type",
@@ -19,6 +21,8 @@ const DictDataUtil = {
     device_maintenance_cycle: "device_maintenance_cycle",
     // 工艺路线类型
     routing_type: "routing_type",
+    //封装方法
+    packaging_method: "packaging_method",
   },
   EXPAND_FIELD_TABLE: {
     //映射表列表

+ 1 - 1
src/layout/components/Sidebar/components/SidebarLogo.vue

@@ -33,7 +33,7 @@ const logo = ref(new URL(`../../../../assets/logo.png`, import.meta.url).href);
 .logo-container {
   width: 100%;
   height: $navbar-height;
-  background-color: $sidebar-logo-background;
+  //background-color: $sidebar-logo-background;
 
   .logo-image {
     width: 20px;

+ 110 - 61
src/views/base/materials/columns.ts

@@ -1,82 +1,90 @@
 import { useDictionaryStoreHook } from "@/store";
 const { dicts } = useDictionaryStoreHook();
-
+import dictDataUtil from "@/common/configs/dictDataUtil";
 export const columns = [
-  { label: "客户型号", prop: "customervodel", search: true },
-  { label: "生产厂家", prop: "manufacturer", search: true },
-  { label: "物料编码", prop: "materialCode", search: true },
-  { label: "物料名称", prop: "materialName", search: true },
-  { label: "保质期", prop: "qualityGuaranteePeriod", search: true },
-
-  { label: "筛选规范", prop: "selectionSpec", search: true },
-  { label: "物料规格", prop: "spec", search: true },
-  {
-    label: "适用平台",
-    prop: "applicablePlatformsDictValue",
-    search: true,
-    filterable: true,
-    type: "select",
-    dataType: "string",
-    dicData: dicts.applicable_platforms,
-    props: { label: "dictLabel", value: "dictValue" },
-  },
+  { label: "物料编码", prop: "materialCode", search: true ,rules: [{
+      required: true,
+      message: "请填写物料编码",
+      trigger: "blur"
+    }],},
+  { label: "物料名称", prop: "materialName", search: true ,rules: [{
+      required: true,
+      message: "请填写物料名称",
+      trigger: "blur"
+    }],},
   {
     label: "物料属性",
     prop: "attributeDictValue",
     search: true,
     filterable: true,
-    type: "select",
-    dataType: "string",
-    dicData: dicts.material_properties,
+    type: 'select',
+    dicData:dicts.material_properties,
     props: { label: "dictLabel", value: "dictValue" },
+    rules: [{
+      required: true,
+      message: "请选择物料属性",
+      trigger: "blur"
+    }],
   },
+  { label: "物料规格", prop: "spec", search: true,rules: [{
+      required: true,
+      message: "请填写物料规格",
+      trigger: "blur"
+    }], },
   {
-    label: "是否工装",
-    prop: "frock",
+    label: "单位",
+    prop: "unitDictValue",
     search: true,
     filterable: true,
-    type: "radio", //类型为单选框
-    dicData: [
-      {
-        label: "否",
-        value: 0,
-      },
-      {
-        label: "是",
-        value: 1,
-      },
-    ],
-    value: 0,
+    type: "select",
+    dicData:dicts.danwei_type,
+    props: { label: "dictLabel", value: "dictValue" },
+    rules: [{
+      required: true,
+      message: "请选择单位",
+      trigger: "blur"
+    }],
   },
   {
-    label: "质检方案",
-    prop: "inspectDictValue",
+    label: "物料级别",
+    prop: "levelDictValue",
     search: true,
     filterable: true,
     type: "select",
-    dataType: "string",
-    dicData: dicts.quality_testing_plan,
+    dicData:dicts.material_level,
     props: { label: "dictLabel", value: "dictValue" },
+    rules: [{
+      required: true,
+      message: "请选择物料级别",
+      trigger: "blur"
+    }],
   },
+  { label: "生产厂家", prop: "manufacturer", search: true ,rules: [{
+      required: true,
+      message: "请填写生产厂家",
+      trigger: "blur"
+    }],},
   {
-    label: "物料级别",
-    prop: "levelDictValue",
+    label: "质检方案",
+    prop: "inspectDictValue",
     search: true,
     filterable: true,
     type: "select",
-    dataType: "string",
-    dicData: dicts.material_level,
+    dicData:dicts.quality_testing_plan,
     props: { label: "dictLabel", value: "dictValue" },
   },
   {
-    label: "封装方法",
-    prop: "packageDictValue",
+    label: "适用平台",
+    prop: "applicablePlatformsDictValue",
     search: true,
     filterable: true,
     type: "select",
-    dataType: "string",
-    dicData: dicts.packaging_method,
+    dicData:dicts.applicable_platforms,
     props: { label: "dictLabel", value: "dictValue" },
+    rules: [{
+     required: true, message: "请选择适用平台",
+     trigger: "blur"
+    }],
   },
   {
     label: "质量等级",
@@ -84,9 +92,13 @@ export const columns = [
     search: true,
     filterable: true,
     type: "select",
-    dataType: "string",
-    dicData: dicts.quality_grade,
+    dicData:dicts.quality_grade,
     props: { label: "dictLabel", value: "dictValue" },
+    rules: [{
+      required: true,
+      message: "请选择质量等级",
+      trigger: "blur"
+    }],
   },
   {
     label: "选用类型",
@@ -94,29 +106,66 @@ export const columns = [
     search: true,
     filterable: true,
     type: "select",
-    dataType: "string",
-    dicData: dicts.selection_type,
+    dicData:dicts.selection_type,
     props: { label: "dictLabel", value: "dictValue" },
   },
   {
-    label: "阶段",
+    label: "产品阶段",
     prop: "stageDictValue",
     search: true,
     filterable: true,
     type: "select",
-    dataType: "string",
-    dicData: dicts.stage,
+    dicData:dicts.stage,
     props: { label: "dictLabel", value: "dictValue" },
   },
+  { label: "客户型号", prop: "customerModel", search: true },
+  { label: "保质期(天)", prop: "qualityGuaranteePeriod", search: true },
+
+
+
+
+
+
   {
-    label: "物料单位",
-    prop: "unitDictValue",
+    label: "封装方法",
+    prop: "packageDictValue",
     search: true,
     filterable: true,
     type: "select",
-    dataType: "string",
-    dicData: dicts.danwei_type,
-    props: { label: "dictLabel", value: "dictValue" },
+    dicData:dicts.packaging_method,
+    props: { label: "dictLabel", value: "dictLabel" },
   },
-  { label: "备注", prop: "remark", type: "textarea", search: true },
+
+  {
+    label: "是否工装",
+    prop: "frock",
+    search: true,
+    filterable: true,
+    type: "radio", //类型为单选框
+    dicData: [
+      {
+        label: "是",
+        value: 1,
+      },
+      {
+        label: "否",
+        value: 0,
+      },
+
+    ],
+    value: 1,
+    rules: [{
+      required: true,
+      message: "是否工装",
+      trigger: "blur"
+    }],
+  },
+
+
+
+
+
+  { label: "筛选规范", prop: "selectionSpec", search: true , type: "textarea",span:18},
+
+  { label: "备注", prop: "remark", type: "textarea", span:18 },
 ];

+ 51 - 16
src/views/base/factory/index.vue

@@ -1,8 +1,5 @@
 <template>
-
-
   <div class="mainContentBox">
-
     <avue-crud
       ref="crudRef"
       v-model:search="search"
@@ -13,6 +10,10 @@
       @row-save="createRow"
       @row-update="updateRow"
       @row-del="deleteRow"
+      @search-change="searchChange"
+      @search-reset="resetChange"
+      @size-change="dataList"
+      @current-change="dataList"
       @selection-change="selectionChange"
     >
       <template #menu-left="{ size }">
@@ -25,18 +26,37 @@
         >删除</el-button
         >
       </template>
+      <template #menu-right="{}">
+        <el-dropdown split-button
+        >导入
+          <template #dropdown>
+            <el-dropdown-menu>
+              <el-dropdown-item
+                @click="downloadTemplate('/api/v1/plan/order/template')"
+              >
+                <i-ep-download />下载模板
+              </el-dropdown-item>
+              <el-dropdown-item @click="importExcelData">
+                <i-ep-top />导入数据
+              </el-dropdown-item>
+            </el-dropdown-menu>
+          </template>
+        </el-dropdown>
+        <el-button class="ml-3" @click="exportData">
+          <template #icon> <i-ep-download /> </template>导出
+        </el-button>
+      </template>
     </avue-crud>
+    <ExcelUpload ref="uploadRef" @finished="uploadFinished" />
   </div>
 </template>
 <script setup>
   import { ref, getCurrentInstance } from "vue";
   import { useCrud } from "@/hooks/userCrud";
   import ButtonPermKeys from "@/common/configs/buttonPermission";
-
-  // import { useCommonStoreHook } from "@/store";
   import { useCommonStoreHook } from "@/store";
   const { isShowTable, tableType } = toRefs(useCommonStoreHook());
-  // const isShowTable = ref(false);
+
   const test = () => {
     isShowTable.value = true;
     tableType.value = tableType.value == 1 ? 2 : 1;
@@ -45,11 +65,12 @@
   // 传入一个url,后面不带/
   const { form, data, option, search, page, toDeleteIds, Methords, Utils } =
     useCrud({
-      src: "/api/v1/base/workShop",
+      src: "/api/v1/base/factory",
     });
-  const { dataList, createRow, updateRow, deleteRow } = Methords; //增删改查
+  const { dataList, createRow, updateRow, deleteRow, searchChange, resetChange } =
+    Methords; //增删改查
   const { selectionChange, multipleDelete } = Methords; //选中和批量删除事件
-  const { checkBtnPerm } = Utils; //按钮权限等工具
+  const { checkBtnPerm, downloadTemplate, exportData } = Utils; //按钮权限等工具
   // checkBtnPerm(ButtonPermKeys.PLAN.BTNS.order_add) :permission="permission"
   // const permission = reactive({
   //   delBtn: checkPerm(buttonPermission.PLAN.BTNS.order_del),
@@ -60,10 +81,30 @@
 
   const crudRef = ref(null); //crudRef.value 获取avue-crud对象
 
+  onMounted(() => {
+    // console.log("crudRef", crudRef)
+    dataList();
+  });
+
+  /**
+   * 上传excel相关
+   */
+  const uploadRef = ref(null);
+  const uploadFinished = () => {
+    // 上传完成后的刷新操作
+    page.currentPage = 1;
+    dataList();
+  };
+  const importExcelData = () => {
+    if (uploadRef.value) {
+      uploadRef.value.show("/api/v1/plan/order/import");
+    }
+  };
+
   // 设置表格列或者其他自定义的option
   option.value = Object.assign(option.value, {
     selection: true,
-    viewBtn: true,
+    menuWidth: 320,
     column: [
       // 添加一个自增列
       {
@@ -128,12 +169,6 @@
       },
     ],
   });
-
-  onMounted(() => {
-    // console.log("crudRef", crudRef)
-    dataList();
-  });
 </script>
 
 
-

+ 5 - 0
src/views/base/modeling/index.vue

@@ -0,0 +1,5 @@
+<template>
+  <div>
+    <router-view />
+  </div>
+</template>

src/views/base/production-line/index.vue → src/views/base/modeling/production-line/index.vue


+ 2 - 31
src/views/base/station/index.vue

@@ -16,38 +16,9 @@
       @current-change="dataList"
       @selection-change="selectionChange"
     >
-      <template #menu-left="{ size }">
-        <el-button
-          :disabled="toDeleteIds.length < 1"
-          type="danger"
-          icon="el-icon-delete"
-          :size="size"
-          @click="multipleDelete"
-        >删除</el-button
-        >
-      </template>
-      <template #menu-right="{}">
-        <el-dropdown split-button
-        >导入
-          <template #dropdown>
-            <el-dropdown-menu>
-              <el-dropdown-item
-                @click="downloadTemplate('/api/v1/plan/order/template')"
-              >
-                <i-ep-download />下载模板
-              </el-dropdown-item>
-              <el-dropdown-item @click="importExcelData">
-                <i-ep-top />导入数据
-              </el-dropdown-item>
-            </el-dropdown-menu>
-          </template>
-        </el-dropdown>
-        <el-button class="ml-3" @click="exportData">
-          <template #icon> <i-ep-download /> </template>导出
-        </el-button>
-      </template>
+
     </avue-crud>
-    <ExcelUpload ref="uploadRef" @finished="uploadFinished" />
+
   </div>
 </template>
 <script setup>

+ 51 - 15
src/views/base/work-shop/index.vue

@@ -1,8 +1,5 @@
 <template>
-
-
   <div class="mainContentBox">
-
     <avue-crud
       ref="crudRef"
       v-model:search="search"
@@ -13,6 +10,10 @@
       @row-save="createRow"
       @row-update="updateRow"
       @row-del="deleteRow"
+      @search-change="searchChange"
+      @search-reset="resetChange"
+      @size-change="dataList"
+      @current-change="dataList"
       @selection-change="selectionChange"
     >
       <template #menu-left="{ size }">
@@ -22,21 +23,40 @@
           icon="el-icon-delete"
           :size="size"
           @click="multipleDelete"
-          >删除</el-button
+        >删除</el-button
         >
       </template>
+      <template #menu-right="{}">
+        <el-dropdown split-button
+        >导入
+          <template #dropdown>
+            <el-dropdown-menu>
+              <el-dropdown-item
+                @click="downloadTemplate('/api/v1/plan/order/template')"
+              >
+                <i-ep-download />下载模板
+              </el-dropdown-item>
+              <el-dropdown-item @click="importExcelData">
+                <i-ep-top />导入数据
+              </el-dropdown-item>
+            </el-dropdown-menu>
+          </template>
+        </el-dropdown>
+        <el-button class="ml-3" @click="exportData">
+          <template #icon> <i-ep-download /> </template>导出
+        </el-button>
+      </template>
     </avue-crud>
+    <ExcelUpload ref="uploadRef" @finished="uploadFinished" />
   </div>
 </template>
 <script setup>
   import { ref, getCurrentInstance } from "vue";
   import { useCrud } from "@/hooks/userCrud";
   import ButtonPermKeys from "@/common/configs/buttonPermission";
-
-  // import { useCommonStoreHook } from "@/store";
   import { useCommonStoreHook } from "@/store";
   const { isShowTable, tableType } = toRefs(useCommonStoreHook());
-  // const isShowTable = ref(false);
+
   const test = () => {
     isShowTable.value = true;
     tableType.value = tableType.value == 1 ? 2 : 1;
@@ -47,9 +67,10 @@
     useCrud({
       src: "/api/v1/base/workShop",
     });
-  const { dataList, createRow, updateRow, deleteRow } = Methords; //增删改查
+  const { dataList, createRow, updateRow, deleteRow, searchChange, resetChange } =
+    Methords; //增删改查
   const { selectionChange, multipleDelete } = Methords; //选中和批量删除事件
-  const { checkBtnPerm } = Utils; //按钮权限等工具
+  const { checkBtnPerm, downloadTemplate, exportData } = Utils; //按钮权限等工具
   // checkBtnPerm(ButtonPermKeys.PLAN.BTNS.order_add) :permission="permission"
   // const permission = reactive({
   //   delBtn: checkPerm(buttonPermission.PLAN.BTNS.order_del),
@@ -60,10 +81,29 @@
 
   const crudRef = ref(null); //crudRef.value 获取avue-crud对象
 
+  onMounted(() => {
+    // console.log("crudRef", crudRef)
+    dataList();
+  });
+
+  /**
+   * 上传excel相关
+   */
+  const uploadRef = ref(null);
+  const uploadFinished = () => {
+    // 上传完成后的刷新操作
+    page.currentPage = 1;
+    dataList();
+  };
+  const importExcelData = () => {
+    if (uploadRef.value) {
+      uploadRef.value.show("/api/v1/plan/order/import");
+    }
+  };
+
   // 设置表格列或者其他自定义的option
   option.value = Object.assign(option.value, {
     selection: true,
-    viewBtn: true,
     column: [
       {
         label: "车间名称",
@@ -111,9 +151,5 @@
       },
     ],
   });
-
-  onMounted(() => {
-    // console.log("crudRef", crudRef)
-    dataList();
-  });
 </script>
+

+ 241 - 42
src/views/device/allocate/index.vue

@@ -26,14 +26,87 @@
           >删除</el-button
         >
       </template>
+      <template #menu="{size,row,index}">
+        <el-button @click="maintenance(row,0)"
+                   icon="el-icon-check"
+                   text
+                   type="primary"
+                   :size="size">流程</el-button>
+        <el-button @click="maintenance(row,1)"
+                   icon="el-icon-fold"
+                   text
+                   type="primary"
+                   :size="size">记录</el-button>
+        <el-button @click="handleExport(row)"
+                   icon="el-icon-download"
+                   text
+                   type="primary"
+                   :size="size">导出履历</el-button>
+      </template>
     </avue-crud>
+    <el-dialog
+        v-model="dialog.visible"
+        :title="dialog.title"
+        width="850px"
+        @close="dialog.visible = false"
+    >
+      <device-page  @deviceInfo="deviceInfo"/>
+    </el-dialog>
+
+    <el-dialog
+        v-model="dialog1.visible"
+        :title="dialog1.title"
+        width="750px"
+        height="80%"
+        @close="dialog1.visible = false">
+      <el-timeline style="max-width: 500px;margin-left: 100px">
+        <el-timeline-item center type="success" placement="top">
+          <el-card>
+            <h4>调拨申请</h4>
+            <p>设备编号: {{maintenanceInfo.deviceNo}}</p>
+            <p>设备名称: {{maintenanceInfo.deviceName}}</p>
+            <p>申请部门: {{maintenanceInfo.creator}}</p>
+            <p>申请人员: {{maintenanceInfo.creator}}</p>
+            <p>调拨周期: {{maintenanceInfo.allocateCycle}}天</p>
+            <p>调拨目标位置: {{maintenanceInfo.deviceToPosition}}天</p>
+            <p>申请时间: {{maintenanceInfo.created}}</p>
+          </el-card>
+        </el-timeline-item>
+
+        <el-timeline-item center placement="top"  :type="maintenanceInfo.state === 0 ? 'primary' : maintenanceInfo.state === 0 ? 'info' : 'success'">
+          <el-card v-if="viewPage">
+            <h4>调拨审批</h4>
+            <p>审批人员: {{maintenanceInfo.auditUser}}</p>
+            <p>审批结果: {{maintenanceInfo.auditUser ? (maintenanceInfo.auditResult === 1 ? '通过' : '不通过') : ''}}</p>
+          </el-card>
+          <el-card v-if="!viewPage">
+            <h4>调拨审批</h4>
+            <el-form ref="maintenanceInfoForm"  :model="maintenanceInfo" label-width="auto" style="max-width: 400px" :rules="rules">
+              <el-form-item label="审批人员" prop="auditUser">
+                <el-input :disabled="maintenanceInfo.state !== 0" v-model="maintenanceInfo.auditUser" />
+              </el-form-item>
+              <el-form-item label="审批结果">
+                <el-radio-group :disabled="maintenanceInfo.state !== 0" v-model="maintenanceInfo.auditResult" class="ml-4">
+                  <el-radio :value=1>通过</el-radio>
+                  <el-radio :value=2>驳回</el-radio>
+                </el-radio-group>
+              </el-form-item>
+              <el-form-item style="margin-left: 45%">
+                <el-button type="primary" v-if="maintenanceInfo.state === 0" @click="maintenanceSubmit">保存</el-button>
+              </el-form-item>
+            </el-form>
+          </el-card>
+        </el-timeline-item>
+      </el-timeline>
+    </el-dialog>
   </div>
 </template>
 <script setup>
 import { ref, getCurrentInstance } from "vue";
 import { useCrud } from "@/hooks/userCrud";
 import ButtonPermKeys from "@/common/configs/buttonPermission";
-
+import {getUserList} from "@/api/user"
+import {allocateAudit,allocateExport} from "@/api/device/index";
 import { useCommonStoreHook } from "@/store";
 import dictDataUtil from "@/common/configs/dictDataUtil";
 const { isShowTable, tableType } = toRefs(useCommonStoreHook());
@@ -42,30 +115,110 @@ const test = () => {
   tableType.value = tableType.value == 1 ? 2 : 1;
 };
 
+const viewPage = ref(true)
+
+const dialog = reactive({
+  title: "设备选择",
+  visible: false,
+});
+const dialog1 = reactive({
+  title: "调拨详情",
+  visible: false,
+});
+const userList = ref([])
 // 传入一个url,后面不带/
 const { form, data, option, search, page, toDeleteIds, Methords, Utils } =
   useCrud({
-    src: "/api/v1/device",
+    src: "/api/v1/device/allocate",
   });
 const { dataList, createRow, updateRow, deleteRow, searchChange, resetChange } = Methords; //增删改查
 const { selectionChange, multipleDelete } = Methords; //选中和批量删除事件
 const { checkBtnPerm, downloadTemplate, exportData } = Utils; //按钮权限等工具
-// checkBtnPerm(ButtonPermKeys.PLAN.BTNS.order_add) :permission="permission"
-// const permission = reactive({
-//   delBtn: checkPerm(buttonPermission.PLAN.BTNS.order_del),
-//   addBtn: checkPerm(buttonPermission.PLAN.BTNS.order_add),
-//   editBtn: checkPerm(buttonPermission.PLAN.BTNS.order_edit),
-//   menu: true,
-// });
-
 const crudRef = ref(null); //crudRef.value 获取avue-crud对象
-
+const deviceInfo = (value) => {
+  form.value.deviceNo = value.deviceNo
+  form.value.deviceName =value.deviceName
+  form.value.deviceType = value.deviceType
+  form.value.devicePosition = value.devicePosition
+  form.value.oldHead = value.head
+  form.value.devicePosition = value.devicePosition
+  form.value.oldDept = value.deptId
+  dialog.visible = false
+}
+const maintenanceInfo = ref(null)
+const maintenance = (row,type)=>{
+  viewPage.value = type === 0 ? false : true
+  maintenanceInfo.value = row
+  maintenanceInfo.value.auditResult = 1
+  dialog1.visible = true
+}
+const queryUserList = ()=>{
+  getUserList({}).then((data)=>{
+    userList.value = data.data
+  })
+}
+const handleExport = (row) => {
+  allocateExport(row.deviceNo).then((response) => {
+    downFile(response);
+  });
+}
+/** 文件下载 */
+const downFile = (response) => {
+  const fileData = response.data;
+  const fileName = decodeURI(
+      response.headers["content-disposition"].split(";")[1].split("=")[1]
+  );
+  const fileType =
+      "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8";
+  const blob = new Blob([fileData], { type: fileType });
+  const downloadUrl = window.URL.createObjectURL(blob);
+  const downloadLink = document.createElement("a");
+  downloadLink.href = downloadUrl;
+  downloadLink.download = fileName;
+  document.body.appendChild(downloadLink);
+  downloadLink.click();
+  document.body.removeChild(downloadLink);
+  window.URL.revokeObjectURL(downloadUrl);
+}
+const maintenanceInfoForm = ref('maintenanceInfoForm')
+const maintenanceSubmit =()=>{
+  //alert(JSON.stringify(maintenanceInfo.value))
+  maintenanceInfoForm.value.validate((isValid, invalidFields) => {
+    if (isValid) {
+      allocateAudit(maintenanceInfo.value).then((data)=>{
+        ElMessage({
+          message: data.msg,
+          type: "success",
+        });
+        dialog1.visible = false
+        dataList()
+      })
+    }
+  })
+}
+const rules = reactive({
+  auditUser: [
+    { required: true, message: '审核人员不能为空', trigger: 'blur' }
+  ],
+  handleContent: [
+    { required: true, message: '维修内容不能为空', trigger: 'blur' }
+  ]
+})
 // 设置表格列或者其他自定义的option
 option.value = Object.assign(option.value, {
   delBtn: false,
   selection: true,
+  labelWidth: 150,
+  viewBtn: false,
+  editBtn: false,
   column: [
     {
+      label: "调拨单号",
+      prop: "allocateNo",
+      display: false,
+      overHidden: true
+    },
+    {
       label: "设备编号",
       prop: "deviceNo",
       search: true,
@@ -76,23 +229,23 @@ option.value = Object.assign(option.value, {
           trigger: "trigger",
         },
       ],
+      click: ({ value, column }) => {
+        if(column.boxType){
+          dialog.visible = true
+        }
+      },
     },
     {
       label: "设备名称",
       prop: "deviceName",
+      addDisabled: true,
       search: true,
-      rules: [
-        {
-          required: true,
-          message: "设备名称不能为空",
-          trigger: "trigger",
-        },
-      ],
     },
     {
       label: "设备类型",
       prop: "deviceType",
       type: "select",
+      addDisabled: true,
       search: true,
       dicUrl:
         dictDataUtil.request_url +
@@ -110,61 +263,107 @@ option.value = Object.assign(option.value, {
       ],
     },
     {
-      label: "设备状态",
-      prop: "state",
-      type: "select",
-      search: true,
-      dicUrl:
-          dictDataUtil.request_url +
-          dictDataUtil.TYPE_CODE.device_status,
+      label: "原部门",
+      prop: "oldDept",
+      type: "tree",
+      addDisabled: true,
+      dicUrl: dictDataUtil.dept_tree_url,
       props: {
-        label: "dictLabel",
-        value: "dictValue",
+        label: "deptName",
+        value: "id",
+      }
+    },
+    {
+      label: "新部门",
+      prop: "applyDept",
+      type: "tree",
+      dicUrl: dictDataUtil.dept_tree_url,
+      props: {
+        label: "deptName",
+        value: "id",
       },
       rules: [
         {
           required: true,
-          message: "设备状态不能为空",
+          message: "新部门不能为空",
           trigger: "trigger",
         },
       ],
     },
     {
-      label: "负责人",
-      prop: "head",
+      label: "原负责人",
+      prop: "oldHead",
+      addDisabled: true,
+    },
+    {
+      label: "新负责人",
+      prop: "newHead",
       rules: [
         {
           required: true,
-          message: "负责人不能为空",
+          message: "负责人不能为空",
           trigger: "trigger",
         },
       ],
     },
     {
-      label: "供应厂商",
-      prop: "manufacturer",
+      label: "设备原位置",
+      addDisabled: true,
+      prop: "devicePosition",
+      width: "115",
+      overHidden: true
+    },
+    {
+      label: "设备新位置",
+      prop: "deviceToPosition",
+      overHidden: true,
+      width: "115",
+      rules: [
+        {
+          required: true,
+          message: "设备新位置不能为空",
+          trigger: "trigger",
+        },
+      ],
     },
     {
-      label: "所在车间",
-      prop: "workshop",
+      label: "调拨周期(天)",
+      prop: "allocateCycle",
+      type: "number",
+      width: "105",
+      min: 0,
+      max: 999,
+      rules: [
+        {
+          required: true,
+          message: "调拨周期不能为空",
+          trigger: "trigger",
+        },
+      ],
     },
     {
-      label: "所在工位",
-      prop: "station",
+      label: "状态",
+      prop: "state",
+      display: false,
+      type: "select",
+      dicData: [{label: '待审核',value:0},{label: '通过',value:1},{label: '驳回',value:2}],
     },
     {
-      label: "规格",
-      prop: "specifications",
+      label: "申请人",
+      prop: "applyUser",
+      display: false,
     },
     {
-      label: "品牌",
-      prop: "brand",
+      label: "申请时间",
+      prop: "created",
+      width: "180",
+      display: false,
     },
   ],
 });
 
 onMounted(() => {
-  // console.log("crudRef", crudRef)
   dataList();
+  queryUserList()
 });
 </script>

+ 1 - 2
src/views/device/instance/components/device-page.vue

@@ -17,9 +17,8 @@
   </div>
 </template>
 <script setup>
-import { ref, getCurrentInstance } from "vue";
+import { ref } from "vue";
 import { useCrud } from "@/hooks/userCrud";
-import ButtonPermKeys from "@/common/configs/buttonPermission";
 
 import { useCommonStoreHook } from "@/store";
 import dictDataUtil from "@/common/configs/dictDataUtil";

+ 122 - 0
src/views/device/instance/components/device-page.vue~

@@ -0,0 +1,122 @@
+<template>
+  <div class="mainContentBox">
+    <avue-crud
+        ref="crudRef"
+        v-model:search="search"
+        v-model="form"
+        :data="data"
+        :option="option"
+        v-model:page="page"
+        @row-click="rowClick"
+        @search-change="searchChange"
+        @search-reset="resetChange"
+        @size-change="dataList"
+        @current-change="dataList"
+    >
+    </avue-crud>
+  </div>
+</template>
+<script setup>
+import { ref, getCurrentInstance } from "vue";
+import { useCrud } from "@/hooks/userCrud";
+import ButtonPermKeys from "@/common/configs/buttonPermission";
+
+import { useCommonStoreHook } from "@/store";
+import dictDataUtil from "@/common/configs/dictDataUtil";
+const { isShowTable, tableType } = toRefs(useCommonStoreHook());
+const test = () => {
+  isShowTable.value = true;
+  tableType.value = tableType.value == 1 ? 2 : 1;
+};
+// 传入一个url,后面不带/
+const { form, data, option, search, page, toDeleteIds, Methords, Utils } =
+  useCrud({
+    src: "/api/v1/device",
+  });
+const { dataList, createRow, updateRow, deleteRow, searchChange, resetChange } = Methords; //增删改查
+const { selectionChange, multipleDelete } = Methords; //选中和批量删除事件
+const { checkBtnPerm, downloadTemplate } = Utils; //按钮权限等工具
+
+const crudRef = ref(null); //crudRef.value 获取avue-crud对象
+const emit = defineEmits(["deviceInfo"])
+const rowClick = (row)=>{
+  emit("deviceInfo", row)
+}
+
+// 设置表格列或者其他自定义的option
+option.value = Object.assign(option.value, {
+  delBtn: false,
+  selection: false,
+  search: false,
+  editBtn: false,
+  addBtn: false,
+  viewBtn: false,
+  menu: false,
+  column: [
+    {
+      label: "设备编号",
+      prop: "deviceNo",
+      search: true,
+      width: '120',
+      rules: [
+        {
+          required: true,
+          message: "设备编号不能为空",
+          trigger: "trigger",
+        },
+      ],
+    },
+    {
+      label: "设备名称",
+      prop: "deviceName",
+      search: true,
+      width: '120',
+      rules: [
+        {
+          required: true,
+          message: "设备名称不能为空",
+          trigger: "trigger",
+        },
+      ],
+    },
+    {
+      label: "设备类型",
+      prop: "deviceType",
+      type: "select",
+      search: true,
+      width: '100',
+      dicUrl:
+        dictDataUtil.request_url +
+        dictDataUtil.TYPE_CODE.device_type,
+      props: {
+        label: "dictLabel",
+        value: "dictValue",
+      },
+    },
+    {
+      label: "负责人",
+      width: '100',
+      prop: "head",
+    },
+    {
+      label: "设备位置",
+      width: '150',
+      prop: "devicePosition",
+    },
+    {
+      label: "规格",
+      width: '150',
+      prop: "specifications",
+    },
+    {
+      label: "品牌",
+      width: '150',
+      prop: "brand",
+    },
+  ],
+});
+
+onMounted(() => {
+  dataList();
+});
+</script>

+ 10 - 0
src/views/device/instance/index.vue

@@ -162,6 +162,16 @@ option.value = Object.assign(option.value, {
       prop: "manufacturer",
     },
     {
+      label: "所属部门",
+      prop: "deptId",
+      type: "tree",
+      dicUrl: dictDataUtil.dept_tree_url,
+      props: {
+        label: "deptName",
+        value: "id",
+      }
+    },
+    {
       label: "所在车间",
       prop: "workshop",
     },

+ 140 - 0
src/views/device/maintenance/components/record-page.vue

@@ -0,0 +1,140 @@
+<template>
+  <div class="mainContentBox">
+    <avue-crud
+        ref="crudRef"
+        v-model:search="search"
+        v-model="form"
+        :data="data"
+        :option="option"
+        v-model:page="page"
+        @search-change="searchChange"
+        @search-reset="resetChange"
+        @size-change="dataList"
+        @current-change="dataList"
+    >
+    </avue-crud>
+  </div>
+</template>
+<script setup lang="ts">
+import { ref,defineProps } from "vue";
+import { useCrud } from "@/hooks/userCrud";
+
+import { useCommonStoreHook } from "@/store";
+import dictDataUtil from "@/common/configs/dictDataUtil";
+const { isShowTable, tableType } = toRefs(useCommonStoreHook());
+const test = () => {
+  isShowTable.value = true;
+  tableType.value = tableType.value == 1 ? 2 : 1;
+};
+// 传入一个url,后面不带/
+const { form, data, option, search, page, toDeleteIds, Methords, Utils } =
+  useCrud({
+    src: "/api/v1/device/maintenanceRecord",
+  });
+const { dataList, createRow, updateRow, deleteRow, searchChange, resetChange } = Methords; //增删改查
+const { selectionChange, multipleDelete } = Methords; //选中和批量删除事件
+const { checkBtnPerm, downloadTemplate } = Utils; //按钮权限等工具
+
+const crudRef = ref(null); //crudRef.value 获取avue-crud对象
+const props = defineProps({
+  maintenanceId: {
+    type: Number,
+    default: () => {
+      return 0;
+    }
+  }
+})
+
+watch?.(
+    () => props.maintenanceId,
+    (newVal: string) => {
+      alert(newVal)
+      search.value.maintenanceId = newVal
+      dataList()
+    }
+);
+
+// 设置表格列或者其他自定义的option
+option.value = Object.assign(option.value, {
+  delBtn: false,
+  selection: false,
+  search: false,
+  editBtn: false,
+  addBtn: false,
+  viewBtn: false,
+  menu: false,
+  column: [
+    {
+      label: "设备编号",
+      prop: "deviceNo",
+      width: '120',
+      rules: [
+        {
+          required: true,
+          message: "设备编号不能为空",
+          trigger: "trigger",
+        },
+      ],
+    },
+    {
+      label: "设备名称",
+      prop: "deviceName",
+      width: '120',
+      rules: [
+        {
+          required: true,
+          message: "设备名称不能为空",
+          trigger: "trigger",
+        },
+      ],
+    },
+    {
+      label: "设备类型",
+      prop: "deviceType",
+      type: "select",
+      width: '100',
+      dicUrl:
+        dictDataUtil.request_url +
+        dictDataUtil.TYPE_CODE.device_type,
+      props: {
+        label: "dictLabel",
+        value: "dictValue",
+      },
+    },
+    {
+      label: "设备位置",
+      width: '150',
+      prop: "devicePosition",
+    },
+    {
+      label: "维护类型",
+      prop: "type",
+      type: "select",
+      editDisplay: false,
+      dicData: [{label: '点检',value:0},{label: '保养',value:1}]
+    },
+    {
+      label: "维护人",
+      prop: "maintenanceUser",
+    },
+    {
+      label: "维护结果",
+      prop: "result",
+      search: true,
+      type: "select",
+      editDisplay: false,
+      dicData: [{label: '正常',value:0},{label: '报故',value:1}]
+    },
+    {
+      label: "维护时间",
+      width: '180',
+      prop: "maintenanceTime",
+    },
+  ],
+});
+
+onMounted?.(() => {
+  search.value.maintenanceId = props.maintenanceId
+  dataList();
+});
+</script>

+ 156 - 11
src/views/device/maintenance/index.vue

@@ -26,6 +26,25 @@
           >删除</el-button
         >
       </template>
+      <template #menu="{size,row,index}">
+        <el-button @click="maintenance(row)"
+                   icon="el-icon-setting"
+                   text
+                   v-if="row.state === 0"
+                   type="primary"
+                   :size="size">维护</el-button>
+        <el-button disabled
+                   icon="el-icon-setting"
+                   text
+                   v-if="row.state === 1"
+                   type="primary"
+                   :size="size">维护</el-button>
+        <el-button @click="maintenanceList(row)"
+                   icon="el-icon-fold"
+                   text
+                   type="primary"
+                   :size="size">记录</el-button>
+      </template>
     </avue-crud>
     <el-dialog
         v-model="dialog.visible"
@@ -35,15 +54,86 @@
     >
       <device-page  @deviceInfo="deviceInfo"/>
     </el-dialog>
+
+    <el-dialog
+        v-model="dialog1.visible"
+        :title="dialog1.title"
+        width="750px"
+        height="80%"
+        @close="dialog1.visible = false">
+      <el-timeline style="max-width: 500px;margin-left: 100px">
+        <el-timeline-item center color="#0bbd87" type="success" placement="top">
+          <el-card>
+            <h4>维护计划</h4>
+            <p>设备编号: {{maintenanceInfo.deviceNo}}</p>
+            <p>设备名称:{{maintenanceInfo.deviceName}}</p>
+            <p>维护内容:{{maintenanceInfo.remark}}</p>
+            <p>计划时间:{{maintenanceInfo.nextTime}}</p>
+          </el-card>
+        </el-timeline-item>
+        <el-timeline-item center placement="top" :type="maintenanceInfo.state === 0 ? 'primary' : 'success'">
+          <el-card>
+            <h4>设备维护</h4>
+            <el-form ref="maintenanceInfoForm" :model="maintenanceInfo" label-width="auto" style="max-width: 400px" :rules="rules">
+              <el-form-item label="维护人员" prop="userName">
+                <el-select
+                    v-model="maintenanceInfo.userName"
+                    placeholder="维护人员"
+                    size="large"
+                    style="width: 240px">
+                  <el-option
+                      v-for="item in userList"
+                      :key="item.userName"
+                      :label="item.userName"
+                      :value="item.userName"
+                  />
+                </el-select>
+              </el-form-item>
+              <el-form-item label="维护结果">
+                <el-radio-group v-model="maintenanceInfo.result" class="ml-4">
+                  <el-radio :value="0">正常</el-radio>
+                  <el-radio :value="1">报故</el-radio>
+                </el-radio-group>
+              </el-form-item>
+              <el-form-item v-if="maintenanceInfo.result === 1" label="报故内容">
+                <el-input v-model="maintenanceInfo.maintenanceContent" />
+              </el-form-item>
+              <el-form-item v-if="maintenanceInfo.result === 0" label="下次维护日期">
+                <el-input v-model="maintenanceInfo.nextTime" type="date" format="YYYY-MM-DD" value-format="YYYY-MM-DD"/>
+              </el-form-item>
+              <el-form-item v-if="maintenanceInfo.result === 0" label="下次维护内容">
+                <el-input v-model="maintenanceInfo.maintenanceContent" />
+              </el-form-item>
+              <el-form-item style="margin-left: 45%">
+                <el-button type="primary" @click="maintenanceSubmit">保存</el-button>
+              </el-form-item>
+            </el-form>
+          </el-card>
+        </el-timeline-item>
+      </el-timeline>
+    </el-dialog>
+
+    <el-dialog
+        v-model="dialog2.visible"
+        :title="dialog2.title"
+        width="60%"
+        height="80%"
+        @close="dialog2.visible = false"
+    >
+      <record-page :maintenanceId="maintenanceInfo.id"></record-page>
+    </el-dialog>
   </div>
 </template>
 <script setup>
 import { ref, getCurrentInstance } from "vue";
 import { useCrud } from "@/hooks/userCrud";
 import ButtonPermKeys from "@/common/configs/buttonPermission";
-
+import {getUserList} from "@/api/user"
+import {maintenanceUpdate} from "@/api/device/index";
+import {treeList} from "@/api/dept/index"
 import { useCommonStoreHook } from "@/store";
 import dictDataUtil from "@/common/configs/dictDataUtil";
+import RecordPage from "./components/record-page.vue";
 const { isShowTable, tableType } = toRefs(useCommonStoreHook());
 const test = () => {
   isShowTable.value = true;
@@ -54,6 +144,15 @@ const dialog = reactive({
   title: "设备选择",
   visible: false,
 });
+const dialog1 = reactive({
+  title: "设备维护",
+  visible: false,
+});
+const dialog2 = reactive({
+  title: "设备维护记录",
+  visible: false,
+});
+const userList = ref([])
 // 传入一个url,后面不带/
 const { form, data, option, search, page, toDeleteIds, Methords, Utils } =
   useCrud({
@@ -62,17 +161,59 @@ const { form, data, option, search, page, toDeleteIds, Methords, Utils } =
 const { dataList, createRow, updateRow, deleteRow, searchChange, resetChange } = Methords; //增删改查
 const { selectionChange, multipleDelete } = Methords; //选中和批量删除事件
 const { checkBtnPerm, downloadTemplate, exportData } = Utils; //按钮权限等工具
-
 const crudRef = ref(null); //crudRef.value 获取avue-crud对象
 const deviceInfo = (value) => {
   form.value.deviceNo = value.deviceNo
   dialog.visible = false
 }
+const maintenanceInfo = ref(null)
+const maintenance = (row)=>{
+  maintenanceInfo.value = row
+  maintenanceInfo.value.maintenanceContent = row.remark
+  maintenanceInfo.value.result = 0
+  dialog1.visible = true
+}
+const maintenanceList = (row)=>{
+  maintenanceInfo.value = row
+  dialog2.visible = true
+}
+const queryUserList = ()=>{
+  getUserList({}).then((data)=>{
+    userList.value = data.data
+  })
+}
+const maintenanceInfoForm = ref('maintenanceInfoForm')
+const maintenanceSubmit =()=>{
+  //alert(JSON.stringify(maintenanceInfo.value))
+  maintenanceInfoForm.value.validate((isValid, invalidFields) => {
+    if (isValid) {
+      maintenanceUpdate(maintenanceInfo.value).then((data)=>{
+        ElMessage({
+          message: data.msg,
+          type: "success",
+        });
+        maintenanceInfo.value = null
+        dialog1.visible = false
+        dataList()
+      })
+    }
+  })
+}
+const rules = reactive({
+  userName: [
+    // required是否必填,message不符合此规则时的提示信息,
+    // trigger触发此条规则校验的时机,有两个值, blur 或 change,默认就是blur和change都会进行校验
+    // min此字段的最小长度,max此字段的最大长度
+    // pattern 正则表达式
+    { required: true, message: '维护人员不能为空', trigger: 'blur' }
+  ]
+})
 // 设置表格列或者其他自定义的option
 option.value = Object.assign(option.value, {
   delBtn: false,
   selection: true,
   labelWidth: 150,
+  viewBtn: false,
   column: [
     {
       label: "设备编号",
@@ -85,14 +226,17 @@ option.value = Object.assign(option.value, {
           trigger: "trigger",
         },
       ],
-      focus: ({ value, column }) => {
-        dialog.visible = true
+      click: ({ value, column }) => {
+        if(column.boxType){
+          dialog.visible = true
+        }
       },
     },
     {
       label: "设备名称",
       prop: "deviceName",
       display: false,
+      search: true,
     },
     {
       label: "设备类型",
@@ -123,8 +267,9 @@ option.value = Object.assign(option.value, {
     {
       label: "维护类型",
       prop: "type",
-      type: "select",
       search: true,
+      type: "select",
+      editDisplay: false,
       dicData: [{label: '点检',value:0},{label: '保养',value:1}],
       rules: [
         {
@@ -138,7 +283,6 @@ option.value = Object.assign(option.value, {
       label: "维护频次",
       prop: "cycle",
       type: "select",
-      search: true,
       dicUrl:
           dictDataUtil.request_url +
           dictDataUtil.TYPE_CODE.device_maintenance_cycle,
@@ -158,7 +302,7 @@ option.value = Object.assign(option.value, {
       label: "运行状态",
       prop: "runState",
       type: "select",
-      search: true,
+      display: false,
       dicUrl:
           dictDataUtil.request_url +
           dictDataUtil.TYPE_CODE.device_run_status,
@@ -178,7 +322,7 @@ option.value = Object.assign(option.value, {
       label: "维护状态",
       prop: "state",
       type: "select",
-      search: true,
+      addDisplay: false,
       dicData: [{label: '待维护',value:0},{label: '已维护',value:1}],
       rules: [
         {
@@ -189,7 +333,7 @@ option.value = Object.assign(option.value, {
       ],
     },
     {
-      label: "下次维护日期",
+      label: "维护日期",
       prop: "nextTime",
       type: "date",
       width: "120",
@@ -204,17 +348,18 @@ option.value = Object.assign(option.value, {
       ],
     },
     {
-      label: "备注",
+      label: "维护内容",
       prop: "remark",
       minRows: 2, //最小行/最小值
       type: "textarea", //类型为多行文本域框
       maxlength: 512, //最大输入长度
+      overHidden: true
     },
   ],
 });
 
 onMounted(() => {
-  // console.log("crudRef", crudRef)
   dataList();
+  queryUserList()
 });
 </script>

+ 311 - 0
src/views/device/metering/index.vue

@@ -0,0 +1,311 @@
+<template>
+  <div class="mainContentBox">
+    <avue-crud
+        ref="crudRef"
+        v-model:search="search"
+        v-model="form"
+        :data="data"
+        :option="option"
+        v-model:page="page"
+        @row-save="createRow"
+        @row-update="updateRow"
+        @row-del="deleteRow"
+        @search-change="searchChange"
+        @search-reset="resetChange"
+        @size-change="dataList"
+        @current-change="dataList"
+        @selection-change="selectionChange"
+    >
+      <template #menu-left="{ size }">
+        <el-button
+          :disabled="toDeleteIds.length < 1"
+          type="danger"
+          icon="el-icon-delete"
+          :size="size"
+          @click="multipleDelete"
+          >删除</el-button
+        >
+      </template>
+      <template #menu="{size,row,index}">
+        <el-button @click="maintenance(row,0)"
+                   icon="el-icon-check"
+                   text
+                   type="primary"
+                   :size="size">流程</el-button>
+        <el-button @click="maintenance(row,1)"
+                   icon="el-icon-fold"
+                   text
+                   type="primary"
+                   :size="size">记录</el-button>
+      </template>
+    </avue-crud>
+    <el-dialog
+        v-model="dialog.visible"
+        :title="dialog.title"
+        width="850px"
+        @close="dialog.visible = false"
+    >
+      <device-page  @deviceInfo="deviceInfo"/>
+    </el-dialog>
+
+    <el-dialog
+        v-model="dialog1.visible"
+        :title="dialog1.title"
+        width="750px"
+        height="80%"
+        @close="dialog1.visible = false">
+      <el-timeline style="max-width: 500px;margin-left: 100px">
+        <el-timeline-item center type="success" placement="top">
+          <el-card>
+            <h4>设备报故</h4>
+            <p>设备编号: {{maintenanceInfo.deviceNo}}</p>
+            <p>设备名称: {{maintenanceInfo.deviceName}}</p>
+            <p>报故人员: {{maintenanceInfo.creator}}</p>
+            <p>故障描述: {{maintenanceInfo.bugRemark}}</p>
+            <p>报故时间: {{maintenanceInfo.created}}</p>
+          </el-card>
+        </el-timeline-item>
+        <el-timeline-item center placement="top"  :type="maintenanceInfo.state === 0 ? 'primary' : 'success'">
+          <el-card v-if="viewPage">
+            <h4>设备维修</h4>
+            <p>维修人员: {{maintenanceInfo.handleUser}}</p>
+            <p>维修内容: {{maintenanceInfo.handleContent}}</p>
+            <p>处理结果: {{maintenanceInfo.handleUser ? (maintenanceInfo.handleResult === 0 ? '可正常运行' : '报废') : ''}}</p>
+          </el-card>
+          <el-card v-if="!viewPage">
+            <h4>设备维修</h4>
+            <el-form ref="maintenanceInfoForm1" :model="maintenanceInfo" label-width="auto" style="max-width: 400px" :rules="rules1">
+              <el-form-item label="维修人员" prop="handleUser">
+                <el-input :disabled="maintenanceInfo.state !== 0" v-model="maintenanceInfo.handleUser" />
+              </el-form-item>
+              <el-form-item label="维修内容" prop="handleContent">
+                <el-input :disabled="maintenanceInfo.state !== 0" type="textarea" :rows="2" v-model="maintenanceInfo.handleContent" />
+              </el-form-item>
+              <el-form-item label="处理结果">
+                <el-radio-group :disabled="maintenanceInfo.state !== 0" v-model="maintenanceInfo.handleResult" class="ml-4">
+                  <el-radio :value="0">可正常运行</el-radio>
+                  <el-radio :value="1">报废</el-radio>
+                </el-radio-group>
+              </el-form-item>
+              <el-form-item style="margin-left: 45%">
+                <el-button type="primary" v-if="maintenanceInfo.state === 0" :disabled="maintenanceInfo.state !== 0" @click="maintenanceSubmit1">保存</el-button>
+              </el-form-item>
+            </el-form>
+          </el-card>
+        </el-timeline-item>
+        <el-timeline-item center placement="top"  :type="maintenanceInfo.state === 1 ? 'primary' : maintenanceInfo.state === 0 ? 'info' : 'success'">
+          <el-card v-if="viewPage">
+            <h4>设备审批</h4>
+            <p>审批人员: {{maintenanceInfo.auditUser}}</p>
+            <p>审批结果: {{maintenanceInfo.auditUser ? (maintenanceInfo.auditResult === 0 ? '通过' : '不通过') : ''}}</p>
+          </el-card>
+          <el-card v-if="!viewPage">
+            <h4>设备审批</h4>
+            <el-form ref="maintenanceInfoForm2" v-if="maintenanceInfo.state >= 1" :model="maintenanceInfo" label-width="auto" style="max-width: 400px" :rules="rules2">
+              <el-form-item label="审批人员" prop="auditUser">
+                <el-input :disabled="maintenanceInfo.state !== 1 && readonly"  v-model="maintenanceInfo.auditUser" />
+              </el-form-item>
+              <el-form-item label="审批结果">
+                <el-radio-group :disabled="maintenanceInfo.state !== 1 && readonly" v-model="maintenanceInfo.auditResult" class="ml-4">
+                  <el-radio :value="0">通过</el-radio>
+                  <el-radio :value="1">不通过</el-radio>
+                </el-radio-group>
+              </el-form-item>
+              <el-form-item style="margin-left: 45%">
+                <el-button type="primary" v-if="maintenanceInfo.state ===1" :disabled="maintenanceInfo.state !== 1" @click="maintenanceSubmit2">保存</el-button>
+              </el-form-item>
+            </el-form>
+          </el-card>
+        </el-timeline-item>
+      </el-timeline>
+    </el-dialog>
+  </div>
+</template>
+<script setup>
+import { ref, getCurrentInstance } from "vue";
+import { useCrud } from "@/hooks/userCrud";
+import ButtonPermKeys from "@/common/configs/buttonPermission";
+import {getUserList} from "@/api/user"
+import {repair,audit} from "@/api/device/index";
+import { useCommonStoreHook } from "@/store";
+import dictDataUtil from "@/common/configs/dictDataUtil";
+const { isShowTable, tableType } = toRefs(useCommonStoreHook());
+const test = () => {
+  isShowTable.value = true;
+  tableType.value = tableType.value == 1 ? 2 : 1;
+};
+
+const viewPage = ref(true)
+
+const dialog = reactive({
+  title: "设备选择",
+  visible: false,
+});
+const dialog1 = reactive({
+  title: "设备维修",
+  visible: false,
+});
+const userList = ref([])
+// 传入一个url,后面不带/
+const { form, data, option, search, page, toDeleteIds, Methords, Utils } =
+  useCrud({
+    src: "/api/v1/device/repair",
+  });
+const { dataList, createRow, updateRow, deleteRow, searchChange, resetChange } = Methords; //增删改查
+const { selectionChange, multipleDelete } = Methords; //选中和批量删除事件
+const { checkBtnPerm, downloadTemplate, exportData } = Utils; //按钮权限等工具
+const crudRef = ref(null); //crudRef.value 获取avue-crud对象
+const deviceInfo = (value) => {
+  form.value.deviceNo = value.deviceNo
+  form.value.deviceName =value.deviceName
+  form.value.deviceType = value.deviceType
+  form.value.devicePosition = value.devicePosition
+  dialog.visible = false
+}
+const maintenanceInfo = ref(null)
+const maintenance = (row,type)=>{
+  viewPage.value = type === 0 ? false : true
+  maintenanceInfo.value = row
+  maintenanceInfo.value.handResult = 0
+  dialog1.visible = true
+}
+const queryUserList = ()=>{
+  getUserList({}).then((data)=>{
+    userList.value = data.data
+  })
+}
+const maintenanceInfoForm1 = ref('maintenanceInfoForm1')
+const maintenanceInfoForm2 = ref('maintenanceInfoForm2')
+const maintenanceSubmit1 =()=>{
+  //alert(JSON.stringify(maintenanceInfo.value))
+  maintenanceInfoForm1.value.validate((isValid, invalidFields) => {
+    if (isValid) {
+      repair(maintenanceInfo.value).then((data)=>{
+        ElMessage({
+          message: data.msg,
+          type: "success",
+        });
+        dialog1.visible = false
+        dataList()
+      })
+    }
+  })
+}
+const maintenanceSubmit2 =()=>{
+  //alert(JSON.stringify(maintenanceInfo.value))
+  maintenanceInfoForm2.value.validate((isValid, invalidFields) => {
+    if (isValid) {
+      audit(maintenanceInfo.value).then((data)=>{
+        ElMessage({
+          message: data.msg,
+          type: "success",
+        });
+        dialog1.visible = false
+        dataList()
+      })
+    }
+  })
+}
+const rules1 = reactive({
+  handleUser: [
+    { required: true, message: '维修人员不能为空', trigger: 'blur' }
+  ],
+  handleContent: [
+    { required: true, message: '维修内容不能为空', trigger: 'blur' }
+  ]
+})
+const rules2 = reactive({
+  auditUser: [
+    { required: true, message: '审批人员不能为空', trigger: 'blur' }
+  ]
+})
+// 设置表格列或者其他自定义的option
+option.value = Object.assign(option.value, {
+  delBtn: false,
+  selection: true,
+  labelWidth: 150,
+  viewBtn: false,
+  editBtn: false,
+  column: [
+    {
+      label: "设备编号",
+      prop: "deviceNo",
+      search: true,
+      rules: [
+        {
+          required: true,
+          message: "设备编号不能为空",
+          trigger: "trigger",
+        },
+      ],
+      click: ({ value, column }) => {
+        if(column.boxType){
+          dialog.visible = true
+        }
+      },
+    },
+    {
+      label: "设备名称",
+      prop: "deviceName",
+      addDisabled: true,
+      search: true,
+    },
+    {
+      label: "设备类型",
+      prop: "deviceType",
+      type: "select",
+      addDisabled: true,
+      search: true,
+      dicUrl:
+        dictDataUtil.request_url +
+        dictDataUtil.TYPE_CODE.device_type,
+      props: {
+        label: "dictLabel",
+        value: "dictValue",
+      },
+      rules: [
+        {
+          required: true,
+          message: "设备类型不能为空",
+          trigger: "trigger",
+        },
+      ],
+    },
+    {
+      label: "设备位置",
+      addDisabled: true,
+      prop: "devicePosition",
+    },
+    {
+      label: "故障描述",
+      prop: "bugRemark",
+      minRows: 2, //最小行/最小值
+      type: "textarea", //类型为多行文本域框
+      maxlength: 512, //最大输入长度
+    },
+    {
+      label: "维修状态",
+      prop: "state",
+      type: "select",
+      display: false,
+      dicData:[{label: '待维修',value: 0},{label: '待审批 ',value: 1},{label: '已完成',value: 2}],
+    },
+    {
+      label: "报故人",
+      prop: "creator",
+      display: false,
+    },
+    {
+      label: "报故日期",
+      prop: "created",
+      width: "180",
+      display: false,
+    },
+  ],
+});
+
+onMounted(() => {
+  dataList();
+  queryUserList()
+});
+</script>

+ 201 - 60
src/views/device/repair/index.vue

@@ -26,14 +26,107 @@
           >删除</el-button
         >
       </template>
+      <template #menu="{size,row,index}">
+        <el-button @click="maintenance(row,0)"
+                   icon="el-icon-check"
+                   text
+                   type="primary"
+                   :size="size">流程</el-button>
+        <el-button @click="maintenance(row,1)"
+                   icon="el-icon-fold"
+                   text
+                   type="primary"
+                   :size="size">记录</el-button>
+      </template>
     </avue-crud>
+    <el-dialog
+        v-model="dialog.visible"
+        :title="dialog.title"
+        width="850px"
+        @close="dialog.visible = false"
+    >
+      <device-page  @deviceInfo="deviceInfo"/>
+    </el-dialog>
+
+    <el-dialog
+        v-model="dialog1.visible"
+        :title="dialog1.title"
+        width="750px"
+        height="80%"
+        @close="dialog1.visible = false">
+      <el-timeline style="max-width: 500px;margin-left: 100px">
+        <el-timeline-item center type="success" placement="top">
+          <el-card>
+            <h4>设备报故</h4>
+            <p>设备编号: {{maintenanceInfo.deviceNo}}</p>
+            <p>设备名称: {{maintenanceInfo.deviceName}}</p>
+            <p>报故人员: {{maintenanceInfo.creator}}</p>
+            <p>故障描述: {{maintenanceInfo.bugRemark}}</p>
+            <p>报故时间: {{maintenanceInfo.created}}</p>
+          </el-card>
+        </el-timeline-item>
+        <el-timeline-item center placement="top"  :type="maintenanceInfo.state === 0 ? 'primary' : 'success'">
+          <el-card v-if="viewPage">
+            <h4>设备维修</h4>
+            <p>维修人员: {{maintenanceInfo.handleUser}}</p>
+            <p>维修内容: {{maintenanceInfo.handleContent}}</p>
+            <p>处理结果: {{maintenanceInfo.handleUser ? (maintenanceInfo.handleResult === 0 ? '可正常运行' : '报废') : ''}}</p>
+          </el-card>
+          <el-card v-if="!viewPage">
+            <h4>设备维修</h4>
+            <el-form ref="maintenanceInfoForm1" :model="maintenanceInfo" label-width="auto" style="max-width: 400px" :rules="rules1">
+              <el-form-item label="维修人员" prop="handleUser">
+                <el-input :disabled="maintenanceInfo.state !== 0" v-model="maintenanceInfo.handleUser" />
+              </el-form-item>
+              <el-form-item label="维修内容" prop="handleContent">
+                <el-input :disabled="maintenanceInfo.state !== 0" type="textarea" :rows="2" v-model="maintenanceInfo.handleContent" />
+              </el-form-item>
+              <el-form-item label="处理结果">
+                <el-radio-group :disabled="maintenanceInfo.state !== 0" v-model="maintenanceInfo.handleResult" class="ml-4">
+                  <el-radio :value="0">可正常运行</el-radio>
+                  <el-radio :value="1">报废</el-radio>
+                </el-radio-group>
+              </el-form-item>
+              <el-form-item style="margin-left: 45%">
+                <el-button type="primary" v-if="maintenanceInfo.state === 0" :disabled="maintenanceInfo.state !== 0" @click="maintenanceSubmit1">保存</el-button>
+              </el-form-item>
+            </el-form>
+          </el-card>
+        </el-timeline-item>
+        <el-timeline-item center placement="top"  :type="maintenanceInfo.state === 1 ? 'primary' : maintenanceInfo.state === 0 ? 'info' : 'success'">
+          <el-card v-if="viewPage">
+            <h4>设备审批</h4>
+            <p>审批人员: {{maintenanceInfo.auditUser}}</p>
+            <p>审批结果: {{maintenanceInfo.auditUser ? (maintenanceInfo.auditResult === 0 ? '通过' : '不通过') : ''}}</p>
+          </el-card>
+          <el-card v-if="!viewPage">
+            <h4>设备审批</h4>
+            <el-form ref="maintenanceInfoForm2" v-if="maintenanceInfo.state >= 1" :model="maintenanceInfo" label-width="auto" style="max-width: 400px" :rules="rules2">
+              <el-form-item label="审批人员" prop="auditUser">
+                <el-input :disabled="maintenanceInfo.state !== 1 && readonly"  v-model="maintenanceInfo.auditUser" />
+              </el-form-item>
+              <el-form-item label="审批结果">
+                <el-radio-group :disabled="maintenanceInfo.state !== 1 && readonly" v-model="maintenanceInfo.auditResult" class="ml-4">
+                  <el-radio :value="0">通过</el-radio>
+                  <el-radio :value="1">不通过</el-radio>
+                </el-radio-group>
+              </el-form-item>
+              <el-form-item style="margin-left: 45%">
+                <el-button type="primary" v-if="maintenanceInfo.state ===1" :disabled="maintenanceInfo.state !== 1" @click="maintenanceSubmit2">保存</el-button>
+              </el-form-item>
+            </el-form>
+          </el-card>
+        </el-timeline-item>
+      </el-timeline>
+    </el-dialog>
   </div>
 </template>
 <script setup>
 import { ref, getCurrentInstance } from "vue";
 import { useCrud } from "@/hooks/userCrud";
 import ButtonPermKeys from "@/common/configs/buttonPermission";
-
+import {getUserList} from "@/api/user"
+import {repair,audit} from "@/api/device/index";
 import { useCommonStoreHook } from "@/store";
 import dictDataUtil from "@/common/configs/dictDataUtil";
 const { isShowTable, tableType } = toRefs(useCommonStoreHook());
@@ -42,28 +135,97 @@ const test = () => {
   tableType.value = tableType.value == 1 ? 2 : 1;
 };
 
+const viewPage = ref(true)
+
+const dialog = reactive({
+  title: "设备选择",
+  visible: false,
+});
+const dialog1 = reactive({
+  title: "设备维修",
+  visible: false,
+});
+const userList = ref([])
 // 传入一个url,后面不带/
 const { form, data, option, search, page, toDeleteIds, Methords, Utils } =
   useCrud({
-    src: "/api/v1/device",
+    src: "/api/v1/device/repair",
   });
 const { dataList, createRow, updateRow, deleteRow, searchChange, resetChange } = Methords; //增删改查
 const { selectionChange, multipleDelete } = Methords; //选中和批量删除事件
 const { checkBtnPerm, downloadTemplate, exportData } = Utils; //按钮权限等工具
-// checkBtnPerm(ButtonPermKeys.PLAN.BTNS.order_add) :permission="permission"
-// const permission = reactive({
-//   delBtn: checkPerm(buttonPermission.PLAN.BTNS.order_del),
-//   addBtn: checkPerm(buttonPermission.PLAN.BTNS.order_add),
-//   editBtn: checkPerm(buttonPermission.PLAN.BTNS.order_edit),
-//   menu: true,
-// });
-
 const crudRef = ref(null); //crudRef.value 获取avue-crud对象
-
+const deviceInfo = (value) => {
+  form.value.deviceNo = value.deviceNo
+  form.value.deviceName =value.deviceName
+  form.value.deviceType = value.deviceType
+  form.value.devicePosition = value.devicePosition
+  dialog.visible = false
+}
+const maintenanceInfo = ref(null)
+const maintenance = (row,type)=>{
+  viewPage.value = type === 0 ? false : true
+  maintenanceInfo.value = row
+  maintenanceInfo.value.handResult = 0
+  dialog1.visible = true
+}
+const queryUserList = ()=>{
+  getUserList({}).then((data)=>{
+    userList.value = data.data
+  })
+}
+const maintenanceInfoForm1 = ref('maintenanceInfoForm1')
+const maintenanceInfoForm2 = ref('maintenanceInfoForm2')
+const maintenanceSubmit1 =()=>{
+  //alert(JSON.stringify(maintenanceInfo.value))
+  maintenanceInfoForm1.value.validate((isValid, invalidFields) => {
+    if (isValid) {
+      repair(maintenanceInfo.value).then((data)=>{
+        ElMessage({
+          message: data.msg,
+          type: "success",
+        });
+        dialog1.visible = false
+        dataList()
+      })
+    }
+  })
+}
+const maintenanceSubmit2 =()=>{
+  //alert(JSON.stringify(maintenanceInfo.value))
+  maintenanceInfoForm2.value.validate((isValid, invalidFields) => {
+    if (isValid) {
+      audit(maintenanceInfo.value).then((data)=>{
+        ElMessage({
+          message: data.msg,
+          type: "success",
+        });
+        dialog1.visible = false
+        dataList()
+      })
+    }
+  })
+}
+const rules1 = reactive({
+  handleUser: [
+    { required: true, message: '维修人员不能为空', trigger: 'blur' }
+  ],
+  handleContent: [
+    { required: true, message: '维修内容不能为空', trigger: 'blur' }
+  ]
+})
+const rules2 = reactive({
+  auditUser: [
+    { required: true, message: '审批人员不能为空', trigger: 'blur' }
+  ]
+})
 // 设置表格列或者其他自定义的option
 option.value = Object.assign(option.value, {
   delBtn: false,
   selection: true,
+  labelWidth: 150,
+  viewBtn: false,
+  editBtn: false,
   column: [
     {
       label: "设备编号",
@@ -76,23 +238,23 @@ option.value = Object.assign(option.value, {
           trigger: "trigger",
         },
       ],
+      click: ({ value, column }) => {
+        if(column.boxType){
+          dialog.visible = true
+        }
+      },
     },
     {
       label: "设备名称",
       prop: "deviceName",
+      addDisabled: true,
       search: true,
-      rules: [
-        {
-          required: true,
-          message: "设备名称不能为空",
-          trigger: "trigger",
-        },
-      ],
     },
     {
       label: "设备类型",
       prop: "deviceType",
       type: "select",
+      addDisabled: true,
       search: true,
       dicUrl:
         dictDataUtil.request_url +
@@ -110,61 +272,40 @@ option.value = Object.assign(option.value, {
       ],
     },
     {
-      label: "设备状态",
-      prop: "state",
-      type: "select",
-      search: true,
-      dicUrl:
-          dictDataUtil.request_url +
-          dictDataUtil.TYPE_CODE.device_status,
-      props: {
-        label: "dictLabel",
-        value: "dictValue",
-      },
-      rules: [
-        {
-          required: true,
-          message: "设备状态不能为空",
-          trigger: "trigger",
-        },
-      ],
+      label: "设备位置",
+      addDisabled: true,
+      prop: "devicePosition",
     },
     {
-      label: "负责人",
-      prop: "head",
-      rules: [
-        {
-          required: true,
-          message: "负责人不能为空",
-          trigger: "trigger",
-        },
-      ],
-    },
-    {
-      label: "供应厂商",
-      prop: "manufacturer",
-    },
-    {
-      label: "所在车间",
-      prop: "workshop",
+      label: "故障描述",
+      prop: "bugRemark",
+      minRows: 2, //最小行/最小值
+      type: "textarea", //类型为多行文本域框
+      maxlength: 512, //最大输入长度
     },
     {
-      label: "所在工位",
-      prop: "station",
+      label: "维修状态",
+      prop: "state",
+      type: "select",
+      display: false,
+      dicData:[{label: '待维修',value: 0},{label: '待审批 ',value: 1},{label: '已完成',value: 2}],
     },
     {
-      label: "规格",
-      prop: "specifications",
+      label: "报故人",
+      prop: "creator",
+      display: false,
     },
     {
-      label: "品牌",
-      prop: "brand",
+      label: "报故日期",
+      prop: "created",
+      width: "180",
+      display: false,
     },
   ],
 });
 
 onMounted(() => {
-  // console.log("crudRef", crudRef)
   dataList();
+  queryUserList()
 });
 </script>