Răsfoiți Sursa

新增流程待办和工单待办侧边栏数量以及维修

huang_an 2 ani în urmă
părinte
comite
345ca719fd

+ 8 - 5
src/App.vue

@@ -6,11 +6,14 @@
 
 <script>
   import { updateDocumentTitle } from '@/utils/document-title-util';
-
+  import { statistics } from '@/api/bpm/components/inspectionManage';
+  import { getTodoTaskPage } from '@/api/bpm/task';
   import { getPathAddress } from '@/api/system/file/index';
   export default {
     name: 'App',
-    created () {
+    created() {
+      statistics(); // 加载工单待办侧边栏条数
+      getTodoTaskPage({ pageNo: 1, pageSize: 1 }); // 加载流程待办侧边栏条数
       console.log('我是子应用-----------');
       // 恢复主题
       this.$store.dispatch('theme/recoverTheme');
@@ -23,7 +26,7 @@
     },
     methods: {
       /* 路由切换更新浏览器标题 */
-      setDocumentTitle () {
+      setDocumentTitle() {
         updateDocumentTitle(
           this.$route,
           (key) => this.$t(key),
@@ -32,10 +35,10 @@
       }
     },
     watch: {
-      '$i18n.locale' () {
+      '$i18n.locale'() {
         this.setDocumentTitle();
       },
-      $route () {
+      $route() {
         this.setDocumentTitle();
       }
     }

+ 37 - 1
src/api/bpm/components/inspectionManage/index.js

@@ -1,4 +1,6 @@
 import request from '@/utils/request';
+import store from '@/store';
+import Vue from 'vue';
 
 /**
  * 查询量具送检信息
@@ -15,7 +17,7 @@ export async function processById(params) {
 
 // 提交日志-处理流程
 export async function surrender(data) {
-  const res = await request.post('/eom/planTool/surrender', data);
+  const res = await request.post('/eam/planTool/surrender', data);
   if (res.data.code == 0) {
     return res.data;
   }
@@ -35,6 +37,40 @@ export async function getList(params) {
 export async function statistics(params) {
   const res = await request.get('/eam/PdaWorkOrder/statistics', { params });
   if (res.data.code == 0) {
+    if (store.state.user.menus?.length) {
+      for (const p of store.state.user.menus) {
+        if (p.path === '/tickets') {
+          store.dispatch('user/setMenuBadge', {
+            path: '/tickets',
+            value: res.data.data.total || 0,
+            color: 'danger'
+          });
+          break;
+        }
+      }
+    } else {
+      const unwatch = Vue.prototype.$watch(
+        '$store.state.user.menus',
+        () => {
+          if (store.state.user.menus?.length) {
+            for (const p of store.state.user.menus) {
+              if (p.path === '/tickets') {
+                store.dispatch('user/setMenuBadge', {
+                  path: '/tickets',
+                  value: res.data.data.total || 0,
+                  color: 'danger'
+                });
+                break;
+              }
+            }
+            unwatch();
+          }
+        },
+        {
+          immediate: true
+        }
+      );
+    }
     return res.data.data;
   }
   return Promise.reject(new Error(res.data.message));

+ 36 - 0
src/api/bpm/task.js

@@ -1,4 +1,6 @@
 import request from '@/utils/request';
+import store from '@/store';
+import Vue from 'vue';
 
 export async function getTodoTaskPage(query) {
   const res = await request({
@@ -7,6 +9,40 @@ export async function getTodoTaskPage(query) {
     params: query
   });
   if (res.data.code == 0) {
+    if (store.state.user.menus?.length) {
+      for (const p of store.state.user.menus) {
+        if (p.path === '/todo') {
+          store.dispatch('user/setMenuBadge', {
+            path: '/todo',
+            value: res.data.data.count || 0,
+            color: 'danger'
+          });
+          break;
+        }
+      }
+    } else {
+      const unwatch = Vue.prototype.$watch(
+        '$store.state.user.menus',
+        () => {
+          if (store.state.user.menus?.length) {
+            for (const p of store.state.user.menus) {
+              if (p.path === '/todo') {
+                store.dispatch('user/setMenuBadge', {
+                  path: '/todo',
+                  value: res.data.data.count || 0,
+                  color: 'danger'
+                });
+                break;
+              }
+            }
+            unwatch();
+          }
+        },
+        {
+          immediate: true
+        }
+      );
+    }
     return res.data.data;
   }
   return Promise.reject(new Error(res.data.message));

+ 196 - 183
src/styles/index.scss

@@ -4,189 +4,202 @@ $--ele-font-path: '~ele-admin/es/style/fonts';
 @import '~ele-admin/es/style/index.scss';
 @import './transition/index.scss';
 
-
-
-
 /* 布局-横向 */
 /* c:center,s:start,e:end,a:around,b:between,w:wrap */
 .rx {
-    display: flex;
-  }
-  
-  .rx-c {
-    display: flex;
-    align-items: center;
-  }
-  
-  .rx-cc {
-    display: flex;
-    flex-flow: row nowrap;
-    justify-content: center;
-    align-items: center;
-  }
-  
-  .rx-sc {
-    display: flex;
-    flex-flow: row nowrap;
-    justify-content: flex-start;
-    align-items: center;
-  }
-  
-  .rx-ss {
-    display: flex;
-    flex-flow: row nowrap;
-    justify-content: flex-start;
-    align-items: flex-start;
-  }
-  
-  .rx-warp {
-    display: flex;
-    flex-flow: row nowrap;
-    justify-content: flex-start;
-    align-items: flex-start;
-    flex-wrap: wrap;
-  }
-  
-  .rx-se {
-    display: flex;
-    flex-flow: row nowrap;
-    justify-content: flex-start;
-    align-items: flex-end;
-  }
-  
-  .rx-dir-start {
-    display: flex;
-    flex-direction: column;
-    align-items: flex-start;
-  }
-  
-  .rx-ec {
-    display: flex;
-    flex-flow: row nowrap;
-    justify-content: flex-end;
-    align-items: center;
-  }
-  
-  .rx-es {
-    display: flex;
-    flex-flow: row nowrap;
-    justify-content: flex-end;
-    align-items: flex-start;
-  }
-  
-  .rx-ee {
-    display: flex;
-    flex-flow: row nowrap;
-    justify-content: flex-end;
-    align-items: flex-end;
-  }
-  
-  .rx-ac {
-    display: flex;
-    flex-flow: row nowrap;
-    justify-content: space-around;
-    align-items: center;
-  }
-  
-  .rx-bc {
-    display: flex;
-    flex-flow: row nowrap;
-    justify-content: space-between;
-    align-items: center;
-  }
-  
-  .rx-bs {
-    display: flex;
-    flex-flow: row nowrap;
-    justify-content: space-between;
-    align-items: flex-start;
-  }
-  
-  .rx-be {
-    display: flex;
-    flex-flow: row nowrap;
-    justify-content: space-between;
-    align-items: flex-end;
-  }
-  
-  .rx-vc {
-    display: flex;
-    flex-flow: row nowrap;
-    justify-content: space-evenly;
-    align-items: center;
-  }
-  
-  .rx-cs {
-    display: flex;
-    flex-flow: row nowrap;
-    justify-content: center;
-    align-items: flex-start;
-  }
-  
-  .rx-wsc {
-    display: flex;
-    flex-flow: row wrap;
-    justify-content: flex-start;
-    align-items: center;
-  }
-  
-  .rx-wss {
-    display: flex;
-    flex-flow: row wrap;
-    justify-content: flex-start;
-    align-content: flex-start;
-  }
-  
-  .rx-wbs {
-    display: flex;
-    flex-flow: row wrap;
-    justify-content: space-between;
-    align-content: flex-start;
-  }
-  
-  /* 布局-纵向 */
-  
-  .cx {
-    display: flex;
-    flex-flow: column nowrap;
-  }
-  
-  .cx-cc {
-    display: flex;
-    flex-flow: column nowrap;
-    justify-content: center;
-    align-items: center;
-  }
-  
-  .cx-ce {
-    display: flex;
-    flex-flow: column nowrap;
-    justify-content: center;
-    align-items: flex-end;
-  }
-  
-  .cx-sc {
-    display: flex;
-    flex-flow: column nowrap;
-    justify-content: flex-start;
-    align-items: center;
-  }
-  
-  .cx-cs {
-    display: flex;
-    flex-flow: column nowrap;
-    justify-content: center;
-    align-items: flex-start;
-  }
-  
-  .cx-rc {
-    display: flex;
-    flex-flow: column-reverse nowrap;
-    justify-content: center;
-    align-items: center;
-  }
-  table th .is-required::before{
-    content: "*";
-    color: red;
-    margin-right: 4px;
-} 
+  display: flex;
+}
+
+.rx-c {
+  display: flex;
+  align-items: center;
+}
+
+.rx-cc {
+  display: flex;
+  flex-flow: row nowrap;
+  justify-content: center;
+  align-items: center;
+}
+
+.rx-sc {
+  display: flex;
+  flex-flow: row nowrap;
+  justify-content: flex-start;
+  align-items: center;
+}
+
+.rx-ss {
+  display: flex;
+  flex-flow: row nowrap;
+  justify-content: flex-start;
+  align-items: flex-start;
+}
+
+.rx-warp {
+  display: flex;
+  flex-flow: row nowrap;
+  justify-content: flex-start;
+  align-items: flex-start;
+  flex-wrap: wrap;
+}
+
+.rx-se {
+  display: flex;
+  flex-flow: row nowrap;
+  justify-content: flex-start;
+  align-items: flex-end;
+}
+
+.rx-dir-start {
+  display: flex;
+  flex-direction: column;
+  align-items: flex-start;
+}
+
+.rx-ec {
+  display: flex;
+  flex-flow: row nowrap;
+  justify-content: flex-end;
+  align-items: center;
+}
+
+.rx-es {
+  display: flex;
+  flex-flow: row nowrap;
+  justify-content: flex-end;
+  align-items: flex-start;
+}
+
+.rx-ee {
+  display: flex;
+  flex-flow: row nowrap;
+  justify-content: flex-end;
+  align-items: flex-end;
+}
+
+.rx-ac {
+  display: flex;
+  flex-flow: row nowrap;
+  justify-content: space-around;
+  align-items: center;
+}
+
+.rx-bc {
+  display: flex;
+  flex-flow: row nowrap;
+  justify-content: space-between;
+  align-items: center;
+}
+
+.rx-bs {
+  display: flex;
+  flex-flow: row nowrap;
+  justify-content: space-between;
+  align-items: flex-start;
+}
+
+.rx-be {
+  display: flex;
+  flex-flow: row nowrap;
+  justify-content: space-between;
+  align-items: flex-end;
+}
+
+.rx-vc {
+  display: flex;
+  flex-flow: row nowrap;
+  justify-content: space-evenly;
+  align-items: center;
+}
+
+.rx-cs {
+  display: flex;
+  flex-flow: row nowrap;
+  justify-content: center;
+  align-items: flex-start;
+}
+
+.rx-wsc {
+  display: flex;
+  flex-flow: row wrap;
+  justify-content: flex-start;
+  align-items: center;
+}
+
+.rx-wss {
+  display: flex;
+  flex-flow: row wrap;
+  justify-content: flex-start;
+  align-content: flex-start;
+}
+
+.rx-wbs {
+  display: flex;
+  flex-flow: row wrap;
+  justify-content: space-between;
+  align-content: flex-start;
+}
+
+/* 布局-纵向 */
+
+.cx {
+  display: flex;
+  flex-flow: column nowrap;
+}
+
+.cx-cc {
+  display: flex;
+  flex-flow: column nowrap;
+  justify-content: center;
+  align-items: center;
+}
+
+.cx-ce {
+  display: flex;
+  flex-flow: column nowrap;
+  justify-content: center;
+  align-items: flex-end;
+}
+
+.cx-sc {
+  display: flex;
+  flex-flow: column nowrap;
+  justify-content: flex-start;
+  align-items: center;
+}
+
+.cx-cs {
+  display: flex;
+  flex-flow: column nowrap;
+  justify-content: center;
+  align-items: flex-start;
+}
+
+.cx-rc {
+  display: flex;
+  flex-flow: column-reverse nowrap;
+  justify-content: center;
+  align-items: center;
+}
+table th .is-required::before {
+  content: '*';
+  color: red;
+  margin-right: 4px;
+}
+
+// 步骤条边线显示
+.el-step__head.is-process .el-step__icon.is-text {
+  border: none !important;
+  background: none !important;
+}
+// .el-step.is-vertical .el-step__line{
+// 	left: 10px;
+// }
+.repair_infoLogs .el-step:last-of-type .el-step__line {
+  display: block !important;
+  width: 3px !important;
+}
+.repair_infoLogs .el-steps:last-child .el-step__line {
+  display: none !important;
+}

+ 16 - 0
src/utils/dict/tickets.js

@@ -6,3 +6,19 @@ export const ticketStatus = [
   { id: 3, label: '已完成' },
   { id: 4, label: '已验收' }
 ];
+
+// 报修状态
+export const repairStatus = [
+  { code: 2, label: '已派单' },
+  { code: 3, label: '执行中' },
+  { code: 4, label: '待验收' },
+  { code: 5, label: '已完成' },
+  // { code: 6, label: '未修复' },
+  { code: 7, label: '委外中' }
+];
+
+// 执行结果
+export const resultStatus = [
+  { code: 5, label: '未修复' },
+  { code: 4, label: '已修复' }
+];

+ 9 - 2
src/views/bpm/doneTickets/repair/index.vue

@@ -101,7 +101,13 @@
         <el-table-column prop="planFinishTime" label="计划完成时间" />
         <el-table-column prop="orderStatus" label="执行结果">
           <template slot-scope="{ row }">
-            {{ { 0: '缺陷', 1: '正常' }[row.isAbnormal] }}
+            {{
+              row.acceptanceStatus
+                ? resultStatus.filter(
+                    (item) => item.code == row.acceptanceStatus
+                  )[0].label
+                : ''
+            }}
           </template>
         </el-table-column>
         <el-table-column prop="orderStatus" label="状态">
@@ -174,7 +180,7 @@
   import redeployOther from '../components/redeployOther.vue';
   import signingUpWork from '../components/signingUpWork.vue';
   import RepairDetailsDialog from '@/views/bpm/tickets/components/RepairDetailsDialog.vue';
-  import { ticketStatus } from '@/utils/dict/tickets';
+  import { ticketStatus, resultStatus } from '@/utils/dict/tickets';
   import { getWorkOrderList, getRule } from '@/api/tickets';
   import pagenation from '@/components/Pagination';
   export default {
@@ -186,6 +192,7 @@
     },
     data() {
       return {
+        resultStatus,
         ruleNameList: [],
         tableData: [],
         statusOptions: [],

+ 115 - 21
src/views/bpm/handleTask/components/measuringToolInspection/detailDialog.vue

@@ -88,9 +88,46 @@
           </el-row>
         </div>
         <div class="maintain_equipment_info">
-          <HeaderTitle title="量具设备" size="16px"></HeaderTitle>
+          <HeaderTitle title="量具设备" size="16px">
+            <template
+              v-if="
+                taskDefinitionKey !== 'user_submit' ||
+                taskDefinitionKey !== 'user_receive'
+              "
+            >
+              <span class="normarl_num"
+                >正常:{{
+                  infoData.planDeviceList?.length > 0
+                    ? infoData.planDeviceList.filter(
+                        (item) => item.teamLeaderResult == 1
+                      ).length
+                    : 0
+                }}</span
+              >
+              <span class="unnormarl_num"
+                >异常:{{
+                  infoData.planDeviceList?.length > 0
+                    ? infoData.planDeviceList.filter(
+                        (item) => item.teamLeaderResult == 2
+                      ).length
+                    : 0
+                }}</span
+              >
+              <span class="lose_num"
+                >丢失:{{
+                  infoData.planDeviceList?.length > 0
+                    ? infoData.planDeviceList.filter(
+                        (item) => item.teamLeaderResult == 3
+                      ).length
+                    : 0
+                }}</span
+              >
+            </template>
+          </HeaderTitle>
           <div class="maintain_equipment_info_content">
             <el-table :height="300" :data="infoData.planDeviceList" border>
+              <el-table-column label="序号" type="index" width="50">
+              </el-table-column>
               <el-table-column label="设备编码" prop="name">
                 <template slot-scope="scope">
                   <div>
@@ -98,10 +135,10 @@
                   </div>
                 </template>
               </el-table-column>
-              <el-table-column label="设备编号" prop="norm">
+              <el-table-column label="编号" prop="norm">
                 <template slot-scope="scope">
                   <div>
-                    <span>{{ scope.row.substance.codeNumber }}</span>
+                    <span>{{ scope.row.substance.extInfo.codeNumber }}</span>
                   </div>
                 </template>
               </el-table-column>
@@ -119,15 +156,19 @@
                   </div>
                 </template>
               </el-table-column>
-              <el-table-column label="是否遗失" prop="isLose">
+              <el-table-column label="质检" prop="qualityStatus">
                 <template slot-scope="scope">
                   <el-select
-                    v-if="taskDefinitionKey === 'user_submit'"
-                    v-model="scope.row.isLose"
+                    v-if="
+                      (taskDefinitionKey === 'leader_check' &&
+                        infoData.logList.length == 1) ||
+                      taskDefinitionKey === 'user_receive'
+                    "
+                    v-model="scope.row.qualityStatus"
                     placeholder="请选择"
                   >
                     <el-option
-                      v-for="item in option"
+                      v-for="item in statusOption"
                       :label="item.label"
                       :value="item.value"
                       :key="item.value"
@@ -135,27 +176,23 @@
                     </el-option>
                   </el-select>
                   <span v-else>{{
-                    scope.row.isLose != null
-                      ? option.filter(
-                          (item) => item.value == scope.row.isLose
+                    scope.row.qualityStatus != null
+                      ? statusOption.filter(
+                          (item) => item.value == scope.row.qualityStatus
                         )[0].label
                       : ''
                   }}</span>
                 </template>
               </el-table-column>
-              <el-table-column label="质检" prop="qualityStatus">
+              <el-table-column label="是否遗失" prop="isLose">
                 <template slot-scope="scope">
                   <el-select
-                    v-if="
-                      (taskDefinitionKey === 'leader_check' &&
-                        infoData.logList.length == 1) ||
-                      taskDefinitionKey === 'user_receive'
-                    "
-                    v-model="scope.row.qualityStatus"
+                    v-if="taskDefinitionKey === 'user_submit'"
+                    v-model="scope.row.isLose"
                     placeholder="请选择"
                   >
                     <el-option
-                      v-for="item in statusOption"
+                      v-for="item in option"
                       :label="item.label"
                       :value="item.value"
                       :key="item.value"
@@ -163,14 +200,57 @@
                     </el-option>
                   </el-select>
                   <span v-else>{{
-                    scope.row.qualityStatus != null
-                      ? statusOption.filter(
-                          (item) => item.value == scope.row.qualityStatus
+                    scope.row.isLose != null
+                      ? option.filter(
+                          (item) => item.value == scope.row.isLose
                         )[0].label
                       : ''
                   }}</span>
                 </template>
               </el-table-column>
+              <template
+                v-if="
+                  taskDefinitionKey !== 'user_submit' ||
+                  taskDefinitionKey !== 'user_receive'
+                "
+              >
+                <el-table-column
+                  v-if="
+                    taskDefinitionKey !== 'user_submit' ||
+                    taskDefinitionKey !== 'user_receive'
+                  "
+                  label="上交时间"
+                  prop="handTime"
+                ></el-table-column>
+                <el-table-column
+                  label="负责人确认结果"
+                  width="260"
+                  prop="teamLeaderResult"
+                >
+                  <template slot-scope="scope">
+                    <el-radio-group v-model="scope.row.teamLeaderResult">
+                      <el-radio :label="1">正常</el-radio>
+                      <el-radio :label="2">异常</el-radio>
+                      <el-radio :label="3">丢失</el-radio>
+                    </el-radio-group>
+                  </template>
+                </el-table-column>
+                <el-table-column
+                  label="负责人确认时间"
+                  prop="teamReceiptTime"
+                ></el-table-column>
+                <el-table-column label="操作" width="90">
+                  <template slot-scope="scope">
+                    <el-button
+                      v-if="!scope.row.teamReceiptTime"
+                      @click="configResult(scope.row)"
+                      type="primary"
+                      size="small"
+                      >确认</el-button
+                    >
+                  </template>
+                </el-table-column>
+              </template>
             </el-table>
             <!-- <div
               class="equipment_item"
@@ -426,6 +506,20 @@
   }
   .maintain_equipment_info {
     margin-bottom: 20px;
+    .normarl_num {
+      font-size: 14px !important;
+      color: green;
+      margin-right: 10px;
+    }
+    .unnormarl_num {
+      font-size: 14px !important;
+      color: red;
+      margin-right: 10px;
+    }
+    .lose_num {
+      font-size: 14px !important;
+      color: orange;
+    }
     .maintain_equipment_info_title {
       border-bottom: 1px solid #1890ff;
       padding-bottom: 3px;

+ 167 - 0
src/views/bpm/handleTask/components/outsourcedWarehousingNoProcurement/stockOutOrder.vue

@@ -0,0 +1,167 @@
+<template>
+  <div>
+    <el-dialog
+      title="选择采购订单"
+      :visible.sync="dialogVisible"
+      width="60%"
+      :before-close="handleClose"
+      :close-on-click-modal="false"
+      :close-on-press-escape="false"
+    >
+      <div class="main">
+        <ele-pro-table
+          ref="table"
+          :initLoad="false"
+          :columns="columns"
+          :current.sync="current"
+          highlight-current-row
+          :datasource="datasource"
+          tool-class="ele-toolbar-form"
+          cache-key="systemOrgUserTable"
+          @row-click="chooseRow"
+        >
+          <template v-slot:action="{ row }">
+            <el-radio class="radio" v-model="radio" :label="row.id"
+              ><i></i
+            ></el-radio>
+          </template>
+        </ele-pro-table>
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="dialogVisible = false">取 消</el-button>
+        <el-button type="primary" @click="handleMine">确 定</el-button>
+      </span>
+    </el-dialog>
+
+    <pickerDetails ref="pickerDetailsEditRef" />
+  </div>
+</template>
+
+<script>
+  import outin from '@/api/warehouseManagement/outin';
+  import { purchaseorderreceive } from '@/api/mes';
+  export default {
+    data() {
+      return {
+        dataSource: {},
+        dialogVisible: false,
+        pages: {
+          pageNum: 1,
+          size: 10
+        },
+        total: 0,
+        tableData: [],
+        current: {},
+        radio: null,
+        columns: [
+          {
+            type: 'index',
+            label: '序号',
+            width: 50,
+            align: 'center'
+          },
+
+          {
+            prop: 'bizNo',
+            label: '单号',
+            align: 'center',
+            slot: 'bizNo',
+            showOverflowTooltip: true,
+            width: 160
+          },
+          {
+            prop: 'bizType',
+            slot: 'bizType',
+            label: '出库场景',
+            align: 'center',
+            showOverflowTooltip: true,
+            width: 150
+          },
+          {
+            prop: 'sourceBizNo',
+            label: '来源单据',
+            align: 'center',
+            showOverflowTooltip: true
+          },
+
+          {
+            prop: 'createUserName',
+            label: '领料人',
+            align: 'center',
+            slot: 'createUserName',
+            showOverflowTooltip: true,
+            width: 200
+          },
+          {
+            prop: 'createTime',
+            label: '出库时间',
+            align: 'center',
+            showOverflowTooltip: true,
+            width: 200
+          },
+          {
+            prop: 'verifyStatus',
+            slot: 'verifyStatus',
+            label: '状态',
+            align: 'center',
+            showOverflowTooltip: true,
+            width: 120
+          },
+          {
+            prop: 'verifyName',
+            slot: 'verifyName',
+            label: '审核人',
+            align: 'center',
+            showOverflowTooltip: true,
+            width: 120
+          },
+          {
+            columnKey: 'action',
+            label: '操作',
+            width: 300,
+            align: 'center',
+            slot: 'action',
+            showOverflowTooltip: true
+          }
+        ]
+      };
+    },
+    methods: {
+      async handleMine() {
+        if (!this.current) {
+          this.$message.error('请选择出库单');
+        }
+        this.$emit('success', this.current);
+        this.dialogVisible = false;
+      },
+      datasource({ page, limit, where }) {
+        const data = outin.list({
+          pageNum: page,
+          size: limit,
+          bizStatus: 2,
+          type: 2,
+          ...where
+        });
+        this.dataSource = data;
+        return data;
+      },
+      async open() {
+        this.dialogVisible = true;
+        this.$nextTick(() => {
+          this.$refs.table.reload({
+            pageNum: 1,
+            size: 10,
+            where: {}
+          });
+        });
+      },
+      chooseRow(row) {
+        this.current = row;
+        this.radio = row.id;
+      },
+      handleClose(done) {
+        this.dialogVisible = false;
+      }
+    }
+  };
+</script>

+ 245 - 14
src/views/bpm/handleTask/components/purchaseOrder/invoice/procurementStorage.vue

@@ -195,7 +195,14 @@
                     {{ row.manualBatchNo }}
                   </template>
                   <el-form-item v-else>
-                    <el-input v-model="row.manualBatchNo"> </el-input>
+                    <el-input
+                      :ref="'manualBatchNo' + $index"
+                      @keyup.native="
+                        moveFocus($event, $index, 'manualBatchNo', '产品', row)
+                      "
+                      v-model="row.manualBatchNo"
+                    >
+                    </el-input>
                   </el-form-item>
                 </template>
               </el-table-column>
@@ -237,6 +244,16 @@
                       required
                     >
                       <el-input
+                        :ref="'minPackingCount' + $index"
+                        @keyup.native="
+                          moveFocus(
+                            $event,
+                            $index,
+                            'minPackingCount',
+                            '产品',
+                            row
+                          )
+                        "
                         type="number"
                         v-model="row.minPackingCount"
                         @input="minPackingCountChange(row, $event)"
@@ -267,6 +284,10 @@
                     required
                   >
                     <el-input
+                      :ref="'outInNum' + $index"
+                      @keyup.native="
+                        moveFocus($event, $index, 'outInNum', '产品', row)
+                      "
                       v-model="row.outInNum"
                       @input="packNum(row, $event)"
                     >
@@ -331,6 +352,10 @@
                     :prop="`warehousingMaterialList.${$index}.univalence`"
                   >
                     <el-input
+                      :ref="'univalence' + $index"
+                      @keyup.native="
+                        moveFocus($event, $index, 'univalence', '产品', row)
+                      "
                       v-model="row.univalence"
                       placeholder="非必填"
                       @input="
@@ -542,39 +567,65 @@
               prop="measuringUnit"
             ></el-table-column>
             <el-table-column label="发货条码" prop="barcodes" width="130">
-              <template slot-scope="{ row }">
-                <el-input v-if="!row.isPack" v-model="row.barcodes"></el-input>
+              <template slot-scope="{ row, $index }">
+                <el-input
+                  v-if="!row.isPack"
+                  :ref="'barcodes' + $index"
+                  @keyup.native="
+                    moveFocus($event, $index, 'barcodes', '包装', row)
+                  "
+                  v-model="row.barcodes"
+                ></el-input>
                 <span v-else>{{ row.barcodes }}</span>
               </template>
             </el-table-column>
             <el-table-column label="物料代号" prop="materielCode" width="130">
-              <template slot-scope="{ row }">
+              <template slot-scope="{ row, $index }">
                 <el-input
                   v-if="!row.isPack"
+                  :ref="'materielCode' + $index"
+                  @keyup.native="
+                    moveFocus($event, $index, 'materielCode', '包装', row)
+                  "
                   v-model="row.materielCode"
                 ></el-input>
                 <span v-else>{{ row.materielCode }}</span>
               </template>
             </el-table-column>
             <el-table-column label="客户代号" prop="clientCode">
-              <template slot-scope="{ row }">
+              <template slot-scope="{ row, $index }">
                 <el-input
                   v-if="!row.isPack"
+                  :ref="'clientCode' + $index"
+                  @keyup.native="
+                    moveFocus($event, $index, 'clientCode', '包装', row)
+                  "
                   v-model="row.clientCode"
                 ></el-input>
                 <span v-else> {{ row.clientCode }}</span>
               </template>
             </el-table-column>
             <el-table-column label="刻码" prop="engrave">
-              <template slot-scope="{ row }">
-                <el-input v-if="!row.isPack" v-model="row.engrave"></el-input>
+              <template slot-scope="{ row, $index }">
+                <el-input
+                  v-if="!row.isPack"
+                  :ref="'engrave' + $index"
+                  @keyup.native="
+                    moveFocus($event, $index, 'engrave', '包装', row)
+                  "
+                  v-model="row.engrave"
+                ></el-input>
                 <span v-else>{{ row.engrave }}</span>
               </template>
             </el-table-column>
             <el-table-column label="重量" prop="weight" width="100">
-              <template slot-scope="{ row }">
+              <template slot-scope="{ row, $index }">
                 <el-input
                   v-if="!row.isPack && row.measuringUnit != row.weightUtil"
+                  :ref="'weight' + $index"
+                  @keyup.native="
+                    moveFocus($event, $index, 'weight', '包装', row)
+                  "
                   v-model="row.weight"
                   @input="weightInput($event, row)"
                 ></el-input>
@@ -728,17 +779,25 @@
               prop="measuringUnit"
             ></el-table-column>
             <el-table-column label="物料代号" prop="meterielCode" width="130">
-              <template slot-scope="{ row }">
+              <template slot-scope="{ row, $index }">
                 <el-input
+                  :ref="'materielCode' + $index"
+                  @keyup.native="
+                    moveFocus($event, $index, 'materielCode', '物料', row)
+                  "
                   v-model="row.materielCode"
                   v-if="!row.isPack"
                 ></el-input>
-                <span v-else>{{ row.materialCode }}</span>
+                <span v-else>{{ row.materielCode }}</span>
               </template>
             </el-table-column>
             <el-table-column label="客户代号" prop="clientCode">
-              <template slot-scope="{ row }">
+              <template slot-scope="{ row, $index }">
                 <el-input
+                  :ref="'clientCode' + $index"
+                  @keyup.native="
+                    moveFocus($event, $index, 'clientCode', '物料', row)
+                  "
                   v-model="row.clientCode"
                   v-if="!row.isPack"
                 ></el-input>
@@ -746,14 +805,25 @@
               </template>
             </el-table-column>
             <el-table-column label="刻码" prop="engrave">
-              <template slot-scope="{ row }">
-                <el-input v-model="row.engrave" v-if="!row.isPack"></el-input>
+              <template slot-scope="{ row, $index }">
+                <el-input
+                  v-model="row.engrave"
+                  :ref="'engrave' + $index"
+                  @keyup.native="
+                    moveFocus($event, $index, 'engrave', '物料', row)
+                  "
+                  v-if="!row.isPack"
+                ></el-input>
                 <span v-else> {{ row.engrave }}</span>
               </template>
             </el-table-column>
             <el-table-column width="100" label="重量" prop="weight">
-              <template slot-scope="{ row }">
+              <template slot-scope="{ row, $index }">
                 <el-input
+                  :ref="'weight' + $index"
+                  @keyup.native="
+                    moveFocus($event, $index, 'weight', '物料', row)
+                  "
                   v-model="row.weight"
                   v-if="!row.isPack && row.measuringUnit != row.weightUnit"
                 ></el-input>
@@ -943,6 +1013,167 @@
       this.initData();
     },
     methods: {
+      // 键盘移动
+      moveFocus(event, index, key, type, row) {
+        let keyfield = [];
+        let listLength = 0;
+        switch (type) {
+          case '产品':
+            listLength = this.warehousingMaterialList.length;
+            keyfield = [
+              'manualBatchNo',
+              'minPackingCount',
+              'outInNum',
+              'univalence'
+            ];
+            break;
+          case '包装':
+            listLength = this.materialCodeReqList.length;
+            if (row.measuringUnit != row.weightUtil) {
+              keyfield = [
+                'barcodes',
+                'materielCode',
+                'clientCode',
+                'engrave',
+                'weight'
+              ];
+            } else {
+              keyfield = ['barcodes', 'materielCode', 'clientCode', 'engrave'];
+            }
+            break;
+          case '物料':
+            listLength = this.resultArray.length;
+            if (row.measuringUnit != row.weightUnit) {
+              keyfield = ['materielCode', 'clientCode', 'engrave', 'weight'];
+            } else {
+              keyfield = ['materielCode', 'clientCode', 'engrave'];
+            }
+            break;
+        }
+
+        if (event.keyCode === 13) {
+          // 回车
+          if (
+            index === listLength - 1 &&
+            key === keyfield[keyfield.length - 1]
+          ) {
+            // 最后一行最后一个
+            return;
+          }
+
+          this.$refs[key + index].blur();
+          if (key === keyfield[keyfield.length - 1]) {
+            // 当前行最后一个,跳转下一行第一个
+            if (this.$refs[keyfield[0] + (index + 1)].value == 0) {
+              this.$refs[keyfield[0] + (index + 1)].value = '';
+            }
+            this.$refs[keyfield[0] + (index + 1)].focus();
+          } else {
+            // 跳转下一个
+            const nextkeyindex = keyfield.findIndex((k) => k === key) + 1;
+            this.$nextTick(() => {
+              if (this.$refs[keyfield[nextkeyindex] + index].value == 0) {
+                this.$refs[keyfield[nextkeyindex] + index].value = '';
+              }
+              this.$refs[keyfield[nextkeyindex] + index].focus();
+            });
+          }
+        }
+
+        // 向上 =38
+        if (event.keyCode === 38) {
+          console.log('向上');
+          if (index === 0) {
+            // 第一行
+            console.log('第一行无法向上');
+            return;
+          }
+          this.$refs[key + index].blur();
+          this.$nextTick(() => {
+            if (this.$refs[key + (index - 1)].value == 0) {
+              this.$refs[key + (index - 1)].value = '';
+            }
+            this.$refs[key + (index - 1)].focus();
+          });
+        }
+
+        // 下 = 40
+        if (event.keyCode === 40) {
+          console.log('向下');
+          if (index === listLength - 1) {
+            // 最后一行
+            console.log('最后一行无法向下');
+            return;
+          }
+          this.$refs[key + index].blur();
+          this.$nextTick(() => {
+            if (this.$refs[key + (index + 1)].value == 0) {
+              this.$refs[key + (index + 1)].value = '';
+            }
+            this.$refs[key + (index + 1)].focus();
+          });
+        }
+
+        // 左 = 37
+        if (event.keyCode === 37) {
+          console.log('向左');
+          if (index === 0 && key === keyfield[0]) {
+            // 第一行第一个
+            console.log('第一行第一个无法向左');
+            return;
+          }
+          this.$refs[key + index].blur();
+          if (key === keyfield[0]) {
+            if (
+              this.$refs[keyfield[keyfield.length - 1] + (index - 1)].value == 0
+            ) {
+              this.$refs[keyfield[keyfield.length - 1] + (index - 1)].value =
+                '';
+            }
+            // 当前行第一个,跳转上一行最后一个
+            this.$refs[keyfield[keyfield.length - 1] + (index - 1)].focus();
+          } else {
+            // 跳转上一个
+            const prevkeyindex = keyfield.findIndex((k) => k === key) - 1;
+            this.$nextTick(() => {
+              if (this.$refs[keyfield[prevkeyindex] + index].value == 0) {
+                this.$refs[keyfield[prevkeyindex] + index].value = '';
+              }
+              this.$refs[keyfield[prevkeyindex] + index].focus();
+            });
+          }
+        }
+
+        // 右 = 39
+        if (event.keyCode === 39) {
+          console.log('向右');
+          if (
+            index === listLength - 1 &&
+            key === keyfield[keyfield.length - 1]
+          ) {
+            // 最后一行最后一个
+            console.log('最后一行最后一个无法向左');
+            return;
+          }
+          this.$refs[key + index].blur();
+          if (key === keyfield[keyfield.length - 1]) {
+            // 当前行最后一个,跳转下一行第一个
+            if (this.$refs[keyfield[0] + (index + 1)].value == 0) {
+              this.$refs[keyfield[0] + (index + 1)].value = '';
+            }
+            this.$refs[keyfield[0] + (index + 1)].focus();
+          } else {
+            // 跳转下一个
+            const nextkeyindex = keyfield.findIndex((k) => k === key) + 1;
+            this.$nextTick(() => {
+              if (this.$refs[keyfield[nextkeyindex] + index].value == 0) {
+                this.$refs[keyfield[nextkeyindex] + index].value = '';
+              }
+              this.$refs[keyfield[nextkeyindex] + index].focus();
+            });
+          }
+        }
+      },
       // 包装维度最小包装单元改变——>总重量
       minPackingCountChange(row, value) {
         if (value >= 0) {

+ 1 - 1
src/views/bpm/outgoingManagement/components/AssetsDialog.vue

@@ -221,7 +221,7 @@
           ></el-table-column>
           <el-table-column
             v-if="dimension == 3 || dimension == 4"
-            prop="meterielCode"
+            prop="materielCode"
             label="物料代号"
             min-width="120"
           ></el-table-column>

+ 5 - 0
src/views/bpm/tickets/components/RepairDetailsDialog.vue

@@ -330,6 +330,7 @@
         <el-button
           class="confirm-btn"
           type="danger"
+          :loading="btnLoading"
           plain
           @click="surereject(5)"
           >驳回</el-button
@@ -337,6 +338,7 @@
         <el-button
           class="confirm-btn"
           type="success"
+          :loading="btnLoading"
           plain
           @click="surereject(4)"
           >验收</el-button
@@ -367,6 +369,7 @@
     components: { RepairNotesTab, WorkOrderTab },
     data() {
       return {
+        btnLoading: false,
         showBtn: false,
         equipmentdialog: false,
         detailsTabsActiveName: 'repairApplication',
@@ -536,6 +539,7 @@
         this.cause = '';
       },
       surereject(orderStatus) {
+        this.btnLoading = true;
         let params = {
           orderStatus,
           remark: this.cause,
@@ -547,6 +551,7 @@
               orderStatus == 4 ? '审核通过!' : '驳回成功!'
             );
             this.$emit('refesh');
+            this.btnLoading = false;
             this.equipmentdialog = false;
           }
         });

+ 21 - 35
src/views/bpm/tickets/components/WorkOrderTab.vue

@@ -61,31 +61,25 @@
       <el-step v-if="item.type == 'CREATE'">
         <span
           slot="icon"
-          :class="
-            lastStepName == 'CREATE' ? 'step_icon step_active' : 'step_icon'
-          "
+          :class="index == 0 ? 'step_icon step_active' : 'step_icon'"
         ></span>
         <div slot="title" class="step_title">
           <span>生成工单</span>
-          <span>{{ logs['CREATE'].createTime }}</span>
+          <span>{{ logs[item.id].createTime }}</span>
         </div>
         <div slot="description" class="create_workerOrder_desc">
-          <div> 报修人:{{ logs['CREATE'].requestUserName }} </div>
-          <div> 故障描述:{{ logs['CREATE'].remark }} </div>
+          <div> 报修人:{{ logs[item.id].requestUserName }} </div>
+          <div> 故障描述:{{ logs[item.id].remark }} </div>
         </div>
       </el-step>
       <el-step v-if="item.type == 'SPARE_PARTS_APPLY'">
         <span
           slot="icon"
-          :class="
-            lastStepName == 'SPARE_PARTS_APPLY'
-              ? 'step_icon step_active'
-              : 'step_icon'
-          "
+          :class="index == 0 ? 'step_icon step_active' : 'step_icon'"
         ></span>
         <div slot="title" class="step_title">
           <span>备品备件申请</span>
-          <span>{{ logs['SPARE_PARTS_APPLY'].createTime }}</span>
+          <span>{{ logs[item.id].createTime }}</span>
         </div>
         <div slot="description" class="work_report_desc">
           <!-- <div slot="description" class="step_description">
@@ -122,45 +116,36 @@
       <el-step v-if="item.type == 'ACCEPTANCE_CHEK'">
         <span
           slot="icon"
-          :class="
-            lastStepName == 'ACCEPTANCE_CHEK'
-              ? 'step_icon step_active'
-              : 'step_icon'
-          "
+          :class="index == 0 ? 'step_icon step_active' : 'step_icon'"
         ></span>
         <div slot="title" class="step_title">
           <span>验收</span>
-          <span>{{ logs['ACCEPTANCE_CHEK'].createTime }}</span>
+          <span>{{ logs[item.id].createTime }}</span>
         </div>
         <div slot="description" class="step_description">
-          <span>验收人:{{ logs['ACCEPTANCE_CHEK'].content.userName }}</span>
+          <span>验收人:{{ logs[item.id].content.userName }}</span>
           <span
             >验收结果:{{
-              logs['ACCEPTANCE_CHEK'].content.orderStatus == 4 ? '通过' : '驳回'
+              logs[item.id].content.orderStatus == 4 ? '通过' : '驳回'
             }}</span
           >
-          <span>验收说明:{{ logs['ACCEPTANCE_CHEK'].content.remark }}</span>
+          <span>验收说明:{{ logs[item.id].content.remark }}</span>
         </div>
       </el-step>
       <el-step v-if="item.type == 'WORK_REPORT'">
         <span
           slot="icon"
-          :class="
-            lastStepName == 'WORK_REPORT'
-              ? 'step_icon step_active'
-              : 'step_icon'
-          "
+          :class="index == 0 ? 'step_icon step_active' : 'step_icon'"
         ></span>
         <div slot="title" class="step_title">
           <span>报工</span>
-          <span>{{ logs['WORK_REPORT'].createTime }}</span>
+          <span>{{ logs[item.id].createTime }}</span>
         </div>
         <div slot="description" class="work_report_desc">
-          <div> 处理说明:{{ logs['WORK_REPORT'].content.reason }} </div>
+          <div> 处理说明:{{ logs[item.id].content.reason }} </div>
           <div class="work_report_imgs" style="width: 50px; height: 50px">
             <img
-              v-for="(item, index) in logs['WORK_REPORT'].content
-                .workOrderImgList"
+              v-for="(item, index) in logs[item.id].content.workOrderImgList"
               :key="index"
               :src="item"
               alt=""
@@ -529,18 +514,19 @@
         //   }
         // });
         val.forEach((item) => {
-          this.logs[item.type] = {
+          this.logs[item.id] = {
             id: item.id,
             content: item.content,
+            type: item.type,
             createTime: item.createTime,
             remark: item.remark,
             requestUserName: item.requestUserName
           };
           if (item.type === 'SPARE_PARTS_APPLY') {
-            this.logs[item.type].content.infoList =
-              this.logs[item.type].content.infoList &&
-              this.logs[item.type].content.infoList.length > 0
-                ? this.logs[item.type].content.infoList.map((item) => {
+            this.logs[item.id].content.infoList =
+              this.logs[item.id].content.infoList &&
+              this.logs[item.id].content.infoList.length > 0
+                ? this.logs[item.id].content.infoList.map((item) => {
                     return {
                       ...JSON.parse(item.sparePartsList),
                       sparePartsId: item.sparePartsId

+ 9 - 2
src/views/bpm/tickets/repair/index.vue

@@ -101,7 +101,13 @@
         <el-table-column prop="planFinishTime" label="计划完成时间" />
         <el-table-column prop="orderStatus" label="执行结果">
           <template slot-scope="{ row }">
-            {{ { 0: '缺陷', 1: '正常' }[row.isAbnormal] }}
+            {{
+              row.acceptanceStatus
+                ? resultStatus.filter(
+                    (item) => item.code == row.acceptanceStatus
+                  )[0].label
+                : ''
+            }}
           </template>
         </el-table-column>
         <el-table-column prop="orderStatus" label="状态">
@@ -190,7 +196,7 @@
 <script>
   import redeployOther from '../components/redeployOther.vue';
   import signingUpWork from '../components/signingUpWork.vue';
-  import { ticketStatus } from '@/utils/dict/tickets';
+  import { ticketStatus, resultStatus } from '@/utils/dict/tickets';
   import RepairDetailsDialog from '../components/RepairDetailsDialog.vue';
   import { getWorkOrderList, getRule } from '@/api/tickets';
   import pagenation from '@/components/Pagination';
@@ -203,6 +209,7 @@
     },
     data() {
       return {
+        resultStatus,
         ruleNameList: [],
         tableData: [],
         statusOptions: [],