提交代码

dev_xd
姜玉琦 2024-08-26 01:11:11 +08:00
parent 77fa7476d8
commit cfa648dbe6
11 changed files with 713 additions and 230 deletions

View File

@ -5,6 +5,8 @@ import com.yanzhu.common.core.web.domain.BaseEntity;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import java.util.List;
/**
* pro_project_info
*
@ -154,6 +156,9 @@ public class ProProjectInfo extends BaseEntity
@Excel(name = "删除标识")
private Long isDel;
private ProProjectInfoSetting setting;
private List<ProProjectInfoDepts> projectDeptsList;
public void setId(Long id)
{
this.id = id;
@ -226,15 +231,7 @@ public class ProProjectInfo extends BaseEntity
{
return projectType;
}
public void setprojectLevel(String projectLevel)
{
this.projectLevel = projectLevel;
}
public String getprojectLevel()
{
return projectLevel;
}
public void setProjectRegional(String projectRegional)
{
this.projectRegional = projectRegional;
@ -469,6 +466,30 @@ public class ProProjectInfo extends BaseEntity
this.deptName = deptName;
}
public String getProjectLevel() {
return projectLevel;
}
public void setProjectLevel(String projectLevel) {
this.projectLevel = projectLevel;
}
public ProProjectInfoSetting getSetting() {
return setting;
}
public void setSetting(ProProjectInfoSetting setting) {
this.setting = setting;
}
public List<ProProjectInfoDepts> getProjectDeptsList() {
return projectDeptsList;
}
public void setProjectDeptsList(List<ProProjectInfoDepts> projectDeptsList) {
this.projectDeptsList = projectDeptsList;
}
@Override
public String toString() {
return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
@ -480,7 +501,7 @@ public class ProProjectInfo extends BaseEntity
.append("projectCode", getProjectCode())
.append("simpleName", getSimpleName())
.append("projectType", getProjectType())
.append("projectLevel", getprojectLevel())
.append("projectLevel", getProjectLevel())
.append("projectRegional", getProjectRegional())
.append("projectAddress", getProjectAddress())
.append("projectNature", getProjectNature())

View File

@ -38,6 +38,14 @@ public class ProProjectInfoDepts extends BaseEntity
@Excel(name = "参建单位编号")
private String deptCode;
/** 负责人 */
@Excel(name = "负责人")
private String leader;
/** 联系电话 */
@Excel(name = "联系电话")
private String phone;
/** 删除标识 */
@Excel(name = "删除标识")
private Long isDel;
@ -105,6 +113,22 @@ public class ProProjectInfoDepts extends BaseEntity
this.projectName = projectName;
}
public String getLeader() {
return leader;
}
public void setLeader(String leader) {
this.leader = leader;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
@Override
public String toString() {
return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)

View File

@ -11,6 +11,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<result property="deptType" column="dept_type" />
<result property="deptName" column="dept_name" />
<result property="deptCode" column="dept_code" />
<result property="leader" column="leader" />
<result property="phone" column="phone" />
<result property="isDel" column="is_del" />
<result property="createBy" column="create_by" />
<result property="createTime" column="create_time" />
@ -20,7 +22,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</resultMap>
<sql id="selectProProjectInfoDeptsVo">
select pd.id, pd.project_id, pi.project_name, pd.dept_type, pd.dept_name, pd.dept_code, pd.is_del, pd.create_by, pd.create_time, pd.update_by, pd.update_time, pd.remark from pro_project_info_depts pd
select pd.id, pd.project_id, pi.project_name, pd.dept_type, pd.dept_name, pd.dept_code, leader, phone, pd.is_del, pd.create_by, pd.create_time, pd.update_by, pd.update_time, pd.remark from pro_project_info_depts pd
left join pro_project_info pi on pi.id = pd.project_id
left join sys_dept sd on sd.dept_id = pi.dept_id
</sql>
@ -50,6 +52,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="deptType != null">dept_type,</if>
<if test="deptName != null">dept_name,</if>
<if test="deptCode != null">dept_code,</if>
<if test="leader != null">leader,</if>
<if test="phone != null">phone,</if>
<if test="isDel != null">is_del,</if>
<if test="createBy != null">create_by,</if>
<if test="createTime != null">create_time,</if>
@ -62,6 +66,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="deptType != null">#{deptType},</if>
<if test="deptName != null">#{deptName},</if>
<if test="deptCode != null">#{deptCode},</if>
<if test="leader != null">#{leader},</if>
<if test="phone != null">#{phone},</if>
<if test="isDel != null">#{isDel},</if>
<if test="createBy != null">#{createBy},</if>
<if test="createTime != null">#{createTime},</if>
@ -78,6 +84,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="deptType != null">dept_type = #{deptType},</if>
<if test="deptName != null">dept_name = #{deptName},</if>
<if test="deptCode != null">dept_code = #{deptCode},</if>
<if test="leader != null">leader = #{leader},</if>
<if test="phone != null">phone = #{phone},</if>
<if test="isDel != null">is_del = #{isDel},</if>
<if test="createBy != null">create_by = #{createBy},</if>
<if test="createTime != null">create_time = #{createTime},</if>

View File

@ -69,7 +69,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="projectStatus != null and projectStatus != ''"> and pi.project_status = #{projectStatus}</if>
<if test="isDel != null "> and pi.is_del = #{isDel}</if>
</where>
order by id project_sort, id desc
order by pi.project_sort, pi.id desc
</select>
<select id="selectProProjectInfoById" parameterType="Long" resultMap="ProProjectInfoResult">
@ -206,14 +206,15 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
where id = #{id}
</update>
<delete id="deleteProProjectInfoById" parameterType="Long">
delete from pro_project_info where id = #{id}
</delete>
<update id="deleteProProjectInfoById" parameterType="Long">
update pro_project_info set is_del=1 where id = #{id}
</update>
<delete id="deleteProProjectInfoByIds" parameterType="String">
delete from pro_project_info where id in
<update id="deleteProProjectInfoByIds" parameterType="String">
update pro_project_info set is_del=1 where id in
<foreach item="id" collection="array" open="(" separator="," close=")">
#{id}
</foreach>
</delete>
</update>
</mapper>

View File

@ -1,6 +1,12 @@
package com.yanzhu.system.controller;
import java.util.List;
import java.util.concurrent.TimeUnit;
import com.yanzhu.common.core.constant.CacheConstants;
import com.yanzhu.common.core.constant.Constants;
import com.yanzhu.common.core.enums.IsDelEnums;
import com.yanzhu.common.redis.service.RedisService;
import org.apache.commons.lang3.ArrayUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
@ -32,6 +38,9 @@ import com.yanzhu.system.service.ISysDeptService;
@RequestMapping("/dept")
public class SysDeptController extends BaseController
{
@Autowired
private RedisService redisService;
@Autowired
private ISysDeptService deptService;
@ -130,4 +139,24 @@ public class SysDeptController extends BaseController
deptService.checkDeptDataScope(deptId);
return toAjax(deptService.deleteDeptById(deptId));
}
/**
*
*/
@RequiresPermissions("system:dept:project")
@GetMapping("/projectDeptList")
public AjaxResult list()
{
String key = "projectDeptList_0";
Object cache = redisService.getCacheObject(key);
if(cache!=null){
return success(cache);
}
SysDept query = new SysDept();
query.setDelFlag(IsDelEnums.NO.getInfo());
query.setDeptType("3");// 项目单位
List<SysDept> depts = deptService.selectDeptList(query);
redisService.setCacheObject(key,depts, Constants.CAPTCHA_EXPIRATION, TimeUnit.MINUTES);
return success(depts);
}
}

View File

@ -1,5 +1,6 @@
package com.yanzhu.system.controller;
import com.yanzhu.common.core.constant.Constants;
import com.yanzhu.common.core.domain.R;
import com.yanzhu.common.core.utils.poi.ExcelUtil;
import com.yanzhu.common.core.web.controller.BaseController;
@ -7,6 +8,7 @@ import com.yanzhu.common.core.web.domain.AjaxResult;
import com.yanzhu.common.core.web.page.TableDataInfo;
import com.yanzhu.common.log.annotation.Log;
import com.yanzhu.common.log.enums.BusinessType;
import com.yanzhu.common.redis.service.RedisService;
import com.yanzhu.common.security.annotation.InnerAuth;
import com.yanzhu.common.security.annotation.RequiresPermissions;
import com.yanzhu.common.security.utils.SecurityUtils;
@ -14,6 +16,7 @@ import com.yanzhu.system.api.domain.SysDept;
import com.yanzhu.system.api.domain.SysRole;
import com.yanzhu.system.api.domain.SysUser;
import com.yanzhu.system.domain.SysUserRole;
import com.yanzhu.system.domain.vo.TreeSelect;
import com.yanzhu.system.service.ISysDeptService;
import com.yanzhu.system.service.ISysRoleService;
import com.yanzhu.system.service.ISysUserService;
@ -24,6 +27,7 @@ import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
import java.util.concurrent.TimeUnit;
/**
*
@ -34,6 +38,9 @@ import java.util.List;
@RequestMapping("/role")
public class SysRoleController extends BaseController
{
@Autowired
private RedisService redisService;
@Autowired
private ISysRoleService roleService;
@ -241,7 +248,15 @@ public class SysRoleController extends BaseController
{
AjaxResult ajax = AjaxResult.success();
ajax.put("checkedKeys", deptService.selectDeptListByRoleId(roleId));
ajax.put("depts", deptService.selectDeptTreeList(new SysDept()));
String key = "role.deptTree_"+SecurityUtils.getUserId();
List<TreeSelect> treeList = redisService.getCacheObject(key);
if(treeList!=null){
ajax.put("depts", treeList);
}else{
treeList = deptService.selectDeptTreeList(new SysDept());
redisService.setCacheObject(key,treeList, Constants.CAPTCHA_EXPIRATION, TimeUnit.MINUTES);
ajax.put("depts", treeList);
}
return ajax;
}

View File

@ -4,9 +4,13 @@ import java.io.IOException;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
import javax.servlet.http.HttpServletResponse;
import com.yanzhu.common.core.constant.Constants;
import com.yanzhu.common.redis.service.RedisService;
import com.yanzhu.system.domain.vo.TreeSelect;
import io.swagger.annotations.ApiOperation;
import org.apache.commons.lang3.ArrayUtils;
import org.springframework.beans.factory.annotation.Autowired;
@ -51,6 +55,9 @@ import com.yanzhu.system.service.ISysUserService;
@RequestMapping("/user")
public class SysUserController extends BaseController
{
@Autowired
private RedisService redisService;
@Autowired
private ISysUserService userService;
@ -346,7 +353,14 @@ public class SysUserController extends BaseController
@GetMapping("/deptTree")
public AjaxResult deptTree(SysDept dept)
{
return success(deptService.selectDeptTreeList(dept));
String key = "user.deptTree_"+SecurityUtils.getUserId();
Object cache = redisService.getCacheObject(key);
if(cache!=null){
return success(cache);
}
List<TreeSelect> treeList = deptService.selectDeptTreeList(dept);
redisService.setCacheObject(key,treeList, Constants.CAPTCHA_EXPIRATION, TimeUnit.MINUTES);
return success(treeList);
}
@ApiOperation(value = "指定流程办理人员列表")

View File

@ -8,6 +8,8 @@
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
<link rel="icon" href="/favicon.ico">
<title>若依管理系统</title>
<script type="text/javascript"
src="https://api.map.baidu.com/api?v=1.0&&type=webgl&ak=6zAD8CIavtzWnkGg0a7roush5maGMIPn"></script>
<!--[if lt IE 11]><script>window.location.href='/html/ie.html';</script><![endif]-->
<style>
html,

View File

@ -50,3 +50,11 @@ export function delDept(deptId) {
method: 'delete'
})
}
// 项目单位列表
export function projectDeptList() {
return request({
url: '/system/dept/projectDeptList',
method: 'get'
})
}

View File

@ -0,0 +1,157 @@
<template>
<el-dialog :title="title" v-model="show" width="800px" append-to-body custom-class="baidu-map-dialog"
:close-on-click-modal="false" :close-on-press-escape="false" >
<div class="div-info">
<div>经度纬度:{{point?(point.lng.toFixed(5)+","+point.lat.toFixed(5)):'' }}</div>
<div>详细地址:{{ getAddress() }}</div>
<div style="margin-top: 10px;text-align: center;" v-if="getAddress()">
<el-button size="small" type="primary" @click="doOk"></el-button>
</div>
</div>
<div id="index-map" style="width: 100%;height:600px;"></div>
</el-dialog>
</template>
<script setup>
const show = ref(false);
const title = ref("");
const map = ref("");
const point = ref("");
const cityInfo = ref("");
const emit = defineEmits(["docom"]);
function getCity(data,cb){
let myPoint = new BMapGL.Point(+data.longitude,+data.latitude);
let myGeo = new BMapGL.Geocoder({extensions_town: true});
myGeo.getLocation(myPoint,r=>{
let cityInfo={
address:r.content?.address||'',
poi_desc:r.content?.poi_desc||'',
district:r.content?.address_detail?.district||'',
city:r.content?.address_detail?.city||'',
province:r.content?.address_detail?.province||''
}
cb && cb(myPoint,cityInfo);
});
}
function doOk(){
emit("docom",point.value,cityInfo.value);
show.value=false;
}
function getAddress(){
let addr=cityInfo.value?.address||'';
let poi_desc=cityInfo.value?.poi_desc||'';
return addr+poi_desc;
}
function showDlg(opt){
title.value=opt?.title||'选择地址';
show.value=true;
setTimeout(()=>{
initMap();
},400);
}
function currentPoint(){
let geolocation = new BMapGL.Geolocation();
geolocation.enableSDKLocation();
geolocation.getCurrentPosition(e=>{
if(e.point){
let point = e.point
let initMarker = new BMapGL.Marker(point);
map.value.centerAndZoom(point, 18);
map.value.addOverlay(initMarker);
}
})
}
function mapClick(e){
point.value=e.latlng;
let myGeo = new BMapGL.Geocoder({extensions_town: true});
myGeo.getLocation(e.latlng,r=>{
if(r){
cityInfo.value={
address:r.content?.address||'',
poi_desc:r.content?.poi_desc||'',
district:r.content?.address_detail?.district||'',
city:r.content?.address_detail?.city||'',
province:r.content?.address_detail?.province||''
}
}else{
cityInfo.value={}
}
});
}
function initMap() {
let imap = new BMapGL.Map("index-map");
map.value = imap;
let point = new BMapGL.Point(116.404, 39.915);
//
map.value.centerAndZoom(point, 15);
map.value.setDefaultCursor("crosshair");//
map.value.enableScrollWheelZoom();//
//
//
let initMarker = new BMapGL.Marker(point);
//
map.value.addOverlay(initMarker);
//
//initMarker.enableDragging();
//
//
map.value.addControl(new BMapGL.NavigationControl());
//
map.value.addEventListener("click",mapClick);
var myGeo = new BMapGL.Geocoder();
//
myGeo.getPoint('经河新城', function (point) {
if (point) {
console.log("--->",point)
map.value.centerAndZoom(point, 16);
map.value.addOverlay(new BMapGL.Marker(point, { title: '经河新城' }))
map.value.enableScrollWheelZoom(true);
//map.value.setHeading(64.5); //
//map.value.setTilt(73); //
} else {
alert('您选择的地址没有解析到结果!');
}
}, '陕西省')
currentPoint();
}
/** 暴露组件 */
defineExpose({
showDlg,
});
</script>
<style lang="scss" >
.baidu-map-dialog{
.el-dialog__body{
position: relative;
padding: 0px;
.div-info{
position: absolute;
top:0px;
right: 10px;
width:300px;
font-size: 12px;
background: rgba(255,255,255,0.5);
box-shadow: 6px 6px 6px rgba(0,0,0,0.2);
z-index: 99999;
padding: 8px;
border:solid 1px #ccc;
color: #51b5ff;
line-height: 24px;
}
}
}
</style>

View File

@ -1,30 +1,6 @@
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="所属单位" prop="deptId" v-hasPermi="['manage:dept:project']">
<el-input
v-model="queryParams.deptId"
placeholder="请输入所属单位"
clearable
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item label="部门主键" prop="visDeptId">
<el-input
v-model="queryParams.visDeptId"
placeholder="请输入部门主键"
clearable
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item label="显示部门" prop="disDeptId">
<el-input
v-model="queryParams.disDeptId"
placeholder="请输入显示部门"
clearable
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item label="项目名称" prop="projectName">
<el-input
v-model="queryParams.projectName"
@ -33,54 +9,14 @@
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item label="项目编号" prop="projectCode">
<el-input
v-model="queryParams.projectCode"
placeholder="请输入项目编号"
clearable
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item label="项目简称" prop="simpleName">
<el-input
v-model="queryParams.simpleName"
placeholder="请输入项目简称"
clearable
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item label="项目等级" prop="projectLevel">
<el-input
v-model="queryParams.projectLevel"
placeholder="请输入项目等级"
clearable
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item label="项目负责人" prop="projectPerson">
<el-input
v-model="queryParams.projectPerson"
placeholder="请输入项目负责人"
clearable
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item label="负责人电话" prop="projectPersonPhone">
<el-input
v-model="queryParams.projectPersonPhone"
placeholder="请输入负责人电话"
clearable
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item label="删除标识" prop="isDel">
<el-select v-model="queryParams.isDel" placeholder="请选择删除标识" clearable>
<el-form-item label="项目类型" prop="projectType">
<el-select v-model="queryParams.projectType" placeholder="请选择项目类型" clearable>
<el-option
v-for="dict in sys_is_del"
v-for="dict in pro_project_type"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
></el-option>
</el-select>
</el-form-item>
<el-form-item>
@ -133,50 +69,69 @@
<el-table v-loading="loading" :data="proProjectInfoList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="主键" align="center" prop="id" />
<el-table-column label="所属单位" align="center" prop="deptId" />
<el-table-column label="部门主键" align="center" prop="visDeptId" />
<el-table-column label="显示部门" align="center" prop="disDeptId" />
<el-table-column label="项目名称" align="center" prop="projectName" />
<el-table-column label="项目编号" align="center" prop="projectCode" />
<el-table-column label="项目名称" align="center" prop="projectName" width="250"/>
<el-table-column label="项目部门" align="center" prop="deptName" width="200"/>
<el-table-column label="项目简称" align="center" prop="simpleName" />
<el-table-column label="项目类型" align="center" prop="projectType" />
<el-table-column label="项目等级" align="center" prop="projectLevel" />
<el-table-column label="项目区县" align="center" prop="projectRegional" />
<el-table-column label="项目地址" align="center" prop="projectAddress" />
<el-table-column label="项目建设属性" align="center" prop="projectNature" />
<el-table-column label="许可证号" align="center" prop="licenceNumber" />
<el-table-column label="项目负责人" align="center" prop="projectPerson" />
<el-table-column label="负责人电话" align="center" prop="projectPersonPhone" />
<el-table-column label="经度" align="center" prop="longitude" />
<el-table-column label="纬度" align="center" prop="latitude" />
<el-table-column label="项目工期" align="center" prop="projectTimeLimit" />
<el-table-column label="总投资" align="center" prop="totalInvestment" />
<el-table-column label="建筑面积" align="center" prop="floorArea" />
<el-table-column label="开累产值" align="center" prop="totalOutputValue" />
<el-table-column label="计划完工时间" align="center" prop="plannedCompletionTime" />
<el-table-column label="计划开始时间" align="center" prop="scheduledStartTime" />
<el-table-column label="实际开始时间" align="center" prop="actualOperatingTime" />
<el-table-column label="实际完工时间" align="center" prop="actualCompletionTime" />
<el-table-column label="合同总金额" align="center" prop="contractAmount" />
<el-table-column label="已支付金额" align="center" prop="paidAmount" />
<el-table-column label="挂账金额" align="center" prop="onAccountAmount" />
<el-table-column label="项目类型" align="center" prop="projectType" width="100">
<template #default="scope">
<dict-tag :options="pro_project_type" :value="scope.row.projectType"/>
</template>
</el-table-column>
<el-table-column label="二维码" align="center" prop="projectQrCode" width="80">
<template #default="scope">
<image-preview :src="scope.row.projectQrCode" :width="50" :height="50"/>
</template>
</el-table-column>
<el-table-column label="项目排序" align="center" prop="projectSort" width="120">
<template #default="scope">
<el-input-number size="mini" v-model="scope.row.projectSort" :min="1" :max="999"
@change="setProjectSort(scope.row, $event)"></el-input-number>
</template>
</el-table-column>
<el-table-column label="项目地址" align="center" prop="projectAddress" width="250"/>
<el-table-column label="负责人" align="center" prop="projectPerson" width="100"/>
<el-table-column label="负责人电话" align="center" prop="projectPersonPhone" width="120"/>
<el-table-column label="项目工期" align="center" prop="projectTimeLimit" width="120">
<template #default="scope">
<el-tag effect="plain">
{{ scope.row.projectTimeLimit + ' 天' }}
</el-tag>
</template>
</el-table-column>
<el-table-column label="总投资" align="center" prop="totalInvestment" >
<template #default="scope">
<el-tag effect="dark">
{{ scope.row.totalInvestment + ' 万元' }}
</el-tag>
</template>
</el-table-column>
<el-table-column label="合同金额" align="center" prop="contractAmount" >
<template #default="scope">
<el-tag effect="dark">
{{ scope.row.contractAmount + ' 万元' }}
</el-tag>
</template>
</el-table-column>
<el-table-column label="项目进度" align="center" prop="projectSchedule">
<template #default="scope">
<dict-tag :options="pro_project_schedule" :value="scope.row.projectSchedule"/>
</template>
</el-table-column>
<el-table-column label="项目概述" align="center" prop="projectSummarize" />
<el-table-column label="项目二维码" align="center" prop="projectQrCode" />
<el-table-column label="项目状态" align="center" prop="projectStatus" />
<el-table-column label="项目排序" align="center" prop="projectSort" />
<el-table-column label="删除标识" align="center" prop="isDel">
<el-table-column label="计划开始时间" align="center" prop="scheduledStartTime" width="120"/>
<el-table-column label="计划完工时间" align="center" prop="plannedCompletionTime" width="120"/>
<el-table-column label="实际开始时间" align="center" prop="actualOperatingTime" width="120"/>
<el-table-column label="实际完工时间" align="center" prop="actualCompletionTime" width="120"/>
<el-table-column label="项目状态" align="center" prop="isDel">
<template #default="scope">
<dict-tag :options="sys_is_del" :value="scope.row.isDel"/>
</template>
</el-table-column>
<el-table-column label="备注" align="center" prop="remark" />
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<el-table-column label="创建时间" align="center" prop="createTime" width="180">
<template #default="scope">
<span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="操作" align="center" fixed="right" class-name="small-padding fixed-width">
<template #default="scope">
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['manage:proProjectInfo:edit']"></el-button>
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['manage:proProjectInfo:remove']"></el-button>
@ -193,111 +148,266 @@
/>
<!-- 添加或修改项目信息对话框 -->
<el-dialog :title="title" v-model="open" width="500px" append-to-body>
<el-form ref="proProjectInfoRef" :model="form" :rules="rules" label-width="80px">
<el-form-item label="所属单位" prop="deptId">
<el-input v-model="form.deptId" placeholder="请输入所属单位" />
<el-dialog :title="title" v-model="open" width="1080px" append-to-body>
<el-form ref="proProjectInfoRef" :model="form" :rules="rules" label-width="100px">
<el-tabs
v-model="activeName"
type="card"
class="demo-tabs"
>
<el-tab-pane label="项目基本信息" name="base">
<el-row :gutter="20">
<el-col :span="16">
<el-form-item label="所属部门" prop="deptId">
<el-tree-select
v-model="form.deptId"
:data="deptOptions"
:props="{ value: 'id', label: 'label', children: 'children' }"
value-key="id"
placeholder="请选择所属部门"
check-strictly
style="width:100%"
/>
</el-form-item>
<el-form-item label="部门主键" prop="visDeptId">
<el-input v-model="form.visDeptId" placeholder="请输入部门主键" />
</el-form-item>
<el-form-item label="显示部门" prop="disDeptId">
<el-input v-model="form.disDeptId" placeholder="请输入显示部门" />
</el-col>
<el-col :span="8">
<el-form-item label="显示层级" prop="disDeptId">
<el-tree-select
v-model="form.disDeptId"
:data="deptOptions"
:props="{ value: 'id', label: 'label', children: 'children' }"
value-key="id"
placeholder="请选择显示层级"
check-strictly
style="width:100%"
/>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="16">
<el-form-item label="项目名称" prop="projectName">
<el-input v-model="form.projectName" placeholder="请输入项目名称" />
</el-form-item>
<el-form-item label="项目编号" prop="projectCode">
<el-input v-model="form.projectCode" placeholder="请输入项目编号" />
<el-input v-model="form.projectName" maxlength="64" show-word-limit placeholder="请输入项目名称" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="项目简称" prop="simpleName">
<el-input v-model="form.simpleName" placeholder="请输入项目简称" />
<el-input v-model="form.simpleName" maxlength="32" show-word-limit placeholder="请输入项目简称" />
</el-form-item>
<el-form-item label="项目等级" prop="projectLevel">
<el-input v-model="form.projectLevel" placeholder="请输入项目等级" />
</el-form-item>
<el-form-item label="项目区县" prop="projectRegional">
<el-input v-model="form.projectRegional" placeholder="请输入项目区县" />
</el-form-item>
<el-form-item label="项目地址" prop="projectAddress">
<el-input v-model="form.projectAddress" placeholder="请输入项目地址" />
</el-form-item>
<el-form-item label="项目建设属性" prop="projectNature">
<el-input v-model="form.projectNature" placeholder="请输入项目建设属性" />
</el-form-item>
<el-form-item label="许可证号" prop="licenceNumber">
<el-input v-model="form.licenceNumber" placeholder="请输入许可证号" />
</el-form-item>
<el-form-item label="项目负责人" prop="projectPerson">
<el-input v-model="form.projectPerson" placeholder="请输入项目负责人" />
</el-form-item>
<el-form-item label="负责人电话" prop="projectPersonPhone">
<el-input v-model="form.projectPersonPhone" placeholder="请输入负责人电话" />
</el-form-item>
<el-form-item label="经度" prop="longitude">
<el-input v-model="form.longitude" placeholder="请输入经度" />
</el-form-item>
<el-form-item label="纬度" prop="latitude">
<el-input v-model="form.latitude" placeholder="请输入纬度" />
</el-form-item>
<el-form-item label="项目工期" prop="projectTimeLimit">
<el-input v-model="form.projectTimeLimit" placeholder="请输入项目工期" />
</el-form-item>
<el-form-item label="总投资" prop="totalInvestment">
<el-input v-model="form.totalInvestment" placeholder="请输入总投资" />
</el-form-item>
<el-form-item label="建筑面积" prop="floorArea">
<el-input v-model="form.floorArea" placeholder="请输入建筑面积" />
</el-form-item>
<el-form-item label="开累产值" prop="totalOutputValue">
<el-input v-model="form.totalOutputValue" placeholder="请输入开累产值" />
</el-form-item>
<el-form-item label="计划完工时间" prop="plannedCompletionTime">
<el-input v-model="form.plannedCompletionTime" placeholder="请输入计划完工时间" />
</el-form-item>
<el-form-item label="计划开始时间" prop="scheduledStartTime">
<el-input v-model="form.scheduledStartTime" placeholder="请输入计划开始时间" />
</el-form-item>
<el-form-item label="实际开始时间" prop="actualOperatingTime">
<el-input v-model="form.actualOperatingTime" placeholder="请输入实际开始时间" />
</el-form-item>
<el-form-item label="实际完工时间" prop="actualCompletionTime">
<el-input v-model="form.actualCompletionTime" placeholder="请输入实际完工时间" />
</el-form-item>
<el-form-item label="合同总金额" prop="contractAmount">
<el-input v-model="form.contractAmount" placeholder="请输入合同总金额" />
</el-form-item>
<el-form-item label="已支付金额" prop="paidAmount">
<el-input v-model="form.paidAmount" placeholder="请输入已支付金额" />
</el-form-item>
<el-form-item label="挂账金额" prop="onAccountAmount">
<el-input v-model="form.onAccountAmount" placeholder="请输入挂账金额" />
</el-form-item>
<el-form-item label="项目进度" prop="projectSchedule">
<el-input v-model="form.projectSchedule" placeholder="请输入项目进度" />
</el-form-item>
<el-form-item label="项目概述" prop="projectSummarize">
<el-input v-model="form.projectSummarize" type="textarea" placeholder="请输入内容" />
</el-form-item>
<el-form-item label="项目二维码" prop="projectQrCode">
<el-input v-model="form.projectQrCode" placeholder="请输入项目二维码" />
</el-form-item>
<el-form-item label="项目排序" prop="projectSort">
<el-input v-model="form.projectSort" placeholder="请输入项目排序" />
</el-form-item>
<el-form-item label="删除标识" prop="isDel">
<el-select v-model="form.isDel" placeholder="请选择删除标识">
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="8">
<el-form-item label="项目类型" prop="projectType">
<el-select v-model="form.projectType" placeholder="请选择项目类型">
<el-option
v-for="dict in sys_is_del"
v-for="dict in pro_project_type"
:key="dict.value"
:label="dict.label"
:value="parseInt(dict.value)"
:value="dict.value"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" placeholder="请输入备注" />
</el-col>
<el-col :span="8">
<el-form-item label="项目负责人" prop="projectPerson">
<el-input v-model="form.projectPerson" maxlength="10" show-word-limit placeholder="请输入项目负责人" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="负责人电话" prop="projectPersonPhone">
<el-input v-model="form.projectPersonPhone" maxlength="11" show-word-limit placeholder="请输入负责人电话" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="24">
<el-form-item label="项目地址" prop="projectAddress">
<el-input
v-model="addressInfos"
placeholder="请选择项目地址信息"
@focus="getMapInfo"
>
<template #prefix>
<el-icon class="el-input__icon"><Location /></el-icon>
</template>
</el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="8">
<el-form-item label="项目工期" prop="projectTimeLimit">
<el-input v-model.number="form.projectTimeLimit" maxlength="10" show-word-limit placeholder="请输入项目工期" >
<template #append></template>
</el-input>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="项目总投资" prop="totalInvestment">
<el-input v-model.number="form.totalInvestment" maxlength="20" show-word-limit placeholder="请输入项目总投资">
<template #append>万元</template>
</el-input>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="合同总金额" prop="contractAmount">
<el-input v-model.number="form.contractAmount" maxlength="20" show-word-limit placeholder="请输入合同总金额">
<template #append>万元</template>
</el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="8">
<el-form-item label="建筑面积" prop="floorArea">
<el-input v-model.number="form.floorArea" maxlength="20" show-word-limit placeholder="请输入项目建筑面积">
<template #append></template>
</el-input>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="项目进度" prop="projectSchedule">
<el-select v-model="form.projectSchedule" placeholder="请选择项目进度" style="width:100%">
<el-option
v-for="dict in pro_project_schedule"
:key="dict.value"
:label="dict.label"
:value="dict.value"
></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="计划开工时间" prop="scheduledStartTime" >
<el-date-picker
v-model="form.scheduledStartTime"
type="date"
placeholder="请选择计划开工时间"
style="width:100%"
/>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="8">
<el-form-item label="计划完工时间" prop="plannedCompletionTime">
<el-date-picker
v-model="form.plannedCompletionTime"
type="date"
placeholder="请选择计划完工时间"
style="width:100%"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="实际开工时间" prop="actualOperatingTime">
<el-date-picker
v-model="form.actualOperatingTime"
type="date"
placeholder="请选择实际开工时间"
style="width:100%"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="实际完工时间" prop="actualCompletionTime">
<el-date-picker
v-model="form.actualCompletionTime"
type="date"
placeholder="请选择实际完工时间"
style="width:100%"
/>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="24">
<el-form-item label="项目概述" prop="projectSummarize">
<el-input
v-model="form.projectSummarize"
type="textarea"
:rows="3"
placeholder="请输入项目概述"
maxlength="1024"
show-word-limit
/>
</el-form-item>
</el-col>
</el-row>
</el-tab-pane>
<el-tab-pane label="参建单位信息" name="depts">
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button type="primary" icon="Plus" @click="handleAddDepts"></el-button>
</el-col>
<el-col :span="1.5">
<el-button type="danger" icon="Delete" @click="handleDeleteDepts"></el-button>
</el-col>
</el-row>
<el-table :data="projectDeptsList" :row-class-name="rowProjectDeptsIndex" @selection-change="handleDeptsSelectionChange" ref="projectDeptsRef">
<el-table-column type="selection" width="50" align="center" />
<el-table-column label="序号" align="center" prop="index" width="50"/>
<el-table-column label="单位类型" prop="deptType" align="center">
<template #default="scope">
<el-select v-model="scope.row.deptType" placeholder="请选择单位类型">
<el-option
v-for="dict in pro_dept_type"
:key="dict.value"
:label="dict.label"
:value="dict.value"
></el-option>
</el-select>
</template>
</el-table-column>
<el-table-column label="单位负责人" prop="leader" align="center">
<template #default="scope">
<el-input v-model="scope.row.leader" placeholder="请输入负责人姓名" />
</template>
</el-table-column>
<el-table-column label="负责人联系电话" prop="phone" align="center">
<template #default="scope">
<el-input v-model="scope.row.phone" placeholder="请输入负责人联系电话" />
</template>
</el-table-column>
</el-table>
</el-tab-pane>
<el-tab-pane label="项目大屏设置" name="setting">
<el-row :gutter="20">
<el-col :span="24">
<el-form-item label="项目显示名" prop="orgName">
<el-input v-model="form.setting.orgName" maxlength="32" show-word-limit placeholder="请输入项目显示名" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="显示LOGO" prop="orgLogo">
<image-upload v-model="form.setting.orgLogo" :limit="1"/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="项目平面图" prop="orgPlane">
<image-upload v-model="form.setting.orgPlane" :limit="3"/>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="24">
<el-form-item label="项目图片" prop="orgImage">
<image-upload v-model="form.setting.orgImage" :limit="9"/>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="24">
<el-form-item label="项目视频" prop="orgVideo">
<file-upload v-model="form.setting.orgVideo" :limit="1" :fileType="['mp4']" :fileSize="100"/>
</el-form-item>
</el-col>
</el-row>
</el-tab-pane>
</el-tabs>
</el-form>
<template #footer>
<div class="dialog-footer">
@ -306,15 +416,21 @@
</div>
</template>
</el-dialog>
<baidu-map ref="mapRef" @docom="mapDocom"></baidu-map>
</div>
</template>
<script setup name="ProProjectInfo">
import { deptTreeSelect } from "@/api/system/user";
import { projectDeptList } from "@/api/system/dept";
import { listProProjectInfo, getProProjectInfo, delProProjectInfo, addProProjectInfo, updateProProjectInfo } from "@/api/manage/proProjectInfo";
import BaiduMap from "@/components/BaiduMap/Map.vue";
const { proxy } = getCurrentInstance();
const { sys_is_del } = proxy.useDict('sys_is_del');
const { pro_project_type, pro_project_schedule, pro_dept_type, sys_is_del } = proxy.useDict('pro_project_type', 'pro_project_schedule', 'pro_dept_type', 'sys_is_del');
const mapRef = ref("");
const proProjectInfoList = ref([]);
const open = ref(false);
const loading = ref(true);
@ -324,9 +440,17 @@ const single = ref(true);
const multiple = ref(true);
const total = ref(0);
const title = ref("");
const activeName = ref('base')
const addressInfos = ref("");
const projectDeptsList = ref([]);
const checkedProjectDepts = ref([]);
const deptOptions = ref([]);
const data = reactive({
form: {},
form: {
setting:{}
},
queryParams: {
pageNum: 1,
pageSize: 10,
@ -344,11 +468,30 @@ const data = reactive({
isDel: null,
},
rules: {
deptId: [{ required: true, message: "所属部门不能为空", trigger: "change" }],
disDeptId: [{ required: true, message: "显示层级不能为空", trigger: "change" }],
projectName: [{ required: true, message: "项目名称不能为空", trigger: "blur" }],
simpleName: [{ required: false, message: "项目简称不能为空", trigger: "blur" }],
projectType: [{ required: true, message: "项目类型不能为空", trigger: "change" }],
projectPerson: [{ required: true, message: "项目负责人不能为空", trigger: "blur" }],
projectPersonPhone: [{ required: true, message: "负责人电话不能为空", trigger: "blur" }],
projectAddress: [{ required: false, message: "项目地址不能为空", trigger: "blur" }],
projectTimeLimit: [{ required: true, message: "工程期限不能为空", trigger: "blur" }],
totalInvestment: [{ required: true, message: "项目总投资不能为空", trigger: "blur" }],
contractAmount: [{ required: true, message: "合同金额不能为空", trigger: "blur" }],
}
});
const { queryParams, form, rules } = toRefs(data);
/** 地图选择 */
function mapDocom(pt, city) {
form.value.projectAddress = (city.address || "") + (city.poi_desc || "");
form.value.longitude = pt.lng.toFixed(5);
form.value.latitude = pt.lat.toFixed(5);
addressInfos.value = form.value.projectAddress + "," + form.value.longitude + "," + form.value.latitude;
}
/** 查询项目信息列表 */
function getList() {
loading.value = true;
@ -406,7 +549,8 @@ function reset() {
createTime: null,
updateBy: null,
updateTime: null,
remark: null
remark: null,
setting: {}
};
proxy.resetForm("proProjectInfoRef");
}
@ -448,10 +592,44 @@ function handleUpdate(row) {
});
}
/** 参建单位序号 */
function rowProjectDeptsIndex({ row, rowIndex }) {
row.index = rowIndex + 1;
}
/** 参建单位添加按钮操作 */
function handleAddDepts() {
let obj = {};
obj.deptType = "";
obj.deptName = "";
obj.leader = "";
obj.phone = "";
projectDeptsList.value.push(obj);
}
/** 参建单位删除按钮操作 */
function handleDeleteDepts() {
if (checkedProjectDepts.value.length == 0) {
proxy.$modal.msgError("请先选择要删除的参建单位!");
} else {
const projectDeptsList = projectDeptsList.value;
const checkedProjectDepts = checkedProjectDepts.value;
projectDeptsList.value = projectDeptsList.filter(function(item) {
return checkedProjectDepts.indexOf(item.index) == -1
});
}
}
/** 复选框选中数据 */
function handleDeptsSelectionChange(selection) {
checkedProjectDepts.value = selection.map(item => item.index)
}
/** 提交按钮 */
function submitForm() {
proxy.$refs["proProjectInfoRef"].validate(valid => {
if (valid) {
form.value.projectDeptsList = projectDeptsList.value;
if (form.value.id != null) {
updateProProjectInfo(form.value).then(response => {
proxy.$modal.msgSuccess("修改成功");
@ -469,6 +647,18 @@ function submitForm() {
});
}
//
function setProjectSort(row, val) {
let param = {
id: row.id,
projectSort: val,
};
updateProProjectInfo(param).then((response) => {
proxy.$modal.msgSuccess("修改成功");
getList();
});
}
/** 删除按钮操作 */
function handleDelete(row) {
const _ids = row.id || ids.value;
@ -487,5 +677,19 @@ function handleExport() {
}, `proProjectInfo_${new Date().getTime()}.xlsx`)
}
/** 查询部门下拉树结构 */
function getDeptTree() {
deptTreeSelect().then(response => {
deptOptions.value = response.data;
});
};
/** 地图选择 */
function getMapInfo(){
mapRef.value.showDlg();
}
getList();
getDeptTree();
</script>