Переглянути джерело

云药专家的列表新增详情及其页面,新增领跑者相关页面

sy_inter 7 місяців тому
батько
коміт
0cbaccbf60

+ 8 - 0
src/api/authority/index.ts

@@ -107,3 +107,11 @@ export const expertChooseRelationList = (query?: any): AxiosPromise => {
         params: query
     });
 };
+// 查询专家人员被抽取记录
+export const expertChooseHistory = (query?: any): AxiosPromise => {
+    return request({
+        url: '/dgtmedicine/expertPersonRef/queryChooseInfoByPerson',
+        method: 'get',
+        params: query
+    });
+};

+ 33 - 0
src/api/leader/index.ts

@@ -0,0 +1,33 @@
+import request, { download, downloadFile } from '@/utils/request';
+import { AxiosPromise } from 'axios';
+// 查询企业标准申请列表
+export const DeclarationRecordList = (query?: any): AxiosPromise => {
+    return request({
+        url: '/dgtmedicine/cpyStandard/list',
+        method: 'get',
+        params: query
+    });
+};
+// 获取企业标准申请详细信息
+export const DeclarationDetail = (id: any): AxiosPromise => {
+    return request({
+        url: `/dgtmedicine/cpyStandard/getInfo/${id}`,
+        method: 'get'
+    });
+};
+// 企业标准审批
+export const DeclaraapprovalStandard = (data: any): AxiosPromise => {
+    return request({
+        url: `/dgtmedicine/cpyStandard/approvalStandard`,
+        method: 'Post',
+        data
+    });
+};
+// 企业标准审批统计
+export const queryDeclarationRecordCount = (query?: any): AxiosPromise => {
+    return request({
+        url: '/dgtmedicine/cpyStandard/cpyStandardCount',
+        method: 'get',
+        params: query
+    });
+};

+ 1 - 1
src/views/authority/choose-list/index.vue

@@ -140,7 +140,7 @@ const resetQuery = () => {
 };
 
 /** 编辑事项 */
-const editRow = (row) => {
+const editRow = (row) => { 
     router.push({ path: 'choose-detail', query: { id: row.id } });
 };
 // 获取专家统计数量

+ 75 - 0
src/views/authority/exportdetail/index.vue

@@ -0,0 +1,75 @@
+<template>
+    <div class="p-3">
+        <div class="bg-fff flex1 ov-hd d-flex flex-cln">
+            <div class="d-flex a-c pd-16">
+                <div class="f-s-20 c-333 f-w-7 mr-10">订单详情</div>
+                <el-button @click="router.go(-1)" type="primary" text>
+                    <el-icon>
+                        <Back />
+                    </el-icon>
+                    返回上一级
+                </el-button>
+            </div>
+            <div class="border-botttom pl-20">
+                <div class="d-flex">
+                    <template v-for="(item, index) in tabs" :key="index">
+                        <div class="tabs-item" @click="() => { activeName = item.value }" :class="{ checked: activeName === item.value }">{{ item.label }}</div>
+                    </template>
+                </div>
+            </div>
+            <template v-if="orderItem">
+                <div v-show="activeName === '1'" class="flex1 ov-hd d-flex flex-cln">
+                    <ExpertInfo :info="orderItem" />
+                </div>
+                <div v-show="activeName === '2'" class="flex1 over-auto">
+                    <ExtractedRecord />
+                </div>
+            </template>
+        </div>
+    </div>
+</template>
+<script setup name="authority-exportdetail" lang="ts">
+import { expertPersonDetail } from '@/api/authority/index';
+import ExpertInfo from '../models/ExpertInfo.vue'
+import ExtractedRecord from '../models/ExtractedRecord.vue'
+const { query }:any = useRoute()
+const router = useRouter();
+const activeName = ref('1');
+// 获取详细信息
+const orderItem = ref<any>(null);
+const orderHistoryItem =ref<any>(null);
+const getDetail = async () => {
+    const res = await expertPersonDetail(query?.id);
+    if (!res || res.code !== 200) return;
+    orderItem.value = res.data;
+};
+
+const tabs = ref([
+    { label: '专家信息', value: '1' },
+    { label: '被抽取记录', value: '2' },
+])
+onMounted(() => {
+    getDetail()
+});
+</script>
+<style lang="scss" scoped>
+.tabs-item {
+   margin-right: 20px;
+   padding: 8px 20px;
+   font-size: 14px;
+   border-color:  #d7d7d7;
+   border-style: solid;
+   border-width: 1px 1px 0 1px;
+   cursor: pointer;
+   user-select: none;
+
+   &.checked {
+    color: #fff;
+    border-color: var(--el-color-primary);
+    background-color: var(--el-color-primary);
+   }
+}
+.border-botttom {
+    border-bottom: 1px solid #d7d7d7;
+}
+</style>

+ 8 - 5
src/views/authority/info/index.vue

@@ -70,10 +70,11 @@
                                 <el-switch v-model="row.putawayFlag" active-value="1" inactive-value="0" @change="changeRowPutaway($event, row)"></el-switch>
                             </template>
                         </vxe-column>
-                        <vxe-column title="操作" width="160" align="center" fixed="right">
+                        <vxe-column title="操作" width="210" align="center" fixed="right">
                             <template #default="{ row }">
-                                <el-button type="primary" @click="editRow(row)" text>编辑</el-button>
-                                <el-button text type="danger" @click="deleteRow(row)">删除</el-button>
+                                <el-button type="primary" @click="editRow(row)" text style="width: 40px">编辑</el-button>
+                                <el-button type="primary" @click="gotodetailsPage(row)" text style="width: 40px">详情</el-button>
+                                <el-button text type="danger" @click="deleteRow(row)" style="width: 40px">删除</el-button>
                             </template>
                         </vxe-column>
                     </vxe-table>
@@ -86,7 +87,6 @@
 
 <script setup name="authority-info" lang="ts">
 import { colNoData } from '@/utils/noData';
-
 import { DateRange } from '@/views/models/index';
 import { searchTabs } from '@/views/models';
 import { expertList, expertPersonCount, expertPersonDelete, expertPersonOff, expertPersonOn } from '@/api/authority';
@@ -149,7 +149,10 @@ const resetQuery = () => {
 const editRow = (row) => {
     router.push({ path: 'authority-input', query: { id: row.id } });
 };
-
+/** 详情页面 */
+const gotodetailsPage =(row)=>{
+    router.push({ path: 'exportdetail', query: { id: row.id } });
+}
 /** 删除专家 */
 const deleteRow = async (row) => {
     ElMessageBox.confirm(`确认要删除专家为"${row.name}"的数据吗?`, '删除提示', {

+ 2 - 0
src/views/authority/models/ChooseExpertCheck.vue

@@ -70,6 +70,8 @@ const list = ref<any[]>(props.info?.personInfo.map(item => {
         personInfos: item.personInfos || [],
     };
 }) || []);
+console.log(list,'list');
+
 const rowInfo = ref<any>(null);
 const addPerson = (row: any) => {
     rowInfo.value = row;

+ 129 - 0
src/views/authority/models/ExpertInfo.vue

@@ -0,0 +1,129 @@
+<template>
+    <div class="pl-30 pt-30 pb-30">
+        <div class="info-out">
+            <img src="https://fileserver.yujin.shuziyunyao.com/oss-file/smart-trace/2025/06/19/69b2b57f30bf4174983632ec7cf962de.png" alt="" class="av-img" />
+            <div class="info">
+                <div>{{ props.info?.name }}</div>
+                <div>
+                    <span v-for="(item, index) in props.info?.personType.length" :key="index">{{ selectDictLabel(dm_person_type, item) }}</span>
+                </div>
+                <div>专业品种:{{ props.info?.variety }}</div>
+                <div>工作单位:{{ props.info?.workUnit }}</div>
+                <div>技术职称/职务:{{ props.info?.post }}</div>
+            </div>
+        </div>
+        <div class="flex-container">
+            <el-descriptions :column="4">
+                <el-descriptions-item label="性别:">{{ selectDictLabel(sys_sex_type, props.info?.sex) || '-' }}</el-descriptions-item>
+                <el-descriptions-item label="民族:">{{ props.info?.nation }}</el-descriptions-item>
+                <el-descriptions-item label="身份证号:">{{ props.info?.idCard }}</el-descriptions-item>
+                <el-descriptions-item label="政治面貌:">{{ props.info?.politicalStatus }}</el-descriptions-item>
+                <el-descriptions-item label="最高学历:">{{ selectDictLabel(dm_educational_type,props.info?.educationalBg )|| '-' }}</el-descriptions-item>
+                <el-descriptions-item label="所学专业:">{{ props.info?.major }}</el-descriptions-item>
+                <el-descriptions-item label="从事专业:">{{ props.info?.job }}</el-descriptions-item>
+                <el-descriptions-item label="通讯地址:">{{ props.info?.address }}</el-descriptions-item>
+                <el-descriptions-item label="联系电话:">{{ props.info?.phone }}</el-descriptions-item>
+                <el-descriptions-item label="传真电话:">{{ props.info?.faxPhone }}</el-descriptions-item>
+                <el-descriptions-item label="邮箱:">{{ props.info?.email }}</el-descriptions-item>
+                <el-descriptions-item label="微信号:">{{ props.info?.wxNum }}</el-descriptions-item>
+                <el-descriptions-item label="岗位状态:">{{ selectDictLabel(dm_position_status,props.info?.status) || '-' }}</el-descriptions-item>
+                <el-descriptions-item label="创建人:">{{ props.info?.createByName }}</el-descriptions-item>
+                <el-descriptions-item label="创建时间:">{{ props.info?.createTime }}</el-descriptions-item>
+            </el-descriptions>
+        </div>
+        <div class="jianjie">
+            <div v-html="props.info?.brief"></div>
+        </div>
+
+        <div class="pt-30">
+            <div v-if="props.info?.attachments" class="flex1 pt-20">
+                <div class="c-333 mb-10">附件:</div>
+                <FileLook v-model="props.info.attachments" :span="6"></FileLook>
+            </div>
+        </div>
+    </div>
+</template>
+<script setup name="ExpertInfo" lang="ts">
+import {ref} from 'vue'
+import { FileLook } from '@/views/models';
+const { proxy } = getCurrentInstance() as ComponentInternalInstance;
+const dict = proxy?.useDict('dm_person_type',  'sys_sex_type', 'dm_position_status','dm_educational_type');
+const { dm_person_type,  sys_sex_type,dm_position_status,dm_educational_type } = toRefs<any>(dict);
+const props = defineProps({
+  info: {
+    type: Object, // 指定类型
+    required: true, // 是否必传
+    default: () => ({}) // 默认值
+  }
+})
+const formatBytes = (bytes, decimals = 2)=> {
+  if (bytes === 0) return '0 Bytes';
+  const k = 1024;
+  const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];
+  const i = Math.floor(Math.log(bytes) / Math.log(k));
+
+  // Handle Bytes case separately to avoid decimals
+  if (i === 0) return `${bytes} ${sizes[i]}`;
+
+  return `${parseFloat((bytes / Math.pow(k, i)).toFixed(decimals))} ${sizes[i]}`;
+}
+</script>
+<style scoped>
+.av-img{
+    height: 150px;
+    width: 150px;
+}
+.info-out{
+    display: flex;
+    margin-bottom: 30px;
+}
+.info{
+    display: flex;
+    flex-direction: column;
+    justify-content: space-between;
+
+}
+.info span{
+    border-style: solid;
+    border-width: 1px;
+    border-color: var(--el-color-primary);
+    border-radius: 4px;
+    margin-right: 10px;
+    color: var(--el-color-primary);
+    padding: 3px;
+    background-color: #59a6f645;
+}
+.jianjie{
+    /* border: 1px solid; */
+}
+.jianjie-fist{
+ background-color: aliceblue;
+ height: 30px;
+ padding: 4px;
+ border-bottom: 1px solid;
+}
+.fujian{
+    border: 1px solid aliceblue;
+    width: 400px;
+    height: 70px;
+    display: flex;
+    font-size: 12px;
+    justify-content: space-between;
+    cursor: pointer;
+}
+.file{
+    display: flex;
+    align-items: stretch;
+    flex-direction: column;
+    justify-content: space-around;
+}
+.down{
+    background-color: var(--el-color-primary);
+    width: 50px;
+    display: flex;
+    align-items: center;
+    flex-direction: column;
+    justify-content: center;
+    cursor: pointer;
+}
+</style>

+ 63 - 0
src/views/authority/models/ExtractedRecord.vue

@@ -0,0 +1,63 @@
+<template>
+    <div style="height: 100%" class="d-flex flex1 ov-hd flex-cln pd-16">
+        <vxe-table :loading="loading" border :data="orderHistoryItem" min-height="0" max-height="100%">
+            <vxe-column title="序号" align="center" type="seq" width="50" />
+            <vxe-column title="发起方" field="starter" :formatter="colNoData" />
+            <vxe-column title="事项名称" field="title" :formatter="colNoData" />
+            <vxe-column title="时间">
+                <template #default="{ row }">
+                    <span>{{ row.startTime }} 至 {{ row.endTime }}</span>
+                </template>
+            </vxe-column>
+            <vxe-column title="参与方式" width="80">
+                <template #default="{ row }">
+                    <DictTag :options="dm_join_type" :value="row?.joinType"></DictTag>
+                </template>
+            </vxe-column>
+            <vxe-column title="联系人" width="80" field="contact" :formatter="colNoData" />
+            <vxe-column title="联系电话" width="110" field="tel" :formatter="colNoData" />
+            <vxe-column title="事项状态" width="100">
+                <template #default="{ row }">
+                    <DictTag :options="dm_expert_item_list" :value="row?.res"></DictTag>
+                </template>
+            </vxe-column>
+            <vxe-column title="操作" width="100" align="center" fixed="right">
+                <template #default="{ row }">
+                    <el-button @click="editRow(row)" text>详情</el-button>
+                </template>
+            </vxe-column>
+        </vxe-table>
+    </div>
+</template>
+<script setup name="ExtractedRecord" lang="ts">
+import { colNoData } from '@/utils/noData';
+import {ref,onMounted} from 'vue'
+import {expertChooseHistory } from '@/api/authority/index';
+const { proxy } = getCurrentInstance() as ComponentInternalInstance;
+const dict = proxy?.useDict('dm_join_type', 'yes_no', 'sys_sex_type', 'dm_position_status','dm_educational_type',"dm_expert_item_list");
+const {  dm_join_type, yes_no, sys_sex_type,dm_position_status,dm_educational_type,dm_expert_item_list } = toRefs<any>(dict);
+const { query }:any = useRoute()
+const props = defineProps({
+  info: {
+    type: String, // 指定类型
+    required: true, // 是否必传
+    default: () => ({}) // 默认值
+  }
+})
+const router = useRouter();
+const loading = ref(true);
+const orderHistoryItem =ref<any>(null);
+const getchoose = async () => {
+    loading.value = true;
+    const res = await expertChooseHistory({personId:query?.id});
+    if (!res || res.code !== 200) return;
+    orderHistoryItem.value = res.rows;
+    loading.value = false;
+};
+const editRow = (row) => {
+    router.push({ path: 'choose-detail', query: { id: row.expertChooseId } });
+};
+onMounted(()=>{
+getchoose()
+})
+</script>

+ 0 - 2
src/views/cdt/orders/detail/index.vue

@@ -70,6 +70,4 @@ onMounted(() => {
 .border-botttom {
     border-bottom: 1px solid #d7d7d7;
 }
-
-
 </style>

+ 203 - 0
src/views/leader/declaration-detail/index.vue

@@ -0,0 +1,203 @@
+<template>
+    <div class="p-3" >
+        <div class="bg-fff flex1 ov-hd d-flex flex-cln">
+            <div class="d-flex a-c pd-16 border-bottom">
+                <div class="f-s-20 c-333 f-w-7 mr-10">
+                    <template v-if="form?.status === '0'">申报详情审核</template>
+                    <template v-if="['1', '2'].includes(form?.status)">申报详情</template>
+                </div>
+                <el-button @click="router.go(-1)" type="primary" text>
+                    <el-icon>
+                        <Back />
+                    </el-icon>
+                    返回上一级
+                </el-button>
+            </div>
+            <div class="flex1 over-auto">
+                <div v-if="form" class="pd-16" style="overflow: hidden;">
+                    <div class="info-title f-w-5 mb-10">申报信息</div>
+                    <el-descriptions :column="2">
+                        <el-descriptions-item label="企业名称:">{{ form?.cpyname || '-' }}</el-descriptions-item>
+                        <el-descriptions-item label="标准名称:">{{ form?.standardName || '-' }}</el-descriptions-item>
+                        <el-descriptions-item label="备注:">{{ form?.remark || '-' }}</el-descriptions-item>
+                        <el-descriptions-item label="申报人:">{{ form?.createByName || '-' }}</el-descriptions-item>
+                        <el-descriptions-item label="申报时间:">{{ form?.createTime || '-' }}</el-descriptions-item>
+                    </el-descriptions>
+                    <el-divider />
+                    <div class="info-title f-w-5 mb-10">标准文件</div>
+                    <div style="margin-right: 0;"><FileLook v-model="form.accessory" isObject :span="5"></FileLook></div>
+                    <el-divider />
+                    <div class="info-title f-w-5 mb-10">生产工艺流程图</div>
+                    <div style="margin-right: 0;"><FileLook v-model="form.flowAccessory" isObject :span="6"></FileLook></div>
+                    <el-divider />
+                    <div class="info-title f-w-5 mb-10">最近生产三批次产品检验报告</div>
+                    <div style="margin-right: 0;"><FileLook v-model="form.latestCheckAccessory" isObject :span="6"></FileLook></div>
+                    <el-divider />
+                    <div class="info-title f-w-5 mb-10">最近生产三批次生产追溯记录</div>
+                    <div style="margin-right: 0;"><FileLook v-model="form.latestTraceAccessory" isObject :span="6"></FileLook></div>
+                    <el-divider />
+                    <div class="info-title f-w-5 mb-10">其他附件</div>
+                    <div style="margin-right: 0;"><FileLook v-model="form.otherAccessory" isObject :span="6"></FileLook></div>
+                    <el-divider />
+                    <div class="info-title f-w-5 mb-10">标准应用产品图</div>
+                    <div class="imgout">
+                        <div v-for="(item,index) in form?.imgs" :key="index">
+                            <img :src="item" style="height: 300px;width: 300px;object-fit: cover;" />
+                        </div>
+                    </div>
+                    <el-divider />
+                    <template v-if="form?.approvalLogVos">
+                        <div class="info-title f-w-5 mb-10">审核记录</div>
+                        <!-- // 表格 -->
+                        <vxe-table :data="form?.approvalLogVos" border min-height="0" style="width: 100%">
+                            <vxe-column title="审核结果">
+                                <template #default="{ row }">
+                                    <div v-if="+row?.res === 1" class="c-primary">通过</div>
+                                    <div v-if="+row?.res === 2" class="c-danger">不通过</div>
+                                    <div v-if="+row?.res === 2" class="f-s-12 c-danger">原因:{{ row?.msg }}</div>
+                                </template>
+                            </vxe-column>
+                            <vxe-column field="createTime" title="审核时间" />
+                            <vxe-column field="auditorName" title="审核人" />
+                        </vxe-table>
+                    </template>
+                </div>
+            </div>
+            <div v-if="!+form?.status" class="d-flex a-c j-c pd-16">
+                <el-button @click="router.go(-1)">取消</el-button>
+                <el-button type="danger" @click="noPass">不通过</el-button>
+                <el-button type="primary" @click="showCheckPass = true">通过</el-button>
+            </div>
+        </div>
+    </div>
+    <ChooseDeclarationDecord v-if="showCheckPass" v-model:show="showCheckPass" :info="form" :dict="dict" @success="successChange"></ChooseDeclarationDecord>
+</template>
+
+<script setup name="declaration-detail" lang="ts">
+import { ref, reactive, onMounted } from 'vue';
+import { debounce } from 'lodash';
+import { useRouter } from 'vue-router';
+import { expertChooseApprove, expertChooseDetail, expertChooseRelationList } from '@/api/authority';
+import {DeclarationDetail,DeclaraapprovalStandard} from '@/api/leader'
+import  ChooseDeclarationDecord  from "../models/ChooseDeclarationDecord.vue";
+import { FileLook } from '@/views/models';
+import { colNoData } from '@/utils/noData';
+import { VxeTablePropTypes } from 'vxe-table';
+const { proxy } = getCurrentInstance() as ComponentInternalInstance;
+const dict = proxy?.useDict('dm_person_type', 'dm_join_type', 'yes_no', 'sys_sex_type', 'dm_position_status');
+const { dm_person_type, dm_join_type, yes_no, sys_sex_type } = toRefs<any>(dict);
+const router = useRouter();
+const route = useRoute();
+const form = ref<any>(null);
+const showCheckPass = ref(false);
+// 获取申报详情
+const getDeclarationDetail =async()=>{
+    const res = await DeclarationDetail(route.query.id);
+    if (!res || res.code !== 200) return;
+    form.value = res.data;
+}
+// 获取专家详情
+const getExpertDetail = async () => {
+    if (route.query?.id) {
+        const res = await expertChooseDetail(route.query.id);
+        if (!res || res.code !== 200) return;
+        form.value = res.data;
+    }
+};
+const noPass = async () => {
+    ElMessageBox.prompt('是否确认将该事项的专家抽取审核为不通过!请填写不通过原因:', '审核不通过', {
+        confirmButtonText: '确认不通过',
+        cancelButtonText: '取消',
+        // 校验必填
+        inputValidator: (value) => {
+            if (!value) {
+                return '请填写不通过原因';
+            }
+            return true;
+        },
+        inputPlaceholder: '请填写不通过原因'
+    })
+        .then(({ value }) => {
+            const params = {
+                targetId: route.query.id,
+                res: '2', // 不通过
+                msg: value
+            };
+            submitApprove(params);
+        })
+        .catch(() => {
+            ElMessage({
+                type: 'info',
+                message: '取消审核'
+            });
+        });
+};
+// 提交审核
+const submitApprove = async (params: any) => {
+    proxy.$modal.loading('正在提交审核,请稍候...');
+    const res = await DeclaraapprovalStandard(params).finally(() => {
+        proxy.$modal.closeLoading();
+    });
+    if (res.code === 200) {
+        ElMessage({
+            type: 'success',
+            message: '操作成功'
+        });
+        router.go(-1);
+    } else {
+        ElMessage({
+            type: 'error',
+            message: res.msg || '操作失败'
+        });
+    }
+};
+const successChange = (val: any) => {
+    console.log('成功');
+
+    showCheckPass.value = false;
+        const params = {
+            targetId: route.query.id,
+            res: '1', // 通过
+            // personInfo: val
+        };
+        submitApprove(params);
+
+};
+const list = ref<any[]>([]);
+
+// 通用行合并函数(将相同多列数据合并为一行)
+const rowspanMethod: any = ({ row, _rowIndex, column, visibleData }) => {
+    const fields = ['personType', 'personCount', 'id'];
+    const cellValue = row[column.field];
+    if (cellValue && fields.includes(column.field)) {
+        const prevRow = visibleData[_rowIndex - 1];
+        let nextRow = visibleData[_rowIndex + 1];
+        if (prevRow && prevRow[column.field] === cellValue) {
+            return { rowspan: 0, colspan: 0 };
+        } else {
+            let countRowspan = 1;
+            while (nextRow && nextRow[column.field] === cellValue) {
+                nextRow = visibleData[++countRowspan + _rowIndex];
+            }
+            if (countRowspan > 1) {
+                return { rowspan: countRowspan, colspan: 1 };
+            }
+        }
+    }
+};
+
+onMounted(() => {
+    getDeclarationDetail()
+});
+</script>
+<style scoped>
+.imgout{
+    display: flex;
+    flex-wrap: wrap;
+    row-gap: 20px;
+    column-gap: 30px;
+}
+:deep(body){
+    overflow: hidden;
+}
+</style>

+ 133 - 0
src/views/leader/declaration-record/index.vue

@@ -0,0 +1,133 @@
+<template>
+    <div class="p-3">
+        <div class="bg-fff flex1 ov-hd d-flex flex-cln" v-show="showSearch">
+            <div class="pd-16 border-bottom">
+                <div class="f-s-20 c-333 f-w-7 mb-10">申报记录</div>
+                <div class="d-flex">
+                    <div class="flex1 ov-hd d-flex j-ed">
+                        <el-form :model="queryParams" ref="queryFormRef" :inline="true" label-width="auto">
+                            <el-form-item label="标准名称" prop="standardName">
+                                <el-input v-model="queryParams.standardName" placeholder="搜标准名称" clearable style="width: 160px" @keyup.enter="handleQuery" />
+                            </el-form-item>
+                            <el-form-item label="企业名称" prop="cpyname">
+                                <el-input v-model="queryParams.cpyname" placeholder="搜企业名称" clearable style="width: 160px" @keyup.enter="handleQuery" />
+                            </el-form-item>
+                            <el-form-item label="申报人" prop="createByName">
+                                <el-input v-model="queryParams.createByName" placeholder="搜申报人" clearable style="width: 160px" @keyup.enter="handleQuery" />
+                            </el-form-item>
+                            <el-form-item>
+                                <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
+                                <el-button icon="Refresh" @click="resetQuery">重置</el-button>
+                            </el-form-item>
+                        </el-form>
+                    </div>
+                </div>
+            </div>
+
+            <div class="d-flex flex1 ov-hd flex-cln pd-16">
+                <div class="d-flex j-sb mb-16">
+                    <div>
+                        <searchTabs v-model="queryParams.status" @change="handleQuery" :list="tabs" key-label="name" key-count="num" key-value="type"></searchTabs>
+                    </div>
+                </div>
+                <div class="flex1 ov-hd">
+                    <vxe-table :loading="loading" border :data="dataList" min-height="0" max-height="100%">
+                        <vxe-column title="序号" align="center" type="seq" width="50" />
+                        <vxe-column title="标准名称" field="standardName" :formatter="colNoData" />
+                        <vxe-column title="企业名称" field="cpyname" :formatter="colNoData" />
+                        <vxe-column title="申报时间" align="center" width="240">
+                            <template #default="{ row }">
+                                <span>{{ row.createTime }}</span>
+                            </template>
+                        </vxe-column>
+                        <vxe-column title="申报人" field="createByName" align="center" width="140" />
+                        <vxe-column title="点赞数" field="likeCount" align="center" width="70"/>
+                        <vxe-column title="分享数" field="shareCount" align="center" width="70" />
+                        <vxe-column title="事项状态" width="100">
+                            <template #default="{ row }">
+                                <DictTag :options="dm_expert_item_list" :value="row?.status"></DictTag>
+                            </template>
+                        </vxe-column>
+                        <vxe-column title="操作" width="100" align="center" fixed="right">
+                            <template #default="{ row }">
+                                <el-button v-if="!+row?.status" type="primary" @click="editRow(row)" text>审核</el-button>
+                                <el-button v-else type="primary" @click="editRow(row)" text>详情</el-button>
+                            </template>
+                        </vxe-column>
+                    </vxe-table>
+                </div>
+                <pagination :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getdeclarationList" />
+            </div>
+        </div>
+    </div>
+</template>
+
+<script setup name="choose-check" lang="ts">
+import { colNoData } from '@/utils/noData';
+import { searchTabs } from '@/views/models';
+
+import {DeclarationRecordList,queryDeclarationRecordCount} from '@/api/leader'
+const router = useRouter();
+const { proxy } = getCurrentInstance() as ComponentInternalInstance;
+const { dm_join_type, dm_person_type, dm_expert_item_list } = toRefs<any>(proxy?.useDict('dm_join_type', 'dm_person_type', 'dm_expert_item_list'));
+const loading = ref(true);
+const showSearch = ref(true);
+const total = ref(0);
+const queryFormRef = ref<ElFormInstance>();
+const dataList = ref<any[]>([]);
+const initFormData = {};
+const data = reactive<any>({
+    form: { ...initFormData },
+    queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        res: '0',
+        standardName: '',
+        cpyname: '',
+        createByName:'',
+    },
+    rules: {}
+});
+
+const { queryParams, form } = toRefs(data);
+/** 查询审批列表 */
+const getdeclarationList = async()=>{
+    loading.value = true;
+    const res = await DeclarationRecordList(queryParams.value);
+    dataList.value = res.rows;
+    total.value = res.total;
+    loading.value = false;
+}
+
+/** 搜索按钮操作 */
+const handleQuery = () => {
+    queryParams.value.pageNum = 1;
+    getdeclarationList()
+};
+
+/** 重置按钮操作 */
+const resetQuery = () => {
+    queryFormRef.value?.resetFields();
+    queryParams.value.standardName = '';
+    queryParams.value.cpyname = '';
+    queryParams.value.createByName = '';
+    handleQuery();
+};
+
+/** 编辑事项 */
+const editRow = (row) => {
+    router.push({ path: 'declaration-detail', query: { id: row.id } });
+};
+// 获取专家统计数量
+const tabs = ref([]);
+const getDeclarationRecordCount = async () => {
+    const res = await queryDeclarationRecordCount();
+    if (res?.code === 200) {
+        tabs.value = res.data;
+    }
+};
+onMounted(() => {
+    getdeclarationList()
+    getDeclarationRecordCount()
+});
+</script>

+ 94 - 0
src/views/leader/models/ChooseDeclarationDecord.vue

@@ -0,0 +1,94 @@
+<template>
+    <vxe-modal v-model="dialogVisible" :title="title" show-zoom resize show-footer destroy-on-close transfer @hide="close" :width="width" :z-index="1002">
+        <template #default>
+            <div class="mb-10">是否确认将该事项的专家抽取审核为通过!</div>
+            <div class="mb-8">专家人员指定:</div>
+            <vxe-table border :data="[props.info]" min-height="0" max-height="100%">
+                <vxe-column title="序号" align="center" type="seq" width="50" />
+                <vxe-column title="标准名称" field="standardName" :formatter="colNoData" />
+                <vxe-column title="企业名称" field="cpyname" :formatter="colNoData" />
+                <vxe-column title="申报时间" width="150">
+                    <template #default="{ row }">
+                        <span>{{ row.createTime }}</span>
+                    </template>
+                </vxe-column>
+                <vxe-column title="申报人" field="createByName" width="120" />
+                <vxe-column title="事项状态" width="100">
+                    <template #default="{ row }">
+                        <DictTag :options="dm_expert_item_list" :value="row?.status"></DictTag>
+                    </template>
+                </vxe-column>
+            </vxe-table>
+        </template>
+        <template #footer>
+            <el-button @click="close">取消</el-button>
+            <el-button type="primary" @click="submitForm">确认添加</el-button>
+        </template>
+    </vxe-modal>
+</template>
+<script setup name="ChooseDeclarationDecord" lang="tsx">
+import { colNoData } from '@/utils/noData';
+import { propTypes } from '@/utils/propTypes';
+const { proxy } = getCurrentInstance() as ComponentInternalInstance;
+const { dm_expert_item_list } = toRefs<any>(proxy?.useDict( 'dm_expert_item_list'));
+
+// const { dm_person_type, dm_join_type, yes_no } = toRefs<any>(proxy?.useDict('dm_person_type', 'dm_join_type', 'yes_no', 'sys_sex_type'));
+const emit = defineEmits(['update:show', 'close', 'success']);
+const props = defineProps({
+    show: propTypes.bool.def(false),
+    info: propTypes.any.def(null),
+    title: propTypes.string.def('审核通过'),
+    width: propTypes.number.def(900),
+    dict: propTypes.any.def(null),
+});
+const ChooseExpertRef = ref();
+const showChoose = ref(false);
+const dialogVisible = ref(props.show);
+const close = () => {
+    emit('update:show', false);
+    emit('close', false);
+};
+
+// const list = ref<any[]>(props.info?.personInfo.map(item => {
+//     return {
+//         ...item,
+//         isAppoint: item.isAppoint || '0',
+//         personInfos: item.personInfos || [],
+//     };
+// }) || []);
+const list = ref()
+list.value =props.info
+
+const rowInfo = ref<any>(null);
+const addPerson = (row: any) => {
+    rowInfo.value = row;
+    showChoose.value = true;
+};
+const submitForm = async () => {
+    try {
+        // const persons = list.value.map(item => {
+        //     return {
+        //         personType: item.personType,
+        //         personCount: item.personCount,
+        //         isAppoint: item.isAppoint,
+        //         personIds: +item.isAppoint ? item.personInfos.map((person: any) => person.id) : []
+        //     };
+        // });
+        emit('success');
+    } catch (error) {
+        console.error(error);
+    }
+};
+const changeSuccesss = (val: any) => {
+    rowInfo.value.personInfos = [...val]
+};
+const closeTagPerson = (item: any, index: number) => {
+    item.personInfos.splice(index, 1);
+};
+watch(
+    () => props.show,
+    (val) => {
+        dialogVisible.value = val;
+    }
+);
+</script>