huangxw 7 сар өмнө
parent
commit
134371424f

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

@@ -84,3 +84,10 @@ export const expertChooseApprove = (data: any): AxiosPromise => {
         data
     });
 };
+// 专家组统计
+export const expertGroupCount = (query?: any): AxiosPromise => {
+    return request({
+        url: '/dgtmedicine/expertPerson/queryPersonGroupCount',
+        method: 'get'
+    });
+};

+ 3 - 0
src/assets/styles/ruoyi.scss

@@ -378,4 +378,7 @@ $colors: (
       width: 2px;
       height: 16px;
   }
+}
+.c-s-p {
+  cursor: pointer;
 }

+ 34 - 7
src/views/authority/choose-detail/index.vue

@@ -39,6 +39,18 @@
                     </div>
                     <el-divider />
                     <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 v-if="form?.res === '1'">
                         <el-divider />
                         <div class="info-title f-w-5 mb-10">
@@ -48,13 +60,14 @@
                     </template>
                 </div>
             </div>
-            <div v-if="form?.res === '0'" class="d-flex a-c j-c pd-16">
+            <div v-if="!+form?.res" 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">通过</el-button>
+                <el-button type="primary" @click="showCheckPass = true">通过</el-button>
             </div>
         </div>
     </div>
+    <ChooseExpertCheck v-if="showCheckPass" v-model:show="showCheckPass" :info="form" :dict="dict" @success="successChange"></ChooseExpertCheck>
 </template>
 
 <script setup name="authority-input" lang="ts">
@@ -62,12 +75,15 @@ import { ref, reactive, onMounted } from 'vue';
 import { debounce } from 'lodash';
 import { useRouter } from 'vue-router';
 import { expertChooseApprove, expertChooseDetail } from '@/api/authority';
+import { ChooseExpertCheck } from '../models';
 
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
-const { dm_person_type, dm_join_type, yes_no } = toRefs<any>(proxy?.useDict('dm_person_type', 'dm_join_type', 'yes_no'));
+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 } = toRefs<any>(dict);
 const router = useRouter();
 const route = useRoute();
 const form = ref<any>(null);
+const showCheckPass = ref(false);
 // 获取专家详情
 const getExpertDetail = async () => {
     if (route.query?.id) {
@@ -87,15 +103,15 @@ const noPass = async () => {
             }
             return true;
         },
-        inputPlaceholder: '请填写不通过原因',
+        inputPlaceholder: '请填写不通过原因'
     })
         .then(({ value }) => {
             const params = {
                 targetId: route.query.id,
                 res: '2', // 不通过
-                msg: value,
+                msg: value
             };
-            submitApprove(params)
+            submitApprove(params);
         })
         .catch(() => {
             ElMessage({
@@ -108,7 +124,7 @@ const noPass = async () => {
 const submitApprove = async (params: any) => {
     proxy.$modal.loading('正在提交审核,请稍候...');
     const res = await expertChooseApprove(params).finally(() => {
-        proxy.$modal.closeLoading()
+        proxy.$modal.closeLoading();
     });
     if (res.code === 200) {
         ElMessage({
@@ -123,6 +139,17 @@ const submitApprove = async (params: any) => {
         });
     }
 };
+const successChange = (val: any) => {
+    showCheckPass.value = false;
+    if (val?.length) {
+        const params = {
+            targetId: route.query.id,
+            res: '1', // 通过
+            personInfo: val
+        };
+        submitApprove(params);
+    }
+};
 onMounted(() => {
     getExpertDetail();
 });

+ 2 - 2
src/views/authority/info/index.vue

@@ -12,8 +12,8 @@
                             <el-form-item label="工作单位" prop="workUnit">
                                 <el-input v-model="queryParams.variety" placeholder="搜工作单位关键字" clearable style="width: 160px" @keyup.enter="handleQuery" />
                             </el-form-item>
-                            <el-form-item label="拟加入专家组" prop="personType">
-                                <el-select style="width: 140px" v-model="queryParams.personType" clearable placeholder="请选择拟加入专家组">
+                            <el-form-item label="拟加入专家组" prop="queryPersonType">
+                                <el-select style="width: 140px" v-model="queryParams.queryPersonType" clearable placeholder="请选择拟加入专家组">
                                     <el-option v-for="item in dm_person_type" :key="item.value" :label="item.label" :value="item.value" @change="handleQuery" />
                                 </el-select>
                             </el-form-item>

+ 179 - 0
src/views/authority/models/ChooseExpert.vue

@@ -0,0 +1,179 @@
+<template>
+    <vxe-modal v-model="dialogVisible" :title="title" show-zoom resize show-footer destroy-on-close transfer @hide="close" :width="width">
+        <template #default>
+            <div class="d-flex flex-cln" style="height: 60vh;">
+                <div class="pd-16">
+                    <el-form ref="queryFormRef" :model="queryParams" inline>
+                        <el-form-item label="姓名" prop="name">
+                            <el-input v-model="queryParams.name" placeholder="搜姓名" clearable style="width: 160px" @keyup.enter="handleQuery" />
+                        </el-form-item>
+                        <el-form-item label="工作单位" prop="workUnit">
+                            <el-input v-model="queryParams.variety" placeholder="搜工作单位关键字" clearable style="width: 160px" @keyup.enter="handleQuery" />
+                        </el-form-item>
+                        <el-form-item label="专业品种" prop="variety">
+                            <el-input v-model="queryParams.variety" placeholder="搜专业品种" clearable style="width: 160px" @keyup.enter="handleQuery" />
+                        </el-form-item>
+                        <el-form-item>
+                            <el-button type="primary" @click="handleQuery">查询</el-button>
+                            <el-button @click="resetQuery">重置</el-button>
+                        </el-form-item>
+                    </el-form>
+                </div>
+                <div class="flex1 ov-hd d-flex">
+                    <div v-if="currentNodeKey" class="tree-wrap over-auto">
+                        <template v-for="(item, index) in itemsData" :key="index">
+                            <div class="pd2-10-30 border-bottom c-s-p" @click="itemsClick(item)" :class="{ 'check-node-key': currentNodeKey === item.type }">{{ selectDictLabel(dm_person_type, item.type) }}({{ item.num }})</div>
+                        </template>
+                    </div>
+                    <div class="flex1 ov-hd">
+                        <vxe-table ref="tableRef" :loading="loading" border :data="list" height="auto" :checkbox-config="{ checkRowKeys: checkRowKeys,  highlight: true, range: true, trigger: 'row', reserve: true }" :row-config="{ keyField: 'id', isCurrent: true, isHover: true }">
+                            <vxe-column type="checkbox" width="60"></vxe-column>
+                            <vxe-column type="seq" width="60" title="序号" align="center" />
+                            <!-- 企业名称 -->
+                            <vxe-column title="姓名" align="center" field="name" :formatter="colNoData" />
+                            <vxe-column title="性别" width="70" align="center">
+                                <template #default="{ row }">
+                                    {{ selectDictLabel(sys_sex_type, row?.sex) }}
+                                </template>
+                            </vxe-column>
+                            <vxe-column title="工作单位" field="workUnit" :formatter="colNoData" />
+                            <vxe-column title="职称/职务" field="post" :formatter="colNoData" />
+                            <vxe-column title="专业品种" field="variety" :formatter="colNoData" />
+                            <vxe-column title="岗位状态" width="90">
+                                <template #default="{ row }">
+                                    <DictTag :options="dm_position_status" :value="row?.status"></DictTag>
+                                </template>
+                            </vxe-column>
+                        </vxe-table>
+                    </div>
+                </div>
+                <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
+            </div>
+        </template>
+        <template #footer>
+            <el-button @click="close">取消</el-button>
+            <el-button type="primary" @click="submitForm">确认提交</el-button>
+        </template>
+    </vxe-modal>
+</template>
+<script setup name="ChooseExpert" lang="ts">
+import { expertGroupCount, expertList } from '@/api/authority';
+import { addOriginCpy, listByPage } from '@/api/price/station';
+import { colNoData } from '@/utils/noData';
+import { propTypes } from '@/utils/propTypes';
+const emit = defineEmits(['update:show', 'close', 'success', 'update:info']);
+const props = defineProps({
+    title: propTypes.string.def('选择专家'),
+    width: propTypes.number.def(1200),
+    show: propTypes.bool.def(false),
+    info: propTypes.any.def(null),
+    dict: propTypes.any.def(null)
+});
+const { dm_person_type, dm_position_status, sys_sex_type } = toRefs<any>(props.dict);
+const dialogVisible = ref(false);
+const { query }: any = useRoute();
+const router = useRouter();
+const { proxy } = getCurrentInstance() as ComponentInternalInstance;
+const list = ref<any[]>([]);
+const loading = ref(true);
+const total = ref(0);
+const queryFormRef = ref<ElFormInstance>();
+const data = reactive<any>({
+    queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        putawayFlag: 1,
+        status: 1,
+        queryPersonType: props.info?.personType || null,
+    }
+});
+const formRef = ref<ElFormInstance>();
+const itemsData = ref<any[]>([]); // 树数据
+const treeItemsRef = ref<any>();
+const { queryParams, form, rules } = toRefs(data);
+/** 查询会员信息列表 */
+const getList = async () => {
+    loading.value = true;
+    const res = await expertList({ ...queryParams.value });
+    list.value = res.rows;
+    total.value = res.total;
+    loading.value = false;
+};
+
+/** 搜索按钮操作 */
+const handleQuery = (level?: any) => {
+    queryParams.value.pageNum = 1;
+    getList();
+};
+const itemsClick = (node: any) => {
+    queryParams.value.queryPersonType = node.type;
+    currentNodeKey.value = node.type;
+    handleQuery();
+};
+/** 重置按钮操作 */
+const resetQuery = () => {
+    queryFormRef.value?.resetFields();
+    queryParams.value.startDate = '';
+    queryParams.value.endDate = '';
+    handleQuery();
+};
+const currentNodeKey = ref<any>(null); // 当前选中节点
+const close = () => {
+    // formRef.value?.resetFields();
+    emit('update:show', false);
+    emit('close', false);
+};
+
+const tableRef = ref<any>();
+const submitForm = async () => {
+    const records = tableRef.value?.getCheckboxReserveRecords(true).concat(tableRef.value?.getCheckboxRecords());
+    if (!records.length) {
+        proxy?.$modal.msgWarning('请选择专家');
+        return;
+    }
+    if (records.length > props.info?.personCount) {
+        proxy?.$modal.msgWarning(`最多只能选择${props.info?.personCount}个专家`);
+        return;
+    }
+    emit('update:info', {
+        ...props.info,
+        personInfos: [...records]
+    })
+    emit('success', records);
+    close();
+};
+// 获取专家统计数据
+const getExpertGroupCount = async () => {
+    const res = await expertGroupCount();
+    if (res?.code === 200) {
+        itemsData.value = res.data;
+    }
+};
+const checkRowKeys = ref<any>([]);
+
+watch(
+    () => props.show,
+    (val) => {
+        dialogVisible.value = val;
+        if (val) {
+            checkRowKeys.value = props.info?.personInfos.map((item: any) => item.id) || [];
+            currentNodeKey.value = props.info?.personType || null;
+            getExpertGroupCount();
+            getList();
+        }
+    },
+    { immediate: true }
+);
+</script>
+<style lang="scss" scoped>
+.tree-wrap {
+    width: 310px;
+    box-sizing: border-box;
+    border: 1px solid #ebeef5;
+    padding: 16px;
+}
+.check-node-key {
+    color: var(--el-color-primary);
+    background-color: var(--el-color-primary-light-9);
+}
+</style>

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

@@ -0,0 +1,105 @@
+<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="list" min-height="0" max-height="100%">
+                <vxe-column title="专家组" width="200">
+                    <template #default="{ row }">
+                        {{ selectDictLabel(dict.dm_person_type, row.personType) || '-' }}
+                    </template>
+                </vxe-column>
+                <vxe-column title="专家人数" width="80" field="personCount" :formatter="colNoData" />
+                <vxe-column title="是否指定人员" field="isAppoint" width="160">
+                    <template #default="{ row }">
+                        <el-radio-group v-model="row.isAppoint">
+                            <el-radio v-for="item in dict.yes_no" :key="item.value" :label="item.value">{{ item.label }}</el-radio>
+                        </el-radio-group>
+                    </template>
+                </vxe-column>
+                <vxe-column title="选择指定人" field="personInfos">
+                    <template #default="{ row }">
+                        <template v-if="+row.isAppoint">
+                            <div>
+                                <template v-for="(item, index) in row?.personInfos" :key="index">
+                                    <el-tag class="mr-6 mb-2" type="primary" closable @close="closeTagPerson(row, index)">{{ item.name }}</el-tag>
+                                </template>
+                                <el-button @click="addPerson(row)" type="success" size="small">
+                                    <el-icon><CirclePlus /></el-icon>
+                                    添加
+                                </el-button>
+                            </div>
+                        </template>
+                        <template v-else>-</template>
+                    </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>
+    <ChooseExpert v-if="showChoose" ref="ChooseExpertRef" v-model:show="showChoose" :info="rowInfo" :dict="dict" @success="changeSuccesss"></ChooseExpert>
+</template>
+<script setup name="ChooseExpertCheck" lang="tsx">
+import { colNoData } from '@/utils/noData';
+import { propTypes } from '@/utils/propTypes';
+import { ChooseExpert } from '.';
+const { proxy } = getCurrentInstance() as ComponentInternalInstance;
+// 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 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.personInfos.map((person: any) => person.id)
+            };
+        });
+        emit('success', persons);
+    } 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>

+ 2 - 0
src/views/authority/models/index.ts

@@ -0,0 +1,2 @@
+export { default as ChooseExpertCheck } from './ChooseExpertCheck.vue'; // 选择专家不通过
+export { default as ChooseExpert } from './ChooseExpert.vue'; // 选择专家

+ 1 - 1
src/views/cdt/models/EditOrderRemark.vue

@@ -1,5 +1,5 @@
 <template>
-    <vxe-modal v-model="dialogVisible" :title="title" show-zoom resize show-footer destroy-on-close transfer @hide="close" :width="width" :z-index="100">
+    <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>
             <el-form ref="formRef" :model="form" label-width="auto">
                 <el-form-item label="订单备注:" prop="remark">

+ 1 - 1
src/views/cdt/models/transferItems.vue

@@ -41,7 +41,7 @@
                     </div>
                     <div class="flex1 ov-hd d-flex flex-cln">
                         <div class="flex1 ov-hd">
-                            <vxe-table ref="tableLeftRef" :loading="loading" border :cell-class-name="formatterCheckbox" :data="list" height="100%" :column-config="{ resizable: true }" :row-config="{keyField: 'id',isCurrent: true, isHover: true}" :checkbox-config="{ checkRowKeys: checkRowKeys,  highlight: true, range: true, trigger: 'row', reserve: true }">
+                            <vxe-table ref="tableLeftRef" :loading="loading" border :data="list" height="100%" :column-config="{ resizable: true }" :row-config="{keyField: 'id',isCurrent: true, isHover: true}" :checkbox-config="{ checkRowKeys: checkRowKeys,  highlight: true, range: true, trigger: 'row', reserve: true }">
                                 <vxe-column type="checkbox" width="60"></vxe-column>
                                 <!-- 序号 -->
                                 <vxe-column type="seq" width="60" title="序号" align="center" />

+ 1 - 1
src/views/dgtmedicine/model/EditVipEndDate.vue

@@ -1,5 +1,5 @@
 <template>
-    <vxe-modal v-model="dialogVisible" :title="title" show-zoom resize show-footer destroy-on-close transfer @hide="close" :width="width" :z-index="100">
+    <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>
             <el-form ref="formRef" :model="form" :rules="rules" label-width="auto">
                 <div class="mb-10 f-s-14 c-333 f-w-5">

+ 1 - 1
src/views/dgtmedicine/model/EditVipLevel.vue

@@ -1,5 +1,5 @@
 <template>
-    <vxe-modal v-model="dialogVisible" :title="title" show-zoom resize show-footer destroy-on-close transfer @hide="close" :width="width" :z-index="100">
+    <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>
             <el-form ref="formRef" :model="form" :rules="rules" label-width="auto">
                 <div class="mb-10 f-s-14 c-333 f-w-5">

+ 1 - 1
src/views/dgtmedicine/model/InvoiceInfo.vue

@@ -1,5 +1,5 @@
 <template>
-    <vxe-modal v-model="dialogVisible" :title="title" show-zoom resize show-footer destroy-on-close transfer @hide="close" :width="width" :z-index="100">
+    <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>
                 <div>发票抬头:{{ info?.headTitle }}</div>

+ 1 - 1
src/views/gap/gap-input/index.vue

@@ -89,7 +89,7 @@
                                 </el-col>
                             </el-row>
                         </template>
-                        <template v-if="['33'].includes(form.newsType)">
+                        <template v-if="['36'].includes(form.newsType)">
                             <el-row :gutter="90">
                                 <el-col :span="8">
                                     <el-form-item label="标题:" prop="newsTitle" required :rules="[{ required: true, message: '请输入中文名称', trigger: 'blur' }]">

+ 1 - 1
src/views/price/models/EditStationEndDate.vue

@@ -1,5 +1,5 @@
 <template>
-    <vxe-modal v-model="dialogVisible" :title="title" show-zoom resize show-footer destroy-on-close transfer @hide="close" :width="width" :z-index="100">
+    <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>
             <el-form ref="formRef" :model="form" :rules="rules" label-width="auto">
                 <div class="mb-10 f-s-14 c-333 f-w-5">

+ 3 - 3
src/views/price/models/addStation.vue

@@ -51,7 +51,7 @@
 import { addOriginCpy, listByPage } from '@/api/price/station';
 import { colNoData } from '@/utils/noData';
 import { propTypes } from '@/utils/propTypes';
-const emit = defineEmits(['update:show', 'close', 'sueccess']);
+const emit = defineEmits(['update:show', 'close', 'success']);
 const props = defineProps({
     title: propTypes.string.def('添加监测点'),
     width: propTypes.number.def(1200),
@@ -84,7 +84,7 @@ const { queryParams, form, rules } = toRefs(data);
 /** 查询会员信息列表 */
 const getList = async () => {
     loading.value = true;
-    const res = await listByPage({ ...queryParams.value, packageId: props?.packageId });
+    const res = await listByPage({ ...queryParams.value });
     list.value = res.rows;
     total.value = res.total;
     loading.value = false;
@@ -126,7 +126,7 @@ const submitForm = async () => {
     });
     if (!res || res.code !== 200) return;
     proxy?.$modal.msgSuccess('提交成功');
-    emit('sueccess', true);
+    emit('success', true);
     close();
 };
 watch(

+ 1 - 1
src/views/price/station/index.vue

@@ -66,7 +66,7 @@
             <div class="pd-5"></div>
         </div>
     </div>
-    <addStation v-model:show="showStation" @sueccess="handleQuery"></addStation>
+    <addStation v-model:show="showStation" @success="handleQuery"></addStation>
     <EditStationEndDate v-if="showEndDate" v-model:show="showEndDate" :infos="infos" @success="handleQuery"></EditStationEndDate>
 </template>
 <script setup name="price-station-index" lang="ts">

+ 1 - 1
vite/plugins/unocss.ts

@@ -7,7 +7,7 @@ export default () => {
             [/^mg-([\.\d]+)$/, ([_, num]) => ({ margin: `${num}px` })],
             [/^pd-([\.\d]+)$/, ([_, num]) => ({ padding: `${num}px` })],
             [/^bg-([\w-]+)$/, ([_, color]) => ({ 'background-color': color })],
-            [/^c-([\w-]+)$/, ([_, color]) => ({ color: color })],
+            [/^c-#([\w-]+)$/, ([_, color]) => ({ color: color })],
             [/^bc-([\w-]+)$/, ([_, color]) => ({ 'border-color': color })],
             [/^rounded-([\.\d]+)$/, ([_, num]) => ({ 'border-radius': `${num}px` })],
             // 下边距