123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595 |
- <template>
- <div id="user-project">
- <el-row>
- <el-col :span="24" class="main animate__animated animate__backInRight">
- <component :is="CForm" :fields="fields" :form="form" :rules="rules" @save="toSave" @dataChange="dataChange" :span="24" labelWidth="140px">
- <!-- 基本 -->
- <template #gender>
- <el-option v-for="i in genderList" :key="i.model" :label="i.dict_label" :value="i.dict_value"></el-option>
- </template>
- <template #education>
- <el-option v-for="i in educationList" :key="i.model" :label="i.dict_label" :value="i.dict_value"></el-option>
- </template>
- <template #degree>
- <el-option v-for="i in degreeList" :key="i.model" :label="i.dict_label" :value="i.dict_value"></el-option>
- </template>
- <!-- 工作室 -->
- <template #card="{ item }">
- <component
- style="width: 100%"
- :is="CUpload"
- :model="item.model"
- :limit="2"
- url="/files/studioadmin/register/upload"
- :list="form[item.model]"
- listType="picture"
- @change="onUpload"
- ></component>
- </template>
- <template #team_phone>
- <el-col :span="12">
- <el-form-item label="内容" label-width="100px" prop="team_phone.phone">
- <el-input v-model="form.team_phone.phone" placeholder="请输入联系电话"></el-input>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="是否公开" label-width="80px">
- <el-select v-model="form.team_phone.is_show" placeholder="请选择" style="width: 100%">
- <el-option v-for="i in isshowList" :key="i.model" :label="i.dict_label" :value="i.dict_value"></el-option>
- </el-select>
- </el-form-item>
- </el-col>
- </template>
- <template #zc>
- <el-option v-for="i in zcList" :key="i.model" :label="i.dict_label" :value="i.dict_value"></el-option>
- </template>
- <template #zc_file="{ item }">
- <component
- style="width: 100%"
- :is="CUpload"
- :model="item.model"
- :limit="1"
- url="/files/studioadmin/register/upload"
- :list="form[item.model]"
- listType="picture"
- @change="onUpload"
- ></component>
- </template>
- <template #fields>
- <el-option v-for="i in fieldList" :key="i.dict_value" :label="i.dict_label" :value="i.dict_value"></el-option>
- </template>
- <template #direction>
- <el-button type="primary" size="mini" @click="addDriection()">添加</el-button>
- <el-col :span="24">
- <el-table :data="form.direction" border size="mini">
- <el-table-column type="index" label="序号" width="50" align="center"> </el-table-column>
- <el-table-column prop="name" label="名称" align="center">
- <template v-slot="scope">
- <el-input v-model="scope.row.name" placeholder="请输入技术需求方向名称,名称长度不可超过八个字" maxlength="8"></el-input>
- </template>
- </el-table-column>
- <el-table-column label="操作" align="center" width="100">
- <template v-slot="scope">
- <el-button size="mini" type="danger" @click="delDriection(scope.row)">删除</el-button>
- </template>
- </el-table-column>
- </el-table>
- </el-col>
- </template>
- <template #case>
- <el-button type="primary" size="mini" @click="addCase()">添加</el-button>
- <el-col :span="24">
- <el-table :data="form.case" border size="mini">
- <el-table-column type="index" label="序号" width="50" align="center"> </el-table-column>
- <el-table-column prop="name" label="名称" align="center">
- <template v-slot="scope">
- <el-input
- v-model="scope.row.name"
- placeholder="请输入服务企业代表性案例"
- type="textarea"
- maxlength="100"
- show-word-limit
- :autosize="{ minRows: 3, maxRows: 5 }"
- ></el-input>
- </template>
- </el-table-column>
- <el-table-column label="操作" align="center" width="100">
- <template v-slot="scope">
- <el-button size="mini" type="danger" @click="delCase(scope.row)">删除</el-button>
- </template>
- </el-table-column>
- </el-table>
- </el-col>
- </template>
- <template #case_file="{ item }">
- <component
- style="width: 100%"
- :is="CUpload"
- :model="item.model"
- :limit="5"
- url="/files/studioadmin/basic/upload"
- :list="form[item.model]"
- listType="picture"
- @change="onUpload"
- ></component>
- </template>
- <template #is_job>
- <el-option v-for="i in isjobList" :key="i.model" :label="i.dict_label" :value="i.dict_value"></el-option>
- </template>
- </component>
- </el-col>
- </el-row>
- </div>
- </template>
- <script setup lang="ts">
- import moment from 'moment';
- import store from '@/stores/counter';
- import CForm from '@common/src/components/frame/c-form.vue';
- import CUpload from '@common/src/components/frame/c-upload.vue';
- import type { FormRules } from 'element-plus';
- import type { Ref } from 'vue';
- import { ref, reactive, watch, toRefs } from 'vue';
- import { ElMessage } from 'element-plus';
- import { isIdentityId, isIdentityPhone } from '@common/src/util/checkCard';
- import { UserStudioApplyStore } from '@common/src/stores/studio/role/userStudioApply';
- import { BasicStore } from '@common/src/stores/project/basic';
- import { UsersStore } from '@common/src/stores/users/users';
- import { UnitStore } from '@common/src/stores/users/unit';
- import { DictDataStore } from '@common/src/stores/users/sysdictdata'; // 字典表
- import type { IQueryResult } from '@/util/types.util';
- const userStudioApply = UserStudioApplyStore();
- const unit = UnitStore();
- const basic = BasicStore();
- const users = UsersStore();
- const sysdictdata = DictDataStore();
- const props = defineProps({
- userInfo: { type: Object, default: () => {} },
- });
- const { userInfo } = toRefs(props);
- let fields: Ref<any[]> = ref([]);
- const checkCard = (rule: any, value: any, callback: any) => {
- if (!value) {
- return callback(new Error('请输入身份证号'));
- } else {
- var errorMsg = isIdentityId(value);
- if (errorMsg != '') {
- callback(new Error(errorMsg));
- } else {
- callback();
- }
- }
- };
- const checkPhone = (rule: any, value: any, callback: any) => {
- if (!value) {
- return callback(new Error('请输入手机号'));
- } else {
- var errorMsg = isIdentityPhone(value);
- if (errorMsg != '') {
- callback(new Error(errorMsg));
- } else {
- callback();
- }
- }
- };
- const rules = reactive<FormRules>({
- name: [{ required: true, message: '请输入姓名', trigger: 'blur' }],
- // card_type: [{ required: true, message: '请选择证件类别', trigger: 'change' }],
- num: [{ required: true, validator: checkCard, trigger: 'change' }],
- gender: [{ required: true, message: '请选择性别', trigger: 'change' }],
- birth: [{ required: true, message: '请选择出生年月', trigger: 'change' }],
- phone: [{ required: true, validator: checkPhone, trigger: 'blur', type: '手机号' }],
- email: [{ required: true, message: '请输入电子邮箱', trigger: 'blur' }],
- education: [{ required: true, message: '请选择学历', trigger: 'change' }],
- degree: [{ required: true, message: '请选择学位', trigger: 'change' }],
- unit_name: [{ required: true, message: '请输入工作单位', trigger: 'blur' }],
- work_phone: [{ required: true, message: '请输入办公电话', trigger: 'blur' }],
- title: [{ required: true, message: '请输入职称', trigger: 'blur' }],
- // 工作室
- live_place: [{ required: true, message: '请输入居住地', trigger: 'blur' }],
- card: [{ required: true, message: '请上传身份证', trigger: 'change' }],
- team_name: [{ required: false, message: '请输入团队联系人', trigger: 'blur' }],
- 'team_phone.phone': [{ required: true, validator: checkPhone, trigger: 'blur', type: '团队联系人电话' }],
- zc: [{ required: true, message: '请选择专业技术职称', trigger: 'change' }],
- zc_file: [{ required: true, message: '请上传职称证明', trigger: 'change' }],
- part_job: [{ required: false, message: '请输入社会兼职', trigger: 'blur' }],
- fields: [{ required: true, message: '请选择研究领域', trigger: 'change' }],
- direction: [{ required: true, message: '请添加研究方向', trigger: 'change' }],
- case: [{ required: false, message: '请上传服务企业代表性案例', trigger: 'change' }],
- case_file: [{ required: false, message: '请上传案例证明材料', trigger: 'change' }],
- is_job: [{ required: true, message: '请选择是否为在职人员', trigger: 'change' }],
- });
- const form: Ref<{
- phone: { phone: string; is_show: boolean };
- email: { is_show: boolean; email: string };
- card: any;
- team_phone: { phone: string; is_show: boolean };
- zc_file: any;
- fields: any;
- direction: any;
- case: any;
- case_file: any;
- settle_file: any;
- job_zc_file: any;
- name: string;
- team_name: string;
- birth: any;
- address: string;
- num: string;
- gender: string;
- }> = ref({
- phone: { phone: '', is_show: false },
- email: { is_show: false, email: '' },
- card: [],
- team_phone: { phone: '', is_show: false },
- zc_file: [],
- fields: [],
- direction: [],
- case: [],
- case_file: [],
- settle_file: [],
- job_zc_file: [],
- name: '',
- team_name: '',
- birth: '',
- address: '',
- num: '',
- gender: '',
- });
- // 字典表
- // 依托单位名称
- let unit_name: Ref<string> = ref('');
- // 证件类别
- let cardtypeList: Ref<any> = ref([]);
- // 性别
- let genderList: Ref<any> = ref([]);
- // 学历
- let educationList: Ref<any> = ref([]);
- // 学位
- let degreeList: Ref<any> = ref([]);
- // 领域
- let fieldList: Ref<any> = ref([]);
- // 专业技术职称
- let zcList: Ref<any> = ref([]);
- // 是否为在职人员
- let isjobList: Ref<any> = ref([]);
- // 是否公开
- let isshowList: Ref<any> = ref([]);
- let user = store.state.user as { _id: string; role_type: string; account: string; unit: String; unit_address: string };
- // 查询
- const search = async (e: any) => {
- let field1: any = [];
- let field = [
- { label: '姓名', model: 'name', options: { disabled: true } },
- // { label: '证件类别', model: 'card_type', type: 'select' },
- { label: '身份证号', model: 'num', options: { disabled: true } },
- { label: '性别', model: 'gender', type: 'select', options: { disabled: true } },
- { label: '出生年月', model: 'birth', type: 'date', options: { disabled: true } },
- { label: '手机号', model: 'phone', options: { disabled: true } },
- { label: '电子邮箱', model: 'email', options: { disabled: true } },
- { label: '学历', model: 'education', type: 'select' },
- { label: '学位', model: 'degree', type: 'select' },
- { label: '工作单位', model: 'unit_name', options: { disabled: true } },
- { label: '办公电话', model: 'work_phone' },
- { label: '职称', model: 'title' },
- // { label: '研究领域(2)', model: 'fields', type: 'selectMany', options: { placeholder: '请选择(多选,不超过2个)' } },
- ];
- if (e && e.is_studio == 'Y') {
- let fields_studio = [
- { label: '居住地', model: 'live_place' },
- { label: '身份证(正反)', model: 'card', custom: true },
- { label: '团队联系人', model: 'team_name' },
- { label: '团队联系人手机号', model: 'team_phone', custom: true },
- { label: '专业技术职称', model: 'zc', type: 'select' },
- { label: '职称证明', model: 'zc_file', custom: true },
- { label: '社会兼职', model: 'part_job' },
- { label: '研究领域(2)', model: 'fields', type: 'selectMany', options: { placeholder: '请选择(多选,不超过2个)' } },
- { label: '研究方向', model: 'direction', custom: true },
- { label: '服务企业代表性案例', model: 'case', custom: true },
- { label: '案例证明材料', model: 'case_file', custom: true },
- { label: '是否为在职人员', model: 'is_job', type: 'select' },
- ];
- field1 = [...field, ...fields_studio];
- }
- fields.value = field1;
- let p1s: any;
- let p1: any = {
- name: e.nick_name,
- card_type: '0',
- num: e.card,
- gender: getcard(e.card, 'gender') || '',
- birth: getcard(e.card, 'birth') || '',
- phone: e.phone,
- email: e.email,
- education: '',
- degree: '',
- unit: e.unit,
- unit_name: unit_name.value,
- work_phone: '',
- title: '',
- };
- if (e && e.is_studio == 'Y') {
- let form_studio = {
- live_place: '',
- card: [],
- team_name: e.nick_name || '',
- team_phone: { phone: e.phone || '' },
- zc: '',
- zc_file: [],
- part_job: '',
- fields: [],
- direction: [],
- case: [],
- case_file: [],
- is_job: '',
- };
- p1s = { ...p1, ...form_studio };
- }
- // 有数据:
- let res: IQueryResult = await basic.self();
- if (res.errcode == '0') {
- p1s = res.data as {};
- p1s.unit_name = unit_name.value;
- if (e.is_studio == 'Y') {
- let is_stu: IQueryResult = await userStudioApply.query({ user_id: user._id });
- if (is_stu.errcode == 0) {
- if (is_stu.total > 0) {
- let is_stu_info = is_stu.data[0];
- delete is_stu_info._id;
- delete is_stu_info.id;
- p1s = { ...p1s, ...is_stu_info };
- } else {
- let form_studio = {
- live_place: '',
- card: [],
- team_name: e.nick_name || '',
- team_phone: { phone: e.phone ? e.phone : '' },
- zc: '',
- zc_file: [],
- part_job: '',
- fields: [],
- direction: [],
- case: [],
- case_file: [],
- is_job: '',
- };
- p1s = { ...p1s, ...form_studio };
- }
- }
- }
- } else {
- console.log('暂无基础数据');
- if (e.is_studio == 'Y') {
- let is_stu: IQueryResult = await userStudioApply.query({ user_id: user._id });
- if (is_stu.errcode == 0) {
- if (is_stu.total > 0) {
- let is_stu_info = is_stu.data[0];
- delete is_stu_info._id;
- delete is_stu_info.id;
- p1s = { ...p1s, ...is_stu_info };
- } else {
- let form_studio = {
- live_place: '',
- card: [],
- team_name: e.nick_name || '',
- team_phone: { phone: e.phone ? e.phone : '' },
- zc: '',
- zc_file: [],
- part_job: '',
- fields: [],
- direction: [],
- case: [],
- case_file: [],
- is_job: '',
- };
- p1s = { ...p1s, ...form_studio };
- }
- }
- }
- }
- form.value = p1s;
- };
- // 查找出生年月,性别
- const getcard = (value: any, model: string) => {
- if (value) {
- if (model == 'brith') {
- let birthday = '';
- if (value != null && value != '') {
- if (value.length == 15) birthday = '19' + value.slice(6, 12);
- else if (value.length == 18) birthday = value.slice(6, 14);
- birthday = birthday.replace(/(.{4})(.{2})/, '$1-$2-');
- if (birthday) return birthday;
- else return null;
- }
- } else if (model == 'gender') {
- // 获取性别
- let gender = '';
- if (parseInt(value.substr(16, 1)) % 2 == 1) gender = '0';
- else if (parseInt(value.substr(16, 1)) % 2 == 0) gender = '1';
- else gender = '2';
- if (gender) return gender;
- else return null;
- }
- }
- };
- // 技术需求方向添加
- const addDriection = () => {
- let direction = form.value.direction;
- if (direction.length >= 5) ElMessage({ type: 'error', message: '研究方向最多添加五个' });
- else direction.push({ id: moment().valueOf(), name: '' });
- form.value.direction = direction;
- };
- // 研究方向删除
- const delDriection = (e: { id: string }) => {
- let direction = form.value.direction.filter((i: any) => i.id != e.id);
- form.value.direction = direction;
- };
- // 案例添加
- const addCase = () => {
- let cases = form.value.case;
- if (cases.length >= 5) ElMessage({ type: 'error', message: '案例最多添加五个' });
- else cases.push({ id: moment().valueOf(), name: '' });
- form.value.case = cases;
- };
- // 案例删除
- const delCase = (e: { id: string }) => {
- let cases = form.value.case.filter((i: any) => i.id != e.id);
- form.value.case = cases;
- };
- // 数据选择
- const dataChange = (model: string, value: any) => {
- if (model == 'fields') {
- if (value.length > 2) ElMessage({ type: 'error', message: '数据过多,请重新选择' });
- }
- };
- const onUpload = (e: { model: string; value: Array<[]> }) => {
- const { model, value } = e;
- form.value[model] = value;
- };
- const emit = defineEmits(['updateBasic']);
- // 审核保存
- const toSave = async (data: any) => {
- console.log(data);
- let res: IQueryResult;
- let is_stu: IQueryResult;
- if (userInfo.value.is_studio == 'Y') {
- is_stu = await userStudioApply.query({ user_id: user._id });
- if (is_stu.total === 0) createApply(data);
- else {
- let id = is_stu.data[0]._id;
- console.log('已有科学家工作室信息,不可重复入驻');
- let form = {
- user_id: user._id,
- name: data.name,
- brith: data.birth,
- phone: { phone: data.phone || '' },
- email: { email: data.email || '' },
- education: data.education,
- degree: data.degree,
- live_place: data.live_place,
- card: data.card,
- team_name: data.team_name || '',
- team_phone: data.team_phone,
- company: unit_name.value,
- address: user.unit_address,
- zc: data.zc,
- zc_file: data.zc_file,
- part_job: data.part_job || '',
- fields: data.fields,
- direction: data.direction,
- case: data.case,
- case_file: data.case_file || [],
- is_job: data.is_job,
- _id: id,
- };
- let arr: IQueryResult = await userStudioApply.update(form);
- console.log(arr);
- }
- }
- if (data._id) {
- res = await basic.update(data);
- } else {
- res = await basic.create(data);
- let refresh: IQueryResult = await users.refresh();
- if (refresh.errcode == 0) {
- let p1: any = refresh.data as [];
- if (refresh.data) localStorage.setItem('token', p1);
- }
- }
- if (res.errcode == 0) {
- ElMessage({ type: 'success', message: '维护信息成功' });
- search(userInfo.value);
- }
- };
- // 创建入驻信息
- const createApply = async (e: any) => {
- let form = {
- user_id: user._id,
- name: e.name,
- brith: e.birth,
- phone: { phone: e.phone || '' },
- email: { email: e.email || '' },
- education: e.education,
- degree: e.degree,
- live_place: e.live_place,
- card: e.card,
- team_name: e.team_name || '',
- team_phone: e.team_phone,
- company: unit_name.value,
- address: user.unit_address,
- zc: e.zc,
- zc_file: e.zc_file,
- part_job: e.part_job || '',
- fields: e.fields,
- direction: e.direction,
- case: e.case,
- case_file: e.case_file || [],
- is_job: e.is_job,
- };
- let res: IQueryResult = await userStudioApply.create(form);
- if (res.errcode == 0) emit('updateBasic');
- };
- const searchOther = async () => {
- // 是否公开
- const p1: IQueryResult = await sysdictdata.query({ dict_type: 's_is_show' });
- if (p1.errcode == 0) isshowList.value = p1.data as [];
- // 领域
- const p2: IQueryResult = await sysdictdata.query({ dict_type: 'studio_field' });
- if (p2.errcode == 0) fieldList.value = p2.data as [];
- // 是否为在职人员
- const p3: IQueryResult = await sysdictdata.query({ dict_type: 'studio_scientist_is_job' });
- if (p3.errcode == 0) isjobList.value = p3.data as [];
- // 专业技术职称
- const p4: IQueryResult = await sysdictdata.query({ dict_type: 's-builddesire-zc' });
- if (p4.errcode == 0) {
- let arr1 = p4.data as [];
- let data = arr1.filter((i: any) => i.dict_value != '0');
- zcList.value = data;
- }
- // 性别
- const p5: IQueryResult = await sysdictdata.query({ dict_type: 'sys_user_sex' });
- if (p5.errcode == 0) genderList.value = p5.data as [];
- // 学历
- const p6: IQueryResult = await sysdictdata.query({ dict_type: 'education' });
- if (p6.errcode == 0) educationList.value = p6.data as [];
- // 学位
- const p7: IQueryResult = await sysdictdata.query({ dict_type: 'degree' });
- if (p7.errcode == 0) degreeList.value = p7.data as [];
- // 依托单位信息
- const p8: IQueryResult = await unit.fetch(user.unit);
- if (p8.errcode == 0) {
- let arr2 = p8.data as { unit_name: string };
- if (arr2 && arr2.unit_name) unit_name.value = arr2.unit_name;
- }
- // 证件类别
- const p9: IQueryResult = await sysdictdata.query({ dict_type: 'basic_card_type' });
- if (p9.errcode == 0) cardtypeList.value = p9.data as [];
- };
- watch(userInfo, async (val) => {
- if (val && val._id) {
- await searchOther();
- await search(val);
- }
- if (val && val.nick_name) form.value.name = val.nick_name;
- if (val && val.card) {
- form.value.num = val.card;
- let gender = getcard(val.card, 'gender') || '';
- let birth = getcard(val.card, 'birth') || '';
- form.value.gender = gender;
- form.value.birth = birth;
- }
- if (val && val.phone) form.value.phone = val.phone;
- if (val && val.email) form.value.email = val.email;
- if (val && val.is_studio == 'Y') {
- if (val && val.nick_name) form.value.team_name = val.nick_name;
- if (val && val.phone) form.value.team_phone.phone = val.phone;
- }
- });
- </script>
- <style lang="scss" scoped></style>
|