Browse Source

+ 工单列表

chen.cheng 8 months ago
parent
commit
8d7431d480

+ 24 - 10
src/api/workorder.js

@@ -1,18 +1,32 @@
-import {post, uploadFilePromise} from "@/util/request";
+import {get, post, uploadFilePromise} from "@/util/request";
 import {Page} from "@/common/consts/CommonConst";
 
 export const uploadOrderFile = async (file) => {
-    return await uploadFilePromise("/file/cloud/upload", file, {
-        path: "aiot",
-        fileType: "工单"
-    })
+  return await uploadFilePromise("/file/cloud/upload", file, {
+    path: "aiot",
+    fileType: "工单"
+  })
 }
 
 
 export const getMyOrderWork = async ({page = Page.page, size = Page.size, ...params}) => {
-    return await post('/orderWork/myPage', {
-        page,
-        size,
-        ...params
-    });
+  return await post('/orderWork/myPage', {
+    page,
+    size,
+    ...params
+  });
+}
+
+export const getWorkOrderDetail = async (id) => {
+  return await get(`/orderWork/getDetail/${id}`)
+}
+
+/**
+ * 提交工单
+ * {"name":"CC","type":1,"level":2,"estimatedStartTime":"2024-11-29 00:00:00","estimatedEndTime":"2024-11-30 00:00:00","description":"fffssscccsss","source":3,"problemImg":"[{\"name\":\"login_bg.png\",\"url\":\"http://172.192.10.105:30011/aiot/aiot/202411/aiot/aiot/1732759747878/login_bg.png\",\"uid\":1732759748425,\"status\":\"success\"}]","problemFile":null}
+ * @param params
+ * @returns {Promise<*>}
+ */
+export const submitOrderWork = async (params) => {
+  return await post('/orderWork/save', params);
 }

+ 26 - 0
src/common/consts/WorkOrderConst.js

@@ -41,15 +41,41 @@ export const WorkOrderLevel = {
     label: '一般',
     code: "normal",
     value: 3,
+    color: '#3977f6'
   },
   IMPORTANT: {
     label: '重要',
     code: "important",
     value: 2,
+    color: '#f1b425'
   },
   URGENT: {
     label: '紧急',
     code: "urgent",
     value: 1,
+    color: '#f95f5e'
   }
+}
+export const WorkOrderTypes = {
+  MAINTAIN: {
+    label: '巡检',
+    value: 1,
+    code: 'maintain'
+  },
+  REPAIR: {
+    label: '维修',
+    value: 2,
+    code: 'repair'
+
+  },
+  MAINTAIN_AND_REPAIR: {
+    label: '维保',
+    value: 3,
+    code: 'maintain_and_repair'
+  },
+  WARNING: {
+    label: '告警',
+    value: 4,
+    code: 'warning'
+  },
 }

+ 54 - 17
src/pages/workbenchsub/workorder/list.vue

@@ -15,34 +15,46 @@
       </view>
     </view>
     <view class="u-page-list" style="padding-bottom: 100rpx">
-      <up-list>
+      <up-list @scrolltolower="scrolltolower">
         <up-list-item
             v-for="(item, index) in indexList"
-            :key="index"
+            :key="item.id"
         >
           <view class="item-content">
             <u--image
                 :showLoading="true"
-                src="https://uview-plus.jiangruyi.com/h5/static/uview/common/logo.png"
+                :src="getDevImg(item.problemImg)"
                 width="160rpx"
                 height="150rpx"
             />
             <view class="content-info">
               <view>
-                <up-text :lines="1" text="户外温度高于15度" size="24rpx"/>
-                <up-tag text="标签" plain size="mini" bgColor="red" class="tag-stat"></up-tag>
-                <up-text text="详情>" color="#007aff" style="flex:none;width: auto" @click="()=>onDetailClick(item)"></up-text>
+                <up-text :lines="1" :text="item.name" size="24rpx"/>
+                <up-tag
+                    :text="valueToConst(WorkOrderLevel,item.level).label"
+                    plain size="mini"
+                    :bgColor="valueToConst(WorkOrderLevel,item.level).color"
+                    class="tag-stat"></up-tag>
+                <up-text text="详情>" color="#007aff" style="flex:none;width: auto"
+                         @click="()=>onDetailClick(item)"></up-text>
               </view>
               <view>
-                <up-text :lines="1" text="工单号:GJ20241107000971" size="24rpx"/>
+                <up-text :lines="1" :text="`工单号:${item.code}`" size="24rpx"/>
 
               </view>
               <view>
-                <up-text :lines="1" text="提交时间:2023-01-14 16:34:23" size="24rpx"/>
+                <up-text :lines="1" :text="`提交时间:${item.createTime}`" size="24rpx"/>
               </view>
             </view>
           </view>
         </up-list-item>
+        <up-loading-icon v-if="loading" text="加载中" textSize="12"></up-loading-icon>
+        <up-text
+            v-if="!loadmoreFlag" text="已经到底了" style="justify-content: center;"
+            size="24rpx"
+            color="gray"
+        >
+        </up-text>
       </up-list>
     </view>
   </view>
@@ -50,27 +62,52 @@
 
 <script setup lang="ts">
 import {ref} from "vue"
-import {WorkOrderStat} from '@/common/consts/WorkOrderConst.js'
+import {WorkOrderLevel, WorkOrderStat} from '@/common/consts/WorkOrderConst.js'
 import {onLoad} from '@dcloudio/uni-app';
-import {navigateTo} from "@/util";
+import {getDevImg, navigateTo} from "@/util/index.js";
+import {getMyOrderWork} from "@/api/workorder.js";
+import {valueToConst} from "@/common/consts/CommonConst.js";
+
+const page = ref(1)
+let loadmoreFlag = ref(true)
+let loading = ref(false)
 
 onLoad(() => {
+  page.value = 1
+  loading.value = true;
   loadmore();
 });
+
 let searchValue = ref("")
-let indexList = ref([
-  {}
-])
+let indexList = ref([])
 let selectTag = ref(WorkOrderStat.ALL.label)
 
 function radioClick(label) {
   selectTag.value = label
 }
 
-const loadmore = () => {
-  for (let i = 0; i < 10; i++) {
-    indexList.value.push({});
-  }
+const loadmore = async () => {
+  getMyOrderWork({
+    page: page.value,
+  }).then(res => {
+    const {records} = res
+    if (records && records.length > 0) {
+      indexList.value = indexList.value.concat(records)
+      page.value += 1
+      if (records.length < 10) {
+        loadmoreFlag.value = false;
+      }
+    } else {
+      loadmoreFlag.value = false;
+    }
+    loading.value = false;
+  })
+};
+
+const scrolltolower = () => {
+  if (!loadmoreFlag.value) return;
+  loading.value = true;
+  loadmore();
 };
 const onDetailClick = (item) => {
   navigateTo({

+ 60 - 40
src/pages/workbenchsub/workorder/submit.vue

@@ -27,7 +27,7 @@
           @click="state.showOrderType = true; hideKeyboard()"
       >
         <up-input
-            v-model="state.model.order.type"
+            :modelValue="valueToConst(WorkOrderTypes, state.model.order.type).label"
             disabled
             disabledColor="#ffffff"
             placeholder="请选择工单类型"
@@ -48,7 +48,7 @@
           @click="state.showOrderLevel = true; hideKeyboard()"
       >
         <up-input
-            v-model="state.model.order.level"
+            :modelValue="valueToConst(WorkOrderLevel, state.model.order.level).label"
             disabled
             disabledColor="#ffffff"
             placeholder="请选择工单等级"
@@ -68,7 +68,7 @@
           @click="state.showStartClendar = true; hideKeyboard()"
       >
         <up-input
-            v-model="state.model.order.startDate"
+            :modelValue="formatDate(state.model.order.startDate)"
             disabled
             disabledColor="#ffffff"
             placeholder="请选择预计开始日期"
@@ -88,7 +88,7 @@
           @click="state.showEndClendar = true; hideKeyboard()"
       >
         <up-input
-            v-model="state.model.order.endDate"
+            :modelValue="formatDate(state.model.order.endDate)"
             disabled
             disabledColor="#ffffff"
             placeholder="请选择预计结束日期"
@@ -142,21 +142,32 @@
     <up-datetime-picker
         :show="state.showStartClendar"
         v-model="state.model.order.startDate"
-        mode="date"
+        mode="datetime"
+        @close="state.showStartClendar = false"
+        :closeOnClickOverlay="true"
+        @confirm="(e)=>confirm(e,'showStartClendar')"
+        @cancel="state.showStartClendar = false"
     ></up-datetime-picker>
     <up-datetime-picker
         :show="state.showEndClendar"
         v-model="state.model.order.endDate"
-        mode="date"
-    ></up-datetime-picker>
+        mode="datetime"
+        @close="state.showEndClendar = false"
+        :closeOnClickOverlay="true"
+        @confirm="(e)=>confirm(e,'showEndClendar')"
+        @cancel="state.showEndClendar = false"
+    >
+    </up-datetime-picker>
   </view>
 </template>
 
 <script setup lang="ts">
 import {reactive, ref} from 'vue'
-import {uploadOrderFile} from '@/api/workorder.js'
+import {submitOrderWork, uploadOrderFile} from '@/api/workorder.js'
 import dayjs from 'dayjs';
-import {DateFormat} from "@/util/index.js";
+import {DateFormat, reloadPage} from "@/util/index.js";
+import {WorkOrderLevel, WorkOrderTypes} from "@/common/consts/WorkOrderConst.js";
+import {valueToConst} from "@/common/consts/CommonConst";
 
 const state = reactive({
   showOrderType: false,
@@ -166,20 +177,12 @@ const state = reactive({
   model: {
     order: {
       files: [],
-      startDate: [dayjs().format(DateFormat.YYYYMMDD)],
-      endDate: [dayjs().format(DateFormat.YYYYMMDD)],
+      startDate: dayjs().valueOf(),
+      endDate: dayjs().valueOf(),
     }
   },
-  orderTypeList: [
-    {name: '男'},
-    {name: '女'},
-    {name: '保密'},
-  ],
-  orderLevelList: [
-    {name: 'level'},
-    {name: 'level2'},
-    {name: 'level3'},
-  ],
+  orderTypeList: [],
+  orderLevelList: [],
   rules: {
     'order.name': {
       type: 'string',
@@ -188,45 +191,48 @@ const state = reactive({
       trigger: ['blur', 'change'],
     },
     'order.type': {
-      type: 'string',
-      max: 1,
+      type: 'number',
       required: true,
       message: '请选择工单类型',
       trigger: ['blur', 'change'],
     },
     'order.level': {
-      type: 'string',
-      max: 1,
+      type: 'number',
       required: true,
       message: '请选择工单等级',
       trigger: ['blur', 'change'],
     },
     'order.startDate': {
-      type: 'string',
+      type: 'number',
       required: true,
       message: '请选择预计开始时间',
       trigger: ['blur', 'change'],
     },
     'order.endDate': {
-      type: 'string',
-      max: 1,
+      type: 'number',
       required: true,
       message: '请选择预计结束时间',
       trigger: ['blur', 'change'],
     }
   },
 });
+Object.keys(WorkOrderTypes).forEach(key => {
+  state.orderTypeList.push({name: WorkOrderTypes[key].label, id: WorkOrderTypes[key].value})
+});
+Object.keys(WorkOrderLevel).forEach(key => {
+  state.orderLevelList.push({name: WorkOrderLevel[key].label, id: WorkOrderLevel[key].value})
+});
 // 使用 ref 创建响应式引用
 const formRef = ref(null);
 const hideKeyboard = () => {
   uni.hideKeyboard()
 }
 const orderTypeSelect = (item) => {
-  state.model.order.type = item.name;
+  state.model.order.type = item.id;
   state.showOrderType = false;
 };
 const orderLevelSelect = (item) => {
-  state.model.order.level = item.name;
+  state.model.order.level = item.id;
   state.showOrderLevel = false;
 };
 
@@ -234,6 +240,12 @@ const orderLevelSelect = (item) => {
 const deletePic = (event) => {
   state.model.order.files.splice(event.index, 1)
 }
+const formatDate = (date) => {
+  return dayjs(date).format(DateFormat.YYYYMMDDHHMM)
+}
+const confirm = (e, type) => {
+  state[type] = false;
+};
 const afterRead = async (event) => {
   // 当设置 mutiple 为 true 时, file 为数组格式,否则为对象格式
   let lists = [].concat(event.file)
@@ -250,8 +262,9 @@ const afterRead = async (event) => {
     let item = state.model.order.files[fileListLen]
     state.model.order.files.splice(fileListLen, 1, Object.assign(item, {
       status: 'success',
-      message: '',
-      url: result
+      name: result.fileName,
+      uid: result.md5,
+      url: result.url
     }))
     fileListLen++
   }
@@ -259,14 +272,21 @@ const afterRead = async (event) => {
 const submit = () => {
   formRef.value.validate().then(async valid => {
     if (valid) {
-      const params = {
-        "grant_type": "password_login",
-        "username": state.model.userInfo.name,
-        "password": Base64.encode(model.userInfo.pwd),
-        "client_id": "speed",
-        "client_secret": "speed1211",
-      }
-
+      const order = state.model.order
+      submitOrderWork({
+        "name": order.name,
+        "type": order.type,
+        "level": order.level,
+        "estimatedStartTime": dayjs(order.startDate).format(DateFormat.YYYYMMDDHHMMSS),
+        "estimatedEndTime": dayjs(order.endDate).format(DateFormat.YYYYMMDDHHMMSS),
+        "description": order.desc,
+        "source": 2,
+        "problemImg": JSON.stringify(order.files),
+        "problemFile": null
+      }).then(res => {
+        uni.$u.toast('提交成功')
+        reloadPage()
+      })
     } else {
       uni.$u.toast('校验失败')
     }

+ 2 - 1
src/util/index.js

@@ -106,6 +106,7 @@ export const reloadPage = () => {
 export const DateFormat = {
   YYYYMMDD: 'YYYY-MM-DD',
   YYYYMMDDHHMMSS: 'YYYY-MM-DD HH:mm:ss',
+  YYYYMMDDHHMM: 'YYYY-MM-DD HH:mm',
 }
 
 export const getDevImg = (devImg) => {
@@ -113,7 +114,7 @@ export const getDevImg = (devImg) => {
     return "";
   }
   const parse = JSON.parse(devImg);
-  if (parse.length > 0) {
+  if (parse.length > 0 && parse[0].url) {
     const url = parse[0].url;
     return url.replace(Rules.domainPort, config.imgCdn);
   } else {

+ 6 - 3
src/util/request/index.js

@@ -60,9 +60,12 @@ export const uploadFilePromise = (url, file, param) => {
         'Authorization': `bearer ${getToken()}`
       },
       success: (res) => {
-        setTimeout(() => {
-          resolve(res.data.data)
-        }, 1000)
+        const data = JSON.parse(res.data)
+        if (data.code === 200010) {
+          resolve(data.data)
+        } else {
+          reject(data)
+        }
       }
     });
   })

File diff suppressed because it is too large
+ 0 - 0
stats.html


Some files were not shown because too many files changed in this diff