Jelajahi Sumber

Merge branch 'approve' of shuzhihua/pms-app into master

yanghao 14 jam lalu
induk
melakukan
20e0eeff54
10 mengubah file dengan 1137 tambahan dan 607 penghapusan
  1. 11 1
      api/fault.js
  2. 11 0
      api/repair.js
  3. 21 0
      api/ruihen.js
  4. 11 0
      api/task.js
  5. 12 12
      config/env.dev.js
  6. 129 129
      manifest.json
  7. 672 459
      pages/message/detail/index.vue
  8. 31 3
      pages/repair/detail.vue
  9. 236 3
      pages/repair/index.vue
  10. 3 0
      utils/request.js

+ 11 - 1
api/fault.js

@@ -80,4 +80,14 @@ export const getFailureApprovalList = () =>
 			url: `/rq/iot-device/company/${deviceId}`,
 			method: 'GET'
 		});
-	}
+}
+	
+
+
+ export function updateIotMaintainProcess(processId,id, type,assigneeUserId, trans){
+	//  return request.put({ url: `/rq/iot-failure-report/process-info?processId=` + processId + `&id=` + id + `&type=` + type + `&assigneeUserId=` + assigneeUserId + `&trans=` + trans })
+		request({
+			url: `/rq/iot-failure-report/process-info?processId=` + processId + `&id=` + id + `&type=` + type + `&assigneeUserId=` + assigneeUserId + `&trans=` + trans,
+			method: 'PUT',
+		})
+  }

+ 11 - 0
api/repair.js

@@ -68,3 +68,14 @@ export function getRepairProjectManagerList(params) {
 		params
 	})
 }
+
+
+  export function maintainMethod(data) {
+		// return request.post({ url: `/rq/iot-maintain/method`, data })
+		
+		return request({
+			url: `/rq/iot-maintain/method`,
+			method: 'post',
+			data
+	  })
+  }

+ 21 - 0
api/ruihen.js

@@ -23,3 +23,24 @@ export function getRuiHenReportPage(params) {
     params,
   });
 }
+
+// 获取公司层级的部门 及所有子部门
+export function companyLevelChildrenDepts() {
+  // return  request.get({ url: '/system/dept/companyLevelChildrenDepts' })
+  return request({
+    url: '/system/dept/companyLevelChildrenDepts',
+    method: 'get'
+  });
+}
+
+
+// 获取公司层级的部门包含的子部门下的所有人员
+export const companyDeptsEmployee = (params) => {
+  // return request.get({ url: '/system/user/companyDeptsEmployee', params })
+  return request({
+    url: '/system/user/companyDeptsEmployee',
+    method: 'get',
+   
+    params,
+  });
+}

+ 11 - 0
api/task.js

@@ -45,6 +45,17 @@ export const approvalTask = (id, reason) =>
     data: { id, reason, variables: {}, nextAssignees: {} },
   })
 
+
+// 瑞恒审批通过
+export const rhApproveTask = async (data) => {
+  // return await request.put({ url: '/bpm/task/approve', data })
+  return await request({
+    url: '/bpm/task/approve',
+    method: 'PUT',
+    data,
+  })
+}
+
 /**
  * 拒绝任务
  * @param id

+ 12 - 12
config/env.dev.js

@@ -1,14 +1,14 @@
 // 开发环境配置
 export default {
-  // apiUrl: "http://192.168.188.198:48080",
-  apiUrl: "https://iot.deepoil.cc",
-  // apiUrl: 'https://aims.deepoil.cc', //正式
-  apiUrlSuffix: "/admin-api",
-  // 其他开发环境配置...
-  corpId: "dingbe7f9a7e8cffa2bd35c2f4657eb6378f", //钉钉微应用 企业的CorpID - 正式环境
-  clientId: "dingmr9ez0ecgbmscfeb", //钉钉微应用的Client ID - 正式环境(原企业内部应用的 AppKey。原第三方企业应用的 SuiteKey。)
-  AgentId: "3687646006", //钉钉微应用的AgentID - 正式环境
-  MiniAppId: "5000000006298501", //钉钉微应用的MiniAppID - 正式环境
-  AppKey: "dingmr9ez0ecgbmscfeb", //钉钉微应用的AppKey - 正式环境
-  AppSecret: "VhG_zMdTvIBwA_0Ef8FJ0foH3VYYo5T-kw0ukX_PBA8Ah1xl7AjDw5RVYCU0DTpe", //钉钉微应用的AppSecret - 正式环境
-};
+	// apiUrl: "http://192.168.188.198:48080",
+	apiUrl: "https://iot.deepoil.cc",
+	// apiUrl: 'https://aims.deepoil.cc', //正式
+	apiUrlSuffix: "/admin-api",
+	// 其他开发环境配置...
+	corpId: "dingbe7f9a7e8cffa2bd35c2f4657eb6378f", //钉钉微应用 企业的CorpID - 正式环境
+	clientId: "dingmr9ez0ecgbmscfeb", //钉钉微应用的Client ID - 正式环境(原企业内部应用的 AppKey。原第三方企业应用的 SuiteKey。)
+	AgentId: "3687646006", //钉钉微应用的AgentID - 正式环境
+	MiniAppId: "5000000006298501", //钉钉微应用的MiniAppID - 正式环境
+	AppKey: "dingmr9ez0ecgbmscfeb", //钉钉微应用的AppKey - 正式环境
+	AppSecret: "VhG_zMdTvIBwA_0Ef8FJ0foH3VYYo5T-kw0ukX_PBA8Ah1xl7AjDw5RVYCU0DTpe", //钉钉微应用的AppSecret - 正式环境
+};

+ 129 - 129
manifest.json

@@ -1,130 +1,130 @@
 {
-	"name": "DeepOil",
-	"appid": "__UNI__6E4BC49",
-	"description": "",
-	"versionName": "1.3.0",
-	"versionCode": 10300,
-	"transformPx": false,
-	/* 5+App特有相关 */
-	"app-plus": {
-		"usingComponents": true,
-		"nvueStyleCompiler": "uni-app",
-		"compilerVersion": 3,
-		"splashscreen": {
-			"alwaysShowBeforeRender": true,
-			"waiting": true,
-			"autoclose": true,
-			"delay": 0
-		},
-		"webpack": {
-			"externals": {
-				"dingtalk-jsapi": "dingtalk-jsapi" // 告诉 webpack 不打包该依赖
-			}
-		},
-		/* 模块配置 */
-		"modules": {
-			"VideoPlayer": {
-				"enabled": true,
-				"mode": "default",
-				"orientation": "auto",
-				"background": "#000000",
-				"controls": true,
-				"autoPlay": false,
-				"loop": false,
-				"showFullscreenBtn": true,
-				"showPlayBtn": true,
-				"showCenterPlayBtn": true,
-				"showProgress": true,
-				"objectFit": "contain"
-			},
-			"SQLite": {}
-		},
-		/* 应用发布信息 */
-		"distribute": {
-			/* sdk */
-			"sdkConfigs": {
-				"oauth": {
-					"dingtalk": {
-						"appid": "dingcrhejkptu0mcsw3r",
-						"universalLinks": "http://1.94.244.160:70/"
-					}
-				}
-			},
-			/* android打包配置 */
-			"android": {
-				"permissions": [
-					"<uses-feature android:name=\"android.hardware.camera\"/>",
-					"<uses-feature android:name=\"android.hardware.camera.autofocus\"/>",
-					"<uses-permission android:name=\"android.permission.ACCESS_COARSE_LOCATION\"/>",
-					"<uses-permission android:name=\"android.permission.VIBRATE\"/>",
-					"<uses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\"/>",
-					"<uses-permission android:name=\"android.permission.ACCESS_MOCK_LOCATION\"/>",
-					"<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>",
-					"<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>",
-					// "<uses-permission android:name=\"android.permission.CALL_PHONE\"/>",
-					"<uses-permission android:name=\"android.permission.CAMERA\"/>",
-					"<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>",
-					"<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>",
-					"<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>",
-					"<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>",
-					"<uses-permission android:name=\"android.permission.GET_TASKS\"/>",
-					"<uses-permission android:name=\"android.permission.INTERNET\"/>",
-					"<uses-permission android:name=\"android.permission.MODIFY_AUDIO_SETTINGS\"/>",
-					"<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>",
-					"<uses-permission android:name=\"android.permission.READ_CONTACTS\"/>",
-					"<uses-permission android:name=\"android.permission.READ_LOGS\"/>",
-					"<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>",
-					"<uses-permission android:name=\"android.permission.READ_SMS\"/>",
-					"<uses-permission android:name=\"android.permission.RECEIVE_BOOT_COMPLETED\"/>",
-					"<uses-permission android:name=\"android.permission.RECORD_AUDIO\"/>",
-					"<uses-permission android:name=\"android.permission.SEND_SMS\"/>",
-					"<uses-permission android:name=\"android.permission.SYSTEM_ALERT_WINDOW\"/>",
-					"<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>",
-					"<uses-permission android:name=\"android.permission.WRITE_CONTACTS\"/>",
-					"<uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\"/>",
-					"<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>",
-					"<uses-permission android:name=\"android.permission.WRITE_SMS\"/>",
-					"<uses-permission android:name=\"android.permission.RECEIVE_USER_PRESENT\"/>"
-				],
-				"schemes": "deepoil"
-			},
-			/* ios打包配置 */
-			"ios": {
-				"dSYMs": false
-			},
-			/* SDK配置 */
-			"sdkConfigs__UNI__6E4BC49\t": {},
-			"splashscreen": {
-				"useOriginalMsgbox": false
-			}
-		}
-	},
-	/* 快应用特有相关 */
-	"quickapp": {},
-	/* 小程序特有相关 */
-	"mp-weixin": {
-		"appid": "",
-		"setting": {
-			"urlCheck": false
-		},
-		"usingComponents": true
-	},
-	"mp-alipay": {
-		"usingComponents": true
-	},
-	"mp-baidu": {
-		"usingComponents": true
-	},
-	"mp-toutiao": {
-		"usingComponents": true
-	},
-	"uniStatistics": {
-		"enable": false
-	},
-	"vueVersion": "3",
-	"h5": {
-		"router": {
-			"base": "./"
-		}
-	}
-}
+    "name" : "DeepOil",
+    "appid" : "__UNI__6E4BC49",
+    "description" : "",
+    "versionName" : "1.3.2",
+    "versionCode" : 10302,
+    "transformPx" : false,
+    /* 5+App特有相关 */
+    "app-plus" : {
+        "usingComponents" : true,
+        "nvueStyleCompiler" : "uni-app",
+        "compilerVersion" : 3,
+        "splashscreen" : {
+            "alwaysShowBeforeRender" : true,
+            "waiting" : true,
+            "autoclose" : true,
+            "delay" : 0
+        },
+        "webpack" : {
+            "externals" : {
+                "dingtalk-jsapi" : "dingtalk-jsapi" // 告诉 webpack 不打包该依赖
+            }
+        },
+        /* 模块配置 */
+        "modules" : {
+            "VideoPlayer" : {
+                "enabled" : true,
+                "mode" : "default",
+                "orientation" : "auto",
+                "background" : "#000000",
+                "controls" : true,
+                "autoPlay" : false,
+                "loop" : false,
+                "showFullscreenBtn" : true,
+                "showPlayBtn" : true,
+                "showCenterPlayBtn" : true,
+                "showProgress" : true,
+                "objectFit" : "contain"
+            },
+            "SQLite" : {}
+        },
+        /* 应用发布信息 */
+        "distribute" : {
+            /* sdk */
+            "sdkConfigs" : {
+                "oauth" : {
+                    "dingtalk" : {
+                        "appid" : "dingcrhejkptu0mcsw3r",
+                        "universalLinks" : "http://1.94.244.160:70/"
+                    }
+                }
+            },
+            /* android打包配置 */
+            "android" : {
+                "permissions" : [
+                    "<uses-feature android:name=\"android.hardware.camera\"/>",
+                    "<uses-feature android:name=\"android.hardware.camera.autofocus\"/>",
+                    "<uses-permission android:name=\"android.permission.ACCESS_COARSE_LOCATION\"/>",
+                    "<uses-permission android:name=\"android.permission.VIBRATE\"/>",
+                    "<uses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\"/>",
+                    "<uses-permission android:name=\"android.permission.ACCESS_MOCK_LOCATION\"/>",
+                    "<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>",
+                    // "<uses-permission android:name=\"android.permission.CALL_PHONE\"/>",
+                    "<uses-permission android:name=\"android.permission.CAMERA\"/>",
+                    "<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>",
+                    "<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>",
+                    "<uses-permission android:name=\"android.permission.GET_TASKS\"/>",
+                    "<uses-permission android:name=\"android.permission.INTERNET\"/>",
+                    "<uses-permission android:name=\"android.permission.MODIFY_AUDIO_SETTINGS\"/>",
+                    "<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>",
+                    "<uses-permission android:name=\"android.permission.READ_CONTACTS\"/>",
+                    "<uses-permission android:name=\"android.permission.READ_LOGS\"/>",
+                    "<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.READ_SMS\"/>",
+                    "<uses-permission android:name=\"android.permission.RECEIVE_BOOT_COMPLETED\"/>",
+                    "<uses-permission android:name=\"android.permission.RECORD_AUDIO\"/>",
+                    "<uses-permission android:name=\"android.permission.SEND_SMS\"/>",
+                    "<uses-permission android:name=\"android.permission.SYSTEM_ALERT_WINDOW\"/>",
+                    "<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>",
+                    "<uses-permission android:name=\"android.permission.WRITE_CONTACTS\"/>",
+                    "<uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\"/>",
+                    "<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>",
+                    "<uses-permission android:name=\"android.permission.WRITE_SMS\"/>",
+                    "<uses-permission android:name=\"android.permission.RECEIVE_USER_PRESENT\"/>"
+                ],
+                "schemes" : "deepoil"
+            },
+            /* ios打包配置 */
+            "ios" : {
+                "dSYMs" : false
+            },
+            /* SDK配置 */
+            "sdkConfigs__UNI__6E4BC49\t" : {},
+            "splashscreen" : {
+                "useOriginalMsgbox" : false
+            }
+        }
+    },
+    /* 快应用特有相关 */
+    "quickapp" : {},
+    /* 小程序特有相关 */
+    "mp-weixin" : {
+        "appid" : "",
+        "setting" : {
+            "urlCheck" : false
+        },
+        "usingComponents" : true
+    },
+    "mp-alipay" : {
+        "usingComponents" : true
+    },
+    "mp-baidu" : {
+        "usingComponents" : true
+    },
+    "mp-toutiao" : {
+        "usingComponents" : true
+    },
+    "uniStatistics" : {
+        "enable" : false
+    },
+    "vueVersion" : "3",
+    "h5" : {
+        "router" : {
+            "base" : "./"
+        }
+    }
+}

+ 672 - 459
pages/message/detail/index.vue

@@ -1,459 +1,672 @@
-<template>
-  <view class="page">
-    <view class="flex-col item" style="overflow: auto; height: 100%">
-      <view class="item-process-id">
-        {{ $t('message.processId') + data.processInstance?.id }}
-      </view>
-      <uni-row class="flex-row flex-wrap item-content">
-        <uni-col :span="7">{{ $t('message.startUser') }}</uni-col>
-        <uni-col :span="17">{{ data.processInstance?.startUser?.nickname }}</uni-col>
-        <uni-col :span="7" class="mt-15">{{ $t('message.deviceName') }}</uni-col>
-        <uni-col :span="17" class="mt-15">{{ faultInfo?.deviceName }}</uni-col>
-        <template v-if="processId.startsWith('GZ')">
-          <uni-col :span="7" class="mt-15">{{ $t('approval.fault.name') }}</uni-col>
-          <uni-col :span="17" class="mt-15">{{ faultInfo?.failureName }}</uni-col>
-          <uni-col :span="7" class="mt-15">{{ $t('approval.fault.system') }}</uni-col>
-          <uni-col :span="17" class="mt-15">{{ faultInfo?.failureSystem }}</uni-col>
-          <uni-col :span="7" class="mt-15">{{ $t('approval.fault.ifDeal') }}</uni-col>
-          <uni-col :span="17" class="mt-15">{{ getYesOrNo(faultInfo?.ifDeal) }}</uni-col>
-          <uni-col :span="7" class="mt-15">{{ $t('approval.fault.status') }}</uni-col>
-          <uni-col :span="17" class="mt-15">{{ getFaultStatusName(faultInfo?.status) }}</uni-col>
-          <uni-col :span="7" class="mt-15">{{ $t('approval.fault.ifStop') }}</uni-col>
-          <uni-col :span="17" class="mt-15">{{ getYesOrNo(faultInfo?.ifStop) }}</uni-col>
-          <uni-col :span="7" class="mt-15">{{ $t('approval.fault.failureTime') }}</uni-col>
-          <uni-col :span="17" class="mt-15">{{ formatDate(faultInfo?.failureTime) }}</uni-col>
-          <uni-col v-if="faultInfo?.ifDeal" :span="7" class="mt-15">{{ $t('approval.fault.dealTime') }}</uni-col>
-          <uni-col v-if="faultInfo?.ifDeal" :span="17" class="mt-15">{{ formatDate(faultInfo?.dealTime) }}</uni-col>
-          <uni-col :span="7" class="mt-15">{{ $t('approval.fault.needHelp') }}</uni-col>
-          <uni-col :span="17" class="mt-15">{{ getYesOrNo(faultInfo?.needHelp) }}</uni-col>
-          <uni-col :span="7" class="mt-15">{{ $t('approval.fault.failureInfluence') }}</uni-col>
-          <uni-col :span="17" class="mt-15">{{ faultInfo?.failureInfluence }}</uni-col>
-          <uni-col v-if="faultInfo?.ifDeal" :span="7" class="mt-15">{{ $t('approval.fault.solution') }}</uni-col>
-          <uni-col v-if="faultInfo?.ifDeal" :span="17" class="mt-15">{{ faultInfo?.solution }}</uni-col>
-          <uni-col :span="7" class="mt-15">{{ $t('approval.fault.description') }}</uni-col>
-          <uni-col :span="17" class="mt-15">{{ faultInfo?.description }}</uni-col>
-          <uni-col :span="7" class="mt-15">{{ $t('approval.fault.remark') }}</uni-col>
-          <uni-col :span="17" class="mt-15">{{ faultInfo?.remark }}</uni-col>
-          <uni-col :span="7" class="mt-15">{{ $t('approval.fault.pic') }}</uni-col>
-          <uni-col :span="17" class="mt-15">
-            <image :src="faultInfo?.pic" style="width: 50px; height: 50px" @click="previewImage(faultInfo?.pic)" />
-          </uni-col>
-        </template>
-        <template v-else>
-          <uni-col :span="7" class="mt-15">{{ $t('approval.fault.status') }}</uni-col>
-          <uni-col :span="17" class="mt-15">{{ getFaultStatusName(faultInfo?.status) }}</uni-col>
-          <uni-col :span="7" class="mt-15">{{ $t('approval.maintain.type') }}</uni-col>
-          <uni-col :span="17" class="mt-15">{{ getRepairTypeName(faultInfo?.type) }}</uni-col>
-          <uni-col :span="7" class="mt-15">{{ $t('approval.fault.ifStop') }}</uni-col>
-          <uni-col :span="17" class="mt-15">{{ getYesOrNo(faultInfo?.ifStop) }}</uni-col>
-          <uni-col :span="7" class="mt-15">{{ $t('approval.maintain.startTime') }}</uni-col>
-          <uni-col :span="17" class="mt-15">{{ formatDate(faultInfo?.maintainStartTime) }}</uni-col>
-          <uni-col :span="7" class="mt-15">{{ $t('approval.maintain.endTime') }}</uni-col>
-          <uni-col :span="17" class="mt-15">{{ formatDate(faultInfo?.maintainEndTime) }}</uni-col>
-          <uni-col :span="7" class="mt-15">{{ $t('approval.maintain.person') }}</uni-col>
-          <uni-col :span="17" class="mt-15">{{ faultInfo?.nickname }}</uni-col>
-          <uni-col :span="7" class="mt-15">{{ $t('approval.fault.failureTime') }}</uni-col>
-          <uni-col :span="17" class="mt-15">{{ formatDate(faultInfo?.failureTime) }}</uni-col>
-          <uni-col :span="7" class="mt-15">{{ $t('approval.fault.failureInfluence') }}</uni-col>
-          <uni-col :span="17" class="mt-15">{{ faultInfo?.failureInfluence }}</uni-col>
-          <uni-col :span="7" class="mt-15">{{ $t('approval.fault.system') }}</uni-col>
-          <uni-col :span="17" class="mt-15">{{ faultInfo?.failureSystem }}</uni-col>
-          <uni-col :span="7" class="mt-15">{{ $t('approval.maintain.maintainFee') }}</uni-col>
-          <uni-col :span="17" class="mt-15">{{ faultInfo?.maintainFee }}</uni-col>
-          <uni-col :span="7" class="mt-15">{{ $t('approval.fault.description') }}</uni-col>
-          <uni-col :span="17" class="mt-15">{{ faultInfo?.description }}</uni-col>
-          <uni-col :span="7" class="mt-15">{{ $t('approval.maintain.desc') }}</uni-col>
-          <uni-col :span="17" class="mt-15">{{ faultInfo?.maintainDescription }}</uni-col>
-          <uni-col :span="7" class="mt-15">{{ $t('approval.fault.solution') }}</uni-col>
-          <uni-col :span="17" class="mt-15">{{ faultInfo?.solution }}</uni-col>
-          <uni-col :span="7" class="mt-15">{{ $t('approval.fault.remark') }}</uni-col>
-          <uni-col :span="17" class="mt-15">{{ faultInfo?.remark }}</uni-col>
-          <uni-col :span="7" class="mt-15">{{ $t('approval.fault.pic') }}</uni-col>
-          <uni-col :span="17" class="mt-15">
-            <image :src="faultInfo?.pic" style="width: 50px; height: 50px" @click="previewImage(faultInfo?.pic)" />
-          </uni-col>
-        </template>
-        <uni-col :span="24" class="mt-15 flex-row flex-wrap justify-end">
-          <view v-for="(button, index) of buttonList">
-            <button
-              v-if="button.enable"
-              class="fill-button"
-              style="margin-left: 10px; margin-top: 10px"
-              @click="onButtonClick(index, button.displayName)"
-            >
-              {{ button.displayName }}
-            </button>
-          </view>
-<!--          <view v-if="buttonList && buttonList.length === 0">-->
-<!--            <button-->
-<!--              class="fill-button"-->
-<!--              style="margin-left: 10px; margin-top: 10px"-->
-<!--              @click="onButtonClick('7', $t('operation.cancel'))"-->
-<!--            >-->
-<!--            {{ $t('operation.cancel') }}-->
-<!--            </button>-->
-<!--          </view>-->
-        </uni-col>
-      </uni-row>
-    </view>
-    <uni-popup ref="dispatchUserPopup" type="bottom" background-color="white" border-radius="6px 6px 0 0">
-      <view class="popup">
-        <uni-forms ref="formRef" :model="form" :rules="rules" label-width="100px">
-          <uni-forms-item v-if="['1', '3', '4'].includes(clickedButtonIndex)" :label="userFormItemLabel" name="assigneeUserId" required>
-            <next-data-select
-              v-model="form.assigneeUserId"
-              :options="userList"
-              filterable
-              themeColor="#004098"
-            />
-          </uni-forms-item>
-          <uni-forms-item v-if="clickedButtonIndex === '5'" :label="userFormItemLabel" name="userIds" required>
-            <next-data-select
-                v-model="form.userIds"
-                :options="userList"
-                :collapseTagsNum="2"
-                multiple
-                filterable
-                themeColor="#004098"
-            />
-          </uni-forms-item>
-          <uni-forms-item v-if="clickedButtonIndex === '1'" :label="$t('message.repairType')" name="type" required>
-            <next-data-select
-              v-model="form.type"
-              :options="repairTypeList"
-              format="{label}"
-              field="value as value, label as text, label as label"
-            />
-          </uni-forms-item>
-          <uni-forms-item v-if="clickedButtonIndex !== '7'" :label="$t('message.reason')" name="reason" :required="['3', '4', '5'].includes(clickedButtonIndex)">
-            <uni-easyinput v-model="form.reason" type="textarea" />
-          </uni-forms-item>
-          <uni-forms-item v-if="clickedButtonIndex === '7'" :label="$t('message.reason1')" name="reason" required>
-            <uni-easyinput v-model="form.reason" :placeholder="$t('message.cancelHint')" type="textarea" />
-          </uni-forms-item>
-        </uni-forms>
-        <uni-row class="flex-row justify-center">
-          <button v-if="clickedButtonIndex !== '5'" class="fill-button" style="margin-right: 10px" @click="handleClick">
-            {{ clickedButtonIndex !== '7' ? clickedButtonText : $t('operation.confirm1') }}
-          </button>
-          <button v-if="clickedButtonIndex === '5'" class="fill-button" style="margin-right: 10px" @click="handleClick('before')">
-            {{ $t('message.form.beforeSign') }}
-          </button>
-          <button v-if="clickedButtonIndex === '5'" class="fill-button" style="margin-right: 10px" @click="handleClick('after')">
-            {{ $t('message.form.afterSign') }}
-          </button>
-          <button class="outline-button" plain="true" @click="cancel">{{ $t('operation.cancel') }}</button>
-        </uni-row>
-      </view>
-    </uni-popup>
-  </view>
-</template>
-
-<script setup>
-import { computed, getCurrentInstance, reactive, ref } from "vue"
-import { onLoad } from '@dcloudio/uni-app'
-import {
-  approvalTask, cancelTask,
-  createSignTask,
-  delegateTask,
-  getApprovalDetail,
-  rejectTask,
-  returnTask,
-  transferTask
-} from "@/api/task"
-import { getFaultDetail, updateFaultProcess } from "@/api/fault";
-import dayjs from "dayjs";
-import { useDataDictStore } from "@/store/modules/dataDict";
-import { getUserList } from "@/api";
-import { reloginByUserId } from "@/utils/auth";
-import { getRepairDetail } from "@/api/repair";
-
-const data = ref({}) // 详情数据
-const faultInfo = ref({}) // 故障信息
-const statusList = ref([]) // 审批状态列表
-const repairTypeList = ref([]) // 维修状态列表
-const userList = ref([]) // 用户列表
-const yesOrNo = ref([]) // 是或否
-const faultStatusList = ref([]) // 故障状态列表
-
-// 通过状态码获取状态名称
-const getFaultStatusName = (status) => {
-  if (!status) return ''
-  for (const item of faultStatusList.value) {
-    if (item.value === status) {
-      return item.label
-    }
-  }
-}
-// const getStatusName = (status) => {
-//   if (!status) return ''
-//   for (const item of statusList.value) {
-//     if ((item.value + '') === status) {
-//       return item.label
-//     }
-//   }
-// }
-
-// 通过布尔类型获取是或否
-const getYesOrNo = (value) => {
-  if (value === undefined) return ''
-  for (const item of yesOrNo.value) {
-    if (value && item.value === 'true') {
-      return item.label
-    } else if (!value && item.value === 'false') {
-      return item.label
-    }
-  }
-}
-
-// 通过维修类型获取名称
-const getRepairTypeName = (type) => {
-  if (!type) return ''
-  for (const item of repairTypeList.value) {
-    if (item.value === type) {
-      return item.label
-    }
-  }
-}
-
-// 格式化日期
-const formatDate = (date) => {
-  if (!date) return ''
-  return dayjs(date).format('YYYY-MM-DD')
-}
-
-const getUserName = (userId) => {
-  if (!userId) return
-  for (const item of userList.value) {
-    if (item.value === userId) {
-      faultInfo.value.nickname = item.label
-      return item.label
-    }
-  }
-}
-
-// 预览图片
-const previewImage = (url) => {
-  if (!url) return
-  uni.previewImage({ urls: [url] })
-}
-
-const buttonList = ref()
-const setButtonList = (data) => {
-  if (data && data.todoTask) {
-    buttonList.value = data.todoTask.buttonsSetting || []
-  } else {
-    buttonList.value = []
-  }
-}
-
-const userFormItemLabel = computed(() => {
-  const index = clickedButtonIndex.value
-  if (index === '1') {
-    return t('message.dispatchUser') // 负责人
-  } else if (index === '3') {
-    return t('message.form.user3') // 新审批人
-  } else if (index === '4') {
-    return t('message.form.user4') // 接收人
-  } else if (index === '5') {
-    return t('message.form.user5') // 加签处理人
-  } else {
-    return ''
-  }
-})
-const clickedButtonIndex = ref(0)
-const clickedButtonText = ref('')
-const onButtonClick = async (index, text) => {
-  clickedButtonIndex.value = index
-  clickedButtonText.value = text
-
-  if (index === '1') { // 分配责任人
-    rules.assigneeUserId.rules = [{ required: true, errorMessage: t('message.form.errorHint1') }]
-    rules.reason.rules[0].required = false
-  } else if (index === '2') { // 拒绝
-    rules.assigneeUserId.rules[0].required = false
-    rules.reason.rules[0].required = false
-  } else if (index === '3') { // 转办
-    rules.assigneeUserId.rules = [{ required: true, errorMessage: t('message.form.errorHint3') }]
-    rules.reason.rules[0].required = true
-  } else if (index === '4') { // 委派
-    rules.assigneeUserId.rules = [{ required: true, errorMessage: t('message.form.errorHint5') }]
-    rules.reason.rules[0].required = true
-  } else if (index === '5') { // 加签
-    rules.assigneeUserId.rules[0].required = false
-    rules.userIds.rules[0].required = true
-    rules.reason.rules[0].required = true
-  } else if (index === '6') { // 退回
-    const code = (await returnTask(taskId.value)).code
-    if (code === 0) {
-      uni.showToast({ title: t('operation.success'), icon: 'none' })
-      uni.navigateBack()
-      uni.$emit('update')
-    }
-    return
-  } else if (index === '7') {
-    rules.reason.rules[0].errorMessage = t('message.form.errorHint7')
-  }
-  showDispatchUserPopup()
-}
-// 分配责任人弹窗
-const dispatchUserPopup = ref()
-const showDispatchUserPopup = () => {
-  dispatchUserPopup.value.open('bottom')
-}
-const form = reactive({
-  assigneeUserId: undefined,
-  delegateUserId: undefined,
-  userIds: undefined,
-  type: undefined,
-  reason: undefined,
-  id: undefined,
-})
-
-const formRef = ref()
-const { appContext } = getCurrentInstance()
-const t = appContext.config.globalProperties.$t
-const rules = reactive({
-  assigneeUserId: { rules: [{ required: true, errorMessage: t('message.form.errorHint1') }] },
-  userIds: { rules: [{ required: true, errorMessage: t('message.form.errorHint6') }] }, // 加签处理人
-  type: { rules: [{ required: true, errorMessage: t('message.form.errorHint2') }] },
-  reason: { rules: [{ required: true, errorMessage: t('message.form.errorHint4') }] },
-})
-const cancel = () => dispatchUserPopup.value.close('bottom')
-const handleClick = async (sign) => {
-  try {
-    const valid = await formRef.value.validate()
-    if (!valid) return
-
-    if (!form.reason) {
-      form.reason = form.reason || ''
-    }
-
-    let code = -1
-    if (clickedButtonIndex.value === '1') { // 分配责任人
-      code = (await updateFaultProcess(faultId.value, form.type, form.assigneeUserId)).code
-      code = (await approvalTask(taskId.value, form.reason)).code
-    } else if (clickedButtonIndex.value === '2') { // 拒绝
-      code = (await rejectTask(taskId.value, form.reason)).code
-    } else if (clickedButtonIndex.value === '3') { // 转办
-      code = (await transferTask(taskId.value, form.assigneeUserId, form.reason)).code
-    } else if (clickedButtonIndex.value === '4') { // 委派
-      code = (await delegateTask(taskId.value, form.assigneeUserId, form.reason)).code
-    } else if (clickedButtonIndex.value === '5') { // 加签
-      code = (await createSignTask(taskId.value, form.userIds, sign, form.reason)).code
-    } else if (clickedButtonIndex.value === '7') { // 退回
-      code = (await cancelTask(processId.value, form.reason)).code
-    }
-    if (code === 0) { // 成功时返回
-      uni.showToast({ title: t('operation.success'), icon: 'none' })
-      uni.$emit('update')
-      uni.navigateBack()
-    }
-  } catch (e) {
-    console.log(e)
-  }
-}
-
-const processId = ref('')
-const taskId = ref('')
-const faultId = ref('')
-const { loadDataDictList, getDataDictList } = useDataDictStore()
-onLoad(async (options) => {
-  await reloginByUserId(options.reloginUserId)
-
-  taskId.value = options.id
-  processId.value = options.processInstanceId
-  statusList.value = getDataDictList('crm_audit_status') // 审批状态列表
-  repairTypeList.value = getDataDictList('pms_main_type') // 维修类型列表
-  faultStatusList.value = getDataDictList('pms_failure_status') // 故障状态列表
-  yesOrNo.value = getDataDictList('infra_boolean_string') // 是或否
-
-  if (repairTypeList.value.length === 0) {
-    await loadDataDictList()
-
-    statusList.value = getDataDictList('crm_audit_status') // 审批状态列表
-    repairTypeList.value = getDataDictList('pms_main_type') // 维修类型列表
-    faultStatusList.value = getDataDictList('pms_failure_status') // 故障状态列表
-    yesOrNo.value = getDataDictList('infra_boolean_string') // 是或否
-  }
-
-  data.value = (await getApprovalDetail(options)).data
-  faultId.value = data.value.processInstance.businessKey
-  if (processId.value.startsWith('GZ')) {
-    faultInfo.value = (await getFaultDetail({ id: faultId.value })).data
-  } else {
-    faultInfo.value = (await getRepairDetail({ id: faultId.value})).data
-  }
-  setButtonList(data.value)
-
-  let userId
-  if (data.value.todoTask) {
-    userId = data.value.todoTask.assigneeUser.id
-    if (!taskId.value) {
-      taskId.value = data.value.todoTask.id
-    }
-  } else {
-    userId = data.value.processInstance.startUser.id
-  }
-  userList.value = (await getUserList(userId)).data.map(item => ({
-    value: item.id,
-    text: item.nickname,
-    label: item.nickname,
-  }))
-  getUserName(faultInfo.value?.maintainPerson)
-})
-</script>
-
-<style scoped lang="scss">
-.item {
-  margin: 10px 0;
-  background-color: white;
-  border-radius: 0 0 6px 6px;
-}
-
-.item-process-id {
-  padding: 10px;
-  background: linear-gradient( 270deg, #FFFFFF 0%, #8EBEFF 100%);
-  border-radius: 6px 6px 0 0;
-}
-
-.item-content {
-  padding: 15px 20px 12px 10px;
-  font-size: 14px;
-  color: #333333;
-}
-
-.mt-15 {
-  margin-top: 15px;
-}
-
-.mt-27 {
-  margin-top: 27px;
-}
-
-.outline-button {
-  border: 1px #004098 solid;
-  border-radius: 3px;
-  color: #004098;
-  font-size: 14px;
-  min-width: 90px;
-  height: 32px;
-  line-height: 32px;
-  margin: 0;
-}
-
-.fill-button {
-  background-color: #004098;
-  color: white;
-  font-size: 14px;
-  min-width: 90px;
-  height: 32px;
-  line-height: 32px;
-  margin: 0;
-  padding: 0;
-}
-
-.popup {
-  padding: 10px;
-}
-</style>
+<template>
+	<view class="page">
+		<view class="flex-col item" style="overflow: auto; height: 100%">
+			<view class="item-process-id">
+				{{ $t('message.processId') + data.processInstance?.id }}
+			</view>
+			<uni-row class="flex-row flex-wrap item-content">
+				<uni-col :span="7">{{ $t('message.startUser') }}</uni-col>
+				<uni-col :span="17">{{ data.processInstance?.startUser?.nickname }}</uni-col>
+				<uni-col :span="7" class="mt-15">{{ $t('message.deviceName') }}</uni-col>
+				<uni-col :span="17" class="mt-15">{{ faultInfo?.deviceName }}</uni-col>
+				<template v-if="processId.startsWith('GZ')">
+					<uni-col :span="7" class="mt-15">{{ $t('approval.fault.name') }}</uni-col>
+					<uni-col :span="17" class="mt-15">{{ faultInfo?.failureName }}</uni-col>
+					<uni-col :span="7" class="mt-15">{{ $t('approval.fault.system') }}</uni-col>
+					<uni-col :span="17" class="mt-15">{{ faultInfo?.failureSystem }}</uni-col>
+					<uni-col :span="7" class="mt-15">{{ $t('approval.fault.ifDeal') }}</uni-col>
+					<uni-col :span="17" class="mt-15">{{ getYesOrNo(faultInfo?.ifDeal) }}</uni-col>
+					<uni-col :span="7" class="mt-15">{{ $t('approval.fault.status') }}</uni-col>
+					<uni-col :span="17" class="mt-15">{{ getFaultStatusName(faultInfo?.status) }}</uni-col>
+					<uni-col :span="7" class="mt-15">{{ $t('approval.fault.ifStop') }}</uni-col>
+					<uni-col :span="17" class="mt-15">{{ getYesOrNo(faultInfo?.ifStop) }}</uni-col>
+					<uni-col :span="7" class="mt-15">{{ $t('approval.fault.failureTime') }}</uni-col>
+					<uni-col :span="17" class="mt-15">{{ formatDate(faultInfo?.failureTime) }}</uni-col>
+					<uni-col v-if="faultInfo?.ifDeal" :span="7" class="mt-15">{{ $t('approval.fault.dealTime') }}</uni-col>
+					<uni-col v-if="faultInfo?.ifDeal" :span="17" class="mt-15">{{ formatDate(faultInfo?.dealTime) }}</uni-col>
+					<uni-col :span="7" class="mt-15">{{ $t('approval.fault.needHelp') }}</uni-col>
+					<uni-col :span="17" class="mt-15">{{ getYesOrNo(faultInfo?.needHelp) }}</uni-col>
+					<uni-col :span="7" class="mt-15">{{ $t('approval.fault.failureInfluence') }}</uni-col>
+					<uni-col :span="17" class="mt-15">{{ faultInfo?.failureInfluence }}</uni-col>
+					<uni-col v-if="faultInfo?.ifDeal" :span="7" class="mt-15">{{ $t('approval.fault.solution') }}</uni-col>
+					<uni-col v-if="faultInfo?.ifDeal" :span="17" class="mt-15">{{ faultInfo?.solution }}</uni-col>
+					<uni-col :span="7" class="mt-15">{{ $t('approval.fault.description') }}</uni-col>
+					<uni-col :span="17" class="mt-15">{{ faultInfo?.description }}</uni-col>
+					<uni-col :span="7" class="mt-15">{{ $t('approval.fault.remark') }}</uni-col>
+					<uni-col :span="17" class="mt-15">{{ faultInfo?.remark }}</uni-col>
+					<uni-col :span="7" class="mt-15">{{ $t('approval.fault.pic') }}</uni-col>
+					<uni-col :span="17" class="mt-15">
+						<image :src="faultInfo?.pic" style="width: 50px; height: 50px" @click="previewImage(faultInfo?.pic)" />
+					</uni-col>
+				</template>
+				<template v-else>
+					<uni-col :span="7" class="mt-15">{{ $t('approval.fault.status') }}</uni-col>
+					<uni-col :span="17" class="mt-15">{{ getFaultStatusName(faultInfo?.status) }}</uni-col>
+					<uni-col :span="7" class="mt-15">{{ $t('approval.maintain.type') }}</uni-col>
+					<uni-col :span="17" class="mt-15">{{ getRepairTypeName(faultInfo?.type) }}</uni-col>
+					<uni-col :span="7" class="mt-15">{{ $t('approval.fault.ifStop') }}</uni-col>
+					<uni-col :span="17" class="mt-15">{{ getYesOrNo(faultInfo?.ifStop) }}</uni-col>
+					<uni-col :span="7" class="mt-15">{{ $t('approval.maintain.startTime') }}</uni-col>
+					<uni-col :span="17" class="mt-15">{{ formatDate(faultInfo?.maintainStartTime) }}</uni-col>
+					<uni-col :span="7" class="mt-15">{{ $t('approval.maintain.endTime') }}</uni-col>
+					<uni-col :span="17" class="mt-15">{{ formatDate(faultInfo?.maintainEndTime) }}</uni-col>
+					<uni-col :span="7" class="mt-15">{{ $t('approval.maintain.person') }}</uni-col>
+					<uni-col :span="17" class="mt-15">{{ faultInfo?.nickname }}</uni-col>
+					<uni-col :span="7" class="mt-15">{{ $t('approval.fault.failureTime') }}</uni-col>
+					<uni-col :span="17" class="mt-15">{{ formatDate(faultInfo?.failureTime) }}</uni-col>
+					<uni-col :span="7" class="mt-15">{{ $t('approval.fault.failureInfluence') }}</uni-col>
+					<uni-col :span="17" class="mt-15">{{ faultInfo?.failureInfluence }}</uni-col>
+					<uni-col :span="7" class="mt-15">{{ $t('approval.fault.system') }}</uni-col>
+					<uni-col :span="17" class="mt-15">{{ faultInfo?.failureSystem }}</uni-col>
+					<uni-col :span="7" class="mt-15">{{ $t('approval.maintain.maintainFee') }}</uni-col>
+					<uni-col :span="17" class="mt-15">{{ faultInfo?.maintainFee }}</uni-col>
+					<uni-col :span="7" class="mt-15">{{ $t('approval.fault.description') }}</uni-col>
+					<uni-col :span="17" class="mt-15">{{ faultInfo?.description }}</uni-col>
+					<uni-col :span="7" class="mt-15">{{ $t('approval.maintain.desc') }}</uni-col>
+					<uni-col :span="17" class="mt-15">{{ faultInfo?.maintainDescription }}</uni-col>
+					<uni-col :span="7" class="mt-15">{{ $t('approval.fault.solution') }}</uni-col>
+					<uni-col :span="17" class="mt-15">{{ faultInfo?.solution }}</uni-col>
+					<uni-col :span="7" class="mt-15">{{ $t('approval.fault.remark') }}</uni-col>
+					<uni-col :span="17" class="mt-15">{{ faultInfo?.remark }}</uni-col>
+					<uni-col :span="7" class="mt-15">{{ $t('approval.fault.pic') }}</uni-col>
+					<uni-col :span="17" class="mt-15">
+						<image :src="faultInfo?.pic" style="width: 50px; height: 50px" @click="previewImage(faultInfo?.pic)" />
+					</uni-col>
+				</template>
+				<uni-col :span="24" class="mt-15 flex-row flex-wrap justify-end">
+					<view v-for="(button, index) of buttonList">
+						<button v-if="button.enable" class="fill-button" style="margin-left: 10px; margin-top: 10px" @click="onButtonClick(index, button.displayName)">
+							{{ button.displayName }}
+						</button>
+					</view>
+					<!--          <view v-if="buttonList && buttonList.length === 0">-->
+					<!--            <button-->
+					<!--              class="fill-button"-->
+					<!--              style="margin-left: 10px; margin-top: 10px"-->
+					<!--              @click="onButtonClick('7', $t('operation.cancel'))"-->
+					<!--            >-->
+					<!--            {{ $t('operation.cancel') }}-->
+					<!--            </button>-->
+					<!--          </view>-->
+				</uni-col>
+			</uni-row>
+		</view>
+		<uni-popup ref="dispatchUserPopup" type="bottom" background-color="white" border-radius="6px 6px 0 0">
+			<view class="popup">
+				<uni-forms ref="formRef" :model="form" :rules="rules" label-width="100px">
+					<uni-forms-item v-if="['1', '3', '4'].includes(clickedButtonIndex)" :label="userFormItemLabel" name="assigneeUserId" required>
+						<next-data-select v-model="form.assigneeUserId" :options="userList" filterable themeColor="#004098" />
+					</uni-forms-item>
+					<uni-forms-item v-if="clickedButtonIndex === '5'" :label="userFormItemLabel" name="userIds" required>
+						<next-data-select v-model="form.userIds" :options="userList" :collapseTagsNum="2" multiple filterable themeColor="#004098" />
+					</uni-forms-item>
+					<uni-forms-item v-if="clickedButtonIndex === '1'" :label="$t('message.repairType')" name="type" required>
+						<next-data-select v-model="form.type" :options="repairTypeList" format="{label}" field="value as value, label as text, label as label" />
+					</uni-forms-item>
+					<uni-forms-item v-if="clickedButtonIndex !== '7'" :label="$t('message.reason')" name="reason" :required="['3', '4', '5'].includes(clickedButtonIndex)">
+						<uni-easyinput v-model="form.reason" type="textarea" />
+					</uni-forms-item>
+					<uni-forms-item v-if="clickedButtonIndex === '7'" :label="$t('message.reason1')" name="reason" required>
+						<uni-easyinput v-model="form.reason" :placeholder="$t('message.cancelHint')" type="textarea" />
+					</uni-forms-item>
+				</uni-forms>
+				<uni-row class="flex-row justify-center">
+					<button v-if="clickedButtonIndex !== '5'" class="fill-button" style="margin-right: 10px" @click="handleClick">
+						{{ clickedButtonIndex !== '7' ? clickedButtonText : $t('operation.confirm1') }}
+					</button>
+					<button v-if="clickedButtonIndex === '5'" class="fill-button" style="margin-right: 10px" @click="handleClick('before')">
+						{{ $t('message.form.beforeSign') }}
+					</button>
+					<button v-if="clickedButtonIndex === '5'" class="fill-button" style="margin-right: 10px" @click="handleClick('after')">
+						{{ $t('message.form.afterSign') }}
+					</button>
+					<button class="outline-button" plain="true" @click="cancel">
+						{{ $t('operation.cancel') }}
+					</button>
+				</uni-row>
+			</view>
+		</uni-popup>
+
+		<!-- 瑞恒队长选择维修人员 -->
+		<uni-popup ref="dispatchRepairmanPopup" type="bottom" background-color="white" border-radius="6px 6px 0 0">
+			<view class="popup">
+				<uni-forms ref="repairmanformRef" :model="repairmanForm" :rules="rules2" label-width="100px">
+					<uni-forms-item label="维修人员" name="userIds" required>
+						<next-data-select
+							v-model="repairmanForm.userIds"
+							:options="userList2"
+							:collapseTagsNum="2"
+							optionsLabelKey="nickname"
+							optionsValueKey="id"
+							multiple
+							filterable
+							themeColor="#004098"
+						/>
+					</uni-forms-item>
+
+					<uni-forms-item label="审批意见" name="reason" required>
+						<uni-easyinput v-model="repairmanForm.reason" placeholder="请输入审批意见" type="textarea" />
+					</uni-forms-item>
+				</uni-forms>
+				<uni-row class="flex-row justify-center">
+					<button class="fill-button" style="margin-right: 10px" @click="handleRepairmanClick">确认</button>
+
+					<button class="outline-button" plain="true" @click="cancelRepairman">
+						{{ $t('operation.cancel') }}
+					</button>
+				</uni-row>
+			</view>
+		</uni-popup>
+
+		<!-- 瑞恒维修人员审批 -->
+		<uni-popup ref="receiveTaskPopup" type="bottom" background-color="white" border-radius="6px 6px 0 0">
+			<view class="popup">
+				<uni-forms ref="receiveTaskRef" :model="receiveTaskForm" label-width="100px">
+					<uni-forms-item label="审批意见" name="reason">
+						<uni-easyinput v-model="receiveTaskForm.reason" placeholder="请输入审批意见" type="textarea" />
+					</uni-forms-item>
+				</uni-forms>
+				<uni-row class="flex-row justify-center">
+					<button class="fill-button" style="margin-right: 10px" @click="handleReceiveClick">确认</button>
+
+					<button class="outline-button" plain="true" @click="cancelReceive">
+						{{ $t('operation.cancel') }}
+					</button>
+				</uni-row>
+			</view>
+		</uni-popup>
+
+		<!-- 瑞恒相关人员拒绝审批 -->
+		<uni-popup ref="rejectTaskPopup" type="bottom" background-color="white" border-radius="6px 6px 0 0">
+			<view class="popup">
+				<uni-forms ref="rejectTaskRef" :model="rejectTaskForm" label-width="100px">
+					<uni-forms-item label="审批意见" name="reason">
+						<uni-easyinput v-model="rejectTaskForm.reason" placeholder="请输入审批意见" type="textarea" />
+					</uni-forms-item>
+				</uni-forms>
+				<uni-row class="flex-row justify-center">
+					<button class="fill-button" style="margin-right: 10px" @click="handleRejectClick">确认</button>
+
+					<button class="outline-button" plain="true" @click="cancelReject">
+						{{ $t('operation.cancel') }}
+					</button>
+				</uni-row>
+			</view>
+		</uni-popup>
+	</view>
+</template>
+
+<script setup>
+import { computed, getCurrentInstance, reactive, ref } from 'vue';
+import { onLoad } from '@dcloudio/uni-app';
+import { approvalTask, cancelTask, createSignTask, delegateTask, getApprovalDetail, rejectTask, returnTask, transferTask, rhApproveTask } from '@/api/task';
+import { getFaultDetail, updateFaultProcess, updateIotMaintainProcess } from '@/api/fault';
+import dayjs from 'dayjs';
+import { useDataDictStore } from '@/store/modules/dataDict';
+import { getUserList } from '@/api';
+import { reloginByUserId } from '@/utils/auth';
+import { getRepairDetail } from '@/api/repair';
+import { getLoginUserInfo } from '@/api/login';
+import { getDeptName } from '@/api/recordFilling';
+import { companyLevelChildrenDepts, companyDeptsEmployee } from '@/api/ruihen';
+
+const data = ref({}); // 详情数据
+const faultInfo = ref({}); // 故障信息
+const statusList = ref([]); // 审批状态列表
+const repairTypeList = ref([]); // 维修状态列表
+const userList = ref([]); // 用户列表
+const userList2 = ref([]); // 瑞恒维修人员用户列表
+const yesOrNo = ref([]); // 是或否
+const faultStatusList = ref([]); // 故障状态列表
+
+// 通过状态码获取状态名称
+const getFaultStatusName = (status) => {
+	if (!status) return '';
+	for (const item of faultStatusList.value) {
+		if (item.value === status) {
+			return item.label;
+		}
+	}
+};
+// const getStatusName = (status) => {
+//   if (!status) return ''
+//   for (const item of statusList.value) {
+//     if ((item.value + '') === status) {
+//       return item.label
+//     }
+//   }
+// }
+
+// 通过布尔类型获取是或否
+const getYesOrNo = (value) => {
+	if (value === undefined) return '';
+	for (const item of yesOrNo.value) {
+		if (value && item.value === 'true') {
+			return item.label;
+		} else if (!value && item.value === 'false') {
+			return item.label;
+		}
+	}
+};
+
+// 通过维修类型获取名称
+const getRepairTypeName = (type) => {
+	if (!type) return '';
+	for (const item of repairTypeList.value) {
+		if (item.value === type) {
+			return item.label;
+		}
+	}
+};
+
+// 格式化日期
+const formatDate = (date) => {
+	if (!date) return '';
+	return dayjs(date).format('YYYY-MM-DD');
+};
+
+const getUserName = (userId) => {
+	if (!userId) return;
+	for (const item of userList.value) {
+		if (item.value === userId) {
+			faultInfo.value.nickname = item.label;
+			return item.label;
+		}
+	}
+};
+
+// 预览图片
+const previewImage = (url) => {
+	if (!url) return;
+	uni.previewImage({ urls: [url] });
+};
+
+const buttonList = ref();
+const setButtonList = (data) => {
+	if (data && data.todoTask) {
+		buttonList.value = data.todoTask.buttonsSetting || [];
+	} else {
+		buttonList.value = [];
+	}
+};
+
+const userFormItemLabel = computed(() => {
+	const index = clickedButtonIndex.value;
+	if (index === '1') {
+		return t('message.dispatchUser'); // 负责人
+	} else if (index === '3') {
+		return t('message.form.user3'); // 新审批人
+	} else if (index === '4') {
+		return t('message.form.user4'); // 接收人
+	} else if (index === '5') {
+		return t('message.form.user5'); // 加签处理人
+	} else {
+		return '';
+	}
+});
+const clickedButtonIndex = ref(0);
+const clickedButtonText = ref('');
+
+let dispatchRepairmanPopup = ref('');
+let receiveTaskPopup = ref('');
+let rejectTaskPopup = ref('');
+const onButtonClick = async (index, text) => {
+	if (companyInfo.value.data === 'rh') {
+		if (text === '维修人员') {
+			dispatchRepairmanPopup.value.open('bottom');
+		}
+
+		if (text === '接收工单') {
+			receiveTaskPopup.value.open('bottom');
+		}
+
+		if (text === '拒绝') {
+			rejectTaskPopup.value.open('bottom');
+		}
+	} else {
+		clickedButtonIndex.value = index;
+		clickedButtonText.value = text;
+
+		if (index === '1') {
+			// 分配责任人
+			rules.assigneeUserId.rules = [{ required: true, errorMessage: t('message.form.errorHint1') }];
+			rules.reason.rules[0].required = false;
+		} else if (index === '2') {
+			// 拒绝
+			rules.assigneeUserId.rules[0].required = false;
+			rules.reason.rules[0].required = false;
+		} else if (index === '3') {
+			// 转办
+			rules.assigneeUserId.rules = [{ required: true, errorMessage: t('message.form.errorHint3') }];
+			rules.reason.rules[0].required = true;
+		} else if (index === '4') {
+			// 委派
+			rules.assigneeUserId.rules = [{ required: true, errorMessage: t('message.form.errorHint5') }];
+			rules.reason.rules[0].required = true;
+		} else if (index === '5') {
+			// 加签
+			rules.assigneeUserId.rules[0].required = false;
+			rules.userIds.rules[0].required = true;
+			rules.reason.rules[0].required = true;
+		} else if (index === '6') {
+			// 退回
+			const code = (await returnTask(taskId.value)).code;
+			if (code === 0) {
+				uni.showToast({ title: t('operation.success'), icon: 'none' });
+				uni.navigateBack();
+				uni.$emit('update');
+			}
+			return;
+		} else if (index === '7') {
+			rules.reason.rules[0].errorMessage = t('message.form.errorHint7');
+		}
+		showDispatchUserPopup();
+	}
+};
+// 分配责任人弹窗
+const dispatchUserPopup = ref();
+const showDispatchUserPopup = () => {
+	dispatchUserPopup.value.open('bottom');
+};
+const form = reactive({
+	assigneeUserId: undefined,
+	delegateUserId: undefined,
+	userIds: undefined,
+	type: undefined,
+	reason: undefined,
+	id: undefined
+});
+
+const formRef = ref();
+
+const repairmanForm = reactive({
+	reason: '',
+	signPicUrl: '',
+	nextAssignees: {},
+	type: undefined,
+	assigneeUserId: undefined,
+	ifTrans: undefined,
+	userIds: []
+});
+
+const receiveTaskForm = reactive({
+	reason: '',
+	type: undefined,
+	assigneeUserId: undefined,
+	ifTrans: undefined,
+	nextAssignees: {}
+});
+
+const rejectTaskForm = reactive({
+	reason: '',
+	id: ''
+});
+
+const repairmanformRef = ref();
+const receiveTaskRef = ref();
+
+const { appContext } = getCurrentInstance();
+const t = appContext.config.globalProperties.$t;
+const rules = reactive({
+	assigneeUserId: {
+		rules: [{ required: true, errorMessage: t('message.form.errorHint1') }]
+	},
+	userIds: {
+		rules: [{ required: true, errorMessage: t('message.form.errorHint6') }]
+	}, // 加签处理人
+	type: {
+		rules: [{ required: true, errorMessage: t('message.form.errorHint2') }]
+	},
+	reason: {
+		rules: [{ required: true, errorMessage: t('message.form.errorHint4') }]
+	}
+});
+
+// 瑞恒选择维修人
+const rules2 = reactive({
+	userIds: {
+		rules: [{ required: true, errorMessage: '请选择维修人' }]
+	}
+});
+const cancel = () => dispatchUserPopup.value.close('bottom');
+const cancelRepairman = () => dispatchRepairmanPopup.value.close('bottom');
+const cancelReceive = () => receiveTaskPopup.value.close('bottom');
+const cancelReject = () => rejectTaskPopup.value.close('bottom');
+
+const handleClick = async (sign) => {
+	try {
+		const valid = await formRef.value.validate();
+		if (!valid) return;
+
+		if (!form.reason) {
+			form.reason = form.reason || '';
+		}
+
+		let code = -1;
+		if (clickedButtonIndex.value === '1') {
+			// 分配责任人
+			code = (await updateFaultProcess(faultId.value, form.type, form.assigneeUserId)).code;
+			code = (await approvalTask(taskId.value, form.reason)).code;
+		} else if (clickedButtonIndex.value === '2') {
+			// 拒绝
+			code = (await rejectTask(taskId.value, form.reason)).code;
+		} else if (clickedButtonIndex.value === '3') {
+			// 转办
+			code = (await transferTask(taskId.value, form.assigneeUserId, form.reason)).code;
+		} else if (clickedButtonIndex.value === '4') {
+			// 委派
+			code = (await delegateTask(taskId.value, form.assigneeUserId, form.reason)).code;
+		} else if (clickedButtonIndex.value === '5') {
+			// 加签
+			code = (await createSignTask(taskId.value, form.userIds, sign, form.reason)).code;
+		} else if (clickedButtonIndex.value === '7') {
+			// 退回
+			code = (await cancelTask(processId.value, form.reason)).code;
+		}
+		if (code === 0) {
+			// 成功时返回
+			uni.showToast({ title: t('operation.success'), icon: 'none' });
+			uni.$emit('update');
+			uni.navigateBack();
+		}
+	} catch (e) {
+		console.log(e);
+	}
+};
+
+// 瑞恒审批相关开始 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+const handleRepairmanClick = async () => {
+	try {
+		const valid = await repairmanformRef.value.validate();
+		if (!valid) return;
+
+		if (!repairmanForm.reason) {
+			repairmanForm.reason = repairmanForm.reason || '';
+		}
+		repairmanForm.assigneeUserId = userInfo.value.id;
+
+		await updateIotMaintainProcess(processId.value, faultId.value, repairmanForm.type, repairmanForm.assigneeUserId, repairmanForm.ifTrans);
+
+		const data = {
+			id: taskId.value,
+			reason: repairmanForm.reason,
+			variables: {}, // 审批通过, 把修改的字段值赋于流程实例变量
+			nextAssignees: {
+				[activeNode.value.id]: repairmanForm.userIds
+			} // 下个自选节点选择的审批人信息
+		};
+		const res = await rhApproveTask(data);
+		if (res.data) {
+			// 成功时返回
+			uni.showToast({ title: t('operation.success'), icon: 'none' });
+			uni.$emit('update');
+			uni.navigateBack();
+		}
+		uni.reL;
+	} catch (e) {
+		console.log(e);
+	}
+};
+
+//瑞恒维修人员接受工单
+const handleReceiveClick = async () => {
+	try {
+		if (!receiveTaskForm.reason) {
+			receiveTaskForm.reason = receiveTaskForm.reason || '';
+		}
+		receiveTaskForm.assigneeUserId = userInfo.value.id;
+
+		await updateIotMaintainProcess(processId.value, faultId.value, receiveTaskForm.type, receiveTaskForm.assigneeUserId, receiveTaskForm.ifTrans);
+
+		const data = {
+			id: taskId.value,
+			reason: receiveTaskForm.reason,
+			variables: {}, // 审批通过, 把修改的字段值赋于流程实例变量
+			nextAssignees: {} // 下个自选节点选择的审批人信息
+		};
+		const res = await rhApproveTask(data);
+		if (res.data) {
+			// 成功时返回
+			uni.showToast({ title: t('operation.success'), icon: 'none' });
+			uni.$emit('update');
+			uni.navigateBack();
+		}
+	} catch (e) {
+		console.log(e);
+	}
+};
+
+//瑞恒相关人员拒绝
+const handleRejectClick = async () => {
+	try {
+		await rejectTask(taskId.value, rejectTaskForm.reason);
+		uni.showToast({ title: t('operation.success'), icon: 'none' });
+		uni.$emit('update');
+		uni.navigateBack();
+	} catch (e) {}
+};
+// 瑞恒审批相关结束 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+const processId = ref('');
+const taskId = ref('');
+const faultId = ref('');
+const { loadDataDictList, getDataDictList } = useDataDictStore();
+let activeNode = ref('');
+const userInfo = ref({});
+const companyInfo = ref({});
+
+onLoad(async (options) => {
+	await reloginByUserId(options.reloginUserId);
+
+	console.log('options', options);
+
+	taskId.value = options.id;
+	processId.value = options.processInstanceId;
+	statusList.value = getDataDictList('crm_audit_status'); // 审批状态列表
+	repairTypeList.value = getDataDictList('pms_main_type'); // 维修类型列表
+	faultStatusList.value = getDataDictList('pms_failure_status'); // 故障状态列表
+	yesOrNo.value = getDataDictList('infra_boolean_string'); // 是或否
+
+	if (repairTypeList.value.length === 0) {
+		await loadDataDictList();
+
+		statusList.value = getDataDictList('crm_audit_status'); // 审批状态列表
+		repairTypeList.value = getDataDictList('pms_main_type'); // 维修类型列表
+		faultStatusList.value = getDataDictList('pms_failure_status'); // 故障状态列表
+		yesOrNo.value = getDataDictList('infra_boolean_string'); // 是或否
+	}
+
+	data.value = (await getApprovalDetail(options)).data;
+	activeNode.value = data.value.activityNodes[3];
+	faultId.value = data.value.processInstance.businessKey;
+	if (processId.value.startsWith('GZ')) {
+		faultInfo.value = (await getFaultDetail({ id: faultId.value })).data;
+	} else {
+		faultInfo.value = (await getRepairDetail({ id: faultId.value })).data;
+	}
+	setButtonList(data.value);
+
+	let userId;
+	if (data.value.todoTask) {
+		userId = data.value.todoTask.assigneeUser.id;
+		if (!taskId.value) {
+			taskId.value = data.value.todoTask.id;
+		}
+	} else {
+		userId = data.value.processInstance.startUser.id;
+	}
+	userList.value = (await getUserList(userId)).data.map((item) => ({
+		value: item.id,
+		text: item.nickname,
+		label: item.nickname
+	}));
+	getUserName(faultInfo.value?.maintainPerson);
+
+	userInfo.value = (await getLoginUserInfo()).data;
+
+	companyInfo.value = await getDeptName(userInfo.value.dept.id);
+
+	const deptData = await companyLevelChildrenDepts();
+
+	const ids = deptData.data.map((item) => item.id);
+	const params = {
+		deptIds: ids
+	};
+	const list = await companyDeptsEmployee(params);
+	userList2.value = list.data;
+});
+</script>
+
+<style scoped lang="scss">
+.item {
+	margin: 10px 0;
+	background-color: white;
+	border-radius: 0 0 6px 6px;
+}
+
+.item-process-id {
+	padding: 10px;
+	background: linear-gradient(270deg, #ffffff 0%, #8ebeff 100%);
+	border-radius: 6px 6px 0 0;
+}
+
+.item-content {
+	padding: 15px 20px 12px 10px;
+	font-size: 14px;
+	color: #333333;
+}
+
+.mt-15 {
+	margin-top: 15px;
+}
+
+.mt-27 {
+	margin-top: 27px;
+}
+
+.outline-button {
+	border: 1px #004098 solid;
+	border-radius: 3px;
+	color: #004098;
+	font-size: 14px;
+	min-width: 90px;
+	height: 32px;
+	line-height: 32px;
+	margin: 0;
+}
+
+.fill-button {
+	background-color: #004098;
+	color: white;
+	font-size: 14px;
+	min-width: 90px;
+	height: 32px;
+	line-height: 32px;
+	margin: 0;
+	padding: 0;
+}
+
+.popup {
+	padding: 10px;
+}
+</style>

+ 31 - 3
pages/repair/detail.vue

@@ -39,6 +39,23 @@
             >
             </uni-data-select>
           </uni-forms-item>
+
+          <!-- 维修方式 -->
+          <uni-forms-item
+            v-if="maintain.maintainMethod"
+            class="form-item"
+            label="维修方式"
+            name="maintainMethod"
+            :required="false"
+          >
+            <uni-data-select
+              :clear="false"
+              :disabled="true"
+              v-model="maintain.maintainMethod"
+              :localdata="typeRange2"
+            >
+            </uni-data-select>
+          </uni-forms-item>
           <!-- 是否停机 -->
           <uni-forms-item
             class="form-item"
@@ -536,7 +553,10 @@
             </view>
           </view>
           <!-- 是否消耗物料 -->
-          <view class="item-content flex-row align-center justify-between" v-if="bom.rule">
+          <view
+            class="item-content flex-row align-center justify-between"
+            v-if="bom.rule"
+          >
             <view class="item-title">
               <span class="item-title-width">
                 {{ $t("workOrder.isConsumptionMaterial") }}:
@@ -629,13 +649,21 @@ const { appContext } = getCurrentInstance();
 const t = appContext.config.globalProperties.$t;
 // 获取维修类型
 const typeDict = getDataDictList("pms_main_type");
+
+// 获取维修方式
+const typeDict2 = getDataDictList("maintain_method");
 // 遍历typeDict,新增text字段 值为label
 typeDict.forEach((item) => {
   item.text = item.label;
 });
-console.log("typeDict", typeDict);
+
+typeDict2.forEach((item) => {
+  item.text = item.label;
+});
+
 // 维修类型
 const typeRange = ref(typeDict);
+const typeRange2 = ref(typeDict2);
 // 是否停机
 const ifStopRange = ref([
   {
@@ -675,7 +703,7 @@ const maintainClassifyRange = getDataDictList("pms_maintain_classify").map(
       value: item.value,
       text: item.label,
     };
-  }
+  },
 );
 console.log("🚀 ~ maintainClassifyRange:", maintainClassifyRange);
 

+ 236 - 3
pages/repair/index.vue

@@ -76,7 +76,11 @@
           <view class="module-name">
             {{ $t("equipmentMaintenance.repairCode") }}: {{ item.failureCode }}
           </view>
-          <view class="module-status" :class="{ pending: item.status == 'tx' }" v-if="statusDict[item.status]">
+          <view
+            class="module-status"
+            :class="{ pending: item.status == 'tx' }"
+            v-if="statusDict[item.status]"
+          >
             <!-- 状态 -->
             <span>{{ statusDict[item.status] }}</span>
           </view>
@@ -148,7 +152,10 @@
             <span>{{ item.maintainType }}</span>
           </view>
         </view>
-        <view class="item-btn flex-row align-center justify-end">
+        <view
+          class="item-btn flex-row align-center justify-end"
+          v-if="companyInfo.data !== 'rh'"
+        >
           <button
             type="primary"
             :plain="false"
@@ -161,14 +168,87 @@
             {{ $t("operation.fill") }}
           </button>
         </view>
+
+        <view class="item-btn flex-row align-center justify-end" v-else>
+          <button type="primary" :plain="false" @click="onView(item)">
+            {{ $t("workOrder.viewDetails") }}
+          </button>
+
+          <button
+            type="primary"
+            :plain="false"
+            v-if="
+              item.status === 'personnel' && userInfo.id === item.maintainPerson
+            "
+            @click="changeMethod(item)"
+          >
+            维修方式
+          </button>
+
+          <button
+            type="primary"
+            @click="onEdit(item)"
+            v-if="
+              item.status === 'tx' &&
+              (item.auditStatus === 20 || item.auditStatus === null)
+            "
+          >
+            {{ $t("operation.fill") }}
+          </button>
+        </view>
       </view>
     </view>
   </z-paging>
+
+  <uni-popup type="dialog" ref="chooseMethodRef" @close="cancelRepairMethod">
+    <view class="popup-content">
+      <view class="popup-title">维修方式</view>
+      <view class="form-item">
+        <text class="label">*</text>
+        <text class="label-text">维修方式</text>
+        <picker
+          @change="onPickerChange"
+          :value="selectedValue"
+          :range="methodOptions"
+        >
+          <view class="picker-view">
+            {{ methodOptions[selectedValue] || "请选择维修方式" }}
+          </view>
+        </picker>
+
+        <!-- <uni-data-select
+          :clear="false"
+          v-model="selectedValue"
+          :localdata="methodOptions"
+          @change="onPickerChange"
+        >
+        </uni-data-select> -->
+      </view>
+
+      <view class="form-item">
+        <text class="label">*</text>
+        <text class="label-text">备注说明</text>
+        <textarea
+          v-model="repairMethodForm.remark"
+          placeholder="请输入备注说明"
+          class="textarea"
+          maxlength="200"
+        ></textarea>
+      </view>
+
+      <view class="popup-footer">
+        <view class="btn-cancel" @click="cancelRepairMethod">取消</view>
+        <view class="btn-confirm" @click="submitRepairMethod">确定</view>
+      </view>
+    </view>
+  </uni-popup>
 </template>
 <script setup>
 import { ref, reactive, onMounted, nextTick } from "vue";
 import { onShow } from "@dcloudio/uni-app";
-import { getRepairCount, getRepairList } from "@/api/repair";
+import { getRepairCount, getRepairList, maintainMethod } from "@/api/repair";
+import { getLoginUserInfo } from "@/api/login";
+import { getDeptName } from "@/api/recordFilling";
 import dayjs from "dayjs";
 import { useDataDictStore } from "@/store/modules/dataDict";
 // 字典项
@@ -184,6 +264,14 @@ const auditStatusDict = reactive({});
 getDataDictList("crm_audit_status").map((item) => {
   auditStatusDict[item.value] = item.label;
 });
+
+const methodOptions = ref([]); // 使用 ref 创建数组
+const methodOptionsMap = reactive({}); // 保存 value -> label 的映射
+
+getDataDictList("maintain_method").forEach((item) => {
+  methodOptions.value.push(item.label); // 只存储 label 用于显示
+  methodOptionsMap[item.value] = item.label;
+});
 console.log("auditStatusDict", auditStatusDict);
 
 //  --- 列表 ---start---
@@ -227,6 +315,81 @@ const getCount = () => {
     statistics.average = 4.8;
   });
 };
+const currentRepairItem = ref(null); // 当前操作的工单项
+const repairMethodForm = ref({
+  // 表单数据
+  maintainMethod: "",
+  remark: "",
+});
+const chooseMethodRef = ref(null); // 控制弹窗显示
+
+const selectedValue = ref(null);
+const changeMethod = (item) => {
+  console.log("选择维修方式的工单项", item);
+  // 打开弹窗前先初始化表单数据
+  currentRepairItem.value = item;
+  repairMethodForm.value.maintainMethod = "";
+  repairMethodForm.value.remark = "";
+  chooseMethodRef.value.open();
+};
+
+const submitRepairMethod = () => {
+  if (!repairMethodForm.value.maintainMethod) {
+    uni.showToast({
+      title: "请选择维修方式",
+      icon: "none",
+    });
+    return;
+  }
+  if (!repairMethodForm.value.remark) {
+    uni.showToast({
+      title: "请输入备注说明",
+      icon: "none",
+    });
+    return;
+  }
+
+  // 调用接口
+  maintainMethod({
+    id: currentRepairItem.value.id,
+    maintainMethod: repairMethodForm.value.maintainMethod,
+    remark: repairMethodForm.value.remark,
+  })
+    .then((res) => {
+      uni.showToast({
+        title: "提交成功",
+        icon: "success",
+      });
+      chooseMethodRef.value.close();
+      // 可选:刷新列表或更新当前项状态
+      onSearch(); // 刷新列表
+    })
+    .catch((err) => {
+      uni.showToast({
+        title: "提交失败",
+        icon: "none",
+      });
+    });
+};
+
+const cancelRepairMethod = () => {
+  chooseMethodRef.value.close();
+  repairMethodForm.value.maintainMethod = "";
+  repairMethodForm.value.remark = "";
+  selectedValue.value = null;
+};
+const onPickerChange = (e) => {
+  const selectedIndex = e.detail.value;
+  selectedValue.value = selectedIndex;
+
+  // 通过索引找到对应的 value
+  const selectedLabel = methodOptions.value[selectedIndex];
+  const selectedKey = Object.keys(methodOptionsMap).find(
+    (key) => methodOptionsMap[key] === selectedLabel,
+  );
+
+  repairMethodForm.value.maintainMethod = selectedKey; // 设置表单值为 key
+};
 onShow(() => {
   getCount();
   nextTick(() => {
@@ -252,7 +415,77 @@ const onView = (item) => {
 const navigatorBack = () => {
   uni.navigateBack();
 };
+
+const userInfo = ref({});
+const companyInfo = ref({});
+
+onMounted(async () => {
+  userInfo.value = (await getLoginUserInfo()).data;
+  companyInfo.value = await getDeptName(userInfo.value.dept.id);
+
+  useDataDictStore().loadDataDictList();
+});
 </script>
 <style lang="scss" scoped>
 @import "@/style/work-order.scss";
+
+.popup-content {
+  width: 500rpx;
+  padding: 30rpx;
+  background-color: #fff;
+  border-radius: 16rpx;
+
+  .popup-title {
+    font-size: 36rpx;
+    margin-bottom: 30rpx;
+    text-align: center;
+  }
+
+  .form-item {
+    margin-bottom: 40rpx;
+
+    .label {
+      color: red;
+      font-size: 28rpx;
+      margin-right: 10rpx;
+    }
+
+    .label-text {
+      font-size: 28rpx;
+      color: #333;
+    }
+
+    .picker-view {
+      margin-top: 10rpx;
+      padding: 20rpx;
+      border: 1px solid #ccc;
+      border-radius: 8rpx;
+      font-size: 28rpx;
+    }
+
+    .textarea {
+      width: 95.5%;
+      height: 150rpx;
+      padding: 10rpx;
+      border: 1px solid #ccc;
+      border-radius: 8rpx;
+      font-size: 28rpx;
+    }
+  }
+
+  .popup-footer {
+    display: flex;
+    justify-content: flex-end;
+    gap: 30rpx;
+
+    .btn-cancel {
+      color: #333;
+      border: none;
+    }
+
+    .btn-confirm {
+      color: #007aff;
+    }
+  }
+}
 </style>

+ 3 - 0
utils/request.js

@@ -49,6 +49,9 @@ const defaultOptions = {
   header: {
     "Content-Type": "application/json",
   },
+   paramsSerializer: (params) => {
+    return qs.stringify(params, { allowDots: true })
+  },
 
   withToken: true, // 是否携带token
   throttleDelay: 500, // 节流延时