开发后台首页

dev_xd
lj7788@126.com 2025-07-09 18:09:23 +08:00
parent eb26185e00
commit 423dd47d53
27 changed files with 1005 additions and 90 deletions

View File

@ -116,6 +116,16 @@ public class SysUser extends BaseEntity
private Long workType;
public String getVendorsCode() {
return vendorsCode;
}
public void setVendorsCode(String vendorsCode) {
this.vendorsCode = vendorsCode;
}
private String vendorsCode;
public Long getWorkType() {
return workType;
}

View File

@ -17,6 +17,8 @@ import com.yanzhu.common.security.annotation.InnerAuth;
import com.yanzhu.common.security.annotation.RequiresPermissions;
import com.yanzhu.common.security.service.TokenService;
import com.yanzhu.common.security.utils.SecurityUtils;
import com.yanzhu.manage.domain.AttendanceCfg;
import com.yanzhu.manage.mapper.AttendanceCfgMapper;
import com.yanzhu.system.api.domain.SysDept;
import com.yanzhu.system.api.domain.SysRole;
import com.yanzhu.system.api.domain.SysUser;
@ -72,6 +74,9 @@ public class SysUserController extends BaseController {
@Autowired
private TokenService tokenService;
@Autowired
private AttendanceCfgMapper attendanceCfgMapper;
/**
*
*/
@ -129,6 +134,7 @@ public class SysUserController extends BaseController {
if (StringUtils.isNull(sysUser)) {
throw new ServiceException("用户名或密码错误");
}
/**if (StringUtils.isEmpty(sysUser.getRoles())) {
throw new ServiceException("用户未查询到分配角色,请联系管理员!!!");
}*/
@ -290,6 +296,13 @@ public class SysUserController extends BaseController {
user.setComId(dept.getComId());
user.setActiveComId(dept.getComId());
user.setDept(dept);
AttendanceCfg cfgWhere=new AttendanceCfg();
cfgWhere.setProjectId(dept.getDeptId());
List<AttendanceCfg> cfgList=attendanceCfgMapper.selectAttendanceCfgList(cfgWhere);
if(cfgList.size()>0){
user.setVendorsCode(cfgList.get(0).getVendorsCode());
}
AjaxResult ajax = AjaxResult.success();
ajax.put("user", user);
if(Objects.nonNull(user.getRoles()) && user.getRoles().size()>0){

View File

@ -17,8 +17,9 @@
type="text/javascript"
src="https://api.map.baidu.com/api?v=1.0&&type=webgl&ak=6zAD8CIavtzWnkGg0a7roush5maGMIPn"
></script>
<script src="./static/BIMGISEngine.js"></script>
<script src="./config.js"></script>
<script src="/cdn/echarts/echarts.min.js"></script>
<script src="/cdn/bim/sapi/BIMGISEngine.js"></script>
<script src="/cdn/bim/sapi/config.js?v=20240415"></script>
<!--[if lt IE 11
]><script>
window.location.href = "/html/ie.html";

View File

@ -0,0 +1,17 @@
import request from '@/utils/request'
//劳务人员工种占比
export function getWorkerCountGroupByType (type, prjId) {
return request({
url: `/manage/bgscreen/labor/getWorkerCountGroupByType/${type}/${prjId}`,
method: "get",
});
};
//劳务人员七天出勤趋势
export function groupAttendanceLastWeek (type, prjId){
return request({
url: `/manage/bgscreen/labor/groupAttendanceLastWeek/${type}/${prjId}`,
method: "get",
});
};

View File

@ -0,0 +1 @@
<svg class="icon" style="width: 1.1416015625em;height: 1em;vertical-align: middle;fill: currentColor;overflow: hidden;" viewBox="0 0 1169 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="15155"><path d="M72.227662 0h996.553234c17.168557 1.082587 33.980498 7.794627 46.780497 19.359204 16.162388 14.239204 25.7401 35.547065 25.6 57.084179 0.012736 167.915622 0.025473 335.831244 0 503.734129-25.803781-31.751642-58.192239-58.141294-94.605373-76.812736-37.686766-19.435622-79.627463-30.47801-121.988458-32.261094-49.620697-2.228856-99.776318 8.227662-144.238806 30.401592-37.393831 18.531343-70.737512 45.11204-97.216318 77.360398-29.497313 35.827264-50.384876 78.697711-60.255523 124.039005-14.277413 64.751443-6.075224 134.240796 23.294727 193.719403-189.911244 0.025473-379.809751 0.012736-569.708259 0.012736-21.549851 0.127363-42.883184-9.450348-57.096915-25.625473C7.8201 858.249552 1.146269 841.501294 0 824.409154V72.40597C1.120796 54.345871 8.54607 36.680597 21.167761 23.638607 34.38806 9.628657 53.046766 1.235423 72.227662 0m240.487164 132.190249c-28.64398 3.362388-56.07801 16.162388-77.054726 35.954627-22.530547 20.96398-37.623085 49.735323-41.927961 80.213333-4.444975 30.274229 1.630249 61.974925 17.104876 88.39005 16.862886 29.153433 44.857313 51.671244 77.029254 61.707462 31.369552 9.99801 66.330746 8.138507 96.41393-5.22189 30.121393-13.169353 55.071841-37.635821 68.890746-67.451542 14.442985-30.681791 16.71005-66.827463 6.393632-99.126767-9.488557-30.363383-30.108657-56.995025-56.918607-74.061691-26.415124-16.926567-58.790846-24.275423-89.931144-20.403582m333.475025 31.471443c-6.457313 2.088756-11.984876 6.852139-14.965174 12.940099-3.960995 7.845572-3.413333 17.741692 1.426467 25.077811 4.63602 7.374328 13.271244 11.895721 21.97015 11.679204 109.978109 0.025473 219.968955 0.025473 329.947064 0.012736 8.698905 0.216517 17.346866-4.304876 22.021095-11.666467 5.196418-7.883781 5.412935-18.684179 0.522189-26.771742-4.534129-7.832836-13.475025-12.774527-22.517811-12.507064-107.851144 0.012736-215.689552 0-323.52796 0-4.9799 0.038209-10.0999-0.38209-14.87602 1.235423m0.063681 110.793233c-6.775721 2.152438-12.545274 7.29791-15.436418 13.80617-3.642587 7.947463-2.763781 17.754428 2.279801 24.899502 4.725174 6.966766 13.080199 11.195224 21.498906 11.004179 110.436617 0 220.873234 0.076418 331.309851-0.038209 14.035423 0.012736 26.134925-13.334925 24.670248-27.319403-0.598607-9.832438-7.501692-18.837015-16.773731-22.084776-5.005373-1.897711-10.443781-1.464677-15.678408-1.490149H661.027662c-4.941692 0.038209-10.010746-0.38209-14.77413 1.222686M214.199403 476.605771c-30.516219 23.460299-53.925572 55.976119-66.636418 92.3001-12.507065 35.648955-14.557612 74.851343-6.024279 111.63383 130.101493 0.025473 260.190249-0.025473 390.291742 0.025473 9.552239-40.794428 5.896915-84.581891-10.418309-123.172935-16.95204-40.450547-47.646567-74.940498-85.804577-96.515821-32.286567-18.505871-69.858706-27.53592-107.010547-25.931144-41.252935 1.464677-81.843582 16.315224-114.397612 41.660497zM882.028259 511.694328c50.066468-5.84597 101.788657 3.247761 146.658706 26.300498 39.75005 20.3399 74.061692 51.2 98.413533 88.619303 21.231443 32.464876 34.922985 69.795025 39.60995 108.296916 5.514826 44.296915-0.611343 90.045771-17.970946 131.196816-21.129552 50.512239-58.943682 93.85393-106.144477 121.63184-32.65592 19.410149-69.74408 31.433234-107.609154 34.668259-44.742687 4.126567-90.542488-3.782687-131.273234-22.772537-37.228259-17.346866-70.202587-43.711045-95.254926-76.277811-27.29393-35.317811-45.137512-77.882587-50.983482-122.141294-6.355423-47.022488 0.458507-95.789851 19.906866-139.093333 18.505871-41.58408 48.359801-77.971741 85.384278-104.399602 35.012139-25.090547 76.456119-41.125572 119.262886-46.029055m144.633632 157.051543c-5.056318 1.69393-8.877214 5.553035-12.481592 9.297512-41.813333 41.813333-83.61393 83.626667-125.44 125.414527-26.020299-25.994826-52.027861-52.015124-78.035423-78.022686-3.222289-3.209552-6.317214-6.724776-10.469254-8.737115-7.705473-3.973731-17.512438-3.324179-24.606567 1.642986-5.553035 4.024677-10.341891 9.666866-11.704677 16.557213-1.872239 8.100299 0.904279 16.977512 6.915821 22.708856 33.52199 33.509254 67.018507 67.056716 100.578706 100.540498 6.406368 6.457313 16.56995 8.660697 25.103284 5.553035 6.266269-2.037811 10.405572-7.412537 15.385473-11.386269 47.009751-46.882388 93.904876-93.904876 140.889154-140.812736 3.515224-3.375124 6.32995-7.578109 7.463483-12.366966 5.234627-18.467662-15.652935-37.686766-33.598408-30.388855z" p-id="15156"></path></svg>

After

Width:  |  Height:  |  Size: 4.4 KiB

View File

@ -0,0 +1 @@
<svg class="icon" style="width: 1em;height: 1em;vertical-align: middle;fill: currentColor;overflow: hidden;" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="9306"><path d="M575.457882 507.512471c59.226353-23.476706 101.285647-81.212235 101.285647-148.690824 0-88.229647-71.785412-160-160.015058-160s-160 71.770353-160 160c0 67.478588 42.044235 125.214118 101.270588 148.690824-131.689412 27.226353-231.002353 144.097882-231.002353 283.738353 0 33.957647 23.823059 45.206588 42.962823 54.241882l1.099295 0.451765c77.176471 27.241412 188.792471 34.499765 242.582588 34.499764 58.654118 0 173.477647-9.517176 249.735529-35.855059 28.581647-10.962824 43.083294-28.912941 43.083294-53.338352 0-139.655529-99.312941-256.527059-231.002353-283.738353zM382.780235 494.034824c-37.903059-35.343059-61.741176-85.564235-61.741176-141.477648 0-68.472471 35.644235-128.512 89.283765-162.93647v-0.015059c-0.331294-0.466824-0.813176-0.737882-1.189648-1.129412-0.391529-0.421647-0.632471-0.948706-1.099294-1.325176a160.301176 160.301176 0 0 0-100.141176-35.312941c-88.229647 0-160.015059 71.770353-160.015059 160 0 67.478588 42.059294 125.214118 101.285647 148.690823C117.458824 487.755294 18.160941 604.626824 18.160941 744.267294c0 24.440471 14.501647 42.375529 43.459765 53.488941 42.887529 14.817882 96.105412 23.356235 134.128941 27.994353a322.409412 322.409412 0 0 1-2.409412-38.731294c0-130.439529 77.778824-242.642824 189.44-292.98447zM786.808471 460.544c59.226353-23.476706 101.285647-81.212235 101.285647-148.690824 0-88.229647-71.785412-160-160.015059-160-36.939294 0-73.005176 12.905412-101.51153 36.321883l-4.246588 3.478588a193.400471 193.400471 0 0 1 85.940706 160.903529c0 55.913412-23.838118 106.134588-61.741176 141.477648 111.661176 50.341647 189.44 162.544941 189.44 292.98447 0 13.402353-0.918588 26.578824-2.499765 39.544471l0.798118-0.090353c39.137882-4.547765 95.216941-13.206588 140.483764-28.852706 28.581647-10.962824 43.083294-28.912941 43.083294-53.338353 0-139.655529-99.312941-256.527059-231.017411-283.738353z" p-id="9307"></path></svg>

After

Width:  |  Height:  |  Size: 2.0 KiB

View File

@ -0,0 +1 @@
<svg class="icon" style="width: 1.1845703125em;height: 1em;vertical-align: middle;fill: currentColor;overflow: hidden;" viewBox="0 0 1213 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="14780"><path d="M836.957869 730.931102a533.337705 533.337705 0 0 1 62.582277 78.366681 113.758775 113.758775 0 1 0-62.582277-78.302604zM611.64031 644.61882a343.497676 343.497676 0 0 0 3.95144 136.143154l94.172445 59.805589 4.656292 111.345193a341.746227 341.746227 0 0 0 95.176324 63.223052 151.414938 151.414938 0 0 1-51.261934 8.864042H151.692606a151.649888 151.649888 0 0 1-151.649888-151.649888v-46.199818a533.017318 533.017318 0 0 1 246.356312-214.723426 341.618072 341.618072 0 0 0 365.24128 33.192102zM455.077819 0a265.451382 265.451382 0 0 1 265.4941 265.472741v75.846303a265.462061 265.462061 0 0 1-530.924122 0v-75.846303A265.451382 265.451382 0 0 1 455.077819 0z m407.062475 957.551569a265.195072 265.195072 0 0 1-88.704505-51.261935L769.420271 809.511375l-81.869581-51.924067a266.797007 266.797007 0 0 1 0-102.523869l81.869581-51.924067 4.015518-96.77826a265.195072 265.195072 0 0 1 88.747223-51.261934l85.885099 44.854193 85.927817-44.854193a264.703812 264.703812 0 0 1 88.704505 51.261934l4.015518 96.77826 81.86958 51.945427a266.797007 266.797007 0 0 1 0 102.523868L1126.73731 809.511375l-4.015518 96.735541a265.195072 265.195072 0 0 1-88.747224 51.261934l-85.885098-44.982347-85.927817 44.982347z" p-id="14781"></path></svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

@ -0,0 +1 @@
<svg class="icon" style="width: 1em;height: 1em;vertical-align: middle;fill: currentColor;overflow: hidden;" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="9814"><path d="M746.666667 512a234.666667 234.666667 0 1 1 0 469.333333 234.666667 234.666667 0 0 1 0-469.333333zM512 85.333333a234.496 234.496 0 0 1 208.213333 342.485334 319.914667 319.914667 0 0 0-230.442666 509.696c-33.194667 0.256-73.088 1.024-114.688 1.152h-22.186667l-10.794667-0.085334-21.717333-0.213333C201.130667 936.490667 85.333333 925.653333 85.333333 880.554667c0-128.469333 129.28-237.269333 306.304-271.829334 15.189333-7.594667 22.784-20.778667 22.784-39.509333 0-18.944-10.538667-36.949333-31.658666-53.973333A233.941333 233.941333 0 0 1 277.333333 319.658667 234.496 234.496 0 0 1 512 85.333333z m305.664 565.930667l-3.712 3.84-101.888 116.906667-30.336-32.085334-3.84-3.754666a42.666667 42.666667 0 0 0-62.592 57.045333l3.370667 4.181333 63.146666 68.053334 3.882667 3.797333a42.666667 42.666667 0 0 0 56.448-1.066667l3.797333-3.925333 133.205334-154.026667 3.2-4.352a42.666667 42.666667 0 0 0-64.682667-54.613333z" p-id="9815"></path></svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@ -0,0 +1 @@
<svg class="icon" style="width: 1em;height: 1em;vertical-align: middle;fill: currentColor;overflow: hidden;" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="6291"><path d="M69.5 913.4c0 25.8 20.9 46.6 46.6 46.6h791.8c25.7 0 46.6-20.8 46.6-46.6V507.2h-885v406.2z m377.8-357c0-11.5 12.9-20.7 28.8-20.7h71.8c15.8 0 28.8 9.3 28.8 20.7v51.8c0 11.5-12.8 20.7-28.8 20.7h-71.8c-15.8 0-28.8-9.3-28.8-20.7v-51.8zM908 256.3H723.7C718.2 149.1 630 64 521.4 64h-18.7C394.3 64 306 149.1 300.4 256.3H116.1c-25.7 0-46.6 20.8-46.6 46.5v189h885v-189c0.1-25.8-20.8-46.5-46.5-46.5z m-561 0c5.6-81.3 73-145.5 155.7-145.7h18.7c82.7 0.1 150.1 64.3 155.7 145.7H347z" p-id="6292"></path></svg>

After

Width:  |  Height:  |  Size: 698 B

View File

@ -0,0 +1,61 @@
<template>
<div :id="id" :class="className" :style="{ height, width }" class="my-chart"></div>
</template>
<script>
export default {
props: {
id: {
type: String,
default: "barChart1",
},
className: {
type: String,
default: "",
},
width: {
type: String,
default: "400px",
},
height: {
type: String,
default: "400px",
},
render: {
type: Function,
},
},
data() {
return {
chart: null,
};
},
mounted() {
this.chart = window.echarts.init(document.getElementById(this.id));
setTimeout(() => {
this.setOption({});
}, 400);
//
window.addEventListener("resize", () => {
this.chart.resize();
});
},
methods: {
reLoad() {
let opt = {};
if (this.render) {
opt = this.render(opt);
}
this.chart.setOption(opt, true);
},
setOption(opt) {
if (this.render) {
opt = this.render(opt, this.chart);
}
this.chart.setOption(opt);
},
},
};
</script>
<style></style>

View File

@ -18,6 +18,8 @@ const useUserStore = defineStore("user", {
currentPrjId: null,
currentProName: null,
isAdmin: false,
vendorsCode:'',
user:null,
}),
actions: {
// 登录
@ -55,6 +57,7 @@ const useUserStore = defineStore("user", {
} else {
this.roles = ["ROLE_DEFAULT"];
}
this.user=user;
this.uid = user.userId;
this.name = user.userName;
this.nickName = user.nickName;
@ -64,6 +67,7 @@ const useUserStore = defineStore("user", {
this.currentComName = user.activeComName;
this.currentPrjId = user.activeProjectId;
this.currentProName = user.activeProjectName;
this.vendorsCode=user.vendorsCode
this.isAdmin = user.roles.some(
(item) =>
item.roleKey.includes("admin") ||

View File

@ -180,12 +180,12 @@ export default {
let mapOptions = {
imgs: {
//
top: "./img/top.png",
bottom: "./img/under.png",
east: "./img/east.png",
south: "./img/south.png",
west: "./img/west.png",
north: "./img/north.png",
top: "/cdn/bim/sapi/img/top.png",
bottom: "/cdn/bim/sapi/img/under.png",
east: "/cdn/bim/sapi/img/east.png",
south: "/cdn/bim/sapi/img/south.png",
west: "/cdn/bim/sapi/img/west.png",
north: "/cdn/bim/sapi/img/north.png",
},
offset: {
//

View File

@ -318,12 +318,12 @@ export default {
let mapOptions = {
imgs: {
//
top: "./img/top.png",
bottom: "./img/under.png",
east: "./img/east.png",
south: "./img/south.png",
west: "./img/west.png",
north: "./img/north.png",
top: "/cdn/bim/sapi/img/top.png",
bottom: "/cdn/bim/sapi/img/under.png",
east: "/cdn/bim/sapi/img/east.png",
south: "/cdn/bim/sapi/img/south.png",
west: "/cdn/bim/sapi/img/west.png",
north: "/cdn/bim/sapi/img/north.png",
},
offset: {
//

View File

@ -1,82 +1,135 @@
<template>
<div class="app-container home"></div>
<div class="app-container home">
<el-card class="nav-top">
<nav-top-unit />
<nav-top-att-worker-count />
<nav-top-att-online-count />
<nav-top-att-mgr-count />
<nav-top-att-real-count />
</el-card>
<el-card class="nav-body" style="margin-top: 20px">
<el-row>
<el-col :span="8">
<nav-attendance-rate />
</el-col>
<el-col :span="8">
<nav-att-laborer-rate />
</el-col>
<el-col :span="8">
<nav-att-manager-rate />
</el-col>
<el-col :span="8">
<nav-att-laborer-trend />
</el-col>
<el-col :span="8">
<nav-att-woker-prop />
</el-col>
<el-col :span="8">
<nav-att-job-type-group />
</el-col>
</el-row>
</el-card>
</div>
</template>
<script setup name="Index">
import request from '@/utils/request'
<script>
import navTopAttMgrCount from "./indexCompents/navTopAttMgrCount.vue";
import navTopAttWokerProp from "./indexCompents/navAttWokerProp.vue";
import navTopAttRealCount from "./indexCompents/navTopAttRealCount.vue";
import navTopAttWorkerCount from "./indexCompents/navTopAttWorkerCount.vue";
import navTopUnit from "./indexCompents/navTopUnit.vue";
const version = ref('3.6.3')
import navAttendanceRate from "./indexCompents/navAttendanceRate.vue";
import navAttLaborerRate from "./indexCompents/navAttLaborerRate.vue";
import navAttManagerRate from "./indexCompents/navAttManagerRate.vue";
function goTarget(url) {
window.open(url, '__blank')
}
request.get('/manage/api/menu/list').then((d) => {
console.log('服务就绪')
})
import navAttLaborerTrend from "./indexCompents/navAttLaborerTrend.vue";
import navAttWokerProp from "./indexCompents/navAttWokerProp.vue";
import navAttJobTypeGroup from "./indexCompents/navAttJobTypeGroup.vue";
import NavTopAttOnlineCount from "./indexCompents/navTopAttOnlineCount.vue";
export default {
components: {
navTopAttMgrCount,
navTopAttWokerProp,
navTopAttRealCount,
navTopAttWorkerCount,
navTopUnit,
navAttendanceRate,
navAttLaborerRate,
navAttManagerRate,
navAttLaborerTrend,
navAttWokerProp,
navAttJobTypeGroup,
NavTopAttOnlineCount,
},
};
</script>
<style scoped lang="scss">
<style lang="scss">
.home {
blockquote {
padding: 10px 20px;
margin: 0 0 20px;
font-size: 17.5px;
border-left: 5px solid #eee;
}
hr {
margin-top: 20px;
margin-bottom: 20px;
border: 0;
border-top: 1px solid #eee;
}
.col-item {
margin-bottom: 20px;
}
ul {
padding: 0;
margin: 0;
}
font-family: 'open sans', 'Helvetica Neue', Helvetica, Arial, sans-serif;
font-size: 13px;
color: #676a6c;
overflow-x: hidden;
ul {
list-style-type: none;
}
h4 {
margin-top: 0px;
}
h2 {
margin-top: 10px;
font-size: 26px;
font-weight: 100;
}
p {
margin-top: 10px;
b {
font-weight: 700;
.el-card__body {
padding: 10px !important;
}
.nav-top {
.index-nav-top {
display: inline-flex;
width: calc(20% - 20px);
margin: 10px;
height: 100px;
background-color: #f0f3f8;
align-items: center;
border-radius: 5px;
max-width: 300px;
min-width: 220px;
.top-icon {
margin-left: 30px;
.svg-icon {
width: 40px;
height: 40px;
fill: #6bc1da;
}
}
.update-log {
ol {
display: block;
list-style-type: decimal;
margin-block-start: 1em;
margin-block-end: 1em;
margin-inline-start: 0;
margin-inline-end: 0;
padding-inline-start: 40px;
}
.top-data {
margin-left: 10px;
width: calc(100% - 60px);
.data-title {
text-align: center;
color: #999;
}
.data-number {
line-height: 40px;
height: 40px;
text-align: center;
font-size: 20px;
}
}
}
}
.nav-body {
.index-nav-body {
height: 400px;
background-color: #f0f3f8;
margin: 10px;
border-radius: 5px;
.index-nav-body-title {
line-height: 30px;
font-weight: bold;
padding: 6px 0px 0px 10px;
}
.chart-content {
height: calc(100% - 50px);
display: flex;
align-items: center;
justify-content: center;
.my-chart {
display: flex;
align-items: center;
justify-content: center;
}
}
}
}
}
</style>

View File

@ -0,0 +1,132 @@
<template>
<div class="index-nav-body">
<div class="index-nav-body-title">劳务人员工种分布</div>
<div class="chart-content">
<my-chart :key="elKey" ref="chart" id="navAttJobTypeGroupChart" width="100%" height="100%" :render="renderChart" />
</div>
</div>
</template>
<script>
import MyChart from "@/components/Chart/MyChart";
import useUserStore from "@/store/modules/user";
import { getWorkerCountGroupByType } from "@/api/manage/labor.js";
export default {
components: {
MyChart,
},
data() {
return {
elKey:0,
chartData: [],
currentPrjId: null,
currentComId: null,
vendorsCode: "",
};
},
mounted() {
this.userStore = useUserStore();
this.currentPrjId = this.userStore.currentPrjId;
this.currentComId = this.userStore.currentComId;
this.vendorsCode = this.userStore.vendorsCode;
console.log(this.userStore);
this.init();
},
methods: {
renderChart(opt) {
let pieOption = {
tooltip: {
trigger: "item",
formatter: "{b} <br/> {c} 人 ({d}%)",
textStyle: {
fontSize: 12,
},
},
legend: {
icon: "rect",
orient: "vertical",
itemWidth: "50%",
right: "10%",
itemWidth: 20,
itemGap: 20,
itemHeight: 20,
type: "scroll",
pageTextStyle: {
fontSize: 12,
},
scroll: {
y: 300,
bar: {
show: true,
width: 5,
height: 10,
},
},
textStyle: {
padding: [0, 0, 0, 0],
fontSize: 12,
align: "center",
rich: {
name: {
fontSize: 12,
padding: [5, 2, 5, 2],
},
percent: {
fontSize:12,
padding: [0, 2, 0, 2],
},
},
},
},
series: [
{
type: "pie",
radius: "70%", //
center: ["50%", "50%"],
avoidLabelOverlap: false,
data: this.chartData,
label: {
normal: {
formatter: "{b}\n{c}",
textStyle: {
color: "#444",
fontSize: 12,
},
},
emphasis: {
formatter: "{b}\n{c}",
textStyle: {
color: "#444",
fontSize: 12,
},
},
},
emphasis: {
itemStyle: {
shadowBlur: 10,
shadowOffsetX: 0,
},
},
},
],
};
return pieOption;
},
init() {
getWorkerCountGroupByType(this.vendorsCode, this.currentPrjId).then((d) => {
this.chartData = (d.data || []).map((item) => {
return {
name: item.workTypeName || item.craftPostName,
value: item.id ? item.id : 0,
};
});
this.elKey++;
});
}
},
};
</script>

View File

@ -0,0 +1,96 @@
<template>
<div class="index-nav-body">
<div class="index-nav-body-title">
劳务人员出勤率
</div>
<div class="chart-content">
<my-chart ref="chart" id="navAttLaborerRateChart" width="100%" height="100%" :render="renderChart" />
</div>
</div>
</template>
<script>
import MyChart from "@/components/Chart/MyChart";
export default {
components: {
MyChart,
},
data() {
return {
chartData:[]
};
},
mounted() {
this.init();
},
methods: {
renderChart(opt) {
let pieOption = {
tooltip: {
trigger: "item",
formatter: "{b} <br/> {c} 人 ({d}%)",
textStyle: {
fontSize: 12,
},
},
legend: {
orient: "horizontal",
left: "center",
top: "10",
data:this.chartData.map(d=>d.name),
textStyle: {
color: "#444",
fontSize: 12,
},
},
series: [
{
type: "pie",
radius: ["30%", "60%"], //
center: ["50%", "50%"],
avoidLabelOverlap: false,
data: this.chartData,
label: {
normal: {
formatter: "{b}\n{c}",
textStyle: {
color: "#444",
fontSize: 12,
},
},
emphasis: {
formatter: "{b}\n{c}",
textStyle: {
color: "#444",
fontSize: 12,
},
},
},
emphasis: {
itemStyle: {
shadowBlur: 10,
shadowOffsetX: 0,
},
},
},
],
};
return pieOption;
},
init() {
setTimeout(() => {
this.chartData=[{
name:"出勤人数",
value:33
},{
name:"未出勤人数",
value:22
}]
this.$refs.chart.reLoad();
}, 1000);
},
},
};
</script>
<style></style>

View File

@ -0,0 +1,112 @@
<template>
<div class="index-nav-body">
<div class="index-nav-body-title">劳务人员出勤趋势图</div>
<div class="chart-content">
<my-chart ref="chart" id="navAttLaborerTrendChart" width="100%" height="100%" :render="renderChart" />
</div>
</div>
</template>
<script>
import MyChart from "@/components/Chart/MyChart";
import { groupAttendanceLastWeek } from "@/api/manage/labor.js";
import useUserStore from "@/store/modules/user";
export default {
components: {
MyChart,
},
data() {
return {
weekData: [],
elKey: 0,
currentPrjId: null,
currentComId: null,
vendorsCode: "",
};
},
mounted() {
this.userStore = useUserStore();
this.currentPrjId = this.userStore.currentPrjId;
this.currentComId = this.userStore.currentComId;
this.vendorsCode = this.userStore.vendorsCode;
this.init();
},
methods: {
renderChart(opt) {
const areaOption = {
grid: {
left: "5%",
right: "5%",
bottom: "0%",
top: "15%",
containLabel: true,
},
tooltip: {
trigger: "axis",
axisPointer: {
type: "shadow",
label: {
backgroundColor: "#6a7985",
textStyle: {
fontSize: 12,
},
},
},
},
xAxis: {
type: "category",
data: this.weekData.map((item) => item.name),
axisLabel: {
textStyle: {
fontSize: 12,
},
},
},
yAxis: {
type: "value",
minInterval: 1,
axisLabel: {
textStyle: {
fontSize: 12,
},
},
},
series: [
{
name: "出勤人数",
type: "bar",
areaStyle: {
color: "rgba(13, 204, 242,0.5)", //
},
label: {
show: true,
position: "top", // 线
textStyle: {
fontSize: 12,
},
},
data: this.weekData.map((item) => item.value),
},
{
type: "line",
data: this.weekData.map((item) => item.value),
},
],
};
return areaOption;
},
init() {
groupAttendanceLastWeek(this.vendorsCode, this.currentPrjId).then((d) => {
this.weekData = (d.data || []).map((it) => {
return {
name: it.dt.substring(5).replace("-", "."),
value: it.cnt,
};
});
this.elKey++;
});
},
},
};
</script>
<style></style>

View File

@ -0,0 +1,95 @@
<template>
<div class="index-nav-body">
<div class="index-nav-body-title">
管理人员出勤率
</div>
<div class="chart-content">
<my-chart ref="chart" id="navAttManagerRateChart" width="100%" height="100%" :render="renderChart" />
</div>
</div>
</template>
<script>
import MyChart from "@/components/Chart/MyChart";
export default {
components: {
MyChart,
},
data() {
return {
chartData:[]
};
},
mounted() {
this.init();
},
methods: {
renderChart(opt) {
let pieOption = {
tooltip: {
trigger: "item",
formatter: "{b} <br/> {c} 人 ({d}%)",
textStyle: {
fontSize: 12,
},
},
legend: {
orient: "horizontal",
left: "center",
top: "10",
data:this.chartData.map(d=>d.name),
textStyle: {
color: "#444",
fontSize: 12,
},
},
series: [
{
type: "pie",
radius: ["30%", "60%"], //
center: ["50%", "50%"],
roseType: 'radius',
data: this.chartData,
label: {
normal: {
formatter: "{b}\n{c}",
textStyle: {
color: "#444",
fontSize: 12,
},
},
emphasis: {
formatter: "{b}\n{c}",
textStyle: {
color: "#444",
fontSize: 12,
},
},
},
emphasis: {
itemStyle: {
shadowBlur: 10,
shadowOffsetX: 0,
},
},
},
],
};
return pieOption;
},
init() {
setTimeout(() => {
this.chartData=[{
name:"出勤人数",
value:33
},{
name:"未出勤人数",
value:22
}]
this.$refs.chart.reLoad();
}, 1000);
},
},
};
</script>
<style></style>

View File

@ -0,0 +1,97 @@
<template>
<div class="index-nav-body">
<div class="index-nav-body-title">劳务人员参与教育人员比例</div>
<div class="chart-content">
<my-chart ref="chart" id="navAttWokerPropChart" width="100%" height="100%" :render="renderChart" />
</div>
</div>
</template>
<script>
import MyChart from "@/components/Chart/MyChart";
export default {
components: {
MyChart,
},
data() {
return {
chartData: [],
};
},
mounted() {
this.init();
},
methods: {
renderChart(opt) {
let pieOption = {
tooltip: {
trigger: "item",
formatter: "{b} <br/> {c} 人 ({d}%)",
textStyle: {
fontSize: 12,
},
},
legend: {
orient: "horizontal",
left: "center",
top: "10",
data: this.chartData.map((d) => d.name),
textStyle: {
color: "#444",
fontSize: 12,
},
},
series: [
{
type: "pie",
radius: "60%", //
center: ["50%", "50%"],
avoidLabelOverlap: false,
data: this.chartData,
label: {
normal: {
formatter: "{b}\n{c}",
textStyle: {
color: "#444",
fontSize: 12,
},
},
emphasis: {
formatter: "{b}\n{c}",
textStyle: {
color: "#444",
fontSize: 12,
},
},
},
emphasis: {
itemStyle: {
shadowBlur: 10,
shadowOffsetX: 0,
},
},
},
],
};
return pieOption;
},
init() {
setTimeout(() => {
this.chartData = [
{
name: "参与人数",
value: 33,
},
{
name: "未参与人数",
value: 22,
},
];
this.$refs.chart.reLoad();
}, 1000);
},
},
};
</script>
<style></style>

View File

@ -0,0 +1,93 @@
<template>
<div class="index-nav-body">
<div class="index-nav-body-title">今日出勤率</div>
<div class="chart-content">
<my-chart ref="chart" id="navAttendanceRateChart" width="100%" height="100%" :render="renderChart" />
</div>
</div>
</template>
<script>
import MyChart from "@/components/Chart/MyChart";
export default {
components: {
MyChart,
},
data() {
return {
chartData:[]
};
},
mounted() {
this.init();
},
methods: {
renderChart(opt) {
let pieOption = {
tooltip: {
trigger: "item",
formatter: "{b} <br/> {c} 人 ({d}%)",
textStyle: {
fontSize: 12,
},
},
legend: {
orient: "horizontal",
left: "center",
top: "10",
data:this.chartData.map(d=>d.name),
textStyle: {
color: "#444",
fontSize: 12,
},
},
series: [
{
type: "pie",
radius: "60%",
center: ["50%", "50%"],
data: this.chartData,
label: {
normal: {
formatter: "{b}\n{c}",
textStyle: {
color: "#444",
fontSize: 12,
},
},
emphasis: {
formatter: "{b}\n{c}",
textStyle: {
color: "#444",
fontSize: 12,
},
},
},
emphasis: {
itemStyle: {
shadowBlur: 10,
shadowOffsetX: 0,
},
},
},
],
};
return pieOption;
},
init() {
setTimeout(() => {
this.chartData=[{
name:"出勤人数",
value:33
},{
name:"未出勤人数",
value:22
}]
this.$refs.chart.reLoad();
}, 1000);
},
},
};
</script>
<style></style>

View File

@ -0,0 +1,26 @@
<template>
<div class="index-nav-top">
<div class="top-icon">
<svg-icon icon-class="mgrworker" />
</div>
<div class="top-data">
<div class="data-title">在职管理人员数</div>
<div class="data-number">100</div>
</div>
</div>
</template>
<script>
//
export default {
data(){
return {
}
}
}
</script>
<style>
</style>

View File

@ -0,0 +1,26 @@
<template>
<div class="index-nav-top">
<div class="top-icon">
<svg-icon icon-class="onlineworker" />
</div>
<div class="top-data">
<div class="data-title">在职工人数</div>
<div class="data-number">100</div>
</div>
</div>
</template>
<script>
//
export default {
data(){
return {
}
}
}
</script>
<style>
</style>

View File

@ -0,0 +1,22 @@
<template>
<div class="index-nav-top">
<div class="top-icon">
<svg-icon icon-class="certification" />
</div>
<div class="top-data">
<div class="data-title">实名认证人数</div>
<div class="data-number">100</div>
</div>
</div>
</template>
<script>
//
export default {
data() {
return {};
},
};
</script>
<style></style>

View File

@ -0,0 +1,26 @@
<template>
<div class="index-nav-top">
<div class="top-icon">
<svg-icon icon-class="group" />
</div>
<div class="top-data">
<div class="data-title">总人数</div>
<div class="data-number">100</div>
</div>
</div>
</template>
<script>
//
export default {
data(){
return {
}
}
}
</script>
<style>
</style>

View File

@ -0,0 +1,26 @@
<template>
<div class="index-nav-top">
<div class="top-icon">
<svg-icon icon-class="tool2" />
</div>
<div class="top-data">
<div class="data-title">参建单位总数</div>
<div class="data-number">100</div>
</div>
</div>
</template>
<script>
//
export default {
data(){
return {
}
}
}
</script>
<style>
</style>

View File

@ -298,12 +298,12 @@ export default {
let mapOptions = {
imgs: {
//
top: "./img/top.png",
bottom: "./img/under.png",
east: "./img/east.png",
south: "./img/south.png",
west: "./img/west.png",
north: "./img/north.png",
top: "/cdn/bim/sapi/img/top.png",
bottom: "/cdn/bim/sapi/img/under.png",
east: "/cdn/bim/sapi/img/east.png",
south: "/cdn/bim/sapi/img/south.png",
west: "/cdn/bim/sapi/img/west.png",
north: "/cdn/bim/sapi/img/north.png",
},
offset: {
//

View File

@ -10,7 +10,7 @@ export default defineConfig(({ mode, command }) => {
// 部署生产环境和开发环境下的URL。
// 默认情况下vite 会假设你的应用是被部署在一个域名的根路径上
// 例如 https://www.ruoyi.vip/。如果应用被部署在一个子路径上,你就需要用这个选项指定这个子路径。例如,如果你的应用被部署在 https://www.ruoyi.vip/admin/,则设置 baseUrl 为 /admin/。
base: VITE_APP_ENV === "production" ? "/xd/" : "/xd/",
base: VITE_APP_ENV === "production" ? "./xd/" : "./xd/",
plugins: createVitePlugins(env, command === "build"),
resolve: {
// https://cn.vitejs.dev/config/#resolve-alias