Explorar el Código

add:故障报修

weieryang %!s(int64=3) %!d(string=hace) años
padre
commit
ef98d835dc

+ 47 - 2
CallCenterWeb.UI/RMYY/src/api/faultRepairManagement/faultRepair.js

@@ -5,8 +5,8 @@ import request from '@/utils/request'
5 5
 export function getAddRepairbase(params) {
6 6
   return request({
7 7
     url: 'FaultRepair/AddFaultRepairWorkOrder',
8
-    method: 'get',
9
-    params
8
+    method: 'post',
9
+    data: params
10 10
   })
11 11
 }
12 12
 // 报修列表
@@ -17,4 +17,49 @@ export function getMaintenancerList(params) {
17 17
     params
18 18
   })
19 19
 }
20
+// 查收工单
21
+export function postTaskOrders(params) {
22
+  return request({
23
+    url: 'FaultRepair/checkWorkOrder',
24
+    method: 'post',
25
+    data: params
26
+  })
27
+}
28
+
29
+// 退回工单
30
+export function postBackWorkOrder(params) {
31
+  return request({
32
+    url: 'FaultRepair/BackWorkOrder',
33
+    method: 'post',
34
+    data: params
35
+  })
36
+}
37
+
38
+// 协作工单
39
+export function postAssistWorkOrder(params) {
40
+  return request({
41
+    url: 'FaultRepair/AssistWorkOrder',
42
+    method: 'post',
43
+    data: params
44
+  })
45
+}
46
+
47
+// 转派工单
48
+export function postTransfer(params) {
49
+  return request({
50
+    url: 'FaultRepair/Transfer',
51
+    method: 'post',
52
+    data: params
53
+  })
54
+}
55
+
56
+// 完工工单
57
+export function postDealWorkOrder(params) {
58
+  return request({
59
+    url: 'FaultRepair/DealWorkOrder',
60
+    method: 'post',
61
+    data: params
62
+  })
63
+}
64
+
20 65
 

+ 6 - 0
CallCenterWeb.UI/RMYY/src/permission.js

@@ -4,6 +4,7 @@ import { Message } from 'element-ui'
4 4
 import NProgress from 'nprogress' // progress bar
5 5
 import 'nprogress/nprogress.css'// progress bar style
6 6
 import { getToken } from '@/utils/auth' // getToken from localstorage
7
+import { sort } from 'semver'
7 8
 
8 9
 NProgress.configure({ showSpinner: false })// NProgress Configuration
9 10
 
@@ -20,8 +21,12 @@ router.beforeEach((to, from, next) => {
20 21
       next({ path: '/' })
21 22
       NProgress.done() // if current page is dashboard will not trigger	afterEach hook, so manually handle it
22 23
     } else {
24
+      if (!store.getters.deptments || store.getters.deptments.length < 1) {
25
+        store.dispatch('getDeptTree')
26
+      }
23 27
       if (store.getters.menus.length === 0) { // 判断当前用户是否已拉取菜单信息
24 28
         store.dispatch('GetInfo').then(res => { // 拉取用户信息
29
+          
25 30
           store.dispatch('GetMenus').then(res => { // 拉取菜单 按钮
26 31
             const menuDatas = res.data// 菜单数据
27 32
             const buttonDatas = res.authorizeButton// 按钮数据
@@ -30,6 +35,7 @@ router.beforeEach((to, from, next) => {
30 35
               next({ ...to, replace: true }) // hack方法 确保addRoutes已完成 ,set the replace: true so the navigation will not leave a history record
31 36
             })
32 37
           })
38
+          
33 39
         }).catch((err) => {
34 40
           store.dispatch('FedLogOut').then(() => {
35 41
             Message.error(err || '获取菜单权限失败,请重新登录!')

+ 10 - 0
CallCenterWeb.UI/RMYY/src/store/getters.js

@@ -22,6 +22,16 @@ const getters = {
22 22
   teamId: state => state.user.teamId, // 小组id
23 23
   name: state => state.user.name, // 用户姓名
24 24
 
25
+  deptments: state => state.deptment.deptments, // 部门信息
26
+  deptmap: state => {
27
+    if (state.deptment.deptmap) {
28
+      return state.deptment.deptmap
29
+    } else {
30
+      return '123'
31
+    }
32
+    
33
+  }, //部门map信息
34
+
25 35
   telIsConnected: state => state.telWebsocket.telIsConnected, // 是否建立话务websocket链接
26 36
   telMessageData: state => state.telWebsocket.telMessageData, // 话务 websocket 接收的数据
27 37
   telIsLogin: state => state.telWebsocket.telIsLogin, // 是否签入

+ 2 - 0
CallCenterWeb.UI/RMYY/src/store/index.js

@@ -3,6 +3,7 @@ import Vuex from 'vuex'
3 3
 import app from './modules/app'
4 4
 import serverConfig from './modules/serverConfig'
5 5
 import user from './modules/user'
6
+import deptment from './modules/deptment'
6 7
 import telWebsocket from './modules/telWebsocket'
7 8
 import tagsView from './modules/tagsView'
8 9
 import permission from './modules/permission'
@@ -15,6 +16,7 @@ const store = new Vuex.Store({
15 16
     app,
16 17
     serverConfig,
17 18
     user,
19
+    deptment,
18 20
     telWebsocket,
19 21
     tagsView,
20 22
     permission

+ 64 - 0
CallCenterWeb.UI/RMYY/src/store/modules/deptment.js

@@ -0,0 +1,64 @@
1
+import md5 from 'js-md5'
2
+import { getDeptTree } from '@/api/systemSetup/roleSetting/userManage'
3
+// import { getToken, setToken, removeToken } from '@/utils/auth'
4
+// import { Message } from 'element-ui'
5
+
6
+const user = {
7
+    state: {
8
+        deptments: [],
9
+        deptmap: {},
10
+    },
11
+
12
+    mutations: {
13
+        SET_DEPTMENTS: (state, deptments) => {
14
+            state.deptments = deptments
15
+        },
16
+        SET_DEPTMAP:  (state, deptmap) => {
17
+            state.deptmap = deptmap
18
+        },
19
+    },
20
+
21
+    actions: {
22
+        // 获取部门信息
23
+        getDeptTree({ commit }) {
24
+            return new Promise((resolve, reject) => {
25
+                getDeptTree().then(response => {
26
+                    console.log('获取部门成功')
27
+                    // window.localStorage.setItem('DEPTMENTS', JSON.stringify(response.data))
28
+                    var deptMap = getDeptmentMap(response.data, '', {})
29
+                    commit('SET_DEPTMAP', deptMap)
30
+                    commit('SET_DEPTMENTS', response.data)
31
+                    resolve()
32
+                }).catch(error => {
33
+                    reject(error)
34
+                })
35
+            })
36
+        },
37
+    }
38
+}
39
+
40
+
41
+
42
+function getDeptmentMap(depts, pName, deptMap) {
43
+    for (let index = 0; index < depts.length; index++) {
44
+        const element = depts[index]
45
+        if (element.TypeId === 1) {
46
+            if (element.children && element.children.length > 0) {
47
+                getDeptmentMap(element.children, element.text, deptMap)
48
+            }
49
+        } else {
50
+            const thisName = pName + '/' + element.text
51
+            if (!deptMap[element.id]) {
52
+                deptMap[element.id] = thisName
53
+            }
54
+
55
+            if (element.children && element.children.length > 0) {
56
+                getDeptmentMap(element.children, thisName, deptMap)
57
+            }
58
+        } 
59
+    }
60
+
61
+    return deptMap;
62
+}
63
+
64
+export default user

+ 325 - 12
CallCenterWeb.UI/RMYY/src/views/faultRepairManagement/repairList/index.vue

@@ -33,7 +33,7 @@
33 33
         </el-col>
34 34
         <el-col :span="6">
35 35
           <el-form-item style="margin-left:50px;">
36
-            <el-button type="primary" size="medium">查询</el-button>
36
+            <el-button type="primary" size="medium" @click="getListTask">查询</el-button>
37 37
           </el-form-item>
38 38
         </el-col>
39 39
       </el-row>
@@ -48,13 +48,36 @@
48 48
       <el-table-column prop="F_WorkOrderCode" label="编号" align="center" />
49 49
       <el-table-column prop="F_Content" label="报修内容" align="center" min-width />
50 50
       <el-table-column prop="F_Phone" label="电话号码" align="center" min-width />
51
-      <el-table-column prop="T_Wowocodetypename" label="申请科室" align="center" min-width />
51
+      <el-table-column :formatter="formtDept" prop="F_ApplicationDept" label="申请科室" align="center" min-width />
52 52
       <el-table-column prop="F_PlaceOfRepair" label="报修地点" align="center" min-width />
53
-      <el-table-column prop="T_Woscore" label="工单状态" align="center" min-width />
54
-      <el-table-column prop="T_Wowocodetypename" label="协作" align="center" min-width />
55
-      <el-table-column prop="tousercodeusername" label="维修人" align="center" min-width />
56
-      <el-table-column prop="T_Woscore" label="超时时限" align="center" min-width />
53
+      <el-table-column prop="StateName" label="工单状态" align="center" min-width />
54
+      <el-table-column label="协作" align="center" min-width > 
55
+        <template slot-scope="scope">
56
+          {{ scope.row.AssistanceState ? scope.row.AssistanceState: '-' }}
57
+        </template>
58
+      </el-table-column>
59
+      <el-table-column label="维修人" align="center" min-width >
60
+        <template slot-scope="scope">
61
+          {{ scope.row.F_Maintenancer ? scope.row.F_Maintenancer: '-' }}
62
+        </template>
63
+      </el-table-column>
64
+      <el-table-column prop="GapTime" label="超时时限" align="center" min-width />
57 65
       <el-table-column prop="F_CreateTime" label="创建时间" align="center" min-width />
66
+      <el-table-column
67
+            label="操作"
68
+            width="160"
69
+            align="center"
70
+            class-name="oparate_btn"
71
+            fixed="right"
72
+          >
73
+            <template slot-scope="scope">
74
+              <el-button type="text" v-if="isShowButton(scope.row, '接单')" @click="takeOrders(scope.row.F_WorkOrderCode)">接单</el-button>
75
+              <el-button type="text" v-if="isShowButton(scope.row, '退回')" @click="backOrder(scope.row.F_WorkOrderCode)">退回</el-button>
76
+              <el-button type="text" v-if="isShowButton(scope.row, '协作')" @click="cooperation(scope.row.F_WorkOrderCode)">协作</el-button>
77
+              <el-button type="text" v-if="isShowButton(scope.row, '转派')" @click="redeploy(scope.row.F_WorkOrderCode)">转派</el-button>
78
+              <el-button type="text" v-if="isShowButton(scope.row, '完成')" @click="doneWorkOrder(scope.row.F_WorkOrderCode)">完成</el-button>
79
+            </template>
80
+          </el-table-column>
58 81
     </el-table>
59 82
     <pagination
60 83
       v-show="pageParams.total > 0"
@@ -64,20 +87,141 @@
64 87
       class="pagination"
65 88
       @pagination="getListTask"
66 89
     />
90
+    
91
+    <el-dialog title="退回" :visible.sync="dialogBackOrder">
92
+      <el-form :model="backOrderForm">
93
+        
94
+         <el-form-item label="退回原因">
95
+          <el-input type="textarea" v-model="backOrderForm.BackReason"></el-input>
96
+        </el-form-item>
97
+      </el-form>
98
+      <div slot="footer" class="dialog-footer">
99
+        <el-button @click="dialogBackOrder = false">取 消</el-button>
100
+        <el-button type="primary" @click="postBackOrder">确 定</el-button>
101
+      </div>
102
+    </el-dialog>
103
+    <el-dialog title="协作" :visible.sync="dialogCooperation">
104
+      <el-form :model="cooperationForm" :rules="rules" label-width="100px">
105
+        <el-form-item label="协作方式" prop="type">
106
+          <el-radio-group v-model="cooperationForm.type">
107
+            <el-radio label="0">内部协作</el-radio>
108
+            <el-radio label="1">外部协作</el-radio>
109
+          </el-radio-group>
110
+        </el-form-item>
111
+        <el-form-item label="工单类别" prop="workOrderCategory" v-model="cooperationForm.workOrderCategory">
112
+              <select-order-typeTwo :second-order-type="secondOrderType" @post-second-order-type="getSecondOOrderType"/>
113
+        </el-form-item>
114
+        <el-form-item label="说明信息">
115
+            <el-input v-model="cooperationForm.content" :autosize="{ minRows: 4, maxRows: 8}" show-word-limit maxlength="100" type="textarea" placeholder="请输入说明信息"/>
116
+        </el-form-item>
117
+        <el-form-item label="协作人" prop="maintenancer" v-show="cooperationForm.type == '0'">
118
+          <el-select v-model="cooperationForm.maintenancer" placeholder="请选择协作人">
119
+            <el-option v-for="item in deptUsers" :key="item.usercode"
120
+                  :label="item.username"
121
+                  :value="item.usercode"></el-option>
122
+            
123
+          </el-select>
124
+        </el-form-item>
125
+      </el-form>
126
+      <div slot="footer" class="dialog-footer">
127
+        <el-button @click="dialogCooperation = false">取 消</el-button>
128
+        <el-button type="primary" @click="postCooperationOrder">确 定</el-button>
129
+      </div>
130
+    </el-dialog>
131
+
132
+    <el-dialog title="转派" :visible.sync="dialogredeploy">
133
+      <el-form :model="redeployForm" :rules="rules" label-width="100px">
134
+
135
+        <el-form-item label="维修员信息" prop="maintenancer">
136
+          <el-select v-model="redeployForm.toUserCode" placeholder="请选择维修员信息">
137
+            <el-option v-for="item in deptUsers" :key="item.usercode"
138
+                  :label="item.username"
139
+                  :value="item.usercode"></el-option>
140
+            
141
+          </el-select>
142
+        </el-form-item>
143
+      </el-form>
144
+      <div slot="footer" class="dialog-footer">
145
+        <el-button @click="dialogredeploy = false">取 消</el-button>
146
+        <el-button type="primary" @click="postRedeployOrder">确 定</el-button>
147
+      </div>
148
+    </el-dialog>
149
+
150
+    <el-dialog title="完工" :visible.sync="dialogDone">
151
+      <el-form :model="doneForm" :rules="rules" label-width="100px">
152
+        <el-form-item label="完成情况" prop="type">
153
+          <el-radio-group v-model="doneForm.type">
154
+            <el-radio label="0">正常完成</el-radio>
155
+            <el-radio label="1">异常完成</el-radio>
156
+          </el-radio-group>
157
+        </el-form-item>
158
+        <el-form-item label="完成说明">
159
+            <el-input v-model="doneForm.result" :autosize="{ minRows: 4, maxRows: 8}" show-word-limit maxlength="100" type="textarea" placeholder="请输入完成说明"/>
160
+        </el-form-item>
161
+      </el-form>
162
+      <div slot="footer" class="dialog-footer">
163
+        <el-button @click="dialogDone = false">取 消</el-button>
164
+        <el-button type="primary" @click="postDoneOrder">确 定</el-button>
165
+      </div>
166
+    </el-dialog>
67 167
   </div>
168
+
169
+  
68 170
 </template>
69 171
 
70 172
 <script>
71 173
 import Pagination from '@/components/context/Pagination' // 对el-pagination 二次封装
72
-import { getMaintenancerList } from '@/api/faultRepairManagement/faultRepair'
174
+import { GetPerson } from '@/api/commonAPI'
175
+import selectOrderTypeTwo from '@/components/context/commonSelect/selectOrderTypeTwo.vue'
176
+import { getMaintenancerList, postTaskOrders, postBackWorkOrder, postAssistWorkOrder, postTransfer, postDealWorkOrder } from '@/api/faultRepairManagement/faultRepair'
73 177
 export default {
74 178
   name: 'RepairList',
75 179
   components: {
76
-    Pagination
180
+    Pagination,
181
+    selectOrderTypeTwo
77 182
   },
78 183
   data() {
79 184
     return {
185
+      secondOrderType: {
186
+        typeid: 2,
187
+        pid: 3000
188
+      },
80 189
       state: 0,
190
+      dialogDone: false,
191
+      doneForm: {
192
+         workordercode: '',
193
+         type: 0,
194
+         result: '',
195
+      },
196
+      dialogredeploy: false,
197
+      redeployForm: {
198
+        workordercode: '',
199
+        toUserCode: '',
200
+      },
201
+      rules: {
202
+          type: [
203
+            { required: true, message: '请选择活动资源', trigger: 'change' }
204
+          ],
205
+          workOrderCategory: [
206
+            { required: true, message: '请选择工单类别', trigger: 'change' }
207
+          ],
208
+          maintenancer: [
209
+            { required: true, message: '请选择协作人', trigger: 'change' }
210
+          ],
211
+      },
212
+      dialogCooperation: false,
213
+      cooperationForm: {
214
+        workordercode: '',
215
+        workOrderCategory: 0,
216
+        type: '0',
217
+        content: '',
218
+        maintenancer: ''
219
+      },
220
+      dialogBackOrder: false,
221
+      backOrderForm: {
222
+        workordercode: '',
223
+        BackReason: '',
224
+      },
81 225
       activeName: '0',
82 226
       repairman: '', // 姓名
83 227
       rpairmanphone: '', // 电话
@@ -88,20 +232,187 @@ export default {
88 232
         pageindex: 1, // 当前第几页
89 233
         pagesize: Number(this.$store.getters.serverConfig.PAGESIZE), // 每页几条数据
90 234
         total: 0 // 总共多少数据
91
-      }
235
+      },
236
+      deptUsers:[],
237
+      deptments: [],
92 238
     }
93 239
   },
94 240
   computed: {},
95 241
   created() {
96 242
     this.getListTask()
243
+    
97 244
   },
98 245
   mounted() {
99 246
   },
100 247
   methods: {
248
+    formtDept(row, column) {
249
+      return this.$store.getters.deptmap[row[column.property].trim()]
250
+    },
251
+    isShowButton(row, name) { // 显示按钮
252
+      var show = false
253
+      if (row.Buttons && row.Buttons.length >0 && row.Buttons.findIndex((o)=> {return o.text === name}) >=0) {
254
+        show = true
255
+      }
256
+
257
+      return show
258
+    },
259
+    doneWorkOrder(code) {
260
+      this.dialogDone = true
261
+      this.doneForm.workordercode = code
262
+    },
263
+    postDoneOrder() { // 完工
264
+      new Promise((resolve) => {
265
+        const params = this.doneForm
266
+        postDealWorkOrder(params).then((response) => {
267
+          if (response.state === 'success') {
268
+            this.$message({
269
+              type: 'success',
270
+              message: '操作成功!'
271
+            });
272
+            this.dialogDone = false;
273
+          } else {
274
+            this.$message({
275
+              type: 'info',
276
+              message: response.message
277
+            });  
278
+          }
279
+        })
280
+        resolve()
281
+      })     
282
+    },
283
+    redeploy(code) {
284
+      this.getRepairman()
285
+      this.dialogredeploy = true
286
+      this.redeployForm.workordercode = code
287
+
288
+    },
289
+    postRedeployOrder() { // 转派
290
+      new Promise((resolve) => {
291
+        const params = this.redeployForm
292
+        postTransfer(params).then((response) => {
293
+          if (response.state === 'success') {
294
+            this.$message({
295
+              type: 'success',
296
+              message: '操作成功!'
297
+            });
298
+            this.dialogredeploy = false;
299
+          } else {
300
+            this.$message({
301
+              type: 'info',
302
+              message: response.message
303
+            });  
304
+          }
305
+        })
306
+        resolve()
307
+      })     
308
+    },
309
+    postCooperationOrder() { // 协作
310
+      new Promise((resolve) => {
311
+        const params = this.cooperationForm
312
+        postAssistWorkOrder(params).then((response) => {
313
+          if (response.state === 'success') {
314
+            this.$message({
315
+              type: 'success',
316
+              message: '操作成功!'
317
+            });
318
+            this.dialogCooperation = false;
319
+          } else {
320
+            this.$message({
321
+              type: 'info',
322
+              message: response.message
323
+            });  
324
+          }
325
+        })
326
+        resolve()
327
+      })      
328
+    },
329
+    // 获取申请人数据
330
+    getRepairman() {
331
+      const deptid = this.$store.getters.teamId
332
+      return new Promise((resolve) => {
333
+        const params = {
334
+          deptid,
335
+        }
336
+        GetPerson(params).then((res) => {
337
+          if (res.state === 'success') {
338
+            this.deptUsers = res.rows
339
+          }
340
+        })
341
+        resolve()
342
+      })
343
+    },
344
+    getSecondOOrderType(data) {
345
+      this.cooperationForm.workOrderCategory = data.value
346
+    },
101 347
     handleClick(res) {
102
-      this.state = Number(res.index)
348
+      this.state = Number(res.name)
349
+      this.getListTask()
350
+    },
351
+    cooperation(code) {
352
+      this.dialogCooperation = true;
353
+      this.cooperationForm.workordercode = code
354
+      this.getRepairman()
355
+    },
356
+    postBackOrder() { // 退回
357
+      new Promise((resolve) => {
358
+        const params = this.backOrderForm
359
+        postBackWorkOrder(params).then((response) => {
360
+          if (response.state === 'success') {
361
+            this.$message({
362
+              type: 'success',
363
+              message: '操作成功!'
364
+            });
365
+            this.dialogBackOrder = false;
366
+          } else {
367
+            this.$message({
368
+              type: 'info',
369
+              message: response.message
370
+            });  
371
+          }
372
+        })
373
+        resolve()
374
+      })
375
+    },
376
+    backOrder(code) { // 退回弹框
377
+      this.dialogBackOrder = true
378
+      this.backOrderForm.workordercode = code
379
+    },
380
+    takeOrders(code) { // 接单
381
+      this.$confirm('确认接受该工单吗?', '提示', {
382
+          confirmButtonText: '确定',
383
+          cancelButtonText: '取消',
384
+          type: 'warning'
385
+        }).then(() => {
386
+          
387
+          new Promise((resolve) => {
388
+            const params = { 
389
+              workordercode: code,
390
+            }
391
+            postTaskOrders(params).then((response) => {
392
+              if (response.state === 'success') {
393
+                this.$message({
394
+                  type: 'success',
395
+                  message: '删除成功!'
396
+                });
397
+              } else {
398
+                this.$message({
399
+                  type: 'info',
400
+                  message: response.message
401
+                });  
402
+              }
403
+
404
+            })
405
+            resolve()
406
+          })
407
+        }).catch(() => {
408
+          this.$message({
409
+            type: 'info',
410
+            message: '已取消删除'
411
+          });          
412
+        });
103 413
     },
104 414
     getListTask() {
415
+      this.taskDataLists = []
105 416
       return new Promise((resolve) => {
106 417
         const params = {
107 418
           page: this.pageParams.pageindex, // 第几页
@@ -114,9 +425,11 @@ export default {
114 425
           workordercode: this.workOrderId
115 426
         }
116 427
         getMaintenancerList(params).then((response) => {
428
+          this.pageParams.total = response.total
117 429
           if (response.rows.length > 0) {
118 430
             this.taskDataLists = response.rows
119 431
           }
432
+          
120 433
         })
121 434
         resolve()
122 435
       })
@@ -125,8 +438,8 @@ export default {
125 438
 }
126 439
 </script>
127 440
 
128
-<style scoped>
129
-.el-tabs__item {
441
+<style rel="stylesheet/scss" lang="scss" scoped>
442
+/deep/.el-tabs__item {
130 443
   width: 185px !important;
131 444
   text-align: center;
132 445
   font-size: 16px !important;

+ 2 - 1
CallCenterWeb.UI/RMYY/src/views/login/index.vue

@@ -171,9 +171,10 @@ export default {
171 171
           this.loading = true
172 172
           this.$store.dispatch('Login', this.loginForm)
173 173
             .then(() => {
174
-              debugger
174
+              
175 175
               this.$message.success('登录成功')
176 176
               this.loading = false
177
+             
177 178
               this.$router.push({
178 179
                 path: '/'
179 180
               })

+ 1 - 1
CallCenterWeb.UI/RMYY/static/config/serverConfig.json

@@ -1,6 +1,6 @@
1 1
 {
2 2
   "NODE_ENV": "development",
3
-  "BASE_API": " http://192.168.1.37:8000/",
3
+  "BASE_API": " http://192.168.8.10:8033/",
4 4
  
5 5
   "SOCKET_IP": "192.168.8.7",
6 6
   "SOCKET_PORT": "8081",