Commit ce8a5d1d authored by xinzhedeai's avatar xinzhedeai

企业先定下

parent 274fed3b
......@@ -95,7 +95,7 @@ var reqApis = function(){
console.log('catch ________________ ', error);
return reject(error);
});
});
})
},
addRequst: function (item) {
return this.pageApi.request('post', item).then((res) => {
......@@ -109,8 +109,8 @@ var reqApis = function(){
this.loadData(this.baseParams || void 0)
} else {
this.$notify({
title: res.msg,
type: 'error',
title: res.msg,
duration: 2500
})
};
......@@ -563,17 +563,17 @@ var reqApis = function(){
Dict: {
baseInfo: {
"companyName": {name:"企业名称", must:true },
"incubatorId": {name:"所属孵化器", must:true, table:0, 'type':'select', key:'name', },
// "incubatorId": {name:"所属孵化器", must:true, table:0, 'type':'select', key:'name', },
"technicalField": {name:"所属技术领域", must:true, 'type':'select', key:'name', },
"entryDate": {
name:"入驻时间", must:true, table:0, 'type':'date', 'format':'yyyy-MM-dd',
name:"入驻时间", must:true, 'type':'date', 'format':'yyyy-MM-dd',
},
"founderCharacteristics": {name:"主要负责人创业特征", must:true, table:0, 'type':'select', key:'name', },
"companyType": {name:"企业类型", must:true, 'type':'select', key:'name', },
"address":{
name:"地址",/* must:true, disabled: true,type:'map',style:"display:flex",*/ table:0,
name:"位置",/* must:true, disabled: true,type:'map',style:"display:flex",*/ table:0,
mapConfig: {
options: {
zoom: 12,
......@@ -638,7 +638,7 @@ var reqApis = function(){
},
"longitude": {name:"经度", must:true, table:0, form:0 },
"latitude": {name:"纬度", must:true, table:0, form:0 },
"mentorId": {name:"创业导师ID", table:0, 'type':'select', key:'name',},
"mentorId": {name:"创业导师", table:0, 'type':'select', key:'name',},
"occupiedArea": {name:"占用孵化场地面积", table:0 },
"principal": {name:"企业负责人", must:true },
"contactPhone": {name:"联系方式", must:true },
......@@ -653,7 +653,7 @@ var reqApis = function(){
"graduationDate": {name:"毕业日期", type:"date", table:0, form:0},
// 新增字段
"companyLevel": { 'type': 'select', 'name': '企业级别', table:0 },
"technicalField": { 'type': 'select', 'name': '所属技术领域', table:0, },
"technicalField": { 'type': 'select', 'name': '所属技术领域', },
"registeredCapital": { 'type': '', 'name': '注册资金(万元)', table:0, },
"inventionPatentsNumber": { 'type': '', 'name': '发明专利数(件)', table:0, },
"inventionApplicationsNumber": { 'type': '', 'name': '发明申请数(件)', table:0, },
......@@ -783,10 +783,22 @@ var reqApis = function(){
<div role="dialog" aria-modal="true" aria-label="信息导入" class="el-dialog" style="width:500px;">
<div class="el-dialog__header"><span class="el-dialog__title">信息导入</span><button type="button" aria-label="Close" class="el-dialog__headerbtn"><i class="el-dialog__close el-icon el-icon-close"></i></button></div>
<div class="el-dialog__body">
<div class="el-form-item el-form-item--small"><label for="incubatorImage" class="el-form-item__label" style="width: 120px;">上传企业信息</label><div class="el-form-item__content">
<div class="img-upload"><input type="file" id="kimUpload" ></div></div>
<div class="el-form-item el-form-item--small">
<label for="incubatorImage" class="el-form-item__label" style="width: 120px;">上传企业信息</label>
<div class="el-form-item__content">
<div class="img-upload">
<input type="file" id="kimUpload" accept=".xls,.xlsx" >
</div>
</div>
</div>
<div class="el-form-item el-form-item--small">
<div class="el-form-item__content">
<input type="checkbox" id="updateJCYN" value="yes"> 是否更新已存在企业基础信息数据
</div>
</div>
<div style="color:red;">仅允许导入xls、xlsx格式文件</div>
</div>
<div class="el-dialog__footer"><div class="dialog-footer"><button type="button" class="el-button el-button--text el-button--small cancel">取消</button><button type="button" class="el-button el-button--primary el-button--small confirm">确认</button></div></div>
</div>
`,
......@@ -794,6 +806,7 @@ var reqApis = function(){
m.loginView = v;
var el = v.el;
v.file = el.querySelector("#kimUpload");
v.updateJCYN = el.querySelector("#updateJCYN");
},
click: function(tag){
if(tag.classList.contains('el-icon-close')){ // 移除
......@@ -810,6 +823,7 @@ var reqApis = function(){
});
var data = new FormData();
data.append('file', file);
data.append('flag', m.loginView.updateJCYN.checked) // 是否更新
return m.pageApi.uploadfile(data).then((res) => {
m.fullLoading.close();
if(res.code === 200){
......@@ -835,6 +849,87 @@ var reqApis = function(){
});
}
},
{
type: 'primary', icon: 'el-icon-folder-add', name: '导入企业经营信息', 'callback':function(){
var m = this;
m.uploadView = qf.UI.popWindow({
cover:true,
coverFull: true,
className:'qyzz-dialog',
//container:b0_e, // id || Element对象
//backgroundColor:'rgba(0,0,0,.4);backdrop-filter:blur(15px);',
closeEvent:true,
html:`
<div role="dialog" aria-modal="true" aria-label="经营信息导入" class="el-dialog" style="width:500px;">
<div class="el-dialog__header"><span class="el-dialog__title">经营信息导入</span><button type="button" aria-label="Close" class="el-dialog__headerbtn"><i class="el-dialog__close el-icon el-icon-close"></i></button></div>
<div class="el-dialog__body">
<div class="el-form-item el-form-item--small">
<label for="incubatorImage" class="el-form-item__label" style="width: 120px;">上传经营信息</label>
<div class="el-form-item__content">
<div class="img-upload">
<input type="file" id="kimUpload1" accept=".xls,.xlsx" >
</div>
</div>
</div>
<div class="el-form-item el-form-item--small">
<div class="el-form-item__content">
<input type="checkbox" id="updateJYYN" value="yes"> 是否更新已存在企业经营信息数据(同年份同企业)
</div>
</div>
<div style="color:red;">仅允许导入xls、xlsx格式文件</div>hjoz
</div>
<div class="el-dialog__footer"><div class="dialog-footer"><button type="button" class="el-button el-button--text el-button--small cancel">取消</button><button type="button" class="el-button el-button--primary el-button--small confirm">确认</button></div></div>
</div>
`,
onload: function(v){
m.loginView = v;
var el = v.el;
v.file = el.querySelector("#kimUpload1");
v.updateJYYN = el.querySelector("#updateJYYN");
},
click: function(tag){
// console.log(m.loginView.updateJYYN.checked)
if(tag.classList.contains('el-icon-close')){ // 移除
m.uploadView.remove()
}else if(tag.classList.contains('confirm')){
var file = m.loginView.file.files[0];
m.uploadView.remove();
if(file){
m.fullLoading = m.$loading({
lock: true,
text: 'Loading',
spinner: 'el-icon-loading',
background: 'rgba(0, 0, 0, 0.7)'
});
var data = new FormData();
data.append('file', file);
data.append('flag', m.loginView.updateJYYN.checked) // 是否更新
return m.pageApi.uploadjyfile(data).then((res) => {
m.fullLoading.close();
if(res.code === 200){
//m.loginView.file.value = '';
m.loadData()
};
m.$notify({
title: '提示',
message: res.msg,
type: 'success',
duration: 5000,
zIndex:2000,
})
}).catch(function(error) {
});
};
}else if(tag.classList.contains('cancel')){ // 取消
m.uploadView.remove()
};
},
close: function(e){
},
});
}
},
],
rightBtn: [
{
......@@ -842,6 +937,11 @@ var reqApis = function(){
window.open(baseAPI + 'api/company/exportTemplate');
}
},
{
fn:'download', type:'primary', name:'下载企业经营信息模板', 'callback':function(){
window.open(baseAPI + 'api/companyAnnualInfo/exportTemplate');
}
},
],
search: [
{
......@@ -851,7 +951,6 @@ var reqApis = function(){
},
{ 'type': 'select', 'name': '在孵状态', 'word': 'incubationStatus', 'mode': 1, 'width': '140px' },
{ 'type': 'select', 'name': '企业类型', 'word': 'companyType', 'mode': 1, 'width': '140px' },
{ 'type':'daterange', 'defaultTime':['00:00:00', '23:59:59'], 'name':'日期范围', 'word':'daterange', 'mode': 0, 'width':'300px', format:'yyyy-MM-dd' },
{ 'type': 'select', 'name': '企业级别', 'word': 'companyLevel', 'mode': 1, 'width': '140px' },
{ 'type': 'select', 'name': '所属技术领域', 'word': 'technicalField', 'mode': 9, 'width': '140px' },
{ 'type': 'select', 'name': '创新创业类型', 'word': 'innovationEntrepreneurship', 'mode': 1, 'width': '140px' },
......@@ -873,6 +972,9 @@ var reqApis = function(){
uploadfile: function (data) {
return reqPublic('api/company/import', 'post', data)
},
uploadjyfile: function (data) {
return reqPublic('api/companyAnnualInfo/import', 'post', data)
},
},
product: { // 产品信息
name: '企业产品信息',
......
......@@ -25,6 +25,9 @@
@click="item.callback.call(_self, $event)"
>{{ item.name }}</el-button
>
<!-- <el-button type="primary" size="mini" icon="el-icon-upload" @click="dialogVisible=true">导入企业基础信息</el-button>
<el-button type="primary" size="mini" icon="el-icon-upload">导入企业经营信息</el-button> -->
</div>
<div>
<el-button
......@@ -61,6 +64,45 @@
:watchKeys="['paperfilename']"
/>
<!-- 导入 -->
<!-- <el-dialog
title="上传 Excel 模板"
:visible.sync="dialogVisible"
width="400px"
>
<el-form>
<el-form-item>
<el-upload
class="upload-demo"
drag
action="https://jsonplaceholder.typicode.com/posts/"
:on-success="handleSuccess"
:before-upload="beforeUpload"
accept=".xls, .xlsx"
>
<i class="el-icon-upload"></i>
<div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
<div class="el-upload__tip" slot="tip">只能上传xls/xlsx文件,且不超过500kb</div>
<el-button
slot="tip"
type="text"
size="small"
@click="downloadTemplate"
>下载模板</el-button>
</el-upload>
</el-form-item>
<el-form-item>
<el-checkbox v-model="hasBasicInfo">是否已存在企业基础信息数据</el-checkbox>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="dialogVisible = false">取 消</el-button>
<el-button type="primary" @click="submitImport">确 定</el-button>
</span>
</el-dialog> -->
<div
id="basicView"
class="el-message-box__wrapper"
......@@ -149,7 +191,9 @@ export default {
},
data() {
return {
dialogVisible: false,
uploadError: '',
hasBasicInfo: false,
Dict: { selectList: [] },
table: {
page: 1,
......@@ -217,6 +261,7 @@ export default {
});
},
watch: {
// "form.item.isHighGrowthInnovative"(newVal, oldVal) {
// this.toggleDateElement("highGrowthInnovativeDate");
// },
......@@ -282,6 +327,28 @@ export default {
// },
},
methods: {
beforeUpload(file) {
// 这里可以加入文件格式校验等
const isExcel = file.type === 'application/vnd.ms-excel' || file.type === 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';
if (!isExcel) {
this.uploadError = '请上传 Excel 文件!';
} else {
this.uploadError = '';
}
return isExcel;
},
handleSuccess(response, file) {
console.log('上传成功:', response);
},
downloadTemplate() {
// 替换为下载模板的链接
window.open('YOUR_TEMPLATE_URL', '_blank');
},
submitImport() {
// 提交逻辑
console.log('是否已存在信息:', this.hasBasicInfo);
this.dialogVisible = false;
},
toggleDateElement(targetEleClass, flag) {
const elements = document.getElementsByClassName(targetEleClass);
if (elements.length) {
......
<template>
<div class="app-container">
<!--工具栏-->
<div class="head-container">
<div v-if="crud.props.searchToggle">
<!-- 搜索 -->
<el-input v-model="query.blurry" clearable size="small" placeholder="模糊搜索" style="width: 200px;" class="filter-item" @keyup.enter.native="crud.toQuery" />
<date-range-picker v-model="query.createTime" class="date-item" />
<rrOperation />
</div>
<crudOperation :permission="permission" />
</div>
<!--表单渲染-->
<el-dialog append-to-body :close-on-click-modal="false" :before-close="crud.cancelCU" :visible.sync="crud.status.cu > 0" :title="crud.status.title" width="580px">
<el-form ref="form" :inline="true" :model="form" :rules="rules" size="small" label-width="80px">
<el-form-item label="菜单类型" prop="type">
<el-radio-group v-model="form.type" size="mini" style="width: 178px">
<el-radio-button label="0">目录</el-radio-button>
<el-radio-button label="1">菜单</el-radio-button>
<el-radio-button label="2">按钮</el-radio-button>
</el-radio-group>
</el-form-item>
<el-form-item v-show="form.type.toString() !== '2'" label="菜单图标" prop="icon">
<el-popover
placement="bottom-start"
width="450"
trigger="click"
@show="$refs['iconSelect'].reset()"
>
<IconSelect ref="iconSelect" @selected="selected" />
<el-input slot="reference" v-model="form.icon" style="width: 450px;" placeholder="点击选择图标" readonly>
<svg-icon v-if="form.icon" slot="prefix" :icon-class="form.icon" class="el-input__icon" style="height: 32px;width: 16px;" />
<i v-else slot="prefix" class="el-icon-search el-input__icon" />
</el-input>
</el-popover>
</el-form-item>
<el-form-item v-show="form.type.toString() !== '2'" label="外链菜单" prop="iframe">
<el-radio-group v-model="form.iframe" size="mini">
<el-radio-button label="true"></el-radio-button>
<el-radio-button label="false"></el-radio-button>
</el-radio-group>
</el-form-item>
<el-form-item v-show="form.type.toString() === '1'" label="菜单缓存" prop="cache">
<el-radio-group v-model="form.cache" size="mini">
<el-radio-button label="true"></el-radio-button>
<el-radio-button label="false"></el-radio-button>
</el-radio-group>
</el-form-item>
<el-form-item v-show="form.type.toString() !== '2'" label="菜单可见" prop="hidden">
<el-radio-group v-model="form.hidden" size="mini">
<el-radio-button label="false"></el-radio-button>
<el-radio-button label="true"></el-radio-button>
</el-radio-group>
</el-form-item>
<el-form-item v-if="form.type.toString() !== '2'" label="菜单标题" prop="title">
<el-input v-model="form.title" :style=" form.type.toString() === '0' ? 'width: 450px' : 'width: 178px'" placeholder="菜单标题" />
</el-form-item>
<el-form-item v-if="form.type.toString() === '2'" label="按钮名称" prop="title">
<el-input v-model="form.title" placeholder="按钮名称" style="width: 178px;" />
</el-form-item>
<el-form-item v-show="form.type.toString() !== '0'" label="权限标识" prop="permission">
<el-input v-model="form.permission" :disabled="form.iframe.toString() === 'true'" placeholder="权限标识" style="width: 178px;" />
</el-form-item>
<el-form-item v-if="form.type.toString() !== '2'" label="路由地址" prop="path">
<el-input v-model="form.path" placeholder="路由地址" style="width: 178px;" />
</el-form-item>
<el-form-item label="菜单排序" prop="menuSort">
<el-input-number v-model.number="form.menuSort" :min="0" :max="999" controls-position="right" style="width: 178px;" />
</el-form-item>
<el-form-item v-show="form.iframe.toString() !== 'true' && form.type.toString() === '1'" label="组件名称" prop="componentName">
<el-input v-model="form.componentName" style="width: 178px;" placeholder="匹配组件内Name字段" />
</el-form-item>
<el-form-item v-show="form.iframe.toString() !== 'true' && form.type.toString() === '1'" label="组件路径" prop="component">
<el-input v-model="form.component" style="width: 178px;" placeholder="组件路径" />
</el-form-item>
<el-form-item label="上级类目" prop="pid">
<treeselect
v-model="form.pid"
:options="menus"
:load-options="loadMenus"
style="width: 450px;"
placeholder="选择上级类目"
/>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="text" @click="crud.cancelCU">取消</el-button>
<el-button :loading="crud.status.cu === 2" type="primary" @click="crud.submitCU">确认</el-button>
</div>
</el-dialog>
<!--表格渲染-->
<el-table
ref="table"
v-loading="crud.loading"
lazy
:load="getMenus"
:data="crud.data"
:tree-props="{children: 'children', hasChildren: 'hasChildren'}"
row-key="id"
@select="crud.selectChange"
@select-all="crud.selectAllChange"
@selection-change="crud.selectionChangeHandler"
>
<el-table-column type="selection" width="55" />
<el-table-column :show-overflow-tooltip="true" label="菜单标题" prop="title" />
<el-table-column prop="icon" label="图标" align="center" width="60px">
<template slot-scope="scope">
<svg-icon :icon-class="scope.row.icon ? scope.row.icon : ''" />
</template>
</el-table-column>
<el-table-column prop="menuSort" align="center" label="排序" width="60px" >
<template slot-scope="scope">
{{ scope.row.menuSort }}
</template>
</el-table-column>
<el-table-column :show-overflow-tooltip="true" prop="permission" label="权限标识" width="100px"/>
<el-table-column :show-overflow-tooltip="true" prop="component" label="组件路径" />
<el-table-column prop="iframe" label="外链" width="60px">
<template slot-scope="scope">
<span v-if="scope.row.iframe"></span>
<span v-else></span>
</template>
</el-table-column>
<el-table-column prop="cache" label="缓存" width="60px">
<template slot-scope="scope">
<span v-if="scope.row.cache"></span>
<span v-else></span>
</template>
</el-table-column>
<el-table-column prop="hidden" label="可见" width="60px">
<template slot-scope="scope">
<span v-if="scope.row.hidden"></span>
<span v-else></span>
</template>
</el-table-column>
<el-table-column prop="createTime" label="创建日期" width="135px" />
<el-table-column v-if="checkPer(['admin','menu:edit','menu:del'])" label="操作" width="130px" align="center" fixed="right">
<template slot-scope="scope">
<udOperation
:data="scope.row"
:permission="permission"
msg="确定删除吗,如果存在下级节点则一并删除,此操作不能撤销!"
/>
</template>
</el-table-column>
</el-table>
</div>
</template>
<script>
import crudMenu from '@/api/system/menu'
import IconSelect from '@/components/IconSelect'
import Treeselect from '@riophae/vue-treeselect'
import '@riophae/vue-treeselect/dist/vue-treeselect.css'
import { LOAD_CHILDREN_OPTIONS } from '@riophae/vue-treeselect'
import CRUD, { presenter, header, form, crud } from '@crud/crud'
import rrOperation from '@crud/RR.operation'
import crudOperation from '@crud/CRUD.operation'
import udOperation from '@crud/UD.operation'
import DateRangePicker from '@/components/DateRangePicker'
// crud交由presenter持有
const defaultForm = { id: null, title: null, menuSort: 999, path: null, component: null, componentName: null, iframe: false, roles: [], pid: 0, icon: null, cache: false, hidden: false, type: 0, permission: null }
export default {
name: 'Menu',
components: { Treeselect, IconSelect, crudOperation, rrOperation, udOperation, DateRangePicker },
cruds() {
return CRUD({ title: '菜单', url: 'api/menus', crudMethod: { ...crudMenu }})
},
mixins: [presenter(), header(), form(defaultForm), crud()],
data() {
return {
menus: [],
permission: {
add: ['admin', 'menu:add'],
edit: ['admin', 'menu:edit'],
del: ['admin', 'menu:del']
},
rules: {
title: [
{ required: true, message: '请输入标题', trigger: 'blur' }
],
path: [
{ required: true, message: '请输入地址', trigger: 'blur' }
]
}
}
},
methods: {
// 新增与编辑前做的操作
[CRUD.HOOK.afterToCU](crud, form) {
this.menus = []
if (form.id != null) {
if (form.pid === null) {
form.pid = 0
}
this.getSupDepts(form.id)
} else {
this.menus.push({ id: 0, label: '顶级类目', children: null })
}
},
getMenus(tree, treeNode, resolve) {
const params = { pid: tree.id }
setTimeout(() => {
crudMenu.getMenus(params).then(res => {
resolve(res.content)
})
}, 100)
},
getSupDepts(id) {
crudMenu.getMenuSuperior(id).then(res => {
const children = res.map(function(obj) {
if (!obj.leaf && !obj.children) {
obj.children = null
}
return obj
})
this.menus = [{ id: 0, label: '顶级类目', children: children }]
})
},
loadMenus({ action, parentNode, callback }) {
if (action === LOAD_CHILDREN_OPTIONS) {
crudMenu.getMenusTree(parentNode.id).then(res => {
parentNode.children = res.map(function(obj) {
if (!obj.leaf) {
obj.children = null
}
return obj
})
setTimeout(() => {
callback()
}, 100)
})
}
},
// 选中图标
selected(name) {
this.form.icon = name
}
}
}
</script>
<style rel="stylesheet/scss" lang="scss" scoped>
::v-deep .el-input-number .el-input__inner {
text-align: left;
}
::v-deep .vue-treeselect__control,::v-deep .vue-treeselect__placeholder,::v-deep .vue-treeselect__single-value {
height: 30px;
line-height: 30px;
}
</style>
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment