Bladeren bron

1.评估一二三级校审页面添加项目详情信息按钮
2.评估添加归档超期功能(签发单完成后三天内必须归档,否则更改为超期未归档。并限制登记新的项目信息)
3.会计签字注师设置每个人最多选择100次限制
4.物资管理去除供应商联系方式必填验证
5.物资管理领用页面展示商品库存
6.待办数据量在页面top提醒处展示数量

user5 1 jaar geleden
bovenliggende
commit
57b4733f43

File diff suppressed because it is too large
+ 788 - 0
report.20221209.043233.10360.0.001.json


+ 0 - 1
src/api/auth/LoginService.js

@@ -8,7 +8,6 @@ export default class LoginService {
     })
   }
   login (data) {
-    console.log(data)
     return request({
       url: '/sys/login',
       method: 'post',

+ 6 - 0
src/api/program/ProgramProjectListInfoService.js

@@ -202,4 +202,10 @@ export default class ProgramProjectListInfoService {
       params: {programId: programId, auditLevel: auditLevel}
     })
   }
+  getOverArchiveFlag () {
+    return request({
+      url: '/program/projectList/getOverArchiveFlag',
+      method: 'get'
+    })
+  }
 }

+ 4 - 1
src/components/NoticeIcon/NoticeList.vue

@@ -15,6 +15,9 @@
                <el-button type="text" style="white-space: inherit;" v-if="item.type==='站内信'" @click="$refs.receivedMailDetail.init(item.id)">
                 <div class="description" style="height:30px" v-html="item.description"></div>
               </el-button>
+               <el-menu-item type="text" style="white-space: inherit;" v-if="item.type==='待办'">
+                <div class="description" style="height:30px" v-html="item.description"></div>
+              </el-menu-item>
               <div class="datetime">{{item.datetime}}</div>
             </div>
           </ep-list-item-meta>
@@ -25,7 +28,7 @@
             <div slot="description">
                <router-link :to="url">
                 <div class="description" style="text-align:center">查看更多</div>
-                </router-link>   
+                </router-link>
             </div>
           </ep-list-item-meta>
       </ep-list-item>

+ 0 - 1
src/router/index.js

@@ -56,7 +56,6 @@ const router = new Router({
 
   // 添加动态(菜单)路由
 router.beforeEach((to, from, next) => {
-  debugger
   let token = Vue.cookie.get('token')
   if (!token || !/\S/.test(token)) { // token为空,跳转到login登录
     clearLoginInfo()

+ 0 - 2
src/views/common/CasLogin.vue

@@ -14,8 +14,6 @@
       this.userService = new UserService()
     },
     mounted: function () {
-      debugger
-      console.log('进来了')
       // 在页面加载时添加退出事件监听器
       window.addEventListener('message', function (event) {
         console.log('2222')

+ 0 - 2
src/views/common/CasLogout.vue

@@ -13,8 +13,6 @@
       this.loginService = new LoginService()
     },
     mounted: function () {
-      debugger
-      console.log('进来了333')
       // 在页面加载时添加退出事件监听器
       // window.addEventListener('message', function (event) {
       //   console.log('444')

+ 87 - 36
src/views/layout/_common_top.vue

@@ -98,6 +98,7 @@
   import NotifyService from '@/api/notify/NotifyService'
   import MailBoxService from '@/api/mail/MailBoxService'
   import LoginService from '@/api/auth/LoginService'
+  import TaskService from '@/api/flowable/TaskService'
   export default {
     data () {
       return {
@@ -123,8 +124,17 @@
             ],
             emptyText: '你已读完所有消息',
             emptyImage: 'https://gw.alipayobjects.com/zos/rmsportal/sAuJeJzSKbUmHfBQRzmZ.svg'
+          },
+          {
+            title: '待办',
+            count: 0,
+            list: [
+            ],
+            emptyText: '你已查看所有待办',
+            emptyImage: 'https://gw.alipayobjects.com/zos/rmsportal/wAhyIChODzsoKIOBHcBk.svg'
           }
-        ]
+        ],
+        timer: null
       }
     },
     components: {
@@ -133,10 +143,12 @@
       NoticeIcon
     },
     notifyService: null,
+    taskService: null,
     mailBoxService: null,
     loginService: null,
     beforeCreate () {
       this.notifyService = new NotifyService()
+      this.taskService = new TaskService()
       this.mailBoxService = new MailBoxService()
       this.loginService = new LoginService()
     },
@@ -192,46 +204,24 @@
       }
     },
     created () {
-      this.allMenuList = JSON.parse(localStorage.getItem('allMenuList') || '[]')
-      if (this.defaultLayout === 'top') {
-        this.topMenuActiveIndex = this.allMenuList[0].id
-        this.showLeftMenu(this.allMenuList[0])
-      } else {
-        this.$store.commit('common/updateLeftMenuList', this.allMenuList)
-      }
-      this.notifyService.list({readFlag: 0, isSelf: true, current: 1, size: 10}).then(({data}) => {
-        this.noticeTabs[0].count = data.total
-        this.noticeTabs[0].url = '/notify/MyNotifyList'
-        this.noticeTabs[0].list = data.records.map((item) => {
-          return {
-            id: item.id,
-            avatar: item.createBy.photo,
-            title: item.title,
-            description: item.content,
-            datetime: item.createDate,
-            type: '通知'
-          }
-        })
-      })
-      this.mailBoxService.list({readStatus: 0, current: 1, size: 10}).then(({data}) => {
-        this.noticeTabs[1].count = data.total
-        this.noticeTabs[1].url = '/mailbox/index'
-        this.noticeTabs[1].list = data.records.map((item) => {
-          return {
-            id: item.id,
-            avatar: item.sender.photo,
-            title: item.mailDTO.title,
-            description: item.mailDTO.content,
-            datetime: item.sendtime,
-            type: '站内信'
-          }
-        })
-      })
+      this.refreshList()
     },
     mounted () {
       if (this.defaultLayout === 'top') {
         this.fixTopMenu()
       }
+      console.log('mounted')
+      // 页面加载后
+      // 1.在执行定时器前先执行一次获取接口数据的操作函数, 否则接口会1秒钟后才调用
+      // 2.为了避免退出当前页面后,在其他页面也继续调用接口,退出前需要清除定时器.
+      this.queryInfo()
+      this.timer = setInterval(() => {
+        setTimeout(this.queryInfo, 0)
+      }, 60000)
+    },
+    beforeDestroy () {
+      clearInterval(this.timer)
+      this.timer = null
     },
     watch: {
       topMenuActiveIndex (val) {
@@ -269,6 +259,67 @@
       }
     },
     methods: {
+      queryInfo () {
+        this.refreshList()
+      },
+      resetSearch () {
+        this.refreshList()
+      },
+      refreshList () {
+        this.allMenuList = JSON.parse(localStorage.getItem('allMenuList') || '[]')
+        if (this.defaultLayout === 'top') {
+          this.topMenuActiveIndex = this.allMenuList[0].id
+          this.showLeftMenu(this.allMenuList[0])
+        } else {
+          this.$store.commit('common/updateLeftMenuList', this.allMenuList)
+        }
+        this.notifyService.list({readFlag: 0, isSelf: true, current: 1, size: 10}).then(({data}) => {
+          console.log('通知')
+          this.noticeTabs[0].count = data.total
+          this.noticeTabs[0].url = '/notify/MyNotifyList'
+          this.noticeTabs[0].list = data.records.map((item) => {
+            return {
+              id: item.id,
+              avatar: item.createBy.photo,
+              title: item.title,
+              description: item.content,
+              datetime: item.createDate,
+              type: '通知'
+            }
+          })
+        })
+        this.mailBoxService.list({readStatus: 0, current: 1, size: 10}).then(({data}) => {
+          console.log('站内信')
+          this.noticeTabs[1].count = data.total
+          this.noticeTabs[1].url = '/mailbox/index'
+          this.noticeTabs[1].list = data.records.map((item) => {
+            return {
+              id: item.id,
+              avatar: item.sender.photo,
+              title: item.mailDTO.title,
+              description: item.mailDTO.content,
+              datetime: item.sendtime,
+              type: '站内信'
+            }
+          })
+        })
+        this.taskService.todoList({current: 1, size: 10}).then(({data}) => {
+          console.log('待办')
+          this.noticeTabs[2].count = data.total
+          this.noticeTabs[2].url = '/sys/dashboard/workBench/PendingList'
+          this.noticeTabs[2].list = data.records.map((item) => {
+            console.log(123456)
+            return {
+              id: item.id,
+              avatar: '',
+              title: item.vars.title,
+              description: item.processDefinitionName,
+              datetime: item.createTime,
+              type: '待办'
+            }
+          })
+        })
+      },
       fixTopMenu () {
         let width = window.getComputedStyle(this.$refs.navbar).width
         let size = (parseInt(width) - 800) / 124

+ 7 - 5
src/views/modules/cw/reportManagement/ReportManagementAddForm.vue

@@ -101,7 +101,7 @@
                             {required: true, message:'签字注师1不能为空', trigger:'change'}
                    ]">
               <!--                <el-input v-model="inputForm.signatureAnnotator1" placeholder="请填写签字注师1" clearable></el-input>-->
-              <UserSelect size="medium" ref="userSelect1" :disabled="status === 'audit' || status === 'taskFormDetail'" :readonly="true" :limit='1' :value="inputForm.signatureAnnotator1" @getValue='(value) => {changeSignatory1(value)}'></UserSelect>
+              <AccountantUserSelect size="medium" ref="userSelect1" :disabled="status === 'audit' || status === 'taskFormDetail'" :readonly="true" :limit='1' :value="inputForm.signatureAnnotator1" @getValue='(value) => {changeSignatory1(value)}'></AccountantUserSelect>
             </el-form-item>
           </el-col>
 
@@ -111,7 +111,7 @@
                             {required: true, message:'签字注师2不能为空', trigger:'change'}
                    ]">
               <!--                <el-input v-model="inputForm.signatureAnnotator2" placeholder="请填写签字注师2" clearable></el-input>-->
-              <UserSelect size="medium" ref="userSelect2" :disabled="status === 'audit' || status === 'taskFormDetail'" :readonly="true" :limit='1' :value="inputForm.signatureAnnotator2" @getValue='(value) => {changeSignatory2(value)}'></UserSelect>
+              <AccountantUserSelect size="medium" ref="userSelect2" :disabled="status === 'audit' || status === 'taskFormDetail'" :readonly="true" :limit='1' :value="inputForm.signatureAnnotator2" @getValue='(value) => {changeSignatory2(value)}'></AccountantUserSelect>
             </el-form-item>
           </el-col>
 
@@ -121,7 +121,7 @@
                               {required: true, message:'签字注师1不能为空', trigger:'blur'}
                    ]">
               <!--                <el-input v-model="inputForm.signatureAnnotator1" placeholder="请填写签字注师1" clearable></el-input>-->
-              <UserSelect size="medium" ref="userSelect1" :disabled="status === 'audit' || status === 'taskFormDetail'" :readonly="true" :limit='1' :value="inputForm.signatureAnnotator1" @getValue='(value) => {changeSignatory1(value)}'></UserSelect>
+              <AccountantUserSelect size="medium" ref="userSelect1" :disabled="status === 'audit' || status === 'taskFormDetail'" :readonly="true" :limit='1' :value="inputForm.signatureAnnotator1" @getValue='(value) => {changeSignatory1(value)}'></AccountantUserSelect>
             </el-form-item>
           </el-col>
 
@@ -131,7 +131,7 @@
                               {required: true, message:'签字注师2不能为空', trigger:'blur'}
                    ]">
               <!--                <el-input v-model="inputForm.signatureAnnotator2" placeholder="请填写签字注师2" clearable></el-input>-->
-              <UserSelect size="medium" ref="userSelect2" :disabled="status === 'audit' || status === 'taskFormDetail'" :readonly="true" :limit='1' :value="inputForm.signatureAnnotator2" @getValue='(value) => {changeSignatory2(value)}'></UserSelect>
+              <AccountantUserSelect size="medium" ref="userSelect2" :disabled="status === 'audit' || status === 'taskFormDetail'" :readonly="true" :limit='1' :value="inputForm.signatureAnnotator2" @getValue='(value) => {changeSignatory2(value)}'></AccountantUserSelect>
             </el-form-item>
           </el-col>
           <el-col :span="12">
@@ -531,6 +531,7 @@
   import SelectUserTree from '@/views/modules/utils/treeUserSelect'
   import SelectTree from '@/components/treeSelect/treeSelect.vue'
   import UserSelect from '../workClientInfo/clientUserSelect'
+  import AccountantUserSelect from '../workClientInfo/clientUserSelect/AccountantUserIndex'
   import UserSelectAll from '@/components/userSelect'
   import ProjectRecordsService from '@/api/cw/projectRecords/ProjectRecordsService'
   import ProjectReportService from '@/api/cw/reportManagement/ProjectReportService'
@@ -654,7 +655,8 @@
       UserSelect,
       ReportServiceUnitForm,
       ProjectRecoredChooseCom,
-      UserSelectAll
+      UserSelectAll,
+      AccountantUserSelect
     },
     methods: {
       getKeyWatch (keyWatch) {

+ 9 - 2
src/views/modules/cw/reportManagement/ReportManagementList.vue

@@ -14,7 +14,12 @@
       <el-form-item v-if="showHideItem" label="项目经理2" prop="realHeaderName">
         <UserSelect :limit='1' :userName="searchForm.realHeaderName" @getValue='(value, label) => {searchForm.realHeaderName = label}'></UserSelect>
       </el-form-item>
+
       <el-form-item v-if="showHideItem" label="创建人" prop="createBy">
+        <AllUserSelect :limit='1' :readonly="true" :userName="applyUserName" @getValue='(value, label) => {searchForm.createBy = value,applyUserName  = label}'></AllUserSelect>
+      </el-form-item>
+
+      <!--<el-form-item v-if="showHideItem" label="创建人" prop="createBy">
         <SelectUserTree
           ref="companyTree"
           :props="{
@@ -27,7 +32,7 @@
           :clearable="true"
           :accordion="true"
           @getValue="(value) => {searchForm.createBy=value}"/>
-      </el-form-item>
+      </el-form-item>-->
       <el-form-item v-if="showHideItem" label="报告文号" prop="reportNo">
         <el-input size="small" v-model="searchForm.reportNo" placeholder="请输入报告文号" clearable></el-input>
       </el-form-item>
@@ -264,6 +269,7 @@
   import SelectUserTree from '@/views/modules/utils/treeUserSelect'
   import ProjectRecordsService from '@/api/cw/projectRecords/ProjectRecordsService'
   import UserSelect from '@/views/modules/cw/workClientInfo/clientUserSelect'
+  import AllUserSelect from '@/components/userSelect'
   export default {
     data () {
       return {
@@ -329,7 +335,8 @@
       ReportManagementAddForm,
       SelectUserTree,
       InputNumber,
-      UserSelect
+      UserSelect,
+      AllUserSelect
     },
     computed: {
       userName () {

+ 108 - 0
src/views/modules/cw/workClientInfo/clientUserSelect/AccountantUserIndex.vue

@@ -0,0 +1,108 @@
+<template>
+<div>
+    <el-input placeholder="请选择" :size="size" :disabled="disabled"  :readonly="readonly" style="line-hight:40px" @change="changeName" v-model="name" class="input-with-select">
+      <el-button slot="append" :disabled="disabled"  :readonly="readonly" @click="showUserSelect" icon="el-icon-search"></el-button>
+    </el-input>
+    <user-select ref="userSelect" @doSubmit="selectUsersToInput" :limit="limit" :selectData="selectData"></user-select>
+</div>
+</template>
+<script>
+import userSelect from './AccountantUserSelectDialog'
+import UserService from '@/api/sys/UserService'
+export default {
+  data () {
+    return {
+      name: '',
+      labelValue: this.value,
+      selectData: []
+    }
+  },
+  props: {
+    limit: Number,
+    value: String,
+    userName: String,
+    size: {
+      type: String,
+      default: () => { return 'small' }
+    },
+    readonly: {
+      type: Boolean,
+      default: () => { return false }
+    },
+    disabled: {
+      type: Boolean,
+      default: () => { return false }
+    }
+  },
+  components: {
+    userSelect
+  },
+  userService: null,
+  beforeCreate () {
+    this.userService = new UserService()
+  },
+  watch: {
+    value: {
+      handler (newVal) {
+        this.selectData = []
+        if (newVal) {
+          newVal.split(',').forEach((id) => {
+            this.userService.queryById(id).then(({data}) => {
+              if (data && data.id !== '') {
+                this.selectData.push(data)
+              }
+            })
+          })
+        }
+      },
+      immediate: true,
+      deep: false
+    },
+    selectData: {
+      handler (newVal) {
+        this.name = newVal.map(user => { return user.name }).join(',')
+      },
+      immediate: false,
+      deep: false
+    },
+    userName: {
+      handler (newVal) {
+        this.name = newVal
+      },
+      immediate: false,
+      deep: false
+    }
+  },
+  methods: {
+    selectUsersToInput (users) {
+      this.selectData = users
+      this.labelValue = users.map(user => { return user.id }).join(',')
+      this.name = users.map(user => { return user.name }).join(',')
+      this.$emit('getValue', this.labelValue, this.name)
+    },
+    changeName () {
+      this.$emit('getValue', null, this.name)
+    },
+    showUserSelect () {
+      this.$refs.userSelect.init()
+    },
+    changeNameValue (name) {
+      this.name = name
+    },
+    clearSelectData () {
+      this.selectData = []
+    }
+  }
+}
+</script>
+<style>
+  .el-form-item__content .el-input-group {
+      vertical-align: middle;
+  }
+ .el-tag + .el-tag {
+    margin-left: 5px;
+    margin-bottom: 5px;
+  }
+</style>
+
+

+ 472 - 0
src/views/modules/cw/workClientInfo/clientUserSelect/AccountantUserSelectDialog.vue

@@ -0,0 +1,472 @@
+<template>
+  <div>
+    <el-dialog
+    title="用户选择"
+    width="1000px"
+    :close-on-click-modal="false"
+    :append-to-body="true"
+     v-dialogDrag
+     class="userDialog"
+    :visible.sync="visible">
+    <el-container style="height: 500px">
+      <el-aside width="200px">
+
+        <el-card class="org">
+          <div slot="header" class="clearfix">
+            <el-input
+              placeholder="请输入组织机构过滤"
+              size="small"
+              v-model="filterText">
+            </el-input>
+          </div>
+           <el-tree
+            :data="officeTreeData"
+            :props="{
+                  value: 'id',             // ID字段名
+                  label: 'name',         // 显示名称
+                  children: 'children'    // 子级字段名
+                }"
+            default-expand-all
+            highlight-current
+            node-key="id"
+            :render-content="renderContent"
+            :filter-node-method="filterNode"
+            :expand-on-click-node="false"
+            @node-click="handleNodeClick"
+            ref="officeTree">
+          </el-tree>
+        </el-card>
+      </el-aside>
+
+    <el-container>
+      <el-header style="text-align: left; font-size: 12px;height:30px">
+        <el-form size="small" :inline="true" ref="searchForm" :model="searchForm" @keyup.enter.native="refreshList()" @submit.native.prevent>
+            <el-form-item prop="loginName">
+              <el-input size="small" v-model="searchForm.loginName" placeholder="登录名" clearable></el-input>
+            </el-form-item>
+
+            <el-form-item>
+              <el-button  type="primary" @click="refreshList()" size="small" icon="el-icon-search">查询</el-button>
+              <el-button @click="resetSearch()" size="small" icon="el-icon-refresh-right">重置</el-button>
+            </el-form-item>
+          </el-form>
+      </el-header>
+
+      <el-main>
+        <el-table
+          :data="dataList"
+          v-loading="loading"
+          size="small"
+          border
+          ref="userTable"
+          @selection-change="selectionChangeHandle"
+          @sort-change="sortChangeHandle"
+          height="calc(100% - 40px)"
+          style="width: 100%;">
+          <el-table-column
+            header-align="center"
+            align="center"
+            v-if="limit <= 1"
+            width="50">
+              <template slot-scope="scope">
+                  <el-radio :label="scope.row.id" :value="dataListAllSelections[0]&&dataListAllSelections[0].id" @change.native="getTemplateRow(scope.$index,scope.row)"><span></span></el-radio>
+              </template>
+          </el-table-column>
+          <el-table-column
+            type="selection"
+            header-align="center"
+            v-if="limit > 1"
+            align="center"
+            width="50">
+          </el-table-column>
+          <el-table-column
+            prop="photo"
+            header-align="center"
+            align="center"
+            label="头像">
+            <template slot-scope="scope">
+              <img :src="scope.row.photo === ''?'/static/img/avatar.png':scope.row.photo" style="height:35px"/>
+            </template>
+          </el-table-column>
+          <el-table-column
+            prop="loginName"
+            header-align="center"
+            align="center"
+            sortable="custom"
+            min-width="90"
+            label="登录名">
+          </el-table-column>
+          <el-table-column
+            prop="name"
+            header-align="center"
+            align="真实姓名"
+            sortable="custom"
+            min-width="90"
+            label="用户名">
+          </el-table-column>
+          <el-table-column
+            prop="accountantUserCount"
+            header-align="center"
+            align="center"
+            sortable="custom"
+            min-width="110"
+            label="被选次数">
+
+            <!--用插槽的方法来改变颜色!-->
+            <template slot-scope="scope">
+              <div v-if="scope.row.accountantUserFlag === 0">
+                {{ scope.row.accountantUserCount }}
+              </div>
+              <div v-else :style="{ color: scope.row.accountantUserCount>100 ? 'red' : 'black' }">
+                {{ scope.row.accountantUserCount }}
+              </div>
+            </template>
+          </el-table-column>
+          <el-table-column
+            prop="companyDTO.name"
+            header-align="center"
+            align="center"
+            sortable="custom"
+            min-width="110"
+            label="所属机构">
+          </el-table-column>
+          <el-table-column
+            prop="officeDTO.name"
+            header-align="center"
+            align="center"
+            sortable="custom"
+            min-width="110"
+            label="所属部门">
+          </el-table-column>
+          <el-table-column
+            prop="loginFlag"
+            header-align="center"
+            align="center"
+            min-width="100"
+            label="状态">
+            <template slot-scope="scope">
+              <el-tag v-if="scope.row.loginFlag === '1'" size="small" type="success">正常</el-tag>
+              <el-tag v-else-if="scope.row.loginFlag === '0'" size="small" type="danger">禁用</el-tag>
+            </template>
+          </el-table-column>
+        </el-table>
+        <el-pagination
+          @size-change="sizeChangeHandle"
+          @current-change="currentChangeHandle"
+          :current-page="pageNo"
+          :page-sizes="[5, 10, 50, 100]"
+          :page-size="pageSize"
+          :total="total"
+          layout="total, sizes, prev, pager, next, jumper">
+        </el-pagination>
+      </el-main>
+    </el-container>
+
+    <el-aside width="200px">
+      <el-tag
+        :key="tag.id"
+        v-for="tag in dataListAllSelections"
+        closable
+        :disable-transitions="false"
+        @close="del(tag)">
+        {{tag.name}}
+      </el-tag>
+  </el-aside>
+</el-container>
+     <span slot="footer" class="dialog-footer">
+      <el-button size="small" @click="visible = false" icon="el-icon-circle-close">关闭</el-button>
+      <el-button size="small" type="primary" icon="el-icon-circle-check" @click="doSubmit()">确定</el-button>
+    </span>
+    </el-dialog>
+
+  </div>
+</template>
+
+<script>
+  export default {
+    data () {
+      return {
+        searchForm: {
+          loginName: '',
+          accountantUserCount: '',
+          accountantUserFlag: '',
+          companyDTO: {
+            id: ''
+          },
+          officeDTO: {
+            id: ''
+          },
+          name: ''
+        },
+        filterText: '',
+        dataListAllSelections: [],   // 所有选中的数据包含跨页数据
+        dataListSelections: [],
+        idKey: 'id', // 标识列表数据中每一行的唯一键的名称(需要按自己的数据改一下)
+        dataList: [],
+        dynamicTags: [],
+        officeTreeData: [],
+        pageNo: 1,
+        pageSize: 10,
+        total: 0,
+        orders: [],
+        loading: false,
+        visible: false
+      }
+    },
+    props: {
+      selectData: {
+        type: Array,
+        default: () => { return [] }
+      },
+      limit: {
+        type: Number,
+        default: 999999
+      }
+    },
+    watch: {
+      filterText (val) {
+        this.$refs.officeTree.filter(val)
+      }
+    },
+    methods: {
+      init () {
+        this.visible = true
+        this.$nextTick(() => {
+          this.dataListAllSelections = JSON.parse(JSON.stringify(this.selectData))
+          this.refreshTree()
+          this.resetSearch()
+        })
+      },
+      renderContent (h, { node, data, store }) {
+        return (
+              <span class="custom-tree-node">
+                {
+                  data.type === '1' ? <i class="fa fa-sitemap"></i> : <i class="fa fa-users"></i>
+                }
+                <span class="text">{node.label}</span>
+              </span>
+        )
+      },
+      getTemplateRow (index, row) {                                 // 获取选中数据
+        this.dataListSelections = [row]
+        this.$nextTick(() => {
+          this.changePageCoreRecordData()
+        })
+      },
+           // 设置选中的方法
+      setSelectRow () {
+        console.log('设置选中的方法')
+        if (!this.dataListAllSelections || this.dataListAllSelections.length <= 0) {
+          this.$refs.userTable.clearSelection()
+          return
+        }
+                // 标识当前行的唯一键的名称
+        let idKey = this.idKey
+        let selectAllIds = []
+        this.dataListAllSelections.forEach(row => {
+          selectAllIds.push(row[idKey])
+        })
+        this.$refs.userTable.clearSelection()
+        for (var i = 0; i < this.dataList.length; i++) {
+          if (selectAllIds.indexOf(this.dataList[i][idKey]) >= 0) {
+                        // 设置选中,记住table组件需要使用ref="table"
+            this.$refs.userTable.toggleRowSelection(this.dataList[i], true)
+          }
+        }
+      },
+            // 记忆选择核心方法
+      changePageCoreRecordData () {
+                // 标识当前行的唯一键的名称
+        let idKey = this.idKey
+        let that = this
+              // 如果总记忆中还没有选择的数据,那么就直接取当前页选中的数据,不需要后面一系列计算
+        if (this.dataListAllSelections.length <= 0) {
+          this.dataListSelections.forEach(row => {
+            that.dataListAllSelections.push(row)
+          })
+          return
+        }
+                // 总选择里面的key集合
+        let selectAllIds = []
+        this.dataListAllSelections.forEach(row => {
+          selectAllIds.push(row[idKey])
+        })
+        let selectIds = []
+                // 获取当前页选中的id
+        this.dataListSelections.forEach(row => {
+          selectIds.push(row[idKey])
+                  // 如果总选择里面不包含当前页选中的数据,那么就加入到总选择集合里
+          if (selectAllIds.indexOf(row[idKey]) < 0) {
+            that.dataListAllSelections.push(row)
+          }
+        })
+        let noSelectIds = []
+              // 得到当前页没有选中的id
+        this.dataList.forEach(row => {
+          if (selectIds.indexOf(row[idKey]) < 0) {
+            noSelectIds.push(row[idKey])
+          }
+        })
+        noSelectIds.forEach(id => {
+          if (selectAllIds.indexOf(id) >= 0) {
+            for (let i = 0; i < that.dataListAllSelections.length; i++) {
+              if (that.dataListAllSelections[i][idKey] === id) {
+                                // 如果总选择中有未被选中的,那么就删除这条
+                that.dataListAllSelections.splice(i, 1)
+                break
+              }
+            }
+          }
+        })
+      },
+     // 得到选中的所有数据
+      getAllSelectionData () {
+         // 再执行一次记忆勾选数据匹配,目的是为了在当前页操作勾选后直接获取选中数据
+        this.changePageCoreRecordData()
+      },
+      filterNode (value, data) {
+        if (!value) return true
+        return data.name.indexOf(value) !== -1
+      },
+      del (tag) {
+        this.dataListAllSelections.splice(this.dataListAllSelections.indexOf(tag), 1)
+        this.$nextTick(() => {
+          this.setSelectRow()
+        })
+      },
+      // 获取数据列表
+      refreshList () {
+        this.loading = true
+        this.searchForm.certType = '6'
+        if (this.commonJS.isEmpty(this.searchForm.officeDTO.id) && this.commonJS.isEmpty(this.searchForm.companyDTO.id)) {
+          this.searchForm.selectAll = 'true'
+        }
+        this.$http({
+          url: '/sys/user/list',
+          method: 'get',
+          params: {
+            'current': this.pageNo,
+            'size': this.pageSize,
+            'orders': this.orders,
+            ...this.searchForm
+          }
+        }).then(({data}) => {
+          this.dataList = data.records
+          this.total = data.total
+          this.pageNo = data.current
+          this.loading = false
+          this.$nextTick(() => {
+            this.setSelectRow()
+          })
+        })
+      },
+      refreshTree () {
+        this.$http({
+          url: `/sys/office/treeData`,
+          method: 'get'
+        }).then(({data}) => {
+          this.officeTreeData = data
+        })
+      },
+      // 每页数
+      sizeChangeHandle (val) {
+        this.pageSize = val
+        this.pageNo = 1
+        this.refreshList()
+        this.$nextTick(() => {
+          this.changePageCoreRecordData()
+        })
+      },
+      // 当前页
+      currentChangeHandle (val) {
+        this.pageNo = val
+        this.refreshList()
+        this.$nextTick(() => {
+          this.changePageCoreRecordData()
+        })
+      },
+      // 多选
+      selectionChangeHandle (val) {
+        this.dataListSelections = val
+        this.$nextTick(() => {
+          this.changePageCoreRecordData()
+        })
+      },
+       // 排序
+      sortChangeHandle (column) {
+        if (column.prop === 'officeDTO.name') {
+          column.prop = 'o.name'
+        }
+        if (column.prop === 'companyDTO.name') {
+          column.prop = 'c.name'
+        }
+        this.orders = []
+        if (column.order != null) {
+          this.orders.push({column: this.$utils.toLine(column.prop), asc: column.order === 'ascending'})
+        }
+        this.refreshList()
+      },
+      handleNodeClick (data) {
+        if (data.type === '1') {
+          this.searchForm.companyDTO.id = data.id
+          this.searchForm.officeDTO.id = ''
+        } else {
+          this.searchForm.companyDTO.id = ''
+          this.searchForm.officeDTO.id = data.id
+        }
+        this.refreshList()
+      },
+      resetSearch () {
+        this.searchForm.companyDTO.id = ''
+        this.searchForm.officeDTO.id = ''
+        this.$refs.officeTree.setCurrentKey(null)
+        this.$refs.searchForm.resetFields()
+        this.refreshList()
+      },
+      doSubmit () {
+        console.log('doSubmit')
+        if (this.dataListAllSelections.length === 0) {
+          this.$message.error(`请选择用户`)
+          return
+        }
+        if (this.limit < this.dataListAllSelections.length) {
+          this.$message.error(`你最多只能选择${this.limit}个用户`)
+          return
+        }
+        if (this.dataListAllSelections[0].accountantUserCount >= 100 && this.dataListAllSelections[0].accountantUserFlag === 1) {
+          this.$message.error(`请选择被选次数小于100次的签字注师人员`)
+          return
+        }
+        this.visible = false
+        this.$emit('doSubmit', this.dataListAllSelections)
+      }
+    }
+  }
+</script>
+<style lang="scss">
+.org {
+  height: 100%;
+  .el-card__header {
+    padding: 10px;
+  }
+  .el-card__body {
+    padding: 10px;
+    max-height: 520px;
+    overflow: auto;
+  }
+}
+.userDialog{
+  .el-dialog__body {
+    padding: 10px 0px 0px 10px;
+    color: #606266;
+    font-size: 14px;
+    word-break: break-all;
+  }
+  .el-main {
+    padding: 20px 20px 5px 20px;
+    .el-pagination{
+      margin-top: 5px;
+    }
+  }
+}
+</style>

+ 1 - 1
src/views/modules/flowable/task/UrgeForm.vue

@@ -4,7 +4,7 @@
     title="流程催办"
      v-dialogDrag
     :visible.sync="visible">
-    <el-form size="small" ref="inputForm" :model="inputForm"   v-loading="loading" @keyup.enter.native="inputFormSubmit()" label-width="120px" @submit.native.prevent> 
+    <el-form size="small" ref="inputForm" :model="inputForm"   v-loading="loading" @keyup.enter.native="inputFormSubmit()" label-width="120px" @submit.native.prevent>
        <el-form-item label="催办方式" prop="checkedUrgeTypes"  :rules="[
                   {required: true, message:'催办方式不能为空', trigger:'blur'}
                  ]">

+ 2 - 1
src/views/modules/materialManagement/collect/CollectForm.vue

@@ -106,7 +106,8 @@
               <el-input v-model="scope.row.collectNumber" @blur="scope.row.collectNumber = twoDecimalPlaces2(scope.row.collectNumber)" maxlength="10"></el-input>
             </template>
           </vxe-table-column>
-          <vxe-table-column v-if="this.status === 'audit'" field="surplusNumber" title="库存数量" :edit-render="{}">
+          <!--<vxe-table-column v-if="this.status === 'audit'" field="surplusNumber" title="库存数量" :edit-render="{}">-->
+          <vxe-table-column field="surplusNumber" title="库存数量" :edit-render="{}">
             <template v-slot:edit="scope">
               <el-input :disabled="true" v-model="scope.row.surplusNumber" maxlength="10"></el-input>
             </template>

+ 1 - 1
src/views/modules/materialManagement/collect/CollectReturnForm.vue

@@ -84,7 +84,7 @@
           <vxe-table-column field="collectType" title="领用类型" align="center"></vxe-table-column>
           <vxe-table-column field="goodsName" title="物品名称" align="center"></vxe-table-column>
           <vxe-table-column field="collectNumber" title="领用数量" align="center"></vxe-table-column>
-          <vxe-table-column v-if="status === 'audit'" field="surplusNumber" title="库存数量" align="center"></vxe-table-column>
+          <vxe-table-column field="surplusNumber" title="库存数量" align="center"></vxe-table-column>
           <vxe-table-column field="company" title="单位" align="center"></vxe-table-column>
           <vxe-table-column field="remarks" title="备注" align="center"></vxe-table-column>
           <vxe-table-column title="操作" width="170" align="center">

+ 1 - 1
src/views/modules/materialManagement/collect/CollectReturnHiForm.vue

@@ -93,7 +93,7 @@
           <vxe-table-column field="collectType" title="领用类型" align="center"></vxe-table-column>
           <vxe-table-column field="goodsName" title="物品名称" align="center"></vxe-table-column>
           <vxe-table-column field="collectNumber" title="领用数量" align="center"></vxe-table-column>
-          <vxe-table-column v-if="status === 'audit'" field="surplusNumber" title="库存数量" align="center"></vxe-table-column>
+          <vxe-table-column field="surplusNumber" title="库存数量" align="center"></vxe-table-column>
           <vxe-table-column field="company" title="单位" align="center"></vxe-table-column>
           <vxe-table-column field="remarks" title="备注" align="center"></vxe-table-column>
           <vxe-table-column title="操作" width="170" align="center">

+ 0 - 3
src/views/modules/materialManagement/supplier/SupplierForm.vue

@@ -277,9 +277,6 @@
         validRules: {
           name: [
             {required: true, message: '姓名不可以为空'}
-          ],
-          linkPhone: [
-            {required: true, message: '联系方式1不可以为空'}
           ]
         },
         gridData: [],

+ 4 - 4
src/views/modules/program/registered/ProjectArchiveForm.vue

@@ -336,7 +336,7 @@
             <el-col :span="12">
               <el-form-item label="报销外勤天数" prop="opsAmount"
                             :rules="[
-                        {required: true, message:'报销外勤天数不能为空', trigger:'blur'}
+
                  ]">
                 <el-input-number
                   v-model="inputForm.opsAmount"
@@ -355,7 +355,7 @@
             <el-col :span="12">
               <el-form-item label="已报销金额" prop="reimbursementAmount"
                             :rules="[
-                        {required: true, message:'已报销金额不能为空', trigger:'blur'}
+
                  ]">
                 <el-input-number
                   v-model="inputForm.reimbursementAmount"
@@ -374,7 +374,7 @@
             <el-col :span="12">
               <el-form-item label="未报销金额" prop="unreimbursedAmount"
                             :rules="[
-                        {required: true, message:'未报销金额不能为空', trigger:'blur'}
+
                  ]">
                 <el-input-number
                   v-model="inputForm.unreimbursedAmount"
@@ -776,7 +776,7 @@
         this.loading = true
         if (this.commonJS.isNotEmpty(this.inputForm.id)) {
           this.programProjectListInfoService.findByIdArchive(this.inputForm.id).then(({data}) => {
-            if (this.commonJS.isNotEmpty(data.status) && data.status !== '0' && data.status !== '1' && data.status !== '3') { // 审核状态不是“未发起”或“暂存”或“撤回”,就弹出提示
+            if (this.commonJS.isNotEmpty(data.status) && data.status !== '0' && data.status !== '1' && data.status !== '3' && data.status !== '6') { // 审核状态不是“未发起”或“暂存”或“撤回”,就弹出提示
               this.loading = false
               this.$message.error('任务数据已发生改变或不存在,请在待办任务中确认此任务是否存在')
               throw new Error('任务数据已发生改变或不存在,请在待办任务中确认此任务是否存在')

+ 6 - 0
src/views/modules/program/registered/ProjectForm.vue

@@ -849,6 +849,12 @@
     },
     methods: {
       init (method, id, auditId1, auditId2, auditId3, archiveId) {
+        console.log(method)
+        console.log(id)
+        console.log(auditId1)
+        console.log(auditId2)
+        console.log(auditId3)
+        console.log(archiveId)
         this.auditIdfirst = auditId1
         this.auditIdsecond = auditId2
         this.auditIdthird = auditId3

+ 11 - 4
src/views/modules/program/registered/ProjectList.vue

@@ -53,7 +53,7 @@
     <div class="bg-white top" style="">
       <vxe-toolbar :refresh="{query: refreshList}" export custom>
         <template #buttons>
-          <el-button v-if="hasPermission('program:registered:add')" type="primary" size="small" icon="el-icon-plus" @click="start()">新建</el-button>
+          <el-button v-if="hasPermission('program:registered:add') && overArchiveFlag === 0" type="primary" size="small" icon="el-icon-plus" @click="start()">新建</el-button>
           <el-button v-if="hasPermission('program:registered:del')" type="danger"   size="small" icon="el-icon-delete" @click="deleteAll()" :disabled="$refs.typeDictTable && $refs.typeDictTable.getCheckboxRecords().length === 0" plain>删除</el-button>
         </template>
       </vxe-toolbar>
@@ -133,7 +133,7 @@
           </vxe-column>
           <vxe-column min-width="120"align="center" title="项目归档" field="archiveStatus">
             <template slot-scope="scope">
-              <el-button  type="text" @click="archiveDetail(scope.row)" :type="$dictUtils.getDictLabel('program_project_list_info_status_info', scope.row.archiveStatus, '-')" effect="dark" size="mini">{{$dictUtils.getDictLabel("program_project_list_info_status", scope.row.archiveStatus, '-')}} </el-button>
+              <el-button  type="text" @click="archiveDetail(scope.row)" :type="$dictUtils.getDictLabel('program_project_list_info_status_info', scope.row.archiveStatus, '-')" effect="dark" size="mini">{{$dictUtils.getDictLabel("program_project_archive_list_info_status", scope.row.archiveStatus, '-')}} </el-button>
             </template>
           </vxe-column>
           <vxe-column title="操作" min-width="200px" fixed="right" align="center">
@@ -197,7 +197,7 @@
               <el-button v-if="hasPermission('program:registered:browse')&&(scope.row.createBy === createName||haveProjectIds.includes(scope.row.id))&&scope.row.issuedStatus === '5'&&scope.row.archiveStatus === '0'" type="text" size="small" @click="browse(scope.row.id)">装订自校</el-button>
 
               <!-- 项目归档-->
-              <el-button v-if="hasPermission('program:registered:edit')&&(scope.row.createBy === createName||haveProjectIds.includes(scope.row.id))&&scope.row.issuedStatus === '5' &&(scope.row.archiveStatus === '0'||scope.row.archiveStatus === '1'||scope.row.archiveStatus === '3')" type="text" size="small" @click="archivePush(scope.row)">项目归档</el-button>
+              <el-button v-if="hasPermission('program:registered:edit')&&(scope.row.createBy === createName||haveProjectIds.includes(scope.row.id))&&scope.row.issuedStatus === '5' &&(scope.row.archiveStatus === '0'||scope.row.archiveStatus === '1'||scope.row.archiveStatus === '3'||scope.row.archiveStatus === '6')" type="text" size="small" @click="archivePush(scope.row)">项目归档</el-button>
               <!-- 项目归档撤回-->
               <el-button v-if="hasPermission('program:registered:edit')&&(scope.row.createBy === createName||haveProjectIds.includes(scope.row.id))&&scope.row.archiveStatus === '2'" type="text" size="small" @click="archiveReback(scope.row)">项目归档撤回</el-button>
               <!-- 项目归档  审核-->
@@ -294,7 +294,8 @@
         procDefKeyArchive: '',
         processDefinitionId4: '',
         procDefKey4: '',
-        haveProjectIds: ''
+        haveProjectIds: '',
+        overArchiveFlag: ''
       }
     },
     programProjectListInfoService: null,
@@ -375,6 +376,12 @@
           this.tablePage.total = data.total
           this.loading = false
         })
+        // 获取当前人是否存在超期未归档项目数据信息
+        this.programProjectListInfoService.getOverArchiveFlag().then(({data}) => {
+          if (this.commonJS.isNotEmpty(data)) {
+            this.overArchiveFlag = data
+          }
+        })
         // 获取当前登录人的所属项目id集合
         this.programProjectListInfoService.getHaveProjectIds().then(({data}) => {
           if (this.commonJS.isNotEmpty(data)) {

+ 16 - 1
src/views/modules/program/registered/ProjectThreeAuditForm.vue

@@ -5,8 +5,15 @@
         <el-row type="flex" justify="end">
           <el-button @click="downloadFirstAuditTpl">下载</el-button>
         </el-row>
-        <el-divider content-position="left"><i class="el-icon-document"></i> 项目校审</el-divider>
       </div>
+      <el-divider content-position="left" v-if="commonJS.isEmpty(tabName) && (inputForm.auditLevel === '1' || inputForm.auditLevel === '2' || inputForm.auditLevel === '3')">
+        <el-link
+                  @click="viewProjectInfo(inputForm.programId)" type="primary" style="font-weight: bold;"><i class="el-icon-document"></i>
+          项目信息
+        </el-link>
+
+      </el-divider>
+      <el-divider content-position="left" v-else><i class="el-icon-document"></i> 项目校审</el-divider>
       <el-form size="middle" :model="inputForm" ref="inputForm" v-loading="loading" :class="method==='view'?'readonly':''"  :disabled="status === 'audit' || status === 'taskFormDetail'"
                label-width="125px" @submit.native.prevent>
           <el-row  :gutter="15">
@@ -67,6 +74,7 @@
                 <UserSelect size="medium" :disabled="status === 'audit' || status === 'taskFormDetail'" :readonly="true" :limit='1' :value="inputForm.auditPeople" @getValue='(value) => {inputForm.auditPeople = value}'></UserSelect>
               </el-form-item>
             </el-col>
+
           </el-row>
           <el-divider content-position="left">
             <i class="el-icon-document"></i> 审核意见及回复
@@ -134,6 +142,7 @@
 
     </div>
     <ProjectThreeAuditFormDialog ref="threeAuditDetail"></ProjectThreeAuditFormDialog>
+    <ProjectForm  ref="projectFormView"></ProjectForm>
   </div>
 </template>
 
@@ -183,6 +192,7 @@
           processDefinitionId: '',
           status: '',
           programProjectListInfo: {},
+          programReportNo: {},
           programAuditAssessPeopleDtoList: [],
           workAttachmentDtoList: [],
           auditPeopleList: ''
@@ -230,6 +240,7 @@
       }
     },
     components: {
+      ProjectForm: () => import('./ProjectForm'),
       UpLoadComponent,
       RosterSelectForm,
       UserSelect,
@@ -238,6 +249,10 @@
       ProjectThreeAuditFormDialog
     },
     methods: {
+      // 查看
+      viewProjectInfo (projectId) {
+        this.$refs.projectFormView.init('view', projectId, 'auditId1', 'auditId2', 'auditId3', 'archiveId')
+      },
       getKeyWatch (keyWatch) {
         this.keyWatch = keyWatch
       },