Kaynağa Gözat

Merge remote-tracking branch 'origin/V0.0.2' into V0.0.2

jingyuanchao 1 yıl önce
ebeveyn
işleme
917c9fc51c

+ 16 - 5
src/api/core/letter.js

@@ -9,9 +9,9 @@ export function listLetter(query) {
   })
 }
 
-export function auditListLetter(query) {
+export function getLetterApproveList(query) {
   return request({
-    url: '/core/letter/auditList',
+    url: '/core/letter/approve/list',
     method: 'get',
     params: query
   })
@@ -47,10 +47,10 @@ export function updateLetter(data) {
     data: data
   })
 }
-export function auditLetter(data) {
+export function approveLetter(data) {
   return request({
-    url: '/core/letter/auditLetter',
-    method: 'post',
+    url: '/core/letter/approve',
+    method: 'put',
     data: data
   })
 }
@@ -72,3 +72,14 @@ export function delLetter(id) {
     method: 'delete'
   })
 }
+
+
+
+// 出入记录详情
+export function outInRecordList(requestData) {
+  return request({
+    url: '/core/outinrecord/list',
+    method: 'get',
+    params: requestData
+  })
+}

+ 8 - 0
src/api/system/org.js

@@ -16,4 +16,12 @@ export function listByTypes (args){
         orgType
       }
     })
+  }
+
+  
+  export function deptTreeWithSameTypeUp (){  
+    return request({
+      url: '/system/dept/deptTree/depttreewithsametypeup',
+      method: 'get'
+    })
   }

+ 12 - 6
src/components/userSelector/index.vue

@@ -17,13 +17,14 @@
             @defaultKey="getDefaultKey"
             @checkChange="checkChange"
             @click="clickTreeNode"
+            :customRequest="customTreeRequest"
             :defuaultCheckSub="search.checkSub"
           ></org-tree>
         </el-col>
         <el-col :span="18" :xs="24">
           <g-search-table
             ref="searchTable"
-            url="/system/user/list"
+            url="/system/user/userselector/list"
             method="get"
             :search-data="search"
             :manual="true"
@@ -89,7 +90,7 @@
                 prop="orgName"
                 :show-overflow-tooltip="true"
               />
-              <el-table-column
+              <!-- <el-table-column
                 label="状态"
                 align="center"
                 key="isLock"
@@ -99,7 +100,7 @@
               <template slot-scope="scope">
                 {{ getLabel(dict.type.sys_user_is_lock,scope.row.isLock) }}
               </template>
-              </el-table-column>
+              </el-table-column> -->
             </template>
           </g-search-table>
         </el-col>
@@ -136,6 +137,10 @@ export default {
       type: Number,
       default: 0,
     },
+    
+    customTreeRequest:{
+      type:Function
+    }
   },
   methods: {
     getLabel,
@@ -168,7 +173,7 @@ export default {
     onSelect(item) {
       this.selectList = item;
     },
-    refresh(){
+    refresh(){      
         this.$nextTick(()=>{
             this.$refs.searchTable.refresh();
         })
@@ -184,7 +189,8 @@ export default {
     },
     getDefaultKey(key) {
         // debugger
-      this.search.orgId = key;      
+      this.search.orgId = key;   
+      this.refresh();   
     },
     //单选框状态改变
     checkChange(state) {
@@ -197,7 +203,7 @@ export default {
     },
     emptySearch() {
       return {
-        orgId: this.orgId,
+        orgId: null,
         checkSub: false,
         username: null,
         name: null,

+ 171 - 0
src/views/core/outIn/approve/dialog.approve.letter.detail.vue

@@ -0,0 +1,171 @@
+<template>
+    <DialogCom
+      :title="title"
+      @close="onHide"
+      :visible.sync="isShow"
+      width="1000px"
+    >
+      <div class="page-body">
+        <el-form
+          ref="form"
+          :model="formData"
+          label-width="120px"
+        >
+          <el-row>
+            <el-col :span="12">
+              <el-form-item label="出入类型">
+              <dict-tag :options="dict.type.out_in_type" :value="formData.type"/>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="出入事由">
+              {{formData.reasons}}
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item  label="申请时间">
+              {{formData.createTime}}
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="介绍信编号">
+              {{formData.letterNo}}
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item  label="出入有效期">
+                {{ formData.startTimeStr}}~{{formData.endTimeStr}}
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="接待机构" prop="receptionOrgIds">
+                {{formData.receptionOrgNames}}
+                <!-- <org-tree-select v-model="formData.receptionOrgIds" ref="orgTreeSelect">
+                </org-tree-select> -->
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <!-- <el-form-item label="介绍信" prop="letterNo">               
+              </el-form-item> -->
+              <el-form-item label="介绍信">
+                <K-file-upload ref="upload" :isShowUploadBtn="false"
+                                :defaultValue="formFileListDefualtValue"
+                                v-model="formData.letterFile"/>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="备注" prop="letterNo">
+                {{formData.description}}
+              </el-form-item>
+            </el-col>          
+          </el-row>
+
+          <el-row :gutter="10" class="mb8">
+            <el-col :span="24">
+              <el-form-item label="人员信息" prop="letterNo">
+                <el-table :data="formData.userInfos" height="300">
+                  <el-table-column label="人员姓名" width="150" align="center" prop="userName" />
+                  <el-table-column label="单位"  width="200" align="center" prop="companyName" />
+                  <el-table-column label="证件号码"  width="200" align="center" prop="idCard">
+                  </el-table-column>
+                  <el-table-column label="证件照"  align="center" prop="imgFile">
+                    <template slot-scope="scope">
+                      <ImageListPreview v-model="scope.row.imgFile"></ImageListPreview>
+                      <!-- <img width="50" height="50" :src="scope.row.imgFile" /> -->
+                    </template> 
+                  </el-table-column>            
+          </el-table>
+              </el-form-item>
+            </el-col>          
+          </el-row>          
+          <el-row>
+            <el-col :span="12">
+              <el-form-item label="审批">   
+                <dict-tag :options="dict.type.out_in_approve_status" :value="formData.approveLog.approveStatus"/> 
+                <!-- <el-radio v-model="formData.approveStatus" label="1">同意</el-radio>
+                <el-radio v-model="formData.approveStatus" label="2">不同意</el-radio>            -->
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="审批说明"> 
+               {{formData.approveLog.approveRemark}}
+              </el-form-item>
+            </el-col>
+          </el-row>
+        </el-form>
+      </div>
+      <div slot="footer" class="dialog-footer">
+        <!-- <el-button type="primary" @click="submitForm">确 定</el-button> -->
+        <el-button @click="onHide">关  闭</el-button>
+      </div>
+    </DialogCom>
+</template>
+<script>
+import { mapState, mapMutations } from "vuex";
+import {
+  getLetter,
+  approveLetter,
+} from "@/api/core/letter";
+import KFileUpload from "@/components/K-FileUpload/index.vue";
+import dayjs from "dayjs";
+import imgUpload from "@/components/ImageUpload";
+import DataRangePicker from "@/components/dateTime/daterange.picker.vue";
+export default {
+  components: { KFileUpload, imgUpload,DataRangePicker },
+  data() {
+    const params = this.$route.params;
+    return {
+      id: params ? params.id : null,
+      isShow: false,
+      title: "出入事项审批详情",
+      formData: this.reset(),      
+      formFileListDefualtValue: [],
+    };
+  },
+  dicts: ['out_in_type','out_in_approve_status'],
+  props: {},
+  watch: {},
+  created() {},
+  computed: {
+    ...mapState(["loginUser", "org"]),
+  },
+  methods: {
+    ...mapMutations([]),
+    reset(other = {}) {
+      return {
+        reasons: null,
+        letterNo:null,
+        receptionOrgIds: [],
+        range:[],
+        description: null,
+        letterFile: [],
+        userInfos: [],
+        type:null,
+        approveLog:{
+          approveStatus:null,
+          approveRemark:null
+        },
+        ...other,
+      };
+    },
+    async show(id) {     
+        this.title = "出入事项审批详情";   
+        this.isShow = true;
+        getLetter(id).then((response) => {
+          this.formData = response.data;
+          this.formFileListDefualtValue=this.formData.letterFile;
+        });     
+    },
+    onHide() {
+      this.isShow = false;
+      this.formData = this.reset();
+      // this.$refs["upload"].clearFiles();
+    },    
+  },
+  mounted() {},
+};
+</script>
+
+
+
+

+ 244 - 0
src/views/core/outIn/approve/dialog.approve.letter.vue

@@ -0,0 +1,244 @@
+<template>
+  <div class="edu-training-edit">
+    <DialogCom
+      :title="title"
+      @close="onHide"
+      :visible.sync="isShow"
+      width="1000px"
+    >
+      <div class="page-body">
+        <el-form
+          ref="form"
+          :model="formData"
+          :rules="formDataRules"
+          label-width="120px"
+        >
+          <el-row>
+            <el-col :span="12">
+              <el-form-item label="出入类型">
+              <dict-tag :options="dict.type.out_in_type" :value="formData.type"/>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="出入事由">
+              {{formData.reasons}}
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item  label="申请时间">
+              {{formData.createTime}}
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="介绍信编号">
+              {{formData.letterNo}}
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item  label="出入有效期">
+                {{ formData.startTimeStr}}~{{formData.endTimeStr}}
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="接待机构" prop="receptionOrgIds">
+                {{formData.receptionOrgNames}}
+                <!-- <org-tree-select v-model="formData.receptionOrgIds" ref="orgTreeSelect">
+                </org-tree-select> -->
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <!-- <el-form-item label="介绍信" prop="letterNo">               
+              </el-form-item> -->
+              <el-form-item label="介绍信">
+                <K-file-upload ref="upload" :isShowUploadBtn="false"
+                                :defaultValue="formFileListDefualtValue"
+                                v-model="formData.letterFile"/>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="备注" prop="letterNo">
+                {{formData.description}}
+              </el-form-item>
+            </el-col>          
+          </el-row>
+
+          <el-row :gutter="10" class="mb8">
+            <el-col :span="24">
+              <el-form-item label="人员信息" prop="letterNo">
+                <el-table :data="formData.userInfos" height="300">
+                  <el-table-column label="人员姓名" width="150" align="center" prop="userName" />
+                  <el-table-column label="单位" width="200" align="center" prop="companyName" />
+                  <el-table-column label="证件号码" width="200" align="center" prop="idCard">
+                  </el-table-column>
+                  <el-table-column label="证件照" align="center" prop="imgFile">
+                    <template slot-scope="scope">
+                      <ImageListPreview v-model="scope.row.imgFile"></ImageListPreview>
+                      <!-- <img width="50" height="50" :src="scope.row.imgFile" /> -->
+                    </template> </el-table-column>            
+          </el-table>
+              </el-form-item>
+            </el-col>          
+          </el-row>          
+          <el-row>
+            <el-col :span="12">
+              <el-form-item label="审批" prop="approveStatus">    
+                <el-radio v-model="formData.approveStatus" label="1">同意</el-radio>
+                <el-radio v-model="formData.approveStatus" label="2">不同意</el-radio>           
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="审批说明" prop="approveRemark"> 
+                <el-input
+                  v-model="formData.approveRemark"
+                  placeholder="请输入审批说明"
+                  maxlength="100"
+                />
+              </el-form-item>
+            </el-col>
+          </el-row>
+        </el-form>
+      </div>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="onHide">取 消</el-button>
+      </div>
+    </DialogCom>
+  </div>
+</template>
+<script>
+import { mapState, mapMutations } from "vuex";
+import {
+  getLetter,
+  approveLetter,
+} from "@/api/core/letter";
+import KFileUpload from "@/components/K-FileUpload/index.vue";
+import dayjs from "dayjs";
+import imgUpload from "@/components/ImageUpload";
+import DataRangePicker from "@/components/dateTime/daterange.picker.vue";
+export default {
+  components: { KFileUpload, imgUpload,DataRangePicker },
+  data() {
+    const params = this.$route.params;
+    return {
+      id: params ? params.id : null,
+      isShow: false,
+      title: "出入事项审批",
+      formData: this.reset(),
+      formDataRules: {
+        approveStatus: [{ required: true, message: "请勾选审批结果" }],        
+      },
+      formFileListDefualtValue: [],
+    };
+  },
+  dicts: ['out_in_type'],
+  props: {},
+  watch: {},
+  created() {},
+  computed: {
+    ...mapState(["loginUser", "org"]),
+  },
+  methods: {
+    ...mapMutations([]),
+    reset(other = {}) {
+      return {
+        reasons: null,
+        letterNo:null,
+        receptionOrgIds: [],
+        range:[],
+        description: null,
+        letterFile: [],
+        userInfos: [],
+        type:null,
+        approveRemark:null,
+        approveStatus:null,
+        ...other,
+      };
+    },
+    // checkApprove(rule,value,callback)
+    // {
+    //   console.log("checkApprove rule",rule);
+    //   console.log("checkApprove value",value);
+    //   console.log("checkApprove callback",callback);
+    // },
+    async show(id, other = {}) {     
+      if (id) {
+        this.title = "出入事项审批";   
+        this.isShow = true;
+        getLetter(id).then((response) => {
+          // let tempRange=[];
+          // tempRange.push(dayjs(response.data.startTime));
+          // tempRange.push(new Date(response.data.endTime));
+          // response.data.range=tempRange;
+          this.formData = response.data;
+          this.formFileListDefualtValue=this.formData.letterFile;
+        });        
+      }
+      else 
+      {
+        this.isShow = true;
+        this.title = "录入介绍信";
+        this.formData = this.reset();       
+      }
+    },
+    handleAddUser() {
+      this.open = true;
+    },
+    imageListChanged(list) {
+      this.userInfo.imgFile = list;
+    },
+    endDisabledDate(time) {
+      //小于开始日期禁止选择
+      let startDate = new Date();
+      startDate.setTime(startDate.getTime() - 3600 * 1000 * 24);
+      if (this.formData.trainingStartDateTime) {
+        startDate = new Date(
+          dayjs(this.formData.trainingStartDateTime).format("YYYY-MM-DD")
+        );
+        startDate.setTime(startDate.getTime() - 3600 * 1000 * 24);
+      }
+      return time.getTime() < new Date(startDate).getTime();
+    },
+    startDateChanged(time) {
+      if (
+        dayjs(this.formData.startTime).isAfter(dayjs(this.formData.endTime))
+      ) {
+        this.formData.endTime = this.formData.startTime;
+      }
+    },
+    endDateChanged(time) {
+      if (
+        dayjs(this.formData.startTime).isAfter(dayjs(this.formData.endTime))
+      ) {
+        this.formData.startTime = this.formData.endTime;
+      }
+    },
+    onHide() {
+      this.isShow = false;
+      this.formData = this.reset();
+      this.$refs["upload"].clearFiles();
+    },
+    
+    submitForm() {
+      this.$refs["form"].validate((valid) => {
+        if (valid) {         
+          let  {approveRemark,approveStatus,approveLog} = this.formData;
+          let tempRquest={approveRemark,approveStatus,id:approveLog.id};
+
+          console.log("================",tempRquest );          
+          approveLetter(tempRquest).then((response) => {
+              this.$modal.msgSuccess("提交成功");
+              this.isShow = false;
+              this.formData = this.reset();
+              this.$emit("success", this.formData);
+            });
+        }
+      });
+    },   
+  },
+  mounted() {},
+};
+</script>
+
+
+
+

+ 218 - 0
src/views/core/outIn/approve/index.vue

@@ -0,0 +1,218 @@
+<template>
+  <div class="app-container">
+    <div class="main-right-box">
+          <div class="main-search-box">
+    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="100px">
+      
+      <el-form-item label="出入事由" prop="reasons">
+        <el-input
+          v-model="queryParams.reasons"
+          placeholder="请输入关键字"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="出入类型" prop="type">
+        <el-select v-model="queryParams.type" placeholder="请选择出入类型" clearable>
+          <el-option
+            v-for="dict in dict.type.out_in_type"
+            :key="dict.value"
+            :label="dict.label"
+            :value="dict.value"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="审批状态" prop="approveStatus">
+        <el-select v-model="queryParams.approveStatus" placeholder="请选择审批状态" clearable>
+          <el-option
+            v-for="dict in dict.type.out_in_approve_status"
+            :key="dict.value"
+            :label="dict.label"
+            :value="dict.value"
+          />
+        </el-select>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+
+      <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+    </el-col>
+    <el-col :span="1.5">
+        <el-button type="primary" icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-col>
+      <!-- <el-col :span="1.5">
+        <el-button
+          type="primary"
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['core:letter:add']"
+        >录入介绍信</el-button>
+      </el-col> -->
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+          </div>
+    <el-table v-loading="loading" height="650" border :data="letterList">
+      <el-table-column label="序号"  align="center"  type="index" width="70" />
+      <el-table-column label="出入类型" header-align="center" align="left" prop="type"  width="150">
+        <template slot-scope="scope">
+              <dict-tag :options="dict.type.out_in_type" :value="scope.row.type"/>
+            </template>
+      </el-table-column>
+      <el-table-column label="出入事由" header-align="center" align="left" prop="reasons"/>
+      <el-table-column label="介绍信编号" align="center" prop="letterNo" width="120">       
+      </el-table-column>
+      <el-table-column label="介绍信" align="center" prop="letterNo" width="250">  
+        <template slot-scope="scope">
+        <template v-if="scope.row.letterFile">
+          <K-file-upload ref="upload" :isShowUploadBtn="false"
+                                         :defaultValue="scope.row.letterFile"
+                                         />
+              <!-- <el-tag style="cursor: pointer;margin-right: 5px;" v-for="(item, index) in scope.row.letterFile" size="mini" type="success" effect="plain" @click="downLoadFile(JSON.parse(item).url)" 
+                      :key="index">
+                {{ JSON.parse(item).name }}
+              </el-tag> -->
+            </template>     
+       </template>     
+      </el-table-column>
+      <el-table-column label="出入有效期" align="center" width="250">
+        <template slot-scope="scope">
+          <span>{{ scope.row.startTime}}~{{scope.row.endTime}}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="审批时间" width="150" header-align="center" align="left"  prop="approveTime" />
+      
+      <el-table-column label="审批状态" align="center" width="100" prop="approveStatus" >
+        <template slot-scope="scope">
+              <dict-tag :options="dict.type.out_in_approve_status" :value="scope.row.approveStatus"/>
+            </template>
+      </el-table-column>
+      <!-- <el-table-column label="备注" header-align="center" align="left" width="150" prop="description" /> -->
+      <el-table-column label="操作" header-align="center" align="left" width="180" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-view"
+            @click="handleDetailInfo(scope.row)"
+            v-hasPermi="['core:letter:edit']"
+          >详情</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-check"
+            v-if="canApprove(scope.row)"
+            @click="handleApproveLetter(scope.row)"
+            v-hasPermi="['core:letter:edit']"
+          >审批</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+    <dialog-approve-letter ref="dialogApproveLetter" @success="handleQuery(true)"></dialog-approve-letter>
+    <dialog-approve-letter-detail ref="dialogApproveLetterDetail" @success="handleQuery(true)"></dialog-approve-letter-detail>
+  </div>
+  </div>
+</template>
+
+<script>
+import {getLetterApproveList  } from "@/api/core/letter";
+import dialogApproveLetter from "./dialog.approve.letter";
+import DialogApproveLetterDetail from './dialog.approve.letter.detail.vue';
+import dayjs from 'dayjs';
+import KFileUpload from "@/components/K-FileUpload/index.vue";
+
+export default {
+  components: {dialogApproveLetter,DialogApproveLetterDetail,KFileUpload},
+  dicts: ['letter_status','out_in_type','out_in_approve_status'],
+  name: "Letter",
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 介绍信表格数据
+      letterList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        reasons: null,
+        type:null,
+        approveStatus: null,
+        orgId:this.$store.getters.orgId,
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+      }
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    dayjs,
+    /** 查询介绍信列表 */
+    getList() {
+      this.loading = true;
+      getLetterApproveList(this.queryParams).then(response => {
+        this.letterList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      // this.reset();
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },    
+    handleApproveLetter(row)
+    {
+      this.$refs["dialogApproveLetter"].show(row.id ,{});
+    },
+    canApprove(row)
+    {
+      // console.log("canApprove",row.status ==1,row.approveStatus ==0,dayjs(dayjs(row.endTime).add(1, 'day')).isAfter(dayjs(new Date())))
+      return row.status ==1 && row.approveStatus ==0 && dayjs(dayjs(row.endTime).add(1, 'day')).isAfter(dayjs(new Date()))
+    },
+    handleDetailInfo(row)
+    {
+      this.$refs["dialogApproveLetterDetail"].show(row.id);      
+    },    
+  }
+};
+</script>

+ 347 - 0
src/views/core/outIn/letter/dialog.addletter.vue

@@ -0,0 +1,347 @@
+<template>
+  <div class="edu-training-edit">
+    <DialogCom
+      :title="title"
+      @close="onHide"
+      :visible.sync="isShow"
+      width="1000px"
+    >
+      <div class="page-body">
+        <el-form
+          ref="form"
+          :model="formData"
+          :rules="formDataRules"
+          label-width="120px"
+        >
+          <el-row>
+            <el-col :span="12">
+              <el-form-item prop="reasons" label="出入事由">
+                <el-input
+                  v-model="formData.reasons"
+                  placeholder="请输入出入事由"
+                  :length="200"
+                />
+              </el-form-item>
+            </el-col>
+
+            <el-col :span="12">
+              <el-form-item label="接待机构" prop="receptionOrgIds">
+                <org-tree-select v-model="formData.receptionOrgIds" ref="orgTreeSelect">
+                </org-tree-select>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="介绍信编号" prop="letterNo">
+                <el-input
+                  v-model="formData.letterNo"
+                  placeholder="请输入介绍信编号"
+                  :length="200"
+                />
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item prop="range" label="介绍信有效期">
+                <DataRangePicker
+              v-model="formData.range"
+              key="daterange"
+              type="daterange"
+            />
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="上传介绍信" prop="letterFile">
+                <K-file-upload
+                  ref="upload"
+                  :defaultValue="formFileListDefualtValue"
+                  v-model="formData.letterFile"
+                />
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="备注" prop="description">
+                <el-input
+                  v-model="formData.description"
+                  placeholder="请输入备注"
+                  maxlength="100"
+                />
+              </el-form-item>
+            </el-col>
+          </el-row>
+
+          <el-row :gutter="10" class="mb8">
+            <el-col :span="1.5">
+              <el-button
+                type="primary"
+                plain
+                icon="el-icon-plus"
+                size="mini"
+                @click="handleAddUser"
+                >新增人员</el-button
+              >
+            </el-col>
+          </el-row>
+
+          <el-table :data="formData.userInfos">
+            <el-table-column label="人员姓名" align="center" prop="userName" />
+            <el-table-column label="单位" align="center" prop="companyName" />
+            <el-table-column label="证件号码" align="center" prop="idCard">
+            </el-table-column>
+            <el-table-column label="证件照" align="center" prop="imgFile">
+              <template slot-scope="scope">
+                <img width="50" height="50" :src="scope.row.imgFile" />
+              </template> </el-table-column
+            >
+            <el-table-column
+              label="操作"
+              align="center"
+              class-name="small-padding fixed-width"
+            >
+              <template slot-scope="scope">
+                <el-button size="mini" type="text" @click="editUser(scope.row)"
+                  >编辑</el-button
+                >
+                <el-button size="mini" type="text" @click="remove(scope.row)"
+                  >移除</el-button
+                >
+              </template>
+            </el-table-column>
+          </el-table>
+        </el-form>
+      </div>
+
+      <DialogCom
+        title="添加出入人员"
+        :visible.sync="open"
+        width="600px"
+        append-to-body
+        @close="onHideUser"
+      >
+        <el-form
+          ref="formUser"
+          :model="userInfo"
+          :rules="userInfoRules"
+          label-width="120px"
+        >
+          <el-form-item label="人员姓名" prop="userName">
+            <el-input v-model="userInfo.userName" placeholder="请输入姓名" />
+          </el-form-item>
+          <el-form-item label="单位" prop="companyName">
+            <el-input v-model="userInfo.companyName" placeholder="请输入单位" />
+          </el-form-item>
+          <el-form-item label="证件号码" prop="idCard">
+            <el-input v-model="userInfo.idCard" placeholder="请输入证件号码" />
+          </el-form-item>
+          <el-form-item prop="imgFile" label="上传证件照">
+            <!-- <ImageListPreview v-model="userInfo.imgFile"></ImageListPreview> -->
+            <imgUpload ref="uploadimage" type="more" :value="userInfo.imgFile"
+                           @input="imageListChanged"></imgUpload>
+          </el-form-item>
+        </el-form>
+        <div slot="footer" class="dialog-footer">
+          <el-button type="primary" @click="submitUser">确 定</el-button>
+          <el-button @click="onHideUser">取 消</el-button>
+        </div>
+      </DialogCom>
+
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="onHide">取 消</el-button>
+      </div>
+    </DialogCom>
+  </div>
+</template>
+<script>
+import { mapState, mapMutations } from "vuex";
+import {
+  listLetter,
+  getLetter,
+  delLetter,
+  addLetter,
+  updateLetter,
+} from "@/api/core/letter";
+import OrgTreeSelect from "@/components/orgTreeSelect";
+import KFileUpload from "@/components/K-FileUpload/index.vue";
+import dayjs from "dayjs";
+import imgUpload from "@/components/ImageUpload";
+import DataRangePicker from "@/components/dateTime/daterange.picker.vue";
+export default {
+  components: { OrgTreeSelect, KFileUpload, imgUpload,DataRangePicker },
+  data() {
+    const params = this.$route.params;
+    return {
+      id: params ? params.id : null,
+      isShow: false,
+      title: "录入介绍信",
+      formData: this.reset(),
+      formDataRules: {
+        reasons: [{ required: true, message: "请输入出入事由" }],
+        letterNo: [{ required: true, message: "请输入介绍信编号" }],
+        receptionOrgIds: [{ required: true, message: "请选择接待机构" }],
+        range: [{ required: true, message: "请选择介绍信有效期" }],      
+        userInfos: [{ required: true, message: "请添加出入人员" }],
+        letterFile:[{ required: true, message: "请上传介绍信" }],
+      },
+      userInfoRules: {
+        userName: [{ required: true, message: "请输入姓名" }],
+        companyName: [{ required: true, message: "请输入单位" }],
+        idCard: [{ required: true, message: "请输入证件号码" }],
+        imgFile: [{ required: true, message: "请上传证件照" }],
+      },
+      startDatepickerOptions: {
+        disabledDate: this.endDisabledDate,
+      },
+      endDatepickerOptions: {
+        disabledDate: this.endDisabledDate,
+      },
+      formFileListDefualtValue: [],
+      open: false,
+      userInfo: this.resetUserInfo(),
+      imageList: [],
+    };
+  },
+  dicts: ["letter_status"],
+  props: {},
+  watch: {},
+  created() {},
+  computed: {
+    ...mapState(["loginUser", "org"]),
+  },
+  methods: {
+    ...mapMutations([]),
+    reset(other = {}) {
+      return {
+        reasons: null,
+        letterNo:null,
+        receptionOrgIds: [],
+        range:[],
+        description: null,
+        letterFile: [],
+        userInfos: [],
+        type:1,
+        status:0,
+        ...other,
+      };
+    },
+    resetUserInfo() {
+      return {
+        userName: null,
+        companyName: null,
+        idCard: null,
+        imgFile: null,
+      };
+    },
+
+    async show(id, other = {}) {     
+      if (id) {
+        this.title = "修改介绍信";   
+        this.isShow = true;
+        getLetter(id).then((response) => {
+          let tempRange=[];
+          tempRange.push(dayjs(response.data.startTime));
+          tempRange.push(new Date(response.data.endTime));
+          response.data.range=tempRange;
+          this.formData = response.data;
+          this.formFileListDefualtValue=this.formData.letterFile;
+        });        
+      }
+      else 
+      {
+        this.isShow = true;
+        this.title = "录入介绍信";
+        this.formData = this.reset();       
+      }
+    },
+    handleAddUser() {
+      this.open = true;
+    },
+    imageListChanged(list) {
+      this.userInfo.imgFile = list;
+    },
+    endDisabledDate(time) {
+      //小于开始日期禁止选择
+      let startDate = new Date();
+      startDate.setTime(startDate.getTime() - 3600 * 1000 * 24);
+      if (this.formData.trainingStartDateTime) {
+        startDate = new Date(
+          dayjs(this.formData.trainingStartDateTime).format("YYYY-MM-DD")
+        );
+        startDate.setTime(startDate.getTime() - 3600 * 1000 * 24);
+      }
+      return time.getTime() < new Date(startDate).getTime();
+    },
+    startDateChanged(time) {
+      if (
+        dayjs(this.formData.startTime).isAfter(dayjs(this.formData.endTime))
+      ) {
+        this.formData.endTime = this.formData.startTime;
+      }
+    },
+    endDateChanged(time) {
+      if (
+        dayjs(this.formData.startTime).isAfter(dayjs(this.formData.endTime))
+      ) {
+        this.formData.startTime = this.formData.endTime;
+      }
+    },
+    onHide() {
+      this.isShow = false;
+      this.formData = this.reset();
+    },
+    onHideUser() {
+      this.open = false;
+      this.imageList = [];
+      this.userInfo = this.resetUserInfo();
+    },
+    submitUser() {
+      this.$refs["formUser"].validate((valid) => {
+        if (valid) {
+          this.open = false;
+          console.log("================", this.userInfo);
+          this.formData.userInfos.push(this.userInfo);
+          this.userInfo = this.resetUserInfo();
+          this.imageList = [];
+        }
+      });
+    },
+    submitForm() {
+      this.$refs["form"].validate((valid) => {
+        if (valid) {
+          if (this.formData.userInfos.length <= 0) {
+            this.$message.error("请添加人员");
+            return;
+          }
+          console.log("================", this.formData);
+          if (this.formData.id != null) {
+            updateLetter(this.formData).then((response) => {
+              this.$modal.msgSuccess("修改成功");
+              this.isShow = false;
+              this.formData = this.reset();
+              this.$emit("success", this.formData);
+            });
+          } else {
+            addLetter(this.formData).then((response) => {
+              this.$modal.msgSuccess("新增成功");
+              this.isShow = false;
+              this.formData = this.reset();
+              this.$emit("success", this.formData);
+            });
+          }
+        }
+      });
+    },
+    editUser(row) {
+      this.open = true;
+      this.userInfo = row;
+    },
+    remove(row) {
+      console.log("================", row);
+      this.formData.userInfos.splice(this.formData.userInfos.indexOf(row), 1);
+    },
+  },
+  mounted() {},
+};
+</script>
+
+
+
+

+ 251 - 0
src/views/core/outIn/letter/index.vue

@@ -0,0 +1,251 @@
+<template>
+  <div class="app-container">
+    <div class="main-right-box">
+          <div class="main-search-box">
+    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="100px">
+      <el-form-item label="介绍信编号" prop="letterNo">
+        <el-input
+          v-model="queryParams.letterNo"
+          placeholder="请输入关键字"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="出入事由" prop="reasons">
+        <el-input
+          v-model="queryParams.reasons"
+          placeholder="请输入关键字"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="状态" prop="status">
+        <el-select v-model="queryParams.status" placeholder="请选择状态" clearable>
+          <el-option
+            v-for="dict in dict.type.letter_status"
+            :key="dict.value"
+            :label="dict.label"
+            :value="dict.value"
+          />
+        </el-select>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+
+      <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+    </el-col>
+    <el-col :span="1.5">
+        <el-button type="primary" icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['core:letter:add']"
+        >录入介绍信</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+          </div>
+    <el-table v-loading="loading" height="650" border :data="letterList" @selection-change="handleSelectionChange">
+      <el-table-column label="出入事由" header-align="center" align="left" prop="reasons"  width="300"/>
+      <el-table-column label="介绍信编号" align="center" prop="letterNo" width="120">       
+      </el-table-column>
+      <el-table-column label="介绍信有效期" align="center" width="250">
+        <template slot-scope="scope">
+          <span>{{ scope.row.startTime}}~{{scope.row.endTime}}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="接待机构" header-align="center" align="left"  prop="receptionOrgNames" />
+      
+      <el-table-column label="状态" align="center" width="100" prop="status" >
+        <template slot-scope="scope">
+              <dict-tag :options="dict.type.letter_status" :value="scope.row.status"/>
+            </template>
+      </el-table-column>
+
+      <el-table-column label="备注" header-align="center" align="left" width="200" prop="description" />
+      <el-table-column label="操作" header-align="center" align="left" width="280" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-view"
+            @click="handleDetailInfo(scope.row)"
+            v-hasPermi="['core:letter:edit']"
+          >详情</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-check"
+            v-if="scope.row.status==0"
+            @click="handleUseLetter(scope.row)"
+            v-hasPermi="['core:letter:edit']"
+          >使用</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit-outline"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['core:letter:edit']"
+          >修改</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['core:letter:remove']"
+          >删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+    <dialog-add-letter ref="dialogAddLetter" @success="handleQuery(true)"></dialog-add-letter>
+  </div>
+  </div>
+</template>
+
+<script>
+import { listLetter, getLetter, delLetter, addLetter, updateLetter,updateLetterStatus } from "@/api/core/letter";
+import dialogAddLetter from "./dialog.addletter";
+
+export default {
+  components: {dialogAddLetter},
+  dicts: ['letter_status'],
+  name: "Letter",
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 介绍信表格数据
+      letterList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        letterNo:null,
+        reasons: null,
+        status: null,
+        requestFromWeb:true,
+        type:1,
+        orgId:this.$store.getters.orgId,
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+      }
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    /** 查询介绍信列表 */
+    getList() {
+      this.loading = true;
+      listLetter(this.queryParams).then(response => {
+        this.letterList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      // this.reset();
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.$refs["dialogAddLetter"].show(null,{});
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      // this.reset();
+      // const id = row.id || this.ids
+      this.$refs["dialogAddLetter"].show(row.id ,{});
+      
+    },
+    handleUseLetter(row)
+    {
+      updateLetterStatus({id:row.id,status:1}).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.getList();
+            });
+    },
+    handleDetailInfo(row)
+    {
+
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            updateLetter(this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.getList();
+            });
+          } else {
+            addLetter(this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除介绍信编号为"' + ids + '"的数据项?').then(function() {
+        return delLetter(ids);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("删除成功");
+      }).catch(() => {});
+    },
+  }
+};
+</script>

+ 329 - 0
src/views/core/outIn/outInLog/index.vue

@@ -0,0 +1,329 @@
+<template>
+  <div class="app-container">
+    <el-row :gutter="10">
+      <!--机构数据-->
+      <el-col :span="4" :xs="24">
+        <org-tree
+          v-model="queryParams.orgId"
+          @defaultKey="getDefaultKey"
+          @checkChange="checkChange"
+          @click="clickTreeNode"
+          :defaultCheckSub="true"
+        ></org-tree>
+      </el-col>
+      <!--搜索栏-->
+      <el-col :span="20" :xs="24">
+        <div class="main-right-box">
+          <div class="main-search-box">
+            <el-form
+              :model="queryParams"
+              ref="queryForm"
+              size="small"
+              :inline="true"
+              v-show="showSearch"
+            >
+              <!-- <el-form-item label="介绍信编号" prop="letterNo">
+                <el-input
+                  v-model="queryParams.letterNo"
+                  placeholder="请输入关键字"
+                  clearable
+                  @keyup.enter.native="handleQuery"
+                />
+              </el-form-item> -->
+              <el-form-item label="出入人员" prop="userName">
+                <el-input
+                  v-model="queryParams.userName"
+                  placeholder="请输入关键字"
+                  clearable
+                  @keyup.enter.native="handleQuery"
+                />
+              </el-form-item>
+              <el-form-item label="出入类型" prop="type">
+                <el-select v-model="queryParams.type" placeholder="请选择出入类型" clearable>
+                  <el-option
+                    v-for="dict in dict.type.out_in_type"
+                    :key="dict.value"
+                    :label="dict.label"
+                    :value="dict.value"
+                  />
+                </el-select>
+              </el-form-item>
+              <el-form-item class="searchTitle" prop="rangen" label="出入时间">
+                <DataRangePicker
+                  v-model="queryParams.range"
+                  key="daterange"
+                  type="daterange"
+                />
+              </el-form-item>
+            </el-form>
+
+            <el-row :gutter="10" class="mb8">
+              <el-col :span="1.5">
+                <el-button
+                  type="primary"
+                  icon="el-icon-search"
+                  size="mini"
+                  @click="handleQuery"
+                  >搜索</el-button
+                >
+              </el-col>
+              <el-col :span="1.5">
+                <el-button
+                  type="primary"
+                  icon="el-icon-refresh"
+                  size="mini"
+                  @click="resetQuery"
+                  >重置</el-button
+                >
+              </el-col>
+              <!-- <el-col :span="1.5">
+                <el-button
+                  type="primary"
+                  icon="el-icon-plus"
+                  size="mini"
+                  @click="handleAdd"
+                  v-hasPermi="['core:letter:add']"
+                  >录入介绍信</el-button
+                >
+              </el-col> -->
+              <right-toolbar
+                :showSearch.sync="showSearch"
+                @queryTable="getList"
+              ></right-toolbar>
+            </el-row>
+          </div>
+          <el-table
+            v-loading="loading"
+            height="650"
+            border
+            :data="outInRecrodList"
+            @selection-change="handleSelectionChange"
+          >
+          <el-table-column label="序号"  align="center"  type="index" width="70" />
+          <el-table-column label="出入人员" prop="userName"  align="center" width="100" />
+          <el-table-column label="证件号" prop="idCard"  align="center"  width="100" />
+          <el-table-column label="人员单位" prop="companyName"  align="center"  width="100" />
+          <el-table-column label="出入类型" header-align="center" align="left" prop="type"  width="150">
+            <template slot-scope="scope">
+              <dict-tag :options="dict.type.out_in_type" :value="scope.row.type"/>
+            </template>
+          </el-table-column>
+            <el-table-column 
+              label="出入事由"
+              header-align="center"
+              align="left"
+              prop="reasons"
+              width="100"
+            />
+            <el-table-column
+              label="出入机构"
+              header-align="center"
+              align="center"
+              prop="orgName"
+              width="120"
+            >
+            </el-table-column>
+            <el-table-column label="核验结果" width="250" align="center" prop="checkImage">
+                    <template slot-scope="scope">
+                      <ImageListPreview v-model="scope.row.imgFile"></ImageListPreview>
+                    </template> </el-table-column>  
+            <el-table-column label="介绍信" align="center" width="250">  
+              <template slot-scope="scope">
+              <template v-if="scope.row.letterFile">
+                <K-file-upload ref="upload" :isShowUploadBtn="false"
+                                              :defaultValue="scope.row.letterFile"
+                                              />
+                  </template>     
+          </template>     
+          </el-table-column>
+            <el-table-column label="出入时间" align="center" width="250">
+              <template slot-scope="scope">
+                <span>{{ scope.row.arrivalTime }}</span>
+                <span v-if="scope.row.departureTime">~{{ scope.row.departureTime }}</span>
+              </template>
+            </el-table-column>
+            
+            <el-table-column
+              label="操作"
+              header-align="center"
+              align="left"
+              width="100"
+              class-name="small-padding fixed-width"
+            >
+              <template slot-scope="scope">
+                <el-button
+                  size="mini"
+                  type="text"
+                  icon="el-icon-view"
+                  @click="handleDetailInfo(scope.row)"
+                  v-hasPermi="['core:letter:edit']"
+                  >详情</el-button
+                >                
+              </template>
+            </el-table-column>
+          </el-table>
+
+          <pagination
+            v-show="total > 0"
+            :total="total"
+            :page.sync="queryParams.pageNum"
+            :limit.sync="queryParams.pageSize"
+            @pagination="getList"
+          />
+
+          <!-- <dialog-add-letter ref="dialogAddLetter" @success="handleQuery(true)"></dialog-add-letter> -->
+        </div>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import {
+  outInRecordList
+} from "@/api/core/letter";
+import KFileUpload from "@/components/K-FileUpload/index.vue";
+import dayjs from "dayjs";
+import OrgTree from "@/components/orgTree";
+import DataRangePicker from "@/components/dateTime/daterange.picker.vue";
+export default {
+  components: {OrgTree,KFileUpload,DataRangePicker},
+  dicts: ["letter_status",'out_in_type'],
+  name: "outInLog",
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 出入记录数据
+      outInRecrodList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        checkSub:true,
+        userName: null,
+        type: null,
+        range:[],
+        orgId: this.$store.getters.orgId,
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {},
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    /** 查询介绍信列表 */
+    getList() {
+      this.loading = true;
+      outInRecordList(this.queryParams).then((response) => {
+        this.outInRecrodList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      // this.reset();
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map((item) => item.id);
+      this.single = selection.length !== 1;
+      this.multiple = !selection.length;
+    },
+    getDefaultKey(key) {
+      this.queryParams.orgId = key;
+      this.getList();
+    },
+    //单选框状态改变
+    checkChange(state) {
+      this.queryParams.checkSub = state;
+      this.handleQuery();
+    },
+    // 节点单击事件
+    clickTreeNode(data) {
+      // this.initPlanRoleList();
+      this.queryParams.orgId = data.id;
+      this.handleQuery();
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.$refs["dialogAddLetter"].show(null, {});
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      // this.reset();
+      // const id = row.id || this.ids
+      this.$refs["dialogAddLetter"].show(row.id, {});
+    },
+    handleUseLetter(row) {
+      updateLetterStatus({ id: row.id, status: 1 }).then((response) => {
+        this.$modal.msgSuccess("修改成功");
+        this.getList();
+      });
+    },
+    handleDetailInfo(row) {},
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate((valid) => {
+        if (valid) {
+          if (this.form.id != null) {
+            updateLetter(this.form).then((response) => {
+              this.$modal.msgSuccess("修改成功");
+              this.getList();
+            });
+          } else {
+            addLetter(this.form).then((response) => {
+              this.$modal.msgSuccess("新增成功");
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$modal
+        .confirm('是否确认删除介绍信编号为"' + ids + '"的数据项?')
+        .then(function () {
+          return delLetter(ids);
+        })
+        .then(() => {
+          this.getList();
+          this.$modal.msgSuccess("删除成功");
+        })
+        .catch(() => {});
+    },
+  },
+};
+</script>

+ 10 - 7
src/views/core/send/index.vue

@@ -76,7 +76,7 @@
         </div>
 
     <!-- 添加或修改【请填写功能名称】对话框 -->
-    <DialogCom :title="title" :visible.sync="open" width="500px" append-to-body>
+    <DialogCom :title="title" :visible.sync="open" width="500px" append-to-body @open="openHandler">
       <el-form ref="form" :model="form" :rules="rules" label-width="80px">
         <el-form-item label="标题" prop="title">
           <el-input v-model="form.title" maxlength="50" placeholder="请输入标题" clearable/>
@@ -91,12 +91,12 @@
           <el-input v-model="form.content" type="textarea" :rows="10" maxlength="2000" placeholder="输入内容" clearable/>
         </el-form-item>
 
-        <el-form-item label="发送目标" prop="sendUser">
-          <el-select mode="multiple" style="width: 100%;" v-model="form.sendUser" filterable placeholder="按用户选择" clearable>
+        <el-form-item label="发送目标" prop="sendUser" label-width="100px">
+          <el-select mode="multiple"  v-model="form.sendUser" filterable placeholder="按用户选择" clearable>
             <el-option v-for="item in userOptions" :key="item.id" :label="item.name" :value="item.id"></el-option>
           </el-select> 
 
-          <el-select mode="multiple" style="width: 100%;" v-model="form.sendRole" filterable placeholder="按角色选择" clearable>
+          <el-select mode="multiple"  v-model="form.sendRole" filterable placeholder="按角色选择" clearable>
             <el-option v-for="item in roleOptions" :key="item.id" :label="item.roleName" :value="item.id"></el-option>
           </el-select>
         </el-form-item>
@@ -107,8 +107,8 @@
             </el-radio>
           </el-radio-group>
         </el-form-item>
-        <el-form-item prop="sendTime" v-if="form.sendTimeType == 2" label="指定时间">
-          <el-date-picker style="width: 100%;" v-model="form.sendTime" @change="startDateChanged"
+        <el-form-item prop="sendTime" v-if="form.sendTimeType == 2" label="指定时间" label-width="100px">
+          <el-date-picker  v-model="form.sendTime" @change="startDateChanged"
             :picker-options="startDatepickerOptions" align="right" type="datetime" placeholder="选择指定时间">
           </el-date-picker>
         </el-form-item>
@@ -249,10 +249,13 @@ export default {
   },
   created() {
     this.getList();
-    this.getAllUser("");
+   
     this.getAllRole();
   },
   methods: {
+    openHandler(){
+      this.getAllUser("");
+    },
     /** 查询【请填写功能名称】列表 */
     getList() {
       this.loading = true;

+ 4 - 0
src/views/safetycheck/taskManager/components/register.vue

@@ -182,6 +182,7 @@
     <UserSelector
       ref="UserSelector"
       @select="onUserSelect"
+      :customTreeRequest="deptTreeWithSameTypeUp"
       :selectLimit="1"
     ></UserSelector>
   </div>
@@ -195,6 +196,7 @@ import imgUpload from "@/components/ImageUpload/index.vue";
 import UserSelector from "@/components/userSelector/index.vue";
 import { getLabel } from "@/views/commonOption.js";
 import { checkPermi } from "@/utils/permission.js";
+import {deptTreeWithSameTypeUp} from "@/api/system/org.js"
 export default {
   name: "safetyCheckRegister",
   data() {
@@ -233,6 +235,7 @@ export default {
       return (
         this.isRegister &&
         this.taskInfo.status != 3 &&
+        this.taskInfo.checkOrgId == this.orgId &&
         userRoleIds.find((ur) => taskRoleIds.includes(ur))
       );
     },
@@ -276,6 +279,7 @@ export default {
   methods: {
     dayjs,
     getLabel,
+    deptTreeWithSameTypeUp,
     onAddPoint() {
       this.pointIdsWhenAdd = [];
       this.taskInfo.checkList.forEach((a) => {